카테고리 없음

12/20 비즈니스 데이터 분석

monawa 2022. 12. 22.
728x90

어제 하던 1201실습 파일 계속 

online-retail-eda

EDA(리텐션) => RFM(segmentation)을 판다스로 구하고 => 군집화로 고객 세분화(segmentation)

=> 유사도를 통한 추천시스템


지불 유저 별 결제금액 (ARPPU)

Average Revenue Per Paying User

  • 지불 유저 1명 당 한 달에 결제하는 평균 금액을 산정한 수치
  • F2P(부분 유료, Free to Play) 게임에서 수익 지표로 자주 활용되는 수치
  • 다양한 부가 서비스 아이템을 도입하거나 월 정액 과금 방식을 사용하는 리니지 처럼 월 정액 과금에 부분 유료 아이템을 추가적으로 판매해 ARPPU를 끌어올릴 수 있다.
  • 기준 기간 총 수익 / 기준 기간 당 구매 고객
ARPPU - CustomerID 를 사용할 때는 count가 아닌 nunique 를 사용합니다.
arppu = df_valid.groupby("InvoiceYM").agg({"TotalPrice":"sum", "CustomerID": "nunique"})
arppu.columns = ["sale_sum", "customer_count"]

기준 기간 총 수익 / 기준 기간 당 구매 고객
arppu["ARPPU"] = arppu["sale_sum"] / arppu["customer_count"]
arppu.style.format("{:,.0f}")
arppu["ARPPU"].plot(figsize=(12, 3), title="Monthly ARPPU");

 

코호트 분석(Cohort analysis)

  • 코호트 분석은 분석 전에 데이터 세트의 데이터를 관련 그룹으로 나누는 일종의 행동 분석.
  • 이러한 그룹 또는 집단은 일반적으로 정의된 시간 범위 내에서 공통된 특성이나 경험을 공유.
  • 코호트 분석을 통해 회사는 고객이 겪는 자연적 주기를 고려하지 않고 맹목적으로 모든 고객을 분할하는 대신, 고객(사용자)의 수명 주기 전반에 걸쳐 패턴을 명확하게 볼 수 있음.
  • 이러한 시간 패턴을 보고, 회사는 특정 집단에 맞게 서비스 조정 가능.
  • 코호트 분석의 유형

잔존율 분석 (Retention rate analysis)

  • 리텐션 분석은 고객이 이탈하는 방법과 이유를 이해하기 위해 사용자 메트릭을 분석하는 과정.
  • 코호트 기법에서 시간으로 묶어서 분석하는 방법
  • 유지 분석은 유지 및 신규 사용자 확보율을 개선하여, 수익성 있는 고객 기반을 유지하는 방법 확보.
  • 일관된 유지 분석을 실행하여 알 수 있는 항목
  • 고객이 이탈하는 이유
  • 고객이 떠날 가능성이 더 높을 때
  • 이탈이 수익에 미치는 영향
  • 유지 전략을 개선하는 방법

최초구매일을구하고 

df_valid.groupby('CustomID')['해당구매월'].min()

df_valid['최초구매월'] = df_valid.groupby('CustomID')['해당구매월'].transform('min')

df_valid[['CustomID','InvoiceDate','최초구매월','해당구매월']].sample(5)

월별잔존 구매해 대한 월수를 계산한다

year_diff = df_valid['해당구매월'].dt.year - df_valid['최초구매월'].dt.year

month_diff = df_valid['해당구매월'].dt.month - df_valid['최초구매월'].dt.month

df_valid["CohortIndex"] = (year_diff * 12) + month_diff +1

연도차이  12개월 + 월차이 + 1로 첫 구매 후 몇달 후 구매인지 알 수 있도록 CohortIndex 변수를 생성

 

InvoiceDateMin, CohortIndex 로 그룹화 하여 CustomerID 의 유일값에 대한 빈도수를 계산

df_valid.groupby(["최초구매월", "CohortIndex"])["CustomerID"].nunique()

cohort_count = df_valid.groupby(["최초구매월", "CohortIndex"])["CustomerID"].nunique().unstack()

cohort_count

 

RFM 분석 (Recency, Frequency, Monetary analysis)

  • RFM은 가치있는 고객을 추출해내어 이를 기준으로 고객을 분류할 수 있는 분석 방법.
  • 구매 가능성이 높은 고객을 선정하기 위한 데이터 분석방법.
  • RFM 분석에서 우리는 세 가지 지표 또는 차원에 따라 각 고객을 분석
    • Recency (거래의 최근성): 고객이 얼마나 최근에 구입했는가?
    • Frequency(거래 빈도): 고객이 얼마나 빈번하게 우리 상품을 구입했나?
    • Monetary(거래규모): 고객이 구입했던 총 금액은 어느 정도인가?
  • 가장 큰 과제는 그룹의 경계를 정의하는 것.
  • RFM 분석에 의한 고객 세분화의 3D 표현
  • 그룹의 교차점이 우리의 고객세분화 기준
  • 3가지 차원을 각각 4개의 그룹으로 나누면 64 (4x4x4) 고객 세그먼트가 생성.

 

 

