首都圏で発生したM2以上の全地震を視覚化してパターンを探る

今年の1月〜10月までの10ヶ月間に日本全国で起きた全地震データを基に、将来的に首都圏で起こり得るマグニチュード6以上の大地震の発生場所を、Pandasとfoliumを使って予測してみます。予測手順は、最初にPandasでデータを地震の発生頻度、震源の深さとマグニチュード等のパラメータでフィルタリングして、地震予測に必要なデータだけを検索・抽出します。検索・抽出したデータを検証し、最後に、foliumを使って地震発生箇所を視覚化して発生パターンを検出します。先ず、必要なデータをロードします。

import pandas as pd

df = pd.read_csv('2019_earthquakes_jan_oct_new.csv',encoding='utf-8')
スポンサーリンク

震源の深さ別地震発生回数

震源の深さが55km〜75kmでマグニチュードが0より大きい地震に絞って検索にかけてみます。

df1 = df[(df['マグニチュード']>0)&(df['深さ']>=55)&(df['深さ']<=75)]
a = df1['地名'].value_counts().head(20)
a = a.rename_axis('地名').to_frame('地震回数')
df_large = pd.DataFrame(a)
df_large.reset_index()
地名 地震回数
0 宮城県沖 840
1 茨城県南部 751
2 千葉県南東沖 402
3 千葉県北西部 364
4 福島県沖 326
5 岩手県沿岸北部 256
6 奄美大島近海 254
7 浦河沖 233
8 茨城県沖 217
9 沖縄本島近海 180
10 青森県東方沖 162
11 伊予灘 149
12 茨城県北部 147
13 釧路沖 140
14 奄美大島北東沖 139
15 宮城県北部 133
16 東京湾 120
17 千葉県南部 112
18 石垣島近海 107
19 宮古島近海 106

茨城県南部と千葉県北西部が多いことが分かります。この地域において、M7クラスの地震が起こるのは時間の問題と言われているので、この地域に絞って色々と検証してみたいと思います。最初に、これらの地域において、どの深さで最も地震が発生しているのかを検索してみます。

df2 = df[df['地名']=='千葉県北西部']
b = df2['深さ'].value_counts().head(20)
b = b.rename_axis('深さ').to_frame('地震回数')
df_large = pd.DataFrame(b)
df_large.reset_index()
深さ 地震回数
0 64 61
1 62 47
2 63 41
3 65 38
4 61 33
5 37 32
6 36 30
7 35 30
8 33 28
9 66 27
10 34 24
11 60 20
12 31 18
13 58 16
14 68 15
15 59 14
16 38 13
17 67 13
18 32 12
19 42 11

千葉県北西部は、60km〜68kmの深さで、マグニチュードが0より大きい、太平洋プレート上面が震源のプレート境界地震か、太平洋プレートのスラブ内地震が最も多く発生しているようです。31km〜39kmの深さでも多くの地震が発生していますが、これは、フィリピン海プレート上面のプレート境界地震か、フィリピン海プレートのスラブ内地震です。

df3 = df[df['地名']=='茨城県南部']
c = df3['深さ'].value_counts().head(20)
c = c.rename_axis('深さ').to_frame('地震回数')
df_large = pd.DataFrame(c)
df_large.reset_index()
深さ 地震回数
0 41 79
1 61 76
2 64 74
3 67 67
4 66 64
5 60 58
6 44 53
7 65 52
8 42 52
9 62 52
10 37 51
11 40 50
12 38 48
13 43 45
14 39 44
15 59 43
16 36 41
17 55 40
18 54 35
19 52 33

茨城県南部は、59km〜67kmの深さで、マグニチュードが0より大きい太平洋プレート上面が震源のプレート境界地震か、太平洋プレートのスラブ内地震が最も多く発生しているようです。35km〜44kmの深さでも多くの地震が発生していますが、これは、フィリピン海プレートのスラブ内地震だと思われます。次にマグニチュード1.9以上の地震に絞って、首都圏の地震の震源地をマッピングしてみます。

スポンサーリンク

首都圏で今年起きたM1.9以上の地震

df4 = df[df['マグニチュード']>=1.9]
df5 = df4[df4['地名'].str.contains('神奈川県|区|千葉県北東部|茨城県南部|千葉県北西部|千葉県南部|東京|埼玉県')]
import folium

