3回にわたってNetflix・Amazon・Spotifyのデータ戦略を見てきた。
それぞれの戦略には固有の特徴があるが、3社に共通する設計思想の「核」がある。今回はその共通点と相違点を整理し、日本の通販企業が「何を学び、何を実装すべきか」を明確にする。
3社の戦略を1枚の表に収める
| 項目 | Netflix | Amazon | Spotify |
| 解決した問い | 「見たいものを見る前に届ける」 | 「まだ欲しいと気づいていないものを届ける」 | 「知らなかったが絶対好きな曲を届ける」 |
| 主な手法 | 協調フィルタリング + 行動シグナル + サムネイル最適化 | アイテムベース協調フィルタリング + リアルタイム | 協調フィルタリング + NLP(自然言語処理) + 音声分析 |
| 最大のROI | 解約防止 (年間10億ドルのコスト削減) | 売上増加 (売上の35%に寄与) | 継続率向上 (Discover Weekly導入で2倍) |
| 独自の強み | サムネイルの個別最適化 | チェックアウト時のレコメンド | 「Wrapped(まとめ)」によるデータのユーザー還元 |
| リスク | 受動的視聴の助長 | 「不気味なレコメンド」 | フィルターバブル(好みの固定化) |
3社が共有する「5つの設計原則」
原則①:「過去」ではなく「今」を見る
3社全てが「過去の購買・視聴・聴取」だけでなく「今日の行動」をリアルタイムで反映させている。
昨日のデータより今日の行動が重要だという認識だ。
原則②:「明示的評価」より「暗黙的フィードバック」を信頼する
星評価・いいね・レビューという「言葉で表明した好み」より、スキップ・再視聴・プレイリスト追加という「行動で示した好み」の方が正直だ。という共通認識がある。
原則③:「個人最適化」を「全員配信」に対する競争優位にする
どの会社も「同じメッセージを全員に送る」マスマーケティングをベースラインとし、「一人ひとりに異なるものを届ける」パーソナライゼーションを競合との差別化として位置づけている。
原則④:A/Bテストを文化として組み込む
3社全てが日々数百〜数千のA/Bテストを同時並行で実行している。
「データで証明できないことは実装しない」「データが反証するなら直感も諦める」という文化だ。
原則⑤:「良いものを作ること」と「良いものを届けること」を別の問題として解く
コンテンツの品質・商品の品質はレコメンドとは別次元の問題だ。どれだけ良いコンテンツや商品を持っていても、適切な人に届けなければ意味がない。
この認識が3社の共通点だ。
日本の通販企業への「5段階の実装ロードマップ」
理論を実践に落とす。
Stage 1(今日から):「何を一緒に買ったか」を把握する
最もシンプルな協調フィルタリング
「この商品を買った人が他に買った商品」のデータを集計するSQLを実装する。
これがAmazonの「Customers who bought X also bought Y」の出発点だ。
Stage 2(1ヶ月以内):「行動シグナル」を収集し始める
「購買した」だけでなく「閲覧した」「カートに入れた」「検索した」「滞在時間が長かった」というデータを収集・蓄積する。これがNetflixの「暗黙的フィードバック」に相当する。
Stage 3(3ヶ月以内):メールに「パーソナライズされた商品提案」を組み込む
一括配信メールから、「この顧客が次に買う可能性が高い商品」を個別に挿入したメールへの転換。実装の難易度が比較的低く、効果が最も可視化しやすいチャネルだ。
-- Stage 3 実装用:各顧客の「次に買う可能性が高い商品」を推定する
WITH customer_purchase_history AS (
SELECT
o.customer_id,
oi.product_category,
oi.product_id,
MAX(o.order_date) AS last_purchased_date,
COUNT(o.order_id) AS purchase_count
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.status = 'completed'
GROUP BY o.customer_id, oi.product_category, oi.product_id
),
next_purchase_patterns AS (
-- 「商品Aを買った後、商品Bを買うパターン」の強さを集計
SELECT
first_p.product_id AS trigger_product_id,
next_p.product_id AS recommended_product_id,
next_p.product_name AS recommended_product_name,
COUNT(DISTINCT first_p.customer_id) AS co_purchase_count,
ROUND(
100.0 * COUNT(DISTINCT first_p.customer_id)
/ SUM(COUNT(DISTINCT first_p.customer_id))
OVER (PARTITION BY first_p.product_id)
, 1) AS next_purchase_probability
FROM (
SELECT customer_id, product_id,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY last_purchased_date DESC) AS rn
FROM customer_purchase_history
) first_p
JOIN (
SELECT customer_id, product_id, product_name,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY last_purchased_date DESC) AS rn
FROM customer_purchase_history
) next_p
ON first_p.customer_id = next_p.customer_id
AND next_p.rn < first_p.rn -- 最新購買より前の購買
WHERE first_p.rn = 1 -- 最新購買が起点
GROUP BY first_p.product_id, next_p.product_id, next_p.product_name
)
-- 各顧客に対して最もレコメンドすべき商品を特定
SELECT
cph.customer_id,
cph.product_id AS last_purchased_product,
npp.recommended_product_id,
npp.recommended_product_name,
npp.next_purchase_probability
FROM (
SELECT customer_id, product_id,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY last_purchased_date DESC) AS rn
FROM customer_purchase_history
) cph
JOIN next_purchase_patterns npp
ON cph.product_id = npp.trigger_product_id
WHERE cph.rn = 1 -- 各顧客の最新購買
AND npp.next_purchase_probability >= 20.0 -- 20%以上の確率でのみレコメンド
ORDER BY cph.customer_id, npp.next_purchase_probability DESCStage 4(6ヶ月以内):サイト内の「見せ方」をパーソナライズする
トップページのバナー・商品一覧の並び順・カートページの追加提案。ユーザーごとに異なる「店の顔」を作る。
NetflixのサムネイルパーソナライゼーションとAmazonのリアルタイムレコメンドの組み合わせだ。
Stage 5(1年以内):「顧客データの物語化」Wrapped的な返却を実装する
年間購買サマリーを「個人の物語」として顧客に返す。
「今年あなたが最も選んだカテゴリ」「初めての購買からXX日目」「あなたと同じような購買パターンのお客様は、今これを探しています」Spotify Wrappedの通販版だ。