상세 컨텐츠

본문 제목

슈퍼스토어 마케팅 캠페인 데이터셋

인공지능/데이터분석

by Ryuzy 2025. 1. 10. 17:23

본문

728x90
반응형

1. 슈퍼스토어 마케팅 캠페인 데이터셋

슈퍼스토어 마케팅 캠페인 데이터셋은 Superstore 마케팅 캠페인 데이터를 포함하고 있으며, 고객의 인구통계학적 정보(예: 출생 연도, 학력, 결혼 상태, 소득), 가구 구성(어린이와 십대 자녀 수), 구매 기록(와인, 육류, 생선 등 다양한 제품군에 대한 지출), 구매 채널(매장, 웹사이트, 카탈로그), 그리고 고객의 마케팅 캠페인 참여 여부 및 불만 기록 등을 담고 있습니다. 이 데이터는 고객의 행동 패턴과 마케팅 전략의 효과를 분석하는 데 유용합니다.

2. 데이터셋 컬럼 설명

  • ID: 각 고객의 고유 식별 번호입니다.
    • 데이터에서 고객을 구별하기 위한 유일한 값입니다.
  • Year_Birth: 고객의 출생 연도입니다.
    • 이 값을 사용해 고객의 나이를 계산할 수 있습니다.
  • Complain: 지난 2년간 고객이 불만을 제기한 적이 있는지를 나타냅니다.
    • 1: 불만을 제기한 적 있음.
    • 0: 불만을 제기한 적 없음.
  • Dt_Customer: 고객이 회사와 거래를 시작한 날짜입니다.
    • 고객 충성도 또는 거래 기간 분석에 활용할 수 있습니다.
  • Education: 고객의 학력 수준입니다.
    • 예: 고졸, 대졸, 대학원 졸업 등.
  • Marital: 고객의 결혼 상태를 나타냅니다.
    • 예: 독신(Single), 기혼(Married), 이혼(Divorced) 등.
  • Kidhome: 고객 가정에 있는 어린 아이(소아)의 수를 나타냅니다.
    • 나이가 어린 자녀의 수를 분석하는 데 유용합니다.
  • Teenhome: 고객 가정에 있는 십대 자녀의 수를 나타냅니다.
    • 십대 자녀 수와 구매 행동 간의 관계를 분석할 수 있습니다.
  • Income: 고객 가정의 연간 가계 소득입니다.
    • 구매력이나 소비 패턴을 분석하는 중요한 변수입니다.
  • MntFishProducts: 지난 2년 동안 생선 제품에 지출한 금액입니다.
  • MntMeatProducts: 지난 2년 동안 육류 제품에 지출한 금액입니다.
  • MntFruits: 지난 2년 동안 과일 제품에 지출한 금액입니다.
  • MntSweetProducts: 지난 2년 동안 디저트(단 제품)에 지출한 금액입니다.
  • MntWines: 지난 2년 동안 와인 제품에 지출한 금액입니다.
  • MntGoldProds: 지난 2년 동안 금으로 된 제품에 지출한 금액입니다.
    • 고가 상품 소비 경향을 분석할 수 있습니다.
  • NumDealsPurchases: 할인을 통해 구매한 횟수입니다.
    • 고객이 가격 할인에 민감한지 알 수 있습니다.
  • NumCatalogPurchases: 카탈로그를 이용한 구매 횟수입니다.
    • 우편 주문이나 비대면 구매 경향을 나타냅니다.
  • NumStorePurchases: 매장에서 직접 구매한 횟수입니다.
    • 오프라인 구매 성향을 분석하는 데 유용합니다.
  • NumWebPurchases: 웹사이트를 통해 구매한 횟수입니다.
    • 온라인 구매 경향을 평가할 수 있습니다.
  • NumWebVisitsMonth: 지난달 동안 웹사이트를 방문한 횟수입니다.
    • 고객이 웹사이트에서의 관심도를 측정할 수 있습니다.

 

 

3. 데이터 전처리 및 EDA

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

 

 

4. 클러스터

클러스터(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)

 

 

5. K-Means

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)으로 계산되며, 클러스터가 얼마나 잘 형성되었는지 평가하는 데 사용됩니다.

  • 클러스터 내 데이터 포인트들이 중심에 얼마나 밀집되어 있는지를 나타냅니다.
  • 관성 값이 작을수록 클러스터링 품질이 좋다는 것을 의미합니다.
  • 관성 값만으로 최적의 클러스터 개수를 결정하지는 않습니다. 관성 값은 클러스터 개수가 많아질수록 항상 감소하기 때문에, 실루엣 점수 등 다른 지표와 함께 고려하는 것이 중요합니다.

 

※ 엘보우 메서드

  • Elbow Method에서는 관성 값을 클러스터 개수(k)에 따라 계산하고, 이 값을 통해 최적의 클러스터 개수를 결정합니다.
  • 일반적으로, kk가 증가하면 관성 값은 감소합니다. 하지만 kk가 어느 순간부터는 감소율이 급격히 줄어들게 됩니다. 이 지점을 Elbow Point라고 하며, 최적의 클러스터 개수로 선택합니다.
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)

 

 

6. 실루엣 스코어

실루엣 스코어(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()
728x90
반응형

'인공지능 > 데이터분석' 카테고리의 다른 글

호텔 예약 수요 데이터셋  (1) 2025.01.09
서울 자전거 공유 수요 예측 데이터셋  (0) 2025.01.08
주택 임대료 예측 데이터셋  (2) 2025.01.03
사이킷런  (0) 2024.12.31
머신러닝  (3) 2024.12.23

관련글 더보기