본문 바로가기
프로젝트

[코드리뷰] 고객생애가치(CLV) 계산하기

by kime2 2024. 8. 7.

CLV(Customer Life Value) :고객생애가치  

고객과의 관계가 지속되는 동안 평균적으로 고객1인으로부터 기대하는 금액

고객가치 = 평균구매금액 X 평균구매빈도

평균구매금액 = 특정기간 내 총 수익 / 특정기간 내 총 구매횟수

CLV = 고객가치 X 평균고객수명(고객의 예상 유지 기간)

 

이를 통해 고객이 수명주기내 기여할 수 있는 수익을 계산할 수 있음

  • 평균구매가치 : 해당기간(하단 활용에서는 1년) 총 매출/ 총 구매건수
  • 평균구매건수 : 구매건수 / 기간내 구매한 고유 고객수(중복구매제거)
  • 평균고객가치 : 평균구매가치*평균구매건수
  • > 1년동안 평균 고객이 얼마의 물품을 구매하는지 나타냄
  • 평균고객수명 : 고객이 구매를 지속한 횟수(하단 활용에서는 1년동안 구매한 횟수를 지정)

고객 1명이 첫 결제 이후 이탈할 때까지 만들어 내는 1인당 누적 수익

 

< 예시 >

> 고객 A: 가입 후 1년동안 4개월 마다 3번 구매

> 고객 B :가입 후 1년동안 초반에반 3번 구매

왜 고객 A가 더 가치있다고 결론을 낼 수 있을까?

> A고객의 수명이 더 길어서~, 

주기적으로 A가 구매하는데, 이 고객은 아직 구매 주기가 끝나지 않은 것

구매주기(수명)가 끝났다는 걸 아려면? 이탈에 대한 기준이 필요함

 

A고객은 3개월에 한번씩 구매한다는 데이터가 있고

사람들의 평균적인 구매주기와 방문주기가 있는데 그 안에 포함되어 있는지

 

 

LTR = 누적 결제금액 / 특정 고객 집단에 속하는 고객 수

어려운점

평균 고객수명을 알기가 어려운데...각 활용가능한 데이터에 따라 CLV, LTR중 어떤걸 계산할 수 있을지 잘 모르겠다.

또한 나온 수치에 대한 해석..


활용1. 

활용데이터 : 데이콘 고객에 대한 거래 데이터, 고객데이터

구매기간 : 2019년

 

1. 구매데이터

 

2. 고객데이터

# 거래날짜 데이트타입으로 변경
df_on['거래날짜'] = pd.to_datetime(df_on['거래날짜'])

#고객별 평균 구매 금액 계산하기
clv = df_on.groupby('고객ID').agg({'평균금액':'sum','고객ID':'count'}).rename(columns = {'평균금액':'총구매금액','고객ID':'구매횟수'})
clv['평균구매금액'] = clv['총구매금액']/clv['구매횟수']

#(2019년) 1년간의 구매데이터이기 때문에 평균구매빈도를 구하기 위해서 구매횟수에서 일수(365)를 나눔
clv['평균구매빈도'] = clv['구매횟수']/365
clv.head()

 

# 구매데이터 df_on과 합치기(outer)
clv = pd.merge(clv,df_cus, on='고객ID', how='outer')

# 가입기간을 년단위로 바꿔주기
clv['가입기간'] = clv['가입기간']/12

# 고객생애가치 구하기
clv['고객생애가치'] = clv['가입기간']*clv['평균구매금액']*clv['평균구매빈도']
clv.head()

 

 

고객생애가치를 계산 후 사용방안

: 각 유저당 카테고리를 분류 > 평균구매빈도를 높이고 가입기간을 높이는 방안 적용

예) 귀저기,분유 등을 확인해서 같은 특성을 가진 유저들끼리 그룹핑해서 그들을 대상을 마케팅

 

고객생애가치를 높이기 위해 가입기간을 늘리는, 탈퇴하지 않게 하는 방안을 마련

예) 업셀링, 자주 사게 하는

 

평균 4만원을 구매한다면, 평균 구매금액을 높이기 위해 쿠폰프로모션: 6만원 이상 사면~~할인


활용2.

활용데이터 : 구글 looker

구매기간 2023년 1년

 

필요데이터 추출하기

look_df = look[['user_id','order_id','order_created_at','account_created_at','product_id','sale_price','cost']]
look_df['margin'] = look_df['sale_price']-look_df['cost']
look_df = look_df.loc[look_df['order_created_at'].dt.year==2023]

# 년-월-일 형식의 데이터타입으로 바꾸기
look_df['order_created_at'] = look_df['order_created_at'].str.slice(0,10)
look_df['order_created_at'] = pd.to_datetime(look_df['order_created_at'])

look_df['account_created_at'] = look_df['account_created_at'].str.slice(0,10)
look_df['account_created_at'] = pd.to_datetime(look_df['account_created_at'])

# 가입기간 구하기
base_date = dt.datetime(2023,12,31)
look_df['days'] = look_df['account_created_at'].apply(lambda x : (base_date - x).days if x is not None else None)

# 2023년 거래만 확인
look_df = look_df.loc[look_df['order_created_at'].dt.year==2023]

# 고객별 평균 구매 금액 계산하기
clv_df = look_df.groupby('user_id').agg({'margin':'sum','user_id':'count'}).rename(columns = {'margin' :'total_margin','user_id':'order_count'})
clv_df['avg_margin'] = clv_df['total_margin']/clv_df['order_count']

# 2023년도 고객의 평균 구매빈도 구하기
clv_df['avg_frequent'] = clv_df['order_count']/365

clv_df.head()

# look_df와 합치기
clv_df = pd.merge(look_df, clv_df,on = 'user_id', how='outer')

# 가입기간을 년 단위로로 바꾸기
clv_df['days'] = clv_df['days']/365

# 고객생애가치 구하기
clv_df['clv'] = clv_df['days']*clv_df['avg_margin']*clv_df['avg_frequent']

clv_df=clv_df.drop(['sale_price','cost'],axis=1)
clv_df.dropna().head()

각 고객의 1년동안 기여할 수 있는 수익을 알 수 있다

 

참고 :  🐹AtoZ 햄토리 컨설턴트 !고객 세분화 기반 행동 분석을 통한 등급별 목표와 솔루션을 제안해줘! - DACON

 

 


포트폴리오 활용

목표 :  24년도 신규 방문한 고객의 이탈 방지

1. 23년도 1년동안 주문한 경험이 있는 고객를 통해 RFM을 구분 : 총 6개의 고객 등급 제시

LTR = 누적 결제금액 / 특정 고객 집단에 속하는 고객 수

2. 23년도 주문한 고객들의 고객등급에 따라 LTR계산

3. 24년도 신규고객을 RFM기준으로 분류하여 LTR계산

계산 : 등급별 1년동안의 누적 결제금액 / 등급별 고객 수

 

이런 결과를 실무어서는 비즈니스 적으로 어떻게 해석하는지?

방문횟수를 늘릴 수 있는 방법을 찾기 > 마케팅 액션 : 출석체크,운세, 만보기 등

전체 거래액을 높이는 방안 > 쿠폰설계(업셀링)/프로덕트: 장보기 서비스를 이용할 때 쿠팡 결제하기 직전에 다른사람 구매화면, 효율적인 방보기 방안 등

NS에 대한 광고 타겟팅 : 1년안에 4회 미만 방문자 타겟,