夫婦で納得の土地探しをするためにLINE Bot作ったりデータサイエンスした話 - ABEJA Tech Blog

ABEJA Tech Blog

中の人の興味のある情報を発信していきます

夫婦で納得の土地探しをするためにLINE Bot作ったりデータサイエンスした話

皆さんこんにちは! ABEJAでデータサイエンティストをしている服部といいます。

本記事はABEJA Advent Calendar2022の10日目の記事になります。

背景

引っ越しから2年....

今からちょうど2年前、、、私は遠方へ引っ越すことになり機械学習で家を決めようとしてアドベントカレンダーを書きました。

qiita.com

結果的に機械学習モデルがオススメした物件には住まなかったわけですが、なんだかんだ無事に家を見つけることは出来ました。 そして今もその家に住んでいます。

そして、2年前に引っ越しをした人(私)は今何を思っているか.....それは戸建(注文)住宅に住みたい.....!!でした。

データサイエンティストとしてのリベンジ

2年前に最終的に機械学習モデルが見つけた物件には住まなかったこと、そして目の前にはアドベントカレンダーが迫っていること、、そうなると答えは一つです。 今回も機械学習・データサイエンスを活用するしかありません。

注文住宅を建てるにはまずは土地から.....ということで今回は「土地探しのためにデータサイエンスを活用」しました。

前回の反省を踏まえて....

土地探しでデータサイエンス....となると真っ先に思いつくのは、オススメの土地を機械学習で見つけてくるという2年前のアイデアでした。 ですが、前回の反省を踏まえて今回そこには使いませんでした。 理由としては以下のものがあります。

1. お得そうに見える土地には絶対に理由がある

事前に自分たちでも土地探しをしていましたが、土地の価格というのは本当にうまいことつけられています。 「お!この土地お買い得では?」という土地も実際には、実は高低差があって造成にお金がかかったり、災害に弱い地域だったり、様々な要因があります。 2年前に賃貸物件を機械学習で探したときも、物件の価格を決める何らかの要素を考慮できていないケースが散見されました。

恐らく今回も機械学習モデルが見つけてくる土地は一見良いように見えて、実は安いのには理由がある....となることが容易に想像つきました。

2. 土地の数はせいぜい限られていて全部探すのも難しくない

ある程度住むエリアが決まってくると、売りに出ている土地の数はせいぜい限られてきます。 そして条件に合う新着物件の数もそれほどないため、人手でやっても全く問題ないです。

今回解く課題

ということで、土地を機械学習で見つけるのは辞めて地道に探していたわけですが、一つ大きな壁にぶつかりました。

それは、土地選びの意見が夫婦で違う部分がある ということです。

これは当然ではあります。 比較的価値観は似ているものの、育ってきた環境や家に求めるものなど全部が一致する訳ありません。 なので多少の違いは出てきます。

そして、ただでさえ100点が存在しないと言われている土地探しで、お互いのものさしが違うとなると意思決定がより難しくなっていきます。。。

ということで、今回はデータサイエンスを使って夫婦での意見の擦り合せを行っていくことにしました!!

土地探しにおける意見の違いとは?

まず、当然ながら使える予算というのは限られているので、限られた予算でどこを重視したいかという話があります。 土地の広さなのか、駅からの近さなのか、治安の良さなのか等々。 同じ予算でも、広くて駅から遠い土地を選ぶ人もいれば、狭くても駅近の土地を選ぶ人もいます。

また予算が無限にあったとしても、同時に満たすのが難しいものもあります。

「駅から平坦な土地がいい」という要望と「家からの見晴らしがいい」という要望は地域によっては成立しません。 「静かな住宅街で暮らしたい」という要望と「近くで何でも買物が出来て便利な場所がいい」という要望もなかなか成立しません。

土地の正解は人それぞれなのです。本当に難しい。。

どうやってデータサイエンスを使って夫婦の擦り合せを行う?

お待たせしました。ようやく本題です。

今回行ったのは「夫婦お互いの土地の価値を定量化する」というものです。 例えば、何となく私は土地の広さを優先していて、妻は駅からの近さを優先している....その状態だと、それがどれくらいの優先度合いなのか、どこまで差があるのかが話し合いをしてもなかなか分かりません。 なので、そこの価値観を数字化して、話し合いの参考にしようという考え方です。 あくまで土地探しという意思決定の支援です。

