Googleキーワード数2万、表示回数53万のデータから「検索順位」と「クリック率」の関係をグラフにしてみた

Googleのウェブマスターツールには、検索クエリデータを参照できる機能があります。

今回はその中の、「検索結果の平均掲載順位」と「クリック率」をすべて集計し、検索順位とクリック率の関係をグラフ化してみたので紹介です。

「掲載順位が下がると、どのようにクリック率が下がるのか?」など視覚的にわかるかと思います。尚、今回利用したのは、このサイトの3ヶ月分のデータです。

photo by Robert Scoble

スポンサーリンク
レクタングル(大)広告

検索クエリ機能

ウェブマスターツールには、以下のように検索クエリデータを参照できる機能があります。

検索クエリ

そしてその機能では、検索で表示された回数、クリック数、クリック率(CTR)、平均掲載順位を3ヶ月分まで見ることができます。

このテーブルをダウンロード

で実際に、このサイトの3ヶ月分の検索クエリを表示させてみたところ、クエリ数約2万、表示回数約53万、クリック数約8万のデータを参照することができました。

直近3ヶ月のクエリ結果グラフ

これらのデータを見てみると、当然ですが検索掲載順位が高いほどクリック率が高くなり、サイトへの流入が多くなります。

逆に掲載順位が低いほどクリック率が低くなります。

平均掲載順位とクリック率

ただこれ、キーワードによってもばらつきがあるので、「掲載順位が下がると、クリック率(サイトへの流入)も下がる」ということは大まかにわかっても、どんな感じで下がっていくのかなどは分りません。

ちょうどウェブマスターツールには、最大3ヶ月分のデータをCSVでダウンロードできる機能があるので、取得したデータを、Rubyでプログラムで集計してみました。

このテーブルをダウンロード

集計結果

約2万クエリ、すべての掲載順位の表示回数とクリック数を集計して、それをもとに平均掲載順位ごとのクリック数を410位まで計算してみました。

以下がこれらをグラフ化したものです。

全データ

1位から410位まですべてをグラフ化したら、以下のような散布図になりました。

平均掲載順位とクリック率(1~410位まで)

ちょっとロングテールすぎてわかりませんね。

1位~100位まで

全データはちょっと見づらいので、1位から100位までのグラフ。平均掲載順位とクリック率(1位~100位まで)

1位から、順位が下がるにつれて、下降するのはわかるのですが、50位以降クリック率が結構上がるのはなんなんでしょうか。誤差にしても、これだけ50位以降にはっきり現れると、何かあるのかもしれません。

これについては、一応自分なりに、原因をいろいろ考えてみました。

Googleには「検索の設定」に「インスタント検索結果は表示しない」という項目があります。

これに設定すると、Googleの検索結果は、50位とか100位まで表示されます。

Googleインスタント検索の設定

これはあくまで僕の予想ですが、この設定にしている人が検索して、上位で欲しい結果が得られなかった時に、リストをダーっと一気に下がりページャー手前で目に留まったものをクリックしてしまっているのではないかと思います。多分。

1位~50位まで

平均掲載順位とクリック率(1位~50位まで)

20位を過ぎるあたりまでは、クリック率が10%近くあるのですが、そこからガクッと3%ぐらいになります。

1位~20位まで

平均掲載順位とクリック率(1位~20位まで)

10位以下は、だいたい10%弱で横ばいです。

1位~10位まで

ウェブマスターツールで1位~10位までは、0.1単位で平均掲載順位が出力されます。

平均掲載順位とクリック率(1位~10位まで)

1位台は60~40%、2位台は40~20%と急激に下がり、3位から10位までは、緩やかに10%まで下がっていくといった感じです。

すべての数値

やはり、グラフだけでは細かな数値が表示されないので、以下に全てのデータを載せておきます。約2万のキーワード数を集計した結果です。

