๋ณธ ํฌ์คํ ์ ์ด์ปค๋จธ์ค ๋ฐ์ดํฐ ๋ถ์ 1, 2์ ์ด์ด์ง๋๋ค.
์ ์ฒ๋ฆฌ๊น์ง ๋๋ธ ๋ฐ์ดํฐ๋ก RFM ๋ถ์์ ํด๋ณด์.
RFM ์ด๋?
- "Recency, Frequency, Monetary"์ ์ฝ์ด๋ก, ๊ณ ๊ฐ ์ธ๊ทธ๋จผํ ์ด์ ๋ฐ ๊ณ ๊ฐ ๋ถ์์ ์ฌ์ฉ๋๋ ์ค์ํ ๊ฐ๋ ์ด๋ค.
- ์ด ์ธ ๊ฐ์ง ์งํ๋ ๊ณ ๊ฐ์ ๊ตฌ๋งค ํ๋ ๋ฐ ๊ฐ์น๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
RFM ๊ฐ ๊ตฌํ๊ธฐ
- Recency๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๋ง์ง๋ง ๊ตฌ๋งค์ผ๋ก๋ถํฐ ์ง๊ธ๊น์ง ์ง๋ ๋ ์ง๋ฅผ ์์์ผ ํ๋ค.
- ์ก์ฅ๋ ์ง์ ์ต๋๊ฐ์ผ๋ก ๋ง์ง๋ง ๊ตฌ๋งค์ผ์ ๊ตฌํ ์ ์๋ค.
print(df['InvoiceDate'].max())
2011-12-09 12:50:00
- datetime์ ์ด์ฉํ์ฌ ๊ธฐ์ค ๋ ์ง๋ฅผ ์ ์ ํ๋ค.
- ๊ณ ๊ฐ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ๋ฅผ ์งํํ๋ค.
- ์ด๋, ์ก์ฅ๋ ์ง๋ ๊ธฐ์ค ๋ ์ง์์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ์ผ ์๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํ๋๋ก ํ๋ค.
- ์ก์ฅ๋ฒํธ๋ ๊ณ ์ณ๊ฐ์ ๋ฐํํ์ฌ, ์ด ๋ช ํ ๊ตฌ๋งคํ๋์ง(frequency)๋ฅผ ์ ์ ์๋๋ก ํ๋ค.
- ๋ง์ง๋ง์ผ๋ก Monetary๋ฅผ ๊ตฌํ๊ธฐ ์ํด TotalPrice๋ ๋ชจ๋ ํฉํด์ค๋ค.
import datetime as dt
# today_date ๋ณ์์๋ 2011๋
12์ 11์ผ์ ๋ํ๋ด๋ datetime ๊ฐ์ฒด๊ฐ ์ ์ฅ
today_date = dt.datetime(2011, 12, 11)
rfm = df.groupby('CustomerID').agg({'InvoiceDate': lambda x : (today_date - x.max()).days, #์๊ฐ ๊ฐ๊ฒฉ์ ์ผ(day)๋ก ํํ:๋ง์ง๋ง ๊ตฌ๋งค์ผ๋ก๋ถํฐ ์ง๋ ์ผ์
'InvoiceNo' : lambda x : x.nunique(), # ์ด ๋ช ๋ฒ ๊ตฌ๋งคํ๋์ง
'TotalPrice' : lambda x : x.sum() # ์ด ๋์ ๊ตฌ๋งค ๊ธ์ก
})
rfm
- ์นผ๋ผ๋ช ์ ๋ณ๊ฒฝํ๊ณ
- ์ด ์ฃผ๋ฌธ ๊ธ์ก์ด 0 ๋ณด๋ค ํฐ ๊ฐ๋ง ํํฐ๋งํ๊ณ , ์ธ๋ฑ์ค๋ฅผ ์ ๋ฆฌํด ์ค๋ค.
rfm.columns = ['recency', 'frequency', 'monetary']
rfm = rfm[rfm['monetary'] > 0]
rfm = rfm.reset_index()
rfm.head()
RFM Scores ๊ตฌํ๊ธฐ
- ์ด์ ์์ ๊ตฌํ ๊ฐ๋ค๋ก RFM ์ ์๋ฅผ ๊ตฌํด๋ณด์. ํจ์๋ฅผ ์ ์ํ ๊ฒ์ด๋ค.
- pd.qcut()์ ์ด์ฉํด์, ๊ตฌ๊ฐ ๋ณ๋ก ๋ฐ์ดํฐ ๊ฐ์๊ฐ ๊ท ์ผํ๊ฒ ํฌํจ๋๋๋ก ํ๋ค.
- recency_score : 5๊ฐ ๊ตฌ๊ฐ์ผ๋ก ๋๋๋, ๊ฐ์ด ํด์๋ก ์ข์ง ์์ผ๋ฏ๋ก(์ต์ข ๊ตฌ๋งค์ผ๋ก๋ถํฐ ๋ง์ ์๊ฐ์ด ํ๋ฆ) ์ญ์์ผ๋ก Label์ ์ง์ ํ๋ค.
- frequency_score : frequency์ด์ ์์๋ฅผ. rank()๋ก ๊ณ์ฐํ๋, method์ ๋งค๊ฐ๋ณ์๋ฅผ first๋ก ์ค์ ํ์ฌ ๋์ผํ ๊ฐ์ด ์๋ค๋ฉด ๋จผ์ ๋ํ๋ ๊ฐ์ ๋ ๋์ ์์๋ฅผ ํ ๋นํ๋ค. (๊ณ ๊ฐ์ ๊ตฌ๋งค ๋น๋๊ฐ ๊ฐ๋ค๋ฉด, ๋จผ์ ๋ํ๋ ๊ณ ๊ฐ์ด ๋ ๋์ ์์)
- ์ด๋ ์์ฃผ ๋ฐฉ๋ฌธํ ๊ณ ๊ฐ์ด ์ฐ์ ๋๋ฏ๋ก label์ 1๋ถํฐ ์ง์
- monetary_score : 5 ๊ตฌ๊ฐ์ผ๋ก ๋๋๋, ๊ฐ์ด ํด์๋ก(๊ตฌ๋งค ๊ธ์ก์ด ํผ) ์ฐ์ ๋๋ฏ๋ก label์ 1๋ถํฐ ์ง์
- RFM_SCORE : ์์์ ๊ตฌํ ์ปฌ๋ผ ๊ฐ์ ๋ํด์ค๋ค.(R๊ณผ F๋ง)
def get_rfm_scores(df):
df_ = df.copy()
df_['recency_score'] = pd.qcut(df_['recency'], 5, labels = [5, 4, 3, 2, 1]) #๊ฐ์ฅ ๋ฎ์ ๊ฐ์ด 1
df_['frequency_score'] = pd.qcut(df_['frequency'].rank(method = 'first'), 5, labels = [1, 2, 3, 4, 5])
df_['monetary_score'] = pd.qcut(df_['monetary'], 5, labels = [1, 2, 3, 4, 5])
df_['RFM_SCORE'] = df_['recency_score'].astype(str) + df_["frequency_score"].astype(str)
return df_
๐ ํจ์๋ฅผ ์ ์ฉ
rfm = get_rfm_scores(rfm)
rfm
728x90