天気図をクラスター分析してみた

# はじめに
みなさん西高東低や冬型の気圧配置などという言葉を聞いたことはありませんか？日本付近の気圧配置にはいくつかのパターンがあり、西高東低とよばれる冬型の気圧配置はその中でも有名なほうでしょう（下図）。このほかにも太平洋高気圧に覆われる夏型の気圧配置などいくつかの種類があります。この記事では、このパターンを教師なし学習で分類してみようと思います。
![img.png](https://smtgvs.weathernews.jp/s/topics/img/201610/201610140215_box_img0_A.gif?1476853911)
[(weather newsより)](https://weathernews.jp/s/topics/201610/140215/)

今回実行したことは以下の3つです。

- 衛星画像をスクレイピング
- エルボー法
- クラスター分析（教師無し学習）

# 衛星画像の取得
衛星画像の取得は江波山気象館のHPから行いました。というのも、rowデータをダウンロードするのは重く、いい感じに加工されたデータでスクレイピングしてよさそうだったのがこのサイトだったからです。  
本来は [気象業務支援センターのHP](http://www.jmbsc.or.jp/jp/online/s-online0.html) から購入するのが妥当だと思われるので、ここら辺は自己判断でお願いします。ソースコードはここでは記載しませんが、 [github](https://github.com/eycjur/portfolio/blob/master/cluster/get_image.py) に挙げておきます。

筆者が利用した画像は日本付近の12:00(JST)の画像で、以下のような画像(854×480px)です。![20190721.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/994581ff-9fce-5ab4-8dca-5a23cab6eaa7.jpeg)

# 前処理
```python

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from PIL import Image
import glob
from tqdm import tqdm
from os import makedirs

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, silhouette_samples

x=np.empty((0,240*427))

paths=glob.glob("pictures/*.jpg")
for path in tqdm(paths):
    img=Image.open(path)
    img = img.convert('L')
    img=img.resize((int(img.width/2), int(img.height/2)))
    x=np.append(x,np.array(img).reshape(1,-1),axis=0)
```
画像を読み込んで1行になるようにreshapeしてから、numpy配列にぶち込みます。画質がいいとだいぶ時間がかかったのでグレスケにして半分の大きさにしました。

# エルボー法
```python

distortions = [] #エルボー法（最適なクラスター数を求める）
for k in tqdm(range(1, 20)):
    kmeans = KMeans(n_clusters=k, n_init=10, max_iter=100)
    kmeans.fit(x)
    distortions.append(kmeans.inertia_)
fig = plt.figure(figsize=(12, 8))
plt.xticks(range(1, 20))
plt.plot(range(1, 20), distortions)
plt.savefig("elbow.jpg")
plt.close()
```
エルボー法により最適なクラスター数を求めました。20でやると10分ほどかかったので10ぐらいで十分かと思います。結果は以下の図のようになりました。
![elbow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/14fe53b2-0cff-4c57-49f4-65a878c7f361.jpeg)
明確に何個がいいかは出ませんでしたが、今回は4でやることにしました。

# クラスター分析
```python

k_means = KMeans(n_clusters=4).fit(x)
y_pred = k_means.predict(x)
print(k_means.labels_)
print(pd.Series(k_means.labels_, name='cluster_number').value_counts(sort=False))

out=pd.DataFrame()
out["picture"]=paths
out["classnumber"]=y_pred
out["date"]=pd.to_datetime(out["picture"].str.split("\\",expand=True).iloc[:,1].str.split(".",expand=True).iloc[:,0])
out.to_csv("out.csv")

```
クラスターごとの要素数は139,61,68,98でした。いい感じに分かれたので期待できそうです。

```python

#クラスごとに保存
for i in range(4):
    makedirs(str(i)+"_pictures", exist_ok=True)
for i in out.itertuples():
    img=Image.open(i.picture)
    img.save(str(i.classnumber)+"_"+i.picture)

for i in range(4):
    out["month"]=out["date"].dt.month
    sns.countplot("month",data=out[out["classnumber"]==i])
    plt.title(i)
    plt.savefig("月分布"+str(i))
    plt.close()
```
それぞれのクラスごとに分けて保存するとともに、それぞれのクラスの月の分布および具体的な画像を見てみましょう。

### クラスターNo.0
![月分布0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/f77e82c7-7247-092d-3159-f6de39804a9f.png)
冬に多くて夏に少ない感じですね。冬型の気圧配置といったとこでしょうか。数は少ないといっても夏にもこれがみられるのは不思議な感じがします。

このクラスターに属する画像は例えば以下のようなものです。

|2020/1/13|2020/1/19|
|---|---|
|![20200113.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/3c81dfd8-a58e-0508-60dc-bd2c2e42b348.jpeg)|![20200119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/5a2c5a1f-b909-54e0-41b3-b3f070097c6c.jpeg)|

これは典型的な西高東低な気圧配置で北西から冷たい風が吹くことで日本列島上空に雲がかかっているような天気図でした。

また、このクラスターに属する図で冬でない季節のものは以下の図のようなものでした。

|2020/6/26|2019/10/26|
|---|---|
|![20200626.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/9c406390-f231-9f9b-3885-7e635cc5902b.jpeg)|![20191026.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/f0c8688e-9572-d176-1d5a-59e4a9d74831.jpeg)|
雰囲気としては大陸上及び日本上空に雲があり太平洋上には雲がない感じであるということでしょうか。雲種は違えど雲の場所の雰囲気は確かに似ている気はします。

### クラスターNo.1
![月分布1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/d650ddcf-6336-8f0f-0ec7-0da511d1209e.png)
4,11月に多くなっています。このグラフだけではどのような共通点があるのかわかりませんでした。

このクラスターに属する画像は例えば以下のようなものです。

|2019/11/2|2020/4/29|
|---|---|
|![20191102.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/34e2818e-6811-d702-bd8e-47e2ad9e26be.jpeg)|![20200429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/229b651f-2b91-1471-1fb4-3172b1962727.jpeg)|

明確な気圧配置の特徴があるわけではないように見受けられました。画像の特徴としては日本付近は晴れており、日本の南東方向に斜めの雲が入っている画像が多かったです。このような雲は季節によっては太平洋高気圧の縁を回るようにしてできているものもありましたが、偶然似通った雲ができているだけの気がします。どちらかというとこのクラスターは他のクラスターの余りのような印象が強かったです。


### クラスターNo.2
![月分布2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/37024e38-cc57-1bb3-79c7-4a1a1412ccc6.png)
これは梅雨の時期に多い感じです。梅雨前線があるような場合の気圧配置でしょうか。なお、2,8,9月には1個も見られなかったようです。

|2020/6/28|2020/7/4|
|---|---|
|![20200628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/f2f6f439-2785-183b-b4b6-6cf9efb588c3.jpeg)|![20200704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/5cbd17fc-9a44-aece-68f8-27b061d3ac68.jpeg)|

このクラスターには予想通り梅雨前線を示したものが多くありました。春夏秋冬の4区分には現れない梅雨ですが、その気象学的な特徴は明確にあることが示されたのではないかと思います。

なお、このクラスターに属する他の季節の画像は以下の様なものでした。

|2019/10/20|2020/3/19|
|---|---|
|![20191020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/85b37d66-e358-4e58-3e64-28e506f46c73.jpeg)|![20200319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/a63cf486-722b-a8ba-b744-094b42ccff8e.jpeg)|

日本列島上に前線によるものに近い形状の雲が広がっており、このクラスターに分類されたのが納得できます。


### クラスターNo.3
![月分布3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/f0ecf626-38ab-8f83-f6fb-e01e46c84684.png)
圧倒的夏を示しています。太平洋高気圧が張りだした夏型の気圧配置を表していそうです。

実際にこのクラスターに分類された画像を見てみると以下のように夏型感満載の画像でした。

|2019/7/29|2019/8/21|
|---|---|
|![20190729.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/f975a086-657c-f6ca-57ff-6bf04b824f90.jpeg)|![20190821.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/38143ca1-7d6a-66df-1f02-c1e11ac47575.jpeg)|

また、他の季節の画像は晴れ間が広がった画像が多くなっていました。

|2019/10/14|2019/11/1|
|---|---|
|![20191014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/e7b07773-7e25-a2c7-8cde-d8e2192ad4ad.jpeg)|![20191101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/2a897455-3015-b3ee-ca1a-1317a6c0c876.jpeg)|

# まとめ
以上の解析結果から、クラスター分析により、大まかな気圧配置の傾向を分類し、それから外れたものも解釈することができた。ただ、衛星画像は気圧を直接表したものではないため、気圧配置を直接的に分類できるわけではなく、雲の分布状況でクラスターが分けられてしまうので、どうしても雲の形状が似ていれば誤分類されてしまう。気圧配置の分類をするためには雲だけでなく気圧を取り込む方法を検討する余地があるそうだ。
[今回実行したコード(github)](https://github.com/eycjur/portfolio/tree/master/cluster)

# 参考文献

- [weathernews「天気予報でよく聞く「西高東低の気圧配置」って？」](https://weathernews.jp/s/topics/201610/140215/)