協調フィルタリングで
レコメンドを個人化する
EC サイトの「あなたへのおすすめ」、動画・音楽配信の「次に見る・聴く」候補——これらの多くを支えているのが協調フィルタリングです。商品やコンテンツの中身(ジャンル・スペック)を見るのではなく、「誰が何を高く評価したか」という行動データだけから、個人ごとに好みそうなアイテムを予測します。
アソシエーション分析が「商品同士の組み合わせ」を全体傾向として抽出するのに対し、協調フィルタリングは個人単位でパーソナライズされたレコメンドを作れるのが違いです。
アソシエーション分析(バスケット分析)
商品同士の組み合わせを全体傾向として抽出する、もう1つの代表的な手法です。
協調フィルタリングの実務価値は、商品の説明文やタグを用意しなくても、購買・閲覧・評価のログだけでパーソナライズされたレコメンドを作れることです。一方で、新規ユーザー・新商品には行動データが無い(コールドスタート問題)という弱点があり、実務ではコンテンツベースフィルタリングや人気順表示と組み合わせたハイブリッド運用が定番になります。
- 協調フィルタリング:ユーザーの行動データ(購入・評価・閲覧)から、似たユーザーやアイテムの情報を使ってレコメンドする手法。
- ユーザーベース協調フィルタリング:自分と似た評価パターンを持つユーザーが高評価したアイテムを推薦する方式。
- アイテムベース協調フィルタリング:自分が高評価したアイテムと似た評価パターンを持つアイテムを推薦する方式。
- コンテンツベースフィルタリング:商品の属性(ジャンル・タグ・スペック)を使ってレコメンドする、協調フィルタリングとは別の方式。
- コールドスタート問題:新規ユーザー・新商品に行動データが無く、類似度を計算できない問題。
- 評価行列(ユーザー×アイテム行列):行にユーザー、列にアイテム、セルに評価値(または購入有無)を並べた表。実務では大半のセルが空欄(疎行列)になる。
01.結論:『似ている人・商品』からレコメンドを作る
協調フィルタリングの発想はシンプルです。「自分と好みが似ている人が高く評価したものは、自分も気に入る可能性が高い」という前提に立ち、行動データの類似度からレコメンドを作ります。似ている対象を「ユーザー」に取るか「アイテム」に取るかで、2つの方式に分かれます。
図:評価行列とアイテムベース協調フィルタリングの考え方
「商品A」と「商品D」は他のユーザーの評価パターンがよく似ている(高評価する人・低評価する人が一致)。ユーザーCは商品Aを高評価しているため、未評価の商品Dも高評価しそうだと予測できる。
| 商品A | 商品B | 商品C | 商品D | |
|---|---|---|---|---|
| ユーザーX | 5 | 4 | 1 | 5 |
| ユーザーY | 4 | 5 | 2 | 4 |
| ユーザーZ | 1 | 2 | 5 | 1 |
| ユーザーC | 5 | 4 | 1 | ? |
| 方式 | 似ているものを探す対象 | 特徴 |
|---|---|---|
| ユーザーベース | 評価パターンが似ているユーザー | 直感的だが、ユーザー数が増えるほど類似度計算のコストが増える |
| アイテムベース | 評価パターンが似ているアイテム | アイテム数はユーザー数より安定的に増えることが多く、事前計算・キャッシュしやすい |
上の評価行列と同じ例を、実際に数値を書き換えながら試せます。評価を変えると、コサイン類似度と推薦スコアがその場で再計算されます。
評価は0〜5の整数、空欄は未評価として扱います。数値を書き換えて再計算できます。
| 商品A | 商品B | 商品C | 商品D | |
|---|---|---|---|---|
| ユーザー1 | ||||
| ユーザー2 | ||||
| ユーザー3 | ||||
| ユーザー4 |
スコアは、対象ユーザーが評価済みの各商品とのコサイン類似度 × その評価値を合計したものです。値が大きいほど「評価済み商品との相性が良い」商品です。
なぜこのスコアになるか:商品Dが最も高いスコアなのは、ユーザー4が5点と高く評価した商品Aとの類似度(0.79)に評価値を掛け合わせた「寄与」が、他の評価済み商品より大きいためです。 評価が高いほど、類似度が多少低くても寄与は大きくなります。下の表で商品同士の類似度(生の値)を確認できます。
| 商品A | 商品B | 商品C | 商品D | |
|---|---|---|---|---|
| 商品A | — | 0.97 | 0.50 | 0.79 |
| 商品B | 0.97 | — | 0.64 | 0.83 |
| 商品C | 0.50 | 0.64 | — | 0.50 |
| 商品D | 0.79 | 0.83 | 0.50 | — |
評価パターンが似ている商品同士ほど濃いオレンジになります。推薦スコアは、評価済み商品との類似度を積み上げて計算されます。
02.ユーザーベース vs アイテムベース
ユーザーベース協調フィルタリングは、対象ユーザーと評価パターンが似ている「近傍ユーザー」を見つけ、その人たちが高く評価しているが対象ユーザーがまだ評価していないアイテムを推薦します。似ているかどうかの計算には、コサイン類似度やピアソン相関を使うのが一般的です。
類似度・距離の指標
協調フィルタリングの計算根幹であるコサイン類似度・ピアソン相関を整理しています。
アイテムベース協調フィルタリングは逆に、アイテム同士の評価パターンの類似度を先に計算しておき、対象ユーザーが高評価したアイテムに似ているアイテムを推薦します。ユーザー数が数百万〜数億に膨れ上がるサービスでは、ユーザー同士の類似度を都度計算するより、比較的安定しているアイテム間の類似度を事前計算しておくアイテムベースの方が計算コストを抑えやすくなります。
| 観点 | ユーザーベース | アイテムベース |
|---|---|---|
| 計算コスト | ユーザー数の増加に弱い(数百万人規模では重い) | アイテム類似度は事前計算・キャッシュしやすい |
| 説明のしやすさ | 『あなたに似たユーザーが評価』は伝わりやすい | 『この商品を見た人はこちらも見ています』は最も定番の表現 |
| 新しい嗜好への追従 | 似たユーザーの最新トレンドを拾いやすい | アイテム間の関係が変わらない前提なので、流行の変化にはやや弱い |
実務データの評価行列は大半のセルが空欄の疎行列になるため、近傍探索だけでは精度が頭打ちになることがあります。SVD(特異値分解)やALS(交互最小二乗法)のような行列分解(Matrix Factorization)は、ユーザーとアイテムをそれぞれ少数の潜在因子(好みの傾向を表す軸)に圧縮し、欠損セルの評価値を予測します。Netflix の推薦精度コンペティションで注目された手法で、scikit-surprise などのライブラリで手軽に試せます。
自前で行列分解を実装しなくても、BigQuery MLならCREATE MODEL ... OPTIONS(model_type='MATRIX_FACTORIZATION')で学習し、ML.RECOMMEND関数にユーザーIDの入ったテーブルを渡すだけで推薦スコアを取得できます。GA4や購買データをすでにBigQueryへ集約している会社なら、追加のインフラなしにSQLだけで試せるのが利点です。AWSではAmazon Personalizeが同種のマネージドサービスで、行動データを取り込んで「User-Personalization」(協調フィルタリングベースのレシピ)や「SIMS」(本記事のアイテムベースと同じ発想のアイテム間類似度)を選ぶだけで運用できます。
BigQueryへのデータ集約自体を検討している場合は、Search ConsoleのデータをBigQueryに蓄積して分析基盤を作る手順を別記事で整理しています。GA4・購買データも同じBigQueryプロジェクトにまとめれば、この協調フィルタリングの学習にもそのまま使えます。
Search Console × BigQuery × Looker Studio
BigQueryへのデータ集約とダッシュボード化の手順を整理しています。
03.コンテンツベースフィルタリングとの違い
協調フィルタリングとよく比較されるのがコンテンツベースフィルタリングです。両者の違いは、「行動データだけを見るか」「アイテムの中身も見るか」にあります。
| 観点 | 協調フィルタリング | コンテンツベースフィルタリング |
|---|---|---|
| 使うデータ | 購入・評価・閲覧などの行動データのみ | 商品のジャンル・タグ・スペックなどの属性データ |
| 強み | 属性データを用意しなくても始められる。意外性のあるレコメンドが出やすい | 新商品でも属性さえあればレコメンドできる(コールドスタートに強い) |
| 弱み | 新規ユーザー・新商品に弱い(04章) | 属性が近いものばかり推薦しがちで、意外性に欠ける |
実務では、どちらか一方だけを使うのではなく、両者を組み合わせたハイブリッド方式が採用されることが多くなります。たとえば「新商品はコンテンツベースで属性の近い商品として露出させ、行動データが十分たまった後は協調フィルタリングに切り替える」といった運用がよく使われます。
04.コールドスタート問題|新規ユーザー・新商品への対応
協調フィルタリングの最大の弱点がコールドスタート問題です。行動データが1件も無い新規ユーザーや新商品は、他の誰・何とも類似度を計算できず、レコメンドの対象から外れてしまいます。
| 対象 | 対策 | 備考 |
|---|---|---|
| 新規ユーザー | 登録時に興味カテゴリを選ばせる/人気順・急上昇順を初期表示する | 行動データが数件たまった時点で協調フィルタリングに切り替える |
| 新商品 | コンテンツベースフィルタリングで属性の近い商品として露出 | 一定の購入・閲覧数がたまるまでの『つなぎ』として機能させる |
| 行動データ全体が疎(サービス立ち上げ初期) | ルールベースのレコメンド(新着・人気・キュレーション)を併用 | データが蓄積するまでは協調フィルタリング単体に依存しない |
評価行列は疎(ほとんどのセルが空欄)になりがちなため、たまたま数件だけ評価が一致しているユーザー・アイテム同士が、実際以上に高い類似度として計算されることがあります。共通して評価しているアイテム数が一定件数(たとえば5件)未満のペアは類似度計算から除外する、といった最小共起数のしきい値を設けるのが安全です。
05.実務ユースケース|EC・メディア・SaaS
| 業種・領域 | 行動データの中身 | 活用例 |
|---|---|---|
| EC | 購入履歴・カート投入・閲覧履歴 | 「あなたへのおすすめ」枠、閲覧履歴に基づくリターゲティング広告のクリエイティブ選定 |
| 動画・音楽配信 | 視聴・再生履歴、評価(高評価・低評価) | 次に見る・聴く候補の並び順、ホーム画面のパーソナライズ |
| オウンドメディア・ニュース | 記事の閲覧・滞在時間・シェア | 「あなたにおすすめの記事」枠、メールマガジンの記事セレクト個人化 |
| SaaS プロダクト | 機能の利用ログ、テンプレート・連携先の選択履歴 | オンボーディングでの機能提案、アップセル対象機能のレコメンド |
個人単位のレコメンドではなく、行動データから顧客をグループ分けして施策を出し分けたい場合は、別記事で扱っている手法が候補になります。
クラスタリング・顧客セグメンテーション
行動データから顧客をグループ化する、もう1つの教師なし学習の代表例です。
06.実装例(Python)
pandas と scikit-learn だけでも、アイテムベース協調フィルタリングの基本形は組めます。評価行列を作り、アイテム間のコサイン類似度からレコメンドを生成する流れです。
# pandas + scikit-learn でアイテムベース協調フィルタリング
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
# df: user_id, item_id, rating の3列(ロング形式のログ)
rating_matrix = df.pivot_table(
index="user_id", columns="item_id", values="rating"
).fillna(0)
# アイテム間のコサイン類似度行列(アイテム数 x アイテム数)
item_similarity = cosine_similarity(rating_matrix.T)
item_sim_df = pd.DataFrame(
item_similarity, index=rating_matrix.columns, columns=rating_matrix.columns
)
def recommend_for_user(user_id, top_n=5):
user_ratings = rating_matrix.loc[user_id]
rated_items = user_ratings[user_ratings > 0].index
# ユーザーが高評価したアイテムに似ているアイテムのスコアを合算
scores = pd.Series(dtype=float)
for item in rated_items:
similar_items = item_sim_df[item].drop(rated_items, errors="ignore")
scores = scores.add(similar_items * user_ratings[item], fill_value=0)
return scores.sort_values(ascending=False).head(top_n)
print(recommend_for_user(user_id="user_C"))行列分解ベースの手法まで含めて本格的に実装する場合は、scikit-surprise(SVD・KNNBasicなど複数アルゴリズムを共通インターフェースで比較できる)や、大規模データ向けの Spark MLlib の ALS 実装が選択肢になります。
07.評価と落とし穴
協調フィルタリングは「評価が高そうな順」を出すランキング問題として評価します。実際に評価した値の誤差(RMSE・MAE)だけでなく、上位k件にどれだけ好みのアイテムが含まれるか(Precision@k・Recall@k)を併用するのが実務的です。
協調フィルタリングは、多くのユーザーに評価されているアイテムほど類似度計算の材料が豊富になり、結果としてすでに人気なアイテムがますます推薦されやすくなる傾向があります。長期的にはロングテールの商品・コンテンツが露出しにくくなる「フィルターバブル」の一因にもなり得るため、レコメンド枠の一部に人気度で補正したスコアや意図的な多様性(探索的な提示)を混ぜる設計がしばしば採用されます。
この「人気なものだけを出し続けるか、新しい候補も試すか」というトレードオフは、レコメンド枠の常時最適化を扱う別記事のテーマとも重なります。
バンディットアルゴリズム
レコメンド枠の常時最適化に使われる、もう1つの手法です。
08.よくある質問(FAQ)
ユーザーベースとアイテムベース、どちらを使うべきですか?
ユーザー数が多く増減も激しいサービスでは、類似度を事前計算しやすいアイテムベースが選ばれやすくなります。ユーザー数が少なく安定している、あるいは「あなたに似たユーザーが評価」という説明のしやすさを重視するならユーザーベースも選択肢になります。多くの大規模サービスはアイテムベースか、その発展形である行列分解(SVD・ALS)を採用しています。
協調フィルタリングとコンテンツベースフィルタリングは併用できますか?
できます。実務ではハイブリッド方式が採用されることが多くなります。新商品や新規ユーザーのようにデータが無い対象にはコンテンツベースで属性の近いものを推薦し、行動データが十分たまったら協調フィルタリングに切り替える、あるいは両者のスコアを重み付けして合成するといった組み合わせ方が一般的です。
コールドスタート問題は完全に解決できますか?
協調フィルタリング単体では原理的に解決できません。行動データが無い対象には類似度を計算する材料が無いためです。実務では、コンテンツベースフィルタリング・人気順表示・登録時のアンケートなど、行動データに依存しない代替手段を組み合わせて「つなぎ」とし、データが十分たまった時点で協調フィルタリングに主軸を移す設計にします。
小規模なサービスでも協調フィルタリングは使えますか?
ユーザー数・アイテム数が極端に少ないと類似度計算が不安定になり、精度が出にくい傾向があります。目安として、行動データが十分に蓄積していない立ち上げ初期は、人気順・新着順・手動キュレーションのようなルールベースのレコメンドから始め、データが一定量たまってから協調フィルタリングへ段階的に移行すると無理がありません。
09.まとめ
協調フィルタリングは、行動データ(購入・評価・閲覧)だけから個人ごとにパーソナライズされたレコメンドを作れる手法です。ユーザーベースとアイテムベースの2方式があり、実務ではアイテムベースが選ばれることが多くなります。コンテンツベースフィルタリングと組み合わせたハイブリッド運用で、コールドスタート問題(新規ユーザー・新商品にデータが無い弱点)を補うのが定番の設計です。
協調フィルタリングを使ったレコメンド設計の伴走支援を行っています
弊社ではAIフル活用のデータ分析支援を提供しています。レコメンドロジックの設計、コールドスタート対策、A/Bテストでの効果検証まで、実データで伴走しながら整えています。お気軽にお問い合わせください。

