Choropleth Mapで日本のCOVID19感染状況を表示する

追記（４月８日）

いろいろと間違いも多く改訂版を作成しました。
こちらをご覧ください。[改訂版](https://qiita.com/items/d7c6f43016fd440508ed)

-----

この記事においては

- [NipponMap: Japanese Map Data and Functions](https://cran.r-project.org/web/packages/NipponMap/index.html)
- [Japan COVID-19 Coronavirus Tracker](https://covid19japan.com/)
- [東洋経済Online新型コロナウイルス国内感染の状況](https://toyokeizai.net/sp/visual/tko/covid19/)

のデータを使用しています。
作成している方々に感謝します。
#準備
##Choropleth Map data
日本のChoropleth Mapのデータがないため、国土地理院のデータを持ってきてはみたものの大きすぎるので手頃なデータを探したところ[Rのパッケージ](https://cran.r-project.org/web/packages/NipponMap/index.html)のデータがいい感じでした。

[QGIS](https://qgis.org/ja/site/)をインスートールして
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/c4e4e1bc-eef8-041e-9166-d313b64bf13e.png)
解凍したNipponMapのファイルをKMLにエクスポート

###CLIにて
```
ogr2ogr -f "KML" -mapFieldType Integer64=Real 'japansimple.kml'
jpn.shp
```
https://gdal.org/programs/ogr2ogr.html
を利用する場合、オプションが必要でした。

###ルックアップの作成
[Choroplethで都道府県 市町村に対応!@takashikomatsub](https://www.slideshare.net/takashikomatsubara50/choropleth-122613310)の資料をみながら、Splunkに取り込み
このデータだと`XPATH`の指定は不要
![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/0082fd68-121b-ccf6-4555-03f52f59c4ca.png)

:sweat:ArcGISのデータはこの用途には不適切なので、使いませんでした。国土地理院のデータ、Splunkオフィシャルでできないもんですかね。

###データの確認
```java:japanSimple.kml
|inputlookup japanSimple
```
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/7544b6f2-9ab8-097f-267c-b7a653d5c6a9.png)


##東洋経済Online 新型コロナウイルス国内感染の状況　から

https://github.com/kaz-ogiwara/covid19/
にあるデータが県別にまとまっているので、こちらを使用してみる
MITライセンスなので、使いやすい

ただし、４月６日現在確認したところ３月24日で更新が止まっている。
再開を期待します。

データは[individuals.csv](https://raw.githubusercontent.com/kaz-ogiwara/covid19/master/data/individuals.csv)

以前は下記の通り、props.confなどを作成しましたが、今回はShellでやってみる。
これは過去分

###props.conf
```bash:props.conf
[individuals_csv]
KV_MODE = none
MAX_TIMESTAMP_LOOKAHEAD = 10
SHOULD_LINEMERGE = 0
TIME_FORMAT = %Y,%m,%d
TIME_PREFIX = \d+,\d+,
category = Splunk App Add-on Builder
pulldown_type = 1
REPORT-csv = REPORT-csv
LINE_BREAKER = ([\r\n]+)
NO_BINARY_CHECK = true
description = CSV
disabled = false
SEDCMD = s/^新.*$//
```
ヘッダーを消すのに、すごく苦労したのは秘密です。:sweat:

```bash:transforms.conf
[REPORT-csv]
DELIMS = ","
FIELDS = "newNo","oldNo","year","month","day","old","gender","pref","city"
```

##input.conf用
```shell:dl_csv.sh
#!/bin/zsh

url='https://raw.githubusercontent.com/kaz-ogiwara/covid19/master/data/individuals.csv'
cd ../lookups
curl -fsX GET $url -o individuals.csv
{cat header.txt; tail -n +2 individuals.csv} > japan.csv
```
Macosxなのでzsh. `etc/apps/covid19_japan/bin`配下に配置

####lookup
https://en.wikipedia.org/wiki/Prefectures_of_Japan
から県のデータを作成した

| Area | AreaCode | Capital | Density | Distr. | ISO | Kanji | M | MajorIsland | Municipalities | N | O | P | Population | Prefecture | Region |
|--:|--:|:--|--:|--:|--:|:--|--:|:--|--:|--:|:--|--:|--:|:--|:--|
| 484 | 446.9 | Nagoya | 094 | 5 | 1 | 愛知県 | 7 | Honshu | 172.48 | 54 | JP-23 | 052 | 7 | Aichi | Chūbu |

改めてAPPSにする際使用しているファイルはこれ

prefecture.csv:

Prefecture|Kanji|Capital|Region|Major_Island
|:-:|:-:|:-:|:-:|:-:|
 Aichi|愛知県|Nagoya|Chubu|Honshu
 Akita|秋田県|Akita|Tohoku|Honshu
 Aomori|青森県|Aomori|Tohoku|Honshu
 Chiba|千葉県|Chiba|Kanto|Honshu
 Ehime|愛媛県|Matsuyama|Shikoku|Shikoku
 Fukui|福井県|Fukui|Chubu|Honshu
 Fukuoka|福岡県|Fukuoka|Kyushu|Kyushu
 Fukushima|福島県|Fukushima|Tohoku|Honshu
 Gifu|岐阜県|Gifu|Chubu|Honshu
 Gunma|群馬県|Maebashi|Kanto|Honshu
 Hiroshima|広島県|Hiroshima|Chugoku|Honshu
 Hokkaido|北海道|Sapporo|Hokkaido|Hokkaido
 Hyogo|兵庫県|Kobe|Kansai|Honshu
 Ibaraki|茨城県|Mito|Kanto|Honshu
 Ishikawa|石川県|Kanazawa|Chubu|Honshu
 Iwate|岩手県|Morioka|Tohoku|Honshu
 Kagawa|香川県|Takamatsu|Shikoku|Shikoku
 Kagoshima|鹿児島県|Kagoshima|Kyushu|Kyushu
 Kanagawa|神奈川県|Yokohama|Kanto|Honshu
 Kochi|高知県|Kochi|Shikoku|Shikoku
 Kumamoto|熊本県|Kumamoto|Kyushu|Kyushu
 Kyoto|京都府|Kyoto|Kansai|Honshu
 Mie|三重県|Tsu|Kansai|Honshu
 Miyagi|宮城県|Sendai|Tohoku|Honshu
 Miyazaki|宮崎県|Miyazaki|Kyushu|Kyushu
 Nagano|長野県|Nagano|Chubu|Honshu
 Nagasaki|長崎県|Nagasaki|Kyushu|Kyushu
 Nara|奈良県|Nara|Kansai|Honshu
 Niigata|新潟県|Niigata|Chubu|Honshu
 Oita|大分県|Oita|Kyushu|Kyushu
 Okayama|岡山県|Okayama|Chugoku|Honshu
 Okinawa|沖縄県|Naha|Kyushu|Ryukyu Islands
 Osaka|大阪府|Osaka|Kansai|Honshu
 Saga|佐賀県|Saga|Kyushu|Kyushu
 Saitama|埼玉県|Saitama|Kanto|Honshu
 Shiga|滋賀県|Otsu|Kansai|Honshu
 Shimane|島根県|Matsue|Chugoku|Honshu
 Shizuoka|静岡県|Shizuoka|Chubu|Honshu
 Tochigi|栃木県|Utsunomiya|Kanto|Honshu
 Tokushima|徳島県|Tokushima|Shikoku|Shikoku
 Tokyo|東京都|Shinjuku|Kanto|Honshu
 Tottori|鳥取県|Tottori|Chugoku|Honshu
 Toyama|富山県|Toyama|Chubu|Honshu
 Wakayama|和歌山県|Wakayama|Kansai|Honshu
 Yamagata|山形県|Yamagata|Tohoku|Honshu
 Yamaguchi|山口県|Yamaguchi|Chugoku|Honshu
 Yamanashi|山梨県|Kofu|Chubu|Honshu
:sweat:手作業で文字(ōとかū)を変換しております。
これもlookupsフォルダに入れておく

##検索
```java:corona.spl
source="individuals.csv"
| stats count by pref
| lookup prefecture Kanji as pref OUTPUT Prefecture as featureId
| fields - pref
| geom japanSimple
| where isnotnull(featureId)
```

![qiita_corona.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/42f0eb6a-e16c-2912-9db3-ee6856bcfde1.png)
やっぱり、北海道のインパクトがすごい。

###predictで確認

```java:predict.spl
source="individuals.csv"
| timechart count as Counts by pref where sum in top5
| tail 60
| reverse
| predict 東京都 北海道 兵庫県 愛知県 大阪府 OTHER
```

[predict](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Predict)で感染者数上位５県の推移をみてみる

![qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/57d68455-d22d-2d98-a1f6-cdb476a0b7f4.png)
クリックしてみてみると、東京都以外は推移が変わらなそう。
全国的には増加傾向・・・
東京都の波はなんだろう:thinking:

##COVID19Japan.com Data - Patient Data.csv
[Japan COVID-19 Coronavirus Tracker](https://covid19japan.com/)のデータをCSVで出力

```bash:props.conf
[covid19_csv]
INDEXED_EXTRACTIONS = csv
KV_MODE = none
LINE_BREAKER = ([\r\n]+)
NO_BINARY_CHECK = true
SHOULD_LINEMERGE = false
TIMESTAMP_FIELDS = Date Announced
TIME_FORMAT = %F
category = Structured
description = Comma-separated value format. Set header and other settings in "Delimited Settings"
disabled = false
pulldown_type = true
```
`csv`のソースタイプを改変して`covid19_csv`として設定

以上で準備完了

##現在（2020/03/22）の県別感染状況
```java:infected.spl
source="COVID19Japan.com Data - Patient Data.csv" sourcetype="covid19_csv"
| stats count by "Residence City_ Prefecture"
| rename "Residence City_ Prefecture" as featureId
| geom japanSimple
```
![qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/63591af1-86c8-cebc-033d-f7d1c04e0ceb.png)
地名を詳細に取っていないのでかなりざっくりしている。

_Prefecture Data_で作れば、もっと綺麗にでるはず

#新たにAppsにする
```
.
├── bin
│   ├── README
│   └── dl_csv.sh
├── default
│   ├── app.conf
│   └── data
│       └── ui
│           ├── nav
│           │   └── default.xml
│           └── views
│               └── README
├── local
│   ├── app.conf
│   └── transforms.conf
├── lookups
│   ├── header.csv
│   ├── header.txt
│   ├── individuals.csv
│   ├── japan.csv
│   └── prefecture.csv
└── metadata
    ├── default.meta
    └── local.meta

9 directories, 14 files
```
`lookups`フォルダは新たに作成した。

##検索
```java:choroplethMap.spl
| inputlookup japan.csv
| eval _time=strptime(year." ".month." ".day,"%Y %m %d")
| stats count by pref
| lookup prefecture.csv Kanji as pref OUTPUT  Prefecture as featureId
| geom japansimple
| fields - pref
| sort - count
```
![qiita_c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/42a9fe6d-61ee-e348-e19a-1e1db91c4ccc.png)

#predict
```java:predict.spl
| inputlookup japan.csv
| eval _time=strptime(year." ".month." ".day,"%Y %m %d")
| timechart count by pref where sum in top5
| fields - OTHER
| predict 東京都 北海道 兵庫県 愛知県 大阪府 future_timespan=30
```
３月２4日までのデータから導き出した図
![qiita_p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/b94c3926-bdd9-5d89-7e89-a50454389a7b.png)

現在（４月６日）で100名を超えているなんて、この段階ではわからなった。

#NHKのデータで検索する
NHKのデータ利用については
https://www.nhk.or.jp/faq-corner/4housoubangumi/05/04-05-11.html

- 基本的にＮＨＫのホームページにリンクされることは自由です。ただしリンクは、ＮＨＫオンライントップページか、各番組のトップページにお願いします。
- 個別の記事へのリンクは基本的にご遠慮いただいています。理由は個々のページや記事は掲載期間が決まっておらずリンク切れを起こしやすいことと、掲載内容も変更されることがあるためです。

としかないため、とても微妙。ダウンロード先の掲載はやめておきます。

##ダウンロードしてきたファイルの整形
```shell:dl_json.sh
cat data.json | sed 's/\\\u\(....\)/\&#x\1;/g' | sed 's$\\/$/$g' | nkf --numchar-input -w > japan.json
```
ダウンロードした後、unicode文字列を変換している。

##Splunkに読み込み
今回はJSONなのでindexに読み込む

```shell:props.conf
[covid19_json]
DATETIME_CONFIG = CURRENT
INDEXED_EXTRACTIONS = none
KV_MODE = json
LINE_BREAKER = (,)(\"data47|\"category|\"stacking|{\"data\")
NO_BINARY_CHECK = true
category = Structured
description = json
disabled = false
pulldown_type = true
SHOULD_LINEMERGE = false
TRUNCATE = 0
SEDCMD-json = s/^(\".*)/{\1/
SEDCMD-json_f = s/(.*(\]|\")$)/\1}/
JSON_TRIM_BRACES_IN_ARRAY_NAMES = true
SEDCMD-data47 = s/^.*data47\":\[|//
SEDCMD-trim = s/\],\"unit.*$//
```
`JSON_TRIM_BRACES_IN_ARRAY_NAMES`は`INDEXED_EXTRACTION=JSON`じゃないと動かないみたい
一日一回だけ読み込むので、こんなに`SEDCMD`があっても大丈夫でしょう。

##検索

```java:search.spl
source="japan.json" sourcetype="covid19_json"
| rename *{} as *
| fields - _*
| eventstats values(category) as category
| table category data name
| eval tmp=mvzip(category,data)
| streamstats count
| stats values(name) as name by count tmp
| eval date=mvindex(split(tmp,","),0), data=mvindex(split(tmp,","),1)
| table date data name
| eval _time= strptime(date,"%m/%d")
| timechart useother=f span=1d sum(data) by name where sum in top10
```
timepickerは「全時間」で。
![qiita_n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/fe6d7a3c-b595-628e-fd45-7f1d4150d7ed.png)
このようなログを
![qiita_S.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/954ac82e-b31f-9a3e-f6c5-248aba162190.png)
このように変換している。

##機械的予測
```java:predict.spl
...
| table _time 東京都 神奈川県 埼玉県 千葉県 大阪府 兵庫県 福岡県
| predict 東京都 神奈川県 埼玉県 千葉県 大阪府 兵庫県 福岡県 future_timespan=30
```
緊急事態宣言が出る７都道府県を予測

![qiita_pre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/e82afb76-bfe5-a207-f1dd-8556907435d9.png)
こちらは専門家に聞きたいところ。

##ChoroplethMap
![qiita_chro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/b4b789c9-65ec-35fe-d107-3d4bf56b2bdf.png)

```java:map.spl
...
| fields _time date name data
| stats sum(data) as count by name
| lookup prefecture.csv Kanji as name OUTPUT  Prefecture as featureId 
| geom japansimple
| fields - name
| sort - count
```
福岡県はまだ数としては多くないけれど増加率がすごいのでしょう。

#まとめ
データを探すとことが一番大変ですね。
CSVのヘッダーを削除するのはShellでできたので、東洋経済さんのデータの更新が再開したら、`inputs.conf`を作ろうと思います。

[厚生労働省のページ](https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000121431_00086.html)のデータがhtmlだったり、pdfだったりと、後の利用を全く考えていただけていないので、
[nhk](https://www3.nhk.or.jp/news/special/coronavirus/)のデータを利用できないかな〜と思っています。

データの再利用等問題がありましたら、ご指摘お願いします。