平均掲載順位 表示回数 クリック数 クリック率
1.0 11956 7356 61.53%
1.1 8306 4781 57.56%
1.2 4263 2133 50.04%
1.3 4218 2096 49.69%
1.4 889 543 61.08%
1.5 2819 1300 46.12%
1.6 3289 1777 54.03%
1.7 2841 1233 43.40%
1.8 1511 769 50.89%
1.9 1866 770 41.26%
2.0 5829 2424 41.59%
2.1 3878 1546 39.87%
2.2 3882 1383 35.63%
2.3 2920 979 33.53%
2.4 2884 1155 40.05%
2.5 1900 785 41.32%
2.6 2135 775 36.30%
2.7 4905 1616 32.95%
2.8 4746 1346 28.36%
2.9 3379 870 25.75%
3.0 3719 1077 28.96%
3.1 8195 1110 13.54%
3.2 8635 1421 16.46%
3.3 9567 1892 19.78%
3.4 11016 1194 10.84%
3.5 32105 2437 7.59%
3.6 19870 3843 19.34%
3.7 2234 622 27.84%
3.8 2345 680 29.00%
3.9 3043 721 23.69%
4.0 6072 1371 22.58%
4.1 2838 751 26.46%
4.2 2687 637 23.71%
4.3 3194 507 15.87%
4.4 5051 777 15.38%
4.5 2017 535 26.52%
4.6 5759 1062 18.44%
4.7 2767 676 24.43%
4.8 2654 685 25.81%
4.9 3543 721 20.35%
5.0 4884 870 17.81%
5.1 8389 726 8.65%
5.2 7631 944 12.37%
5.3 5897 1022 17.33%
5.4 3444 646 18.76%
5.5 7642 1022 13.37%
5.6 3373 531 15.74%
5.7 3046 527 17.30%
5.8 2666 410 15.38%
5.9 2671 335 12.54%
6.0 2141 362 16.91%
6.1 8558 479 5.60%
6.2 2080 297 14.28%
6.3 5173 640 12.37%
6.4 1022 177 17.32%
6.5 6992 372 5.32%
6.6 3047 354 11.62%
6.7 1819 248 13.63%
6.8 2040 203 9.95%
6.9 4948 368 7.44%
7.0 2025 350 17.28%
7.1 2784 249 8.94%
7.2 11750 831 7.07%
7.3 10718 679 6.34%
7.4 4865 359 7.38%
7.5 2726 239 8.77%
7.6 1677 184 10.97%
7.7 3156 379 12.01%
7.8 2975 309 10.39%
7.9 904 93 10.29%
8.0 1972 247 12.53%
8.1 6742 592 8.78%
8.2 2137 212 9.92%
8.3 2911 250 8.59%
8.4 1320 154 11.67%
8.5 4355 341 7.83%
8.6 2759 264 9.57%
8.7 4661 215 4.61%
8.8 1702 245 14.39%
8.9 1171 185 15.80%
9.0 2997 293 9.78%
9.1 39978 1096 2.74%
9.2 3875 172 4.44%
9.3 1256 141 11.23%
9.4 389 49 12.60%
9.5 895 82 9.16%
9.6 1234 114 9.24%
9.7 591 93 15.74%
9.8 6632 198 2.99%
9.9 852 98 11.50%
10 6396 556 8.69%
11 3624 407 11.23%
12 2745 353 12.86%
13 2286 211 9.23%
14 4959 452 9.11%
15 5586 436 7.81%
16 5283 225 4.26%
17 2488 199 8.00%
18 1889 171 9.05%
19 1650 160 9.70%
20 1128 109 9.66%
21 2336 150 6.42%
22 1308 113 8.64%
23 1626 124 7.63%
24 3549 113 3.18%
25 3050 78 2.56%
26 4674 84 1.80%
27 1746 58 3.32%
28 2580 136 5.27%
29 1915 52 2.72%
30 2598 59 2.27%
31 1459 43 2.95%
32 2068 54 2.61%
33 1264 37 2.93%
34 1284 27 2.10%
35 1322 54 4.08%
36 1305 32 2.45%
37 1017 24 2.36%
38 3068 41 1.34%
39 1616 24 1.49%
40 943 25 2.65%
41 1245 27 2.17%
42 2373 23 0.97%
43 1857 15 0.81%
44 1007 14 1.39%
45 773 12 1.55%
46 1889 39 2.06%
47 514 6 1.17%
48 412 11 2.67%
49 402 7 1.74%
50 267 10 3.75%
51 216 11 5.09%
52 55 6 10.91%
53 44 8 18.18%
54 150 3 2.00%
55 177 8 4.52%
56 159 1 0.63%
57 64 3 4.69%
58 130 5 3.85%
59 78 5 6.41%
60 65 2 3.08%
61 53 3 5.66%
62 61 2 3.28%
63 31 5 16.13%
64 23 4 17.39%
65 43 1 2.33%
66 83 3 3.61%
67 26 3 11.54%
68 50 3 6.00%
69 73 1 1.37%
70 39 4 10.26%
71 22 3 13.64%
72 20 0 0.00%
73 36 2 5.56%
74 13 1 7.69%
75 62 2 3.23%
76 47 2 4.26%
77 46 2 4.35%
78 3 0 0.00%
79 23 0 0.00%
80 59 3 5.08%
81 5 1 20.00%
82 31 1 3.23%
83 22 1 4.55%
84 5 1 20.00%
85 15 1 6.67%
86 53 5 9.43%
87 21 3 14.29%
88 32 0 0.00%
89 21 2 9.52%
90 23 2 8.70%
91 33 2 6.06%
92 2 1 50.00%
93 11 0 0.00%
94 7 1 14.29%
95 28 0 0.00%
96 29 0 0.00%
97 17 1 5.88%
98 4 0 0.00%
99 15 4 26.67%
100 225 4 1.78%
110 955 12 1.26%
120 1374 9 0.66%
130 1689 5 0.30%
140 1104 2 0.18%
150 376 1 0.27%
160 164 3 1.83%
170 135 2 1.48%
180 124 1 0.81%
190 96 4 4.17%
200 173 2 1.16%
210 317 0 0.00%
220 412 3 0.73%
230 434 0 0.00%
240 210 0 0.00%
250 56 0 0.00%
260 5 0 0.00%
290 17 0 0.00%
300 1 0 0.00%
340 1 0 0.00%
360 1 0 0.00%
380 2 0 0.00%
410 2 0 0.00%
合計 534898 82543 15.43%