アプローチ

全体としては以下のアプローチをとりました。

1. 架空の土地条件をランダムに沢山作る

2. 作った土地に対して夫婦それぞれで値段をつける

3. 土地条件から夫婦それぞれの土地の値付けを予測するモデル(夫モデル、妻モデル)を作る

4. 夫モデル、妻モデルそれぞれの変数(土地条件)の寄与度を比較する → 価値観を定量的に比較する

また、その後も候補の土地が見つかった際に、それぞれのモデルでの夫婦それぞれにとっての価格を予測して

  • 実際の価格との価格差を確認して、土地のお得さを確認する(予測価格に比べて実際の価格が小さい方がお得)
  • それぞれの予測価格を比較することで、夫婦どちらの好みを優先しているかが分かる

といったことが出来るようになり、土地の購入判断に役立てるといった使い方も想定しています。

実装

1. 架空の土地条件をランダムに沢山作る

土地は「土地面積」「駅からの距離」「最寄り駅」「土地の形状」など色んな条件によって価値が決まります。

これらを自分たちが候補とする範囲内からランダムに選んでいきます。 「土地面積をXX~XX坪の中からランダムに決定」「最寄り駅をA駅, B駅, C駅からランダムに決定」....といった形です。

以下の点を考慮しながら作りました。

土地条件の項目数や取りうる範囲が増えすぎないようにする

ここで無駄に数や範囲が増えてしまうと、必要なデータ数が増えたり予測モデルの学習に影響があるため、以下のようにしました。

  • 必須となる条件は項目に含めない
    • 例: 道路沿いに面していない土地は候補から外すのであれば、道路沿いかどうかを条件に
  • 自分たちにとって候補とならない範囲は最初から外す
    • 例: 30坪以上しか候補にしない場合、30坪以上でランダムにする

自分たちにとって関連性が高い項目を入れる

一般的な土地条件に関する項目を一覧で入れるよりは、あくまで私達にとって大事な項目が入っているかが重要です。

事前に夫婦で土地に関する会話はある程度していたため、それを元に自分たちにとって関連性が高そう項目を入れました。

例えば、子供がこれから通うことになる「小・中学校までの距離」を入れたり、駅まで坂道かどうかを気にした会話をしていたので「駅まで坂かどうか」を入れたりしました。

ただし、条件項目の数が増えすぎないよう、ある程度の大事そうなものに絞りました。

2. 作った土地に対して夫婦それぞれで値段をつける

いわゆるアノテーションです。

出来るだけ効率的に出来るように、、ということで今回は「LINE Botを作ってアノテーションする」という方法を取りました。

LINE Botを採用したのは

  • 育児の都合もありPCの前で作業する時間を長くとれないため、スマホで作業できるようにしたかった
  • 土地の条件も価格の入力もテキスト情報のみで十分である
  • 専用のUIを作るのは一時的な用途に対して無駄が多い

といったところからです。

あとは個人的に一度作ってみたかった(それにアドベントカレンダーのネタのため)というのもあります。

LINE Botの概要

基本的にはシンプルで、

土地情報をbotが送信→いくら出せるかユーザーが回答→次の土地情報をbotが送信→.....

といったことを繰り返していきます。 以下の様な形です。

Bot: 50坪 建ぺい率50% A駅徒歩10分.....
ユーザー: 4000(万円)
Bot: 40坪 建ぺい率40% B駅徒歩20分.....
ユーザー : 3000(万円)

バックエンド

土地の情報の用意とユーザーの回答を保存する機能が必要になり、LINE Botの裏にはバックエンドの処理が必要になります。 具体的には以下の流れです。

  1. 事前に疑似生成した土地をデータベースに保存
  2. ユーザーにデータベースから取得した土地情報を送信
  3. ユーザーの回答メッセージ(何円か?)をデータベースに保存
  4. 1と2を必要なデータ数だけ繰り返す

LINE Botのバックエンドとしては、 Cloud Functions + FireStore を利用しました。

FireStoreをデータベースとして、土地情報とユーザの回答メッセージを保存します。(厳密にはユーザの回答ステータスのようなものも管理します) CloudFunctionsは、ユーザのメッセージに応じて、Firestoreにアクセスして会話文を作る機能を担います。

全体図としては、シンプルですがこういった形になりました。

