</p
3장 고객의 전체 모습을 파악하는 테크닉 10¶
데이터 분석의 묘미는 미래를 예측하는 것이다.
현재 데이터로 미래를 예측하여 최적의 정책을 실시할 수 있게 하는 것이다.
미래를 예측하는 방법은 다양하다.
데이터를 시각화하는 것만으로도 많은 정보를 얻을 수 있어서 분석 엔지니어는 적절한 데이터 가공 기술을 구사한다.
이 장에서는 머신러닝을 위한 데이터 가공 기술을 배운다.
VoC, 전제조건¶
VoC : 운영하는 스포츠 센터는 트레이닝 붐 덕에 고객 수가 늘었다. 그러나 최근 1년간 고객 수가 늘지 않았다. 자주 이용하는 고객은 있으나 가끔 오는 고객은 어느 새 오지 않는 경우가 생기는 것 같다. 제대로 데이터 분석을 하면 원인을 알 수 있을까?
전제조건 :
- 스포츠 센터에는 언제는 사용 가능한 종일 회원, 낮에만 사용 가능한 주간 회원, 밤에만 사용 가능한 야간회원으로 3종류의 회원 구분이 있다.
- 보통 입회비가 있고, 비정기적으로 입회비 반액 할인이나 무료 행사를 진행하여 신규회원을 늘렸다. 탈퇴는 월말까지 신청하면 다음 달 말에 탈퇴 된다.
- 취급 데이터는 4종류이고 테이블로 나타난다.
- use_log.csv : 센터 이용 이력, 2018년 4월부터 2019년 3월까지
- customer_master.csv : 2019년 3월 말 시점의 회원 데이터, 이전 탈퇴회원 포함
- class_master.csv, campaign_master.csv : 회원구분, 가입 시 행사 종류 데이터
데이터 읽기¶
In [63]:
import pandas as pd
In [64]:
uselog = pd.read_csv('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/3장/use_log.csv')
uselog.head()
Out[64]:
In [65]:
customer = pd.read_csv('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/3장/customer_master.csv')
customer.head()
Out[65]:
In [66]:
class_master = pd.read_csv('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/3장/class_master.csv')
class_master.head()
Out[66]:
In [67]:
campaign_master = pd.read_csv('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/3장/campaign_master.csv')
campaign_master.head()
Out[67]:
분석을 위한 데이터 가공 전, 기준 데이터를 정해야한다. uselog와 customer 자료를 사용하여 가공 가능하다.
In [68]:
len(uselog)
Out[68]:
In [69]:
len(customer)
Out[69]:
In [70]:
customer_join = pd.merge(customer, class_master,on='class', how='left')
customer_join = pd.merge(customer_join, campaign_master,on='campaign_id', how='left')
customer_join.head()
Out[70]:
In [71]:
len(customer_join)
Out[71]:
In [72]:
customer_join.isnull().sum() # 결측치 확인
Out[72]:
In [73]:
customer_join.groupby("class_name").count()['customer_id']
Out[73]:
In [74]:
customer_join.groupby('campaign_name').count()['customer_id']
Out[74]:
In [75]:
customer_join.groupby('gender').count()['customer_id']
Out[75]:
In [76]:
customer_join.groupby('is_deleted').count()['customer_id']
Out[76]:
2018/04/01 이후부터 2019/03/31일까지 가입인원 집계
In [77]:
customer_join['start_date'] = pd.to_datetime(customer_join['start_date'])
customer_start = customer_join.loc[customer_join['start_date']>pd.to_datetime('20180401')]
len(customer_start)
Out[77]:
최신 고객 집계¶
가장 최근(2019년 3월) 고객 데이터 파악하기
In [78]:
customer_join['end_date'] = pd.to_datetime(customer_join['end_date'])
customer_newer = customer_join.loc[(customer_join["end_date"]>=pd.to_datetime('20190331'))|(customer_join['end_date'].isna())]
len(customer_newer)
Out[78]:
In [79]:
customer_newer['end_date'].unique() #검산
Out[79]:
In [79]:
In [80]:
customer_newer.groupby('campaign_name').count()['customer_id']
Out[80]:
In [81]:
customer_newer.groupby('gender').count()['customer_id']
Out[81]:
In [82]:
half = (customer_join.groupby('campaign_name').count()['customer_id'][0]/customer_join['customer_id'].count())*100
In [83]:
free = (customer_join.groupby('campaign_name').count()['customer_id'][1]/customer_join['customer_id'].count())*100
In [84]:
common = (customer_join.groupby('campaign_name').count()['customer_id'][2]/customer_join['customer_id'].count())*100
In [85]:
print(half+free+common)
print(half, free, common)
이용 이력 데이터 집계¶
월 이용 횟수 평균, 중앙, 최대, 최소 등을 집계
In [86]:
uselog['usedate'] = pd.to_datetime(uselog['usedate'])
uselog['연월'] = uselog['usedate'].dt.strftime('%Y%m')
uselog_months = uselog.groupby(['연월', 'customer_id'], as_index=False).count()
uselog_months.rename(columns={'log_id':'count'}, inplace=True)
del uselog_months['usedate']
uselog_months.head()
Out[86]:
In [87]:
uselog_customer = uselog_months.groupby('customer_id').agg(['mean', 'median', 'max', 'min'])['count']
uselog_customer = uselog_customer.reset_index(drop=False)
uselog_customer.head()
Out[87]:
이용 이력 데이터로부터 정기 이용 플래그 작성¶
매주 같은 요일에 오는 고객들을 정기적이라고 판단.
최댓값이 4이상인 요일이 있으면 플래그 1로 처리
먼저, 고객마다 월/요일별로 집계
In [88]:
uselog['weekday'] = uselog['usedate'].dt.weekday
uselog_weekday = uselog.groupby(['customer_id', '연월', 'weekday'], as_index=False).count()[['customer_id', '연월', 'weekday', 'log_id']]
uselog_weekday.rename(columns={'log_id':'count'}, inplace=True)
uselog_weekday.head()
Out[88]:
In [89]:
uselog_weekday = uselog_weekday.groupby('customer_id', as_index=False).max()[['customer_id', 'count']]
uselog_weekday['routine_flg'] = 0
uselog_weekday['routine_flg'] = uselog_weekday['routine_flg'].where(uselog_weekday['count']<4, 1)
uselog_weekday.head()
Out[89]:
고객 데이터와 이용 이력 데이터 결합¶
uselog_customer, uselog_weekday, customer_join 결합
In [90]:
customer_join = pd.merge(customer_join, uselog_customer, on='customer_id', how='left')
customer_join = pd.merge(customer_join, uselog_weekday[['customer_id', 'routine_flg']], on='customer_id', how='left')
customer_join.head()
customer_join.isnull().sum()
Out[90]:
회원 기간 계산¶
기간은 start_date-end_date
이다. 그러나 탈퇴하지 않은 회원은 end_date가 결측값이기 때문에 값 수정이 필요하다.
In [91]:
from dateutil.relativedelta import relativedelta
customer_join['calc_date'] = customer_join['end_date']
customer_join['calc_date'] = customer_join['calc_date'].fillna(pd.to_datetime('20190430'))
customer_join['membership_period'] = 0
for i in range(len(customer_join)):
delta = relativedelta(customer_join['calc_date'].iloc[i], customer_join['start_date'].iloc[i])
customer_join['membership_period'].iloc[i] = delta.years*12+delta.months
customer_join.head()
Out[91]:
고객 행동의 각종 통계량 파악¶
In [92]:
customer_join[['mean','median','max','min']].describe()
Out[92]:
In [93]:
customer_join.groupby('routine_flg').count()['customer_id']
Out[93]:
In [94]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.hist(customer_join['membership_period'])
Out[94]:
탈퇴 회원과 지속 회원의 차이¶
In [95]:
customer_end = customer_join.loc[customer_join['is_deleted']==1]
customer_end.describe()
Out[95]:
In [96]:
customer_end = customer_join.loc[customer_join['is_deleted']==0]
customer_end.describe()
Out[96]:
In [ ]:
'Machine Learning > Statistics' 카테고리의 다른 글
파이썬 데이터분석 실무 테크닉 100 - 6장 (1) | 2021.07.01 |
---|---|
파이썬 데이터분석 실무 테크닉 100 - 5장 (1) | 2021.03.03 |
파이썬 데이터분석 실무 테크닉 100 - 4장 (0) | 2021.01.07 |
파이썬 데이터 분석 실무 테크닉 100 - 2장 (0) | 2020.12.07 |
파이썬 데이터분석 실무 테크닉 100 - 1장 (0) | 2020.11.30 |