이 그래프 어떻게 해석할 수 있을까요?

df.hist(figsize=(12,6),bins=50)

 

값은 대부분 1에 가까운 부분에 쏠려있다. 이상치가 있다

df.describe()

 

전체 주문금액 파생변수 만들기

-• 수량 X 금액으로 전체 금액 계산하기

# TotalPrice 는 RFM 중 MonetaryValue의 값이 됩니다.
df["TotalPrice"] = df["UnitPrice"] * df["Quantity"]
df[["Quantity","UnitPrice","TotalPrice"]]

주문서와 결제 테이블이 실 비즈니스에서는 따로 되어 있기도 합니다. 이 데이터는 주문서 테이블이라고 볼 수 있습니다. 결제 테이블에는 무엇이 있을까요?

 

결제 테이블이라면 주로

고객ID, 주문서ID, 총결제금액, 결제수단, 결제일자, PG사승인번호, 상태값(완료, 실패)

(보통 PG사를 통해서 승인번호를 받지 카드번호를 받지는 않습니다.)

 

 

 

어떨 때 pandas 의 background_gradient() 를 사용하고 어떨 때 seaborn 의 heatmap()을 사용하면 좋을까요?

# 리스트컴프리헨션(List comprehension)을 통해 토요일을 제외한 
# "월화수목금일"요일 문자열을 리스트를 컬럼명으로 대체합니다.
# 위에서 구한 값을 .style.background_gradient() 통해서 시각화합니다.
hour_dow.style.background_gradient(cmap = "Greens").format("{:,}")

# 시간별_요열별 구매 주문을 heatmap을 통해 구매 빈도수를 시각화
plt.figure(figsize=(12, 8))
sns.heatmap(hour_dow,annot=True,fmt=",.0f",cmap="Greens")

pandas 의 background_gradient() 변수마다 성질이 다를 때, 각 변수별로 스케일값을 표현합니다.
seaborn 의 heatmap()  같은 성질의 변수를 비교할 때, 전체 수치데이터로 스케일값을 표현합니다.

 

고객ID가 없는 주문과 취소 주문은 전체 데이터에서 제외

# "CustomerID" 가 있고(notnull) "Quantity", "UnitPrice" 가 0보다 큰 데이터를 가져옵니다.
# 구매하고 취소한 건 중 취소한 건만 제외하고 구매 건은 남깁니다.
# 유효한 데이터를 df_valid 변수에 할당합니다.
df_valid = df[df["CustomerID"].notnull() & (df["Quantity"]>0)& (df["UnitPrice"]>0)].copy()
df.shape, df_valid.shape

((541909, 17), (397884, 17))

# 고객ID가 없는 건도 제거하여 df_valid 변수에 할당합니다.
# 중복 데이터 제거
df_valid= df_valid.drop_duplicates()
df_valid.shape

(392692, 17)

 


중복 데이터는 게시판에 글을 쓸 때 네트워크가 불안정할 때 전송버튼을 두 번 누르거나 서버측 트래픽 이슈로 중복 해서 쌓이는 경우가 발생하기도 합니다. 요즘은 대부분 이런 이슈가 없도록 프론트, 백엔드 개발에서 고려해서 프로그램을 작성하지만 그래도 중복 이슈가 발생하기도 합니다!

 

DAU, MAU, CAC, ARPU, ARPPU, LTV, ROAS 는 따아, 아아, JMT 처럼 자주 사용하는 용어를 줄여서 사용하는 거과 비슷합니다.

 

 

ARPPU

지불 유저 1명 당 한 달에 결제하는 평균 금액을 산정한 수치. 부분유료 게임의 수익 지표로 활용된다. ARPPU(Average Revenue Per Paying User)는 일종의 수익 지표로, 게임에서는 돈을 지불한 유저 1명 당

terms.naver.com

 

 

ROI란? ROAS와의 차이와 개요를 이해하여 마케팅의 효율성 높이기

비즈니스에서 자주 사용되는 말로 ROI가 있습니다. 이는 소진된 비용에 대비해 얼마만큼의 효과를 올렸는지를 나타내는 수치입니다. ROI의 개요와 ROAS와의 차이점을 이해하여 마케팅 영역에 있어

www.salesforce.com

리텐션이 무엇일까요?

코호트 분석 중에 시간으로 묶어서 분석하는 기법이기도 합니다.


 

재사용률과 다른 의미인건가요? AARRR에서 말하는 리텐션과 코호트는 따로인줄 알았는데요

코호트 기법에서 시간으로 묶어서 분석하는 것이 리텐션이고 리텐션으로는 이탈, 성장 등을 분석할 수 있습니다.

이탈 - 지난 달에 구매한 사람이 이번달에도 구매했는가? 성장 - 지난 달에 비해 매출액이 늘어났는가?

리텐션을 볼 때는 서비스마다 보는 관점이 다르기도 합니다.


구독형 서비스의 (통신사, 정수기, OTT, 클라우드) 가입자 유지 비율

 

리텐션을 어떻게 구할 수 있을까요?