Cloud Functions + LINE Botに関してはネット上にも事例がいくつかあり、参考にさせていただきました。

Cloud Functions (Python3)入門用に LINE BOTを作ってみる - Qiita

Cloud Functions for Firebaseを使ってLINE botを作る(with Cloud Firestore)|co6ei note

土地情報の作成とFireStoreに登録

この部分はPython上で実装しました。

大したことはしていませんが、土地に関するパラメータのクラスを作り、各パラメータについてはlistで選択肢を用意します。 坪数など数字に関するものも、統一的に扱うために全てlistにしています。 そして、試行回数分、各パラメータのlistからランダムに選んで擬似的な土地情報が作れます。

作った土地情報はfirebase_adminの batch.commit() を使ってDBに登録しました。

実際のコードより少し簡略化していますが、いかのような形です。

import random
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore


class Parameters:
    tsubo = list(range(30, 80))  # 坪数
    building_coverage_ratio = [40, 50, 60]  # 建ぺい率
    station_distance = list(range(3, 30))  # 駅までの距離
    pschool_distance = list(range(5, 25))  # 小学校までの距離
    jschool_distance = list(range(5, 25))  # 中学校までの距離
    maguchi = [6, 8, 10, 12]  # 間口
    shape = ["四角", "四角以外"]  # 土地の形
    ...


random.set_seed(2022)
cred = credentials.Certificate("xxxxx.json")
firebase_admin.initialize_app(cred, {
    'projectId': 'xxxxx',
})
db = firestore.client()
batch = db.batch()

pamas = Parameters()
N = 1000

for land_ix in range(N):
    land_info = {
        "最寄り駅": random.choice(params.nearest_station),
        "駅までの距離": random.choice(params.station_distance),
        "坪数": random.choice(params.tsubo),
        "建ぺい率": random.choice(params.building_coverage_ratio),
        ....
    }
    doc = db.collection(u'land_db').document(str(land_ix))
    batch.set(doc, land_info)

batch.commit()

妻からのフィードバック

やはり実際にやってみないと分からないのでユーザの声を聞きながら改善するのは大事です。 ということで、LINEBotの使い方を説明し、実際に数件やってもらいました。

その結果

  • ありえない土地があって評価しづらい
  • 1円も払いたくない土地はどうしたらいいの??
  • そもそもエクセルじゃダメなの??

などのありがたいフィードバックをいただきました。

1つ目のありえない土地については、出来る限りルール的に除きました。 例えば、土地の地域が「第一種低層住居専用地域」のとき、(少なくとも私の対象としているエリアでは)建ぺい率はほぼ40%か50%のため、「第一種低層住居専用地域」かつ「建ぺい率が60%以上」のものは条件から除きました。またそれ以外にも確率的に高い土地が増えるように、一部土地のパラメータは選択する確率を調整しました。例えば角地の土地のほうが実際は少ないので、角地以外の土地の確率が高くなるように調整する形です。

2つ目については、まずは興味持てないような土地は出来る限り減らしました。そのうえで、0円にすると外れ値として扱いが難しくなるため、そういった土地は対象外と入力する形にしました。

そして3つ目「エクセルじゃダメなの??」に関しては涙しながら、「これはアドベントカレンダーだから...」と返しました。

最終的なBotの姿

このような形になりました。以降は土地情報と回答が繰り返されます。

100件で限界を迎える・・・

最終的に夫婦それぞれ100件分のデータに対して価格付けを行いました。 LINE Botでサクサク出来るかと思いましたが、思った以上に大変で100件が無理のない範囲で限界でした。

画像分類のようなアノテーションと違い、1件ずつこれまでの入力との整合性含め考えることが多いものでした。 そして100件ですら後半は「あと何件だろう....」と1件ずつ思いながらでなかなか大変でした。

おまけ: 夫婦の回答傾向を比較してみる

モデルを作る前に簡単にそれぞれの回答について比較してみます。

回答の分布

それぞれの回答のヒストグラムです。 オレンジが私で、青色が妻です。 価格帯は伏せています。

少し私のほうがバラツキが大きく、高めに答える傾向があることが分かりました。 ただ平均的には大きな差はないので、二人とも土地代の感覚に大きなズレはないといえるかもしれません。

回答の分布

