私と私の猫の他は誰でも隠し事を持っている

野良プログラマ発、日々のアウトプット

気象庁の各地気圧データから箱ひげ図を描いてみる

昨年末あたりから Jupyter Notebook を触り始めてすっかりハマってます。Python の豊富な DS ライブラリを使ってのデータ加工・集計・分析・可視化等を Web U/I 上でトライ&エラーできる柔軟さが素晴らしすぐる。発想にまかせて自由気ままにデータいじりするにはまだまだスキル不足なので、何かしらお題を設けてはアウトプットするルーティンワークを続けていこうかと。今回はその一環で、気象庁サイトから日本各地の1年間の気圧データ(CSV)から、月単位の箱ひげ図を作成して、各地毎の気圧変動特性を概観してみようという試み。

気圧データ取得は、気象庁過去の気象データ・ダウンロードにて、下記要領で。

  1. 「地点を選ぶ」にて、地図上から目的の都市をクリックしてひとつ選択。
  2. 「項目を選ぶ」にて、データの種類=時別値・項目=現地気圧、と選択。
  3. 「期間を選ぶ」にて、連続した期間で表示する(2017年1月1日〜2017年12月31日)と選択。
  4. CSV ファイルをダウンロード」をクリック。

今回は、札幌・仙台・東京・名古屋・大阪・松山・福岡・那覇の8地点をそれぞれデータ取得しました。それを Jupyter からアップロードして、下記コードを実行!

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# データファイル
datafiles = ['kiatsu-sapporo.csv', 'kiatsu-sendai.csv', 'kiatsu-tokyo.csv', 'kiatsu-nagoya.csv', 'kiatsu-osaka.csv', 'kiatsu-matsuyama.csv', 'kiatsu-fukuoka.csv', 'kiatsu-naha.csv']

# データファイル数に合わせた大きさのグラフ領域を作成
rows = len(datafiles)
fig = plt.figure(figsize=(8,3*rows), dpi=100)
yrange = [960, 1040]

for (n, datafile) in enumerate(datafiles):
    # CSV を読み出してデータフレーム作成(1列目を datetime 型のインデックスにするのがミソ)
    df = pd.read_csv(datafile, skiprows=5, header=None, names=['datetime', 'pressure','dmy1','dmy2'], index_col=0, parse_dates=True)
    datas = []
    # 月毎の2次元配列に纏める
    for m in range(1, 13):
        datas.append(df[df.index.month == m].pressure)
    # 箱ひげ図プロット
    ax = fig.add_subplot(rows, 1, n+1)
    bp = ax.boxplot(datas, whis='range') # 外れ値描画なしで
    plt.title(datafile)
    plt.grid()
    plt.subplots_adjust(hspace=0.4)
    plt.ylim(yrange)

結果、作画した箱ひげ図はこんな感じ↓。matplotlib の boxplot() はデフォルトだと、四分位範囲 ✕ 1.5 外の値を外れ値にするようなのですが、今回のデータは偶然誤差の類を考慮しなくても良いかなと思い、ひげ長をレンジ全体にしました。
f:id:mariyudu:20180516205938p:plain

家族に頭痛持ちがいて低気圧の日は辛そうなので、日本のどの辺が気圧変動が穏やかなのかなー、と思ったのが動機でした。九州以北は概ね冬季の変動が大きいのに較べて沖縄は比較的穏やかそう。どこも10月にレンジが広いのは台風のせいですが、それでも東京が沖縄より振れ幅が大きいのは意外でした。

さーて次は何をやろうかな…