[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 3회 2번 파이썬 코드

2021. 6. 12. 21:06빅데이터 잡아라/ADP

반응형

안녕하세요~

데이터에듀에서 나온 ADP실기 데이터 분석 전문가의 모의고사가 R로만 짜여저 있어서

ADP실기를 파이썬(python)언어로 보시는 분들을 위해 

제가 파이썬 언어로 바꾸면서 코딩을 한 내용을 공유드리고자 합니다.

혹시 제가 잘못알고 있거나 궁금한 점이 있으시면 언제든지 댓글 달아주세요 :) 

BlackFriday.zip
4.64MB

모의고사 3회 2번 통계분석(사용데이터: BlackFriday)

BlackFriday 데이터는 미국의 BlackFriday 기간에 제품을 구매한 고객에 관한 정보이며, 변수의 설명은 아래와 같다.

1) "BlackFriday"데이터에서 Product_Category_2, Product_Category_3의 NA값을 0값으로 대체하고 Product_Category_1,2,3 변수의 값을 다 더한 Product_all 변수를 생성하여 추가하라. 그리고 User_ID를 charecter변수로, Occupation, Marital_Status, Product_Category_1, Product_Category_2, Product_Category_3 변수를 범주형 변수로 변환하시오. 마지막으로 범주형 변수인 Gender, Age, City_Category, Stay_In_Current_City_Years를 더미변수로 변환해서 BlackFriday데이터에 추가하시오.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
path = './모의고사 3회/BlackFriday.csv'
data = pd.read_csv(path)
data.head()
data.isnull().sum()

Product_Category_2, Product_Category_3의 NA값를 확인했다. 

data['Product_Category_2'] = data['Product_Category_2'].fillna(0)
data['Product_Category_3'] = data['Product_Category_3'].fillna(0)
data['Product_all'] = data['Product_Category_1'] + data['Product_Category_2'] + data['Product_Category_3']

fillna()함수를 사용해서 0으로 대체한다. Product_Category_1,2,3 변수의 값을 다 더한 Product_all 변수를 생성하여 추가했다. 

 

data['User_ID']=data['User_ID'].astype('string')
data['Occupation'] = data['Occupation'].astype('category')
data['Marital_Status'] = data['Marital_Status'].astype('category')
data['Product_Category_1'] = data['Product_Category_1'].astype('category')
data['Product_Category_2'] = data['Product_Category_2'].astype('category')
data['Product_Category_3']= data['Product_Category_3'].astype('category')
data.info()

User_ID를 astype('string')함수를 통해 charecter변수로, Occupation, Marital_Status, Product_Category_1, Product_Category_2, Product_Category_3 변수를 astype('category')함수를 통해 범주형변수로 변환했다. 

data['Gender_'] =  data['Gender'].copy()
data['Gender_']=pd.get_dummies(data['Gender_'])
data['Age_'] =  data['Age'].copy()
data['Age_'] = pd.get_dummies(data['Age_'])
data['City_Category_'] =  data['City_Category'].copy()
data['City_Category_'] = pd.get_dummies(data['City_Category_'])
data['Stay_In_Current_City_Years_'] =  data['Stay_In_Current_City_Years'].copy()
data['Stay_In_Current_City_Years_'] = pd.get_dummies(data['Stay_In_Current_City_Years_'])

범주형 변수인 Gender, Age, City_Category, Stay_In_Current_City_Years를 더미변수로 변환해서 BlackFriday데이터에 추가했다. 

 

2) 1)에서 전처리가 완료된 데이터에서 User_ID, Product_ID, Gender, Age, City_Category, Stay_In_Current_City_Years, Product_all 변수를 제외한 나머지 변수들을 활용하여 kmeans군집분석을 수행하고 해석하시오.(범주형 변수는 수치형 변수로 변환하여 분석에 활용하시오.) 그리고 최적의 군집 개수를 찾아서 만일 군집 개수가 이전 결과와 다르면 분석을 다시 수행하여 해석하시오. 

X = data[['Occupation','Marital_Status','Product_Category_1','Product_Category_2','Product_Category_3','Purchase']]
X['Occupation'] = X['Occupation'].astype('float')
X['Marital_Status'] = X['Marital_Status'].astype('float')
X['Product_Category_1'] = X['Product_Category_1'].astype('float')
X['Product_Category_2'] = X['Product_Category_2'].astype('float')
X['Product_Category_3'] = X['Product_Category_3'].astype('float')

 

kmeans를 사용하기 위해서 변수형을 float로 변형해준다. 최적이 k개수를 찾기위해 아래와 같이 2가지 방법이 있다. 

첫번째 방식은 euclidean거리측정 방식을 통해 elbow 그래프를 그렸고,   

from scipy.spatial.distance import cdist
distortions = []
K = range(1,10)
for k in K:
    kmeanModel = KMeans(n_clusters=k).fit(X)
    kmeanModel.fit(X)
    distortions.append(sum(np.min(cdist(X, kmeanModel.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])
# Plot the elbow
plt.plot(K, distortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Distortion')
plt.title('The Elbow Method showing the optimal k')
plt.show()

 

두번째 방식은 오차제곱합이 최소가 되도록 Elbow그래프를 그렸다. 

def elbow(x):
    sse = [] #오차제곱합이 최소가 되도록 클러스터의 중심을 결정
    for i in range(1, 11):
        km = KMeans(n_clusters = i, init = "k-means++", random_state = 0)
        km.fit(x)
        sse.append(km.inertia_)
    plt.plot(range(1, 11), sse, marker = "o")
    plt.xlabel("클러스터 수")
    plt.ylabel("sse")
    plt.show()
    
elbow(X)

Elbow그래프를 해석하는 것은 주관적인 해석이 많다. 나는 전체적으로 봤을때 '팔'이라고 생각하고 꿈치인 점을 찾는다. 

즉, 2가지의 Elbow그래프를 통해 최적의 k는 3으로 결정한다. 

num_clusters = 3
km = KMeans(n_clusters=num_clusters)
km.fit(X)
pred=km.fit_predict(X)
data['clust']=pred

 

3) 최적의 군집개수를 찾아 재수행한 군집분석의 결과로 분류된 군집번호를 원본 데이터인 BlackFriday데이터의 각 행에 맞게 labeling하여 clust라는 변수로 저장하고, cluster별 특성을 파악하여 설명하시오. 

data.groupby(['clust','Gender']).size().unstack()
#Female 보다 Men이 약 3~4배 정도 차이가 났다. 

data.groupby(['clust','Age']).size().unstack()
#연령대를 확인해본 결과 26~35대가 가장 많았다. 

data.groupby(['clust'])['Purchase'].mean()
#2번째 집단이 가장 구매가 크다. 

data['Purchase'].groupby(data['Age']).mean()
#51~55세 연령이 가장 구매가 크다. 

이런식으로 집단별 혹은 성별, 나이대별, 구매비용 등으로 해석하면 된다.