df2gspread
とplotly
を使って、Google Analytics のデータをグラフ化しました。
同じデータセットをbokeh
を使ってグラフ化するとどうなるか試してみました。
結果を以下に記載します。
前提
OS 、Python の version は以下の通りです。
-
OS
% sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G1114
-
Python
% python3 -V Python 3.6.2
参考
- Pythonのインタラクティブな可視化ライブラリBokehでグラフを描く - sambaiz-net
- python - Plotting multiple lines with Bokeh and pandas - Stack Overflow
必要なライブラリのインストール
df2gspread
と、 bokeh
をインストールします。
python3 -m pip install df2gspread --user
python3 -m pip install bokeh --user
手順
以下手順を踏んで、可視化します。
-
Google Analytics からデータをエクスポート
-
df2gspread で データを DataFrame として取り込む
-
bokeh で可視化
Google Analytics からデータをエクスポート
、df2gspread で データを DataFrame として取り込む
手順は、plotly と同じ手順を踏んでいます。
この記事上は、実行に必要なプログラムの記述のみで詳細は省略します。
df2gspread で データを DataFrame として取り込む
from oauth2client.service_account import ServiceAccountCredentials
def download_as_df():
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)
# 1brCpWvk2uofc3MEt-ASb2cuZ-u8Zmx-ICxSTltlbVBQ はスプレッドシートのID なのでそれぞれ取得対象のスプレッドシートで変わります。
df = g2d.download("1cMLBDPbPkoYYX9tXIlHunAA0mt7eBEq2HaHTAxVszh4", wks_name="日次レポート", col_names=True, row_names=False, credentials=credentials, start_cell = 'A15')
df = df.sort_values(by='ga:date')
return df
import pandas as pd
df = download_as_df()
# datetime に変換する
df["ga:date"] = pd.to_datetime(df["ga:date"])
# ga:date を index として設定する
df.index = df["ga:date"]
# グラフ描画に不要なカラムの削除
df = df.drop("ga:date", axis=1)
df = df.drop("ga:avgSessionDuration", axis=1)
df = df.drop("ga:pageviewsPerSession", axis=1)
df = df.drop("ga:bounceRate", axis=1)
# 2016-10-01 から 30日間でデータを絞り込む
span = pd.date_range('2016-10-01', periods=30)
df = df[df.index.isin(span)]
bokeh で可視化
時系列グラフを複数引くには、line メソッド実行するか、multi_lineメソッドを実行すれば、いいようです。
それぞれ記載します。
lineメソッドを複数回実行する
from bokeh.plotting import figure, output_notebook, show
from bokeh.models import ColumnDataSource, LabelSet
output_notebook()
p = figure(plot_width=800, plot_height=400, x_axis_type="datetime")
# add a line renderer
p.line(df.index,df["ga:users"], line_width=3,legend="ga:users", color="red")
p.line(df.index,df["ga:pageviews"], line_width=3,legend="ga:pageviews",color="green")
p.line(df.index,df["ga:sessions"], line_width=3,legend="ga:sessions", color="blue")
# 表示
show(p)
multiline メソッドを実行する
import pandas as pd
import numpy as np
from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show, output_notebook
output_notebook()
numlines=len(df.columns)
mypalette=Spectral11[0:numlines]
p = figure(width=800, height=400, x_axis_type="datetime")
p.multi_line(xs=[df.index.values] * numlines,
ys=[df[name].values for name in df],
line_color=mypalette,
line_width=2)
show(p)
まとめ
データラベルの設定方法が、少し調べた限りだと、plotly のようには設定できないようです。
インターフェースとして痒いところに手が届きそうなのは、bokeh
のように思いました。
ぱっと出せるグラフのデザインは個人的には、plotly
のほうがいい感じです。
以上です。
コメント