1.
#열에서 등장한 횟수를 내림차순해서 상위 10개
retail_df['Country'].value_counts()[:10]
2.
# 고유한 값 반환
retail_df['Country'].unique()
3. 행, 열 갯수
retail_df.shape
4.
#새로운 sale_amount 열 생성
#CustomerID 정수형 변환
retail_df['sale_amount'] = retail_df['Quantity'] * retail_df['UnitPrice']
retail_df['CustomerID'] = retail_df['CustomerID'].astype(int)
5. RFM
마케팅 기법 중 하나
RFM은 Recency(최근 구매일), Frequency(구매 빈도), Monetary(구매 금액)의 약자로, 이 세 가지 요소를 기반으로 고객을 분석
# DataFrame의 groupby()의 multiple 연산을 위해 agg() 이용
# Recency는 InvoiceDate 컬럼의 max() 최댓값데이터 가공
# Frequency는 InvoiceNo 컬럼의 count() 개수
# Monetary value는 sale_amount 컬럼의 sum() 합계
aggregations = {'InvoiceDate':'max',
'InvoiceNo':'count',
'sale_amount':'sum'
}
cust_df = retail_df.groupby('CustomerID').agg(aggregations)
# groupby된 결과 컬럼값을 Recency, Frequency, Monetary로 컬럼명 변경
cust_df = cust_df.rename(columns = {'InvoiceDate':'Recency',
'InvoiceNo':'Frequency',
'sale_amount':'Monetary'
})
# 인덱스 리셋
cust_df = cust_df.reset_index()
cust_df.head(3)
6. PCA(주성분분석)
PCA(Principal Component Analysis)는 다차원 데이터의 분산을 최대한 보존하면서, 데이터를 저차원 공간으로 축소하는 기법입니다.
PCA는 데이터의 차원이 높아지면서 발생하는 문제를 해결하기 위해 사용됩니다. 고차원 데이터에서는 변수 간의 상관관계가 매우 높아질 가능성이 있으며, 이러한 다중공선성 문제는 회귀분석 등 다양한 분석 방법에서 문제가 될 수 있습니다. 또한, 고차원 데이터에서는 시각화가 어렵기 때문에, 시각화를 통한 데이터 분석이 어렵습니다.
PCA는 이러한 문제를 해결하기 위해, 데이터의 주성분(principal component)을 추출하여, 원래 데이터의 분산을 최대한 보존하면서 새로운 저차원 공간에 투영하는 방법입니다. 이렇게 저차원으로 축소된 데이터는 시각화 및 분석에 용이하며, 다중공선성 문제도 해결됩니다.
PCA는 주로 차원 축소와 시각화를 위해 사용되지만, 머신러닝에서는 데이터 전처리 과정에서 차원 축소를 통해 모델의 성능을 개선하는 용도로도 사용됩니다.
7.
### 여러개의 클러스터링 갯수를 List로 입력 받음
### 각각의 실루엣 계수를 면적으로 시각화한 함수 작성
def visualize_silhouette(cluster_lists, X_features):
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import math
# 입력값으로 클러스터링 갯수들을 리스트로 받아서, 각 갯수별로 클러스터링을 적용하고 실루엣 개수를 구함
n_cols = len(cluster_lists)
# plt.subplots()으로 리스트에 기재된 클러스터링 만큼의 sub figures를 가지는 axs 생성
fig, axs = plt.subplots(figsize=(4*n_cols, 4), nrows=1, ncols=n_cols)
# 리스트에 기재된 클러스터링 갯수들을 차례로 iteration 수행하면서 실루엣 개수 시각화
for ind, n_cluster in enumerate(cluster_lists):
# KMeans 클러스터링 수행하고, 실루엣 스코어와 개별 데이터의 실루엣 값 계산.
clusterer = KMeans(n_clusters = n_cluster, max_iter=500, random_state=0)
cluster_labels = clusterer.fit_predict(X_features)
sil_avg = silhouette_score(X_features, cluster_labels)
sil_values = silhouette_samples(X_features, cluster_labels)
y_lower = 10
axs[ind].set_title('Number of Cluster : '+ str(n_cluster)+'\n' \
'Silhouette Score :' + str(round(sil_avg,3)) )
axs[ind].set_xlabel("The silhouette coefficient values")
axs[ind].set_ylabel("Cluster label")
axs[ind].set_xlim([-0.1, 1])
axs[ind].set_ylim([0, len(X_features) + (n_cluster + 1) * 10])
axs[ind].set_yticks([]) # Clear the yaxis labels / ticks
axs[ind].set_xticks([0, 0.2, 0.4, 0.6, 0.8, 1])
# 클러스터링 갯수별로 fill_betweenx( )형태의 막대 그래프 표현.
for i in range(n_cluster):
ith_cluster_sil_values = sil_values[cluster_labels==i]
ith_cluster_sil_values.sort()
size_cluster_i = ith_cluster_sil_values.shape[0]
y_upper = y_lower + size_cluster_i
color = cm.nipy_spectral(float(i) / n_cluster)
axs[ind].fill_betweenx(np.arange(y_lower, y_upper), 0, ith_cluster_sil_values, \
facecolor=color, edgecolor=color, alpha=0.7)
axs[ind].text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
y_lower = y_upper + 10
axs[ind].axvline(x=sil_avg, color="red", linestyle="--")
8.
# 여러개의 클러스터링 갯수를 List로 입력 받음
# 각각의 클러스터링 결과를 시각화
# iteration은 반복 작업 수행을 의미
# PCA(Principal Component Analysis)
# 다차원 데이터 분산을 최대한 보존하면서 데이터를 저차원 공간으로 축소
def visualize_kmeans_plot_multi(cluster_lists, X_features):
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
# plt.subplots()으로 리스트에 기재된 클러스터링 만큼의
#sub figures를 가지는 axs 생성
n_cols = len(cluster_lists)
fig, axs = plt.subplots(figsize=(4*n_cols, 4), nrows=1, ncols=n_cols)
# 입력 데이터의 FEATURE가 여러개일 경우 2차원 데이터 시각화가 어려움
# PCA 변환하여 2차원 시각화
pca = PCA(n_components=2)
pca_transformed = pca.fit_transform(X_features)
dataframe = pd.DataFrame(pca_transformed, columns=['PCA1','PCA2'])
# 리스트에 기재된 클러스터링 갯수들을 차례로
# iteration 수행하면서 KMeans 클러스터링 수행하고 시각화
for ind, n_cluster in enumerate(cluster_lists):
# KMeans 클러스터링으로 클러스터링 결과를 dataframe에 저장.
clusterer = KMeans(n_clusters = n_cluster, max_iter=500, random_state=0)
cluster_labels = clusterer.fit_predict(pca_transformed)
dataframe['cluster']=cluster_labels
unique_labels = np.unique(clusterer.labels_)
markers=['o', 's', '^', 'x', '*']
# 클러스터링 결과값 별로 scatter plot 으로 시각화
for label in unique_labels:
label_df = dataframe[dataframe['cluster']==label]
if label == -1:
cluster_legend = 'Noise'
else :
cluster_legend = 'Cluster '+str(label)
axs[ind].scatter(x=label_df['PCA1'], y=label_df['PCA2'], s=70,\
edgecolor='k', marker=markers[label], label=cluster_legend)
axs[ind].set_title('Number of Cluster : '+ str(n_cluster))
axs[ind].legend(loc='upper right')
plt.show()
'Python > IBA' 카테고리의 다른 글
회귀모델링 (0) | 2023.05.08 |
---|---|
원핫인코딩 pandas의 get_dummies() vs sklearn의 OneHotEncoder (0) | 2023.05.07 |
[Chat GPT] No module named 'google.colab' 주피터 오류 (0) | 2023.03.20 |
공부공부 (0) | 2023.03.06 |