๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ์ ํŠธ

[๋ถ„์„ํ”„๋กœ์ ํŠธ] ์žฅ๋‚œ๊ฐ ์ž๋™์ฐจ ํšŒ์‚ฌ์˜ RFM ๊ณ ๊ฐ์„ธ๊ทธ๋จผํŠธ

by kime2 2024. 3. 28.
๐ŸŽˆ RFM

R(Recency) ๊ตฌ๋งค์˜ ์ตœ๊ทผ์„ฑ: ๊ณ ๊ฐ์ด ์–ผ๋งˆ๋‚˜ ์ตœ๊ทผ์— ๊ตฌ๋งคํ–ˆ๋Š”๊ฐ€? 
-> '์ตœ๊ทผ์„ฑ๊ด€์ ์—์„œ' ์ตœ๊ทผ์— ํŠน์ • ํ–‰๋™(๊ตฌ๋งค ๋“ฑ)์„ ์ทจํ•œ ๊ณ ๊ฐ์ด ๊ณผ๊ฑฐ์— ์ทจํ•œ ๊ณ ๊ฐ๋ณด๋‹ค ๋” ๊ฐ€์น˜์žˆ์Œ

F(Frequency) ๊ตฌ๋งค ๋นˆ๋„: ๊ณ ๊ฐ์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐฉ๋ฌธํ–ˆ๋Š”๊ฐ€?

-> 'ํ–‰๋™๋นˆ๋„ ๊ด€์ ์—์„œ' ์ •ํ•ด์ง„ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ณ ๊ฐ์ด ํŠน์ • ํ–‰๋™์„ ์ž์ฃผ ํ• ์ˆ˜๋ก ๊ฐ€์ง€์žˆ์Œ

 M(Monetary) ๊ตฌ๋งค ๊ทœ๋ชจ: ๊ณ ๊ฐ์ด ์–ผ๋งˆ๋‚˜ ๋ˆ์„ ์ผ๋Š”๊ฐ€?

-> ๊ตฌ๋งค์•ก ๊ด€์ ์—์„œ ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ๊ตฌ๋งค๊ธˆ์•ก์„ ๋” ๋งŽ์ด ์ง€์ถœํ•œ ๊ณ ๊ฐ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์Œ

 

๋ฐฉ๋ฒ•1.  RFM ๊ณ„์‚ฐ+ K-Means ํด๋Ÿฌ์Šคํ„ฐ๋ง

RFM ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

last_timestamp = df['ORDERDATE'].max() + dt.timedelta(days=1)

rfm_origin= df.groupby('CUSTOMERNAME').agg({'ORDERDATE': lambda x :(last_timestamp-x.max()).days,
                                    'ORDERNUMBER' : 'count', 'SALES' : 'sum'})
rfm_origin.columns = ['Recency','Frequency','Monetary']

rfm = rfm_origin.copy()

recency๋Š” 300๋ฅผ ๊ธฐ์ค€์œผ๋กœ, frequency๋Š” 100์„ ๊ธฐ์ค€์œผ๋กœ, monetary๋Š” 30000์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง

sns.heatmap(rfm.iloc[:3].corr(),annot = True)

frequency-monetary ์‚ฌ์ด์— ์•„์ฃผ ๋†’์€ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋ณด์ธ๋‹ค

-> ์ž์ฃผ ์‚ฐ ๊ณ ๊ฐ์˜ ์ˆ˜์ต์ด ๋†’์Œ

# ์ •๊ทœํ™”ํ•˜๊ธฐ
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
rfm_nor = pd.DataFrame(scaler .fit_transform(rfm))
rfm_nor.columns = ['n_R','n_F','n_m']


from yellowbrick.cluster import KElbowVisualizer
from sklearn.cluster import KMeans
SSE = []
for K in range(0,10):
    Kmeans = KMeans(n_clusters = K+1, random_state = 42).fit(rfm_nor)
    SSE.append(Kmeans.inertia_)
    
sns.pointplot(x=list(range(1,11)), y=SSE)
plt.show()

4๋ถ€ํ„ฐ ๊ทธ๋ž˜ํ”„๊ฐ€ ์™„๋งŒํ•ด์ง€๋ฏ€๋กœ 4๊ฐœ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ•˜๋Š”๊ฒƒ์„ ์ถ”์ฒœ

