Pandas で、
以下実施した
前提
以下、
clientId を
予め カスタムディメンションと して 送付して おく
データセットは、Google Analytics で 取得した データです。
Google Analytics はデフォルト設定では、 どの ユーザーの アクセスなのかを 識別する ことができません。
このため、 Google Analytics の cookie を クライアントID と して、 カスタムディメンションと して 送信しています。
Google Analytics のcookie を カスタムディメンションと して 送付する 方法は、 以下の 記事が 参考に なりました。
2016年の新定番!ユーザーエクスプローラーを もっと 活用する ための 簡単な 方法 | 株式会社プリンシプル Google Analytics Spreadsheet Add-on で、
データを 取得する
google analytics spreadsheet add-on を使って、 Google Analytics から データを 取得します。
上記の使用方法は、 Googleアナリティクスの 分析は スプレッドシートの アドオンで 全自動化しよう が 参考に なりました。
レコメンドに使用する データセットと して、 以下の Metrics、 Dimensions を 指定しています。
また、データの 取得件数ですが、 デフォルトは 1000件までです。 10000件までは 引き上げられるので、 10000件を 設定しています。 - Metrics
- ga:pageviews
- Dimensions
- ga:date
- ga:dimension8 (clientId) を
設定している dimensionに なります。 ここは それぞれ 変わります。 - ga:pagePath
- Metrics
Google Analytics Spreadsheet Add-on の
データ取得イメージ
以下のようなデータに なります。 どんな
観点で セグメントを つけるか
ユーザーあたりのpageviewで、 セグメント分けを します。
1、2-4、 5以上と いう 雰囲気で 分けます。
セグメント分けの 手順
以下、
- スプレッドシートから
python への データ取り込み
データの取り込みを 実施します。 - データの
分布を 確認する
セグメント分けの前に、 どのくらいの 割り合いで 分けるか 決定する ため、 データ分布を 確認します。 - セグメント分け
実際にデータを セグメント分けします。
スプレッドシートから python への データ取り込み
python への
google スプレッドシートからのgspread
を
事前準備
必要な
python3 -m pip install gspread --user python3 -m pip install oauth2client --user python3 -m pip install df2gspread --user python3 -m pip install pandas --user python3 -m pip install sklearn --user python3 -m pip install matplotlib --user python3 -m pip install plotly --user
スプレッドシートの データを 取得する
以下の
API に
APIのgspread
の
[Python] Google SpreadSheetを
データ取得、 pandas の dataframe に 変換する プログラム
以下に
from oauth2client.service_account import ServiceAccountCredentials def download_as_df(sheet_id, wks_name): from df2gspread import gspread2df as g2d # key_file 以下の指定方法だと、notebook と同じディレクトリにあるキーファイルを取得しています。 key_file = "spreadsheet_api_key.json" scope = ['https://spreadsheets.google.com/feeds'] credentials = ServiceAccountCredentials.from_json_keyfile_name(key_file, scope) df = g2d.download(sheet_id, wks_name=wks_name, col_names=True, row_names=False, credentials=credentials, start_cell = 'A15') df = df.sort_values(by='ga:date') return df # 201710月-201712月のデータを取得する df_201710 = download_as_df("1brCpWvk2uofc3MEt-ASb2cuZ-u8Zmx-ICxSTltlbVBQ","ユーザーの行動レポート 201710") df_201711 = download_as_df("1brCpWvk2uofc3MEt-ASb2cuZ-u8Zmx-ICxSTltlbVBQ","ユーザーの行動レポート 201711") df_201712 = download_as_df("1brCpWvk2uofc3MEt-ASb2cuZ-u8Zmx-ICxSTltlbVBQ","ユーザーの行動レポート 201712")
# dataframeのマージ import pandas as pd df = pd.concat([df_201710, df_201711, df_201712])
データの 分布を 確認する
以下、
Pandasで
ユーザの PageView の 分布を 計算する
# clientID 単位にページVIEWを集計 df_groupby = df.groupby("ga:dimension8",as_index=True) # groupby した結果の ga:pageviews をカウント カウント結果をソートする df_count_page_views = df_groupby.agg({"ga:pageviews": "count"}).sort_values("ga:pageviews",ascending=False) # データの分布をvalue_counts()で出力、結果をソートする series_counts = df_count_page_views["ga:pageviews"].value_counts().sort_index(0) series_counts
1 10286 2 1082 3 301 4 127 5 67 6 29 7 27 8 10 9 8 10 7 11 7 12 4 13 5 14 4 15 2 16 1 17 2 18 3 20 4 21 1 23 1 24 1 25 1 28 1 33 1 43 1 74 1 177 1 Name: ga:pageviews, dtype: int64
plotlyで 折れ線グラフを 表示
# plotlyで折れ線グラフを表示 import plotly plotly.offline.init_notebook_mode(connected=False) plotly.offline.iplot([{ 'x': series_counts.index, 'y': series_counts.values, 'name': "ga:pageviews" }], filename='データ分布', show_link=False, config={"displaylogo":False, "modeBarButtonsToRemove":["sendDataToCloud"]})
plotly で 円グラフ表示
# ploty で円グラフ表示 import plotly import plotly.graph_objs labels = series_counts.index values = series_counts.values trace = plotly.graph_objs.Pie(labels=labels, values=values) plotly.offline.init_notebook_mode(connected=False) plotly.offline.iplot([trace], filename='basic_pie_chart')
セグメント分けを する
ほとんど、
エルボー法で
import pandas as pd import numpy as np import matplotlib.pyplot as plt from IPython.display import display, HTML # Jupyter notebook用 from sklearn.cluster import KMeans %matplotlib inline def plot_elbow(array): distortions = [] for i in range(1,11): # 1~10クラスタまで一気に計算 km = KMeans(n_clusters=i, init='k-means++', # k-means++法によりクラスタ中心を選択 n_init=10, max_iter=300, random_state=0) km.fit(array) # クラスタリングの計算を実行 distortions.append(km.inertia_) # km.fitするとkm.inertia_が得られる plt.plot(range(1,11),distortions,marker='o') plt.xlabel('Number of clusters') plt.ylabel('Distortion') plt.show()
array = np.array([series_counts.index, series_counts.values, ], np.int32) array = array.T plot_elbow(array)
クラスタ数は
クラスタ数2で
pred = KMeans(n_clusters=2).fit_predict(array) pred
array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
2回以上アクセスしている
del series_counts[1] array = np.array([series_counts.index, series_counts.values, ], np.int32) array = array.T plot_elbow(array)
pred = KMeans(n_clusters=2).fit_predict(array) pred
array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
2回と、
3回以上を
del series_counts[2] array = np.array([series_counts.index, series_counts.values, ], np.int32) array = array.T plot_elbow(array)
pred = KMeans(n_clusters=4).fit_predict(array) pred
array([1, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2], dtype=int32)
3回の
- pageviewが
1の グループ - pageviewが
2の グループ - pageviewが
3-4の グループ - pageviewが
5-74 (5以上99以下) の グループ - pageviewが
74以上(100以上)の グループ
Google Analytics から、
その他考慮した ほうが 良さそうな 観点
ユーザーあたりの
以下、
- pageview ではなく、
セッション数を 使う。 - 日をまたいだ
アクセス 初回アクセス後に 別の 日に 同じ ページを 訪れているか。
以上です。
コメント