**해당 데이터는 제가 학원 강의를 수료하며 받은 데이터이며 원본 데이터는 기업으로부터 제공받은 데이터라서 공유할 수 없습니다.
**본문은 공부를 하며 과정을 이해하며 생각하기 위함이니 참고 해주시면 감사드리겠습니다.
## Environment : Anaconda-navigator
## Programming Language : Python 3
## Import Pandas as pd
## import Numpy as np
## import seaborn as sns
## import matplotlib as mpl
## import matplotlib pyplot as plte
## Data provided by DS school & Origin data from Noom.
## Noom is a company that mentioned as below.
눔(Noom Inc.)은 모바일 플랫폼을 통해 건강관리 서비스를 제공하는 회사로서 2008년, 정세주 대표와 구글 수석 엔지니어 출신이자 공동창업자인 아텀 페타코브(Artem Petakov)에 의해 설립되었습니다. 눔(Noom)은 미국, 일본, 독일, 한국 등 14개국에서 4,600만명이 가입한 글로벌 서비스로 성장하였고, 2009년과 2010년 연이어 구글(Google) 이 선정한 가장 혁신적인 개발 스타트업 중 하나로 선정되었습니다.
Target
- 데이터를 불러오기 및 전반적인 정보 확인
- 불러온 데이터들을 전처리
- 데이터 분석
이전 글 데이터를 가지고 날짜와 요일 / 시간별 결제 / 캔슬 / 환불 비율을 구해보겠습니다.
이번에는 시간 정보를 기준으로 결제/캔슬/환불 비율을 알아보겠습니다. 크게 다음의 상황에 따른 구매 여부를 알고 싶습니다.
- 시간별 구매 현황(0시 ~ 23시)
- 요일별 구매 현황(월요일 ~ 일요일)
마케팅팀이 이 정보를 파악할 수 있다면, 1) 전환율이 높은 시기에 마케팅 예산 투입 비중을 줄이고/늘려서 CAC를 낮추거나, 2) 특정 시간대에 눔 코치의 유로 서비스를 아직 구매하지 않은 무료 사용자에게 유료 서비스 구매를 유도하는 메일을 보내서 매출을 늘릴 것입니다.
크게 다음의 내용을 구해보겠습니다.
- 0시 ~ 23시 사이의 결제/캔슬/환불 비율.
- 월요일-일요일 사이의 결제/캔슬/환불 비율.
구매 시점을 확인할 수 있는 컬럼인 Purchased At을 이용하여 시간대별 데이터를 확인해보겠습니다.
clean_data['Purchased At(hour)'] = clean_data['Purchased At'].dt.hour # 시간 확인용 컬럼 생성
clean_data[['Purchased At(hour)', 'Purchased At']].head() # 기존 & 새로 생성된 컬럼 확인
시간을 확인할 수 있는 컬럼은 생성되었고 이제 시간대별 비율을 확인해보겠습니다.
# pivot_table을 사용하여 index(세로)에는 Purchased At(hour)를 넣어주고,
# Columns(가로)에는 Status를 넣어줍니다
# 여기서 fill_value에 0을 넣어줘야, 데이터가 없을 경우 NaN이 아닌 0이 나옵니다
# 그리고 aggfunc에 len 를 넣어주면 cancelled, completed, refunded의 누적 개수가 나옵니다
table_by_hours = pd.pivot_table(clean_data,
index='Purchased At(hour)',
columns='Status',
values='Gender',
fill_value=0,
aggfunc=len)
# completed, cancelled, refunded의 총 인원 수를 더해서 total이라는 새로운 컬럼을 추가합니다
table_by_hours["total"] = table_by_hours["completed"] + table_by_hours["cancelled"] + table_by_hours["refunded"]
# 위에서 추가한 total이라는 컬럼으로 completed(결제 완료) 컬럼을 나누면 결제 확률, 전환율(Conversion)이 나옵니다
table_by_hours["conversion"] = table_by_hours["completed"] / table_by_hours["total"]
# 결과를 확인합니다
table_by_hours
위 데이터를 기반으로 전환율을 시각화 해보겠습니다.
# 그래프 전체 사이즈 설정합니다
plt.figure(figsize=[20,5])
# y축의 최소/최대값을 0/1로 고정합니다
plt.ylim(0, 1)
# 시간대별 전환율(conversion)을 시각화 합니다
sns.pointplot(data = table_by_hours.reset_index(), x='Purchased At(hour)', y='conversion')
위 데이터를 기반으로 결제 확률을 시각화 해보겠습니다.
# 그래프 전체 사이즈 설정합니다
plt.figure(figsize=[20,5])
# 시간대별 구매율(completed)을 시각화 합니다
sns.pointplot(data = table_by_hours.reset_index(), x='Purchased At(hour)', y='completed')
분석 결과는 다음과 같습니다.
- 아쉽게도, 구매 시간별 전환율(conversion)은 큰 차이가 없어 보입니다, 그 의미는 특정 시간대에 구매한 사용자들이 서비스를 이탈할 확률이 높아지거나 낮아지는 현상은 없다고 볼 수 있습니다.
- 다만 전환율과는 별개로, 주로 점심시간(10시 ~ 12시)나 새벽(23시 ~ 24시)에 구매량이 대폭 늘어난다는 것을 알 수 있습니다. 만일 광고 예산을 집행한다면 이 시기에 집중적으로 집행하거나, 무료 사용자에게 유료 사용자로 전환을 유도하는 이메일을 보냄으로써 전환율을 높이는 것은 시도해볼만 합니다.
이번에는 월요일-일요일 사이의 결제/캔슬/환불 비율을 확인해보겠습니다.
시간대를 구하는 방식과 동일하게 요일 컬럼을 생성해줍니다.
clean_data['Purchased At(weekday)'] = clean_data['Purchased At'].dt.day_name() # 요일 확인용 컬럼 생성
clean_data[['Purchased At(weekday)', 'Purchased At']].head() # 기존 & 새로 생성된 컬럼 확인
요일을 확인할 수 있는 컬럼은 생성되었고 이제 요일별 비율을 확인해보겠습니다.
# pivot_table을 사용하여 index(세로)에는 Purchased At(weekday)를 넣어주고,
# Columns(가로)에는 Status를 넣어줍니다
# 여기서 fill_value에 0을 넣어줘야, 데이터가 없을 경우 NaN이 아닌 0이 나옵니다
# 그리고 aggfunc에 len 를 넣어주면 cancelled, completed, refunded의 누적 개수가 나옵니다
table_by_week = pd.pivot_table(clean_data,
index='Purchased At(weekday)',
columns="Status",
values="Gender",
fill_value=0,
aggfunc=len)
# completed, cancelled, refunded의 총 인원 수를 더해서 total이라는 새로운 컬럼을 추가합니다
table_by_week["total"] = table_by_week["completed"] + table_by_week["cancelled"] + table_by_week["refunded"]
# 위에서 추가한 total이라는 컬럼으로 completed(결제 완료) 컬럼을 나누면 결제 확률, 전환율(Conversion)이 나옵니다
table_by_week["conversion"] = table_by_week["completed"] / table_by_week["total"]
# 컬럼 정렬을 위해 새로운 변수를 생성합니다
week_columns = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
# 결과를 확인합니다
table_by_week.loc[week_columns]
위 데이터를 기반으로 전환율을 시각화 해보겠습니다.
# 가로를 18인치, 세로를 4인치로 조절합니다
plt.figure(figsize=[18,4])
# y축의 최소/최대값을 0/1로 고정합니다
plt.ylim(0, 1)
# 이전에 피벗테이블로 분석한 결과를 pointplot으로 시각화합니다
# X축은 구매 요일(Purchased At(weekday))을, y축은 전환율(conversion)을 측정합니다
sns.pointplot(data=table_by_week.reset_index(), x="Purchased At(weekday)",\
y="conversion", order = week_columns)
위 데이터를 기반으로 결제 확률을 시각화 해보겠습니다.
# 가로를 18인치, 세로를 4인치로 조절합니다.
plt.figure(figsize=[18,4])
# 이전에 피벗테이블로 분석한 결과를 pointplot으로 시각화합니다
# X축은 구매 요일(Purchased At(weekday))을, y축은 구매 완료율 (completed)를 측정합니다
sns.pointplot(data=table_by_week.reset_index(), x="Purchased At(weekday)",\
y="completed", order = week_columns)
분석 결과는 다음과 같습니다.
- 구매 시간과 마찬가지로, 구매 요일별 전환율(conversion)은 큰 차이가 없어 보입니다. 어느 요일이나 마찬가지로, 구매한 사람이 서비스를 이탈하거나 남을 확률은 거의 동일합니다.
- 하지만 사용자들은 전반적으로 주말(금-일)이 다가올수록 구매를 덜 하게되고, 주중(월-수)이 다가올수록 구매를 많이 하게 되는 현상을 발견할 수 있습니다. 이 시기에 광고 예산을 크게 집행하거나, 구매를 유도하는 메일이나 모바일 노티피케이션을 보내는 것은 좋은 아이디어입니다.
다음 페이지에서는 본 환경을 이어서 분석을 진행하도록 하겠습니다.
*** 본 페이지는 본인의 공부를 위해 작성되었으며, 협찬이나 문의를 받고 기재한 내용이 아닙니다. 혹시 문의사항이 있으시거나 문제가 될 경우 연락 주시기 바랍니다.***
'데이터 분석 > Python - 정리하자' 카테고리의 다른 글
직무교육 스타트업 데이터로 전처리 (1) | 2024.07.09 |
---|---|
마케팅 채널별 결제/캔슬/환불 비율 구하기 (0) | 2024.07.08 |
결제 / 캔슬 / 환불의 총 인원 수와 비율 구해보기 (2) | 2024.07.07 |
VIP 찾기 데이터 분석 (0) | 2024.07.07 |
건강관리 현업 데이터로 전처리 (0) | 2024.07.06 |