멋쟁이 사자처럼 AI 스쿨 TIL-52

김영민·2022년 12월 21일
0

QnA

  • 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(Recency, Frequency, Monetary)

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

고객별 Recency, Frequency, Monetary 값 구하기

# 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-means 알고리즘

  • 입력값

    • k: 클러스터 수
    • D: n 개의 데이터 오브젝트를 포함하는 집합
  • 출력값: 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, 실루엣 기법 등을 사용해서 평가하게 됩니다.

실루엣 (Silhouette Score)

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

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

1) 전체 실루엣 계수의 평균값, 즉 사이킷런의 silhouette_score() 값은 0~1 사이의 값을 가지며, 1에 가까울수록 좋습니다.
2) 전체 실루엣 계수의 평균값과 더불어 개별 군집의 평균값의 편차가 크지 않아야 합니다.

추천 시스템

  • 서비스 초기에 고객의 행동정보가 없을 때는 콘텐츠 기반의 추천
  • 유저 행동 데이터가 쌓이게 되면 협업필터링을 사용하는 하이브리드 추천 방식을 사용하기도 합니다.
    => 협업필터링을 할 때는 우선적으로 하는 일이 유저-아이템-행렬을 만드는 것입니다.
profile
배운걸 다 흡수하는 제로민

0개의 댓글