アクセス解析データと「誤差の範囲」(エラーバー付き棒グラフ) - 廿TT閲覧していて、Webアクセスデータにエラーバーを付与することに興味を覚えました。
記事は、Rの実装例で、Python で同様のことをするには、pandas と、bokeh を使うとできそうに思いましたので、Google Analytics のデータを元にエラーバー付き棒グラフを描画してみました。
結果を記載します。

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

Mac を買い替えたので、以下ライブラリをインストールしました。

!pip install --upgrade pip
!pip install pandas
!pip install google2pandas
!pip install oauth2client
!pip install bokeh
!pip install scipy

Google Analytics データの取得

google2pandas使います。
過去にgoogle2pandas使い方について、Google2Pandas で、Google Analytics のデータを pandas Dataframe に変換する | Monotalkまとめました。よろしければこちらもご確認ください。

from google2pandas import *
view_id = '103185238'
query = {
    'reportRequests': [{
        'viewId' : view_id,
        'dateRanges': [{
            'startDate' : '365daysAgo',
            'endDate'   : 'today'}],
        'dimensions' : [
            {'name' : 'ga:yearMonth'}
        ],
        'metrics'   : [
            {'expression' : 'ga:sessions'}
        ]
    }]
}
conn = GoogleAnalyticsQueryV4(secrets='./ga_client.json')
df = conn.execute_query(query)

# 出力
df['sessions'] = df['sessions'].astype(int)
df.sort_values('yearMonth', ascending=False)

yearMonthsessions
1220190211961
1120190117213
1020181217098
920181116829
820181016629
720180915633
620180815996
520180715379
420180615615
320180514163
220180411105
120180310444
02018023264

Dataframe.plot で棒グラフを出力

Pandas の Dataframe.plot() でエラーバー付き棒グラフを出力してみます。

from scipy import stats
import scipy
import numpy as np
# 信頼区間を求める    
interval =  scipy.stats.poisson.interval(alpha=0.95, mu=df['sessions'], loc=0)
# 誤差範囲の計算 yerr は棒グラフの点からの距離になるので、df['sessions'].values との絶対値の差を求める。    
interval = np.abs(interval - df['sessions'].values)
#  kind='bar' で棒グラフを指定、capsize=20 でエラーバーの横線を出力する、
df.plot(figsize=(16, 8), kind='bar', x='yearMonth', y='sessions', yerr=interval,capsize=20)

<matplotlib.axes._subplots.AxesSubplot at 0x138969860>

png

from bokeh.models import ColumnDataSource, Whisker
from bokeh.plotting import figure, show
from bokeh.io import output_notebook, show
from scipy import stats
import scipy
import numpy as np
# jyupter notebook に描画する
output_notebook()
# x軸が数値項目ではないので、x_range を指定しておく
p = figure(x_range=df['yearMonth'].values, x_axis_label='yearMonth',
           y_axis_label='sessions',
           plot_width=900, plot_height=275)
# 棒グラフを描画 
p.vbar(x=df['yearMonth'].values, width=0.5, bottom=0, top=df['sessions'], color="firebrick",fill_alpha=0.4)

# 信頼区間を求める    
interval =  scipy.stats.poisson.interval(alpha=0.95, mu=df['sessions'], loc=0)
# エラーバーの描画    
source_error = ColumnDataSource(data=dict(base=df['yearMonth'].values, lower=interval[0], upper=interval[1]))
p.add_layout(
    Whisker(source=source_error, base="base", upper="upper", lower="lower")
)
show(p)

png


補足 scipy.stats.poisson.interval計算結果について

python - scipy.stats.poisson.interval - what confidence interval - Cross Validated に、
scipy.stats.poisson.interval戻り値は厳密には信頼区間ではなくて確率区間のようなニュアンスのことが記載されています。
R の poisson.test戻り値を比較したところ若干ですが、値に差がありました。
厳密に poisson分布の信頼区間 を求める場合は他の方法を試した方がいいのかもしれません。

エラーバー付き棒グラフから読み取れる情報

エラーバー付きの以下のことが読み取れると思います。

  • 基本的にセッション数は増加傾向にある。
  • 201804-201805、201809-201810 の期間では有意な変化があった。
  • 201802、201902 はデータが中途半端になっていて、うまく描画できていない。

記事の増加数と比較してみていくと、変化したタイミングで何かが発生しているのかもしれませんが、
感覚的には「何が良くわからないけど3-4月に一度変化がある。」ように見えます。


参考

記事作成中に以下を参考にしました。

以上です。

コメント

カテゴリー