from yellowbrick.cluster import SilhouetteVisualizer
Kmeans_4 = KMeans(n_clusters = 4, random_state = 42, init='random')
Visual_4 = SilhouetteVisualizer(Kmeans_4, colors = 'yellowbrick')
# ์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ์— ํ•™์Šต
Visual_4.fit(rfm_nor)
Visual_4.show()
from sklearn.metrics import silhouette_score
#๊ฐ ํด๋Ÿฌ์ŠคํŠธ๋ณ„ ์‹ค๋ฃจ์—ฃ์ ์ˆ˜ -> ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ชจ์—ฌ ์žˆ๋Š”์ง€(์‘์ง‘๋„), ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ์™€๋Š” ์–ผ๋งˆ๋‚˜ ์ž˜ ๊ตฌ๋ถ„๋˜๋Š”์ง€(๋ถ„๋ฆฌ๋„)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ
# ๊ทธ๋ž˜ํ”„ ์˜๋ฏธ : ์‹ค๋ฃจ์—ฃ์ ์ˆ˜(X์ถ•)๊ฐ€ 1์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๊ฐ’์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๊ฐ์†Œํ•˜์ง€ ์•Š์„ ์ˆ˜๋ก ์ข‹๋‹ค

rfm['cluster_4'] = Kmeans_4.fit_predict(rfm_nor)
rfm = rfm.reset_index()
print(silhouette_score(rfm_nor, rfm['cluster_4']))

์‹ค๋ฃจ์—ฃ์ ์ˆ˜ 0.5952941816428965

 

4๊ฐœ๋กœ ๋ถ„๋ฅ˜๋œ ๊ณ ๊ฐ๋ณ„ RFM๊ฐ’ ๊ตฌํ•˜๊ธฐ

rfm.groupby('cluster_4').agg({'Recency':['mean','min','max'],'Frequency':['mean','min','max'],'Monetary':['mean','min','max','count']})

 

๊ณ ๊ฐ1,2๋ฒˆ์—์„œ Recency๊ฐ’์ด ๊ฒน์น˜๋Š”๋ฐ, Monetary์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋œ๋‹ค

๊ณ ๊ฐ0๋ฒˆ์€ ๊ณ ๊ฐ3๋ฒˆ์— Frequency๊ฐ€ ๊ฒน์น˜๋Š” ๋Œ€์‹  Recency์—์„œ ๊ตฌ๋ถ„๋œ๋‹ค.

1๋ฒˆ์˜ ๊ณ ๊ฐ์ด R,F,M์—์„œ ๋ชจ๋‘ ๋†’์€ ๊ฐ€์น˜๋ฅผ ๋ณด์ด์ง€๋งŒ 2๊ฐœ์‚ฌ๋ฐ–์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค 

-> ๊ณ ๊ฐ๋“ฑ๊ธ‰๋ณ„ ๋ถ„ํฌ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด ๋ด์•ผ ํ• ๋“ฏ

 

๐ŸŽˆPCA(์ฃผ์„ฑ๋ถ„๋ถ„์„) - wikipedia,https://speedspeed.tistory.com/71

์ฃผ์„ฑ๋ถ„๋ถ„์„์ด๋ž€ ๋ฐ์ดํ„ฐ์˜ ์ฐจ์›์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋กœ,
๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ(์—ฌ๋Ÿฌ์ปฌ๋Ÿผ)๋ฅผ ์ €์ฐจ์› ์ œ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์›๋ž˜ ๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ
(์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™”, ๋…ธ์ด์ฆˆ์ œ๊ฑฐ, ๋ฐ์ดํ„ฐ ์••์ถ• ๋“ฑ์— ์‚ฌ์šฉ)

 

pcaํ•™์Šต

#์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca.fit(rfm_nor.iloc[:,:-1])
df_pca = pca.transform(rfm_nor.iloc[:,:-1])
df_pca = pd.DataFrame(df_pca, columns=['com0','com1'])
df_pca['CUSTOMERNAME'] = rfm['CUSTOMERNAME']
df_pca['cluster_4']= rfm['cluster_4']
sns.scatterplot(df_pca, x='com0', y='com1', hue='cluster_4')
print(pca.explained_variance_ratio_)

์ฃผ์„ฑ๋ถ„๋น„์œจ: [0.84100217 0.15899783]