(1개월 후에도 제품 또는 서비스를 여전히 사용하는 사용자 수 / 해당 월에 제품 또는 서비스를 사용하기 시작한 사용자 수) x 100?

 

그럼 1개월 후에도 제품 또는 서비스를 여전히 사용하는 사용자 수 는 어떻게 구할까요?

해당 월 서비스 이용자 수 / 다음 월 서비스 이용자 수

 

개월 수로 구한다면 어떻게 구할 수 있을까요?

서비스 첫 이용월을 1로 봤을 때 그다음달은 2, 3, 4, 5, 6 으로 몇 달이 지났는지 어떻게 구분할까요?

해당 고객의 첫 구매월을 찾습니다. 첫 구매월과 해당 구매 시점의 월의 차이를 구합니다. 첫 구매한 달로부터 몇 달째 구매인지를 구합니다.

 

코호트 빈도를 구했더니 어떤 인사이트를 얻을 수 있을까요? 이 그래프를 보고 어떤 액션을 취할 수 있을까요?

첫 달에만 구매하고 다음달 부터 구매하지 않는 사람이 많다.

마케팅비를 많이 쏟아서 고객을 유치했지만 유지가 잘 되지 않는 것으로 보여집니다.

휴면 고객을 위한 이벤트, 쿠폰 등이 적절한 시점에 있으면 도움이 되겠다라는 계획을 세워 볼 수도 있겠죠.

 

 

위그림은 판다스의 어떤 기능으로 구할 수 있을까요?

heatmap

# heatmap을 통해 위에서 구한 잔존수을 시각화 합니다.
plt.figure(figsize=(12, 8))
sns.heatmap(cohort_count, annot=True, fmt=".0f", cmap="Blues")

하지만 히트맵으로 시각화 하려면 먼저 데이터가 필요합니다

 

crosstab or groupby

# InvoiceDateMin, CohortIndex 로 그룹화 하여 CustomerID 의 유일값에 대한 빈도수를 구합니다.
# cohort_count
cohort_count = df_valid.groupby(["최초구매월","CohortIndex"])["CustomerID"].nunique().unstack()
cohort_count

 

코호트 분석에서 시간 단위로 묶어서 보는 분석 중에 하나가 리텐션 분석입니다. 같은 달에 첫 구매한 사람들이 같은 집단으로 묶였기 때문에 시간 단위 코호트 분석이 됩니다.

 

 

 

 

내일은 1202RFM 분석

R(Recency) - 최근에 구매했는지? F(Frequency) - 얼마나 자주 구매했는지? M(Monetary) - 얼마나 많은 금액을 구매했는지? => 이 기준으로 고객 Segment 를 나누는 것이 RFM 분석입니다

.

미리 읽어오면 좋습니다 => 

 

고객가치 평가의 척도 - RFM - 아이티데일리

피터 드러커(Peter Drucker)의 말처럼, '기업의 첫 번째 과업은 고객창출'이다. 그러나 오늘날 고객들은 다양한 제품, 브랜드, 가격과 공급자들에 대한 다양한 정보를 쉽게 구할 수 있기 때문에 제품

www.itdaily.kr


오늘 풀어본 문제 정리해보기


코호트 분석(Cohort analysis)이란

코호트 분석은 분석 전에 데이터 세트의 데이터를 관련 그룹으로 나누는 일종의 행동 분석이다.

코호트 분석의 그룹 또는 집단은 정의된 시간 범위 내에서 공통된 특성이나 경험을 공유한다.

시간 패턴을 통해 회사는 특정 집단에 맞게 서비스를 조정 가능하다.


잔존율 분석으로 할수있는것

  • 고객이 이탈하는 이유
  • 이탈이 수익에 미치는 영향
  • 유지 전략을 개선하는 방법

고객이 이탈 후 돌아올 가능성이 낮을떄 어떻게 하면 돌아올까 분석하는것!! 많을떄 아님


basic-eda

  • groupby()함수는 그룹객체를 만들어주는 함수로 " Dataframe객체.groupby(기준이 되는 열이름) "로 사용됩니다.
  • agg()함수는 여러개의 열에 여러가지 함수를 적용할 수 있다.
  • transform()함수는 그룹별로 매핑함수를 적용하긴 하지만, 그룹별로 집계하지 않고 원래 데이터프레임의 형태로 반환해주는 차이가 있다.
  • group객체.apply(매핑함수)로 사용되며, 개별 원소가 아닌 그룹별 매핑이 기준이다.

중복 데이터 확인 중 keep의 파라미터를 적용했을때 실행이 되지 않는 코드는 무엇일까요?

data.duplicated 의 keep 파라미터  - keep='first'가 default 값이다
data.duplicated(keep="first") 중복값이 있으면 첫 번째값은 False로 나머지 중복값에 대해서는 True를 반환
data.duplicated(keep="last") keep='last'는 위와 반대
data.duplicated(keep=False) 처음과 끝과 관계없이 중복이면 True

“True는 없다!”


참고자료 :

멋쟁이 사자처럼 AI School 7기 수업내용

728x90

댓글