廿TT

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

[searchConsoleR]CUSUM管理図で掲載順位の変化点を半自動検出

Search Console ではページごとの平均掲載順位(position)のデータが取れるけど、順位の変動を見張るのは大変である。

そこでCUSUM管理図の考え方を使って、変化点の検出を半自動化してやろう。

CUSUM管理図については Google アナリティクスデータの変化を検知するための CUSUM 管理図 - 廿TT に書いた。

まず、平均からの偏差の累積和を取る関数を以下のように定義する。

cscore <-function(x,threshold){
  avg <-mean(x)
  cusum <-cumsum(x-avg)
}

あとはサーチコンソールからデータを取ってきて、dplyr でページごとに関数 cscore を適用してやるだけである。

今回は、掲載順位が下がったページを検出する。

which.min を which.max に変えれば、掲載順位が上がったページを取り出すこともできる。

library(searchConsoleR)
library(dplyr)
scr_auth()
sc_websites <- list_websites()

scdata <- search_analytics(sc_websites[1,1], 
                           dimensions = c("date","page"),
                           dimensionFilterExp = "page~~entry",
                           rowLimit = 100000)

scdata_check<- scdata %>% 
  dplyr::filter(!is.na(page)) %>% 
  arrange(page,date) %>% 
  group_by(page) %>% 
  dplyr::filter(n()==91) %>% 
  mutate(cscore=cscore(position)) %>% 
  mutate(cpt=which.min(cscore)) %>% 
  mutate(cdate=date[cpt]) %>% 
  mutate(before=cpt<=row_number()) %>% 
  group_by(page,before) %>% 
  mutate(mean_pos=mean(position)) %>%  
  group_by(page) %>% 
  dplyr::filter(max(mean_pos)-min(mean_pos)>=10,91-cpt>7) %>% 
  ungroup()

searchConsoleR の 関数、search_analytics ではデフォルトだと 90 日間分のデータを取ってくる。

いくつかゴミのように NA の行が混じっているので、最初の filter はそれを削除している。

90 日間分のデータがないページもあるので、2番目の filter はそれを削除。

最後の 3 番目の filter は、平均掲載順位の変動が 10 以上で、かつ変化のあった日から 8 日以上経過したページのみを抽出している。

「10以上」とか「8日以上」とかの数字は適宜チューニングしていただきたい。

ここでは、あまり細かい変動に一喜一憂してもしかたないので「10以上」、こういうデータはだいたい一週間単位の周期性がありそうなので「8日以上」という数を選んでいる。

CUSUM管理図は理屈が単純でわかりやすいので、こういう背景知識(経験と勘)を入れやすいのがメリットだと思う。

そういった経験や勘を使えない、または使いたくない場面では、たとえば changepoint パッケージなどを利用すればよいだろう。

最終的には、抽出されたページの順位の変動を目視でも確認したほうがよいだろう。

今回はたまたま該当するページが 1 件だったが、複数ある場合もコードはまったく同じである。

library(cowplot)
ggplot(scdata_check,aes(x=date,y=position))+
  geom_point()+
  geom_line()+
  geom_step(aes(y=mean_pos),colour="red",size=1)+
  facet_wrap(~page)

f:id:abrahamcow:20170703231343p:plain

赤い線はその期間の平均掲載順位を表す。

ばらつきの大きいデータなので順位の変動は偶然ということもあり得るが、たしかに掲載順位が下がっていそうな感じがする。

このやり方では順位の変動は検知できても、なぜそうなったかはわからないことが多い。

実務的には Web 担当者に「この期間なにかやりましたか?」と聞いてみるのがいいだろう。

また、クエリを見ることで、特に順位の下がったキーワードや、検索者のモチベーションの変化が伺えることもある。

該当ページでフィルタをかけ、変化点の前後のクエリごとのデータを取ってきて、表にまとめてみる。

ここで、NA(一回も表示されていない場合)は 0 と置くことにする。

.x が変化前、.y が変化後の数字を表す。

formattable パッケージを使うと、エクセルでいう条件付き書式みたいなことができる。

check_page <-distinct(scdata_check,page,cdate)

querydata1 <- search_analytics(sc_websites[1,1],
                               endDate = check_page$cdate[1]-1, 
                               dimensions = c("query"),
                               dimensionFilterExp = paste0("page~~",check_page[1]))
querydata2 <- search_analytics(sc_websites[1,1],
                               startDate = check_page$cdate[1], 
                               dimensions = c("query"),
                               dimensionFilterExp = paste0("page~~",check_page[1]))

querydata <-full_join(querydata1,querydata2,by="query") %>% 
  arrange(desc(impressions.x))

querydata[is.na(querydata)]<-0

library(formattable)
formattable(select(querydata,query,impressions.x,impressions.y,position.x,position.y),
             list(impressions.x=color_bar("pink"),
                  impressions.y=color_bar("pink")),
             digits = 2)


query impressions.x impressions.y position.x position.y
ロジックツリー エクセル 52 8 24.8 23.0
ロジックツリー mece 42 3 9.5 16.0
ロジックツリー フリーソフト 13 0 23.0 0.0
リスティング ビッグワード 12 0 228.8 0.0
ロジックツリー ソフト 9 3 20.2 24.3
リスティング広告 ロジックツリー 4 1 19.8 28.0
エクセル ロジックツリー 3 5 22.7 19.4
decision tree tool 2 0 5.0 0.0
word 樹形図 2 2 42.5 42.5
ロジックツリー excel 2 1 26.5 24.0
ロジックツリー ツール 2 11 23.5 32.8
互いに排反 2 2 37.0 38.0
排反 意味 2 1 43.5 35.0
mece tree 1 0 16.0 0.0
mece 1 0 20.0 0.0
tex 樹形図 1 1 29.0 29.0
ディシジョンツリー 1 37 118.0 120.9
ロジカルツリー 1 2 44.0 42.5
ロジックツリー とは 1 1 42.0 47.0
ワード 樹形図 1 1 44.0 41.0
排反 背反 1 1 23.0 20.0
背反 数学 1 2 35.0 41.0
excel ロジックツリー 0 3 0.0 19.7
mece ロジックツリー 0 2 0.0 12.0
エクセル 樹形図 0 2 0.0 51.5
ロジックツリー 作成 0 2 0.0 26.5
ロジックツリー 本 0 18 0.0 6.5
排反 0 1 0.0 38.0
集合 樹形図 0 1 0.0 13.0

表を書き出して html に埋め込みたい場合は format_table 関数を使うとよいだろう。

sink("FT.txt")
format_table(select(querydata,query,impressions.x,impressions.y,position.x,position.y),
            list(impressions.x=color_bar("pink"),
                 impressions.y=color_bar("pink")),
            digits = 2)
sink()

表を見ると、トップの「ロジックツリー エクセル」は、順位に大きな変動はないもののインプレッションが減っており、一方、順位の低い「ディシジョンツリー」など意外なワードでインプレッションが増えていることもわかる。

このことはページ別に見たときの平均掲載順位を下げる方向に寄与する。

もし可能なら、これらのキーワードを Google トレンドやキーワードプランナーのデータと照らし合わせて、新たなコンテンツづくりの参考にするのがよいだろう。

ページタイトルを書き換える手もある。

10年つかえるSEOの基本

10年つかえるSEOの基本

検索にガンガンヒットさせるSEOの教科書

検索にガンガンヒットさせるSEOの教科書