🦁🦁
RFM은 일정기간 동안에 발생된 고객의 구매 패턴을 이용하여 고객을 분류할 수 있는 분석방법 (고객 세그멘테이션)
고객의 가치를 다음의 세 가지 기준에 의해 계산
Recency - 거래의 최근성 : 고객이 얼마나 최근에 구입했는가?
Frequency - 거래 빈도 : 고객이 얼마나 빈번하게 우리 상품을 구입했나?
Monetary - 거래 규모 : 고객이 구입했던 총 금액은 어느 정도인가?
최근에 구매한 고객일수록 회사의 마케팅 홍보에 반응을 보일 가능성이 클 것이며, 자주 구매하는 고객이 그렇지 않은 고객보다 반응할 가능성이 더 높고, 많은 금액을 소비한 고객이 다시 구매할 가능성이 더 높다고 할 수 있음
이 세 가지 요소를 기준으로 고객들을 몇 개의 소집단으로 분류한 후에 각 소집단의 특성을 파악하여 우수고객 집단과 불량고객 집단을 구분하는 방법
🤔RFM 기법으로 고객을 같은 간격으로 나누려면 우리가 사용했던 판다스에서 어떤 기능을 사용하면 될까?
💡scoring 기법
💡계산
# Recency 계산을 위해 해당 주문에서 가장 최근 구매가 일어난 시간을 가져옴
last_timestamp = df["InvoiceDate"].max() + dt.timedelta(days=1)
# RFM 값 정의
rfm = df.groupby("CustomerID").agg({"InvoiceDate" : lambda x : (last_timestamp - x.max()).days,
"InvoiceNo" : "count",
"TotalPrice" : "sum"
})
rfm.columns = ['Recency', 'Frequency', 'MonetaryValue']
# scoring
r_labels = list(range(5,0,-1))
f_labels = list(range(1,6))
m_labels = list(range(1,6))
r_cut = pd.qcut(x=rfm["Recency"], q=cut_size, labels=r_labels)
f_cut = pd.qcut(x=rfm["Frequency"], q=cut_size, labels=f_labels)
m_cut = pd.qcut(x=rfm["MonetaryValue"], q=cut_size, labels=m_labels)
# 단순히 RFM만 붙여서 segment로 사용할 수 있음
rfm["RFM_segment"] = rfm["R"].astype(str) + rfm["F"].astype(str) + rfm["M"].astype(str)
# 혹은 스코어값을 더해서 사용
rfm["RFM_score"] = rfm[["R", "F", "M"]].astype(int).sum(axis=1)
# 3D 시각화
ax = plt.axes(projection='3d')
ax.scatter3D(rfm["R"], rfm["F"], rfm["M"])
# groupby - 역으로 환산
rfm.groupby("RFM_score").agg({"Recency" : "mean",
"Frequency" : "mean",
"MonetaryValue" : ["mean", "sum"]}).style.background_gradient("Blues").format("{:,.0f}")
🤔지도학습과 비지도학습의 차이?
💡k-means 알고리즘
입력값
출력값
알고리즘
데이터 오브젝트 집합 D에서 k 개의 데이터 오브젝트를 임의로 추출하고, 이 데이터 오브젝트들을 각 클러스터의 중심 (centroid)으로 설정. (초기값 설정)
집합 D의 각 데이터 오브젝트들에 대해 k 개의 클러스터 중심 오브젝트와의 거리를 각각 구하고, 각 데이터 오브젝트가 어느 중심점 (centroid) 와 가장 유사도가 높은지 알아냄. 그리고 그렇게 찾아낸 중심점으로 각 데이터 오브젝트들을 할당.
클러스터의 중심점을 다시 계산. 즉, 2에서 재할당된 클러스터들을 기준으로 중심점을 다시 계산.
각 데이터 오브젝트의 소속 클러스터가 바뀌지 않을 때까지 2, 3 과정을 반복.
💡Elbow method
k-means에서 클러스터 개수를 결정하는 방법
클러스터의 수를 순차적으로 늘려가면서 결과를 모니터링 함. 만약 하나의 클러스터를 추가했을 때 이전보다 훨씬 더 나은 결과를 나타내지 않는다면, 이전의 클러스터의 수를 구하고자 하는 클러스터의 수로 설정.
🤔이상치 탐지에 주로 사용하는 군집화 기법은?
🤔수치 데이터 변환 순서?
💡Silhouette Score
군집화 평가 방법. 실루엣 분석은 각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지를 나타냄. 효율적으로 잘 분리됐다는 것은 다른 군집과의 거리는 떨어져 있고 동일 군집끼리의 데이터는 서로 가깝게 잘 뭉쳐 있다는 의미. 군집화가 잘 될수록 개별 군집은 비슷한 정도의 여유공간을 가지고 떨어져 있음.
좋은 군집화가 되기 위한 기준 조건
정답 레이블을 모르는 경우 모델 자체를 사용하여 평가를 수행해야 함. 실루엣 계수(sklearn.metrics.silhouette_score)는 이러한 평가의 한 예이며 실루엣 계수 점수가 높을수록 클러스터가 더 잘 정의된 모델과 관련됨. 실루엣 계수는 각 샘플에 대해 정의되며 두 가지 점수로 구성됨.
s = (b-a)/max(a,b)
💡sklearn 실루엣 분석 메서드
silhouette_samples(X, labels, metric='euclidean', **kwds)
: X feature 데이터 세트와 각 feature데이터 세트가 속한 군집 레이블 값인 labels데이터를 입력해주면 각 데이터 포인트의 실루엣 계수를 계산해 반환.silhouette_score(X, labels, metric='euclidean', sample_size=None, **kwds)
: 인자로 X feature데이터 세트와 각 feature 데이터 세트가 속한 레이블 값인 labels데이터를 입력해주면 전체 데이터의 실루엣 계수 값을 평균내서 반환. np.mean(silhouette_samples())
값. 🤔CAC 천원은 무슨 의미일까?
🤔OTT 서비스를 오픈했는데 오픈 초기라서 유저의 행동 정보가 없음. 어떻게 추천을 해주면 좋을까?
서비스 초기에 고객의 행동정보가 없을 때는 콘텐츠 기반의 추천을 하고 유저 행동 데이터가 쌓이게 되면 협업필터링을 사용하는 하이브리드 추천 방식을 사용하기도 함