m = folium.Map(location=[35.658099,139.741357],tiles="OpenStreetMap",zoom_start=6)
for i in range(0,len(df5)):
    if df5.iloc[i]['マグニチュード']<2.0:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=3.5*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='blue',fill_color='blue',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=2.0 and df5.iloc[i]['マグニチュード']<2.5:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=3.9*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='red',fill_color='red',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=2.5 and df5.iloc[i]['マグニチュード']<3.0:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='green',fill_color='green',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=3.0 and df5.iloc[i]['マグニチュード']<3.5:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4.2*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='cyan',fill_color='cyan',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=3.5 and df5.iloc[i]['マグニチュード']<4.0:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4.4*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='magenta',fill_color='magenta',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=4.0 and df5.iloc[i]['マグニチュード']<4.5:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4.5*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='purple',fill_color='purple',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=4.5 and df5.iloc[i]['マグニチュード']<5.0:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4.7*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='darkyellow',fill_color='darkyellow',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=5.0 and df5.iloc[i]['マグニチュード']<5.5:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4.8*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='violet',fill_color='violet',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=5.5 and df5.iloc[i]['マグニチュード']<6.0:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=4.9*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='skyblue',fill_color='skyblue',).add_to(m)
    if df5.iloc[i]['マグニチュード']>=6.0:
        folium.CircleMarker([df5.iloc[i]['経度'],df5.iloc[i]['緯度']],
        radius=5*df5.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df5.iloc[i]['日']+"<br>"+"発生時刻:"+df5.iloc[i]['時']+
        "<br>"+"震源地:"+df5.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df5.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df5.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='salmonpink',fill_color='salmonpink',).add_to(m)
m

茨城県と千葉県の内陸部は、いつM6〜M7級の地震が起きてもおかしくないような感じを受けますが、特に気になったのは、10月に入って西荻窪と多摩市でマグニチュード3以上の地震が起きていることで、どちらの地震も震源の深さが27kmなので活断層型地震と思われます。次に、検索地域を、東京、神奈川県東部、千葉北西部、埼玉県南部に絞り込んで、この地域における深さが35km以下かつマグニチュードが0より大きい地震を抽出してみます。

スポンサーリンク

首都近郊で今年発生したM0.1以上の地震

df0 = df[(df['マグニチュード'] > 0) & (df['深さ'] <= 35)]
df6 = df0[df0['地名'].str.contains('東京|千葉県北西部|埼玉県南部|神奈川県東部')]
import folium

m = folium.Map(location=[35.658099,139.741357],tiles="OpenStreetMap",zoom_start=6)
for i in range(0,len(df6)):
    if df6.iloc[i]['マグニチュード']<2.0:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=3.5*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='blue',fill_color='blue',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=2.0 and df6.iloc[i]['マグニチュード']<2.5:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=3.9*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='red',fill_color='red',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=2.5 and df6.iloc[i]['マグニチュード']<3.0:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='green',fill_color='green',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=3.0 and df6.iloc[i]['マグニチュード']<3.5:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4.2*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='cyan',fill_color='cyan',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=3.5 and df6.iloc[i]['マグニチュード']<4.0:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4.4*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='magenta',fill_color='magenta',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=4.0 and df6.iloc[i]['マグニチュード']<4.5:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4.5*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='purple',fill_color='purple',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=4.5 and df6.iloc[i]['マグニチュード']<5.0:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4.7*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='darkyellow',fill_color='darkyellow',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=5.0 and df6.iloc[i]['マグニチュード']<5.5:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4.8*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='violet',fill_color='violet',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=5.5 and df6.iloc[i]['マグニチュード']<6.0:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=4.9*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='skyblue',fill_color='skyblue',).add_to(m)
    if df6.iloc[i]['マグニチュード']>=6.0:
        folium.CircleMarker([df6.iloc[i]['経度'],df6.iloc[i]['緯度']],
        radius=5*df6.iloc[i]['マグニチュード'],
        popup=folium.Popup('<div style="font-size: 18pt; color : black">'
        +"発生日:"+df6.iloc[i]['日']+"<br>"+"発生時刻:"+df6.iloc[i]['時']+
        "<br>"+"震源地:"+df6.iloc[i]['地名']+"<br>"+"マグニチュード:"+
        df6.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
        df6.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
        parse_html=False),color='salmonpink',fill_color='salmonpink',).add_to(m)
m