廿TT

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

(R+Google アナリティクス)オッズ比で属性の影響を調べる

f:id:abrahamcow:20150628043728p:plain

Google アナリティクスの管理画面を見ていたら、男性のセッションにくらべて、女性のセッションがだいぶ少ないことに気づきました。

これは「このサイトが女性に認知されていない」ということでしょうか? それとも「女性が関心を持ちやすいような話題が、このサイトでは提供されていない」ということでしょうか?

この疑問に答えるために、集計をしてみます。

サイトへの関心度合いは「訪問時のページビュー数」から推測できそうです。

RGoogleAnalytics を使ってデータを取得します。

(RGoogleAnalytics について、詳しくは RGoogleAnalytics をいじっている - 廿TT を参照してください。)

#アカウントのオーサライズ
library("RGoogleAnalytics")
query <- QueryBuilder()
access_token <- query$authorize()

ここでアクセストークンをコピペ。

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

query$Init(start.date = "2015-06-01",
           end.date = "2015-06-30",
           dimensions = "ga:pageDepth,ga:userGender", 
           metrics = "ga:sessions",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           max.result=10000,
           #segment = "", 
           access_token=access_token)

dat1 <- ga$GetReportData(query)
#データ取得完了
#以下集計
sub1 <- dat1[dat1$pageDepth == 1,] #直帰
sub2 <- dat1[dat1$pageDepth > 1,] #回遊(直帰以外)

total <- tapply(dat1$sessions,dat1$userGender, sum)
notbounce <- tapply(sub2$sessions,sub2$userGender,sum)
bounce <- total - notbounce

mat1 <-cbind(rev(notbounce),rev(bounce))

tapply 関数を使ってわりとかんたんに集計ができました。

回遊 直帰
male 577 3312
female 104 853

オッズ比を計算してみる

「男女でサイトへの回遊傾向に差があるか?」

このような疑問に答えるためにはオッズ比を出してみると良いのです。

細かい説明はいったん後回しにします。計算をしてみましょう。

オッズ比は下のような 2×2(2行2列)の表が与えられたとき、

回遊 直帰
male a b
female c d

(a/b)/(c/d) で求まります。

> (mat1[1,1]/mat1[1,2]) / (mat1[2,1]/mat1[2,2])
    male 
1.428898 

オッズ比は約 1.43 でした。男性は女性にくらべ 1.43 倍程度サイトを回遊しやすいようです。

ちょっとまって、なんでそんな変な計算するの?

「男性と女性の回遊傾向をくらべたかったら男女別に回遊率、直帰率をだせばいいんじゃないの? オッズ比なんて聞いたことないよ」

そう思った方は鋭い。わざわざオッズ比という耳慣れない指標を使ったのにはわけがあるのです。

ちょっとした例で考えます。

ある架空のサイトである月のデータを集計したところ下のような表が得られました。

回遊 直帰
male 100 400
female 20 100

男性の回遊率は 100/(100+400) = 0.2 で 20%、女性の回遊率は 20/(20+100) = 0.166666... で約 17%です。

男性のほうが 1.2 倍ほど回遊傾向が強そうです。

また、次の月のデータを集計したところ、今度は下のような表が得られました。

回遊 直帰
male 100 4000
female 20 1000

実はこの月には出落ちのエイプリルフール企画をやっていました。そのため、もともと定着していた回遊ユーザー層の数は変わらず、1 ページだけ見て離脱するライトユーザーが増加したのです。直帰数の男女比は変わっていません。

この場合、男性の回遊率は約 2.44%、女性の回遊率は約 1.96%です。回遊率は大きく低下しました。そして男性のほうが 1.25 ほど回遊傾向が強そうです。

回遊率や直帰率はこのように分母の大きさに依存して値が変わります。

一方、オッズ比を求めてみると、

(100/400)/(20/100) = 1.25

(100/4000)/(20/1000) = 1.25

とどちらも同じ結果になります。

属性の違いがどの程度影響を与えるかを調べるには、オッズ比が適しているのです。

オッズ比が 1 より大きければ男性は女性より回遊しやすい、1 未満であれば男性は女性より回遊しにくいと解釈できます。

オッズ比の月次推移を出してみる

R のチュートリアルみたいなことを少しやります。

tapply 関数は第二引数に list を与えることができ、かんたんに複数因子ごとの集計ができます。

#データ取得
sta ="2014-09-01"
en = "2015-06-30"

query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:yearMonth,ga:pageDepth,ga:userGender", 
           metrics = "ga:sessions",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           max.result=10000,
           #segment = "", 
           access_token=access_token)

dat2 <- ga$GetReportData(query)
#データ取得完了
dat2$pageDepth <-as.numeric(dat2$pageDepth)

sub1 <- dat2[dat2$pageDepth == 1,]
sub2 <- dat2[dat2$pageDepth > 1,]

total <- tapply(dat2$sessions,list(dat2$yearMonth,dat2$userGender), sum)
notbounce <- tapply(sub2$sessions,list(sub2$yearMonth,sub2$userGender),sum)
odds <- (notbounce/total)/(bounce/total)
oddsratio <-odds[,2]/odds[,1]

library(vcd)
#オッズ比の信頼区間を計算している
conf <-matrix(,10,2)
for(i in 1:10){
  x <-cbind(rev(notbounce[i,]),rev(bounce[i,]))
  conf[i,] <-confint(oddsratio(x, log=FALSE))
}

out <- data.frame(month =seq.Date(as.Date(sta),as.Date(en),by="1 month"),oddsratio,
                  lower=conf[,1],upper=conf[,2])

library(ggplot2)
library(scales)
theme_set(theme_bw(16,"HiraKakuPro-W3")) #日本語のフォントを指定
p1 <-ggplot(out,aes(x=month,y=oddsratio)) +
  geom_line(size=1) + geom_point(size=4) +
  scale_x_date(labels = date_format("20%y/%m/%d")) +
  labs(x="",y="オッズ比(男性/女性)")
p1 + ylim(1,max(oddsratio))

f:id:abrahamcow:20150628054925p:plain

オッズ比の信頼区間を出してみる

vcd パッケージの oddsratio 関数に2行2列のマトリックスを与えるとオッズ比を出力してくれます。

confint 関数に oddsratio オブジェクトを入れるとオッズ比の信頼区間を返してくれます。

p1 +geom_errorbar(aes(ymin=lower,ymax=upper), colour="grey40")

f:id:abrahamcow:20150628060002p:plain

上図はオッズ比の95%信頼区間をエラーバーで示したものです。

いくつかのエラーバーは下限が 1 を少し下回っています。

オッズ比の信頼区間が 1 を含むことは、「統計的に有意でない」ということと同じなのですが、この程度であればあまり気にしなくてよいでしょう。

オッズ比がおおむね1.25の前後で推移していることから、男性のほうが回遊傾向が強いと捉えて頂いて大過ないと思います。

クロス集計をあなどるなかれ

層別は品質管理の七つ道具の一つです。

なにか変化や特徴があり、その原因を特定したいときは、まずはいろいろな切り口で内訳を調べるとよいでしょう。

今回はセッション数の内訳を「男・女」と「直帰・回遊」で見てみましたが、他にも「購入・非購入」であるとか「新規・再訪」であるとか、「先月・今月」とか、2×2の表が活躍する機会は多いかと思います。

そんなとき、オッズ比を知っておくとなかなか便利なのではないでしょうか。

参考文献

データ解析の実務プロセス入門

データ解析の実務プロセス入門

2×2の表,オッズ比,相対危険度