第8章 データ分析の例
1 気温のダウンロード
ここ10年の気温を分析し、今日の気温が通常の範囲内か分析しましょう。
まず、過去10年間の気温をダウンロードします。以下にアクセスします。
https://www.data.jma.go.jp/gmd/risk/obsdl/index.php
ここで地点を都道県内の自分の所在地を選びます。 次に「項目を選ぶ」で「日最高気温」と「日最低気温」をチェックします。
次に期間を選びます。過去10年としたいので、2012年1月1日から2021年12月31日を選びます。
最後に表示オプションで「利用上注意が必要なデータの扱い」では「値を表示(格納)しない。」を選びます。
「観測環境などの変化の前後で、値が不均質となったデータの扱い」では、「観測環境などの変化前の値を表示(格納)しない。」を選びます。
「ダウンロード」の「日付の形式」を「日付リテラルで格納」とします。
これで「CSVファイルをダウンロード」を選択します。
ダウンロードしたCSVファイルをVSCodeで開きます。このとき、文字コードをJapanese(Shift JIS)で開くことでそのデータを見ることが出来ます。
2 データの読み込み
kion.ipynb に記述します。まずデータを読み込んで表示してみます。文字コードがシフトJISのため、encodingを指定します。また、不要な行を読み飛ばすためにskiprowsを指定します。
import pandas as pd
df = pd.read_csv("data.csv", encoding="shift_jis", skiprows=[0,1,2,4,5])
df
うまく表示されていたら、まず過去の今日の日付だけを抽出しましょう。これは「月日」という列を作りその列に月と日だけを入れることにします。
まず、年月日をdatetime型に変換します。
df['年月日'] = pd.to_datetime(df['年月日'])
df
そして、今日の日付だけを抜き出します。
df2 = df[(df["年月日"].dt.month == 10) & (df["年月日"].dt.day == 25)]
df2
今日の最高気温の平均を出してみましょう。
df2["最高気温(℃)"].mean()
最低気温の平均を出してみましょう。
df2["最低気温(℃)"].mean()
3 今日の気温は平年並み?
今日の気温が果たして過去10年と比較して平年並みかを見てみます。
まず、今日の最高気温の標準偏差を求めます。
df2["最高気温(℃)"].std()
平均から上下にこの値の範囲内なら今日は平年並み(全データの約68%内)です。 標準偏差の2倍以内だと全データの約95%内となり、やや通常ではありません。 2倍の範囲を超えると全データの5%以下の異常な気温となります。
上位何%の値なのかは norm.cdf で調べることが出来ます。
from scipy.stats import norm
heikin = df2["最高気温(℃)"].mean()
std = df2["最高気温(℃)"].std()
x = norm.cdf(x=今日の気温, loc=heikin, scale=std)
1-x
1/(1-x)とすることで、何年に一度の確率で起こるかも分かります。
4 気温のグラフを表示
ここで全ての日の最高気温、最低気温のグラフを出してみましょう。 まず、月日の列を作ります。
df["月日"] = df["年月日"].dt.strftime("%m/%d")
df
この月日の列で、グループ化し、平均を出します。
df2 = df.groupby("月日").mean()
df2
これをグラフで出しましょう。
import seaborn as sns
sns.set_theme(font=["Meiryo"])
df2[["最高気温(℃)","最低気温(℃)"]].plot()
現在から見て、気温がどのように変化していくか予想できます。