PythonモジュールのPandasの学習の一環として、今年の1月〜10月までの10ヶ月間に起きた全地震データを基に、今後、何処でマグニチュード6以上の大地震が起こり得るのかを考察してみたいと思います。予測手順は、Pandasを使ってデータから、地震頻度や深さとマグニチュードでフィルタリングしたりして、地震予測に必要なデータを検索・抽出して、さらに、foliumを使って地震発生箇所を視覚化することで発生パターンを見出します。
import pandas as pd
df = pd.read_csv('2019_earthquakes_jan_oct.csv',encoding='utf-8')
最も頻繁に地震が発生している上位20地域を検索してみます。
aaa = df['地名'].value_counts().head(20)
aaa = aaa.rename_axis('地名').to_frame('地震回数')
df_large = pd.DataFrame(aaa)
df_large.reset_index()
2011年の東日本大震災の余震が圧倒的に多いことが分かります。沖縄本島近海、奄美大島近海、日向灘、和歌山県北部、紀伊水道、長野県南部は、東海、東南海、南海、日向灘、九州沖、沖縄沖の6連動巨大地震が懸念されます。次に、マグニチュードが2.0以上の地震のみに絞って地震頻度を検索してみます。
df1 = df[df['マグニチュード']>=2.0]
aaa = df1['地名'].value_counts().head(20)
aaa = aaa.rename_axis('地名').to_frame('地震回数')
df_large = pd.DataFrame(aaa)
df_large.reset_index()
マグニチュード2以上の地震については、沖縄、奄美大島、宮古島、与那国島、台湾が、東日本大震災の余震並に多いのがかなり気になります。今度は、マグニチュード3.0以上の地震に絞って検索してみます。
df2 = df[df['マグニチュード']>=3.0]
aaa = df2['地名'].value_counts().head(20)
aaa = aaa.rename_axis('地名').to_frame('地震回数')
df_large = pd.DataFrame(aaa)
df_large.reset_index()
マグニチュード2以上と比べると、そんなに違いがないように見受けられるので、今度は、マグニチュード4以上の地震に絞って検索してみます。
df_4 = df[df['マグニチュード']>=4.0]
aaa = df_4['地名'].value_counts().head(20)
aaa = aaa.rename_axis('地名').to_frame('地震回数')
df_large = pd.DataFrame(aaa)
df_large.reset_index()
台湾、千島、鳥島、硫黄島等の、日本本土から離れた所で、マグニチュード4以上の地震が多発していることが分かります。福島県沖、宮城県沖、三陸沖、青森県東方沖、岩手県沖で未だにマグニチュード4以上の余震が100回以上起きていることに驚かされます。次に、今年起きた地震のマグニチュードが大きい上位20地域を検索してみます。
df.sort_values(by="マグニチュード", ascending = False).head(20)
山形県沖のマグニチュード6.7の地震に絞って考察してみたいと思います。先ず、この地震発生以前のこの周辺の地震発生状況を検索してみます。
df3 = df[(df['日']<='2019/6/18') & (df['時']<='22:22:19.9')]
df4 = df3[(df3['地名'].str.contains('山形'))|(df3['地名']=='新潟県上中越沖')|
(df3['地名']=='秋田県沖')|(df3['地名'].str.contains('下越'))]
import folium
m = folium.Map(location=[35.658099,139.741357],tiles="OpenStreetMap",zoom_start=6)
for i in range(0,len(df4)):
if df4.iloc[i]['マグニチュード'] < 1.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.5*df4.iloc[i]['マグニチュード']+1,
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='blue',fill_color='blue',).add_to(m)
if df4.iloc[i]['マグニチュード']>=1.0 and df4.iloc[i]['マグニチュード']<2.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.9*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='red',fill_color='red',).add_to(m)
if df4.iloc[i]['マグニチュード']>=2.0 and df4.iloc[i]['マグニチュード']<3.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.8*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='green',fill_color='green',).add_to(m)
if df4.iloc[i]['マグニチュード']>=3.0 and df4.iloc[i]['マグニチュード']<3.5:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.7*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='cyan',fill_color='cyan',).add_to(m)
if df4.iloc[i]['マグニチュード']>=3.5 and df4.iloc[i]['マグニチュード']<4.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.6*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='magenta',fill_color='magenta',).add_to(m)
if df4.iloc[i]['マグニチュード']>=4.0 and df4.iloc[i]['マグニチュード']<4.5:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.5*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='purple',fill_color='purple',).add_to(m)
if df4.iloc[i]['マグニチュード']>=4.5 and df4.iloc[i]['マグニチュード']<5.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.4*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='darkyellow',fill_color='darkyellow',).add_to(m)
if df4.iloc[i]['マグニチュード']>=5.0 and df4.iloc[i]['マグニチュード']<5.5:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.3*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='violet',fill_color='violet',).add_to(m)
if df4.iloc[i]['マグニチュード']>=5.5 and df4.iloc[i]['マグニチュード']<6.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=3.2*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='skyblue',fill_color='skyblue',).add_to(m)
if df4.iloc[i]['マグニチュード']>=6.0:
folium.CircleMarker([df4.iloc[i]['経度'],df4.iloc[i]['緯度']],
radius=4.1*df4.iloc[i]['マグニチュード'],
popup=folium.Popup('<div style="font-size: 18pt; color : black">'
+"発生日:"+df4.iloc[i]['日']+"<br>"+"発生時刻:"+df4.iloc[i]['時']+
"<br>"+"震源地:"+df4.iloc[i]['地名']+"<br>"+"マグニチュード:"+
df4.iloc[i]['マグニチュード'].astype(str)+"<br>"+"震源の深さ:"+
df4.iloc[i]['深さ'].astype(str)+"km"+'</div>',max_width=330,min_width=330,
parse_html=False),color='salmonpink',fill_color='salmonpink',).add_to(m)
m