RFM 기법으로 고객을 같은 간격으로 나누려면 우리가 사용했던 판다스에서 어떤 기능을 사용하면 될까요?
=> cut
절대평가와 상대평가로 구분한다면?
=> cut이 절대평가, qcut 이 상대평가
예를 들어 Monetary 를 기준으로 금액의 절대값이 아니라 같은 비율로 나누고자 한다면 무엇일까요?
=> qcut
last_timestamp 에 1 더해야 하는 이유
=> 최근 영업일과 같은 날에 마지막으로 거래를 했다면 0 으로 될텐데 마지막 거래일자에 거래한 값이 1이 되게 하기 위해서 입니다.
리텐션을 구할 때도 코호트 인덱스 값을 1로 설정한 것 처럼 0부터 시작하지 않고 1부터 시작하도록 1을 더해주었습니다.
last_timestamp = df["InvoiceDate"].max() + dt.timedelta(days=1)
last_timestamp
지도학습과 비지도학습의 차이?
=> 정답(label, y)의 유무
K-근접이웃을 어디에서 사용해 봤을까요?
=> SMOTE할 때
이상치 탐지에 주로 사용하는 군집화 기법은 무엇일까요?
=> DBSCAN : 이상치는 군집에 포함시키지 않습니다. 그래서 이상치 탐지에 주로 사용합니다.
수치 데이터 변환
=> 로그변환 후 스케일링 한다.
예를 들어 OTT 서비스를 오픈했는데 오픈 초기라서 유저의 행동 정보가 없습니다. 어떻게 추천을 해주면 좋을까요?
=> 고객이 어떤 작품을 봤다면 해당 작품의 정보를 참고해서 비슷한 작품 설명을 갖고 있는 작품을 추천합니다 => 콘텐츠 기반 추천시스템입니다.
RFM은 가치있는 고객을 추출해내어 이를 기준으로 고객을 분류할 수 있는 매우 간단하면서도 유용하게 사용될 수 있는 방법으로 알려져 있어 마케팅에서 가장 많이 사용되고 있는 분석방법 중 하나이다. RFM은 구매 가능성이 높은 고객을 선정하기 위한 데이터 분석방법으로서, 분석과정을 통해 데이터는 의미있는 정보로 전환된다.
RFM은 Recency, Frequency, Monetary의 약자로 고객의 가치를 다음의 세 가지 기준에 의해 계산하고 있다.
Recency - 거래의 최근성: 고객이 얼마나 최근에 구입했는가?
Frequency - 거래빈도: 고객이 얼마나 빈번하게 우리 상품을 구입했나?
Monetary - 거래규모: 고객이 구입했던 총 금액은 어느 정도인가?
R => 값이 작을 수록 높은 점수를 줍니다. 왜냐하면 최근에 왔는지를 보기 때문에
F => 값이 높을 수록 높은 점수를 줍니다. 왜냐하면 자주 왔는지를 보기 때문에
M => 값이 높을 수록 높은 점수를 줍니다. 왜냐하면 얼마나 많은 금액을 구매했는지 보기 때문에
# InvoiceDate를 날짜형식으로 변환해 줍니다.
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
# Recency 계산을 위해 해당 주문에서 가장 최근 구매가 일어난 시간을 가져옵니다.
# 최근 거래 기준일(last_timestamp)을 만들기 위해 timedelta로 날짜를 더해줍니다.(최소값:1 설정)
# timedelta(days=0, seconds=0, microseconds=0,
# milliseconds=0, minutes=0, hours=0, weeks=0)
last_timestamp = df["InvoiceDate"].max() + dt.timedelta(days=1)
last_timestamp
# RFM 값을 정의합니다.
# Recency : 최근 거래 기준일(last_timestamp)과 고객별 최근 구매한 날짜(x.max())와 차이값
# Frequency : 구매 빈도수
# Monetary : 총 구매 금액
rfm = df.groupby("CustomerID").agg({"InvoiceDate" : lambda x : (last_timestamp - x.max()).days,
"InvoiceNo" : "count",
"TotalPrice" : "sum"
})
rfm.head()
입력값
출력값: k 개의 클러스터
알고리즘
=> 데이터 오브젝트 집합 D에서 k 개의 데이터 오브젝트를 임의로 추출하고, 이 데이터 오브젝트들을 각 클러스터의 중심 (centroid)으로 설정한다. (초기값 설정)
집합 D의 각 데이터 오브젝트들에 대해 k 개의 클러스터 중심 오브젝트와의 거리를 각각 구하고, 각 데이터 오브젝트가 어느 중심점 (centroid) 와 가장 유사도가 높은지 알아낸다. 그리고 그렇게 찾아낸 중심점으로 각 데이터 오브젝트들을 할당한다.
클러스터의 중심점을 다시 계산한다. 즉, 2에서 재할당된 클러스터들을 기준으로 중심점을 다시 계산한다.
각 데이터 오브젝트의 소속 클러스터가 바뀌지 않을 때까지 2, 3 과정을 반복한다.
# cluster.KMeans, metrics.silhouette_score 불러오기
# rfm_norm 값을 학습하고
# elbow 값을 보기위해 inertia_ 값을 리스트로 만듭니다.
# silhouette_score(X, kmeans.labels_) 값도 리스트로 만듭니다.
# 반복문을 통해 n_clusters 를 특정 범위만큼 지정한 이유는
# 클러스터의 수는 사용자가 지정해야하는 파라미터 값입니다.
# 어느 값으로 설정해야 잘 군집화가 되었는지를 평가할 때 inertia_ 값을 사용합니다.
# 군집의 중심(centroid)와 데이터 포인트간의 거리로 측정합니다.
# 차이가 적게 나면 거리가 가깝다는 의미이기 때문에 inertia_ 값이 작게 나옵니다.
=> inertia값이 작을수록 좋은 것이다.
클러스터의 거리를 계산할 때 같은 클러스터끼리는 가까운 거리에 있어야 하고
다른 클러스터와는 멀리 떨어져 있어야지 잘 군집화가 되었다고 평가할 수 있습니다.
=> Elbow, 실루엣 기법 등을 사용해서 평가하게 됩니다.
군집화 평가 방법으로 실루엣 분석(Shilhouette Analysis)이 있습니다. 실루엣 분석은 각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지를 나타냅니다. 효율적으로 잘 분리됐다는 것은 다른 군집과의 거리는 떨어져 있고 동일 군집끼리의 데이터는 서로 가깝게 잘 뭉쳐 있다는 의미입니다. 군집화가 잘 될수록 개별 군집은 비슷한 정도의 여유공간을 가지고 떨어져 있을 것입니다.
1) 전체 실루엣 계수의 평균값, 즉 사이킷런의 silhouette_score() 값은 0~1 사이의 값을 가지며, 1에 가까울수록 좋습니다.
2) 전체 실루엣 계수의 평균값과 더불어 개별 군집의 평균값의 편차가 크지 않아야 합니다.