[latexpage]
こんにちは、エンジニアの建三です。イタンジに入社して3週間ほど経ちますが、主に機械学習を業務で使っています。
弊社のネット不動産ノマドでは、様々な条件を入力することにより理想のお部屋を探すことが出来ます。その条件の一つが最寄り駅です。
でも、どの駅に住みたいかはっきり決まってる人はそういません。ユーザーが選択した駅だけでなく、その駅に似た駅の近くにあるお部屋も紹介出来れば、より選択肢が広まりますよね!
では「似た駅」というのは一体どういうことでしょう?同じ路線上にある駅は当然似ていますが、それだったらユーザーが自分で選択すれば良いですよね。ユーザーが思ってもいなかったような駅をお勧めするにはどうしたら良いでしょうか?
使用するデータ
機械学習をする上で必要不可欠なものはデータですが、駅のレコメンデーションを作る上で僕が着目したデータはノマドの「見たいリスト」です。見たいリストはユーザーが内見したいと思ったお部屋のリストのことです。
例えば、あるユーザーの見たいリストに物件が10個あり、そのうち5つの最寄り駅が三田、残りの5つが品川だとしましょう。ということは、三田でお部屋を探してる人は品川も気になっているかもしれないということが分かります。勿論これはある特定のユーザーのデータなので説得力に欠けます。しかし全てのユーザーの見たいリストを使えば、それぞれの駅の潜在的な「距離」を計算することが出来ます。
協調フィルタリング
レコメンデーションを作る上での王道な手法は協調フィルタリング(Collaborative Filtering)というものです。シンプルで尚且つ非常に効果的なアルゴリズムですので、今回は色んなバリエーションのうちの一つを簡単に説明しようと思います。
以下がシンプルなダミーデータです。rowが駅でcolumnがユーザーです。実際のデータはrowもcolumnも大量にあります。ユーザーAは麻布十番のお部屋を4つ、赤羽橋のお部屋を3つ見たいリストに入れているということになります。パッと見て、麻布十番は赤羽橋とは似てるけど、三田とはそんなに似てないなというのが分かりますよね。では実際に2つの駅がどれだけ似ているか計量化するにはどうしたら良いでしょうか?
ユーザーA | ユーザーB | ユーザーC | |
麻布十番 | 4 | 2 | 0 |
三田 | 0 | 1 | 5 |
赤羽橋 | 3 | 3 | 1 |
ピアソンの積率相関係数(pearson product-moment correlation coefficient)を使ってそれぞれの駅がどれだけ似ているか計算することが出来ます。
$p(X,Y ) = \frac{cov(a b)}{\sigma X \sigma Y} $
ピアソンの積率相関係数の値は−1から1です。全く同じ駅は1、逆に全く似ていない駅は−1になります。
計算後は以下のようになります。rowとcolumnが両方駅になっています。
麻布十番 | 三田 | 赤羽橋 | |
麻布十番 | 1 | -0.945 | 0.866 |
三田 | -0.945 | 1 | -0.982 |
赤羽橋 | 0.866 | -0.981 | 1 |
ご覧の通り麻布十番と赤羽橋のなす角は0.866なので、かなり似ていることが分かります。逆に麻布十番と三田のなす角は-0.945なので、ほぼ真逆ですね。
後はこれを駅毎に近い順に並び替え、
インプット | 駅1 | 駅2 | 駅3 |
麻布十番 | 1 | 0.866 | -0.945 |
三田 | 1 | -0.945 | -0.982 |
赤羽橋 | 1 | 0.866 | -0.981 |
インプットと同じ駅を省けばレコメンデーションの完成です!
インプット | 駅1 | 駅2 |
麻布十番 | 赤羽橋 | 三田 |
三田 | 麻布十番 | 赤羽橋 |
赤羽橋 | 麻布十番 | 三田 |
では幾つかの駅で結果を見てみましょう。
下北沢
- 世田谷代田
- 新代田
- 明大前
- 代田橋
- 東松原
- 下高井戸
- 東北沢
- 永福町
- 笹塚
- 西永福
住吉
いかがでしたか?
各物件には最寄り駅のデータが3つあるので、それを使えばもっと精度の良いものになるのかもしれません。何か良いアイディアがあったら是非お話しましょう!
イタンジ株式会社ではエンジニアを募集しています
募集しています!一緒に開発しましょう!
不動産業界を怠惰・短気・傲慢な気持を持って徹底的に革新するエンジニア募集! - イタンジ株式会社の新卒・インターンシップ - Wantedly