勉強会に行ってみた!第41回「意外と簡単!『この商品を買った人はこんな商品も買っています』を作ってみよう」
event

勉強会に行ってみた!第41回「意外と簡単!『この商品を買った人はこんな商品も買っています』を作ってみよう」

2016.10.26

今回はレコメンドエンジンの実装です。難しい理論とかツールを使うのかなと思ったら、とてもシンプルな考え方と数行のコードでできちゃうみたいなんです。いったいどんな感じなんでしょうか?

三土たつお

会場は渋谷のクロスタワーにある株式会社ビズリーチでした。

講師は同社の石坂優太さん。

石坂さんは就活サイトのような企業向けサイトの担当をしているそうです。たとえば就活中のそれぞれの学生の希望に合わせたおすすめの企業を表示する、といった場面でレコメンドを使っているそうです。

レコメンドの仕組みはどうなっている?

まずはレコメンドの種類と仕組みについてです。

「この商品を買った人はこんな商品を買っています」っていうの見たことありますよね。テンション・リダクション効果というのがあって、何か買った後は気が緩んでさらに別のものを買いやすい心理状態になるんです。そこで適切なオススメ商品を表示することによって、売上が10%上がるとも言われています

テンション・リダクション効果! そんなものがあるんですね。だからこそ、レコメンドが重要だと。

レコメンドの手法はいくつかあります。AmazonやYoutubeで使われているのは「協調フィルタリング」というものです。簡単にいえば、好みが近い人が好きな商品をオススメするというものです。
協調フィルタリングの仕組みはこんな感じです。

青い線は、既存のユーザーがこれまでに買った商品を表しています。そこに、右端のユーザーが新たに赤い線の先の商品を買ったとしましょう。
その商品は、真ん中のユーザーも買っています。つまり、右端のユーザーにとって真ん中のユーザーは「好みが近い人」です。

「好みが近い人」である真ん中のユーザーが買った商品のうち、真ん中の二つの商品については、右端のユーザーはまだ買っていません。なので、これをおすすめするということになります

なるほど。自分に好みが近い人が買った商品のうち、自分がまだ買っていないものがおすすめされる、ということですね。

レコメンドの仕組みを実装してみよう

ではさっそく実装しましょう。今回は Python でやります。

今回実装するのはこんな内容です。とあるECサイトのユーザーAさんに、協調フィルタリングを使って商品をおすすめします。

手順としてはこんな感じです。

簡単にいうと、Aさんに好みの近い人を見つけ、好みが近い順に、その人が買った商品のうちAさんがまだ買っていない商品を表示する、となります。順番に行きましょう。

まず、購入履歴データを取り込みます。購入履歴データは今回はCSVデータで、こんな形式になっています。

購入履歴データを読み込む

まず、これを一行ずつ読み込んで [(“Aさん”,”商品A”), (“Aさん”,”商品B”), .. ] みたいなタプルの配列にまとめます。その部分のコードはこんな感じ。

pandas というライブラリを使って「testdata.csv」を読み込み、一行ずつをタプルにしている感じがなんとなく分かると思います。ここまでの結果は変数 conversions に入っています。

購入履歴データをお客さんごとにまとめる

次に、購入履歴をお客さんごとにまとめます。

{ “Aさん”:[ “商品A”, “商品B”}, “Bさん”: [“商品C”, “商品G”, “商品H”], … }

みたいな形ですね。Pythonでいうディクショナリにまとめます。コードは次のとおり。

さっきまとめた配列の中身を順番に見て、お客さんごとに商品の配列を持つディクショナリdata_dic を作っています。

参加者のみなさんも、手元の環境で1ステップずつ進めています。真剣な顔ですね。

Aさんとその他の共起数をとる

次は、Aさんに好みの近い人を探します。そのために、Aさんと同じ商品をどれだけ買ったか?をユーザーごとにまとめます。それが共起数です。

コードはこんな感じ。

お客さんごとに、「Aさんの買った商品の集合」と「そのお客さんの買った商品の集合」の積集合の長さを取っています。つまり、同じ商品を買った個数ですね。そしてそれを個数の多い順にソートしています。

この時点で、count_list には [('Zさん', 2), ('Cさん', 1), ('Dさん', 1), ...]
のように、そのユーザーがAさんと同じ商品を何個買ったかが入っています。個数が多いほど好みが近いということですね。

共起数の高い順にオススメとして表示する

ここまでで、Aさんに好みの近い人が順番に分かりました。あとは、その人たちが買った商品を表示してあげればOKです。

好みの近い人の順に、その人が買った商品をオススメ商品リスト(rec_item_list)に追加しています。rec_item_list を表示してみると、結果はこんな感じになりました。

Aさんのオススメは商品A、B、Y、X、Zだそうです!

ただ、Aさんは商品AとBを既に買っているので、実際にオススメするならそれを除いて商品Y、X、Zということになりそうですね。また、好みの近い人がたった一個買ったものよりは、好みの近い人たちが共通して買ったものをオススメしたほうがいいのかもしれません。そういうやり方の違いはいろいろあるんでしょうね。

まとめ

本当に簡単でした!前に読んだ「集合知プログラミング」という本では、協調フィルタリングだけで分厚い章が割り当てられていて、いろんな方式やライブラリーがあるんだなということで漠然と難しそうと思ってしまっていました。

でも単純なやり方でよければこの程度のコードで実現できちゃうんですね!実はやってみたら意外に簡単、というものはこれに限らず他にもいろいろありそうだな、試さなきゃ損だなと思いました。

以下のリンクに、今回の資料やサンプルデータがありますので、みなさんもぜひお手元でやってみてください。


今回行った勉強会:「意外と簡単!『この商品を買った人はこんな商品も買っています』を作ってみよう」
http://d-cube.connpass.com/event/39131/

原稿:三土たつお
1976年生まれ。プログラマー、ライター。プログラマーとしてはふだんPHPを書いてます。
ライターとしてはニフティのデイリーポータルZとかで書いてます。近著「街角図鑑」(実業之日本社)。
http://mitsuchi.net/

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW