コロナウイルス感染者数のデータを手早く処理する



当ブログは、化学に関することを扱うものですが、情報処理技術はますます化学でも大事になると思っています。
COVID-19の感染が広がっていますが、このデータを利用して、情報処理のデモンストレーションをする記事を公開しました。

先の記事では情報ソースを探して来て、csvファイルをダウンロードし、excelを用いてグラフを作っています。
多少の公益もあると考え、2日置きくらいで更新しているのですが、かなり面倒です。

そこで今後は、データ処理の操作を自動化して行きたいと思います。
内容を理解すれば、あなたのお住いの都府県についての情報を、
簡便に抽出することができます。

全部、pythonで処理を作ることもできるのだと思いますが、前処理はMacに最初から入っている「ターミナル」で、簡便に行うことができます。(本記事はMac用の情報です。)

______________________

ターミナル上では、shellコマンドとよばれる簡単なプログラムを走らせる事ができます。
いろんなコマンドがあるのですが、これらをうまく使うと、特別なアプリを立ち上げることなく、ちゃちゃっと処理ができてしまいます。

我々が普段使っている、メーラーやワードなどのプログラムは、GUI(グラフィカル ユーザー インターフェース)と呼ばれます。
画像ベースで直感的な操作ができるため、特別に覚えることが少ないです。
(マウスでポチポチするのって簡単ですよね?でも、ショートカットも使ったほうが早いよ!)
一方で、プログラム間の連携が悪かったりします。

