ポータルサイトにおけるランキング機能の効果と設置方法

ポータルサイトによくある機能として、ランキングがあります。

Amazon、楽天、価格.comなどのECサイトには、必ずと言っていいほど「売上」や「売れ筋」のランキングが組み込まれています。
食べログなどの口コミサイトだと「レビュー順」、ニュース系のポータルサイトには「人気の記事」のように、ほとんどのポータルサイトでランキングが設置されています。

では、なぜここまで多くのサイトでランキング機能が設置されるのでしょうか。

ランキング機能の効果

よく「日本人はランキングに弱い」と言われています。

素直で柔軟性のある国民性の日本人は、多くの人が良いと思っているものに対して影響を受けやすいようです。

アクセス数が増える

「人気があるから安心」「みんなと共感・共有したい」などの理由から、ランキングの上位のページはユーザーの興味を引き、アクセスされやすくなります。

またポータルサイトでは大量のページが存在するため、そのページをカテゴリなどに分類することが多いですが、それだけだとユーザーの流れが単調になっていきます。

そこでランキングを設置することで、「他の人はどんなページを見ているのだろう」「人気のあるページはどんなのだろう」と、そのユーザー自身が普段探さない切り口でページを提示することができるので、ページビューを増やす効果があります。

コンバージョン率が上がる

ECサイトなどでは「人気がある」というバイアスがかかるため、本来興味がないものも少し良く見え、コンバージョンにつながりやすくなります。

昨今は、ランキングよりもSNS経由の方が効果があるとされることもありますが、ランキングの効果が下がっているわけではないので、まだまだ効果はあるでしょう。

ただしユーザーもシビアに見ているので、運営者側が露骨に操作を入れるなどをしてランキングに信頼性がなくなると、効果は表れづらくなるので注意しましょう。

一般的なランキングの例

・売れ筋ランキング
・アクセスランキング
・レビュー評価順
・スタッフおすすめランキング

ユーザーの、「人気があるものを知りたい」という要望を叶えるような切り口でランキングを作るのが一般的です。
ユーザーが求めていない条件でのランキングではあまり効果は出ません。

そういう意味では、「新しく更新されたものが知りたい」という要望を叶える「新着/更新順の一覧」表示は、ある種のランキングと呼べるかもしれませんね。

特定の範囲で区切って表示する

・カテゴリ別
・日付別
・エリア別

ユーザーの目的がはっきりしている場合は、余計な情報は邪魔になるので、ランキングをユーザーの探している範囲に区切り、ターゲットを絞り込んで表示するのも効果的です。

ランキング機能の設置方法

開発技術的な話ですが、MySQLなどのデータベースからランキングを取得する方法について紹介します。
今回は一般的なアクセスランキングをサンプルにしてみました。

用意するデータベースのテーブル

pagesテーブル

ページデータ用テーブル

id name body created
(ページID) (ページ名) (本文) (公開日)
1 ページA 本文A 2017-12-27 00:00:00
2 ページB 本文B 2017-12-28 00:00:00
3 ページC 本文C 2017-12-29 00:00:00

accessテーブル

アクセスログ用テーブル

page_id datetime
(ページID) (アクセス日時)
1 2017-12-31 00:00:00
1 2017-12-30 00:00:00
1 2017-12-30 00:00:00
2 2017-12-31 00:00:00
2 2017-12-31 00:00:00
3 2017-12-30 00:00:00

rankingテーブル

アクセス数集計用テーブル

page_id yesterday last_month
(ページID) (昨日のアクセス数) (先月のアクセス数)

上記のようなテーブルを用意します。

最後のrankingテーブルの数値は毎日集計する必要があり、手動で入れるわけにはいかないので、SQLで生成しようと思います。

# アクセス数集計用のSQL文
INSERT INTO ranking
SELECT
	pages.id AS page_id,
	IFNULL(y.count,0) AS yesterday,
	IFNULL(l.count,0) AS last_month
FROM
	pages
