見出し画像

『Python実践データ分析100本ノック』ノック26〜30

今回は、『Python実践データ分析100本ノック』で学んだことをアウトプットします。

利用履歴データから定期利用フラグを作成する

顧客ごとに月/曜日別に集計を行い、最大値が4以上の曜日が1ヶ月でもあったユーザーはフラグ1とします。

つまり、顧客ごとの各月の最大値を取得し、その最大値が4以上の場合、フラグを立ててみることになります。

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()

画像1

pandasのwhere関数

参考にしたのは、こちらのサイト

where関数の第一引数には条件を指定、条件がTrueの場合は元の値のまま、Falseの場合は第二引数に指定した値により更新が行われる。

まず、コードの2行目で、すべてのフラグを0に設定しています。

続いて、3行目のwhere関数の第一引数に条件(uselog_weekday['count']<4)を指定、条件がTrueの場合は元の値(フラグが0)のまま、Falseの場合は第二引数に指定した値(フラグが1)により更新が行われるのです。

iloc演算子による整数でのインデックス位置の参照

整数のインデックス位置による参照を使うときにはilocでデータを参照していきます。

本書のノック28(会員期間を計算しよう)において、ilocとfor文を用いて、データフレームを上から順番に計算し、会員期間を月単位で算出しています。

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()

画像2

コードの1行目でrelativedeltaを使用するためにライブラリのインポートをしています。これは日付の比較に使用します。

2行目で、日付計算用の列をend_dateベースに作成し、3行目で、欠損値に2019年4月30日を代入しています。

その後のfor文で、データフレームを上から順番に計算し、会員期間を月単位で算出しています。

loc演算子による軸のラベルでの参照

loc演算子で、軸のラベルを使ったデータの参照を行うことができます。

本書のノック30(退会ユーザーと継続ユーザーの違いを把握しよう)において、loc演算子を用いて、退会ユーザーと継続ユーザーを分けて、describeで比較しています。

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()

画像3

今回の学びのまとめ

○pandasのwhere関数の第一引数には条件を指定、条件がTrueの場合は元の値のまま、Falseの場合は第二引数に指定した値により更新が行われる。

○pandasのlocとiloc演算子は、それぞれラベルベースと整数ベースでインデックス参照を行う

サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