Python(Colab) KMeans + 실루엣 기법 / 클러스터링

2023. 6. 18. 18:00파이썬/머신러닝 및 딥러닝

데이터 분석의 적용시켜보기

 

1.데이터 셋

 

mkt_df = pd.read_csv('/content/drive/MyDrive/KDT-1/머신러닝과 딥러닝/marketing.csv')
 
mkt_df
 

 

2. 데이터 셋 설명

 

 

목표: 고객 등급을 자체적으로 나눠, 그에 맞는 혜택 적용 등 마케팅 전략 세우기 

 

3.  데이터 전처리하기 1) 아이디 삭제

mkt_df.drop('ID',axis=1,inplace=True)

2) 생일 데이터에서 1900년도 이전 사람 지우기

mkt_df.sort_values('Year_Birth')
mkt_df = mkt_df[mkt_df['Year_Birth'] > 1900]

3) 소득에서 이상치인 66666 날리기

mkt_df.sort_values('Income',ascending=False)
mkt_df = mkt_df[mkt_df['Income'] != 666666]

4) 회원 가입일 타입을 바꾸기 (datetime)

mkt_df['Dt_Customer'] = pd.to_datetime(mkt_df['Dt_Customer'])

5) 육류제품,어류제품,단맛제품,금제품 구매액을 total_mnt라는 파생변수로 한번에 저장 

# MntWines  MntFruits   MntMeatProducts MntFishProducts MntSweetProducts    MntGoldProds  다 합치기
mkt_df['total_mnt'] = mkt_df['MntWines'] + mkt_df['MntFruits'] + mkt_df['MntMeatProducts'] + mkt_df['MntFishProducts'] + mkt_df['MntSweetProducts'] + mkt_df['MntGoldProds']
 

6) 어린이 수와 청소년 수를 합해서 Children 이라는 파생변수 만들기

#같은 방법
mkt_df['Children'] = mkt_df['Kidhome'] + mkt_df['Teenhome']
mkt_df['Children'] = mkt_df[['Kidhome','Teenhome']].sum(axis=1)

 

7) 결혼여부를 single과 partner 두가지로 정리하기 

mkt_df['Marital_Status'] = mkt_df['Marital_Status'].replace({'Married':'Partner','Together':'Partner','Single':'Single',
                                                             'Divorced':'Single','Widow':'Single','Alone':'Single',
                                                             'Absurd':'Single','YOLO':'Single'})
 
mkt_df['Marital_Status'].value_counts()

 

8) 결혼여부와 학력을 원 핫 인코딩 하기

mkt_df = pd.get_dummies(mkt_df,columns=['Education','Marital_Status'])

 

9) 🟡스케일링하기 

✔️ 스케일링(Scaling)

* 데이터를 특정한 스케일로 통일 하는 것
* 데이터를 모델링 전에 거치는 것이 좋다.
* 다차원의 값들을 비교 분석하기 쉽게 만들어준다
* 자료의 overflow,underflow를 방지한다
* 따라서 최적화 과정에서 안정성과 수렴 속도를 향상

✔️종류

1. StandardScaler : 평균과 표준편차를 사용

2. MinMaxScaler: 최대/최소값이 1과 0이 되도록 하는 것

3. RobustScaler: 중앙값과 IQR(4분위 수)사용 / 아웃라이어의 영향을 최소화

스케일링 적용하기

1.StandardScaler

from sklearn.preprocessing import StandardScaler, MinMaxScaler,RobustScaler
 
ss = StandardScaler()
ss.fit_transform(mkt_df)
 
ss_df = pd.DataFrame(ss.fit_transform(mkt_df),columns=mkt_df.columns)
ss_df

2.MinMaxScaler

from sklearn.preprocessing import StandardScaler, MinMaxScaler,RobustScaler
 
mm = MinMaxScaler()
 
mm_df =pd.DataFrame(mm.fit_transform(mkt_df),columns=mkt_df.columns)
mm_df

3.RobustScaler

from sklearn.preprocessing import StandardScaler, MinMaxScaler,RobustScaler
 
rs = RobustScaler()
 
rs_df =pd.DataFrame(rs.fit_transform(mkt_df),columns=mkt_df.columns)
rs_df

실루엣 스코어적용하기

 

from sklearn.metrics import silhouette_score
 
score = []

for i in range(2,11):
    km = KMeans(n_clusters=i,random_state=10)
    km.fit(mm_df)
    pred = km.predict(mm_df)
    score.append(silhouette_score(mm_df,pred))

score
 
# 이것은 스코어값이 높으면 높을 수록 좋다.
sns.lineplot(x=range(2,11),y=score)
 
728x90