고객 세그먼테이션의 주요 목표는 타깃 마케팅

 

데이터 세트 로딩과 데이터 클렌징

import pandas as pd
import datetime
import math
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

retail_df = pd.read_excel('.xlsx')
retail_df.head(3)

 

retail_df.info()

 

retail_df = retail_df[retail_df['Quantity']>0]
retail_df = retail_df[retail_df['UnitPrice']>0]
retail_df = retail_df[retail_df['CustomerID'].notnull()]
print(retail.shape)
retail_df.isnull().sum()

 

retail_df['Country'].value_counts()[:5]

영국이 대다수를 차지하므로 다른 국가의 데이터는 모두 제외

 

retail_df = retail_df[retail_df['Country']=='United Kingdom']
print(retail_df.shape)

 

 

RFM 기반 데이터 가공

retail_df['sale_amount'] = retail_df['Quantity'] * retail_df['UnitPrice']
retail_df['CustomerID'] = retail_df['CustomerID'].astype(int)

 

print(retail_df['CustomerID'].value_counts().head(5))
print(retail_df.groupby('CustomerID')['sale_amount'].sum().sort_values(ascending=False)[:5])

 

#DataFrame의 groupby()의 multiple 연산을 위해 agg() 이용
#Recency는 InvoiceDate 칼럼의 max()에서 데이터 가공
#Frequency는 InvoiceNo 칼럼의 count(), Monetary values는 sale_amount 칼럼의 sum()

aggregations = {
    'InvoiceDate':'max',
    'InvocidNo':'count',
    'sale_amount':'sum'
}

cust_df = retail_df.groupby('CustomerID').agg(aggregations)
cust_df = cous_df.rename(columns={'InvoiceDate':'Recency', 'InvoiceNo':'Frequency', 'sale_amount':'Monetary'})
                        
cust_df = cust_df.reset_index()
cust_df.head(3)

 

import datetime as dt

cust_df['Recency'] = dt.datetime(2011, 12, 10) - cust_df['Recency']
cust_df['Recency'] = cust_df['Recency'].apply(lambda x : x.days+1)
print(cust_df.shape)
cust_df.head(3)

 

RMF 기반 고객 세그멘테이션

왜곡 정도가 매우 높은 데이터 세트에 k-means clustering을 적용하면 중심의 개수를 증가시키더라도 변별력이 떨어지는 군집화가 수행됨

 

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, silhouette_samples

X_features = cust_df[['Recency', 'Frequency', 'Monetary']].values
X_features_scaled = StandardScaler().fit_transform(X_features)

kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X_features_scaled)
cust_df['cluster_label'] = labels

print(silhouette_score(X_features_scaled, labels))

 

특이한 데이터 세트를 분리하고 도출하는 것이 군집화의 목표이기도 하다

지나치게 왜곡된 데이터 세트는 k-means와 같은 거리 기반 군집화 알고리즘에서 지나치게 일반적인 군집화 결과를 도출

 

비지도학습 알고리즘의 하나인 군집화의 기능적 의미는 숨어 있는 새로운 집단을 발견하는 것

데이터 세트의 왜곡 정도를 낮추기 위해 가장 자주 사용되는 방법은 데이터 값에 로그를 적용하는 로그 변환

 

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics improt silhouette_score, silhouette_samples

cust_df['Recency_log'] = np.log1(cust_df['Recency'])
cust_df['Frequency_log'] = np.log1(cust_df['Frequency'])
cust_df['Monetary_log'] = np.log1(cust_df['Monetary'])

#Log Transformation 데이터에 StandardScaler 적용
X_features = cust_df[['Recency_log', 'Frequency_log', 'Monetary_log']].values
X_features_scaled = StandardScaler().fit_transform(X_features)

kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X_features_scaled)
cust_df['cluster_label'] = labels
print(silhouette_score(X_features_scaled, labels))

 

실루엣 스코어의 절대치가 중요한 것이 아니라 어떻게 개별 군집이 더 균일하게 나뉠 수 있는지가 더 중요

 

'ML' 카테고리의 다른 글

텍스트 분류 실습 - 20 뉴스그룹 분류  (0) 2022.11.23
텍스트 분석  (0) 2022.11.22
군집화  (2) 2022.11.20
차원 축소  (0) 2022.11.20
캐글 주택 가격 : 고급 회귀 기법  (0) 2022.11.19

+ Recent posts