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 パッケージなどを利用すればよいだろう。
- Twitterが公開したRパッケージBreakoutDetectionについて調べたことメモ(その2) - Technically, technophobic.
- R 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)
赤い線はその期間の平均掲載順位を表す。
ばらつきの大きいデータなので順位の変動は偶然ということもあり得るが、たしかに掲載順位が下がっていそうな感じがする。
このやり方では順位の変動は検知できても、なぜそうなったかはわからないことが多い。
実務的には 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 |
---|---|---|---|---|
ロジックツリー エクセル | 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トレンドやキーワードプランナーのデータと照らし合わせて、新たなコンテンツづくりの参考にするのがよいだろう。
ページタイトルを書き換える手もある。
- 作者:土居健太郎
- 出版社/メーカー:技術評論社
- 発売日: 2015/04/23
- メディア:単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者:渡辺隆広
- 出版社/メーカー:翔泳社
- 発売日: 2008/06/17
- メディア:単行本(ソフトカバー)
- 購入: 7人 クリック: 373回
- この商品を含むブログ (15件) を見る