【Python】コロナウイルスのデータを利用したグラフ作成入門【初心者向け】

# はじめに
WHOの公開データを元にしたCSVファイルを読み込み、グラフ化するまでの一連の流れを説明します。

参考にしたサイトは[こちら](https://oku.edu.mie-u.ac.jp/~okumura/python/COVID-19.html)です。

上記サイトでは、Pythonやmatplotlibの基礎知識がある前提で説明されています。

この記事では、僕自身が理解出来なかった点をまとめることで、
初心者の方でも理解できるように補足説明を書いています。

# 前提
* Python、JupyterNotebookなどの、環境セットアップができていること
* 読み込むCSVファイルは、[参考サイト](https://oku.edu.mie-u.ac.jp/~okumura/python/COVID-19.html)のgithubリンクにて公開されており、今回はそれを利用しています。
* これから機械学習を学ぼうとされている方向けの内容です。(すでに機械学習を理解されている方にとって、少し物足りないかと思われます。)

# 環境

* macOS High Sierra 10.13.6
* Python 3.7.6
* matplotlib 3.1.3

# ゴール
以下が達成できることを目標としています。

* CSVを読み込む
* matplotlibでグラフを描画できる

# 準備

### データの読み込み
まずは、CSVを読み込みます。

```python
import pandas as pd

# データ取り込み
df = pd.read_csv("COVID-19.csv", index_col='Date', parse_dates=['Date'])

```
pandasと呼ばれるライブラリをimportし、CSVファイルを読み込んでいます。
pandasとは、CSVの読み込みなど、使いやすいデータ構造とデータ分析ツールを提供するライブラリです。

日本語の基本的な内容は、[こちら](https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a)を見て頂くと、どんなことができるのか理解できます。

### 補足

pandas.read_csv()の引数は、以下のとおりです。

* 第1引数： 読み込み対象のCSVファイル
* 第2引数： index_col … index列を指定
* 第3引数： parse_dates … Date列をDateTime型に変換
 
他にも多数のパラメータが用意されているため、最初は戸惑いますが、一つずつ理解していけば問題ないかと思います。

# データ表示
### matplotlibのインポート
```python:
import matplotlib.dates as mdates
```
matplotlibと呼ばれるライブラリを参照します。
matplotlibは、数行で静的、アニメーション、およびインタラクティブな視覚化を作成できるライブラリです。

その中でも今回は、横軸を日付とした時系列データを取り扱うため、matplotlib.datesを使用します。

import文に`as`をつけることで、別名をつけることができます。
毎回、`matplotlib.dates`と書かず、`mdates`と書くだけで呼び出し可能です。

### 色パターンの取得
```python:
# 色パターンを取得
cmap = plt.get_cmap("tab10")
```

今回は、1つのグラフに複数データを表示させるため、各線に色分けが必要です。
1つずつ色を考えると大変なため、適当な色パターンとなるライブラリです。

表示する線の本数によって、読み込むcmapを切り替えるイメージです。

[matplotlibで色をたくさん使う](https://blog.imind.jp/entry/2019/05/10/031150)

### 目盛りの定義
```python:
#  設定する目盛りを定義する
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
```

グラフを作成する際、目盛りの単位など、決定事項が様々です。
上記処理を簡潔に説明すると、以下のとおりです。

* AutoDateLocator()では、軸目盛りを良い感じに割り振ります。
* ConciseDateFormatter(locator)にて、locatorへ簡潔な時系列のラベルを反映します。

### 定義した目盛り情報をグラフへ反映する

```python:
ax = plt.gca()
```

`plt.gca()`にて、現在のAxesオブジェクトを取得し、`ax`のオブジェクトに設定しています。

### 補足 Axesオブジェクトとは？

Axesオブジェクト、Figureオブジェクトに疑問を持たれる方は、多いかと思われます。

イメージは以下のとおりです。
![fig_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/51525414-ee53-54e6-f42e-62309b1fccb2.png)

[引用元:公式ドキュメント](https://matplotlib.org/1.5.1/faq/usage_faq.html)

|オブジェクト|説明|親子関係|
|-----|---------|------|
|Figureオブジェクト|図の大枠|一番親|
|Axesオブジェクト|データ空間を持つ画像領域|Figureの子クラス|
|Axisオブジェクト|目盛り（軸上のマーク）と目盛りラベル（目盛りにラベルを付ける文字列）|Axesの子クラス|

上記を詳細に理解されたい方は、以下の記事が参考になるかと思います。

[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9#figure-axes-axis%E3%81%AF%E9%9A%8E%E5%B1%A4%E6%A7%8B%E9%80%A0%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B)



### グラフの描画
```python
# 定義した軸目盛りをグラフへ反映
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

# 描画
ax.plot(df.index, df['Global Confirmed'], "s-", color=cmap(3))
ax.plot(df.index, df['China Confirmed'], "o-", color=cmap(2))
ax.plot(df.index, df['Global Deaths'], "s-", color=cmap(7))
ax.plot(df.index, df['China Deaths'], "o-", color=cmap(6))

# グリッド補助線の描画
ax.grid()

# y軸をログスケール表示
plt.yscale('log')

# 凡例を表示
plt.legend(['Global Confirmed', 'China Confirmed','Global Deaths', 'China Deaths'])

# ファイル保存
plt.savefig('COVID-19.svg', bbox_inches="tight") # ｓｖgをpngにすると画像で保存可
```

表示結果は、以下のとおりです。
![COVID-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/03e68cee-66e3-6ffd-6070-24af5bb7498f.png)

表示されるグラフについて、横軸は日付、縦軸は人数となっています。

# 最後に

* 「もう少しAI/機械学習を学びたい。」
* 「独学で学びたいが、何から学べばよいか分からない。」

このような方は、こちらを読めば、効率よく機械学習を学ぶためのステップアップ手順を理解できます。

* [【独学可能】Python初心者のための機械学習に向けた学習ロードマップ](https://obgynai.com/self-study-python-machine-learning/) 

また、具体的なPythonの学び方については、こちらが参考になります。

* [【初心者向け】Pythonの基礎から機械学習導入までのロードマップ【無料教材公開】](https://obgynai.com/python-machine-learning-roadmap/) 


# 参考情報

■ [COVID-19](https://oku.edu.mie-u.ac.jp/~okumura/python/COVID-19.html)
■ [早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)