🐥

[misc] 地震がどれぐらい起きているのか(Yahoo!天気・災害 + ChatGPT + Python)

に公開

まえがき

最近たまに地震を体感します。一昔前(関東に住んでいなかった頃)はそこまでではなかったので、地域差を感じますね。そこで、「そういえば地震ってどれぐらい起きてるのかねー」とふと思ったので簡単に調べてみました。

情報ソースとしてはYahoo!に公開されている地震の履歴一覧のページを参考にして、可視化することにしました。

真面目に処理するのも大変だなと思ったので、ページのURLをGPTに渡して、取得・可視化するプログラムも一緒にやってもらい、眺めることにしました。

やったこと(データ収集)

地震履歴を見ると、記事を書いた段階では549ページ記録されていました(2004/1〜)。テーブルを見ると

  • 発生時刻
  • 震源地
  • マグニチュード
  • 最大震度

の順番にで構造化されているので、pandasと合わせるとうまくいきそうな感じがします。可視化もGPTに丸投げできそうですが、GPTが出力するPythonプログラムだと日本語(「震度」とか)が文字化けするので、そこだけjapanize-matplotlibを自分で付け足すことにします。

データを取得する部分はGPTに丸投げしましたが、適当にパラメータ(表示offset)を与えると549ページ分取得できそうなのがわかります。自分で書いても良いと思います。

実際に取得したデータの冒頭5行はこのようになりました。データ取得してCSVに保存する部分はGPTが書かなかったので自分で書いて、一度取得したらCSVファイルを読み込むように数行直しました。

,time_str,region,magnitude,intensity,time,date
0,2025年11月25日 22時17分ごろ,熊本県阿蘇地方,3.1,2,2025-11-25 22:17:00,2025-11-25
1,2025年11月25日 22時10分ごろ,熊本県阿蘇地方,2.6,1,2025-11-25 22:10:00,2025-11-25
2,2025年11月25日 22時01分ごろ,熊本県阿蘇地方,2.6,1,2025-11-25 22:01:00,2025-11-25
3,2025年11月25日 21時59分ごろ,熊本県阿蘇地方,4.3,4,2025-11-25 21:59:00,2025-11-25

可視化結果

以下は可視化したものです(GPT作成+微調整)。

震度ごとの件数ヒストグラム

GPTいわく、震度の並び順がバラバラになるので、

["1","2","3","4","5弱","5強","6弱","6強","7"]

の震度基準列を手動で reindex して整えています。可視化はこのような感じです。ただ高い震度の地震が少ないはずなので、logスケールにします(これも加筆)。自分でmatplotlibを使うときは、fig,axを受け取る形式で書くことが多いですが、GPTくんは世の中のサンプルプログラムをたくさん学習しているはずなので、お手軽なpltモードを使っていますね。

counts = df_valid["intensity"].value_counts()
counts = counts.reindex(intensity_order).fillna(0).astype(int)
counts.plot(kind="bar")
plt.title("各最大震度の地震回数")
plt.xlabel("最大震度")
plt.ylabel("回数")
plt.yscale("log")
plt.tight_layout()
plt.show()

可視化した結果です。

日ごとの地震回数(全震度・震度5以上)

この可視化は100% GPT制です(自分だと、resampleという使い方を知らない)。

# 2. 日ごとの地震回数の時系列(全震度)
plt.figure()
daily_counts = df_valid.set_index("time").resample("D").size()
daily_counts.plot()
plt.title("日ごとの地震回数(全震度)")
plt.xlabel("日付")
plt.ylabel("件数")
plt.tight_layout()
plt.show()

# 3. 震度別の時系列(例: 震度5弱以上)
plt.figure()
df_5up = df_valid[df_valid["intensity"].isin(["5弱", "5強", "6弱", "6強", "7"])]
daily_5up = df_5up.set_index("time").resample("D").size()
daily_5up.plot()
plt.title("日ごとの地震回数(最大震度5弱以上)")
plt.xlabel("日付")
plt.ylabel("件数")
plt.tight_layout()
plt.show()

全体です。ピークは2011年の震災になっていますね。

震度5弱以上のみです。

まとめ

簡単なプログラムや可視化・pandasの使い方などはGPTくんが詳しいので大変楽できました。まだやっていないこととしては、こういうこともありそうですね。

  • 地震の深さ・マグニチュード・都道府県の緯度経度なども合わせた空間分析
  • ヒートマップ可視化
  • 他のデータソース(APIなど)を使ってみる

以上です。

Discussion