こちらは横軸が私の価格、縦軸が妻の価格です。 見れば分かると思うのですが思った以上に相関がなく、相関係数は0.3程度でした。 相関係数がマイナスでないだけ良しとしましょう....

3. 土地条件から夫婦それぞれの土地の値付けを予測するモデル(夫モデル、妻モデル)を作る

いよいよモデルづくりです。 以下の図のように、説明変数は同じ土地情報、目的変数はそれぞれのLINEでの入力になります。

精度よりも解釈性を優先させているため特徴量エンジニアリングはほぼ行っていません。 前処理として標準化、カテゴリ変数のみOne-hotエンコーディングをしています。

モデルはL2正則化での重回帰分析(Ridge回帰)を用いました。

ちなみに、データ数が100件と少ないことと、目的変数にもブレがあるからか、正則化なしでの線形回帰では過学習しました。

データサイエンスと言いながら、モデル作成に関してはあまり工夫はしていません.... (LINE Bot作ってたらいつの間にか時間なくなってました)

4. 夫モデル、妻モデルそれぞれの変数(土地条件)の寄与度を比較する → 価値観を定量的に比較する

ついにそれぞれのモデルの係数を比較します。

※我が家のプライバシーが含まれるため、全体の数字のスケールを変えたり一部数字は変更しています。

坪数 255.1 75.7
小学校までの距離 40.2 -685.9
土地の中に高低差があるか -515.6 -345.8
駅までの距離 -497.5 -50.8
間口 173.9 228.8
駅までに坂があるか -24.5 -151.1
中学校までの距離 10.4 -37
建ぺい率 65.9 -39.7
土地が四角 -15.3 145.4
ハザード強い 7.4 63.3
角地 38.7 62.5
前面道路_広い 3 -1.1
前面道路_普通 -13.3 65.2
前面道路_細い 10.3 -64.1
周辺地域_新興住宅地(一種低層住居) 476 66.5
周辺地域_きれいな住宅地(一種中高層住居) 59.1 -24.5
周辺地域_きれいな住宅地(一種低層住居) -2 4.9
周辺地域_少し古い住宅地(一種中高層住居) -299.4 -26.6
周辺地域_少し古い住宅地(一種低層住居) -230.7 -16.9
最寄り駅_駅A -8.4 -82.7
最寄り駅_駅B 110.2 70.7
最寄り駅_駅C -53.3 90.7
最寄り駅_駅D -52.7 -80.7
車通り_多い -12.1 -74.7
車通り_少ない 19.2 10.1
車通り_普通 -7.1 64.6

数字がプラスのものはその数字が大きいほど、価格が高くてよいと思っているものになります。 例えば、「角地」については二人ともプラスの数字がついている→角地である土地のほうが価格が高くていい→すなわち角地のほうがいいと思っているというのが分かります。

変数間の差を見るというよりは、私と妻の間での差を見るのが中心になります。 ここで分かることをいくつか上げていきます。

広さを私のほうが優先している

坪数に対しての係数は以下の通りでした。

私: 255.1
妻: 75.7

基本的に広いほうが、価格が高くてよいと思うため、プラスの値なのは自然です。 そして数字が大きいほうが、坪数が増えることによる価値の上昇を大きく考えている、すなわち広さを優先しているということが分かります。

私のほうが3倍くらい大きくなっており、広い家を望んでいる事がわかります。

これは事前に二人で話をしていたときにも見えていたところであり納得感があるものです。

二人共駅Bが一番最寄り駅として気に入っている。駅Cについては意見が食い違っている。

最寄り駅をone-hotエンコーディングしたものに対しての係数としては以下の通りでした。

最寄り駅_駅A -8.4 -82.7
最寄り駅_駅B 110.2 70.7
最寄り駅_駅C -53.3 90.7
最寄り駅_駅D -52.7 -80.7

駅Bは二人共プラスであり、駅Bであることは価値がプラスと考えていることが分かります。

駅Cでは、私はマイナスなのに妻はプラスとしています。

これを元に駅Cについて話をしてみたところ、駅Cについて私が治安が悪いと思っていたらそれは別の駅だったということが分かり、私の勘違いによる差だということが分かりました。 ここで気付いてよかったです。

住宅地: 私は新興住宅地信者で綺麗さを優先、妻は低層住居であることを優先

