自然災害(地震)の発生予測 Prophet

自然災害(地震)の発生予測

自然災害(地震)の発生予測の例題を示します。

こちらはダミーデータを使用しています。

また、年次周期性を考慮してProphetを適用し、予測結果をグラフで表示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# ダミーデータを作成
data = {'ds': pd.date_range(start='2023-01-01', periods=365, freq='D'),
'y': [0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0]} # 365日間の地震発生(1)・非発生(0)
print(len(data['y']))
df = pd.DataFrame(data)

# Prophetモデルの作成
model = Prophet(
changepoint_prior_scale=0.5, # 変化点の影響度
yearly_seasonality=True, # 年次周期性を考慮
weekly_seasonality=False # 週次周期性は考慮しない
)
model.add_seasonality(name='monthly', period=30.5, fourier_order=5) # 月次周期性を考慮

model.fit(df)

# 予測用データフレームを作成
future = model.make_future_dataframe(periods=30) # 30日間の予測
forecast = model.predict(future)

# グラフで表示
fig = model.plot(forecast)
plt.title('Earthquake Occurrence Prediction')
plt.xlabel('Date')
plt.ylabel('Occurrence (1) / Non-occurrence (0)')
plt.ylim([-0.1, 1.1])
plt.show()

この例では、365日間の地震発生データ(1:地震発生、0:地震非発生)を使用してProphetモデルを作成し、その後30日間の地震発生を予測しています。

年次周期性を考慮し、月次の周期性も加えています。

予測結果のグラフは、年次の周期性や月次の変動を反映しています。

地震の発生・非発生のパターンを視覚的に理解することができます。

ただし、この例では実際の地震発生データではなく、ダミーデータを使用しています。

実際の地震発生予測には多くの要因が影響し、複雑なモデリングが必要です。

ソースコード解説

このソースコードは、地震発生予測の例題を示しています。

プログラムはPythonで記述されており、Prophetライブラリを使用して地震の発生予測を行い、結果をグラフで表示しています。

以下にコードの各部分を説明します。

1. import文:

必要なライブラリをインポートしています。
pandasはデータの操作、Prophetは時系列予測モデルの作成、matplotlib.pyplotはグラフの描画に使用されます。

2. ダミーデータの作成:

data辞書を用いて、日付と地震の発生(1)・非発生(0)のデータを作成しています。

3. dfの作成:

data辞書を使用してpandasのデータフレーム df を作成しています。
これには日付(’ds’)と地震の発生状況(’y’)が含まれています。

4. Prophetモデルの作成:

Prophetモデルを作成します。
changepoint_prior_scaleは変化点の影響度、yearly_seasonalityは年次周期性、weekly_seasonalityは週次周期性を指定しています。

5. 月次周期性の追加:

add_seasonalityメソッドを使用して、月次周期性を追加しています。
periodは周期の長さ(30.5日)、fourier_orderは周期性の調整パラメータです。

6. モデルの学習:

fitメソッドを使用して、モデルをデータに適合させています。

7. 予測用データフレームの作成:

make_future_dataframeメソッドを使用して、将来の予測データを含むデータフレーム future を作成しています。

8. 予測の実行:

predictメソッドを使用して、予測を行い、forecastに結果を格納しています。

9. グラフの描画:

model.plot(forecast)で予測結果のグラフを描画しています。
plt.titleplt.xlabelplt.ylabelなどを使用して、グラフのタイトルと軸ラベルを設定しています。
また、plt.ylimで縦軸の範囲を設定しています。

10. plt.show():

グラフを表示します。

このプログラムは、Prophetモデルを使用して地震発生予測を行い、その結果を日付ごとの地震発生(1)・非発生(0)の状況としてグラフで可視化しています。

結果解説

地震発生予測のグラフについて説明します。

このグラフは、Prophetモデルを使用して予測された地震の発生(1)または非発生(0)を表しています。

横軸は日付を示し、縦軸は地震の発生を表しています。

以下にグラフ内の主な要素を説明します。

1. 黒い点線:

実際のデータポイントを示します。
黒い点線の位置が、過去のデータに基づいてモデルが予測した地震発生の状態を表します。

2. 青い線(予測):

予測された地震発生の状態を示す黒い線です。
この線は、過去のデータからモデルが学習したパターンと、その後の予測期間に対する予測を基にして描かれています。

3. 青い領域:

青い領域は、予測の信頼区間を表しています。
予測は確実性を持って行えるわけではないため、信頼区間内での予測が行われていることを示します。

4. 横軸(日付):

日付が横軸に表示されており、過去のデータと将来の予測期間が表示されています。

5. 縦軸(地震発生):

縦軸は地震の発生(1)または非発生(0)を表しています。
縦軸の値が0または1の間で変動します。

このグラフを通じて、過去の地震発生データに基づいてモデルが学習し、将来の予測期間における地震発生の傾向や確からしさを示すことができます。

信頼区間内の予測結果がどれだけ合致しているかを確認し、地震発生のパターンを把握する助けとなります。