コロナウイルス感染者数のデータを手早く処理する
当ブログは、化学に関することを扱うものですが、情報処理技術はますます化学でも大事になると思っています。
COVID-19の感染が広がっていますが、このデータを利用して、情報処理のデモンストレーションをする記事を公開しました。
先の記事では情報ソースを探して来て、csvファイルをダウンロードし、excelを用いてグラフを作っています。
多少の公益もあると考え、2日置きくらいで更新しているのですが、かなり面倒です。
そこで今後は、データ処理の操作を自動化して行きたいと思います。
内容を理解すれば、あなたのお住いの都府県についての情報を、
簡便に抽出することができます。
全部、pythonで処理を作ることもできるのだと思いますが、前処理はMacに最初から入っている「ターミナル」で、簡便に行うことができます。(本記事はMac用の情報です。)
______________________
いろんなコマンドがあるのですが、これらをうまく使うと、特別なアプリを立ち上げることなく、ちゃちゃっと処理ができてしまいます。
我々が普段使っている、メーラーやワードなどのプログラムは、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 コマンド]
[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
以上を、パイプ( | )と、リダイレクション( > )を使って、まとめて処理したものが、以下のコマンドです。
地域の感染者数情報と、死者数推移についての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. ウェブから情報を持ってくる
前の記事で紹介した、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 が返ってくることを確かめよう。
,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によるグラフのプロットについては、次回の記事にしようと思います。
一つづつ追っていきます。
不慣れな人でも、操作の流れはつかめるはず。
______________________
1. ウェブから情報を持ってくる
前の記事で紹介した、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
2つの"|"記号の間には、何もありませんよね。下のような変換です。
,4/1/2020 → ,4/1
もう一度、 -e 's|,4/|,2020/4/|g' を続くが、さらにsed処理を行え、という指示です。
,4/1 → ,2020/4/01
4月、3月、2月、1月についてそれぞれ処理している。
これについてはもっと簡単な方法があるかもしれない。
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によるグラフのプロットについては、次回の記事にしようと思います。
コメント
コメントを投稿