rubus0304 님의 블로그

[머신러닝 심화 3주차] 군집 본문

강의/머신러닝

[머신러닝 심화 3주차] 군집

rubus0304 2024. 11. 27. 20:51

 

 

 

 

 

 

 

 

 

 

평균은 이상치에 취약.

 

 

 

 

 

 

 

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 

 

iris_df = sns.load_dataset('iris')
iris_df.head(3)
 

 

iris_df.info()
 

sns.scatterplot(data = iris_df, x = 'sepal_length', y = 'sepal_width')
 

 

sns.scatterplot(data = iris_df, x = 'sepal_length', y = 'sepal_width', hue = 'species')
 

 

 

 

 

iris_df2 = iris_df[['sepal_length','sepal_width','petal_length','petal_width']]
iris_df2.head(3)
 

 

 

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, random_state= 42)
kmeans.fit(iris_df2)
 

 

 

kmeans.labels_
 

 

iris_df2['target'] = iris_df['species']
iris_df2['cluster'] = kmeans.labels_
iris_df2
 

 

 

plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
sns.scatterplot(data = iris_df2, x = 'sepal_length', y = 'sepal_width', hue = 'target')
plt.title('Original')

plt.subplot(1,2,2)
sns.scatterplot(data = iris_df2, x = 'sepal_length', y = 'sepal_width', hue = 'cluster', palette= 'viridis')
plt.title('Clustering')
plt.show()
 

 

 

 

 

(실습) 고객 세그멘테이션

 

☑️ 고객 세그멘테이션의 정의

 

비지도 학습이 가장 많이 사용되는 분야는 고객 관계 관리(Customer Relationship Management, CRM)분야 입니다.

이중 고객 세그멘테이션(Customer Segmentation)은 다양한 기준으로 고객을 분류하는 기법입니다.

주로 타겟 마케팅이라 불리는 고객 특서엥 맞게 세분화 하여 유형에 따라 맞춤형 마게팅이나 서비스를 제공하는 것을 목표로 둡니다.

 

 

  • RFM의 개념
    • Recency(R) 가장 최근 구입 일에서 오늘까지의 시간
    • Frequency(F): 상품 구매 횟수
    • Monetary value(M): 총 구매 금액
pip install openpyxl
 

 

xlsx 확장자 불러오기 위함. 

retail_df = pd.read_excel('C:/Users/82106/Desktop/데이터분석/강의/6.파이썬/4.머신러닝/ML/Online Retail.xlsx')
retail_df.head(3)
 

 

retail_df.info()
 

 

retail_df.isnull().sum()
 

 

## 1. 데이터EDA 및 전처리
retail_df.describe(include = 'all')
 

 

cond1 = retail_df['Quantity']< 0
retail_df[cond1]
 

 

# 데이터 전처리전략
# 조건1: customerID 결측치인것은 삭제
# 조건2: Invoice가 C로 시작하거나, quantity가 음수이거나, unitprice가 음수인것은 모두 삭제
 

 

cond_cust = (retail_df['CustomerID'].notnull())
retail_df[cond_cust].isnull().sum()
 

 

cond_invo = (retail_df['InvoiceNo'].astype(str).str[0] != 'C')
retail_df[cond_invo].head(3)
 

 

cond_minus = (retail_df['Quantity'] >0 ) & (retail_df['UnitPrice'] >0)
retail_df[cond_minus].head(3)
 

 

retail_df_2 = retail_df[cond_cust & cond_invo & cond_minus]
retail_df_2.info()
 

 

retail_df_2['Country'].value_counts()[:10]
 

 

cond_uk = (retail_df_2['Country'] =='United Kingdom')
retail_df_2 = retail_df_2[cond_uk]
retail_df_2
 

 

retail_df_2.describe(include= 'all')
 

 

retail_df_2['Amt'] = retail_df_2['Quantity'] * retail_df_2['UnitPrice']
retail_df_2['Amt'] = retail_df_2['Amt'].astype('int')
 

 

retail_df_2[['CustomerID']].drop_duplicates()
 

 

retail_df_2.pivot_table(index = 'CustomerID', values = 'Amt', aggfunc='sum').sort_values('Amt', ascending=False)
 

 

import datetime as dt
# 2011.12.10일 기준으로 각 날짜를 빼고 + 1
# 추후 CustomerID 기준으로 Priod의 최소의 Priod를 구하면 그것이 Recency
# 1번사람 100일전, 20일전, 5일전


retail_df_2['Period'] = (dt.datetime(2011,12,10) - retail_df_2['InvoiceDate']).apply(lambda x: x.days+1)
retail_df_2.head(3)
 

 

rfm_df = retail_df_2.groupby('CustomerID').agg({
    'Period' : 'min',
    'InvoiceNo' : 'count',
    'Amt' : 'sum'
})
rfm_df
 

 

rfm_df.columns = ['Recency','Frequency','Monetary']
 

 

sns.histplot(rfm_df['Recency'])
 

 

sns.histplot(rfm_df['Frequency'])
 

 

sns.histplot(rfm_df['Monetary'])
 

 

# 데이터정규화
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_features = sc.fit_transform(rfm_df[['Recency','Frequency','Monetary']])
 

 

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

kmeans = KMeans(n_clusters = 3, random_state = 42)
labels = kmeans.fit_predict(X_features)
rfm_df['label'] = labels

silhouette_score(X_features, labels)
 

 

from kmeans_visaul import visualize_silhouette
visualize_silhouette([2,3,4,5,6], X_features)
 

#log 스케일을 통한 추가전처리
import numpy as np

rfm_df['Recency_log'] = np.log1p(rfm_df['Recency'])
rfm_df['Frequency_log'] = np.log1p(rfm_df['Frequency'])
rfm_df['Monetary_log'] = np.log1p(rfm_df['Monetary'])

X_features2 = rfm_df[['Recency_log','Frequency_log','Monetary_log']]
sc2 = StandardScaler()
X_features2_sc = sc2.fit_transform(X_features2)

visualize_silhouette([2,3,4,5,6], X_features2_sc)
 

 

 

'강의 > 머신러닝' 카테고리의 다른 글

1. 분류 프로젝트  (1) 2024.11.28
[머신러닝 4주차] 딥러닝  (0) 2024.11.28
[머신러닝 심화 2주차]  (0) 2024.11.27
[머신러닝 심화 1주차]  (0) 2024.11.27
[기초] 분류분석 - 로지스틱회귀  (1) 2024.11.20