해당 내용은 멋쟁이사자처럼 AI School 오늘코드 박조은 강사의 자료입니다.
요일별 빈도수
# countplot 으로 요일별( InvoiceDow ) 구매 빈도수 시각화합니다.
sns.countplot(data=df, x="InvoiceDow")
# countplot으로 요일별( InvoiceDow ) 구매와 취소 빈도수 시각화합니다.
# hue 옵션을 사용하면 특정 컬럼을 지정해서 표기할 수 있습니다.
# hue="Cancel" 로 취소여부도 함께 봅니다.
sns.countplot(data=df, x="InvoiceDow", hue="Cancel")
# countplot으로 요일별( InvoiceDow ) 구매 **취소** 빈도수 시각화합니다.
# df["Cancel"] == True 인 데이터로 구매 취소된 값만 추출합니다.
plt.title("요일 별 구매 취소")
sns.countplot(data=df[df["Cancel"] == True], x="InvoiceDow")
# 리스트컴프리헨션(List comprehension)을 통해 "월~일"요일 문자열을 리스트로 만듭니다.
# 리스트컴프리헨션(List comprehension)은 리스트 내부에서 반복문을 작성하여 반복하는 형식입니다.
# "월화수목금토일" 을 ['월', '화', '수', '목', '금', '토', '일'] 로 만듭니다.
day_name = [w for w in "월화수목금토일"]
day_name
['월', '화', '수', '목', '금', '토', '일']
# 데이터를 보면 토요일이 없음
day_name.remove("토")
day_name
['월', '화', '수', '목', '금', '일']
# value_counts()로 요일별( InvoiceDow ) 구매 빈도수를 구합니다.
dow_count = df["InvoiceDow"].value_counts().sort_index()
dow_count.index = day_name
dow_count
월 95111
화 101808
수 94565
목 103857
금 82193
일 64375
Name: InvoiceDow, dtype: int64
dow_count.plot.bar(rot=0)
# countplot으로 시간대( InvoiceHour ) 구매 빈도수를 시각화합니다.
plt.figure(figsize=(12, 4))
sns.countplot(data=df, x="InvoiceHour")
포인트플롯 pointplot
- 개수를 꺾은선 그래프로 시각화
# pointplot 으로 시간대( InvoiceHour ) 구매 빈도수를 시각화합니다.
# y에는 숫자 자료형만 들어가야함, estimator=len or count(개수), errorbar(ci) 제외하고 그리기
plt.figure(figsize=(12, 4))
sns.pointplot(data=df, x="InvoiceHour", y="TotalPrice", estimator=len, errorbar=None)
시간-요일별 빈도수
# 시간별( InvoiceHour ), 요일별( InvoiceDow )로 crosstab 을 통해 구매 빈도수 구합니다.
hour_dow = pd.crosstab(index=df["InvoiceHour"], columns=df["InvoiceDow"])
hour_dow.columns = day_name
hour_dow
.style.background_gradient() 통해서 시각화합니다. (.format("{:,}") 참고
hour_dow.style.background_gradient().format("{:,}")
# 시간별_요열별 구매 주문 시각화
plt.figure(figsize=(10, 8))
sns.heatmap(hour_dow, annot=True, cmap="Purples", fmt=",.0f")
- fmt: fotmat의 약자
heatmap 은 전체를 기준으로 색칠되고, background_gradient 는 컬럼별로 색칠된다.
- pandas 의 background_gradient() => 변수마다 성질이 다를 때, 각 변수별로 스케일값을 표현
- seaborn 의 heatmap() => 같은 성질의 변수를 비교할 때, 전체 수치데이터로 스케일값을 표현
# 시간별_요열별 구매 주문 시각화
hour_dow.plot.area(figsize=(12,4))
-> 광고를 집행한다면 오후 12시나 오후 3시가 적당해보인다
- 2시에는 주문 수가 약간 감소하는 편
고객 분석
- ARPU(Average Revenue Per User) :
- 가입한 서비스에 대해 가입자 1명이 특정 기간 동안 지출한 평균 금액
- ARPU = 매출 / 중복을 제외한 순수 활동 사용자 수
- ARPPU(Average Revenue Per Paying User):
- 지불 유저 1명 당 한 달에 결제하는 평균 금액을 산정한 수치
# ARPPU - CustomerID 를 사용할 때는 count가 아닌 nunique 를 사용합니다. 중복 방지를 위해 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