2021. 6. 12. 21:06ㆍ빅데이터 잡아라/ADP
안녕하세요~
데이터에듀에서 나온 ADP실기 데이터 분석 전문가의 모의고사가 R로만 짜여저 있어서
ADP실기를 파이썬(python)언어로 보시는 분들을 위해
제가 파이썬 언어로 바꾸면서 코딩을 한 내용을 공유드리고자 합니다.
혹시 제가 잘못알고 있거나 궁금한 점이 있으시면 언제든지 댓글 달아주세요 :)
모의고사 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세 연령이 가장 구매가 크다.
이런식으로 집단별 혹은 성별, 나이대별, 구매비용 등으로 해석하면 된다.
'빅데이터 잡아라 > ADP' 카테고리의 다른 글
[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 4회 2번 파이썬 코드 (3) | 2021.06.17 |
---|---|
[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 4회 1번 파이썬 코드 (1) | 2021.06.15 |
[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 1회 1번 파이썬 코드 (9) | 2021.06.03 |
[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 2회 1번 파이썬 코드 (0) | 2021.02.20 |
[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 1회 2번 파이썬 코드 (8) | 2021.02.17 |