読者です 読者をやめる 読者になる 読者になる

廿TT

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

(R + Google アナリティクス)モザイクプロットでユーザーの構成比を把握

Google アナリティクス R Excel グラフ

モザイクプロットの紹介

モザイクプロットはクロス集計表を図示するための統計グラフです。

例えば2015年1月にこのブログにアクセスしたユーザーを、年代、性別ごとにクロス集計すると下表のようになります。

18-24 25-34 35-44 45-54 55-64 65+
female 292 487 253 93 49 28
male 1155 4053 2166 590 217 157

これをモザイクプロットにしたものが下図です。

f:id:abrahamcow:20150201091843p:plain

表の各セルの数字の大きさが、四角形の面積に対応しています。

探索的にサイトの課題をみつけ出したい際に活用できるかと思います。

(KPI として定点観測する場合は、モザイクプロットより帯グラフや積み上げ棒グラフにしたほうがよいという印象を持っています。期間比較がしやすいからです。RGoogleAnalytics で変化の要因を読みとく(折れ線グラフ、帯グラフ、積み上げ棒グラフ) - 廿TT

R + Google アナリティクスによる実践

RGoogleAnalytics でデータを取得します。

詳しくは、

を参照。

まずはオーサライズ。

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

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

#データ取得
ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

sta <- "2015-01-01" #データ取得期間は
en <- "2015-01-31" #とりあえず直近一ヶ月にした。

query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:userGender,ga:userAgeBracket",  
           metrics = "ga:users", 
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           #           filter = "",
           access_token=access_token)

UGAB <- ga$GetReportData(query)  #データ取得完了

library(tidyr)
library(dplyr)

#クロス集計表を作っている
UGAB2 <- UGAB %>% spread(userGender, users)

UGABmat <- as.matrix(UGAB2[,2:3])
rownames(UGABmat) <- UGAB2[,1]
#table オブジェクトを plot 関数にいれるとモザイクプロットになる
#R はオブジェクト指向プログラミング原語なのです。
plot(as.table(UGABmat), main="", color=c("tomato","cornflowerblue"),cex=1.1)

f:id:abrahamcow:20150201091843p:plain

新規訪問再訪問と、訪問経路(チャネル)ごとのグラフも書いてみましょう。

query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:userType,ga:channelGrouping",  
           metrics = "ga:users", 
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           #           filter = "",
           access_token=access_token)

UTCG <- ga$GetReportData(query) #UTCG にデータが入った。

UTCG2 <- UTCG %>% spread(userType, users)

UTCGmat <- as.matrix(UTCG2[,2:3])
rownames(UTCGmat) <- UTCG2[,1]
plot(as.table(UTCGmat), main="", color=c("cornflowerblue","orange2"),cex=1.1)


f:id:abrahamcow:20150201095228p:plain

> t(UTCGmat)
                  (Other) Direct Organic Search Referral Social
New Visitor            98   1578           4820     2340   4119
Returning Visitor      68    115            590      246    795

ドキュメンテーション

ちょっとした表を作る際にはエクセルが便利です。

集計表をエクセルに書き出すにはこうやります。

library(xlsx)
setwd("~/Desktop")
write.xlsx(as.data.frame(t(UTCGmat)), file="UTCG.xlsx")
write.xlsx(as.data.frame(t(UGABmat)), file="UGAB.xlsx")

パワーポイントに貼り付けてプレゼン資料風のものを作ってみました。

モザイクプロット、中学高校では習わないので、実際資料つくるときはもうちょっとていねいに説明したほうがいいかもしれないですね。

プロットに直接文字を書き込む

モザイクプロットは左下の座標が (0, 0), 右上の座標が (1,1) になっているので、座標を指定してプロットに直接クロス表の数値を書き込むこともできます。

plot(as.table(UTCGmat), main="", color=c("cornflowerblue","orange2"),cex=1.1)

pct <- apply(UTCGmat,2,function(x)x/sum(x))
dim1 <- dim(pct)
pct2 <- rbind(numeric(dim1[2]),pct[-dim1[1],])
posx1 <-apply(pct,2,cumsum)
posx2 <-apply(pct2,2,cumsum)