今回使用したプログラム

今回集計用に作った、Rubyのプログラムも以下に載せておきます。

# encoding: utf-8
require "csv"
require 'pp'
csv = CSV.read('sheet.csv')

results = {}

csv.each_with_index do |items, i|
  next if i == 0 #最初の行はとばす
  key = items[4].chomp.to_f
  if results[key]#検索平均掲載順位をハッシュのキーとして
    results[key] = [results[key][0].to_i + items[1].to_i, results[key][1].to_i + items[2].to_i]
  else
    results[key] = [items[1].to_i, items[2].to_i]
  end
end

#pp results.sort

click_rates = []
results.each do |k, v|
  click_rates << [k, v[0], v[1], v[1].to_f/v[0].to_f]
end

click_rates = click_rates.sort {|a, b| a[0] <=> b[0] }

is_csv = false #CSVをファイルに出力する
res_csv = ''
puts "平均\t表示\tClick\tClick率" unless is_csv
click_rates.each do |v|
  if is_csv #CSVとして出力
    res_csv << v[0].to_s + "," + v[1].to_s + "," + v[2].to_s + "," + v[3].to_s + "\n"
  else #ターミナルに表示
    puts v[0].to_s + "\t" + v[1].to_s + "\t" + v[2].to_s + "\t" + sprintf( "%.2f%",  (v[3] * 100))
  end
end

if is_csv
  puts res_csv
  File.write("res_csv.csv", res_csv)
end

CSVデータの文字コードは、UTF-8でないとエラーが出ます。

まとめ

今回使用したのが、このサイトの3ヶ月分だけのデータなので、数値には多少ばらつきがあります。

サイトのターゲットとなるキーワードによっては、結果も変わってくると思うので、あくまで参考程度に見てください。