diff --git a/documents/content/docs/appendix/design_for_upgrading_to_env2.md b/documents/content/docs/appendix/design_for_upgrading_to_env2.md new file mode 100644 index 000000000..dc82c5214 --- /dev/null +++ b/documents/content/docs/appendix/design_for_upgrading_to_env2.md @@ -0,0 +1,174 @@ +--- +title: "ENv2バージョンアップに関する技術的な検討内容" +weight: 10 +type: docs +--- + +## Exposure Notification API v2へのバージョンアップに関する技術的な検討内容について + +COCOA v2.0.0からは、利用するExposure Notification API(以下EN)がv2に切り替えられている。 +ENv2は、従前のv1と比べて、濃厚接触の可能性を判定する方式が大きく変更されたため、パラメータを最初から設定しなおす必要がある。 +そのため、検証専門チームによる実機での計測も行い、その結果も踏まえてパラメータを設計したが、その経緯をまとめたものが本文書である。 + +なお、当初はv2.0.0では、ENv2の機能を活用した新しい機能も実装する予定だったが、v2.1.0以降に先送りとなってしまったため本文書では取り扱わない。 +検討の経緯は、github discussions [EN v2を搭載するCOCOAで実現したい機能について #532](https://github.com/cocoa-mhlw/cocoa/discussions/532) を参照のこと。 + +### Exposure Notification v1とv2の違い + +複数の条件を元に、接触内容や想定されるリスクに応じた内容の接触通知を出せるようになる。 + +- リスクを判定するスコア設定の柔軟性が上がる + - V1…時間・電波強度ともに設定は8段階の値からの選択方式のため、1つの状態しか接触判定できないスコア設計となる + - V2…時間・電波強度ともに具体的な値で設定でき、複数の状態を接触判定できるようなスコア設計が可能 +- 発症日からの経過日数でリスクの有無を判定できるようになる + - V1…Exposure Notification側の設定項目がなく、アプリ側での対応が必要 + - V2…発症日(あるいは検体採取日)から◯日目という形で指定可能 +- 接触に関する詳しい情報を踏まえて、接触通知の内容を変えることが出来る + - V1…通知はOS側が出し、接触に関する情報も得られないため、どのような接触でも同じ接触通知となる + - V2…接触に関する詳細な情報(接触時間・電波強度等)が得られ、それを元にリスクに応じた通知をアプリ側で出せる + +本ドキュメントでは、根幹に関わる内容である1点目について検討を行った。 +なお、2点目については、処理を行う箇所が変わるだけで設定する内容(発症2日前~10日後)は変わらないため、詳細な検討は不要。 +また、3点目については、github discussions [#532](https://github.com/cocoa-mhlw/cocoa/discussions/532) で議論を行っている。 + +### 距離・時間の判定方法が変わることによる影響 + +v1は、定義に当てはまる接触の回数を数えるが、v2は、接触時間に重み付けをして合計値を返し、その値(リスクスコア)が閾値を超えているかどうかで判定を行う。 + +- v1では、15分間連続して条件を満たすと接触判定するため、例②のような、一瞬電波強度が弱まるような状態は接触にならない +- v2では、平均の電波強度別に接触の時間に係数を掛けてスコア判定するため、例②のような状況でも接触と判定する。 + +![ENv1とv2の接触判定の違い](/cocoa/appendix/upgrading_v2_fig1.png) + +※図では1分毎の電波強度を示しているが、v2では厳密には5分間までの平均値で返されることがある + +### ENのリスクスコアとは、「接触」時に一定の値を超えるよう設計された数字 + +具体的なパラメータ値(リスクスコアの計算方法と閾値)の検討に入る前に、リスクスコアの意味について確認する。 + +- リスク「スコア」という名前からは、なにか「リスクの大きさに比例する」ものを想像しがちであり、距離・時間と比例する関係にさせないといけないと考えがちである + - 例:「距離が半分ならスコアは2倍になる」「距離が10分の1ならばスコアは10倍」など +- しかし、COCOAは、濃厚接触の可能性の「有無」だけを判断するものであり、その目的を踏まえると、距離が1m以内であれば、どのような距離でも15分間接触しなければ閾値を超えないようにスコアを設計しなければならない +- そのため、「1m以内であれば閾値を超える」「1mを越えれば閾値を大きく下回る」ような計算をする必要がある + +![設計すべきリスクスコアの形](/cocoa/appendix/upgrading_v2_fig2.png) + +### 背景知識:電波強度と距離の関係 + +パラメータ値を設計するにあたり、電波強度と距離の関係を知っておく必要があるため、ここで他の研究結果を確認する。 + +#### 同じ距離の電波強度には大きな差がある + +同じ距離でも電波強度には大きな揺らぎがあり、1回の測定では正確な距離を測ることはできないことが知られている。 + +- 電波強度と距離の関係は、MITによる測定結果を基に、チューリング研究所・オックスフォード大の論文で、正規分布に沿った電力の揺らぎがあることが示されている。 + - Source: https://arxiv.org/pdf/2007.05057.pdf + - 論文内Figure 4のキャプションに `This results in a Gaussian process with µ(d) = 0.21 log(d) + 3.92 and σ2 = 0.33. RSSI samples are then generated at each time step from log-normal(µ(d), σ2)` と近似式が示されている + - Googleからも、この論文を用いたパラメータ設計シミュレーターを案内されており、信用に足る論文と考えた +- 通常、正規分布に沿った揺らぎは綺麗な山型を描くが、電波強度を示す単位 dB は、電力を「10を底とする常用対数」で変換したもののため、より緩やかな曲線を描くことが分かる + +![距離別の、その電波強度になる可能性の分布](/cocoa/appendix/upgrading_v2_fig3.png) + + +#### 多数の測定で電波強度のブレを減らす + +しかし、電波強度を多数測定することで誤差を減らし、望ましい数値に近づけることが出来ることもわかる。 + +- 電波強度は正規分布に従っているため、複数回測定をしていくことで誤差の少ない値を得られる + - 下図左は、Excel上でシミュレーションを行ったもので、5000回の測定を、5回単位/50回単位/100回単位で平均を取ると徐々に数値のばらつきが減ることを示している + - Exposure Notificationは、Bluetooth Low Energyの信号(Advertising)を200msおきにスキャンする。測定結果は、1~5分間のScanInstanceごとに平均値を返すため、 約5回/秒 × 60~300秒 = 300回~1500回測定される + - 安全をとって、測定頻度・測定時間ともに半分と見込み、830msおきスキャン × 30秒 = 約37回測定されると考える + - 標準誤差は、標準偏差をサンプル数の平方根で除した数字となるため、特定の距離における電波強度の分布は、下図右のように、かなり山が明確な分布になる + +![電波強度を多数測定することによる確率分布の変化](/cocoa/appendix/upgrading_v2_fig4.png) + +### パラメータ値の設計 + +前述の研究成果を踏まえた、ENv2のパラメータ設計の過程を説明する + +#### 距離別の電波強度の分布 + +前述の正規分布・標準誤差を前提に計算すると、電波強度が取り得る範囲が以下の様に図示できる。 +(濃い色は±σなので、約6割の測定結果がこの範囲に入ると考えられる) + +![距離別の電波強度の分布](/cocoa/appendix/upgrading_v2_fig5.png) + +この理論値が正しいかどうか、特定の距離で実機のExposure Notificationが出力する電波強度を測定し、理論値との乖離が少ないことを確認した。 + +- 実機で計測を行う場合には、Exposure Notificatoinが出力する電波強度を測定する必要がある + - 機種ごとに異なる電波送信強度・感度の差異を吸収するために、Exposure Notification APIは内部でキャリブレーションを行い、調整後の数値のみを使って濃厚接触の可能性の判定を行うため +- そのため、検証専門チームに依頼し、デバッグ版のCOCOAを用いて、合計110回・9000分以上の接触を作り、その状況下における電波強度の分布を測定した。 +- 測定に用いた機種には偏りがあるため、2021年12月末時点での、COCOA利用ユーザ数・端末別利用台数を元にした端末メーカー別シェアを踏まえた重み付けを行ったのが以下の2つのグラフ + - 理論値(オレンジの面グラフ)と、距離1.0mにおける測定結果は極めてよく一致した + - 距離2.0mにおいては、より強い電波強度が得られやすかった +- 端末の相互関係(端末の画面を正対させる/机上に横並びにする/カバンにしまう)を変えたときの電波強度の変化は、1.0m/2.0mともにあまり見られなかった + +![パラメータ設計のための実機計測結果](/cocoa/appendix/upgrading_v2_fig6.png) + +#### EN電波強度で判定可能な距離の区分 + +電波強度別の重み付けを柔軟に変えることで、特異度を極力上げないようにしつつ感度を上げることを目指した。 + +- 電波強度には揺らぎがあるため、特定の強度より弱い電波を全部無視してしまうと見落としが増える(感度が落ちる) + - 例:1.5mを判定しようとしたとき-60dBを閾値にすると22%を見落とす(下図の灰色部分) +- 特定の強度より弱い電波を(全部無視するのではなく)何割引かの時間として処理することで、単純に閾値を下げるよりも誤検知の増加を抑えながら見落としを減らすことができる + - 例:-65dBを閾値にすると見落としは5%だが、誤検知も84%に達してしまう。-60dB~-64dBの時間に0.5を掛けると、誤検知を70%に押さえながら、見落としを13%まで減らすことができる + +![電波強度別の重み付けを変える効果(イメージ)](/cocoa/appendix/upgrading_v2_fig7.png) + +電波強度が取り得る範囲から、1.0m/1.5m/2.0mの重なりが大きく、 2.0mを含まないように1.0m以内を判定する難しさが分かるが、電波強度をうまく区分し、重み付けを行うことで、1.0m以下や、2.0m以下を判断することを狙った。 + +- ①…1.5m未満であることがかなり確実な範囲 +- ②…1.0mも2.0mもあり得る距離 (※実測結果より、ここでは2.0mの距離がある可能性が高い) +- ③…1.0mは越えるが、1.5m/2.0m/3.0mのいずれかを取り得る距離 +- ④…2.0m以上であることがかなり確実な範囲 +- ⇒①の重み付けを最も強くし、②にやや弱い重み付けをすることで1.0m以下を判断。③・④の差を設けると同時に2.0mの距離も判断できる。 + +![距離別の電波強度の分布の活用イメージ](/cocoa/appendix/upgrading_v2_fig8.png) + +#### パラメータ値(Attenuation, Weight, 閾値)当初案の設定 + +(この設計時点では、ENv2の新機能を利用した機能拡張も想定していたため)将来的な2.0mの判定も加味して、以下のAttenuation, Weight案を設計、パラメータ検証を行った + +- 1.0m以内であることが確実な距離のウエイトを最大(250%)に設定する +- 1.0mも2.0mもあり得る距離は、ウエイトを約半分(130%)に設定し、閾値となる値のウエイトはこの130%を想定したものにする + - 1.0m以上の場合は、これより低いウエイトの結果が多数入ることでこの閾値を下回るようになる +- 1.5m/2.0m/3.0mのいずれかを取り得る距離は、更に約半分にしたウエイト(60%)とすることで、リスクスコアや接触時間の合計の情報と合わせ、将来的に接触通知を出す距離を2.0mまで伸ばしたときの影響範囲を把握出来るようにする +- 閾値は、900秒(=15分)に130%をかけ、1170とした。 + +![パラメータ値(Attenuation, Weight, 閾値)当初案](/cocoa/appendix/upgrading_v2_fig9.png) + +#### 実測値による当初案パラメータ検証と修正 + +短時間の測定では電波強度が弱く計測される傾向が見られ、特にiPhone全般がその傾向が強かったことから、当初案のパラメータ値の修正が必要となった。 + +- 前述のパラメータを元に、1m・15分の接触を40回以上試験したところ、接触通知の発生率は想定を大きく下回ったが、その理由は、長時間計測の時に比べて、電波強度が弱くでる傾向が強いことにあった + - 試験回数に占める成功率(通知発生率)は23%、ただしOSのシェアを加味すると成功率は13%に止まった + - これは、iPhone同士の接触で-59dBというスコアが多く出る傾向が強かったため +- また、より短距離(0.5m未満など)に設置したときの電波強度を想定すると、8分で閾値を超え、過剰に反応することも予想された。 +- これを踏まえて、とくにiPhoneが関係する接触通知を確実に発生させるよう、パラメータの修正を行った + +![パラメータ検証のための実機計測結果](/cocoa/appendix/upgrading_v2_fig10.png) + +#### 最終的なパラメータ値(Attenuation, Weight, 閾値) + +1m・15分の接触を72%(OSのシェアを加味した割合)検知できることが期待されるパラメータを本番パラメータと設定した。 + +- ごく短距離の時に短時間で閾値を超える問題を無くすため、最も距離が近いAttenuationのウエイトを落としつつ、実データと突き合わせながら、閾値・ウエイトを変更し、成功率が高くなるパラメータを探った。 +- 試行錯誤の末、下表のようなパラメータを設定し、パラメータ検証時の電波強度・時間に当てはめたところ、OSのシェアを加味した成功率(検知率)が72%となることが推定された + - iPhone同士の接触の検知率は83%、Android/iOSの接触の検知率は64%、Android同士の接触の検知率は54%と推定 + - 期せずして、1番低い閾値(-65dB)は、ENv1での閾値(-63dB)と非常に近い値となった + - 閾値は、当初の1170よりも、1350に変更する方が検知率などをよい状態にすることができた +- 上記パラメータでは15分未満の接触で閾値を超えるケースがあるため、スコア判定後に総信号受信時間のチェックも追加した +- 当初のパラメータ設計で目指した、1.0m/2.0mの接触を区別した判定は行えないパラメータだが、接触通知の確実な発生を優先して、このパラメータを本番パラメータとした + +![パラメータ値(Attenuation, Weight, 閾値)修正後](/cocoa/appendix/upgrading_v2_fig11.png) + +※補足…最終的に設定したパラメータで近距離のウエイトを100%としたことについて + +修正後の設定値では、電波強度が45dBより強い接触だけの場合では、15分の接触では、900秒×100%=900となり、接触通知の閾値を超えないのでは、という懸念があるが、以下の理由から、そのような接触は起こりえないと考えた。 + +- 45dBより強い電波だけになるのは、スマホを隣りに並べたり、スマホを重ねたりする状況。 +- その状況を作るには、「2,3m離れた所から走って近寄り、端末が重なるくらいの距離で15分接触し、直後に2,3m以上離れたところへ走って逃げる」ような行動が必要だが、日常生活ではそのような状況は考えにくい + - あり得るシチュエーションは賀詞交換会の名刺交換だが、会話は大抵短時間であり、交換前は徐々に距離を縮めるはずであり、 +- 普通の接触であれば、その距離となる前後に1.0mの距離をとる時間があり、46dB~59dBになる時間が相応にあるので、ウエイトが高い接触時間があることで、結果として閾値は超えると考えられる diff --git a/documents/static/appendix/upgrading_v2_fig1.png b/documents/static/appendix/upgrading_v2_fig1.png new file mode 100644 index 000000000..e4c5a00d7 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig1.png differ diff --git a/documents/static/appendix/upgrading_v2_fig10.png b/documents/static/appendix/upgrading_v2_fig10.png new file mode 100644 index 000000000..b7646995a Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig10.png differ diff --git a/documents/static/appendix/upgrading_v2_fig11.png b/documents/static/appendix/upgrading_v2_fig11.png new file mode 100644 index 000000000..6f142c49e Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig11.png differ diff --git a/documents/static/appendix/upgrading_v2_fig2.png b/documents/static/appendix/upgrading_v2_fig2.png new file mode 100644 index 000000000..40dec9750 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig2.png differ diff --git a/documents/static/appendix/upgrading_v2_fig3.png b/documents/static/appendix/upgrading_v2_fig3.png new file mode 100644 index 000000000..2f4059b76 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig3.png differ diff --git a/documents/static/appendix/upgrading_v2_fig4.png b/documents/static/appendix/upgrading_v2_fig4.png new file mode 100644 index 000000000..1d2c9e491 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig4.png differ diff --git a/documents/static/appendix/upgrading_v2_fig5.png b/documents/static/appendix/upgrading_v2_fig5.png new file mode 100644 index 000000000..3abbc8ec9 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig5.png differ diff --git a/documents/static/appendix/upgrading_v2_fig6.png b/documents/static/appendix/upgrading_v2_fig6.png new file mode 100644 index 000000000..7e4f40e95 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig6.png differ diff --git a/documents/static/appendix/upgrading_v2_fig7.png b/documents/static/appendix/upgrading_v2_fig7.png new file mode 100644 index 000000000..4313a9402 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig7.png differ diff --git a/documents/static/appendix/upgrading_v2_fig8.png b/documents/static/appendix/upgrading_v2_fig8.png new file mode 100644 index 000000000..eef5c6a6e Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig8.png differ diff --git a/documents/static/appendix/upgrading_v2_fig9.png b/documents/static/appendix/upgrading_v2_fig9.png new file mode 100644 index 000000000..7bf522160 Binary files /dev/null and b/documents/static/appendix/upgrading_v2_fig9.png differ