渋谷の公衆トイレをクラスタリングしてみた

[MYJLab Advent Calendar 2019](https://qiita.com/advent-calendar/2019/myjlab) 24日目の記事です🎄

# 背景
意味不明な、クリスマス感のない、軽めの記事が書きたかった！🙄

# 実践
### 使用したデータセット
[渋谷区オープンデータサイト](https://www.city.shibuya.tokyo.jp/kusei/tokei/opendata/index1.html)からcsv形式のデータ頂きました。
合計82個の公衆トイレが渋谷にはあるらしいです。意外と多いです。
### 準備

```py
import pandas as pd
import folium
import numpy as np
from geopy.geocoders import Nominatim
from sklearn.cluster import KMeans
```
### データ取得
綺麗なデータなので、前処理は欠損値の除去のみで済みました！っしゃ

```py
df = pd.read_csv('131130_public_toilet.csv', usecols=[4,9,12,13])
# 欠損値があればその行を消去
df_d = df.dropna(how='any')
df_r = df_d.reset_index(drop=True)
df.head()
```

<img width="506" alt="スクリーンショット 2019-12-21 17.59.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355621/36683647-5d0d-f1bd-0bd4-2358468eb9c8.png">

### 緯度経度取得
```py

# 渋谷の緯度経度を取得
address = 'Shibuya, Tokyo, Japan'
geolocator = Nominatim(user_agent="foursquare_agent")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
print('緯度：{}, 経度：{}'.format(latitude, longitude))
```
<img width="305" alt="スクリーンショット 2019-12-21 18.07.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355621/52fa8aa7-d8e4-b0da-752f-611f7dc3b349.png">

### Folium使ってMapに表示
```py

map_shibuya = folium.Map(location=[latitude, longitude], zoom_start=13)

for lat, lng in zip(df_shibuya['緯度'], df_shibuya['経度']):
    folium.CircleMarker(
        [lat, lng],
        radius=5,
        color='red',
        fill=True,
        fill_opacity=0.7,
        parse_html=False).add_to(map_shibuya) 
    
map_shibuya
```
<img width="1069" alt="スクリーンショット 2019-12-21 18.44.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355621/28d72d74-9aa3-ca5c-5196-eeaff37c9716.png">

### k-means法でクラスタリング
クラスタ数は３個に設定しました。

```py
# Numpyの行列に変換
cust_array = np.array([df_shibuya['緯度'].tolist(),
                       df_shibuya['経度'].tolist()])
# 行列を転置
cust_array = cust_array.T

kclusters = 3
# K-means実行
pred = KMeans(n_clusters=kclusters).fit_predict(cust_array)
pred
```
<img width="643" alt="スクリーンショット 2019-12-21 20.40.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355621/4d1ca0ef-1658-5f00-94a4-61edf2699eb2.png">

0〜2の3つのクラスタ番号が振られてると思います。
これをデータフレームのカラムに追加します。

```py
# データフレームにクラスタ番号を追加
df_shibuya['cluster_id'] = pred
df_shibuya.head()
```
<img width="594" alt="スクリーンショット 2019-12-21 20.48.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355621/3998c49e-0cbd-1bc7-06a9-a1b830b7cfc4.png">

### クラスタリングの結果を視覚化
3つのクリスマスカラーで装飾します。

```py
# クラスタ番号ごとに色を設定
colors_array = ['red','brown','green']

# add markers to the map
for lat, lon, cluster in zip(df_shibuya['緯度'], df_shibuya['経度'], df_shibuya['cluster_id']):
    folium.CircleMarker(
        [lat, lon],
        radius=5,
        popup=cluster,
        color=colors_array[cluster-1],
        fill=True,
        fill_color=colors_array[cluster-1],
        fill_opacity=0.7).add_to(map_shibuya)
       
map_shibuya
```
<img width="1067" alt="スクリーンショット 2019-12-21 21.19.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355621/e887231a-031f-b7e8-b470-6e16e77f2a36.png">

以上、無意味なクラスタ分析でした！