슈퍼스토어 마케팅 캠페인 데이터셋은 Superstore 마케팅 캠페인 데이터를 포함하고 있으며, 고객의 인구통계학적 정보(예: 출생 연도, 학력, 결혼 상태, 소득), 가구 구성(어린이와 십대 자녀 수), 구매 기록(와인, 육류, 생선 등 다양한 제품군에 대한 지출), 구매 채널(매장, 웹사이트, 카탈로그), 그리고 고객의 마케팅 캠페인 참여 여부 및 불만 기록 등을 담고 있습니다. 이 데이터는 고객의 행동 패턴과 마케팅 전략의 효과를 분석하는 데 유용합니다.
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
mkt_df = pd.read_csv('/본인의 구글드라이브 경로/superstore_data.csv')
mkt_df
mkt_df.info()
mkt_df.drop('Id', axis=1, inplace=True)
mkt_df.describe()
mkt_df.sort_values('Year_Birth')
mkt_df.sort_values('Income', ascending=False)
# mkt_df = mkt_df[mkt_df['Income'] < 200000] # NaN값도 저장되지 않음
mkt_df = mkt_df[mkt_df['Income'] != 666666] # 실수값으로 표현하지 않아도 됨
mkt_df.sort_values('Income', ascending=False)
mkt_df.isna().mean()
mkt_df = mkt_df.dropna()
mkt_df.isna().mean()
mkt_df.info()
mkt_df['Dt_Customer'] = pd.to_datetime(mkt_df['Dt_Customer'])
mkt_df.info()
# Dt_Customer 기준으로 Dt_Customer의 마지막 가입일과의 차를 구하기
# 단, "월"로 계산
# 파생변수: pass_month
mkt_df['pass_month'] = (mkt_df['Dt_Customer'].max().year * 12 + mkt_df['Dt_Customer'].max().month) - (mkt_df['Dt_Customer'].dt.year * 12 + mkt_df['Dt_Customer'].dt.month)
mkt_df.head()
mkt_df.drop('Dt_Customer', axis=1, inplace=True)
mkt_df.head()
mkt_df['Total_mnt'] = mkt_df[['MntWines', 'MntFruits', 'MntMeatProducts',
'MntFishProducts', 'MntSweetProducts',
'MntGoldProds']].sum(axis=1)
mkt_df.head()
mkt_df['Children'] = mkt_df[['Kidhome', 'Teenhome']].sum(axis=1)
mkt_df.head()
mkt_df.drop(['Kidhome', 'Teenhome'], axis=1, inplace=True)
mkt_df.info()
mkt_df['Education'].value_counts()
mkt_df['Marital_Status'].value_counts()
mkt_df = mkt_df[~mkt_df['Marital_Status'].isin(['Absurd', 'YOLO'])]
mkt_df['Marital_Status'].value_counts()
mkt_df['Marital_Status'] = mkt_df['Marital_Status'].replace({
'Married':'Partner',
'Together':'Partner',
'Single':'Single',
'Divorced':'Single',
'Widow':'Single',
'Alone':'Single'
})
mkt_df['Marital_Status'].value_counts()
mkt_df.info()
mkt_df = pd.get_dummies(mkt_df, columns=['Education', 'Marital_Status'])
mkt_df.head()
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
mkt_df.columns
ss.fit_transform(mkt_df[['Income', 'Recency', 'MntWines', 'MntFruits',
'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts',
'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases',
'NumCatalogPurchases', 'NumStorePurchases', 'NumWebVisitsMonth',
'Response', 'pass_month', 'Total_mnt', 'Children']])
mkt_df[['Income', 'Recency', 'MntWines', 'MntFruits',
'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts',
'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases',
'NumCatalogPurchases', 'NumStorePurchases', 'NumWebVisitsMonth',
'Response', 'pass_month', 'Total_mnt', 'Children']] = ss.fit_transform(mkt_df[['Income', 'Recency', 'MntWines', 'MntFruits',
'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts',
'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases',
'NumCatalogPurchases', 'NumStorePurchases', 'NumWebVisitsMonth',
'Response', 'pass_month', 'Total_mnt', 'Children']])
mkt_df
클러스터(Clusters)는 데이터 분석에서 비슷한 특성을 가진 데이터 포인트들을 그룹화한 결과를 의미합니다. 클러스터링은 비지도 학습의 한 형태로, 데이터 내에 숨겨진 패턴이나 구조를 찾는 데 사용됩니다. 각 클러스터는 내부적으로는 데이터 포인트들이 매우 유사하지만, 다른 클러스터와는 차별화된 특성을 가지도록 구성됩니다. 예를 들어, 고객 데이터를 클러스터링하면 구매 패턴, 소득 수준, 관심사 등에 따라 고객 그룹을 나눌 수 있으며, 이를 통해 타겟 마케팅이나 고객 세그먼테이션과 같은 전략적 의사결정을 내릴 수 있습니다. 대표적인 클러스터링 알고리즘으로는 K-평균(K-Means), 계층적 클러스터링, DBSCAN 등이 있습니다.
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=100, centers=3, random_state=2025)
X
y
X = pd.DataFrame(X)
X
sns.scatterplot(x=X[0], y=X[1], hue=y)
K-Means는 가장 널리 사용되는 클러스터링 알고리즘 중 하나로, 데이터를 K개의 클러스터로 나누는 비지도 학습 기법입니다. 알고리즘은 먼저 데이터 내에서 K개의 초기 중심점(centroid)을 랜덤하게 선택한 뒤, 각 데이터 포인트를 가장 가까운 중심점에 할당하여 클러스터를 형성합니다. 그런 다음, 각 클러스터의 평균값을 계산하여 중심점을 갱신하고, 이 과정을 중심점의 위치가 더 이상 변하지 않을 때까지 반복합니다. K-Means는 계산이 간단하고 대규모 데이터셋에서도 빠르게 작동하지만, 클러스터 수(K)를 사전에 정해야 하고, 데이터가 구형으로 분포하지 않거나 잡음(noise)이 많은 경우 성능이 떨어질 수 있습니다. 이 알고리즘은 고객 세그먼트화, 이미지 압축, 패턴 인식 등 다양한 분야에서 활용됩니다.
※ 간단한 예제
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3)
km.fit(X)
pred = km.predict(X)
sns.scatterplot(x=X[0], y=X[1], hue=pred)
km = KMeans(n_clusters=5)
km.fit(X)
pred = km.predict(X)
sns.scatterplot(x=X[0], y=X[1], hue=pred)
km.inertia_
※ Inertia
inertia_는 KMeans 군집화 모델에서 계산되는 관성(Inertia) 값을 나타냅니다. 관성은 각 클러스터의 중심(centroid)과 클러스터에 속한 데이터 포인트 사이의 거리 제곱합(Sum of Squared Distances, SSD)으로 계산되며, 클러스터가 얼마나 잘 형성되었는지 평가하는 데 사용됩니다.
※ 엘보우 메서드
inertia_list = []
for i in range(2, 11):
km = KMeans(n_clusters=i)
km.fit(X)
inertia_list.append(km.inertia_)
inertia_list
sns.lineplot(x=range(2, 11), y=inertia_list)
inertia_list = []
for i in range(2, 11):
km = KMeans(n_clusters=i, random_state=2025)
km.fit(mkt_df)
inertia_list.append(km.inertia_)
inertia_list
sns.lineplot(x=range(2, 11), y=inertia_list)
실루엣 스코어(Silhouette Score)는 군집화의 품질을 평가하는 지표로, 각 데이터 포인트가 같은 클러스터 내부에서 얼마나 잘 밀집되어 있고 다른 클러스터와 얼마나 명확히 구분되는지를 측정합니다. 점수는 -1에서 1 사이의 값을 가지며, 1에 가까울수록 각 데이터가 올바른 클러스터에 속해 있고 클러스터 간 분리가 잘 이루어졌음을 의미합니다. 0에 가까우면 클러스터 간 구분이 명확하지 않다는 뜻이고, 음수는 데이터가 잘못된 클러스터에 속해 있음을 나타냅니다. 실루엣 스코어는 클러스터 내 거리(a)와 클러스터 간 최소 거리(b)를 비교하여 계산되며, 클러스터링의 최적화 및 클러스터 개수 선정에 자주 사용됩니다.
from sklearn.metrics import silhouette_score
score = []
for i in range(2, 11):
km = KMeans(n_clusters=i, random_state=2025)
km.fit(mkt_df)
pred = km.predict(mkt_df)
score.append(silhouette_score(mkt_df, pred))
score
sns.lineplot(x=range(2, 11), y=score)
km = KMeans(n_clusters=3, random_state=2025)
km.fit(mkt_df)
pred = km.predict(mkt_df)
pred
mkt_df['label'] = pred
mkt_df
mkt_df['label'].value_counts()
호텔 예약 수요 데이터셋 (1) | 2025.01.09 |
---|---|
서울 자전거 공유 수요 예측 데이터셋 (0) | 2025.01.08 |
주택 임대료 예측 데이터셋 (2) | 2025.01.03 |
사이킷런 (0) | 2024.12.31 |
머신러닝 (3) | 2024.12.23 |