1
2

More than 1 year has passed since last update.

GoogleAnalytics のRetention viewをPythonで模倣する

Posted at

なにがしたいか

GoogleAnalyticsからの出力を得てレポート化する案件があり、無理やりスクリプト化しました。
Imageとして出力して終わりでもよかったのですが、グラフ中にキャプションを入れたり、微妙にいじる必要があったので、一度数値に落として再描画するという中途半端なソリューションになってしまいました。

以下のビューをレポートに入れたい、ただそれだけです。

image.png

バージョンは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

これでこうなります:
image.png
ここから先はただのお絵かきです。

それっぽく表示

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)

これで少し色ランプは違いますが、似たようなビューができます。

image.png

まとめ

こんな事をして同じ見た目にするのにどんな意味があるのか、今一歩利点がわからないかもしれませんが、ここから発展させたレポートが必要な場合に、特に自動化されたキャプションなどを、毎度作るのが面倒な局面では、結構有益ではないでしょうか?

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2