03장 / 고객의 전체 모습을 파악하는 테크닉 10
- 전제조건)
단골 손님과 유령 손님(초반 이용 후 사라지는 손님들)을 구분하자!
이를 위한 데이터셋 종일/주간/야간 - 정기/비정기 회원
--<취급 데이터 4종>----------------
1. use_log.csv : 센터 이용 이력
2. customer_master.csv
3. class_master.csv
4. camgaign_master.csv
- 테크닉21 _ 데이터 읽고 파악하기
import pandas as pd
uselog = pd.read_csv('use_log.csv')
print(len(uselog))
uselog.head()
customer = pd.read_csv('customer_master.csv')
print(len(customer))
customer.head()
class_master = pd.read_csv('calss_master.csv')
print(len(class_master))
class_master.head()
campaign_master = pd.read_csv('campaign_master.csv')
print(len(campaign_master))
campaign_master.head()
테크닉 21에서 살펴본 주요 4가지 데이터를 판다스를 사용하여 불러들려 분석해보기
데이터 분석하고 가공하기 전의 데이터의 전체적 흐름을 파악하는 것이 중요!
- 테크닉22 _ 고객 데이터 가공
# 칼럼끼리 조인하여 데이터 가공
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()
# 결측치 확인
customer_join.isnull().sum()
칼럼끼리의 결합 후 데이터 개수를 파악한다. 이상이 없는 경우 결측치를 확인한다.
- 테크닉23 _ 고객 데이터 집계
# 고객 데이터 집계
customer_join.groupby("class_name").count()["customer_id"]
customer_join.groupby("campaign_name").count()["customer_id"]
customer_join.groupby("gendger").count()["customer_id"]
customer_join.groupby("is_deleted").count()["customer_id"]
# 기간 중 가입인원 출력
customer_join["start_date"] = pd.to_datetime(customer_join["start_date"])
customer_start = customer_join.loc[customer_join["start_date"] > pd.to_date-time("20180401")]
print(len(customer_start))
탈퇴하는 손님들의 특성을 확인하기 위해 특성별로 나누어 고객 데이터를 집계한다.
추가적으로 각각의 특성에 대해 집계를 계속해보자
- 테크닉24 _ 최신 고객 데이터 집계
# 데이터 추출 여부 파악을 위한 유니크 출력
customer_join["end_date"] = pd.to_datetime(customer_join["end_date"])
customer_newer = customer_join.loc[(customer_join["end_date"] >= pd.to_date-time("20190331"))
| customer_join["end_date"].insa())]
print(len(customer_newer))
customer_newer["end_date"].unique()
# 회원/캠페인/성별 별 파악
customer_newer.groupby("class_name").count()["cuntomer_id"]
customer_newer.groupby("campaign_name").count()["customer_id"]
customer_newer.groupby("gender").count()["customer_id"]
탈퇴 회원 분석을 위해 최신 데이터 출력 후 확인
분석 결과 회원 구분과 성별은 큰 영향이 없다. 캠페인은 약간의 영향 존재
심화 분석을 위해 시간적인 요소를 바탕으로 분석 진행.
- 테크닉25 _ 이용 이력 데이터 집계
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()
시간적 요소를 파악하기 위해 [월 이용 회수의 평균값 / 중앙값 / 최댓값 / 최솟값 / 정기적 이용 여부]를 기반으로 고객 데이터 추가. 정기적 이용 여부를 플래그로 추가하여 다시 시행.
- 테크닉26 _ 이용 이력 데이터를 바탕으로 정기 이용 플래그 작성
# 월/일별 구분
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()
월/일별로 구분하여 최댓값이 4이상인 손님을 구분.
- 테크닉27 _ 고객 데이터와 이용 이력 데이터 결합하기
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()
customer_id를 routine_flg와 레프트 조인으로 결합.
- 테크닉28 _ 회원 기간 계산하기
# 기간을 중점으로 원 단위 집계
from dateutil.relativedelta import reletivedelta
customer_join["calc_date"] = customer_join["end_date"]
customer_join]"calc_date"] = customer_join["calc_date"].fillna(pd.te_date-time("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])
날짜비교함수 relativedelta를 사용하여 회원 기간을 원 단위로 계산.
- 테크닉29 _ 고객 행동의 각종 통계량 파악하기
# describe를 활용하여 손님의 각종 통계량 분석
customer_join[["mean", "median", "max", "min"]].describe()
# routine_flg 집계
customer_join.gruopby("routine_flg").count()["customer_id"]
# 회원 기간 분포를 히스토그램으로 표현
import matplotlib.pyplot as plt
%matplotlib inline
plt.hist(customer_join["membership_period"])
손님의 통계량을 히스토그램으로 시각화.
- 테크닉30 _ 탈퇴 회원과 지속회원 차이 파악하기
# 탈퇴회원
customer_end = customer_join.loc[customer_join["is_deleted"] == 1]
customer_end.describe()
# 지속회원
customer_stay = customer_join.loc[customer_join["is_deleted"] == 0]
customer_stay.describe()
탈퇴회원과 지속회원을 비교하면 탈퇴회원의 특성값(이용횟수의 평균값/중앙값/최댓값/최솟값)이 작음.
탈퇴회원과 지속회원가의 데이터 분석을 통해 각 요소별 특성을 확인 할 수 있었다.
04장 / 고객의 행동을 예측하는 테크닉 10
- 전제조건)
3장에 내용에 추가하여 데이터의 경향을 분석하는 내용을 추가.
스포츠 센터 데이터를 바탕으로 진행.
<주요 활용 데이터>
- 테크닉31 _ 데이터 읽고 확인
# 데이터 읽기 + 결측치 확인
import pandas as pd
uselog = pd.read_csv('use_log.csv')
uselog.isnull().sum()
customer = pd.read_csv('customer_join.csv')
customer.isnull().sum()
데이터에 대한 답 데이터가 없으므로 비지도학습인 클러스트링을 이용.
- 테크닉32 _ 클러스트링으로 회원 그룹화
클러스터링을 위해 customer 데이터를 바탕으로 그룹화 진행
# 그룹화를 위한 필요 변수 추출
customer_clustering = customer[["mean", "median", "max", "min", "membership_period"]]
customer_clustering.head()
# K-menas 클러스터링 진행
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
customer_clustering_sc = sc.fit_transform(customer_clustering)
kmeans = KMeans(n_clusters=4, random_state=0)
clusters = kmeans.fit(customer_clustering_sc)
customer_clustering["cluster"] = clusters.labels_
print(customer_clustering["cluster"].unique())
customer_clustering.head()
K-means를 활용하여 그룹화 후 클러스터링 진행. 사이킷런을 통해 표준화 진행 후 4개의 그룹에 데이터 할당.
- 테크닉33 _ 클러스터링 결과 분석
# 클러스터링 결과 분석
customer_clustering.columns = ["월평균값", "월중앙값", "월최댓값", "월최솟값", "회원기간", "cluster"]
customer_clustering.groupby("cluster").count()
# 그룹 평균값 계산
customer_clustering.groupby("cluster").mean()
월평균값, 월중앙값, 월최댓값, 월최솟값, 회원기간에 대하여 각각의 고객 데이터가 어떻게 되는지 분석.
변수의 개수를 조절하여 복잡한 클러스터링 계산도 가능.
- 테크닉34 _ 클러스터링 결과 가시화
5개의 성분을 시각화하기 위해 2차원으로 '차원 축소' 진행
이를 위한 방법으로 '주성분 분석'을 사용하여 결과 가시화.
# 주성분 분석
from sklearn.decomposition import PCA
X = customer_clustering_sc
pca = PCA(n_components=2)
pca.fit(X)
x_pca = pca.transform(X)
pca_df = pd.DataFrame(x_pca)
pca_df["cluster"] = customer_clustering["cluster"]
# 클러스터링 결과 시각화
import matplotlib.pyplot as plt
%matplotlib inline
for i in customer_clustering["cluster"].unique():
tmp = pca_df.loc[pca_df["cluster"]==i]
plot.scatter(tmp[0], tmp[1])
클러스터링 결과를 왼쪽의 그래프처럼 가시화.
색을 다르게 하여 데이터 간의 분명한 차이를 보임.
- 테크닉35 _ 결과 분석을 바탕으로 탈퇴 회원 경항 파악
customer_clustering = pd.concat([customer_clustering, customer], axis=1)
customer_clustering.groupby(["cluster", "is_deleted"], as_index=False.count()[["cluster", "is_deleted", "customer_id"]]
# 회원의 비/정기 이용 여부 파악
customer_clustering.groupby(["cluster", "routine_flg"],as_index=False).count()[["cluster", "routine_flg", "customer_id"]]
탈퇴/비탈퇴 회원 구분 후 정기/비정기 구분을 진행함.
그룹화를 바탕으로 고객의 특징을 파악함. 특징을 분석함으로써 다음 달 이용 횟수 예측 가능.
- 테크닉36 _ 다음달 이용 횟수 예측 데이터 준비
기존 데이터 경향 분석으로 미래 데이터를 예측하기 위해서 '지도학습'의 '회귀 분석' 사용.
다음달 예측을 위해 과거부터 예측 시점 이전 까지의 데이터 수집
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()
과거 6개월 분의 데이터를 결측치 처리함으로써 예측 모델을 위한 데이터셋 준비 완료.
predict_dat = predict_data.dropna()
predict_data = predict_data.reset_index(drop=True)
predict_data.head()
- 테크닉37 _ 특징 변수 추가하기
예측모델에 지대한 영향을 주는 특징 변수를 찾는 것이 중요하다. 36테크닉에서 준비한 데이터셋의 경우,
시계열 데이터가 유효할 가능성이 높다.
- 테크닉38 _ 다음달 이용 횟수 예측 모델 구축
결측치를 제거한 데이터를 바탕으로 예측모델을 구축한다.
'사이킷런'과 '선형회귀모델'로 구현해보자! 이를 위해 데이터를 훈련용/검사용으로 구분한다.
- 테크닉39 _ 모델 기여 변수 확인
coef = pd.DataFrame{"feature_names":X.columns, "coefficient":model.codf_})
coef
모델 설능에 영향을 주는 설정변수 값을 출력하여 모델의 특성을 이해.
- 테크닉40 _ 다음달 이용 횟수 예측하기!
데이터값을 예시로 입력하여 모델이 잘 작동하는 지 확인한다.
이처럼 가공된 데이터를 활용하고 분석하여 예측모델을 구현했다.