Google Analytics の 時系列データを bokeh で可視化する


df2gspreadplotlyを使って、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
    


参考


必要なライブラリのインストール

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)

"時系列グラフ1"

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)

"時系列グラフ2"

まとめ

データラベルの設定方法が、少し調べた限りだと、plotly のようには設定できないようです。
インターフェースとして痒いところに手が届きそうなのは、bokeh のように思いました。
ぱっと出せるグラフのデザインは個人的には、plotly のほうがいい感じです。
以上です。

コメント