text((posx1[,1]+posx2[,1])/2,0.5, prettyNum(UTCGmat[,1],","))
text((posx1[,1]+posx2[,1])/2,0.02, prettyNum(UTCGmat[,2],","))

f:id:abrahamcow:20150202075302p:plain

plot(as.table(UGABmat), main="", color=c("tomato","cornflowerblue"),cex=1.1)

pct <- apply(UGABmat,2,function(x)x/sum(x))
dim1 <- dim(pct)
pct2 <- rbind(numeric(dim1[2]),pct[-dim1[1],])
posx1 <-apply(pct,2,cumsum)
posx2 <-apply(pct2,2,cumsum)

text((posx1[,1]+posx2[,1])/2,0.9, prettyNum(UGABmat[,1],","))
text((posx1[,1]+posx2[,1])/2,0.4, prettyNum(UGABmat[,2],","))

f:id:abrahamcow:20150202075343p:plain

あまりきれいにできなかった。

ggplot2 を使ってやる方法もあるようですが、試していません。

参考文献

統計データの視覚化 (Rで学ぶデータサイエンス 12)

統計データの視覚化 (Rで学ぶデータサイエンス 12)

余談

余談1:「女性のための」

スライドには「女性層を取り込む記事の掲載をご検討ください。」って書いてみたけど、ぼくは世の「女性のための○○」みたいのあんまり好きじゃない。

そういうのって、なんか占いとか雑な恋愛相談とか芸能人が離婚したとか超どうでもいい記事が多くって、女をバカにしてるっぽいイメージがある。

まあそれをいったら男性週刊誌だってヌードグラビアとかどうでもいい政局図とかばっかだし、男も女も平等にバカってことでいいのかもしれない。

余談2:Google の男女判別

Google アナリティクスの性別レポート、男(male)女(female)はあるけど、「不明」がない。

不明が男性のほうにカウントされてる可能性あるんじゃないかと思ってる。

あと、前グーグルの営業の人と話したとき、
「すべては統計なんです。このようにユーザーのセグメントを統計手法で推定することで、よりイグザクトなターゲティングが可能になるのです」
みたいなこと言われて、
「へーぼく統計ちょっとやってたんですけど、それって教師あり学習ですか?」
みたいな質問したら、
「あなたは統計が武器だと思ってるかもしれませんが、ビジネスの現場では統計そのものは目的ではありません。目的は成果です」
とか、なぜか説教されて、
「いや、すべては統計とか言い出したのお前だろ!」
って思ってむかついたけど、とりあえず、
「はい。なるほどですね〜」
って言っといた。

それいまだに根に持ってる。

なぜあそこで怒られたのかさっぱりわからない。おれの質問そんなに失礼だったのか?

アマゾンアフィリエイトのコーナー

水筒です。

水筒欲しい方は適当なの選んで買ってください。

象印 水筒 真空ステンレスボトル 1.0L SJ-TE10-XA ステンレス SJ-TE10-XA

象印 水筒 真空ステンレスボトル 1.0L SJ-TE10-XA ステンレス SJ-TE10-XA

象印 水筒 直飲み ステンレスマグ 480ml ダークココア SM-KB48-TM

象印 水筒 直飲み ステンレスマグ 480ml ダークココア SM-KB48-TM

サーモス 水筒 ステンレススリムボトル 0.5L ブラウン FFM-500 BW

サーモス 水筒 ステンレススリムボトル 0.5L ブラウン FFM-500 BW

象印 水筒 ステンレスボトル 500ml SV-GG50-XA ステンレス

象印 水筒 ステンレスボトル 500ml SV-GG50-XA ステンレス

サーモス 水筒 ステンレススリムボトル 0.5L ブルー FFM-500 BL

サーモス 水筒 ステンレススリムボトル 0.5L ブルー FFM-500 BL

サーモス 水筒 真空断熱ケータイマグ 0.5L ブラック JNO-500 BK

サーモス 水筒 真空断熱ケータイマグ 0.5L ブラック JNO-500 BK

象印 水筒 ステンレスボトル 800ml SJ-TE08-XA ステンレス

象印 水筒 ステンレスボトル 800ml SJ-TE08-XA ステンレス

サーモス 真空断熱スポーツボトル 0.8L ピンク FFF-800F P

サーモス 真空断熱スポーツボトル 0.8L ピンク FFF-800F P