Yelpから日本人好みのラーメン屋を見つけたかった…

# モチベーション
米国ではYelpというアプリが食べログの位置づけで使われています。（1.48億のレビュー投稿。ちなみに食べログは2,400万レビュー, 2018年４月時点）
ただ、たまにレビューがアテにならないことがあります。特にラーメン。たぶん味やサービス、コスパへの評価基準が、日本育ちとローカル育ちで異なるためかな〜と思います。（逆に僕も伝統的すぎる!?インド料理店に自分の舌基準で☆1を付けてしまうことがあります）
この記事はそんな過小評価されて平均スコアは低いけれど、実は日本人にウケている隠れた名店の発掘を目指していました。（が、タイトル通りそこに行きつけなかった…）

# データ
Yelp公式でデータが[配布](https://www.yelp.com/dataset/challenge)されています。
MySQLとPostgreSQL対応とのことですが、[PostgreSQLだと読み込めず。。](https://stackoverflow.com/questions/46384732/psql-restore-sql-dump-syntax-error)
MySQL推奨です。ちなみにER図はこんな感じ。
![yelp_dataset_schema.png](https://qiita-image-store.s3.amazonaws.com/0/192652/0cfb8aa3-02e7-237b-fba5-afbcf1aa290b.png)


# アプローチ（当初案）
ステップ１．レビュー投稿者のデモグラは非公開なので、ファーストネームから日本人ユーザを推測する。
ステップ２．営業中かつレビュー数が100を超えているラーメン屋について、日本人とそれ以外でレビューの分布に差があるか確認する。

# コード
## 1. データの読み込み
Yelp公式からSQLデータをダウンロード。上述のとおりPostgreSQLでハマったのでMySQLをセットアップ。
YelpチュートリアルからとべるGUIベースのMySQL設定よりも、Macなら[Homebrewを使った方がわかりやすい](https://dev.classmethod.jp/etc/mac_mysql_install/
)かも。

## 2. 人気ラーメン屋の確認
ある程度レビュー数がないと分布の差を確認できないのでレビューの多いラーメン屋をリストアップ。

```sql
SELECT name, city, review_count
FROM business
WHERE name like '%ramen%'
ORDER BY review_count DESC
LIMIT 10;
```

| name                     | city      | review_count |
|:------------------------:|:---------:|:------------:|
| Monta Ramen              | Las Vegas |         2291 |
| JINYA Ramen Bar          | Las Vegas |         1171 |
| Ramen Sora               | Las Vegas |         1169 |
| Fukumimi Ramen           | Las Vegas |          745 |
| Sansotei Ramen           | Toronto   |          701 |
| Hokkaido Ramen Santouka  | Toronto   |          651 |
| Republic Ramen + Noodles | Tempe     |          571 |
| Tampopo Ramen            | Tempe     |          458 |
| KINTON RAMEN             | Toronto   |          414 |
| Ramen Tatsu              | Las Vegas |          395 |

Vegasの次がToronto!?という印象だが、この配布データはYelpの部分的データが切り出されているようだ。（サンノゼやサンフランシスコ、シアトルなどはデータ中に無し）

## 3. レビュー投稿者名のJOIN
試しに、レビュー数トップのラーメン屋"Monta Ramen"のスコアとレビュー投稿者を眺める。
最後の3行 (INTO~以降) はCSV出力用。

```sql
SELECT biz_rev.name, biz_rev.stars, user.name AS user_name
FROM user
INNER JOIN (
  SELECT name, review.stars, review.user_id
  FROM business
  INNER JOIN review
  ON business.id = review.business_id
  WHERE name = 'Monta Ramen'
) AS biz_rev ON user.id = biz_rev.user_id
ORDER BY biz_rev.stars DESC
INTO OUTFILE '~/yelp/output/monta.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';
```

| name        | stars | user_name |
|:-----------:|------:|:---------:|
| Monta Ramen |     3 | Jessica   |
| Monta Ramen |     5 | Rei       |
| Monta Ramen |     4 | Chels     |
| Monta Ramen |     3 | Tiff      |
| Monta Ramen |     4 | Tu Anh    |
| Monta Ramen |     4 | Vicky     |
| Monta Ramen |     3 | Kevin     |
| Monta Ramen |     3 | Lynn      |
| Monta Ramen |     5 | Chuck     |
| Monta Ramen |     4 | Lica      |

ここで気づいた。もしかして日本人少ない?
たかだか2,290レコードなので、人力で日本ぽい人名 (KenとかYujiとかLisaとか) を数えることに。（全データやるとなれば[Wikiのデータ](https://en.wikipedia.org/wiki/Category:Japanese_given_names)でマッチングしたい）で数えると19人 (0.8%) しかいない。CSVファイルを[ここ](https://docs.google.com/spreadsheets/d/1gMmHAhAtK12I0eDWnWyDSnqK0GhvyVzMT_kqLhBKJKE/edit?usp=sharing)に。最もレビューの多いラスベガスのこの店でこの数では、他店では日系の平均値計算も期待できないし、もはや日系レビューが無いのでは、とあきらめ。

# 結果と反省
いちおうMonta Ramenについては、全体平均4.16に対して日系平均4.28とやや日系の評価が高いが、このサンプル数だと意味のある差とは言えなそう。
反省点としてMonta Ramenのあるネバダ州の人口は280万人、在留邦人+日系人は2.3万人で人口構成比は0.8%、分布の差を評価するために少なくとも100件くらい日系レビューが欲しいと思うとレビュー数10,000超は必要ということを、手を動かす前に思いつきたかった。ちなみに全データセット通してレビュー数最大のお店で7,361。ただYelpのデータは面白そうなので、何か筋のよい観点が思いついたらまた触ってみたい。