LoginSignup
1
1

More than 3 years have passed since last update.

(今更)新型コロナウイルス(COVID-19)を分析してみた

Last updated at Posted at 2020-08-30

はじめに

2020年1月16日,SARS-CoV-2(ウイルス名)による新型コロナウイルス感染症(病名)が日本で初めて確認されました。残念ながら一般人から著名人まで多くの方の命がこの病気によって落とされました。あれから半年以上経った今でも流行が治らず,外出時にはマスクが必需品となっています。
さて,本投稿では日本でのコロナウイルスを簡単に分析し,まとめました。この分析で自分にとって何らかの気付きや分析スキル向上を望めればと思い取り組んでみました。

データの準備

今回コロナウイルスを分析するにあたってジャッグジャパン株式会社さんの公開しているCSVデータを使用させていただきました。ありがとうございます。以下にリンクを掲載させていただきます。

「新型コロナウイルス感染者数マップ」について
スクリーンショット 2020-08-30 12.56.46.png

環境

  • python3
  • JupyterLab

分析してみる

1. 必要なライブラリをインポート

COVID-19.ipynb
import collections
import matplotlib.pyplot as plt
import pandas as pd

2. CSVファイルをを読みこむ

COVID-19.ipynb
pd.set_option('display.max_columns', None)
df = pd.read_csv('COVID-19.csv')
df

JupyterLabではcolumn(カラム)が多いと省略された表示になるため一行目の部分で全て表示させる

3. 感染者の年代を確認してみる

COVID-19.ipynb
age = df['年代'].value_counts(ascending=True)
age
実行結果
90以上        1
90         1
100         2
80         7
10         9
70        10
60        12
90         14
50        25
30        33
40        33
80         44
20        49
10         66
70         69
60        128
40        167
50        179
30        203
20        310
90       1040
不明       1145
0-10     1335
80       2645
10       2952
70       3751
60       4531
50       7355
40       8315
30      10551
20      18009
Name: 年代, dtype: int64

20と20代...といったように表記がひとつに定まっていないので出力結果が多くなってしまいました。df.replace()を用いて表記を統一させてみようと思います。

COVID-19.ipynb
df = df.replace({'年代':{'0-10':'under10','10代':'10','20代':'20', '30代':'30', '40代':'40', '50代':'50', '60代':'60', '70代':'70', '80代':'80', '90代':'90' , '不明':'unknown', '90以上':'90~'}})
age2 = df['年代'].value_counts()
age2
出力結果
20              18009
30              10551
40               8315
50               7355
60               4531
70               3751
10               2952
80               2645
under10     1335
unknown          1145
90               1040
20                359
30                236
50                204
40                200
60                140
70                 79
10                 75
80                 51
90                 15
100                 2
90~                 1
Name: 年代, dtype: int64

先ほどより出力表示を抑えることができました。(同じ数字どうしで合計を取りたかったため色々試したがうまくいかなかったので今後の課題とします。)少々見辛いのでグラフで可視化してみます。

COVID-19.ipynb
plt.title('Age of infected person')
age2.plot.bar()

Age of infected person.png
グラフにすることで視覚的に理解しやすくなりました。このグラフをみると20代,30代,40代...といったように世代が若い方が感染者が多いとわかります。特に20代の感染者数の多さは一目瞭然ですね。

4. 男女別の感染者数を確認する

COVID-19.ipynb
df = df.replace({'性別':{'男性':'male', '女性':'female', '不明':'unknown'}})
sex = df['性別'].value_counts()

plt.xlabel('Sex')
plt.ylabel('Number of people')
plt.title('Infected_sex')

#print(sex) #男女別の詳しい感染者数が知りたい場合に表示する
sex.plot.bar()

Infected_sex.png

グラフ化し確認してみると,男性の方が感染者数が多いとわかりました。感染は人間の性別に依存しないと思うが,外出時の目的や行動はそれぞれ異なると思うので詳しく知ることができれば感染数の男女別の関係が突き止められるのではと私は予想します。

5. 陽性反応の増減を確認する

COVID-19.ipynb
fixed_date = df['確定日']
fixed_date = collections.Counter(fixed_date)
#fixed_date #出力が多いので実行結果は割愛する

date = []
value = []

for get_date in fixed_date:
    date.append(get_date)
for get_value in fixed_date.values():
    value.append(get_value)

plt.plot(date, value)
plt.xticks( [0, 180, 70] )
plt.xticks(rotation=45)

plt.xlabel('date')
plt.ylabel('value')
plt.title('Changes in infected people')

plt.show()

Changes in infected people.png
グラフを確認すると1月から陽性患者を確認,4月頃に急増し一時的に治るものの,7月に再び急増し8月辺りにピークを迎えていることがわかる。グラフ化することで新型コロナウイルスの第二波を確認することができた。グラフの終わりから急激に陽性患者の確認数が減少しているので今後期待ですね。

6. コロナ感染が確認された場所を地図上にプロットする

CSVにX,Y座標のデータがあったのでプロットしてみようと思います。
今回こちらの記事を参考にさせていただきました

COVID-19.ipynb
#geopandasを使用するために必要なのでインストールする
pipenv install geopandas
pipenv install descartes

#元の地図データを描写
map_1 = gpd.read_file('./land-master(qiita)/japan.geojson')
map_1.plot(figsize=(10,10), edgecolor='#444', facecolor='white', linewidth = 1);

map_1.png

COVID-19.ipynb
#CSVのXY座標を入力してみる
map_1.plot(figsize=(10,10), edgecolor='#444', facecolor='white', linewidth = 1);
plt.scatter(df['X'],df['Y'])
plt.show()

スクリーンショット 2020-08-30 15.49.01.png
プロットされた点をよくみると右上に意味ありげに集結している...ということで拡大してみます。

COVID-19.ipynb
map_1.plot(figsize=(10,10), edgecolor='#444', facecolor='white', linewidth = 1);
plt.xlim([120,150]) #拡大したい範囲を設定(任意)
plt.ylim([30,46]) #拡大したい範囲を設定(任意)
plt.scatter(df['X'],df['Y'])
plt.show()

スクリーンショット 2020-08-30 15.52.15.png
しっかりプロットできていることが確認できました。コロナウイルスが全国的に蔓延しているのがこの地図を通してわかると思います。関東は勿論,九州地方は全体的に感染者が多いとわかりました。どこへ行っても感染のリスクがあるかもしれないと考えると非常に怖いです。

7. まとめ

今回初めてのqiita投稿ということで至らない点もあると思いますが,楽しく分析・記事作成を行うことができ,とても嬉しく思います。簡単な分析ではありますが,地図上に座標をプロットするという自分にとって新しいことに挑戦できたので大変満足です。今回扱ったデータは欠損値が多く分析できるものが少なかったが,今後はよりディープなコロナ分析にチャレンジしてみたいです。コロナウイルスで大変な時期ではありますが,くれぐれもご自愛くださいませ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1