피드백을 통해 프로젝트에 정제된 데이터가 시각적으로 어떻게 보여주는지는 개발자 혼자만 수행할수 없었다 서비스를 배포하기 위해서는 마인드맵처럼 꼬리를 물어 가능성을 질문하고 답변해줄수 있는 것이 시각화인데 이를 통해 의사소통과 기업의 상황을 고려해야 할 것이다 만약 팀으로 진행했더라면 코드를 작성하면서 추가적인 시각효과를 구성할 수 있을 것이라 생각한다
개인으로 작성한 코드를 리뷰해보는 것으로 그떄 생각해보지 못한 데이터를 발견할 수 있을 것이다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
df1 = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/marketing_campaign.csv', sep='\t')
# 데이터 소개
# 데이터 : 소비자 분석 (customer personality analysis)
# 데이터가 비교적 적은 편이었지만 시장에서 충분히 있을 요소들로 이루어졌기에 거리낌 없이 수행
# 컬럼 소개 및 목적 <2240 데이터 크기의 29개 컬럼>
# 소비자 특성
# ID : 소비자의 식별자
# Year_Birth : 소비자 출생연도
# Education : 소비자 학력
# Marital_Status : 혼인 상태
# Income : 연간 가계 소득
# Kidhome : 가정의 어린이 수
# Teenhome : 가정의 청소년 수
# Dt_Customer : 소비자가 회사에 등록한 날짜 => 경제활동을 하는 날짜
# Recency : 소비자의 마지막 구매 후 일 수 => 매장을 이용하는 주기
# Complain : 지난 2년간 컴플레인을 걸었는지의 여부
# 상품
# MntWines : 지난 2년간 와인에 소비한 금액
# MntFruits : 지난 2년간 과일에 소비한 금액
# MntMeatProducts : 지난 2년간 육류에 소비한 금액
# MntFishProducts : 지난 2년간 생선에 소비한 금액
# MntSweetProducts : 지난 2년간 과자/사탕에 소비한 금액
# MntGoldProds : 지난 2년간 금에 소비한 금액
## 나머지는 다루지 않을 데이터
# 소비자 특성에서 지역을 알수는 없지만 식별자가 있어서 구별되는 인구들로
# 연간 가계 소득에서 달 기준으로 구분하고 GDP를 통해 1인당 소득 기준을 통해
# 어느 나라인지 접근해보는 시도를 했으나 GDP의 1인 기준 접근이 어렵다고 판단
# 연도에 신경쓰지 않고 소득, 학력, 혼인상태, 자녀여부에 따라 상품을 배치할수있는 전략 생각
# 특성을 가진 집단으로 생각해서 클러스터링으로 진행
|
cs |
나머지 데이터는 소비자 타겟팅으로 할인과 같이 반응을 이끌었을 떄 데이터와 온라인과 오프라인 유통에 참여한 정도를 데이터로 가진다 반응 데이터는 빈 값이 많았으므로 상관관계에서 방해되는 요소로 생각했다 유통 데이터 또한 지역을 판별할 수 없는 구조이면서 서비스의 궁극적인 목적은 판매대에 적용할 제품 포지셔닝으로 매장 관계자를 대상으로 보여질 전제로 시작했기 떄문이다
1
2
3
|
print('원래 데이터값 : ', len(df1))
df1 = df1.dropna()
print('제거된 결측값 : ', len(df1))
|
cs |
어느정도 결측치를 가질지 전체적인 상황판단이 필요했다 그 후 움직임으로 의미있는 데이터를 선별하고 데이터가 보여줄 수 있는 관계자의 니즈를 파악한다면 어떤 것을 정제 해야할 것인가로 이어진 것 이다
결과적으로는 결측이 일어나는 이유를 파악해서 서비스 방향을 잡아보는 전개(data cleansing)를 수행했고 소비자들의 연령을 고려해서 소비상품과 위수지역의 연령 대를 확인했다 출생한지 1년이 지나지 않은 인원도 소비자로서 의식하고 분석(data analysis)를 진행했다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 출생연도를 통해 구성된 인원들의 나이를 확인
df1['Age'] = 2021 - df1['Year_Birth'] # 100세 전으로 확인하기 위해 정제
# 소비하는 상품을 특성으로 구분
df1['spent'] = df1['MntWines'] + df1['MntFruits'] + df1['MntFishProducts'] + df1['MntMeatProducts'] + df1['MntSweetProducts'] + df1['MntGoldProds']
df1 = df1.rename(columns={'MntWines':'wines', 'MntFruits':'fruits', 'MntMeatProducts':'meat',
'MntFishProducts':'fish', 'MntSweetProducts':'sweets', 'MntGoldProds':'gold'})
# 과부나 독신은 같은 데이터로 생각하고 정제
df1['living'] = df1['Marital_Status'].replace(
{'Married':'partner', 'Together':'partner', 'Absurd':'alone', 'Window':'alone',
'YOLO':'alone', 'Divorced':'alone', 'Single':'alone'})
# 아이와 청소년으로 물품을 판매대를 올리지 않기 떄문에 경제활동을 하는 가족단위로 구분
df1['children'] = df1['Kidhome'] + df1['Teenhome']
df1['family_size'] = df1['living'].map({'alone':1, 'partner':2}).fillna(0) + df1['children']
df1['is_parent'] = np.where(df1.children>0,1,0)
# is_parent는 부모가 있는 가정에서 자녀가 있으면 1 없으면 0 으로 구분한다
|
cs |
그 외에도 유년기, 청년, 중년, 노년의 소비품을 파악, 가족관계에 따른 소비 물품 파악 등 소비자들의 경제활동 및 가족관계가 물품의 선정과 향후 전략을 세울 것을 인지했다 데이터 중에서는 청년을 지나 정확한 나이는 구분할 수 없지만 자녀가 없는 가족관계를 보인 것을 확인했다 해당 데이터는 동년의 나이대가 많은 지역일 경우 요구되지 않는 물품을 선정할 수 없을 것이고 정제할 필요성을 파악, "family_size"로 dictionary자료형을 사용하지 않고 자녀가 있으면 1, 자녀가 없으면 2로 정리했다
학력 데이터 존재로 경제활동에 참여하면서 고가의 소비와 저가의 소비를 이루는 경제 참여자를 구분될 것이라 판단했으며어느정도 활동에 참여하는지 pie graph로 비교하였다
1
2
3
4
5
6
7
8
|
# 학력 구분은 클러스터에서 하나의 속성이므로 정제
df1['Education'] = df1['Education'].replace(
{'basic':'undergraduate', '2n Cycle':'undergraduate', 'Graduation':'Graduate',
'Master':'Postgraduate', 'PhD':'Postgraduate'})
# 정제한 데이터 외 필요없는 데이터는 제거
dr = ['Marital_Status', 'Dt_Customer','Z_CostContact', 'Z_Revenue', 'Year_Birth', 'ID']
df1 = df1.drop(dr, axis=1)
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# 배경
sns.set(rc={'axes.facecolor':'#FFF9ED', 'figure.facecolor':'#FFF9ED'})
# 색
pallet = ['#682F2F', '#9E726F', '#D6B2B1', '#B9C0C9', '#9F8A78', '#F3AB60']
cmap = mcolors.ListedColormap(['#682F2F', '#9E726F', '#D6B2B1', '#B9C0C9', '#9F8A78', '#F3AB60'])
# 연령과 소비하는 물품의 관계 / 연령과 자녀 구성 / 연령과 소득을 고려할수 있다
df1.describe()
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# <알아볼 것>
# 연령 대비 관계 + 자녀 구성
# children이 없으면 크기는 1인 것(1+0), 자녀도 없고 독신이면 1(0+1)
# 결과 : 연령이 많아질수록 자녀 구성원은 평균 정도를 보여준다
plt.figure(figsize=(20, 15))
sns.barplot(data=df1, x=df1['Age'], y=df1['is_parent'], palette=pallet)
# 연령 대비 소득
# 결과 : 30 후반부터 60 초반까지 균등한 분포를 보임
plt.figure(figsize=(20, 15))
sns.scatterplot(data=df1, x=df1['Age'], y=df1['Income'], palette=pallet)
# df1['Age'], 연령이 구분된 데이터 => 연령 대비 소비물품
# 결과 : 20대 후반에 sweets 데이터가 많이 보이는 것으로 가족단위 중 자녀가 있음에 생각
# 위 결과를 참고하면 20대 후반의 데이터와 7~80대 데이터는 간식의 정도인 것
plt.figure(figsize=(20, 15))
sns.boxplot(x=df1['Age'], y=df1['wines'])
sns.boxplot(x=df1['Age'], y=df1['fruits'])
sns.boxplot(x=df1['Age'], y=df1['meat'])
sns.boxplot(x=df1['Age'], y=df1['fish'])
sns.boxplot(x=df1['Age'], y=df1['sweets'])
# 학력이 보여주는 그래프
plt.figure(figsize=(20, 15))
labels = 'Graduate','Postgraduate','Undergraduate', 'Basic'
size = .5
q1, q2, q3 = plt.pie(
[df1['Education'].value_counts()[0], df1['Education'].value_counts()[1],
df1['Education'].value_counts()[2], df1['Education'].value_counts()[3]],
explode=(0,0,0,0), textprops=dict(size=20, color='white'),
autopct='%.2f%%', pctdistance=0.68, radius=.9, colors=['#B9C0C9', '#9F8A78', '#7A7D58', '#94583C'],
shadow=True, wedgeprops=dict(width=size, linewidth=4), startangle=20)
plt.legend(q1, labels, title='Category', loc='center left', bbox_to_anchor=(1, 0, 0.5, 1), edgecolor='black')
plt.title('education caategory')
plt.show()
|
cs |
pie graph와 같이 비교를 하면서 동시에 차지하는 비율(%)를 파악할 수 있는 시각화(visuallize)를 여러 개 준비할려고 했으며 서비스를 사용자, 혹은 후원자에게는 설명이 들어가면서 근거가 있는 이유가 필요할 것을 시뮬레이션을 돌려보면서 진행했다
만약에 부족한 점을 뽑아본다면 정제(data cleansing)을 진행하는데 있어 필연적으로 할 것을 떠올리기 쉽지 않았고 실제의 수치인지 비교를 위한 수치인지 의미를 파악하는데 시간을 많이 투자했다는 점이다 학력의 존재가 다른 feature들에게 영향을 주는 이유를 떠올렸지만 판단이 엇갈렸던 것이다 연령 대비 학력이 구분된 점으로 보아 지역의 판매 선정은 소득이 있는에서만 한정될 것이라 생각했지만 깊게 고려해보면 소득이 없어도 학력이 높은 청년기가 실제로 데이터 상 존재했으며 저학력의 경제 참여자 또한 적지 않은 수준을 보여준 것이다 학력 데이터가 참여하는 범위가 높은 점을 고려해서 수치적으로 구분할 지 아니면 통합을 해서 저소득자를 포함하지 않는 경제활동 데이터를 보여줄 지 시뮬레이션을 게속 진행했었다
그러기 위해선 학력 대비 소득과 경제활동이 어느정도 연관성을 보이는지 heatmap을 선택해 비교를 진행했다
1
2
3
4
5
6
7
8
9
10
|
import pandas as pd
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(ds)
sscc = pd.DataFrame(sc.transform(ds), columns=ds.columns)
# 상관관계 확인
correaltion = df1.corr()
plt.figure(figsize=(20, 20))
sns.heatmap(correaltion, annot=True, cmap=cmap, center=0)
|
cs |
독립변수가 모두 feature로서 사용이 가능한 데이터이고 그 중에섣도 반드시 필요했던 feature가 있었으므로 해당 자료의 선택지는 n-cluster 였다 필요한 자료를 찾아보면서 유용한 시각 데이터가 어떤 점을 보이는지 공부하게 되었다
많은 데이터를 활용하게 되면 고차원(higher)으로 활성함수를 표현하게 되고 정규화 작업(normalize)이 없다면 과잉적합(overfiting)과 잡음이 많은 결과로 이어질 것이므로 특성 간 중요도 조절이 강구되었다 또한 어떤 알고리즘을 사용하더라도 특성 간 격차가 크다면 좋은 모델로 선택될 수 없을 것이므로 데이터 특성을 가지고 여러 알고리즘을 test 및 비교를 했다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# 클러스터가 유사한 특성을 판단하기위해 차원축소를 진행
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 3가지 :
pca = PCA(n_components=3)
pca.fit(sscc)
ppaa = pd.DataFrame(pca.transform(sscc), columns=(['col1', 'col2', 'col3']))
# ppaa.describe().T
x, y, z = ppaa['col1'], ppaa['col2'], ppaa['col3']
f = plt.figure(figsize=(10, 10))
ax = f.add_subplot(111, projection='3d')
ax.scatter(x,y,z, c='maroon', marker='o')
ax.set_title('3D data in the rd-dimension')
plt.show()
### 곡선으로 방향 확인
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
xt =np.array([x, y]).T
zt = np.array(z)
degree = 2 # 2차 ~ 고차원
coef = np.polyfit(xt[:,0], zt, degree)
fit_func = np.poly1d(coef)
# 회귀되는 새로운 변수 지정
nx = np.linspace(min(xt[:,0]), max(xt[:,0]), 100)
ny = fit_func(nx)
f = plt.figure(figsize=(10, 10))
ax = f.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c='maroon', marker='o')
# 다항 회귀로 근사화하는 곡선 정의
ax.plot(nx, ny, c='blue')
ax.legend()
plt.show()
|
cs |
우선은 PCA기법을 시작했다 고차원으로 이어질 것이고 하나의 독립적인 특성을 가지고 벡터로서 다루고 그 시점을 이용해서 graph가 어떤 형태를 보여줄지를 판단하게 될 것이라 생각했다 또한 PCA의 장점으로 차원이 축소 되면서 적은 특성만으로 연산과 노이즈에 큰 장점을 가진다 다만 적당히 많은 경우에는 고려해볼 방향성이지만 실무적으로 고려했을떄는 두 높은 상관관계를 보여줄 것이고 그 경우 함수는 물론이고 독립변수와 종속변수에서 상관관계를 맺어야 할 것이다
산점도 분석과 회귀 분석으로 방향을 잡을 수 있는데 군집 데이터에서 상관관계 정도를 직관적으로 파악하고 식별한다면 산점도를 파악하는 방향을 가진다 해당 데이터는 적당히 많은 데이터로 산점도만 이용해서 cluster algorithm을 선택했다
군집의 정도는 Kmeans 알고리즘을 이용하고 각각을 비교해보는 작업을 가지지만 적은 데이터에서는 sklearn로 학습과 평가지표를 통해 데이터를 어느정도 상관관계를 보여주는지 확인해보는 작업으로 방향을 가질 것 이다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# data clustering <군집의 정도와 산점도 확인>
from matplotlib import projections
from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer
from sklearn.cluster import AgglomerativeClustering
elbow = KElbowVisualizer(KMeans(), k=10)
elbow.fit(ppaa)
# 산점도를 위해 fit을 활용, 수치의 정도를 파악하기 위해서 transform()으로 활용
# 이외에도 predict(), cluster_centers, labels, inertia_ 가 있다
print(elbow.transform(ppaa))
elbow.show()
# 클러스터링 병합 <계층화>
# 데이터 클러스터 거리를 그래프로 확인하고 하나의 클러스터로 얻음
ac = AgglomerativeClustering(n_clusters=4)
yac = ac.fit_predict(ppaa)
ppaa['Clusters'] = yac
df1['Clusters'] = yac
# cluster show
f = plt.figure(figsize=(10 ,10))
ax = plt.subplot(111, projection='3d')
ax.scatter(x,y,z, s=40, c=ppaa['Clusters'], marker='o', cmap=cmap)
plt.show()
# elbow 값이 83점을 보여주며 cluster 4개가 좋은 평가로 보여줌
|
cs |
항상 학습모델을 불러오기 위해서는 sklearn을 이용하는데 scikit-learn으로 분류(classification), 회귀(regression), 군집(clustering), 차원감소(dimenssion reduction)로 분류 알고리즘으로 SGD, Linear SVC등 알고리즘에 적합한 모델을 찾는 것이다 Kmeans는 클러스터링 분석으로 군집을 몇개로 분류해서 각 군집의 상관관계 정도를 분석, 파악하는 것으로 사용하는 것이 군집의 개수가 어느정도 정확성을 갖췄는지 일종의 평가지표인 KElbowVisualizer를 통해 산점도를 파악한다
평가지표를 적용하는 것은 적용한 알고리즘이 정확도를 어느정도 가지는지 각각 평가를 수행하는 것 이고 군집화에서 군집의 관계성과 멀어진 정도는 모델의 성능을 고려할 수 있다 KMeans는 군집의 정도를 평가하기 위해 중심부터 어느정도 멀어진 수치를 구하는 것으로 함께 쓰일 평가로 KElbow를 이용한다 각 데이터 포인트에서 학습할떄마다 어느정도 차이를 벌리는지 수치를 구하는 것으로 독립변수가 많은 것을 고려해 차원축소한 데이터를 인수로 받아 진행했다 cluster를 몇개로 맞춰서 평가를 진행할지에 따라 산점도를 평가할수 있으므로 predict와 inertia_ 를 수행해보고 10개로 진행하게 되었다
다른 방법으로는 cluster를 계층적으로 평가할수 있는 방법을 찾아서 진행했지만 다른 평가와 비교했을떄 명확하게 들어오는 정보가 적어서 사용하기 어렵다고 판단했지만 기록용으로 남겨두었다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 군집 평가
from sklearn.cluster import KMeans
elbow_list= []
for i in range(1, 11):
km = KMeans(n_clusters=i, random_state=42)
km.fit(ppaa)
# 어느정도 학습률을 가지는지만 파악
elbow_list.append(km.inertia_)
# 응집된 정도로 각 거리들의 상대성 파악
plt.figure(figsize=(15, 7))
plt.plot(range(1, 11), elbow_list, 'bx-')
plt.title('elbow method')
plt.xlabel('num of cluster')
plt.ylabel('elbow set')
plt.show() # 학습대로 초반 거리가 많이 먼 상태임을 확인
elbow_list = np.array(elbow_list) # 리스트 상태를 해결하기 위해 이용
plt.plot(range(1, 11), elbow_list)
plt.vlines(3, ymin=elbow_list.min()*0.9999, ymax=elbow_list.max()*1.0003, linestyle='--', colors='b')
plt.vlines(4, ymin=elbow_list.min()*0.9999, ymax=elbow_list.max()*1.0003, linestyle='--', colors='g')
plt.xlabel('num of cluster')
plt.ylabel('elbow set')
plt.show()
|
cs |
급한 감은 있지만 이 당시 프로젝트 기간이 하루 남짓밖에 없었기 떄문에 마무리를 위해서 군집 10개를 잡고 반복적으로 돌려 학습관계를 파악했다 서로 학습 상태가 먼 경우 학습모델로서 cluster는 안좋은 선택이 될 것이다 다행이 해당 학습은 기울기가 급격히 변하는 cluster=3 에서 cluster=4 인 구간에서 좋은 학습을 보여주고 있다 이는 cluster를 많이 가질수록 학습에 의미가 없어지지만 4인 구간에서만 유의미한 결과를 가질 수 있다는 것이다 따라서 10개를 잡고 수행했을 떄 알지 못했던 부분이 생겼으니 이를 중심으로 silhouette_score를 통해 학습의 상태를 확인해볼 것이다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from sklearn.metrics import silhouette_score
sh_list = []
jj = -1
best_score = -1 # 적절한 거리가 아닌 경우
for i in range(2, 12):
gr5 = KMeans(n_clusters=i, random_state=42)
r = gr5.fit_predict(ppaa)
score = silhouette_score(ppaa, r)
sh_list.append(score)
if score > best_score:
jj = i
best_score = score
plt.bar(range(1, 11), sh_list)
plt.xlabel('num of cluster')
plt.ylabel('sh')
plt.show()
print(jj, best_score)
# 2 0.45255592936763656, 클러스터 2개에서 양호 / 3 0.436316993184691 / 4개
# 2~ 3개 사이를 보여줌
|
cs |
이후에는 cluster=4 를 중심으로 각 특성에서 순위를 파악하고 조합을 통해 특정 인원의 경제력과 소비를 파악하는 과정을 가진다 특성은 각각의 독립적인 것으로 상품을 배치하거나 판매대의 선정 더해서 주변 도매 시장의 위치선정 등 정보력을 갖추게 된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 클러스터 파악
target = ['#682F2F', '#B9C0C9', '#9F8A78', '#F3AB60']
# 소득 대비 소비 금액
# 결과 : 차이가 크지 않은 것으로 보아 여비를 남기지 않는 정도로 확인
gr2 = sns.scatterplot(data=df1, x=df1['spent'], y=df1['Income'], hue=df1['Clusters'], palette=target)
gr2.set_title('income and spend')
plt.show()
# 연령 대비 소비 물품
gr8 = sns.scatterplot(x=df1['Age'], y=df1['spent'], hue=df1['Clusters'])
gr8.set_title('what like product?')
plt.show()
# 가족 단위 별 소비 물품
gr9 = sns.scatterplot(x=df1['family_size'], y=df1['spent'], hue=df1['Clusters'])
gr9.set_title('경제')
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
# 포지셔닝 : 소비자들이 우선시 하는 제품이 되도록 유리한 위치를 갖는 전략
# 광고같이 알리는 전략도 있지만 지역 소비자들을 이해하고 물품을 선별하는 것도 전략
# 0은 평균수입대비 고소비로 많은 군집을 확보하고 있음
# 1은 고수입대비 고소비로 적절한 균형을 확보중
# 2는 저수입대비 저소비로 하루 사는 돈으로 버티는 모습
# 3은 저수입대비 고소비로 여비를 남기지 않으며 모든 군집이 멀어진 상태
# spent로 묶은 wines fruits meat fish sweets gold는 경제활동을 하는 입장에서 생각
# 차지하는 비율을 고려
plt.figure()
gr3 = sns.swarmplot(x=df1['Clusters'], y=df1['spent'], color='#CBEDDD', alpha=0.5)
|
cs |
소비자 파악을 고려하여 소비자들을 대상으로 제품을 위치하는 마케팅 전략과 포지셔닝 전략을 통해 특성을 살린 위치 선청을 떠올리며 구현했다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import seaborn as sns
pt = ['#682F2F','#B9C0C9', '#9F8A78','#F3AB60']
# q = sns.countplot(x=df1['Clusters'], palette=pt)
# q.set_title('group cluster pattern')
# plt.show()
# 클러스터 군집을 확인해보면 클러스터 0이 매우 군집이 잘 있는 상태로 평균 소비를 지향하는 점 확인
# family_soze, is_parent, Age, Children, education 을 고려한 판매대
# 결과 : 수직으로 가진 관계를 보여주고 서로 가까운 데이터를 확인
cluster_list = ['family_size', 'is_parent', 'Age', 'children', 'Education']
for i in cluster_list:
plt.figure()
sns.jointplot(x=df1[i], y=df1['spent'], hue=df1['Clusters'], kind='kde', palette=pt)
plt.show()
# 0번 클러스터가 1번 클러스터와 등고선이 겹쳐진 관계를 보이고 있으므로
# 가족단위면서 0번클러스터는 최소 2명의 구성원, 1번 클러스터는 부모로 있지 않고 0번보다 큰 변화를 가지지 않는다
# 소비또한 1번 클러스터가 고소득자로서 연령대가 있는 구성원이다
# 4개 클러스터 중 2하고 3는 없는 것으로 보아 가족 단위가 아니면서 경제활동에 참여하는 것으로 판단
# 더해서 자녀가 있는 데이터로서 Children data로 파악할수 있겠다
# 연령 별 소비는 40~60인 점을 파악
|
cs |
- 부족했던 점
//
'data engineer > 프로젝트 경험' 카테고리의 다른 글
230811 ~ 240214 playdata 데이터 엔지니어링 파이널 프로젝트까지 (0) | 2024.02.11 |
---|---|
230923 ~ 231009 까지 개인 프로젝트 첫 시작! (0) | 2023.10.23 |