今年の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')
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()
茨城県南部と千葉県北西部が多いことが分かります。この地域において、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()
千葉県北西部は、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()
茨城県南部は、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