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

廿TT

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

Google アナリティクスのインタレストカテゴリを平行座標プロットで再クラスタリング

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

インタレストカテゴリとは

Google ではオンラインでの活動や購買行動からユーザーの興味・関心を推測して、ユーザーを分類しています。

この分類は「インタレストカテゴリ」と呼ばれています。

Google アナリティクスでは、インタレストカテゴリには「アフィニティ カテゴリ」、「購買意向の強いセグメント」、「他のカテゴリ」の 3種類があります。

今回はこの中で「購買意向の強いセグメント」(interestInMarketCategory)を使うことにします。

インタレストカテゴリは階層型の分類をベースにしていますが、Google アナリティクスでこれを平坦にしています。

たとえばカテゴリが次のような階層になっている場合、

  • ソフトウェア
    • インターネット ソフトウェア
      • インターネット クライアントおよびブラウザ

Google アナリティクスでは、次のように表示されます。

  • ソフトウェア
  • ソフトウェア / インターネット ソフトウェア
  • ソフトウェア / インターネット ソフトウェア / インターネット クライアント、ブラウザ

つまり、「ソフトウェア / インターネット ソフトウェア / インターネット クライアント、ブラウザ」のカテゴリに分類されたセッションは、「ソフトウェア / インターネット ソフトウェア」カテゴリと「ソフトウェア」カテゴリにも分類されます(ユーザー属性とインタレスト カテゴリについて - アナリティクス ヘルプ)。

あまり細かく分類しすぎると見るのが大変になるため、今回は階層のトップのカテゴリのみを使用することにします。

分析

属するセグメントが違えば見るページも違うだろうということで、RGA パッケージを使って、interestInMarketCategory と landingPagePath ごとの newusers のデータを取得しました。

各セグメントのユーザーが、なにを入り口にこのブログにアクセスしたのかを知ることで、ユーザーの好みを推測し、新規ユーザー獲得のヒントにしようというわけです。

以下はランディングページごとの新規ユーザー数の棒グラフです。

f:id:abrahamcow:20161224110242p:plain

これを見ただけでどのユーザー層がどのページに関心を持っているか推測するのは難しそうなので、もう少し工夫します。

各ページにランディングしたユーザー数をユーザーの総数で割る処理を、各セグメントごとに行いスケールをあわせてやります。

この「各ページにランディングしたユーザー数をユーザーの総数で割った値」を「入り口率」と呼ぶことにします。

入り口率を縦軸に、ランディングページを横軸にとり、セグメントごとに色分けして線でつなぐことで、セグメントごとのランディング傾向を把握します。

こういうのを平行座標プロットといいます。

f:id:abrahamcow:20161224102635p:plain

普通の折れ線グラフの線は推移を表すものですが、平行座標プロットでの線は「同じセグメントですよ」ということを知らせるために引きます。

心眼を働かせると、ピンクの "Sports & Fitness" と、紫の "Gifts & Occasions" が特徴的な動きをしてることがわかります。

そこで interestInMarketCategory を "Sports & Fitness" と "Gifts & Occasions" と、その他("Other")に再編してしまいましょう。

"Other" のユーザーがよくアクセスしているのに "Sports & Fitness" や "Gifts & Occasions" のユーザーがアクセスしないランディングページや、その逆を探します。

そのためには "Sports & Fitness" や "Gifts & Occasions" のユーザーの入り口率から "Other" のユーザーの入り口率を、ランディングページごとに引いてやります。

今回は差の絶対値が 0.1 を超えた場合を、「大きな差」と判断することにしました。

結果、大きな差が出たランディングページは、以下でした。

Category landingPagePath 入り口率 Other との差
Sports & Fitness /entry/2015/01/15/073029 0.34 0.21
Gifts & Occasions /entry/2015/01/17/064522 0.17 0.11

ここまでの集計&プロットを実行する R のコードは以下の通りです。

library(RGA)
library(tidyr)
library(dplyr)
library(cowplot)

authorize()
prof <-list_profiles()
dat_ga <-get_ga(profileId = prof$id[1],
                start.date = "2016-07-01",
                end.date = "2016-12-20",
                dimensions = "ga:interestInMarketCategory,ga:landingPagePath",
                metrics = "ga:newusers")

#カテゴリ名に / が入っていないのがトップカテゴリ
primary <-dat_ga %>% 
  dplyr::filter(!grepl("/",interestInMarketCategory)) %>% 
  group_by(interestInMarketCategory) %>% 
  mutate(ratio=newusers/sum(newusers)) %>% 
  ungroup()

ggplot(primary)+
  geom_bar(aes(x=landingPagePath,y=newusers),stat = "identity")+
  facet_wrap(~ interestInMarketCategory)+
  coord_flip()+
  theme(axis.ticks.y=element_blank(),axis.text.y=element_blank())

ggplot(primary,aes(x=landingPagePath,y=ratio,group=interestInMarketCategory,
                   colour=interestInMarketCategory))+
  geom_line()+
  geom_point()+
  theme(axis.ticks.x=element_blank(),axis.text.x=element_blank())

unique(primary$interestInMarketCategory)

myclass <-primary %>% 
  mutate(class=ifelse(interestInMarketCategory=="Sports & Fitness"|
                        interestInMarketCategory=="Gifts & Occasions",
                      interestInMarketCategory,"Other")) %>% 
  group_by(class,landingPagePath) %>% 
  summarise(newusers=sum(newusers)) %>% 
  group_by(class) %>%
  mutate(ratio=newusers/sum(newusers)) %>%
  ungroup()

myclass2 <-myclass %>% select(-newusers) %>% 
  spread(landingPagePath,ratio,fill=0) %>% 
  gather(landingPagePath,ratio,-class) %>% 
  group_by(landingPagePath) %>% 
  mutate(resid = ratio-ratio[class=="Other"]) %>% 
  ungroup()

myclass2 %>% dplyr::filter(class=="Sports & Fitness") %>% 
  arrange(desc(abs(resid))) %>% 
  dplyr::filter(abs(resid)>=0.1)

myclass2 %>% dplyr::filter(class=="Gifts & Occasions") %>% 
  arrange(desc(abs(resid))) %>% 
  dplyr::filter(abs(resid)>=0.1)

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

全然関係ないけど最近買った本です。

まだ読んでないのでおもしろいかわかりませんが、みんなも買ってくれ。

郵便局と蛇: A・E・コッパード短篇集 (ちくま文庫)

郵便局と蛇: A・E・コッパード短篇集 (ちくま文庫)

付録

abrahamcow.hatenablog.com


混合多項分布を使ってモデルベースのクラスタリングをしても、"Sports & Fitness" と "Gifts & Occasions" とその他に分類されました。

f:id:abrahamcow:20161224110113p:plain

library(mixtools)

primary_wide <-primary %>% 
  select(-ratio) %>% 
  spread(landingPagePath,newusers,fill = 0)

fit_k3 <-multmixEM(as.matrix(primary_wide[,-c(1:2)]),k=3)

primary2 <-primary_wide %>% 
  mutate(class=apply(fit_k3$posterior,1,which.max)) %>% 
  gather(landingPagePath,newusers,-interestInMarketCategory,-class)

ggplot(primary2)+
  geom_bar(aes(x=landingPagePath,y=newusers,fill=factor(class)),stat = "identity")+
  facet_wrap(~ interestInMarketCategory,scale="free_y")+
  theme(axis.ticks.x=element_blank(),axis.text.x=element_blank())+
  labs(fill="class")