なにがしたいか
GoogleAnalyticsからの出力を得てレポート化する案件があり、無理やりスクリプト化しました。
Imageとして出力して終わりでもよかったのですが、グラフ中にキャプションを入れたり、微妙にいじる必要があったので、一度数値に落として再描画するという中途半端なソリューションになってしまいました。
以下のビューをレポートに入れたい、ただそれだけです。
バージョンはGA3用になります。
そんなやり方でよいのか?
だったら、最初からログ分析しろ、ってところですが、このソリューションの良いところは、
- Google Analyticsのretention計算の結果と完全に一致する
- 上記のスナップショットを一時的に保存できる
- 見た目をいじれる
- 場合によっては後処理を加えられる(使いにくいが)
などです。
コード
データの読み出し
GAのキーを使って読み出します。ga_utilというライブラリが、つつがなくdata frame化してくれるので苦労は皆無です。
import pandas as pd
import numpy as np
import ga_util as ga
from pylab import rcParams
KEY_FILE_LOCATION = 'client_secrets.json'
VIEW_IDApp = '00000000'
analytics = ga.gar_initialize_analyticsreporting()
week = 12
response = ga.gar_get_retention_report(analytics,VIEW_IDAndroidApp,week)
dfAndroid = ga.gar_decodeResponse(response)
response = ga.gar_get_retention_report(analytics,VIEW_IDiOSApp,week)
dfiOS = ga.gar_decodeResponse(response)
df = (dfAndroid[0] + dfiOS[0]) / (dfAndroid[1] + dfiOS[1])
df.columns = ["{}th week".format(int(x)) for x in df.columns]
df
それっぽく表示
import matplotlib.pyplot as plt
import seaborn as sns
rcParams['figure.figsize'] = 16,12
# get retention for both OS, Android, iOS
retention = (dfAndroid[0].sum() + dfiOS[0].sum()) / (dfAndroid[1].sum() + dfiOS[1].sum())
retentionAndroid = (dfAndroid[0].sum()) / (dfAndroid[1].sum() )
retentioniOS = ( dfiOS[0].sum()) / (dfiOS[1].sum())
# plot time series
plt.subplot(2, 1, 1)
plt.plot(retention,marker='o', color='r',label="combined")
plt.plot(retentionAndroid,marker='^', color='g',label="Android")
plt.plot(retentioniOS,marker='x', color='b',label="iOS")
# plot x
pos = np.arange(len(retention))
plt.xticks(pos, df.columns)
ax = plt.gca()
# plot oresen: y
plt.ylim([0,1])
plt.yticks([0,0.25,0.5,0.75,1])
vals = ax.get_yticks()
# plot texts
plt.title("retention rate (%) - Android/iOS combined")
plt.legend(loc = 'upper right')
plt.grid(True, which='major', axis='y')
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])
txt = "{0:2.1%} of total ********************".format(retention[0]-retention[1])
plt.annotate(txt, xy=(1,retention[1]), xytext=(0.5, 0.2),arrowprops=dict(arrowstyle="->"),fontsize=16,color="red")
plt.subplot(2, 1, 2)
# heatmap
sns.heatmap(df, annot=True, fmt='2.1%', cmap='coolwarm', annot_kws=None ,linewidths=.5,vmin = 0.3,vmax=0.7)
ax = plt.gca()
ax.tick_params(top=True, bottom=False,
labeltop=True, labelbottom=False)
# save image
plt.savefig("fig_retention_rate.png", bbox_inches='tight', dpi=200)
これで少し色ランプは違いますが、似たようなビューができます。
まとめ
こんな事をして同じ見た目にするのにどんな意味があるのか、今一歩利点がわからないかもしれませんが、ここから発展させたレポートが必要な場合に、特に自動化されたキャプションなどを、毎度作るのが面倒な局面では、結構有益ではないでしょうか?