Quantcast
Channel: グラフ - 廿TT
Viewing all articles
Browse latest Browse all 123

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

$
0
0

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)]<-0library(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
ロジックツリー エクセル 528 24.8 23.0
ロジックツリー mece423 9.5 16.0
ロジックツリー フリーソフト130 23.0 0.0
リスティング ビッグワード 120 228.8 0.0
ロジックツリー ソフト 93 20.2 24.3
リスティング広告ロジックツリー 41 19.8 28.0
エクセル ロジックツリー 35 22.7 19.4
decision tree tool 20 5.0 0.0
word 樹形図 22 42.5 42.5
ロジックツリー excel21 26.5 24.0
ロジックツリー ツール 211 23.5 32.8
互いに排反 22 37.0 38.0
排反 意味 21 43.5 35.0
mece tree 10 16.0 0.0
mece10 20.0 0.0
tex樹形図 11 29.0 29.0
ディシジョンツリー 137 118.0 120.9
ロジカルツリー 12 44.0 42.5
ロジックツリー とは 11 42.0 47.0
ワード 樹形図 11 44.0 41.0
排反 背反 11 23.0 20.0
背反 数学 12 35.0 41.0
excelロジックツリー 03 0.0 19.7
meceロジックツリー 02 0.0 12.0
エクセル 樹形図 02 0.0 51.5
ロジックツリー 作成 02 0.0 26.5
ロジックツリー 本 018 0.0 6.5
排反 01 0.0 38.0
集合 樹形図 01 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の教科書


Viewing all articles
Browse latest Browse all 123

Trending Articles