以前、Python でデータを可視化する、グラフを描くライブラリである Matplotlib の基本的な使い方をご紹介しました。
あわせて読みたい
【Python】Matplotlibでグラフを描く(基本編)
Pythonでデータを可視化する、グラフを描くライブラリと言えばMatplotlibです。今回はMatplotlibを使用してグラフの描く時の基本的な部分をまとめました。
今回は Matplotlib を使用して、日本における新型コロナの陽性者数の推移をグラフにしてみたいと思います。
ワクチンを接種した人の割合がかなり増えたためか、陽性者数もかなり減ってきましたが、どれぐらい減ったのかを実際にグラフにして確認してみましょう。
目次
Google Colaboratory
本記事に掲載しているコードは Google Colaboratory で動作を確認しています。
下記リンクからアクセスして、ご自身の Google ドライブにコピーしていただければ、すぐに実行できます。
環境構築が必要ない Google が提供している Web サービスなので、Python を学習中の方、これから学習を始める方にはオススメです。
外部ライブラリのインストール
今回は Matplotlib と Pandas というデータ分析用のライブラリを使用するので、事前に pip 等でインストールをしてください。
pip install matplotlib
pip install pandas
Googel Colaboratory ではデフォルトでどちらもインストールされています。
ちなみに、私が動作を確認した時点でのバージョンは、Matplotlib は 3.2.2
、Pandas は1.1.5
でした。
新型コロナ陽性者数のデータ
2022-04-09 追記
厚生労働省が公開しているCSVデータのフォーマットが変わっています。
取り急ぎ、Google Colaboratory の方を修正しました。
新型コロナの陽性者数のデータは厚生労働省が公開しているCSV形式のデータを使用します。
データは厚生労働省のホームページの下記ページでオープンデータとして公開されています。
厚生労働省のオープンデータ
CSVデータの形式を確認
本記事を書いている時点で公開されているCSVデータは次のような形式になっています。
Date
列が日付、Prefecture
列が県名、Newly confirmed cases
列が陽性者数になっています。
県名がALL
になっているデータが全国のデータになります。
非常にシンプルな形式ですね。
Matplotlib でグラフを描く
基本編の記事では書いていないことについて、後で簡単に解説しますが、まずはコード全体を載せていきます。
全国の陽性者数
まずは全国の陽性者数をグラフにしてみます。
全国の陽性者数をグラフにするコード
import pandas as pd
import matplotlib.pyplot as plt
'''
厚生労働省が公開しているデータ
https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv
URLやデータの形式が変わることがあるので、
エラーになる場合は、このデータが存在するか、形式が変わっていないか、
確認してください。
'''
# URLを変数に格納
data_url = 'https://covid19.mhlw.go.jp/public/opendata/'
data_file_name = 'newly_confirmed_cases_daily.csv'
# CSVファイルをDataFrame形式で変数に格納
data_df = pd.read_csv(
f'{data_url}{data_file_name}',
parse_dates=[0]
)
# 全国のデータを抽出
data_all_df = data_df[data_df["Prefecture"] == "ALL"]
# 日付と陽性者数の値を変数に格納
data_all_date = data_all_df["Date"]
data_all_pcr_positive_daily = data_all_df["Newly confirmed cases"]
# グラフの設定
fig1 = plt.figure(
figsize=(10, 5),
dpi=150,
facecolor='orange',
edgecolor='black',
linewidth=5,
tight_layout=True
)
ax1 = fig1.add_subplot(
111,
facecolor='black',
xlabel='Date',
ylabel='PCR positive daily in Japan'
)
ax1.bar(
data_all_date,
data_all_pcr_positive_daily,
color='white',
)
# グラフの描画
fig1.show()
上記コードを実行すると次のグラフが出力されます。
陽性者数がかなり減っていることが分かりますね。
県別の陽性者数
続いて、県別の陽性者数をグラフにしてみたいと思います。
本記事では神奈川県のデータをグラフにします。
神奈川県の陽性者数をグラフにするコード
import pandas as pd
import matplotlib.pyplot as plt
'''
厚生労働省が公開しているデータ
https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv
URLやデータの形式が変わることがあるので、
エラーになる場合は、このデータが存在するか、形式が変わっていないか、
確認してください。
'''
# URLを変数に格納
data_url = 'https://covid19.mhlw.go.jp/public/opendata/'
data_file_name = 'newly_confirmed_cases_daily.csv'
# CSVファイルをDataFrame形式で変数に格納
data_df = pd.read_csv(
f'{data_url}{data_file_name}',
parse_dates=[0]
)
# 神奈川県のデータを抽出
data_kanagawa_df = data_df[data_df["Prefecture"] == "Kanagawa"]
# 日付と陽性者数の値を変数に格納
data_kanagawa_date = data_kanagawa_df["Date"]
data_kanagawa_pcr_positive_daily = data_kanagawa_df["Newly confirmed cases"]
# グラフの設定
fig2 = plt.figure(
figsize=(10, 5),
dpi=150,
facecolor='orange',
edgecolor='black',
linewidth=5,
tight_layout=True
)
ax2 = fig2.add_subplot(
111,
facecolor='black',
xlabel='Date',
ylabel='PCR positive daily in Kanagawa'
)
ax2.bar(
data_kanagawa_date,
data_kanagawa_pcr_positive_daily,
color='white',
)
# グラフの描画
fig2.show()
上記コードを実行すると次のグラフが出力されます。
全国のグラフと見比べると、2021年5〜6月の山が比較的小さくなっていることが分かりますね。
東京都と神奈川県の陽性者数を比べる
続いて、東京都と神奈川県の陽性者数を比較できるようなグラフを描いてみたいと思います。
何グラフで比較するのが良いかは分かりませんが、今回は基本編で使用した線グラフを使用してみます。
東京都と神奈川県の陽性者数を線グラフにするコード
import pandas as pd
import matplotlib.pyplot as plt
'''
厚生労働省が公開しているデータ
https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv
URLやデータの形式が変わることがあるので、
エラーになる場合は、このデータが存在するか、形式が変わっていないか、
確認してください。
'''
# URLを変数に格納
data_url = 'https://covid19.mhlw.go.jp/public/opendata/'
data_file_name = 'newly_confirmed_cases_daily.csv'
# CSVファイルをDataFrame形式で変数に格納
data_df = pd.read_csv(
f'{data_url}{data_file_name}',
parse_dates=[0]
)
# 東京都と神奈川県のデータを抽出
data_tokyo_df = data_df[data_df["Prefecture"] == "Tokyo"]
data_kanagawa_df = data_df[data_df["Prefecture"] == "Kanagawa"]
# 日付と陽性者数の値を変数に格納
data_tokyo_date = data_tokyo_df["Date"]
data_tokyo_pcr_positive_daily = data_tokyo_df["Newly confirmed cases"]
data_kanagawa_pcr_positive_daily = data_kanagawa_df["Newly confirmed cases"]
# 日付のデータは東京都も神奈川県も同じなので、「data_tokyo_date」を共用する
# グラフの設定
fig3 = plt.figure(
figsize=(10, 5),
dpi=150,
facecolor='orange',
edgecolor='black',
linewidth=5,
tight_layout=True
)
ax3 = fig3.add_subplot(
111,
facecolor='black',
xlabel='Date',
ylabel='PCR positive daily in Tokyo and Kanagawa'
)
ax3.plot(
data_tokyo_date,
data_tokyo_pcr_positive_daily,
color='red',
label='Tokyo'
)
ax3.plot(
data_tokyo_date,
data_kanagawa_pcr_positive_daily,
color='blue',
label='Kanagawa'
)
ax3.legend(
bbox_to_anchor=(1, 1),
loc='upper left',
borderaxespad=0.5,
fontsize=10
)
# グラフの描画
fig3.show()
上記コードを実行すると次のグラフが出力されます。
パッと見で、東京都の陽性者数は神奈川県の2倍ぐらいですね。
2021年8月以降の全国の陽性者数
最後に期間を2021年8月以降に絞ってグラフにしてみます。
2021年8月以降の全国の陽性者数をグラフにするコード
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
'''
厚生労働省が公開しているデータ
https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv
URLやデータの形式が変わることがあるので、
エラーになる場合は、このデータが存在するか、形式が変わっていないか、
確認してください。
'''
# URLを変数に格納
data_url = 'https://covid19.mhlw.go.jp/public/opendata/'
data_file_name = 'newly_confirmed_cases_daily.csv'
# CSVファイルをDataFrame形式で変数に格納
data_df = pd.read_csv(
f'{data_url}{data_file_name}',
parse_dates=[0]
)
# 全国のデータを抽出
data_df_ALL = data_df[data_df["Prefecture"] == "ALL"]
# 2021年8月1日以降のデータを抽出
data_df_ALL_after_2021aug \
= data_df_ALL[data_df_ALL["Date"] >= datetime(2021, 8, 1)]
# 日付と陽性者数の値を変数に格納
data_date_after_2021aug = data_df_ALL_after_2021aug["Date"]
data_pcr_positive_daily_all_after_2021aug \
= data_df_ALL_after_2021aug["Newly confirmed cases"]
# グラフの設定
fig4 = plt.figure(
figsize=(10, 5),
dpi=150,
facecolor='orange',
edgecolor='black',
linewidth=5,
tight_layout=True
)
ax4 = fig4.add_subplot(
111,
facecolor='black',
xlabel='Date',
ylabel='PCR positive daily in Japan'
)
ax4.bar(
data_date_after_2021aug,
data_pcr_positive_daily_all_after_2021aug,
color='white',
)
# グラフの描画
fig4.show()
上記コードを実行すると次のグラフが出力されます。
期間を絞ってデータ数を減らすと、1つ1つの棒がはっきり見えますね。
解説
ここでは、Matplotlib の基本編の記事で紹介していないことについて、簡単に解説していきます。
基本編はこちら。
あわせて読みたい
【Python】Matplotlibでグラフを描く(基本編)
Pythonでデータを可視化する、グラフを描くライブラリと言えばMatplotlibです。今回はMatplotlibを使用してグラフの描く時の基本的な部分をまとめました。
主に Pandas に関する解説になると思います。
インターネット上で公開されているCSVデータの読み込み
インターネット上で公開されているCSVデータの読み込みには Pandas のread_csv()
関数を使用しました。
URLを指定するだけで読み込んでくれるのでオススメです。
読み込んだデータは Pandas のDataFrame
という形式になります。
Python において、まとまったデータを扱う時にはDataFrame
形式がよく使われます。
データの加工も簡単に行えるので、非常に便利です。
# URLを変数に格納
data_url = 'https://covid19.mhlw.go.jp/public/opendata/'
data_file_name = 'newly_confirmed_cases_daily.csv'
# CSVファイルをDataFrame形式で変数に格納
data_df = pd.read_csv(
f'{data_url}{data_file_name}',
parse_dates=[0]
)
read_csv()
関数の最初の引数にはCSVファイルのURLを指定しています。
次のparse_dates=[0]
は最初(1番左)の列をdatetime
型に変換して読み込む設定です。
parse_dates=[0]
を指定しなかった場合、指定した場合のデータを見てみましょう。
パッと見でもスラッシュがハイフンに変わっています。
parse_dates=[0]
を指定しなかった場合、Date
列はただの文字列になっています。
Date
列を文字列のままグラフにすることもできますが、日付が非常に見辛くなるので、parse_dates=[0]
で型を変換するようにしましょう。
データの加工
次も Pandas についてです。
DataFrame
型のデータの加工について見ていきます。
今回行ったデータの加工は3パターンあります。
順番に見ていきます。
条件に合った行を抽出する
1つ目は、条件を指定して、条件に合った行のみを抽出するパターンです。
全国のデータ、東京都のデータ、神奈川県のデータを抽出している時に使用しています。
# 全国のデータを抽出
data_all_df = data_df[data_df["Prefecture"] == "ALL"]
上記は全国のデータのみを抽出しています。
data_df
のPrefecture
列がALL
の行を抽出したい時はこのように書きます。
特定の列を抽出する
2つ目は、特定の列を抽出するパターンです。
グラフのX軸、Y軸のデータを指定する時に使用しています。
# 日付と陽性者数の値を変数に格納
data_all_date = data_all_df["Date"]
data_all_pcr_positive_daily = data_all_df["Newly confirmed cases"]
これは単純に列名を指定します。
特定の1列を抽出しているので、1次元のデータになり、DataFrame
型ではなく、Series
型になります。
Series
型を複数結合させると DataFrame
型になるようなイメージです。
期間を指定して抽出する
3つ目は、1つ目の条件に合った行を抽出するに含めても良いかもしれませんが、期間を指定して行を抽出するパターンです。
2021年8月以降のデータを抽出する時に使用しています。
# 2021年8月1日以降のデータを抽出
data_df_ALL_after_2021aug = data_df_ALL[data_df_ALL["Date"] >= datetime(2021, 8, 1)]
ここで押さえておきたいポイントは次の2点です。
- CSVデータを読み込む時に
parse_dates=[0]
を指定して、Date
列をdatetime
型に変換していること - 日付の指定に
datetime
クラスのdatetime()
メソッドを使用している
期間を絞る時ためにも必要になるので、CSVデータを読み込む時は日付のデータを変換しておきましょう。
棒グラフ
最後は Matplotlib の棒グラフについてです。
基本編では線グラフを使用しましたが、今回は棒グラフも使用しました。
コードを見ていただくだけで分かった方も多いと思いますが、線グラフと棒グラフとで今回変更した箇所は1箇所のみです。
# 棒グラフ
ax1.bar(
data_all_date,
data_all_pcr_positive_daily,
color='white',
)
# 線グラフ
ax3.plot(
data_tokyo_date,
data_tokyo_pcr_positive_daily,
color='red',
label='Tokyo'
)
棒グラフはbar
、線グラフはplot
です。
今回は、線グラフでは2系統のデータを使用したのでlabel
オプションを指定していますが、他は同じです。
おわりに
今回は、
Python でデータを可視化、グラフを描くためのライブラリである Matplotlib を使用して、新型コロナの陽性者数をグラフにする方法
をご紹介しました。
グラフにしてデータを可視化すると、そのデータの特性だったり、他のデータとの違いが分かりやすくなるので、データを分析する時は Matplotlib を使用して、データをグラフにしてみてはいかがでしょうか。
新型コロナの陽性者数もかなり減ってきているので、このまま収束してくれると良いですね。
以上です。
コメント