周辺地域_新興住宅地(一種低層住居) 476 66.5
周辺地域_きれいな住宅地(一種中高層住居) 59.1 -24.5
周辺地域_きれいな住宅地(一種低層住居) -2 4.9
周辺地域_少し古い住宅地(一種中高層住居) -299.4 -26.6
周辺地域_少し古い住宅地(一種低層住居) -230.7 -16.9

これまで同様、プラスだとそこに対して良いと思っているということになります。 こちらから見て分かるのは

  • 新興住宅地は二人共よく思っているが、特に私はかなりプラスに捉えている
  • 私は「きれいな住宅地」であればいいと思っているが、妻はきれいな住宅地でかつ一種低層住居であるほうが望ましいと思っている

この辺りも事前に話をしていたときと感覚があいます。 ただし、きれいな住宅地でも一種低層であるほうがいいか?というところは話せていなかったので、これをキッカケに話をすることが出来ました。

あまり我が家の価値観事情をお伝えしすぎるのもどうなんだということで、実際にも我が家にとっては有益な情報はありましたが個別の分析についてはこれくらいにしておきます。 今回やっていく中でいくつか見えた課題もありました。

課題: 係数が個人の優先度を反映できていない部分もある

例えば、「土地が四角」というのは私の感覚では絶対にマイナスではない(四角いほうがいい)のですが、結果としては少しだけマイナスになっています。 「小学校までの距離 」もプラス(小さい方がいい)のですが、結果としては少しだけマイナスになっています。

恐らくこれは、全体的にデータの件数が少ないのと、感覚的に人が答えている故の回答へのブレが原因だと思っています。 後者について、私自身途中で整合性が取れていない回答しているなと感じる部分もありました。

そのため、より正確にするためには

  • データの件数を増やす
  • あとから整合性を保てるように(例えばExcelで一覧化した上で)修正する

などをしたほうがいいかもしれません。

課題: 土地条件のパラメータに入っていないものが出てくる

実際の土地と比較しながら見ると、考慮しきれていないと感じる点は出てきます。 例えば、近くの学校が良さそうかどうかや、公園が近くにあるかどうか等、あげだすとキリがありません。

ここはある程度仕方なかったかなと思っています。 もっとパラメータを細かく作ってデータ数も増やすこともできたかもしれませんが、値段をつける件数をこれ以上増やすのは結構大変ですし、キリがありません。 どちらかというと、実際の土地に適用した時に、モデルの予測と自分の感覚が違ったとしてそれが何故なのか考えるキッカケになればいいかなと思っています。

課題: 二人共土地に関してリテラシーがある程度揃っている必要がある

これは我が家では大きく問題になりませんでしたが一般的にはあるかなと思いました。

例えば今回の場合だと、「低層住居地域」と「中高層住居地域」の違いだったり、土地の中に坂があったときの造成費用の目安など事前にある程度の理解を二人共持っていないと、結果も比較が難しくなります。 実際には私もまだまだ知識不足ではあったのですが、私自身が理解している範囲でモデルを作ることで影響は小さくすることができました。

そしてモデルは役に立ったのか?

結論、まだ土地を決めていないので、どれくらい役に立ったのかどうかはまだ分かりません。

ただ、現時点でも意識合わせとして水面下で役立っています。 また、今後も候補の土地があったときに夫婦それぞれのモデルでの予測結果を使ってチェックするのに使えますし、少なからず役に立つのかと思います。

2年前に実施したオススメの物件を見つけてくる方法に比べると、「データサイエンスのおかげで良いとこ見つかったー!」と大声で言えるようなホームランは起きないですが、確実に少し役立つみたいなバント的な役割は果たしてくれるのかなと思っています。

前回は「妻がいればAIはいらないんじゃないか!?」というオチだったのですが、今回は妻と納得した土地選びをするためにデータサイエンスが支援してくれました

めでたしめでたし。

最後に

ABEJAでは一緒に働く仲間を募集しています。

幅広い職種を募集していますが、この記事のように技術で遊んでみるのが好きな方や、もっと本格的なデータサイエンスの活用をしたい方など是非お待ちしています。 カジュアル面談もやっておりますので、もしABEJAの興味持っていただけたら、こちらのリンクより訪ねてもらえると嬉しいです。

ちなみに土地探し中の私ですが、土地はオフィス周辺ではなくフルリモートで遠方から働いています。ABEJAではこういった働き方も可能です。

careers.abejainc.com