はじめに
この記事はKaggleアドベントカレンダー2025の21日目です。
初学者が RecSys2025 という推薦システムの国際学会へ参加機会をいただいたことをきっかけに、推薦システムに興味を持って学んだことを記事にしています。学術的な正確性が劣る可能性が高いため、気になった箇所がある際はぜひ専門誌などを参照ください。
ちなみに期間中 3/5 インフルで倒れてました。ここだけの話です。
最初はKaggler界隈に貢献できるような(当然ですがKaggleのアドベントカレンダーなので)Kaggleに寄せた記事を書こうと思っていたのですが、コンペのメダルはおろか、ちゃんとコミットして出場したこともないため、今後推薦系のコンペが来ることを期待して、最近学んだ推薦システムについて記事を書くことにしました。
第0章:空気のような存在、推薦システム
早速ですが、普段「推薦システム」を意識して生活していますか?おそらく「No」という方が大半でしょう。
しかし、私たちは朝起きてSNSを開いた瞬間から、Spotifyで音楽を聴き、Amazonで買い物をし、Netflixで映画を視聴する1日の中で、常に 「レコメンドの嵐」 の中にいます。あまりに自然すぎて気づかないほどですが、もしこの推薦が「的外れ」だったらどうでしょうか。
興味のない動画ばかり流れてくるTikTok、読んだことのある本ばかり勧めてくるAmazon…。きっと私たちはすぐにそのサービスを使うのをやめてしまうはずです。
(気になって調べてみたら、筆者のAmazonのおすすめ書籍、5/8読んだことありました😇)
「空気のように自然で、かつ心地よい」
これこそが、世界中のエンジニアやデータサイエンティストが目指している推薦システムの理想形であり、その裏側には涙ぐましい企業努力と技術の結晶が詰まっています。この状態のサービスはユーザとしても心地よく、体験価値が最大化されている状態と言えるでしょう。
筆者自身、この分野を学ぶまでは何も意識せずにサービスを使っていました。しかし、その裏側の仕組み(アルゴリズム)を少し知るだけで、普段の景色がガラッと変わりました。
「なぜ今、この動画がおすすめされたのか?」その理由が透けて見えるようになると、日常が少しだけ知的で面白くなるのです。
この記事では、そんな推薦システムの全体像を、数式を一切使わずに 解説します。
専門用語もいくつか登場しますが、覚える必要はありません。「へぇ、裏側ではそんな工夫がされているんだ」と、寝る前の読み物として楽しんでいただければ幸いです。
第1章:2つの大きな道 〜「モノ」を見るか、「人」を見るか〜
推薦システム(RecSys)の世界は非常に奥が深いですが、いきなり数式やプログラムから入ると迷子になってしまいます。
そこで今回は、「推薦システム」を「ある本屋の店員さん」に例えて、その頭の中(アルゴリズム)を覗いてみたいと思います。プログラミングの知識は一切不要です。
私たちは「選べない」時代に生きている
現代の大型書店には、100万冊以上の本があると言われています。「何か面白い本ない?」と聞かれても、選択肢が多すぎて普通は答えられません。これが大学図書館や国会図書館であれば尚更です。
- 蔵書数日本1の書店 :約 200万冊(MARUZEN&ジュンク堂書店 梅田店)
- 蔵書数日本1の大学図書館:約 960万冊(東京大学)
- 蔵書数日本1の図書館 :約4800万冊(国会図書館)
そこで活躍するのが、これから紹介する 凄腕の店員さん(推薦アルゴリズム) たちです。彼らはそれぞれ違った得意技(アプローチ)を使って、我々にとっての「運命の一冊」を探し出してくれます。
推薦システムのアプローチは、一番根本で2つの流派に分かれます。「内容ベース」と「協調フィルタリング」という、アイテム自体に注目する手法と、ユーザである人の動きに注目する手法です。
1. 内容ベース・フィルタリング (Content-Based Filtering)
〜本の「中身」を熟知しているこだわり店員〜
まずは、商品の「属性」に着目する店員さんです。
- 店員: 「お客様、以前『名探偵コナン』を買われましたね。あれは 『ミステリー』で『探偵』 が出てくる漫画です」
- 店員: 「なので、同じく『ミステリー』で『探偵』が活躍する『金田一少年の事件簿』も絶対お好きですよ!」
【仕組み】
ユーザーが過去に好んだアイテムと、特徴(ジャンル、キーワード、作者などが似ているものを勧めます。
【弱点:視野が狭くなりがち】
この店員さんには、少し融通が利かないところがあります。
例えば、あなたが『Python入門』という本を買ったとします。すると…
- 店員: 「おや、Pythonですね! ではこちらの『Pythonの教科書』も、あちらの『初めてのPython』もおすすめです! 全部Pythonですから!」
- 客: 「いや、入門書は何冊もいらないよ…」
このように、「似ているけれど不要なもの」を勧めてしまったり、あるいは一生ミステリー小説しか勧めてこない(=意外な出会いがない)という弱点があります。
2. 協調フィルタリング (Collaborative Filtering)
〜「人の噂」に詳しい情報通な店員〜
ここで登場するのが、現在の推薦システムの主流である「協調フィルタリング」です。この店員さんは、本の中身を一切読みません。見ているのは 「誰が何を買ったか」という行動履歴(ログ) だけです。
- 店員: 「私はこの本の内容は知りません。でも、お客様と好みがそっくりな常連のBさんが、この本を買って満足されていましたよ」
- 客: 「へえ、Bさんが。この前話したら、私とBさんは趣味趣向が合うことが多いんですよ。なのでおそらく私も好きな気がします」
【店員さんの頭の中(データ構造)】
実は、この店員さんの頭の中には、以下のような「穴だらけの表(行列)」が入っています。
| ユーザー | 名探偵コナン | Python入門 | サウナ雑誌 | ??? |
|---|---|---|---|---|
| あなた | 5 (好き) | 3 (普通) | ? | ? |
| Bさん | 5 (好き) | ? | 5 (好き) | ? |
| C社長 | ? | 1 (興味なし) | 5 (好き) | ? |
協調フィルタリングとは、この表の「?」の部分を、他の人のデータを使って埋める作業のことなのです。
【この手法の凄さ:セレンディピティ(偶然の幸運)】
この手法だと、こんな「嬉しい発見」が起こります。
- 客: 「普段は真面目なビジネス書しか読まないんだけど…」
- 店員: 「お客様と傾向が似ているC社長、実は週末に『サウナの雑誌』を買われてましたよ。ビジネス書好きの方、意外とサウナで整うのがお好きみたいです」
- 客: 「なるほど! 自分じゃ絶対探さなかったけど、それは気になる!」
内容(ビジネスとサウナ)に関係がなくても、 「人がそう動いているから」 という理由で、意外な正解を導き出せるのが最大の特徴です。
第2章:記憶を頼りに推薦する 〜メモリベース〜
さて、ここからは「協調フィルタリング」の中をさらに深掘りします。まずは、過去のデータをそのまま記憶して戦う「メモリベース」の店員さんたちです。
1. ユーザーベース (User-Based)
〜「ドッペルゲンガー」を探す店員〜
- 店員: 「お客様の過去の購入履歴と、あちらのBさんの履歴、9割同じですね…。いわば Bさんはお客様の分身(類似ユーザー) です」
- 店員: 「Bさんが昨日買ったこの新刊、お客様もきっと好きなはずです」
【現実のサービスでは?】
ニュースアプリ(SmartNewsやGunosyなど)でよく使われます。「あなたと似た属性の人が、今この記事を読んでいます」という推薦です。流行り廃りに敏感に対応できるのが特徴です。
2. アイテムベース (Item-Based)
〜「セット販売」の達人〜
こちらは「似た人」ではなく「似た商品」を探すアプローチです。「この商品を買う人は、あの商品も買う傾向がある」という共起関係を見ます。
- 客: 「キャンプ用に『テント』をください」
- 店員: (テントを買う人の80%は、シュラフも買っているな…)
- 店員: 「でしたら、この『寝袋』もお忘れではないですか?」
- 客: 「おっと、忘れてた。ありがとう」
【現実のサービスでは?】
Amazonの 「よく一緒に購入されている商品」 がまさにこれです。また、YouTubeで「この動画を見た人は、次はこの動画を見ています」というのも、このアイテムベースの考え方が基本になっています。ユーザーの数が膨大になっても計算が破綻しにくいため、Amazonがこの手法を広めたと言われています。
第3章:法則を見つけ出す 〜モデルベース〜
最後に紹介するのは、データをそのまま使うのではなく、高度な計算で「法則(モデル)」を見つけ出す「モデルベース」です。
隠れた好み(潜在因子)を見抜く
〜「味の好み」を分析するソムリエ店員〜
メモリベースの店員さんは単純な記憶力勝負でしたが、モデルベースの店員さんは**「なぜこの人がこれを好きなのか?」**という裏側の理由を計算します。
- 客: 「『ドラえもん』と『スター・ウォーズ』が好きなんだけど、共通点ある?」
- 店員: 「一見バラバラですね。でも私の計算によると、お客様は『ジャンル』ではなく、『ワクワクする冒険』という隠れた成分を重視しているようです」
- 店員: 「なので、ジャンルは違いますが『インディ・ジョーンズ』の原作本も、スコア87.5%でハマる確率が高いですよ」
【現実のサービスでは?】
Netflixなどの動画配信サービスが得意とする分野です。
単に「アクション映画」というタグだけでなく、視聴データを行列分解(Matrix Factorization)などの手法で分析し、「テンポの良さ」「ダークな雰囲気」「主演のカリスマ性」といった、 言語化しにくい「隠れた好み(潜在因子)」 までマッチングさせています。最近話題のディープラーニングを使った推薦も、この「モデルベース」の究極進化系と言えます。
コラム:店員さんの悩みと、エンジニアへの招待状
1. 新人店員の悩み(コールドスタート問題)
ここまで紹介してきた「凄腕の店員さん」たちにも、実は共通の弱点があります。それは 「一見さん(新規顧客)」 です。
- 店員: 「いらっしゃいませ! …おや、初めてのお客様ですね。過去のデータが何もないので、何をお勧めすればいいか分かりません…(汗)」
これを専門用語で 「コールドスタート問題」 と呼びます。
データがないと、似ている人も探せないし、好みの傾向も計算できません。実際のサービスでは、この問題を解決するために「とりあえず売れ筋ランキングを表示する(ベースライン)」や「最初に好きなジャンルを選んでもらう」といった工夫をしています。
新規サービスを使い始める時に上記のような経験をした方も多いのではないでしょうか。別ドメインからの情報転移など、RecSysにおいてもLLMを活用した対策が数多く発表されていましたが、まだまだ技術的な発展の余地がある領域のように思えます。
2. エンジニアの方へ:実装したくなったら
「概念はわかったけど、どうやって作るの?」と思ったエンジニアの皆様。
実は、これらの店員さんを雇う(実装する)のは、そこまで難しくありません。
-
Pythonで試すなら:
SurpriseやLightFMといったライブラリを使えば、数行のコードで協調フィルタリングを試すことができます。 - SQLで試すなら: シンプルなアイテムベースの推薦なら、テーブルの自己結合(Self-Join)でも似たようなロジックを組むことができます。
「推薦システム」と聞くと難しそうですが、まずは身近なデータで「小さなレコメンド商店」を開いてみるのも面白いかもしれません。
おわりに:店員さんは日々進化している
今回は、数式を使わずに「本屋の店員さん」に例えて推薦システムの全体像を紹介しました。
この地図が頭に入っていると、明日からサービスの見え方が変わるかもしれません。
「あ、今Amazonが出してきたオススメは『アイテムベース』の店員さんかな?」「このNetflixのオススメは『モデルベース』で私の深層心理を突いてきたな?」
そんなふうに想像しながらサービスを使ってみると、普段レコメンドされる商品にも色がついて見えるようになります。
今回紹介したのは大枠の分類についてのみですが、興味を持っていただいた方はぜひ色々調べてみてください。無料で閲覧できるしましま先生のPDFはかなり網羅的にまとまっており、業界で有名な先生が大学の講義などで使用しているので信頼性も高いと思います。他にも良い教材などあればコメントで教えてください。
そして、最後までお読みいただきありがとうございました。
Kagglerのみなさんが面白い記事をたくさん書かれているので、ぜひ他のアドベントカレンダーの記事も読んでみてください。
参考文献
Toshihiro Kamishima. (Jul 2023).推薦システム https://www.kamishima.net/archive/recsys.pdf
Yan, Ziyou. (Mar 2025). Improving Recommendation Systems & Search in the Age of LLMs. eugeneyan.com. https://eugeneyan.com/writing/recsys-llm/.



