廿TT

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

[SEO]目標ページビュー数に達するまでに必要な記事の数を Google ウェブマスターツールのインデックスステータスから計算してみる

はじめに

このブログは個人のものですが、「廿TT」というメディアを運営しているつもりになってみます。

当サイトの場合、集客を安定的に成長させることが可能なのは、自然検索トラフィックだと考えました。

RGoogleAnalytics で変化の要因を読みとく(変化量と寄与率のグラフ+散布図) - 廿TT を参照)

自然検索トラフィックからのページビュー数は、なにはともあれ記事の数を増やすことによって増やすことができそうです。

今回はもう一歩踏み込んで、目標ページビュー数に達するまでに必要な記事の数を、回帰分析によって概算します。

Google ウェブマスターツールのインデックスステータス

Google ウェブマスターツールから、Google にインデックスされたページ数を見ることができます。

f:id:abrahamcow:20150103215705p:plain

週次で2014年のインデックスステータスのデータをダウンロードして R に読み込みます。

ISBT <- read.csv("~/Downloads/abrahamcow-hatenablog-com_20150102T003716Z_IndexStatusBasicTimeseries.csv")

1月5日週から12月最終週までのデータが読み込まれました。

> head(ISBT) #先頭6行
      日付 インデックスに登録されたページの総数
1 14/01/05                                   71
2 14/01/12                                   76
3 14/01/19                                   77
4 14/01/26                                   78
5 14/02/02                                   80
6 14/02/09                                   83
> tail(ISBT) #末尾6行
       日付 インデックスに登録されたページの総数
47 14/11/23                                  257
48 14/11/30                                  269
49 14/12/07                                  269
50 14/12/14                                  280
51 14/12/21                                  292
52 14/12/28                                  295

RGoogleAnalytics

では次にサイトのページビューの情報を Google アナリティクスから引っ張ってきます。

これくらいは管理画面からダウンロードしても大して手間にはなりませんが、ぼくは RGoogleAnalytics を使うことにします。

RGoogleAnalyticsについては、

を参照してください。

まずアクセストークンをコピペしてオーサライズ、

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

クエリは下記のようになります。

sta =paste("20",ISBT[1,1],sep="") #ISBTの最初の日付と合わせる
en ="2014-12-31"

ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:week,ga:channelGrouping",  
           metrics = "ga:pageviews",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)
PVs<- ga$GetReportData(query)

チャネルごとの貢献度

ひとまず全期間を合算して、棒グラフでどのチャネル(訪問経路)のページビュー数が多いか見てみます。

channel <- tapply(PVs$pageviews,PVs$channelGrouping,sum) #合算
df2 <- data.frame(channel=rownames(channel),PVs=channel)
#
library(ggplot2)
library(scales)
#描画
theme_set(theme_bw(15,"HiraKakuPro-W3"))
ggplot(df2,aes(x=reorder(factor(channel),PVs),y=PVs)) +
  geom_bar(stat="identity") + 
  scale_y_continuous(labels = comma) +
  coord_flip() +
  labs(x="チャネル(訪問経路)",y="ページビュー数",title="2014年合計")

f:id:abrahamcow:20150103221407p:plain

やはり Organic Serch(自然検索)が多いようです。

インデックスステータスとページビュー数の相関

次にインデックスステータスとページビュー数の相関を散布図で見てみます。

organic <- PVs[PVs$channelGrouping=="Organic Search",] #自然検索経由セッションのページビュー数
allss <- tapply(PVs$pageviews,PVs$week,sum) #全体のページビュー数

df1 <- data.frame(date=seq.Date(as.Date(sta),as.Date(en),by="week"), #日付オブジェクトの生成
                  allPVs=allss,
                  organicPVs=organic$pageviews,
                  index=ISBT$インデックスに登録されたページの総数)
