Python 新型コロナのcsvファイルを題材にデータ処理とグラフ化する「pandas」

 本記事では、新型コロナに関する厚生労働省のHP (オープンデータ|厚生労働省)から入手できるcsvデータを例にpandasでデータを扱う雛形コードを載せました。Pythoncsvなどのテキストファイルを扱うには十中八九pandas(パンダス)を利用することになります。あたかもExcelのような操作をプログラミングによって簡単に処理することができます。

 上記リンク先から入手できる「死亡者数」「PCR 検査実施件数(単日)」「PCR 検査陽性者数(単日)」の3つのcsvファイルは下図のようなものである。

f:id:HK29:20201008235047j:plain

 本プログラムで出来ることは次の通りです。①上図3つのファイルをそれぞれpandasで読み出した後、②列方向に結合、③陽性率を計算して新しい列に追加、④欠損データを削除、⑤日付順にソート(並び替え)、⑥下図のように1つのcsvファイルを作成する。

f:id:HK29:20201008235437p:plain

更に、⑦下図のように2軸のグラフを作成し、折れ線図と棒線図で可視化します。

f:id:HK29:20201008233328p:plain

■本プログラム
本コードは、Jupyter Labからコマンドライン用.pyファイルで出力したコードです。

#!/usr/bin/env python
# coding: utf-8

# In[1]:


# csvファイルをpandasのデータフレーム型で読む
import pandas as pd
# インデックスにする列を指定して読む場合
df_death = pd.read_csv('death_total.csv', index_col='日付')
print(df_death)


# In[2]:


# 文字コードを指定して読む場合
df_tested = pd.read_csv('pcr_tested_daily.csv',
                        index_col='日付',
                        encoding='utf-8')
# 'utf-8' 'Shift-JIS' 'cp932'
print(df_tested)


# In[3]:


# 読み出し開始行、ヘッダー行を指定して読む場合
df_positive = pd.read_csv('pcr_positive_daily.csv',
                          index_col='日付',
                          encoding='utf-8',
                          skiprows=0,
                          header=0)
print(df_positive)


# In[4]:


# 列方向へ結合する
df = pd.concat([df_death, df_tested, df_positive], axis=1)
df


# In[5]:


# インデックスをリセットする。元のインデックスは列になる
df.reset_index(inplace=True)
df


# In[6]:


# 列名(カラム名)を変更する
df.rename(columns = {'index':'日付'}, inplace=True)
df


# In[7]:


# データの要約を表示する。
# カラム名や非欠損データ数、型を確認できる。
df.info()


# In[8]:


# 日付型へ変換する
df['日付'] = pd.to_datetime(df['日付'])
df.info()


# In[9]:


# 日付でソートする
df.sort_values(['日付'], ascending=True, inplace=True)
df


# In[10]:


# 欠損データを確認する
df.isnull().sum()


# In[11]:


# 欠損データを削除し、新たなデータフレームを作成する
df2 = df.dropna()
df2


# In[12]:


# 陽性率を計算して、新規列を作成する
DF = df2.assign(PCR_陽性率_単日 = (df2['PCR 検査陽性者数(単日)'] / df2['PCR 検査実施件数(単日)'])*100)
DF


# In[13]:


# csvファイルへ保存する
DF.to_csv('pcr_data.csv', index=False, encoding='cp932')


# In[14]:


# グラフ表示する。2軸表示
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import japanize_matplotlib
fig = plt.figure(figsize=(15,6))
ax1 = fig.add_subplot(1,1,1)
ln1 = ax1.bar(DF['日付'], DF['死亡者数'],
              color='c', label='死亡者数')
ax2 = ax1.twinx()
ln2 = ax2.plot(DF['日付'], DF['PCR_陽性率_単日'],
               color='m', label='陽性率')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, loc='upper left')
ax1.set_ylabel("死亡者数")
ax2.set_ylabel("陽性率")
ax2.set_ylim([0, 100])
plt.grid()
plt.rcParams['font.size'] = 20
plt.tight_layout()
plt.savefig('figure.png')
plt.close()

# In[ ]:

以上

<広告>