LEFT JOIN (
	SELECT page_id, COUNT(*) AS count
	FROM access
	WHERE datetime = ADDDATE(CURRENT_DATE(), -1)
	GROUP BY page_id
	) AS y ON y.page_id = pages.id
LEFT JOIN (
	SELECT page_id, COUNT(*) AS count
	FROM access
	WHERE datetime>= DATE_ADD(DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY), INTERVAL -2 MONTH)
	AND datetime < DATE_ADD(DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY), INTERVAL -1 MONTH)
	GROUP BY page_id
	) AS l ON l.page_id = pages.id
ON DUPLICATE KEY UPDATE
	yesterday = values(yesterday),
	last_month = values(last_month);

一回のSQL文でテーブルへの書き込みを完了させたかったので、無駄に長くなってしまいました。

データは「昨日」と「先月」で集計するようにしてみましたが、これだと先月の数字は1か月間全く変わらないので、「過去24時間」「過去30日間」のようなSQL文の方が、簡単に書けてランキングとしても「日間ランキング」「月間ランキング」のように使いやすそうです。

ざっと書いたのでもう少しキレイな書き方もあるかもしれません。

上記SQLを実行すると、以下のように集計結果がテーブルに保存されます。

rankingテーブル

(2018年1月1日に計算した場合)

page_id yesterday last_month
1 1 3
2 2 2
3 0 1

これをcronなどで毎日自動更新するように設定しておくと便利です。

テーブルからデータの取得方法と並び順の結果

集計結果のテーブルが作れたら、あとはそれをもとに並び順を指定して取得するだけなので比較的簡単です。

公開日が新しい順

これは集計結果のテーブルを使わずに、いわゆる普通に並べる場合の取得方法です。

# 公開日が新しい順に取得するSQL文
SELECT id, name, body
FROM pages 
ORDER BY created DESC;
id name body created
3 ページC 本文C 2017-12-29 00:00:00
2 ページB 本文B 2017-12-28 00:00:00
1 ページA 本文A 2017-12-27 00:00:00

昨日のアクセス数順

# 昨日のアクセス数が多い順に取得するSQL文
SELECT id, name, body, yesterday AS access
FROM pages 
LEFT JOIN ranking ON ranking.page_id = pages.id
ORDER BY ranking.yesterday DESC;
id name body access
2 ページB 本文B 2
1 ページA 本文A 1
3 ページC 本文C 0

先月のアクセス数順

# 先月のアクセス数が多い順に取得するSQL文
SELECT id, name, body, last_month AS access
FROM pages 
LEFT JOIN ranking ON ranking.page_id = pages.id
ORDER BY ranking.last_month DESC;
id name body access
1 ページA 本文A 3
2 ページB 本文B 2
3 ページC 本文C 1

こんな感じでアクセス数順にデータを取得できるので、あとはforeachなどで回してHTMLを書き出せば完成です。

まとめ

ポータルサイトにおけるランキング機能の効果と設置方法を紹介しました。

効果については、設置すれば必ず効果があるものではなく、表示する場所やランキングの切り口など、良い結果がでるようにトライアンドエラーを繰り返していきましょう。

設置方法についての上記のサンプルは、データベースに保存されているアクセスログの集計と集計結果順でのデータ取得と、本当にシンプルな例です。実際に自分で開発するには他にもphpなどの知識が必要になるので一筋縄ではいかないと思います。

データベースは下手に弄るとサイトが表示できなくなったりトラブルも起こりやすいので、自信がない方は必ずバックアップを取るようにしましょう。また、弊社のような専門の制作会社などに相談するほうが早く簡単に実現できます。

ランキング設置の相談をする

WordPressをお使いの場合は、便利なプラグインなどもありますので、自分の環境がどのような方法でランキング機能を設置できるかを知ることから始めてみてはいかがでしょうか。

追記

タイムリーなことに、この記事を公開した2時間後に「ランキングの設計はどうあるべきか?|深津 貴之 (fladdict)|note」という記事が挙がっており、さらに踏み込んだランキングについての考えが書かれていました。

当記事ではランキングについて安易に書いていますが、実際に運用するには奥が深いですね。