1. 전제조건
(1) 3가지의 회원권 종류
- 종일회원 : 언제든 사용할 수 있음
- 주간회원 : 낮에만 사용가능
- 야간회원 : 밤에만 사용가능
(2) 입회비
- 일반적으로는 입회비 비용 있음
- 비정기적으로 입회비 반액할인 이벤트나 무료 이벤트 시행
(3) 탈퇴
- 월말까지 신청하면 다음달 말에 탈퇴가 됨
2. 데이터 정보
- use_log.csv : 센터 이용 이력 - 시스템 자동 입력 (2018.04 ~ 2019.03)
(log_id, customer_id, usedate)
- customer_master.csv : 2019.3월 말 데이터 - 이전에 탈퇴한 회원도 포함되어 있음
(customer_id, name, class, gender, start_date, end_date, campaign_id, is_deleted)
- class_master.csv : 회원 구분 데이터(종일, 주간, 야간)
(class, class_name, price)
- campaign_master.csv : 가입 시 행사 종류 데이터(입회비)
(campaign_id, campaign_name)
import os
import pandas as pd
import matplotlib.pyplot as plt
os.chdir('C:\\Users\\leeso\\Downloads\\pyda100-master\\3장')
use_log=pd.read_csv('use_log.csv')
customer_master=pd.read_csv('customer_master.csv')
class_master=pd.read_csv('class_master.csv')
campaign_master = pd.read_csv('campaign_master.csv')
3. 데이터 준비
(1) 고객 데이터
- join한 다음에는 isnull().sum() 으로 조인이 잘 되었는지 확인
customer_join = pd.merge(customer_master, class_master, on='class', how='left')
customer_join = pd.merge(customer_join, campaign_master, on='campaign_id', how='left')
customer_join.isnull().sum()
(2) 이용 이력 데이터
- 이용연월 나타내는 열 생성 'Ym'
- 월별 고객 이용이력 통계테이블 생성
use_log['usedate']=pd.to_datetime(use_log['usedate'])
use_log['Ym']=use_log['usedate'].dt.strftime('%Y%m')
#월별 고객 이용량
ym_customer_count=use_log.groupby(['Ym','customer_id'],as_index=False).count().drop('usedate',axis=1)
ym_customer_count.rename(columns={'log_id':'count'},inplace=True)
#통계량
ym_customer_agg=ym_customer_count.groupby('customer_id').agg(['min','max','mean','median'])['count']
ym_customer_agg = ym_customer_agg.reset_index(drop=False)
4. 데이터 가공
(1) 고객 요일별 이용량
- 고객별로 가장 많이 오는 요일 집계 -> 스포츠센터인만큼 고객별로 방문하는 루틴이 있을 것
- 하나의 요일에 4번 이상 방문시, 루틴 요일로 설정 = 1 (보완 필요한 부분)
- 0~6까지 월요일~일요일
#요일별 집계
use_log['weekday'] = use_log['usedate'].dt.weekday
use_log_weekday = use_log.groupby(['customer_id','Ym','weekday'],as_index=False).count()
del use_log_weekday['log_id']
use_log_weekday.rename(columns={'usedate':'count'},inplace=True)
#많이 방문한 요일에 1부여 후 루틴이 있는지 확인
use_log_weekday=use_log_weekday.groupby('customer_id',as_index=False).max()[['customer_id','count']]
use_log_weekday['routine']=0
use_log_weekday['routine'] = use_log_weekday['routine'].where(use_log_weekday['count']<4,1)
(2) 고객데이터와 통계량, 요일별 이용량 테이블 조인
customer_join2 = pd.merge(customer_join,ym_customer_agg,on='customer_id',how='left')
customer_join3 = pd.merge(customer_join2, use_log_weekday[['customer_id','routine']], on='customer_id', how='left')
customer_join3.isnull().sum()
5. 데이터 분석
(1) 월별로 회원기간 계산
- 탈퇴하지 않은 회원은 탈퇴날짜를 2019/04/30로 임의 설정
- ( 너무 기간을 크게할시에 그림이 안그려지며 다음달까지는 존재함이 확실하므로 )
- relativedelta 함수 사용
# 탈퇴기간 정의
customer['calc_date']=customer['end_date']
customer['calc_date']= customer['calc_date'].fillna(pd.to_datetime('2019/04/30'))
# 월단위로 회원기간 산정
from dateutil.relativedelta import relativedelta
customer['customer_period']=0
for cus in range(len(customer)) :
delta_days = relativedelta(customer['calc_date'].iloc[cus], customer['start_date'].iloc[cus])
customer['customer_period'].iloc[cus] = delta_days.years*12 + delta_days.months #월단위계산
(2) 각종 통계량
- 매월 평균 이용 횟수의 평균으로 주로 1인당 한달에 5번씩 방문함을 알 수 있음
stat_table=customer.describe()[['min','max','mean','median']]
- 요일 루틴을 가지고 스포츠센터에 오는 사람들이 대부분
customer.groupby('routine').count()['customer_id']
- 회원 기간의 분포
10개월 이내로 그만두는 사람이 많음 > 짧은 기간에 고객이 빠져나가는 업계
plt.hist(customer['customer_period'])
- 탈퇴회원과 지속회원의 차이
- 매월 이용횟수의 최소값, 최대값, 평균, 중앙값 모두 지속회원보다 탈퇴회원이 적음
- 루틴 또한 지속회원이 주로 있다.
customer_end = customer.loc[customer['is_deleted']==1]
customer_stay = customer.loc[customer['is_deleted']==0]
table_end=customer_end.describe()
table_stay=customer_stay.describe()
6. 보완점
- 기간을 줄여 최신 고객 분석 가능
- 오랫동안 스포츠센터를 이용하는 사람들의 루틴 등을 파악 가능
+ 참고 자료 및 출처
- 책 <파이썬 데이터 분석 실무 테크닉 100>
- 데이터 github.com/wikibook/pyda100
'Analysis > Example' 카테고리의 다른 글
물류 데이터 분석 - 데이터 가공, 통계량 파악 (0) | 2021.02.15 |
---|---|
스포츠센터 회원 분석 - 의사결정나무 (0) | 2021.02.07 |
스포츠센터 회원 분석 - 클러스터링, 회귀분석 (0) | 2021.01.30 |
대리점 데이터 분석 (0) | 2021.01.29 |
간단한 매출 데이터 분석 (2) | 2021.01.28 |
댓글