본문 바로가기
Analysis/Example

스포츠센터 회원 분석 - 데이터 가공, 통계량 파악

by 5ole 2021. 1. 30.

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. 보완점

  • 기간을 줄여 최신 고객 분석 가능
  • 오랫동안 스포츠센터를 이용하는 사람들의 루틴 등을 파악 가능

+ 참고 자료 및 출처

댓글