【第9回】python100本ノック ノック41-45

Python 機械学習

今回は第9回、ノック41〜ノック50までをやっていきたいと思います。
Python実戦データ分析100本ノックは、pandas の使い方やデータサイエンスを実戦的に学べる書籍なのでぜひ手に取ってみてください。

Python実践データ分析100本ノック レビューでも実用的と高評価ですね。

引き続き、スポーツジムの会員データを使って顧客の行動を分析していきます。
4章では数ヶ月利用している顧客の来月の利用回数の予測を行いましたので、5章では退会を防ぐための原因究明を行うための顧客の退会予測を取り扱います。

ノック41:データを読み込んで利用データを整形しよう

import pandas as pd

 

customer = pd.read_csv(‘customer_join.csv’)

 

uselog_months = pd.read_csv(‘use_log_months.csv’)

for 文で当月と1ヶ月前の利用回数を集計します。

year_months = list(uselog_months[“年月”].unique())

 

uselog = pd.DataFrame()

 

for i in range(1, len(year_months)):

 

tmp = uselog_months.loc[uselog_months[“年月”]==year_months[i]]

 

tmp.rename(columns={“count”:”count_0″}, inplace=True)

 

tmp_before = uselog_months.loc[uselog_months[“年月”]==year_months[i-1]]

 

del tmp_before[“年月”]

 

tmp_before.rename(columns={“count”:”count_1″}, inplace=True)

 

tmp = pd.merge(tmp, tmp_before, on=”customer_id”, how=”left”)

 

uselog = pd.concat([uselog, tmp], ignore_index=True)

 

uselog.head()

 

ノック42:退会前月の退会顧客データを作成しよう

退会者は退会月の前月に退会届を出しますので、その前月のデータを解析する事で退会申請を防ぐ目的があります。

from dateutil.relativedelta import relativedelta

 

exit_customer = customer.loc[customer[“is_deleted”]==1]

 

exit_customer[“exit_date”] = None

 

exit_customer[“end_date”] = pd.to_datetime(exit_customer[“end_date”])

 

for i in range(len(exit_customer)):

 

exit_customer[“exit_date”].iloc[i] = exit_customer[“end_date”].iloc[i] – relativedelta(months=1)

 

exit_customer[“年月”] = exit_customer[“exit_date”].dt.strftime(“%Y%m”)

 

uselog[“年月”] = uselog[“年月”].astype(str)

 

exit_uselog = pd.merge(uselog, exit_customer, on=[“customer_id”, “年月”], how=”left”)

 

print(len(uselog))

 

exit_uselog.head()

exit_uselog = exit_uselog.dropna(subset=[“name”])

 

print(len(exit_uselog))

 

print(len(exit_uselog[“customer_id”].unique()))

 

exit_uselog.head()

ノック43:継続顧客のデータを作成しよう

次に継続顧客のデータを作成します。

Name列が欠損しているデータを除去します。

次にcustomer_id が重複しているデータを除去します。

conti_customer = customer.loc[customer[“is_deleted”]==0]

 

conti_uselog = pd.merge(uselog, conti_customer, on=[“customer_id”], how=”left”)

 

print(len(conti_uselog))

 

conti_uselog = conti_uselog.dropna(subset=[“name”])

 

print(len(conti_uselog))

conti_uselog = conti_uselog.sample(frac=1).reset_index(drop=True)

 

conti_uselog = conti_uselog.drop_duplicates(subset=”customer_id”)

 

print(len(conti_uselog))

 

conti_uselog.head()

最後に退会顧客と継続顧客を結合しましょう。

継続と大会の両方が混ざったデータベースを作成しましょう。

predict_data = pd.concat([conti_uselog, exit_uselog],ignore_index=True)

 

print(len(predict_data))

 

predict_data.head()

ノック44:予測する月の在籍期間を作成しよう

在籍期間の作成をして、機械学習に備えましょう。

period列が作成されているのをを確認しましょう。

predict_data[“period”] = 0

 

predict_data[“now_date”] = pd.to_datetime(predict_data[“年月”], format=”%Y%m”)

 

predict_data[“start_date”] = pd.to_datetime(predict_data[“start_date”])

 

for i in range(len(predict_data)):

 

delta = relativedelta(predict_data[“now_date”][i], predict_data[“start_date”][i])

 

predict_data[“period”][i] = int(delta.years*12 + delta.months)

 

predict_data.head()

ノック45:欠損値を除去しよう

まず、欠損値の数を把握しましょう。

predict_data.isna().sum()

end_date, exit_data, count_1に欠損値がありますが、

count_1 に欠損値があるデータのみ除外します。

predict_data = predict_data.dropna(subset=[“count_1”])

 

predict_data.isna().sum()

お疲れ様でした。次回はいよいよ最終回です。ノック46−50をやっていきましょう。

目次に戻る方はこちらまで。