廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

アクセス解析データと「誤差の範囲」(エラーバー付き棒グラフ)

95%信頼区間のエラーバー付き棒グラフ

当然ですが Web サイトへのアクセス数は増えたり減ったりします。

なぜ増えたり減ったりしたのか、それを明らかにするのが Web 解析の目的の一つですが、偶然増えたり減ったりすることもあり得ます。

どの程度の増減だったら「偶然」と判断できるか、その問いに示唆を与える方法のひとつは、信頼区間を出すことです。

ある値の95%信頼区間とは、おなじ条件で実験を繰り返した場合、およそ95%の割合でその値がその区間の中に含まれるであろう、というものです。

ものすごく大雑把に言えば「誤差の範囲」です。

f:id:abrahamcow:20141016204243p:plain
上図は当ブログのセッション数の推移を棒グラフで、その95%信頼区間を赤いエラーバーで示したものです。データは Google アナリティクスから取りました。

2014年8月〜9月を見ると、エラーバーの範囲がほとんど重なっていますから、この推移は「誤差の範囲」と考えて良さそうです。

一方、エラーバーが重なっていない他の期間は、なにか事情があって(ソーシャル経由で拡散された、ブログのエントリ数を増やしたことにより、検索エンジンに引っかかりやすくなった等)増えたり減ったりしたと考えるのが自然です。

エラーバー付き棒グラフの書き方

先に示したグラフは R で書きました。スクリプトを以下に記します。
まずは APIGoogle アナリティクスからデータを取得します。

library("RGoogleAnalytics")
query <- QueryBuilder()
access_token <- query$authorize()

ここでアクセストークンをコピペ。
RGoogleAnalytics をいじっている - 廿TT を参照。)

ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

sta ="2013-05-01"
en ="2014-09-30"

query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:yearMonth",
           metrics = "ga:sessions,ga:goal2Completions",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

dat1 <- ga$GetReportData(query)
#以上でデータ抽出完了

t1 <-seq.Date(as.Date(sta),as.Date(en),by="1 month")

#95%信頼区間を算出
CI <- sapply(dat1$sessions, function(x){
  tmp <- poisson.test(x)
  tmp$conf.int[1:2]})

dat2 <- data.frame(month =t1, 
                   sessions=dat1$sessions,
                   lower=CI[1,],
                   upper=CI[2,])

#以下、グラフの描画
library(ggplot2)
library(scales)

theme_set(theme_bw(base_size=15, base_family="HiraKakuProN-W3")) 
#日本語フォントを指定

ggplot(dat2, aes(x=month,y=sessions))  +
  geom_bar(stat="identity",alpha=0.4)+
  scale_x_date(labels = date_format("20%y/%m")) +
  scale_y_continuous(labels = comma) +
  labs(x="", y="セッション(訪問数)") + 
  geom_errorbar(aes(ymin=lower,ymax=upper),colour="red4")

ここではセッション数についてのみ図示しましたが、ユニークユーザー数やページビュー数、ヒット数、コンバージョン数(ga:users, ga:hits, ga:pageviews, ga:goalXXCompletions)などでも、同様のことが行えます。

Google アナリティクスの各種ディメンションと指標に関しては、Dimensions & Metrics Reference - Google Analytics — Google Developers を参照してください。

信頼区間について

ここでセッション数の95%信頼区間を求めるために、「セッション数がポアソン分布に従う」という仮定を置いています。

仮定が少ないほうが客観的な分析ができるような印象があるためか、「仮定を置く」というといやがる人が多いのですが、「ポアソン分布に従う」という仮定は、

  1. 別の時間どうしでは, 現象が起こる確率は独立である
  2. ある期間で現象が起こる確率は, その期間の長さに比例する
  3. 非常に短い時間で現象が 2 回以上起こる確率はほぼ 0

というシンプルなものです。

複数の人が同時にサイトにアクセスすることもあるじゃん」と思われるかもしれませんが、例えば10時ちょうどにアクセス、といっても10時00分0.000001秒とか、時間を細かく区切って見れば、やはり「非常に短い時間で現象が 2 回以上起こる確率はほぼ 0」と考えて問題ないのです。

「信頼区間」というのは一般的な枠組みであるため、実際に計算するときは、なんらかの分布を仮定した信頼区間になります。(いやブートストラップ信頼区間があるか。でもまあいいや)

CVR、新規率、直帰率と「誤差の範囲」(信頼区間付き折れ線グラフ) - 廿TT では二項分布を仮定しました。

「誤差」雑感

統計学をかじった人にとっては、誤差はあってあたりまえのもの(というか誤差がなければ統計学はいらない)ですが、Web 解析分野ではあまりその感覚は浸透していません。

「目標200件のところ199件でも未達は未達じゃねえか! 誤差のせいで目標に届かなかったらどうする!」みたいな考えかたをする人もいます。

その気持ちも分からないではないです。1円単位できっちり帳簿を付けていくような発想です。

そういう会計的な考えかたと統計的な考えかたの折り合いをどうやってつけるか、みたいなところは 今後 Web アクセス解析の重要な課題になると思います。

関連エントリ


CVR、新規率、直帰率と「誤差の範囲」(信頼区間付き折れ線グラフ) - 廿TT

ページビュー数、セッション数、ユニークユーザー数を同じ平面にプロット - 廿TT

ポアソンの少数の法則は「起きるのが稀な事象の発生件数はポアソン分布に従う」という意味ではない - 廿TT

微分方程式によるポアソン分布の導出 - 廿TT

誤差の範囲とはなにか? - 廿TT