気象庁の台風統計をPythonでスクレイピング

#はじめに
今年(2018)は台風２４号の影響で、山手線が早めに運転見合わせをするなど、台風が例年より目立った印象があります。
そこで気象庁の台風の統計資料をスクレイピングしてみました。

#環境
[Google Colaboratory](https://colab.research.google.com/?hl=ja) を使いました。
また、統計資料は以下です。

- [気象庁｜台風の発生数（2017年までの確定値と2018年の速報値）](https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/generation/generation.html)

#2018年の台風の発生数
まず今年の台風の発生数を取得してみました。

```typhoon.py
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/generation/generation.html"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")

rows2018 = soup.find_all("table")[0].findAll("tr")
table2017u = soup.find_all("table")[1]

labels = []
values = []
for row in rows2018:
    for cell in row.findAll(['th']):
        labels.append(cell.get_text())
    for cell in row.findAll(['td']):
        values.append(cell.get_text())

labels.pop(-1)
labels.pop(0)
values.pop(0)

values[3] = values[4] = values[11] = 0
values.pop()

df = pd.DataFrame(list(map(int,values)), index=labels)
df.columns = ['発生数']
df
```
<img width="128" alt="スクリーンショット 2018-12-14 20.04.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/103548/1ac0caea-585f-78b2-17b9-0f0b99ffa5a3.png">

棒グラフにしてみましょう

```typhoon.py
%matplotlib inline
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'IPAPGothic' #全体のフォントを設定

plt.rcParams["figure.figsize"] = [12, 10]
plt.rcParams['font.size'] = 20 
plt.rcParams['xtick.labelsize'] = 15
plt.rcParams['ytick.labelsize'] = 15

df.plot(kind='bar', y='発生数').set(xlabel='月', ylabel='発生数')
plt.title('2018年')
```


<img width="738" alt="スクリーンショット 2018-12-14 20.05.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/103548/0d4a373e-70b4-9bb1-56e7-6dbec2a62ac5.png">
今年は7月と8月が多かったのですね。

#1951年から2018年の発生数

1951年から2018年の発生数を取ってみました。

```typhoon.py
table2017u_tr = table2017u.findAll("tr")
total = []
 
for trs in table2017u_tr:
        year_v = []
        td_f = trs.find(['td'])
        td_all = trs.findAll(['td'])
        try:
            text = td_f.get_text()
            for td in td_all:
                if td.get_text().strip() == '':
                    year_v.append(0)
                else:
                    year_v.append(int(td.get_text()))
                    
            total.append(year_v)
                   
        except AttributeError:
             pass

index = []
year_num = []
for t in total:
    index.append(t[0])
    year_num.append(t[-1])

index.reverse()
index.append(2018)
year_num.reverse()
year_num.append(29)

df2 = pd.DataFrame(year_num, index=index)
df2.columns = ['発生数']

df2.plot(kind='bar', y='発生数').set(xlabel='年', ylabel='発生数')
plt.rcParams["figure.figsize"] = [15, 20]
plt.title('1951年から２０１８年')
```
棒グラフでこんな感じです。
<img width="1203" alt="スクリーンショット 2018-12-16 22.15.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/103548/1b3488e3-b5c1-d333-6ceb-4d4028e4e434.png">
左から順に、1951年から2018年までの発生数です。（ディスプレイの関係でグラフ全体を撮れませんでした。）

今年より多い年を選択してみました。

```
# 今年の発生数は２９
df２[df2.発生数 > 29]
```
<img width="156" alt="スクリーンショット 2018-12-16 22.41.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/103548/0b164a40-9ad8-e387-4a0d-2a5c39e9a144.png">

発生数の平均は

```
df2.mean()
```
発生数    26.205882
dtype: float64

発生数で見ると、今年は台風が例年よりは多かったですが、特別ではないようです。

[台風の発生数の順位](https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/ranking/generation.html)　2018年はランク外
[台風の上陸数](https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/landing/landing.html)　2018年は５つ
[台風の上陸数の順位](https://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/ranking/landing.html)　2018年は５位

これらも見てみましたが、数だけで考えると、今年が特別だったのではないようです。

ありがとうございました。