はじめに
お疲れさまです。
本日は、Python実践データ分析100本ノック ・第5章の解説します。
使用している環境は以下のとおりです。
実行環境:Google Colaboratory
言語:Pytohn3.12
OS:macOS
よろしくお願いいたします!
ノック41本目:データの読み込みと整形
import pandas as pd
customer = pd.read_csv('/content/customer_join.csv')
uselog_months = pd.read_csv('/content/use_log_months.csv')
5章では、ジムの利用者データについて分析をしています。
まずはcustomer_join.csvとuse_log_months.csvを取り込みます。
customer_join.csvの中身はこんな感じです。


会員区分やキャンペーン区分など詳細な会員データが入っているファイルみたいですね。
use_log_month.csvはこちらです。

ジムの利用履歴データみたいです。
ここからは、当月と過去1ヶ月の利用回数を集計したデータを作成します。
year_months = list(uselog_months['年月'].unique())
uselog = pd.DataFrame()
まず、uselog_monthsのデータフレームから年月(カラム名)のデータを取得します。
続いて、uselog = pd.DataFrame()で当月と前月のデータを統合したデータを格納する空のデータフレームを用意します。
for i in range(1,len(year_months)):
tmp = uselog_months.loc[uselog_months["年月"]==year_months[i]].copy()
tmp.rename(columns={"count":"count_0"},inplace=True)
tmp_before = uselog_months.loc[uselog_months["年月"]==year_months[i-1]].copy()
del tmp_before["年月"]
tmp_before.rename(columns={"count":"count_1"},inplace=True)
当月分のデータを入れ込んでいきます。
for文ですが、最初の月には前月データがないため、1からループを開始します。
uselog_months.loc[uselog_months[“年月”]==year_months[i]].copy()は、
uselog_monthsの中から、年月のカラムのデータが特定の月と一致する行だけを取り出します。
最後にcount 列をcount_0に名前変更します。
続いて先月分のデータを見ていきます。
tmp_before = uselog_months.loc[uselog_months[“年月”]==year_months[i-1]].copy()は
uselog_monthsの年月のカラムから前月のデータを抽出し、削除します。
最後にcount列をcount_1に名前変更します。
続いて、データをマージ(結合)していきます。
tmp = pd.merge(tmp,tmp_before,on="customer_id",how="left")
当月(tmp)と前月(tmp_before)の利用回数を横並びにしたものをtmpに代入します。
uselog = pd.concat([uselog,tmp],ignore_index=True)
作成した当月+前月のデータをuselogに追加します。

結果こんな表が出来上がりました。
ノック42本目:退会前月の顧客データ作成
このジムは月末までに退会申請をして、翌月末で退会できるシステムです。
退会を未然に防ぐことが目的であるため、退会前月のデータを作成します。
from dateutil.relativedelta import relativedelta
relativedeltaのデータは、timedeltaと同じように日付や日付時刻に足したり引いたりできます。 relativedeltaは、dateutil.relativedeltaモジュールで定義されています。「Xヶ月後」「X年後」を計算できます。

exit_customer = customer.loc[customer["is_deleted"]==1].copy()
customer データから、退会した顧客(is_deleted == 1)だけを取り出して新しいデータフレームを作成します。
exit_customer["exit_date"] = None
exit_date(退会前月)の入れ物を準備します。
exit_customer["end_date"] = pd.to_datetime(exit_customer["end_date"])
次にend_date(退会日)を日時型に変換し、それを元に退会前月データの準備します。
ちょっとわかりにくかったので別の書き方をしてみました。
# 日付として扱うために型変換
exit_customer["end_date"] = pd.to_datetime(exit_customer["end_date"])
# 1ヶ月引いた日付をまとめて計算
exit_customer["exit_date"] = exit_customer["end_date"] - pd.DateOffset(months=1)
# 形式変換
exit_customer["年月"] = exit_customer["exit_date"].dt.strftime("%Y%m")
exit_customerはこのように表示されました。

次にuselogのカラム年月を文字列にして、exit_customerのカラム年月と形式を揃えています。
uselog["年月"] = uselog["年月"].astype(str)
exit_uselog = pd.merge(uselog, exit_customer, on=["customer_id", "年月"], how="left")
ここではuselog と exit_customer を「customer_id と 年月 が一致するもの同士」で結合します。
その結果,exit_customerはこのようになりました。


欠損値(NaN)がいっぱいあります。
データが欠損していないものだけ残して、あとは除外します。
exit_uselog = exit_uselog.dropna(subset=["name"])
print(len(exit_uselog))
print(len(exit_uselog["customer_id"].unique()))
exit_uselog.head()

綺麗になりました。
まとめ
今回はデータの読み込みと整形、そして退会前月の退会顧客のデータを作成しました。
次回は継続顧客のデータの作成からやっていきます。
ありがとうございました。

コメント