[TIL] 22.12.21

문종현·2022년 12월 21일
0

TIL

목록 보기
62/119
post-custom-banner

🦁🦁

👉 오늘 한 일

  • RFM 분석 (1202)
  • 군집화 (1203)
  • 추천시스템 (1301 ~ )

RFM 분석

  • RFM은 일정기간 동안에 발생된 고객의 구매 패턴을 이용하여 고객을 분류할 수 있는 분석방법 (고객 세그멘테이션)

  • 고객의 가치를 다음의 세 가지 기준에 의해 계산

  • Recency - 거래의 최근성 : 고객이 얼마나 최근에 구입했는가?

  • Frequency - 거래 빈도 : 고객이 얼마나 빈번하게 우리 상품을 구입했나?

  • Monetary - 거래 규모 : 고객이 구입했던 총 금액은 어느 정도인가?

  • 최근에 구매한 고객일수록 회사의 마케팅 홍보에 반응을 보일 가능성이 클 것이며, 자주 구매하는 고객이 그렇지 않은 고객보다 반응할 가능성이 더 높고, 많은 금액을 소비한 고객이 다시 구매할 가능성이 더 높다고 할 수 있음

  • 이 세 가지 요소를 기준으로 고객들을 몇 개의 소집단으로 분류한 후에 각 소집단의 특성을 파악하여 우수고객 집단과 불량고객 집단을 구분하는 방법

🤔RFM 기법으로 고객을 같은 간격으로 나누려면 우리가 사용했던 판다스에서 어떤 기능을 사용하면 될까?

  • cut(절대평가) : 같은 길이로 나눔
  • qcut(상대평가) : 같은 비율로 나눔

💡scoring 기법

  • Scoring 기법: RFM의 요인을 각각 5등급으로 등간격으로 분류하는 방법.
  • 현재 개발된 RFM 모형은 크게 4가지로 분류 할 수 있음.
    • 모델1. RFM 각 요소의 20% rule의 적용
    • 모델2. 비율 척도에 의한 양적인 정도의 차이에 따른 등간격의 5등급 분류
    • 모델3. 상하 20%를 제외한 등간격 척도에 의한 그룹 분류
    • 모델4. 군집 분석에 의한 각 요소 별 5개의 그룹 분류
  • 상황에 따라 다르게 나눌 수 있음. 정해진 것이 아니기 때문에 유연하게 사용

💡계산

# 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}")

군집화 분석

🤔지도학습과 비지도학습의 차이?

  • 정답(label, y)의 유무

💡k-means 알고리즘

입력값

  • k: 클러스터 수
  • D: n 개의 데이터 오브젝트를 포함하는 집합

출력값

  • k 개의 클러스터

알고리즘

  1. 데이터 오브젝트 집합 D에서 k 개의 데이터 오브젝트를 임의로 추출하고, 이 데이터 오브젝트들을 각 클러스터의 중심 (centroid)으로 설정. (초기값 설정)

  2. 집합 D의 각 데이터 오브젝트들에 대해 k 개의 클러스터 중심 오브젝트와의 거리를 각각 구하고, 각 데이터 오브젝트가 어느 중심점 (centroid) 와 가장 유사도가 높은지 알아냄. 그리고 그렇게 찾아낸 중심점으로 각 데이터 오브젝트들을 할당.

  3. 클러스터의 중심점을 다시 계산. 즉, 2에서 재할당된 클러스터들을 기준으로 중심점을 다시 계산.

  4. 각 데이터 오브젝트의 소속 클러스터가 바뀌지 않을 때까지 2, 3 과정을 반복.

  • 클러스터의 거리를 계산할 때 같은 클러스터끼리는 가까운 거리에 있어야 하고, 다른 클러스터와는 멀리 떨어져 있어야지 잘 군집화가 되었다고 평가할 수 있음.
    => Elbow, 실루엣 기법 등을 사용해서 평가

💡Elbow method

  • k-means에서 클러스터 개수를 결정하는 방법

  • 클러스터의 수를 순차적으로 늘려가면서 결과를 모니터링 함. 만약 하나의 클러스터를 추가했을 때 이전보다 훨씬 더 나은 결과를 나타내지 않는다면, 이전의 클러스터의 수를 구하고자 하는 클러스터의 수로 설정.

🤔이상치 탐지에 주로 사용하는 군집화 기법은?

  • DBSCAN(Density-based spatial clustering of applications with noise)
  • K Means나 Hierarchical 클러스터링의 경우 군집간의 거리를 이용하여 클러스터링을 하는 방법인데, 밀도 기반의 클러스터링은 점이 세밀하게 몰려 있어서 밀도가 높은 부분을 클러스터링 하는 방식임
  • 쉽게 설명하면, 어느점을 기준으로 반경 x내에 점이 n개 이상 있으면 하나의 군집으로 인식하는 방식임

🤔수치 데이터 변환 순서?

  • 로그변환 후 스케일링 함

💡Silhouette Score
군집화 평가 방법. 실루엣 분석은 각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지를 나타냄. 효율적으로 잘 분리됐다는 것은 다른 군집과의 거리는 떨어져 있고 동일 군집끼리의 데이터는 서로 가깝게 잘 뭉쳐 있다는 의미. 군집화가 잘 될수록 개별 군집은 비슷한 정도의 여유공간을 가지고 떨어져 있음.

  • 좋은 군집화가 되기 위한 기준 조건

    • 전체 실루엣 계수의 평균값, 즉 사이킷런의 silhouette_score() 값은 0~1 사이의 값을 가지며, 1에 가까울수록 좋음.
    • 하지만 전체 실루엣 계수의 평균값과 더불어 개별 군집의 평균값의 편차가 크지 않아야 함. 즉, 개별 군집의 실루엣 계수 평균값이 전체 실루엣 계수의 평균값에서 크게 벗어나지 않는 것이 중요. 만약 전체 실루엣 계수의 평균값은 높지만, 특정 군집의 실루엣 계수 평균값만 유난히 높고 다른 군집들의 실루엣 계수 평균값은 낮으면 좋은 군집화 조건이 아님.

정답 레이블을 모르는 경우 모델 자체를 사용하여 평가를 수행해야 함. 실루엣 계수(sklearn.metrics.silhouette_score)는 이러한 평가의 한 예이며 실루엣 계수 점수가 높을수록 클러스터가 더 잘 정의된 모델과 관련됨. 실루엣 계수는 각 샘플에 대해 정의되며 두 가지 점수로 구성됨.

  • a : 샘플과 동일한 클래스의 다른 모든 점 사이의 평균 거리.
  • b : 표본과 다음으로 가장 가까운 군집 의 다른 모든 점 사이의 평균 거리
  • 단일 샘플에 대한 실루엣 계수 s 는 다음과 같이 주어짐.
    • 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 천원은 무슨 의미일까?

  • 유료 결제 고객 1명 확보에 들어간 비용이 1000원

🤔OTT 서비스를 오픈했는데 오픈 초기라서 유저의 행동 정보가 없음. 어떻게 추천을 해주면 좋을까?

  • 고객이 어떤 작품을 봤다면 해당 작품의 정보를 참고해서 비슷한 작품 설명을 갖고 있는 작품을 추천 => 콘텐츠 기반 추천시스템
  • 처음에 유저가 입력한 선호작 기반 추천
  • 현재 랭킹 추천 등

서비스 초기에 고객의 행동정보가 없을 때는 콘텐츠 기반의 추천을 하고 유저 행동 데이터가 쌓이게 되면 협업필터링을 사용하는 하이브리드 추천 방식을 사용하기도 함

profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글