先日結構大きな地震が有ったので
気になってしまいました。

地震のデータを集めてみたので
可視化することにしました。

解説動画はこちら



さて今回参考にしたのは
気象庁のデータです。

地震データベースがあるので
そこからCSVでダウンロードできるようです。

観測当時からのデータがありますが
震度1とかにしてしまうと
データが多すぎて全件は無理そうでした。

今回は震度5弱以上で抽出し
地震リスト.tsvに保存しています。

早速データを読み込みします。
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

data1_path = '地震リスト.tsv'
df1 = pd.read_table(data1_path)

中身はこんな感じになっています。

スクリーンショット 2021-10-09 16.57.00

つい最近までの震度5弱以上の震源地が記載されています。


これを可視化してみます。

可視化にはFoliumを使用します。
これはデータを地図上にプロットして
見やすくしてくれるものです。

マッピングには緯度経度を使用します。
データだと緯度経度の値などが
文字列かつ形式も違うので
そのままではマッピングに適していません。

DMS形式の緯度経度を
Degree形式の緯度経度に直します。

その他数値であるデータもデータ型を直す
前処理を行うコードがこれです。

# 不明データの削除
df1 = df1[~(df1['緯度']=='不明') | ~(df1['経度']=='不明')]
df1 = df1[~(df1['M']=='不明')]
df1 = df1.reset_index(drop = True)

# 震度データの整理
df1['最大震度'][df1['最大震度']=='震度5'] = '震度5弱'
df1['最大震度'][df1['最大震度']=='震度6'] = '震度6弱'

# 数値データの整形
df1['緯度2'] = df1['緯度'].str.replace('′N','').str.replace('°','.').str.split('.')
df1['経度2'] = df1['経度'].str.replace('′E','').str.replace('°','.').str.split('.')
df1['深さ'] = df1['深さ'].str.replace(' km','')

# 緯度経度をDegree形式へ変換
import math
from decimal import Decimal, ROUND_HALF_UP

# DMS形(度分秒)からDegree形式(度)への変換
def dms_to_degree(d):
    h,m,s = int(d[0]),int(d[1]),int(d[1])
    return Decimal(str(h + (m / 60) + (s / 3600))).quantize(Decimal('0.0001'), rounding=ROUND_HALF_UP)
    
# 緯度経度の変換
df1['longitude'] = df1['緯度2'].apply(dms_to_degree)
df1['latitude'] = df1['経度2'].apply(dms_to_degree)

# データ型変換
df1['longitude'] = df1['longitude'].astype('float')
df1['latitude'] = df1['latitude'].astype('float')
df1['M'] = df1['M'].astype('float')
df1['深さ'] = df1['深さ'].astype('int')

これで下処理ができました。
出来上がりはこんな感じです。

スクリーンショット 2021-10-09 16.58.15


早速このデータを使って
Foliumでマッピングしたいと思います。

今回は震度別で色で分けられるように
マッピングしました。

データは前処理したdf1をそのまま使用します。

import folium
from folium.features import CustomIcon
import pandas as pd

# マーカーの指定
def make_maker(r,color):
    rad = r['M'] * 1000
    name = r['地震の発生日'] + ' ' + r['地震の発生時刻'] +' : ' + r['震央地名']
    tmp = folium.Circle(
        location = [r['longitude'],r['latitude']], 
        popup    = name ,
        tooltip  = '{0} , 深さ : {1}km , M{2} , {3}'.format(name,r['深さ'],r['M'],r['最大震度']),
        radius = rad , color     = color , fill = True )
    return tmp
    
plot_map = folium.Map(location=[適当な緯度,適当な経度] ,  zoom_start=5)
s5j_group = folium.FeatureGroup(name="震度5弱").add_to(plot_map)
s5k_group = folium.FeatureGroup(name="震度5強").add_to(plot_map)
s6j_group = folium.FeatureGroup(name="震度6弱").add_to(plot_map)
s6k_group = folium.FeatureGroup(name="震度6強").add_to(plot_map)
s7_group = folium.FeatureGroup(name="震度7").add_to(plot_map)

for i, r in df1[df1['最大震度']=='震度5弱'].iterrows():
    s5j_group.add_child(make_maker(r,'#99FFFF'))
for i, r in df1[df1['最大震度']=='震度5強'].iterrows():
    s5k_group.add_child(make_maker(r,'#66FF00'))
for i, r in df1[df1['最大震度']=='震度6弱'].iterrows():
    s6j_group.add_child(make_maker(r,'#FFFF00'))
for i, r in df1[df1['最大震度']=='震度6強'].iterrows():
    s6k_group.add_child(make_maker(r,'#FF00FF'))
for i, r in df1[df1['最大震度']=='震度7'].iterrows():
    s7_group.add_child(make_maker(r,'#FF0000'))
folium.LayerControl().add_to(plot_map)
plot_map.save("HTMLファイル名")

実行するとHTMLファイルが出来上がります。
それを開くとこんな感じです。

スクリーンショット 2021-10-09 16.52.44


地図の右上から震度別で
表示を切り替えできるようになっています。

スクリーンショット 2021-10-09 16.54.24

震度6以上だとこんな感じに

スクリーンショット 2021-10-09 16.54.51

震度7だけだとこうなります。
スクリーンショット 2021-10-09 16.55.15


先日地震のあった場所は
千葉県の北西部で震度5強を観測しています。

スクリーンショット 2021-10-09 17.05.12


こんな感じでうまくマッピング出来て
いろいろ切り替えながら眺められるので
面白いと思います。

50年以上の観測データのようですが
関東圏では震度6強より大きな地震の発生がなさそうですね。

ただ、ここ最近の大地震を線で結ぶと
スクリーンショット 2021-10-09 16.54.51のコピー

きれいに一直線でつながるのが
少し怖いですねーー

無理くりつなげてみましたが
このライン上には何か有るのかも・・・

いつ地震が来ても良いような
備は考えておくべきですね!!!!

今回は地震データを
Folium可視化してみました。

やりたい方はコピペして
試してみてくださいね。

それでは。