len <-dim(df1)[1]
df1 <- df1[-len,] #最終週は7日間ないのでオミット
#データ再整形終わり
#作図
p1 <- ggplot(df1,aes(x=index,y=organicPVs))
p <- p1 + geom_point()+
  scale_y_continuous(labels = comma)+
  labs(x="年/月",y="ページビュー数")+
  labs(x="インデックスに登録されたページの総数",y="ページビュー数",title="自然検索経由")
p

f:id:abrahamcow:20150103222634p:plain

インデックスに登録されたページの総数(横軸)が増えるにつれて、ページビュー数(縦軸)も増える傾向が伺えます。

(散布図の読みかたについては、直帰率と新規率の相関を調べて新規訪問者が回遊しやすいサイトになっているかチェックする - 廿TT を参照。)

回帰分析

回帰分析は、

ページビュー数 = a × インデックスに登録されたページの総数

という単純な比例の式でデータの傾向を説明するモデルです。

ふつうは y=ax+b のような線形の式を用いますが、今回 x は「インデックスに登録されたページの総数」です。

ページの総数が 0 でページビュー数があると考えるのは不合理なので、あえて切片 b をなくします。

fit1 <- lm(data=df1,organicPVs~index-1)

これで係数 a の推定が完了しました。

できあがった傾向線を散布図に重ねてみます。

p +
  geom_abline(intercept = 0, slope=coef(fit1), colour=4, size=1.5, alpha=0.7)

f:id:abrahamcow:20150103223548p:plain

予測

このモデルを使って、目標ページビュー数に達するまでに、何ページインデックスを増やせばいいか予測してみます。

アフィリエイト収入の目安だが、月に3~4万円ぐらい稼ぐには、月間10万ページビューぐらい必要だ。

社畜とノマドとの静かなる戦争: 『ニートの歩き方―年収100万円で楽しく暮らすためのインターネット活用法』pha : 金融日記

とのことです。月間10万ページビューということは週次約2万5千ページビュー、これを目標にしてみます。

y =ax の形のモデルなので、x=y/a で逆算できます。

> 目標<-100000/4
> 目標
[1] 25000
> 目標/coef(fit1)
   index 
6276.585 

目標到達には 6276.585 ページ必要です。

無理です。

pha さんになるのは諦めました。

ニートの歩き方 ――お金がなくても楽しく暮らすためのインターネット活用法

ニートの歩き方 ――お金がなくても楽しく暮らすためのインターネット活用法

モデルの妥当性

最後にこんなことを言うのは申し訳ないのですが、そもそもこのモデルはあまり妥当なものとは言いにくいです。

回帰分析の診断には 残差プロット正規Q-Qプロットを用いるのがふつうです。

観測値の傾向線からのズレは誤差、まったく意味のないランダムのものとして処理しています。

残差プロットは観測値の傾向線からのズレの距離(残差)を図示したものです。

plot(resid(fit1),type="b")

f:id:abrahamcow:20150103225856p:plain

これをみる限り残差に周期性(下がって、上がって、下がって、上がって、下がってる)があります。

また回帰分析は誤差が正規分布であることを仮定しています。正規Q-Qプロットで、点が一直線上に並べば並ぶほど、誤差が正規分布に近いと言えます。

qqnorm(resid(fit1))
qqline(resid(fit1),col="red3")

f:id:abrahamcow:20150103225749p:plain

これをみる限り一直線に並んでおらず、うねるような動きをしています。

つまり、意味のない誤差と思っている部分に、意味のある情報が残っており、モデルがそれをカバーしきれていないということです。

時系列データには周期性や季節性がありますから、単純な回帰分析を行うとこのような結果になりがちです。

『Rによる時系列分析入門』(田中 孝文)では、時系列データに対して回帰分析を行って、うまくデータを説明出来ていたので、ぼくもやってみたのですがだめでした。

Rによる時系列分析入門

Rによる時系列分析入門

これを教訓にして、回帰分析をする際は残差プロットや、Q-Qプロットを書いてみてください。

すみません。以上です。

関連エントリ

abrahamcow.hatenablog.com