Machine Learning/Case Study ๐ฉ๐ป๐ป
[Kaggle] ์ด์ปค๋จธ์ค ๋ฐ์ดํฐ ๋ถ์ 4 (CRM Analytics ๐๏ธ๐)
ISLA!
2023. 10. 8. 14:04
์์ ํฌ์คํ [Kaggle] ์ด์ปค๋จธ์ค ๋ฐ์ดํฐ ๋ถ์ 3 (CRM Analytics ๐๏ธ๐)๊ณผ ์ด์ด์ง๋๋ค.
RFM score๋ฅผ ๋ฐํ์ผ๋ก ๊ณ ๊ฐ ์ธ๋ถํ๋ฅผ ์งํํ๋ค.
Segmentation
์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ RFM score๋ฅผ ๋ฐํ์ผ๋ก ๊ณ ๊ฐ์ ๊ทธ๋ฃน์ ๋๋๋ค.
r : ์ ๋์ฌ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ํ๋ด๋ฉฐ, ์ด ํจํด์ ๋ฌธ์์ด์ Raw ๋ฌธ์์ด๋ก ์ฒ๋ฆฌ๋จ์ ์๋ฏธํ๋ค.(\๊ฐ ์ด์ค์ผ์ดํ ๋ฌธ์๋ก ์ฒ๋ฆฌ๋์ง ์์)
[1-2] : ๋ฌธ์ ํด๋์ค๋ก, ์ด ๋ถ๋ถ์์ ๋ฌธ์์ด์์ 1 ๋๋ 2์ ๋งค์นญ๋๋ ์์น๋ฅผ ์ฐพ๋๋ค.
[3-4] : ์์ ๋์ผํ๊ฒ, ํด๋น ๋ถ๋ถ์์ ๋ฌธ์์ด์ด 3 ๋๋ 4์ ๋งค์นญ๋๋ ์์น๋ฅผ ์ฐพ๋๋ค.
์ฆ, r'[1-2][3-4]' ๋ ๋ฌธ์์ด์์ 1 ๋๋ 2์ ๋งค์นญ๋๋ ๋ถ๋ถ์ ์ฐพ๊ณ , ๊ทธ๋ค์ 3 ๋๋ 4์ ๋งค์นญ๋๋ ๋ถ๋ถ์ ์ฐพ๋ ๊ฒ์ด๋ค.
seg_map = {r'[1-2][1-2]' : 'hibernating',
r'[1-2][3-4]' : 'at_Rish',
r'[1-2]5':'cant_loose',
r'3[1-2]': 'about_to_sleep',
r'33':'need_attention',
r'[3-4][4-5]': 'loyal_customers',
r'41' : 'promising',
r'51':'new_customers',
r'[4-5][2-3]' : 'potential_loyalists',
r'5[4-5]':'champions'}
- ์ ์ ๊ทํํ์์ ๋ฐ๋ผ segment๋ฅผ ๊ตฌ๋ถํ๋ค.
- ์ด๋, RFM_SCORE์ replace() ํจ์๋ก ์ seg_map์ ๋งคํํ๋ค.
- regex = True ์ต์ ์ ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๋์ฒด๋ฅผ ์ํํ๋ผ๋ ๊ฒ์ด๋ค.
rfm['segment'] = rfm['RFM_SCORE'].replace(seg_map, regex = True)
rfm.head()
Segmentation Map
- squarify ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ฐ์ดํฐ๋ฅผ tree map ํํ๋ก ์๊ฐํํ๋ค.
- ๊ฐ ์ฌ๊ฐํ ๋ธ๋ก์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
- squarify.plot(): ์ด ํจ์๋ Squarify ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ๋งต์ ์์ฑํ๊ณ ํ๋กฏ ํ๋ค.
- sizes: `segments`๋ผ๋ ๋ณ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ ํฌ๊ธฐ ์ ๋ณด๋ฅผ ํตํด ๊ฐ๊ฐ์ ์ฌ๊ฐํ ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ ์ง์
- label: ๊ฐ ์ฌ๊ฐํ ๋ธ๋ก์ ํ์ํ ๋ ์ด๋ธ ์ ๋ณด๋ฅผ ์ค์ . `seg_map` ๋์ ๋๋ฆฌ์ value๋ก ๋ ์ด๋ธ ์ ๋ณด๋ฅผ ์ง์
- color : ๊ฐ ์ฌ๊ฐํ ๋ธ๋ก์ ์์์ ์ง์ . ์ฌ๋ฌ ๊ฐ์ง ์์์ ๋ฆฌ์คํธ๋ก ๋์ดํ์ฌ ์ฌ์ฉํ๋ค.
- pad: `True` ๋๋ `False` ๊ฐ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, `True`๋ก ์ค์ ํ๋ฉด ๊ฐ ์ฌ๊ฐํ ๋ธ๋ก ๊ฐ์ ๊ฐ๊ฒฉ์ด ์ถ๊ฐ๋์ด ๋ ๋ณด๊ธฐ ์ข์ ํธ๋ฆฌ๋งต์ ์์ฑํ๋ค.
- bar_kwargs: ์ฌ๊ฐํ ๋ธ๋ก์ ํน์ฑ์ ์ค์ ํ๋ ๋์ ๋๋ฆฌ๋ฅผ ์ง์ . ์ฌ๊ธฐ์์ `alpha`๋ฅผ 1๋ก ์ค์ ํ์ฌ ํฌ๋ช ๋๋ฅผ ์กฐ์ ํ๋ค.
- text_kwargs: ํ ์คํธ์ ํน์ฑ์ ์ค์ ํ๋ ๋์ ๋๋ฆฌ๋ฅผ ์ง์ . ์ฌ๊ธฐ์์ `fontsize`๋ฅผ 15๋ก ์ค์ ํ์ฌ ํ ์คํธ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.
import squarify
segments = rfm['segment'].value_counts().sort_values(ascending = False)
segments
# figure ๊ฐ์ ธ์ค๊ธฐ(์บ๋ฒ์ค)
fig = plt.gcf()
fig.set_size_inches(16, 10)
# fig์ ์๋ธํ๋กฏ ์ถ๊ฐ(fig, add_suplot(2, 2, 1)์ฒ๋ผ ์ฐ์)
ax = fig.add_subplot()
# ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌ๋งต(tree map) ํํ๋ก ์๊ฐํํ๋ ๋ฐ ์ฌ์ฉ
squarify.plot(sizes = segments,
label = [label for label in seg_map.values()],
color = ["#AFB6B5", "#F0819A","#926717","#F0F081","#81D5F0",
"#C78BE5","#748E80","#FAAF3A","#7B8FE4","#86E8C0"],
pad = False,
bar_kwargs = {'alpha': 1},
text_kwargs = {'fontsize':15}
)
plt.title('Customer Segmentation Map', fontsize = 20)
plt.xlabel('Frequency', fontsize = 18)
plt.ylabel('Recency', fontsize = 18)
plt.show()
Segmentation Model Evaluation
# ๋ค์์ ํ๊ฐ์งํ๋ฅผ ์ฌ์ฉํ๋ค.
from sklearn.metrics import (silhouette_score,
calinski_harabasz_score,
davies_bouldin_score)
- ์์์ recency_score์ frequency_score๋ฅผ ๋์ถํ๊ณ ์ด ์กฐํฉ์ ๋ค์ํ๊ฒ ์ธ๋ถํํ์ฌ segment๋ฅผ ๋ง๋ค์๋ค.
- seg_map์ ํตํด ์งํํ ์ธ๋ถํ๊ฐ ์ ๋์๋์ง ํ์ธํ๊ธฐ ์ํด 'ํด๋ฌ์คํฐ๋ง ํ๊ฐ ์งํ'๋ฅผ ์ฌ์ฉํ๋ค.
- silhouette_score(X, labels) ํจ์๋ ๋ฐ์ดํฐ X์ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ์ ํ ๋น๋ ํด๋ฌ์คํฐ ๋ ์ด๋ธ labels์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ Silhouette Score๋ฅผ ๊ณ์ฐํ๊ณ , round(..., 3)์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์์ ์ ์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผํ์ฌ ์ถ๋ ฅ
- Silhouette Score : -1๋ถํฐ 1๊น์ง์ ๊ฐ์ ๊ฐ์ง๋ฉฐ, 1์ ๊ฐ๊น์ธ์๋ก ํด๋ฌ์คํฐ๊ฐ ์ ํ์ฑ๋์๋ค๊ณ ํ๋จํ๋ค.
- Calinski Harabasz Score : ํด๋ฌ์คํฐ ๊ฐ ๋ถ์ฐ๊ณผ ํด๋ฌ์คํฐ ๋ด ๋ถ์ฐ์ ๋น์จ์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋ง์ ํ์ง์ ์ธก์ ํ๋ ์งํ
- Davies Bouldin Score : ํด๋ฌ์คํฐ ๊ฐ ๊ฑฐ๋ฆฌ์ ํด๋ฌ์คํฐ ๋ด ๋ถ์ฐ์ ๋น์จ์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋ง ํ์ง์ ํ๊ฐํ๋ ์งํ
print(' RFM Model Evaluation '.center(70, '='))
X = rfm[['recency_score', 'frequency_score']]
labels = rfm['segment']
print(f'๊ด์ธก์น ์ : {X.shape[0]}')
print(f'๊ณ ๊ฐ ์ธ๋ถํ ์ : {labels.nunique()}')
print(f'์ค๋ฃจ์ฃ Score : {round(silhouette_score(X, labels), 3)}')
print(f'Calinski Harabasz Score: {round(calinski_harabasz_score(X, labels), 3)}')
print(f'Davies Bouldin Score: {round(davies_bouldin_score(X, labels), 3)} \n{70*"="}')
๐ ์ด๋ฅผ ํตํด ๊ณ ๊ฐ ์ธ๋ถํ(ํด๋ฌ์คํฐ๋ง)๊ฐ ์ ๋ ํธ์์ ํ์ธํ ์ ์๋ค.
์ด์ ๊ณ ๊ฐ ์ธ๋ถํ ๊ฒฐ๊ณผ ์์ฒด๋ฅผ ์ข ๋ ์์ธํ ๋ค์ฌ๋ค๋ณด์.
(๋ค์ ํฌ์คํ ์ ์ด์ด์ง๋๋ค.)
728x90