ターミナルでの処理は、CUI(キャラクター ユーザー インターフェイス)とよばれ、文字ベースでコンピューターとやり取りする方法です。(厳密にはターミナルはCUIを模したGUIだそうな。。。参考
多少、おぼえることがあるのですが、文字ベースですべて処理していくので、とても大きなデータの中の一部分だけを抜き出して来たり、繰り返して同じ操作をすることに向いています。
いつも使っているアプリに、「あんな機能あったらな!」と思うことがあると思いますが、アプリの更新を待たずとも、自分である程度データを捌くことは可能なんです!

例えば、GaussViewで、なんでもかんでも知りたい情報を見られるわけではないですよね。
______________________


作業の流れと、使うコマンドは以下の通り。

1. ウェブから情報を持ってくる
 curl -O https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv

2. 情報の下ごしらえ
 2-1. 不要な情報(1, 8, 10, 11, 23, 25列以外)をそぎ取る [cut コマンド]
 cut -d ',' -f 1,8,10,11,24,26 COVID-19.csv 

 [4/6日更新 元ファイルの形式が少し変わったようです]

 2-2. 日付をMM/DD/YYYY形式からYYYY/MM/DD形式に置換処理 [sed コマンド]

 sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' -i ".back" COVID-19.csv 

 2-3. 京阪神+奈良の情報を抽出する [grep コマンド]

 grep -e 大阪 -e 兵庫 -e 京都府 -e 奈良

 2-4. 感染者、死者数の情報を抽出する [grep コマンド]

 grep -v ",," > COVID-19-death$(date +%m%d).csv

3. 日付が入った新しい名前をつけて上書き保存 [date コマンド]

  COVID-19-death$(date +%m%d).csv


以上を、パイプ( | )と、リダイレクション( > )を使って、まとめて処理したものが、以下のコマンドです。
地域の感染者数情報と、死者数推移についての2つのcsvを作ることができます。


curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 大阪 -e 兵庫 -e 京都府 -e 奈良 | nkf -s > COVID-19-region$(date +%m%d).csv

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,23,25 | sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -v ",," > COVID-19-death$(date +%m%d).csv


[4/6日更新 元ファイルの形式が少し変わったようです]

かなり、グチャグチャしてますが、この文字列をあなたのターミナルに打ち込んで、どんなcsvが生成されるか、見てみてください!もとのcsvから、かなり情報が集約されることがわかるはずです。

大阪、京都、兵庫、奈良を別々に保存したければ、以下をどうぞ。
(うまく行かなかったら、メモ帳かなにかで、標準テキストに変換してください)
curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 大阪 | nkf -s > COVID-19-osaka$(date +%m%d).csv

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 京都府 | nkf -s > COVID-19-kyoto$(date +%m%d).csv

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 兵庫 | nkf -s > COVID-19-hyogo$(date +%m%d).csv

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 奈良 | nkf -s > COVID-19-nara$(date +%m%d).csv

[4/6日更新 文字コードを変換するコマンドを追加しました。]

前置き長いですが、以下ではShellスクリプトでデータの「取得、処理、保存」について説明します。
ここでやっている操作のエッセンスは、測定データの処理などでも応用できるのではないかと思います。

Shell芸というジャンルもあるそうです。
参考:【危険シェル芸】禁じられた闇の魔術とその防衛術 (なんじゃそりゃ。。。)



もう少し詳細に、コマンドの意味を解説(備忘録)しておきます。
上では、全部連続して操作をしていますが、これを見ても意味分かんないので、
一つづつ追っていきます。
不慣れな人でも、操作の流れはつかめるはず。


______________________
1. ウェブから情報を持ってくる


  Curl コマンドでダウンロード!

前の記事で紹介した、JAGJAPANで公開されているデータを持ってきます。
ウェブブラウザでは、リンクをクリックするとダウンロードが始まります。
同じ操作は、ターミナル上では、curl コマンドとアドレスを用いることで行うことができます。

 curl -O https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv

 [curl コマンド]
 指定したアドレスに置いてある、指定のファイルをダウンロードする。
 -O で、今、自分がいるディレクトリにそのファイルを保存。
 これをつけないと、ターミナルにcsvの文字列がぶちまけられる。

 上のシェルスクリプトでは、-Oをつけずに、パイプ " | " を利用して、
 次の処理へと送っています。(参考
 
______________________
2. 情報の下ごしらえ
データの下処理は、その後のグラフ描画の成否を左右します!


2-1. 不要な情報をそぎ取る [cut コマンド]




年齢の情報などは、この解析ではつかっていません。
そのままでも良いのですが、データをスッキリさせておきましょう。
(余分なデータが多いと、しんどいので。。。)

上のcurl で、オプション -O をつけて、一旦自分のコンピューターに
.csv ファイルを保存している体で操作しています。

 cut -d ',' -f 1,8,10,11,23,25 COVID-19.csv > COVID-19-0402.csv

 [cut コマンド]
 -d で、区切り文字を指定(ここでは、csv形式なので ",")
 -f で、抜き出す列を指定、カンマで区切れば、複数行を指定できる
 (ここでは、通し番号 1列目、確定日 8列目、受診都道府県 10列目、
 居住都道府県 11列目、感染者累計 23列目、死者合計 25列目)
 
 類似の操作は[awk コマンド]を利用してもできるようだ。
 しかし、単純作業ならcutのほうがやや速く、コマンドもシンプル(参考

 > は、アウトプットを XXX.csv で保存せよ、という意味です。


2-2. 扱いにくい文字列を置換処理 [sed コマンド]
このウィルス感染者数のデータは、日付がアメリカ方式で保存されています
通称 MM-DD-YYYY 形式。例えば、4th April 2020 。アメリカ人の頭の中はわからん。
ビザの申請とか見ると、誕生日記入欄とかに書かれています。
このままでもいいのかもしれないが、、!
日本式のYYYY-MM-YY に直しましょう。

 sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g'

 [sed コマンド] (Linux と Macでコマンドの使い方が微妙に違う!要注意)
 -e で、 ''で囲んだところを置換する。基本は 's/A/B/' とすると、文字列のAがBになる。
 たとえば、「AAAA」 という文字列を sed -e 's/A/B/' とすると、
「BAAA 」が返ってくる。
 行内のすべてのAをBで置換したければ、スラッシュのあとにg (sed -e 's/A/B/g')
 
 練習  echo AAAA | sed -e 's/A/B/' と 打ち込んでみて、
    > BAAA    が返ってくることを確かめよう。
     echo AAAA | sed -e 's/A/B/g' と 打ち込んでみて、

    > BBBB    が返ってくることを確かめよう。
 
 -e 's|/2020||g' で、/2020 を、空白に置き換えろ、という指示。
 2つの"|"記号の間には、何もありませんよね。下のような変換です。

 ,4/1/2020  →  ,4/1 

 もう一度、 -'s|,4/|,2020/4/|g' を続くが、さらにsed処理を行え、という指示です。

 ,4/1  →  ,2020/4/01 

 4月、3月、2月、1月についてそれぞれ処理している。
 これについてはもっと簡単な方法があるかもしれない。

 応用的な話なのだが、今回のデータファイルには、年月日を区切るスラッシュ(/)がある。これと、sed コマンド内のスラッシュが区別できなくなる。
 sed では、スラッシュ以外の記号も使うことができる。(参考
 今回は、" | " 記号を使ったが、¥でも$でもよいようだ。


2-3. 必要な行だけ抽出する [grep コマンド]
ファイルには、日本全国の情報が含まれている。
ここでは、京都、大阪、兵庫、奈良、の新規感染者の情報だけを抽出している

 grep -e 大阪 -e 兵庫 -e 京都府 -e 奈良

 [grep コマンド]
 該当する文字列を含む行だけを抜き出す。
 -e で、正規表現だよ、という指示だが、orの意味でも使われ、徴用される。

 -e 京都 と指示すると、東京都も拾ってくるので注意。


2-4. 必要な行だけ抽出する [grep コマンド]
上では、grepを使ってマッチする行だけを抽出した。
ここではアンマッチで累計感染者数(23列目)と累計死者数(25列目)の情報を抜こう。

 grep -v ",,"

 [grep コマンド]
 -v をつけると、""で囲まれた文字列を含む行を除外せよ、という意味になる。
 
 今回のデータだと、新規感染者累計と死者数累計はその日の最後のデータの一番うしろに付け加えられている(,100,10 など)。
 他の行は空セルになっている(,,)これを除外した。
 すこしデータの形が違うと応用が効かない方法なので、もっと賢い方法があるかも。

2-5. 文字コードをutf-8からシフトJISに変更 [nkf コマンド] [4/6日追記]
元データは、utf-8という文字コードで保存されていて、そのままexcelなどで開くと文字化けしてしまうことがあります。
これを回避するには、文字コードを調べたり、書き換えたりするコマンドを利用してやれば簡便です。

 nkf -s

 [grep コマンド]
 -s コマンドは、シフトjisで保存しなさい、という命令を下すオプションです。 ______________________
3. 日付が入った新しい名前をつけて上書き保存 [date コマンド]
最後に、処理したデータに適切な名前をつけて保存してやろう!

 grep abcd > XXXXX.csv

と、してやれば、grep でabcdという文字列が入った行だけ抽出して、.csv 形式で保存してやることができる。
しかし、コロナの感染者数は刻一刻と変化していく。
ファイル名は、その日の日付を自動でつけられないか?

たとえば、4月2日にさぎょうしたならば、COVID-19-0402.csv にしたい。

 grep abcd > COVID-19-$(date +%m%d).csv

 [date コマンド]
 その日の日付を返すコマンド。 
 $(date +%m%d) で、その日の日付を文字列として与えられる(参考
______________________

以上です!大変だったかもしれませんが、色々と応用ができるはずです。
ぜひ、実際のデータファイルを触ってみましょう。

長くなってしまったので、pythonによるグラフのプロットについては、次回の記事にしようと思います。

コメント

このブログの人気の投稿

VNCで見ている画面と自分のマシンの間でのコピー&ペースト

Natural Bond Orbital (NBO) Analysis, 自然軌道解析をやってみる

Lanl2DZの使い方