Today I Learned

비즈니스 분석 (1) #ARPU #ARPPU

by Holly Yoon

TIL

1. 중요한 지표

  • 비즈니스의 전략 : 회원가입에 집중? 돈을 쓰는 고객에 집중? 신규 고객 유치에 집중?
  • 서비스별 전략 : 구독 서비스라면 "이탈률"이 중요한 지표가 될 수 있음
  • 고객 분석, 재고 관리, 가격 설정, 추천 시스템, 사기탐지

2. 코호트 분석

  • 앱 가입 날짜, 첫 구매 월, 위치, 획득 채널(유기 사용자, 공연 마케팅에서 오는 것 등) 등과 같은 공통점을 공유하는 사람들의 그룹을 시간 경과에 따라 추적하여 몇 가지 일반적인 패턴 또는 행동을 식별하는 분석법
  • 현 상황을 보다 정확하게 이해하여 이를 의사결정에 활용하기 위해 '특정 기간에 특정 특성/경험을 공유하는 사용자 집단(코호트)' 간의 행동 패턴을 비교, 분석
  • 분석 전 데이터 세트의 데이터를 관련 그룹으로 나누어 분석할 수 있다.
    • 시간 집단 : 특정 기간동안 제품이나 서비스에 가입한 고객
    • 행동 집단 : 과거에 제품을 구매했거나 서비스에 가입한 고객
    • 규모집단 : 회사 제품이나 서비스를 구매하는 다양한 규모의 고객

3. 리텐션 분석

  • 고객이 이탈하는 방법과 이유를 이해하기 위해 사용자 메트릭을 분석하는 과정
  • 같은 기간에 앱 설치를 경험한 사용자 그룹이 시간이 지남에 따라 앱의 꾸준한 사용 여부(Retention)를 분석

4. AARRR

  • 시장 진입 단계에 맞는 특정 지표를 기준으로 우리 서비스 상태를 가늠할 수 있는 효율적 기준
  • 수많은 데이터 중 현 시점에서 가장 핵심적인 지표에 집중할 수 있게 하며, 분석할 리소스가 충분하지 않은 스타트 기업 등에게 매력적인 프레임워크

5. 파이썬 실습

# describe 를 통해 object 타입의 기술통계 구하기
df.select_dtypes(include=['object']).describe()
df.describe(include='O')

# 결측치 시각화
import matplotlib.pyplot as plt
null_pct = df.isnull().mean() * 100
plt.figure(figsize=(12, 4))
null_pct.plot(kind='bar')
plt.show()

#파생변수
df["TotalPrice"] = df['Quantity'] * df['UnitPrice']

#매출 합계의 상위 10개 국가
df.groupby("Country")["TotalPrice"].agg(["mean", "sum"]).nlargest(10, 'sum').style.format('{:,.0f}')
#df.loc[조건, 열]
stock_desc=df.loc[df['StockCode'].isin(stock_sale.index), ['StockCode','Description']]
#중복된 StockCode 삭제
stock_desc=stock_desc.drop_duplicates('StockCode').set_index('StockCode')
stock_sale['Desc']=stock_desc
stock_desc
  • 고객 취소 비율 구하기
df['Cancel'] = df['Quantity']<0
#고객별 취소빈도가 높은 Top10
df.groupby('CustomerID')['Cancel'].value_counts().unstack().nlargest(10, True)
#제품별 구매취소 비율
cancel_stock = df.groupby(["StockCode"]).agg({"InvoiceNo":"count", "Cancel": "mean"})
cancel_stock.nlargest(10, "InvoiceNo")
#국가별 구매취소 비율
cancel_country = df.groupby(['Country']).agg({'InvoiceNo':'count', 'Cancel':'mean'})
cancel_country.nlargest(10, 'InvoiceNo')
  • 날짜/시간 파생변수 만들기
df["InvoiceDate"] = pd.to_datetime(df['InvoiceDate'])
df["InvoiceYear"] = df['InvoiceDate'].dt.year
df["InvoiceMonth"] = df['InvoiceDate'].dt.month
df["InvoiceDay"] = df['InvoiceDate'].dt.day
df["InvoiceDow"] = df['InvoiceDate'].dt.dayofweek
df["InvoiceYM"] = df['InvoiceDate'].astype(str).str[:7]
df.hist(figsize=(10,10))
  • 요일별 구매/취소 빈도수 시각화
day_name = list('월화수목금토일')
df['InvoiceDow_kr']=df['InvoiceDow'].apply(lambda x : day_name[x])
df = df.sort_values(by='InvoiceDow', ascending=True)
sns.countplot(data=df, x='InvoiceDow_kr', hue='Cancel')
  • 시간대별 빈도수
df['InvoiceHour']=df['InvoiceDate'].astype(str).str[10:13]
df = df.sort_values(by='InvoiceHour')
#pointplot
sns.pointplot(data=df, x='InvoiceHour', y='TotalPrice', errorbar=None, estimator=len).set_title('시간대별 빈도수')
#barplot
df['InvoiceHour'].value_counts().sort_index().plot(figsize=(13,6), kind='bar')

  • 요일+시간대 시각화
day_name2 = list('월화수목금일')
hour_dow = pd.crosstab(df['InvoiceHour'],df['InvoiceDow'])
hour_dow.columns = day_name2

#subplot
hour_dow.plot(subplots=True)

#heatmap
plt.figure(figsize=(10,6))
sns.heatmap(hour_dow, cmap='Greens', annot=True, fmt=',.0f')

  • ARPU, ARPPU구하기
    • ARPU는 Average Revenue Per User의 약어로, 평균적으로 한 유저가 얼마의 수익을 회사에 가져다 주는지를 나타내는 지표입니다. 단위 시간당, 일, 월 등으로 계산할 수 있습니다.
    • ARPPU는 Average Revenue Per Paying User의 약어로, 평균적으로 한 유저가 지불한 금액을 나타내는 지표입니다. 월 단위로 계산합니다.
#고객 ID가 없거나, 취소 주문을 제외
df_valid = df[df['CustomerID'].notnull() & (df['Quantity']>0) & df['UnitPrice']>0].copy()
df_valid = df_valid.drop_duplicates().copy()
df_valid.shape
#arpu
df['TotalPrice'].sum()/df['CustomerID'].nunique()
#arppu
arppu = df_valid.groupby('InvoiceYM').agg({'TotalPrice':'sum', 'CustomerID':'nunique'})

'TIL' 카테고리의 다른 글

[TIL] 프로그래머스 SQL 끗  (0) 2023.03.16
github 시작하기  (0) 2023.03.02
대용량 파일 관리 - parquet, downcast  (0) 2023.02.27
[TIL] 내용수집 함수만들기 (pandas)  (0) 2023.01.19
[TIL] 네이버 종목토론실 스크래핑  (0) 2023.01.12

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기