実現したいこと
コホート分析を行うためにデータを加工したい
→現在いきづまっています。何卒よろしくお願いいたします。
使用データ
python
1# FirstDate UserId TotalCharges LastDate LifeTime 2#0 2009-01-11 47 50.67 2010-01-12 12 3#1 2009-01-20 48 26.60 2009-08-20 7 4#2 2009-02-03 49 38.71 2009-07-03 5 5#3 2009-04-06 50 53.38 2011-02-09 22 6#4 2009-05-06 51 14.28 2019-09-25 124
試したこと
python
1import pandas as pd 2import numpy as np 3import datetime as dt 4 5# 継続月数を計算 6df['LifeTime'] = (df['LastPeriod'].dt.year - df['FirstPeriod'].dt.year)*12 + df['LastPeriod'].dt.month - df['FirstPeriod'].dt.month 7
希望データ型
python
1# FirstDate UserId TotalCharges LastDate LifeTime OrderDate 2#0 2009-01-11 47 50.67 2010-01-12 12 2009-01-11 3#1 2009-01-11 47 50.67 2010-01-12 12 2009-02-11 4#2 2009-01-11 47 50.67 2010-01-12 12 2009-03-11 5#3 2009-01-11 47 50.67 2010-01-12 12 2009-04-11 6#4 2009-01-11 47 50.67 2010-01-12 12 2009-05-11 7#5 2009-01-11 47 50.67 2010-01-12 12 2009-06-11 8#6 2009-01-11 47 50.67 2010-01-12 12 2009-07-11 9#7 2009-01-11 47 50.67 2010-01-12 12 2009-08-11 10#8 2009-01-11 47 50.67 2010-01-12 12 2009-09-11 11#9 2009-01-11 47 50.67 2010-01-12 12 2009-10-11 12#10 2009-01-11 47 50.67 2010-01-12 12 2009-11-11 13#11 2009-01-11 47 50.67 2010-01-12 12 2009-12-11 14#12 2009-01-11 47 50.67 2010-01-12 12 2010-01-11 15 16→コホート分析をするために、UserIDでユニークなレコードからLifeTimeを参考にOrderDateを追加して複数レコードを作りたいです。
今後行いたいこと
python
1df.set_index('UserId', inplace=True) 2df['CohortGroup'] = df.groupby(level=0)['OrderDate'].min().apply(lambda x: x.strftime('%Y-%m')) 3 4df.reset_index(inplace=True) 5grouped = df.groupby(['CohortGroup', 'OrderPeriod']) 6 7cohorts = grouped.agg({'UserId': pd.Series.nunique, 8 'Total Charges': np.sum}) 9cohorts.rename(columns={'UserId': 'TotalUsers'}, inplace=True) 10 11def cohort_period(df): 12cohorts = cohorts.groupby(level=0).apply(cohort_period) 13cohorts 14 15# reindex the DataFrame 16cohorts.reset_index(inplace=True) 17cohorts.set_index(['CohortGroup', 'CohortPeriod'], inplace=True) 18 19# create a Series holding the total size of each CohortGroup 20cohort_group_size = cohorts['TotalUsers'].groupby(level=0).first() 21cohort_group_size.head() 22 23cohorts['TotalUsers'].unstack(0).head() 24 25user_retention = cohorts['TotalUsers'].unstack(0).divide(cohort_group_size, axis=1) 26user_retention.head(10) 27 28import seaborn as sns 29sns.set(style='white') 30 31plt.figure(figsize=(12, 8)) 32plt.title('Cohorts: User Retention') 33sns.heatmap(user_retention.T, cmap="RdBu_r" ,mask=user_retention.T.isnull(), annot=True, fmt='.0%');
「'LastPeriod'」や「'FirstPeriod'」は掲載のデータには見当たりませんが、何か別のデータがあるのでしょうか? 検証可能なデータを提示してください。
回答1件
あなたの回答
tips
プレビュー