1๋ฒˆ์งธ ์ฃผ์„ฑ๋ถ„์ด ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 84%๋ฅผ ์„ฑ๋ช…ํ•˜๊ณ , ๋‘๋ฒˆ์งธ ์ฃผ์„ฑ๋ถ„์ด 15%๋ฅผ ์„ค๋ช…ํ•œ๋‹ค

 

๊ณ ๊ฐ1์ด com1์—์„œ ๋งค์šฐ ๋†’์€ ๊ฑธ ๋ณด์•„ com1์€ ์ฃผ๋กœ monetary๋ฅผ ๋ฐ˜์˜ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค

๋˜ํ•œ ๊ณ ๊ฐ1์ด com1์—์„œ ๋‚ฎ์€๊ฑธ ๋ณด์•„ ๋‚ฎ์„์ˆ˜๋ก Recency์™€ ๊ด€๋ จ์ด ์žˆ๋Š”๊ฒƒ ๊ฐ™์œผ๋ฉฐ

๊ณ ๊ฐ0๊ณผ 3์ด ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ ์ฒ˜๋Ÿผ ๋ณด์—ฌ ์žˆ๋Š”๋ฐ ์ด๋Š” Recency์™€ Frequency๊ฐ€ ๋งŽ์ด ๊ฒน์ณ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค

 

๊ฒฐ๋ก 

๋ชจ๋ธ๋งํ‹ ํ†ตํ•ด 4๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๊ตฌ๋ถ„๋œ๊ฒƒ์œผ๋กœ ๋ณด์ด๋‚˜ ์ง๊ด€์ ์œผ๋กœ ๊ตฌ๋ถ„์˜ ์›์ธ์„ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค

๋˜ํ•œ ๊ฐ ๊ทธ๋ฃน๋ณ„ ๊ณ ๊ฐ์ˆ˜๊ฐ€ ๊ทน๋‹จ์˜ ๊ฐ’์„ ๋ณด์ด๋Š”๋ฐ, ํผ๋„์ฒ˜๋Ÿผ VIP์†Œ์ˆ˜์˜ ๊ณ ๊ฐ์„ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€ ๊ณจ๊ณ ๋ฃจ ๋ถ„ํฌ๋˜์–ด ์žˆ๋Š” ๊ณ ๊ฐ๊ตฐ์„ ๋ณด๋ฉด ์ข‹์„ ์ง€๊ณ  ๊ณ ๋ฏผ์ด ํ•„์š”ํ•ด ๋ณด์ž„

๋ฐฉ๋ฒ•2. RFM ์ ์ˆ˜  + K-Means ํด๋Ÿฌ์Šคํ„ฐ๋ง -> ๊ณ ๊ฐ๋ณ„ 25% ๋ถ„ํฌ

์ ์ˆ˜ ๋ถ€์—ฌ ๋ฐฉ๋ฒ• : ์ƒ์œ„%๋กœ ๊ตฌ๊ฐ„ ๋‚˜๋ˆ„๊ธฐ

๊ณ ๊ฐ์˜ R,F,M์˜ ๋“ฑ๊ธ‰ ๋‚˜๋ˆ„๊ธฐ

๋ฐฉ๋ฒ•1. Qcut()์‚ฌ์šฉํ•˜๊ธฐ -> ๋™์ผํ•œ ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆ„๊ธฐ 

- qcut(): ๋Œ€์ƒ๋ฐฐ์—ด์˜ ์ตœ๋Œ€๊ฐ’~์ตœ์†Œ๊ฐ’์„ ์ง€์ •ํ•œ ๊ฐœ์ˆ˜์˜ ๋™๋“ฑํ•˜๊ฒŒ ๋ถ€์—ฌ

