LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 1 year has passed since last update.

日本の東北地方で起きた過去地震データの分析

Posted at

今回のテーマを分析しようと思ったきっかけ

日本ではほぼ毎日地震が起きていて、数か月に一度以上は、震度5以上のような大きい地震が発生しており、
特に東北地方では2011年3月11日に起きた東日本大震災の余震もあり全国的に見て地震が多いです。
頻繁に起きる地震のニュースを見て、次に起きる大きい地震を予測できないかと考え、このテーマで分析の練習をしてみよう、と思いました。

自己紹介と受講に至った経緯

30代前半、仕事は事務職(受発注管理、調達購買)。
業務の中でデータベースから日々の受注・出荷データをエクセルで分析しています。
しかしエクセルではデータ量が大きいものは扱いにくく、予測作業が難しいです。
そのためPythonを学習し分析・予測業務の幅を広げるために、受講を決めました。

もともとのプログラミング知識について

VBAを仕事で使い、簡単な効率化ツールを作っていました。
Pythonは独学で1年ほど本を読み学習しましたが、エラー対処がうまくできず挫折。

本記事の概要

日本の東北地方の過去地震データについて分析しました。
しかし専門的な知識もない私が実際に予測できると思ってやっておりません。
気象庁の公式サイトからダウンロードした地震データを取り込み、グラフ化し、予測(当てにならない)情報を表示させる事はできました。
今回東北地方で起きた地震のマグニチュードデータを時系列に表示させて予測情報をグラフに表すことを目的としています。

分析した結果

先に結果を述べると、なんとか講師の方に教えていただきながら記述したコードは動いたものの、グラフが小さかったり
データ範囲が適切でなかったり、予測情報が正しくなかったり課題がたくさん残りました。
内容は後で記述しますが、今後できたらいいな、と思ったことも残しておきたいと思います。

記述したコードとその説明

今回使用するライブラリは下記の通りです。
・pandas
・matplotlib
・numpy
をそれぞれimportする記述をします。

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
import numpy as np

データの読み込みと整理を行います。
CSVデータの不要な列データを削除して、データを適切な型に変換します。

# 変数「Earthquake_mg」に地震データを読み込む指示を入れる
Earthquake_mg = pd.read_csv("/content/Earthquake data _North pacific ocean (3).csv")
# 不要な列データを削除する
Earthquake_mg = Earthquake_mg.drop(['Shindo', 'Time','Place','Depth'], axis=1)
# Earthquake_mg(地震データ)の「Mg」列の値を「int」に変換する。
Earthquake_mg['Mg'] = Earthquake_mg['Mg'].astype('int')
# Earthquake_mg(地震データ)の「Date」列の値を「Date」に変換する。
Earthquake_mg["Date"] = pd.to_datetime(Earthquake_mg['Date'])
#データの「Date」の値をIndexとします。
Earthquake_mg.index=Earthquake_mg["Date"]
#日付データがIndexとして存在するので、「Date」列の値は不要なので、削除します。
Earthquake_mg=Earthquake_mg.drop(["Date"],axis=1)

このままコードを動かすと、

'The `start` argument could not be matched to a location related to the index of the data.'

というエラーがでます。
学習データの日時が飛び飛びであるため、周期的な予測が行えないことが原因で生じるエラーです。
これに対し、「学習データが存在していない日時」=「地震が起こっていない」=「Mg=0」というふうに
捉え直すことで、学習データの日時を日毎にすることでエラーを解消させます。
下記の通りです。

#変数「new_date」に2017年5月20日から2022年7月01日のデータを代入します。
new_date=pd.date_range(start='5/20/2017', end='7/01/2022')
#変数「df」にデータフレーム形式でインデックスを変数「new_date」の日付データ、列に「Mg」のデータを代入します。
df=pd.DataFrame(0,index=new_date,columns=["Mg"])
#マグニチュードの値を2017年5月20日から2022年7月01日のデータに代入します。
df.loc[Earthquake_mg.index]=Earthquake_mg.values
#変数「Earthquake_mg」に変数「df」のデータを代入します。
Earthquake_mg=df

SARIMAモデルを当てはめ、予測データを入れていきます。

# モデルの当てはめ
SARIMA_Earthquake_mg = sm.tsa.statespace.SARIMAX(Earthquake_mg,order=(0,0, 0),seasonal_order=(0, 1, 1, 12)).fit()
#変数「pred」に予測データを代入する。2022年7月2日から2022年9月30日のデータとなります。
pred = SARIMA_Earthquake_mg.predict("2022-07-2","2022-09-30")

予測データと元の時系列データの可視化を行います。

#変数「Earthquake_mg」に代入されているデータをグラフ化する。 
plt.plot(Earthquake_mg)
#変数「pred」(予測データ)を赤色でグラフ化する。
plt.plot(pred,color="r")
#グラフを表示させる
plt.show()

グラフが下記の通りに表示されます。
縦軸はマグニチュード横軸は日付です。右下に赤い四角が見えますが、これが予測結果です。
非常に見にくいグラフが出来上がってしまいました。
これを見るとマグニチュード6クラスの強い地震は2019年以降1年間に3回以上は起きているようです。
image.png

反省点

-日付の範囲が広すぎてグラフが見づらい
→日付の範囲を狭めたがエラーが発生(KeyError)。日付データが一致しないようだが原因は特定できず。
 データの型について理解を深める必要ある。

-SARIMAモデルの予測データの精度が低すぎる
→パラメーターの設定をする必要があり、最適化作業も行っていなかったのでこのような結果になってしまった。

-ARIMAモデルを用いた分析を行う
→SARIMAモデルの分析では季節性が考慮されるため、ARIMAモデルでの分析もすればより精度の高い結果が出るかもしれない。

今後やっていきたいこと

今回地震データを分析しましたが、マグニチュード情報のみを使用しておりましたが、
地震の深さや、震度を特徴量として分析をすれば違う側面から予測ができるかもしれない、と思いました。
アイデミーで学んだことを復習し、いずれ仕事で役立てるため分析できそうなネタがあればデータ分析に取り組んでいきたいと思います。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up