改正メルカリ震度階級から最大速度を求める式を作り、気象庁震度階級を計算する(式の例付き)

<!--
<img src="" width="49%" /><img src="" width="49%" />
-->
お急ぎの方は、  [私が出した式の例](#式の例)　[コードの例](#コードの例)

追記:若干改良しました

https://qiita.com/Ichihai1415/items/d1c6632552d20d0532de

## 注意
- 語彙力がないので所々おかしいですが頑張って解読してください。
- 私は詳しいわけではないのでご了承ください。間違っていたら教えてください。(対数関数を使ってますが習ってないときに書いたのでおかしいかもしれません)
- 自分の解釈や想像が含まれているので詳しくは各自調べてください。
- データは適当に抽出しているので精度は低めです。

# 前書き
※長いので軽く読み飛ばしてもらってもOKです　[本編(導出)](#本編導出)
[WorldQuakeViewer](https://github.com/Ichihai1415/WorldQuakeViewer)を作ってる人です。USGSなどでは揺れの大きさを表す指標として改正メルカリ震度階級(MMI)が用いられています。海外で大きな地震が起きた時「気象庁震度階級○～○相当」と聞いたことがあると思いますが違和感を感じたことはありませんか？(特にウェザーニュースの記事等) マグニチュードの割に弱かったり。(MMIが小さく出ることもよくありますが。)ここではUSGSのデータを参考にしてMMIから気象庁震度への変換をやってみたいと思います。

## そもそも改正メルカリ震度階級とは
**MMIは気象庁震度階級とは異なり、計測データだけではなく過去の地震の被害状況をもとに被害の大きさがに分かるようになっています。** つまり、土地によって変わります。[(USGSの解説)](https://www.usgs.gov/programs/earthquake-hazards/modified-mercalli-intensity-scale)

### USGSの改正メルカリ震度階級
とはいえ、発生後すぐにわかるわけではないためUSGSでは最大加速度と最大速度で求めています。ほぼM5.5(アメリカの内陸だともっと小さくM3台でも出ることも)くらい以上あると発生から20分~30分くらいでMMIが発表されます。Feedには細かく3.456などまで出ます。

「気象庁震度階級○～○相当」というのはUSGSのデータを対応表に照らし合わせて求めていると思います。そこで注意したいのは、**ShakeMapの数値はあくまで推定**ということです。またDid You Feel It?は各ユーザーの体感です。気象庁のように観測データの最大というわけではありません。(とはいえ日本も観測された以上に局地的に震度○ということはよくありますが)StationListのものはDownloadsのjsonを見る限り同じPGVでもMMIが違っているのでちゃんとしたやつ・・・だと思います。

住宅地から離れたところで起きた地震、例えば[2023/02/23のタジキスタンの地震](https://earthquake.usgs.gov/earthquakes/eventpage/us6000jqxc/executive)を見てみると、ShakeMapではVIIに対しStation ListではIVとなっています。PAGERの通り、内陸M6.8という規模でも被害は少ないです。

他にも耐震性や津波の被害などを考えると**海外の被害を推測するにはPAGERが適切です。**[USGSのページ](https://www.usgs.gov/publications/earthquakes-pager)によると、M5.5以上の地震が起こると20分以内に人口や過去の被害を考慮して被害を推定するようです。Feed見る限りもうちょっと遅い気がしますが…(基本MMIが出た後1分以内にPAGERが発表されます。MMIが大きいとPAGERはもう少し遅いです。(2023/02/06のトルコの地震1回目は第一報12分、MMI20分、PAGER24分))

## 改正メルカリ震度階級と最大速度
USGSのShakeMapには↓の画像がありますが、どうやらWorden et al.(2012)だそうです。
![mmi_legend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/5cdff7eb-f4c5-e34e-a1f3-784077b75118.png)
~~調べてもよくわかりませんが、~~ [防災科研の解説](https://www.kyoshin.bosai.go.jp/kyoshin/topics/chuetsuoki20070716/pgav5v20070716.html)(必ずしも公式見解ではない)によると最大加速度より最大速度のほうが良い相関があるといわれているらしいのでPGVのほうを使います・・・と言いたいところですがこの表だけでは足りないので、ShakeMapのStation ListのDownloadsのStation Listのjsonデータにある観測点のPGVとMMIを使って式を作っちゃいましょう。

## 気象庁震度階級と最大速度
[J-RISQ地震速報にも使われている](https://www.j-risq.bosai.go.jp/report/howto-report-past.html)、[藤本･翠川(2005)](https://www.jstage.jst.go.jp/article/jisss/7/0/7_241/_pdf/-char/ja)の換算式を用います。
```math
I=\left\{\begin{align}
2.165+2.262\log_{10}(PGV)\,\,\,\,\,
(I<4)\approx(PGV<7cm/s)\\
2.002+2.603\log_{10}(PGV)-0.213\log_{10}(PGV)^{2}\,\,\,\,\,
(I\ge4)\approx(PGV\ge7cm/s)\\
\end{align}\right\}
```
# 本編(導出)
ShakeMapのStation ListのDownloadsのStation ListのjsonデータのPGVとMMIをcsvにでも抜き出しましょう。**場所によって差があるのでいろいろな地震をまとめるなどしましょう。**(地域ごとに出してみるのもいいかもしれない)
[トルコの地震](https://earthquake.usgs.gov/earthquakes/eventpage/us6000jllz/shakemap/stations?source=us&code=us6000jllz)などPGVが大きいものは少ないのでしっかり入れましょう。(PGV215.34cm/s,MMI9.8観測したところもあります)

```c#:C#の例
//using Newtonsoft.Json.Linq;
string JsonText = "";//jsonデータ
JObject json = JObject.Parse(JsonText);
string csv = "PGV,MMI";
foreach (JToken json_ in json.SelectToken("features"))
{
  if ((string)json_.SelectToken("properties.pgv") == "null")
    continue;//null(体感のもの(UTMが付くやつ)?)があると邪魔だしExcelの散布図が作りにくいから飛ばす　たぶんmmiはnullにはならない
  csv += $"\n{json_.SelectToken("properties.pgv")},{json_.SelectToken("properties.intensity")}";
  Console.WriteLine($"{json_.SelectToken("properties.pgv")},{json_.SelectToken("properties.intensity")}");
}
File.WriteAllText($"output.csv", csv);
```

これでできたcsvをExcelなどに読み込ませて散布図を作りましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/c548dc45-9cf9-9945-4e1e-4eb9b2557558.png" width="49%" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/960fb981-7f9a-b286-2360-6bb011816e20.png" width="49%" />
トルコの地震の例。対数近似はずれるので手動で調整しましょう！
別のところに適当に式を入れて一定区間ごとに計算し表示してみましょう。
(もっといいやり方があるかもしれない。VBAでFunctionに式を定義し、Subを実行し適当なセルの値を変えると楽)
```vb:VBAの例
Function MMI(PGV As Double) As Double
  If PGV < 4 Then
    MMI = 3.5 + 0.65 * WorksheetFunction.Ln(PGV)'LnかLog10かはご自由に
  Else
    MMI = 2.5 + 1.37 * WorksheetFunction.Ln(PGV)
End Function

Sub change()
  Cells(1, 28).Value = "" '(任意のセル)　これ実行すると再実行されるので楽
End Sub
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/31b2f467-650b-70f7-34e9-9b6a22290cc8.png)
こんな感じ。
ここで、1つの式に表すとずれるので藤本･翠川(2005)の換算式のように2つに分けるといいでしょう。
1.一定以下のPGVを無視して近似対数関数を作る
2.無視したところの近似対数関数を作る
という風にやりましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/dc5bb36c-c22a-8d2e-236c-ceb0d975c8e6.png)
PGVが小さいところは難しいですが頑張りましょう。

## 式の例
```math
MMI=\left\{\begin{align}
3.5+0.65\ln(PGV)\,\,\,\,\,
(PGV<4cm/s)\approx(MMI<4.4)\\
2.5+1.37\ln(PGV)\,\,\,\,\,
(PGV\ge4cm/s)\approx(MMI\ge4.4)\\
\end{align}\right\}
```
```math
PGV=\left\{\begin{align}
e^{((MMI-3.5)/0.65)}\,\,\,\,\,
(MMI<4.4)\approx(PGV<4cm/s)\\
e^{((MMI-2.5)/1.37)}\,\,\,\,\,
(MMI\ge4.4)\approx(PGV\ge4cm/s)\\
\end{align}\right\}
```
常用対数にしてみると、
```math
MMI=\left\{\begin{align}
3.5+1.5\log_{10}(PGV)\,\,\,\,\,
(PGV<4cm/s)\approx(MMI<4.4)\\
2.5+3.155\log_{10}(PGV)\,\,\,\,\,
(PGV\ge4cm/s)\approx(MMI\ge4.4)\\
\end{align}\right\}
```
```math
PGV=\left\{\begin{align}
10^{((MMI-3.5)/1.5)}\,\,\,\,\,
(MMI<4.4)\approx(PGV<4cm/s)\\
10^{((MMI-2.5)/3.155)}\,\,\,\,\,
(MMI\ge4.4)\approx(PGV\ge4cm/s)\\
\end{align}\right\}
```
となります。目視で求めているのでlogへの変換はこれくらいで十分でしょう。
この式は他の地震も適当に混ぜたものでもいい感じに一致しました。
ただし、[この画像](https://qiita.com/Ichihai1415/items/2e14fc2356ec8e140291#%E6%94%B9%E6%AD%A3%E3%83%A1%E3%83%AB%E3%82%AB%E3%83%AA%E9%9C%87%E5%BA%A6%E9%9A%8E%E7%B4%9A%E3%81%A8%E6%9C%80%E5%A4%A7%E9%80%9F%E5%BA%A6)から逆算するとMMIが少しずれます。(この表がよくわかっていないのでとりあえずこのまま)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/3c398e55-c8d2-d92a-740c-9d3145f2549a.png)
青:各データ　灰:PGV<4cm/s　黄色:PGV≧4cm/s(少し範囲外も描画しています)
順番に計算してみるとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/e92257b9-bcf3-e63b-04f6-a76456f02d90.png)
(ln)はMMI→PGAの計算に自然対数、(log)はMMI→PGAの計算に常用対数を使ったものです。
もう少し細かくすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/9bb18ce7-1041-6140-7c76-fd2f93c2217a.png)
ここで、MMIと気象庁震度階級の揺れの大きさの対応表を比べて見ると思います。
4<MMI<6のあたりは式が変わるところなのでこの辺りは曲線になると良い…のかな？
一応多項式近似を出してみましたが大きな違いはなさそうですね。どこが誤差が多いのかわからないので直接の式を出すのはやめときます。

## コードの例
```c#:C#
private void Main()
{
  double MMI = 5.678;
  double PGV = MMI2PGV(MMI);
  double JI = PGV2JI(PGV);
  Console.WriteLine("MMI:" + MMI);
  Console.WriteLine("PGV:" + PGV);
  Console.WriteLine("震度:" + JI);
}

public double MMI2PGV(double MMI)//MMI→PGV
{
  if (MMI < 4.4)
    return Math.Exp((MMI - 3.5) / 0.65);
  else
    return Math.Exp((MMI - 2.5) / 1.37);
}

public double PGV2JI(double PGV)//PGV→JmaIntensity
{
  if (PGV < 7)
    return 2.165 + 2.262 * Math.Log10(PGV);
  else
    return 2.002 + 2.603 * Math.Log10(PGV) - 0.213 * Math.Pow(Math.Log10(PGV), 2);
}
```
```vb:VBA
Function MMI2PGV(MMI As Double) As Double
  If MMI < 4.4 Then
      MMI2PGV = Exp((MMI - 3.5) / 0.65)
  Else
      MMI2PGV = Exp((MMI - 2.5) / 1.37)
  End If
End Function

Function PGV2JI(PGV As Double) As Double
  If PGV < 7 Then
    PGV2JI = 2.165 + 2.262 * WorksheetFunction.Log10(PGV)
  Else
    PGV2JI = 2.002 + 2.603 * WorksheetFunction.Log10(PGV) - 0.213 * WorksheetFunction.Log10(PGV) ^ 2
  End If
End Function

Function MMI2JI(MMI As Double) As Double
  MMI2JI = PGV2JI(MMI2PGV(MMI))
End Function
```
## 日本の地震で比較
### 福島県沖地震(2022年)
[気象庁](https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html#20220316233632)  [USGS](https://earthquake.usgs.gov/earthquakes/eventpage/us6000h519/executive)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/2264ea08-8d15-1f70-5564-9fc6c6f6f2db.png" width="49%" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/a0f8d4c7-c97d-80ff-2ef9-403db61bcdc9.png" width="49%" />
右は計算した震度をマップに表示するものです。いつか公開予定です。配色はKiwi Monitor カラースキーム 第2版を少し変更したものです。震度0.5未満も描画しているので注意してください。
↓配色(基本背景(ここでは不使用)、震度0、震度1....)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/41c92f67-b1af-530f-a135-eccc8a8ca948.png)

震度が低いところは特に1階級くらい差ありますがほとんど同じですね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/ddb6f2ca-1b8e-2769-7ca3-a510ccb3bd3c.png" width="49%" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/49ebdd26-6c73-8a6f-367a-e76e0a4f88e0.png" width="49%" />

### 東北地方太平洋沖地震
[気象庁](https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html#20110311144618)  [USGS](https://earthquake.usgs.gov/earthquakes/eventpage/official20110311054624120_30/executive)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/705a7a93-fc0f-32be-2869-2c13cf5fb2b2.png" width="49%" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/f970a41a-3cb2-9b96-554a-2866756a5775.png" width="49%" />
同じ感じですが、震度4が多くなっています。

### 熊本地震(16日)
[気象庁](https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html#20220316233632)  [USGS](https://earthquake.usgs.gov/earthquakes/eventpage/us6000h519/executive)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/3c0357cc-4aad-c32c-5be5-284274dc6efa.png)
震度7を観測したところがUSGSにはないですね(緑丸のあたり？)

### 北海道胆振東部地震
[気象庁](https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html#20180906030759)  [USGS](https://earthquake.usgs.gov/earthquakes/eventpage/us2000h8ty/executive)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/13e1e0ff-5d68-26cc-ae0c-90778e6aa0f3.png" width="49%" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/ce81754f-fe2f-5a0a-7f63-f94db488edb1.png" width="49%" />
計算震度7はUSGSによるとおそらく[HKD126 鵡川](https://www.kyoshin.bosai.go.jp/cgi-bin/kyoshin/db/siteinfo.cgi?0+HKD126+knt)ですね。気象庁観測点ではない？
MMI高いと近いMMIでもPGVの範囲が広いから誤差が大きくなりやすいですね。(その分気象庁震度階級も変わりにくいですが)
全体的に計算PGVが高いですが、震度にはほとんど影響してないように見えます。StationListのMMIの計算方法が世界共通かMMIが計算で出したものでないなら、被害が外国より小さくなりやすい日本ではMMIが小さくなるはずなので、その場合なら妥当ではないでしょうか。

## やりたかった検証
- ~~USGSのStationListは大きな地震の場合防災科研のデータがあります(要検証)が、実際の詳しい震度(震度5.3、震度5.7など)が分かれば詳しく比較できますがどこにあるかわからないのでパス。(気象庁は防災科研のデータは詳しく公開していない)~~ そういえばわかるやん。まあ気が向いたら()
- DYFIはアンケートを基に推定(メルカリ)震度が出ますが、ついでにPGAとPGVも出ます。この値が震度から計算されたのかアンケートも考慮しているのかただ推定震度分布的なものから出しているのかはわかりませんが、これも何かに生かせそうな...?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/316fb226-97f5-a31b-893f-660e96cb72bb.png)


# 実践(USGSの推定最大MMIから)
USGSのShakeMapにはIIIとかVとかVIIとかしか表示されませんが、**Feedにはもっと詳しく書かれています。** こっちを使いましょう。
[WorldQuakeViewer](https://github.com/Ichihai1415/WorldQuakeViewer)には詳細なMMIを表示しているので発生して数時間以内だったらどうぞ。
↓は面倒なので簡単に見れるページ作っておきます。

json(geojson)を見ることになるので、JsonFormatterなどで検索して拡張機能を入れたりサイトで見やすくすることをお勧めします。私は[これ](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=en)を使用しています。↓では説明用に[]を用いていますがその部分は実際の値です。
**USGSの地震の詳細ページのURLとかからIDを探してコピーしておきましょう。**(URLだったらhttps://earthquake.usgs.gov/earthquakes/eventpage/[ここがID]/executive)

Feedのフォーマットは[ここ](https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php)で見れます。
### 1.地震ごとのFeedを見る(こっちのほうが簡単)
1. https://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/[ID].geojson を開く。
2. "mmi":[ここがMMI、nullだったら未発表]のところを探す。最初のほうにあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/3337817d-936c-3f40-1b90-94e3047a2533.png)
3. 計算する

### 2.総合Feedを見る
1. https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php の右側にある**Feed**の、発生から1日以内なら**Past Day**、7日以内なら**Past 7 Days**の**Significant Earthquakes**(重大な地震(M6クラス、MMI5クラス、アメリカならM3~4でもでも入る))か**M4.5+ Earthquakes**(M4.5以上)を開く。
2. 該当の地震を頑張って探すか、IDで検索する
{"type": "Feature",～"id": "[ここにID]"}, が1つの地震です。
3. 上の塊の中で、"mmi":[ここがMMI、nullだったら未発表]のところを探す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/400ff98d-654f-932b-4c88-915d6b298bb9.png)
4. 計算する。

USGSのShakeMapのMMI-0.5~+0.5での計算震度と観測震度の差を比べてみるとShakeMapの方は小さいことがあります。[このページ](https://earthquake.usgs.gov/earthquakes/map/?currentFeatureId=usp000d3mb&extent=25.87675,128.0169&extent=38.88909,143.5296&range=search&search=%7B%22name%22:%22Search%20Results%22,%22params%22:%7B%22starttime%22:%222000-02-25%2000:00:00%22,%22endtime%22:%222023-03-04%2023:59:59%22,%22maxlatitude%22:48.592,%22minlatitude%22:29.098,%22maxlongitude%22:150.609,%22minlongitude%22:126.703,%22minmagnitude%22:4.5,%22minmmi%22:5,%22orderby%22:%22time%22%7D%7D)で近年のMMI5以上の地震が調べられます。(検索条件を確認してください)

# 応用
StationListのデータを利用して[これのように](https://qiita.com/Ichihai1415/items/2e14fc2356ec8e140291#%E6%97%A5%E6%9C%AC%E3%81%AE%E5%9C%B0%E9%9C%87%E3%81%A7%E6%AF%94%E8%BC%83)気象庁震度マップを作ることができます。(現在作成中です。)

# 結論・感想
- 一応求めることができます。
- USGSのShakeMapは推定値なのでマグニチュードと深さ的に明らかに小さければ(日本の地震は特に小さくなりやすい)マグニチュードと深さで震度予想したほうが正確なこともあります。
- 被害を推測するなら**PAGERを参考にしましょう。** 
- 私が出した式はある程度の精度はありますがまだまだ改良の余地があるのでぜひ暇があれば求めてみてください。
- ~~4日もかかった。疲れた。~~

# 参考・データ使用
- 気象庁
- USGS
- 各先行研究?