- ์˜ˆ: ํ‚ค๋Œ€ = pd.qcut(df['ํ‚ค'], q=3(๋‚˜๋ˆ„๊ณ  ์‹ถ์€ ๊ตฌ๊ฐ„์˜ ๊ฐœ์ˆ˜), 'labels=['์ž‘์€ํ‚ค','์ค‘๊ฐ„ํ‚ค','ํฐํ‚ค'])

r_labels = list(range(4, 0, -1)) #5~1์  -> ์ˆซ์ž๊ฐ€ ์ ์„์ˆ˜๋ก ๋†’์€๋“ฑ๊ธ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ญ์ˆœ
f_labels = list(range(1, 5)) #1~5์ 
m_labels = list(range(1, 5)) #1~5์ 
cut_size = 4

r_cut = pd.qcut(rfm_origin['Recency'], cut_size, labels = r_labels)
f_cut = pd.qcut(rfm_origin['Frequency'], cut_size, labels = f_labels)
m_cut = pd.qcut(rfm_origin['Monetary'], cut_size, labels = m_labels

rfm2 = rfm_origin.assign(R_rate = r_cut, F_rate = f_cut, M_rate = m_cut )

 

Recency๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก / Frequency๊ฐ€ ๋†’์„์ˆ˜๋ก / Monetary๊ฐ€ ๋†’์„ ์ˆ˜๋ก ๋†’์€ ์ ์ˆ˜๋ฅผ ์ œ๊ณต

 

๊ฐ ์ ์ˆ˜๋ณ„ ์ƒ๊ด€๊ด€๊ณ„

sns.heatmap(rfm2.iloc[3:6].corr(),annot = True)

 

๊ณ ๊ฐ์ ์ˆ˜๋ณ„๋กœ ํ•ด๋„ ์—ญ์‹œ F์™€ M์—์„œ ๋†’์€ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋ณด์˜€๋‹ค

# Elbow Method ์ตœ์ ์˜ K๊ตฌํ•˜๊ธฐ
SSE = []
for K in range(0,10):
    Kmeans = KMeans(n_clusters = K+1, random_state = 42).fit(rfm2.iloc[:,3:])
    SSE.append(Kmeans.inertia_)
    
sns.pointplot(x=list(range(1,11)), y=SSE)
plt.show()

 

์ด๊ฒƒ๋„ ์—ญ์‹œ K๋Š” 4๊ฐœ๋กœ ๋ถ„์„ ์ถ”์ฒœ

Kmeans_4_2 = KMeans(n_clusters = 4, random_state = 42, init='random')
Visual_4_2 = SilhouetteVisualizer(Kmeans_4_2, colors = 'yellowbrick')
Visual_4_2.fit(rfm2.iloc[:,3:])
Visual_4_2.show()

์ƒ์˜ 25%์”ฉ ์ ์ˆ˜๋ฅผ ์ฃผ๊ณ  ๊ตฌ๋ถ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ๊ทธ๋ฃน๋ณ„ ์ธ์›์ด ๊ณจ๊ณ ๋ฃจ ๋ถ„ํฌ๋˜์—ˆ๋‹ค

from sklearn.metrics import silhouette_score
silhouette_score(rfm2.iloc[:,1:4], rfm2['cluster_4'])
# ์‹ค๋ฃจ์—ฃ ๊ณ„์ˆ˜๋Š” ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ๊ตฐ์ง‘ ๋‚ด์˜ ๋ฐ์ดํ„ฐ์™€๋Š” ์–ผ๋งˆ๋‚˜ ๊ฐ€๊น๊ฒŒ ๊ตฐ์ง‘ํ™”๊ฐ€ ๋˜์—ˆ๊ณ , ๋‹ค๋ฅธ ๊ตฐ์ง‘์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€๋Š” ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋ถ„ํฌ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ
# 1์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๊ตฐ์ง‘ํ™”๊ฐ€ ์ž˜ ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
# ๊ฐ ๊ตฐ์ง‘๋ณ„ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ ๊ตฐ์ง‘๋ณ„ ์‹ค๋ฃจ์—ฃ ๊ณ„์ˆ˜ ํ‰๊ท ๊ฐ’์ด ์ „์ฒด ์‹ค๋ฃจ์—ฃ ๊ณ„์ˆ˜ ํ‰๊ท ๊ฐ’์— ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”

 

-0.055807608868167186 ๋„ˆ๋ฌด ๋‚ฎ์•„์ง„ ์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜...

Q. ์Œ์ˆ˜์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜์˜ ์˜๋ฏธ?

A. ์‹ค๋ฃจ์—ฃ ๊ณ„์ˆ˜๋Š” -1๊ณผ 1์‚ฌ์ด๋กœ 1๋กœ ๊ฐˆ์ˆ˜๋ก ์™„๋ฒฝํ•œ ๊ตฐ์ง‘, ์ฆ‰ -0.5๋Š” ๋ฌด์ž‘์œ„์— ๊ฐ€๊นŒ์›€

 

๊ฐ ๊ทธ๋ฃน๋ณ„ RFMํ™•์ธ

rfm2.groupby('cluster_4').agg({'Recency':['mean','min','max'],'Frequency':['mean','min','max'],'Monetary':['mean','min','max','count']})

๊ฒฐ๋ก 

์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋‚ฎ์•„์กŒ๋‹ค..

๊ฐ ๊ทธ๋ฃน๋ณ„ ํŠน์ง•์ด ๋”์šฑ ๋ชจํ˜ธํ•ด์กŒ๋‹ค -> ๊ฐ ๊ทธ๋ฃน์˜ ๊ธฐ์ค€์„ ์ง๊ด€์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ๋” ์–ด๋ ค์›Œ์ง

์˜ˆ) ๊ณ ๊ฐ0,2,3์˜ Recency์˜ ๊ฒน์น˜๋Š” ๋ฒ”์œ„๊ฐ€ ๋„“์–ด์ง€๊ณ , ๊ณ ๊ฐ1,2,3dml Frequency๊ฐ€ ๋ชจ๋‘ ๊ฒน์น˜๊ณ , 0~4์˜ Monetary๊ฐ€ ๋ชจ๋‘ ๊ฒน์นœ๋‹ค ใ…œ.ใ…œ

 

๋ฐฉ๋ฒ•3. M->profit,F->nique๋กœ ํ•˜์—ฌ K-Means ํด๋Ÿฌ์Šคํ„ฐ๋ง

 

๊ธฐ์ค€์— ๋”ฐ๋ฅธ RFM๊ตฌ๋ถ„ํ•˜๊ธฐ

  • Recency: 2020/06/01 ๊ธฐ์ค€, ๊ฐ€์žฅ ์ตœ๊ทผ ์ฃผ๋ฌธ ๋‚ ์งœ์™€์˜ diff
  • Frequency: count ์ฃผ๋ฌธ ํšŸ์ˆ˜ (* ์ฃผ๋ฌธ ๋ฆฌ์ŠคํŠธ ํฌํ•จ)
  • Monetary: profit

๐Ÿ’ก PROFIT ๊ณ„์‚ฐ

  • df2['MARGIN'] = df2['PRICEEACH'] - df2['MSRP'] df2['PROFIT'] = df2['MARGIN']*df2['QUANTITYORDERED']

 

๐Ÿ’ก count์™€ nunique์˜ ์ฐจ์ด

  • CUSTOMERNAME๋ณ„  ORDERNUMBER ์˜ count -> ORDERNUMBER๋Š” ๊ฐ™์€ ์ฃผ๋ฌธ์ด๋ผ๋„ ์ œํ’ˆ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ–‰์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ํฌํ•จ
  • CUSTOMERNAME๋ณ„  ORDERNUMBER ์˜ nunique -> ๋™์ผํ•œ  ORDERNUMBER๋Š” 1๊ฐœ๋กœ๋งŒ ์ง‘๊ณ„ํ•œ๋‹ค
  1. F-count/M-sales
  • ์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜ 0.5952941816428965

 

2. F-nunique/M-sales

  • ์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜: 0.6070185648892533

 

3. F-count/M-profit

  • ์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜๊ฐ€ 0.40

 

4. F-nunique/M-profit

  • ์‹ค๋ฃจ์—ฃ๊ณ„์ˆ˜ 0.4109245863743192

๊ฒฐ๋ก 

Sales๋กœ ๋ถ„๋ฅ˜ํ–ˆ์„ ๋•Œ, ๋‘ ํ—ค๋น„ ๊ณ ๊ฐ ์—…์ฒด๊ฐ€ ๋”ฐ๋กœ ๋ถ„๋ฅ˜๋จ

Profit์œผ๋กœ ๋ถ„๋ฅ˜ํ–ˆ์„ ๋•Œ, royal ๊ทธ๋ฃน์— 19๊ฐœ์˜ ์—…์ฒด๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ๋น„๊ต์  ์ตœ๊ทผ, ๋งŽ์€ ์ฃผ๋ฌธ ํžˆ์Šคํ† ๋ฆฌ, ์ด๋“์„ ๋ณธ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋จ