桜の満開を予測する(ランダムフォレスト)

スポンサーリンク
tech系(python)

はじめに

桜の開花予想というのは毎年あって、それは日付まで予想されるものなのですが、満開予想って正確な値は出てないんですよね。

一応、出てはいるんですが、直前になって出る感じだし、4月中旬とかで出るので、日付まではわかりません。

なので、桜の満開を予測できるのかを試してみたいと思いました。

もう夏で、時期がめっちゃずれていますけど!

アイキャッチ画像は以前、目黒川で船に乗って夜桜を楽しんだ時の写真です。

使用するデータ

今回、使用するデータは気象庁の満開日の過去データです。

気象庁 | さくらの満開日(2021-2024年)
過去のさくらの開花日・満開日を表示します

このデータをエクセルに落とし込みます。

また、天気の情報を使って満開の時期を予測するので、OpenWeatherのOne Call API 3.0(ドキュメントはこちら)で過去の天気情報を取ってきます。

取得する場所は日本さくら100選にも選ばれている「上野恩賜公園」です。

過去の満開の日は全て4月までには満開になっているので、1月から4月の天気情報を取得してみます。

お昼の12時の時のお天気情報を取得するとして、桜の満開日の情報は40年分取得します。

このため、1月~4月の4か月分の情報を取ると約120日分取得することになり、×40年で4800日分のデータを取得する必要があります。

One Call API 3.0の無料枠が1日に1000アクセスまでなので、5日間に分けてデータを取得します。

実装

データの準備ができたら、実際に学習をさせていきます。

年ごとの特徴量の値を平均として扱います。

以下が今回の実装のコードです。

import pandas as pd
from datetime import datetime
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

features_df['year'] = features_df['date'].dt.year

# 年ごとに特徴量を平均してまとめる(1月〜4月の気象データ)
X = features_df.groupby('year').mean().reset_index()

# 満開日データの加工
tokyo_df['year'] = pd.to_datetime(tokyo_df['満開の日']).dt.year
tokyo_df['day_of_year'] = pd.to_datetime(tokyo_df['満開の日']).dt.dayofyear
y = tokyo_df[['year', 'day_of_year']]

# 特徴量とターゲットを結合
df = pd.merge(X, y, on='year')
df = df.drop(['date'], axis=1, errors='ignore')  # 'date'が無いときのエラー回避

# 2020年〜2024年をテスト、それ以前を学習に使う
train_df = df[df['year'] < 2020]
test_df = df[df['year'] >= 2020]

X_train = train_df.drop(['day_of_year'], axis=1)
y_train = train_df['day_of_year']
X_test = test_df.drop(['day_of_year'], axis=1)
y_test = test_df['day_of_year']

# ランダムフォレストの学習
model = RandomForestRegressor(random_state=42, n_estimators=100)
model.fit(X_train, y_train)

# テストデータでの予測と評価
y_pred = model.predict(X_test)

# 年ごとの予測結果表示
for year, doy in zip(test_df['year'], y_pred):
    predicted_date = datetime(year, 1, 1) + pd.to_timedelta(doy - 1, unit='D')
    print(f"{year}年の予測満開日: {predicted_date.strftime('%Y-%m-%d')}")

結果

結果の予測は以下のようになりました。

2020年の予測満開日: 2020-03-24
2021年の予測満開日: 2021-03-24
2022年の予測満開日: 2022-03-29
2023年の予測満開日: 2023-03-25
2024年の予測満開日: 2024-03-24

本当の値は以下です。

2020-03-22
2021-03-22
2022-03-27
2023-03-22
2024-04-04
  • 2020年 ⇒ 2日の誤差
  • 2021年 ⇒ 2日の誤差
  • 2022年 ⇒ 2日の誤差
  • 2023年 ⇒ 3日の誤差
  • 2024年 ⇒ 11日の誤差

思いのほかいい結果が出たんじゃないでしょうか。

2024年だけ思いっきり外してますけど。

最後に

2024年にいきなり誤差が大きくなったねーー

2024年は例年に比べて遅かったのか。

タイトルとURLをコピーしました