自由研究3(厚労省の新型コロナの数値分析)
目次
- 1. 概要
- 2. 関連文書
- 3. 厚労省の過去のPDFデータへのリンク
- 4. 厚労省のPDFファイルから4つの表を抜き出し、データベースに保存
- 5. 厚労省のPDFファイルから4つの表を抜き出し、データベースに保存したデータのpandasのデータフレームへ取り込み
- 6. 厚労省のPDFファイルから4つの表を抜き出したデータを色々みてみる(2021/9/1まで)
- 7. Matplotlibでグラフ表示1(Matplotlibの基礎確認)
- 8. Matplotlibでグラフ表示2(上下に2つのグラフ表示)
- 9. Matplotlibでグラフ表示3(パイチャート)
- 10. 新規PDFデータ追加
- 11. 主要なデータの確認及びグラフ表示
- 12. 今後
- 13. この文書のチェンジログ
1 概要
- 新型コロナの被害数値、厚労省から出されてるがPDFで処理しにくい
- 厚労省からcsv形式の情報も出てるがPDFのまとめの数値とは異るデータ
2 関連文書
2.1 コロナ被害関係
2.1.1 厚労省
- コロナ被害の年齢分布(死亡や重症者の年齢分布) https://www.mhlw.go.jp/stf/covid-19/kokunainohasseijoukyou.html
- “国内の患者発生に関する参考資料” の一番下の “新型コロナウイルス感染症の国内発生動向:2021年●月●日〇〇時時点” から見れるPDFファイル
- オープンデータ https://www.mhlw.go.jp/stf/covid-19/open-data.html
2.2 使ったPythonパッケージ
- tika-python https://github.com/chrismattmann/tika-python
- beautifulsoup https://github.com/waylan/beautifulsoup
- pandas https://pandas.pydata.org/
- サイト https://pandas.pydata.org/
- 文書 Getting started https://pandas.pydata.org/docs/getting_started/index.html
- 文書 User Guide https://pandas.pydata.org/docs/user_guide/index.html
- 文書 API reference https://pandas.pydata.org/docs/reference/index.html
- nkf https://github.com/fumiyas/python-nkf
- Matplotlib https://matplotlib.org/
- User’s Guide https://matplotlib.org/stable/users/index.html
- examples gallery https://matplotlib.org/stable/gallery/index.html
- list of plotting commands. https://matplotlib.org/stable/api/pyplot_summary.html
- その他
3 厚労省の過去のPDFデータへのリンク
- 令和2年12月2日 以降表が変更になった。
- 令和2年4月29日 https://www.mhlw.go.jp/content/10906000/000626506.pdf
- 令和2年5月6日 https://www.mhlw.go.jp/content/10906000/000627949.pdf
- 令和2年5月13日 https://www.mhlw.go.jp/content/10906000/000651659.pdf
- 令和2年5月20日 https://www.mhlw.go.jp/content/10906000/000633363.pdf
- 令和2年5月27日 https://www.mhlw.go.jp/content/10906000/000634824.pdf
- 令和2年6月3日 https://www.mhlw.go.jp/content/10906000/000637039.pdf
- 令和2年6月10日 https://www.mhlw.go.jp/content/10906000/000639025.pdf
- 令和2年6月17日 https://www.mhlw.go.jp/content/10906000/000641955.pdf
- 令和2年6月24日 https://www.mhlw.go.jp/content/10906000/000644185.pdf
- 令和2年7月1日 https://www.mhlw.go.jp/content/10906000/000645665.pdf
- 令和2年7月8日 https://www.mhlw.go.jp/content/10906000/000647797.pdf
- 令和2年7月15日 https://www.mhlw.go.jp/content/10906000/000649533.pdf
- 令和2年7月22日 https://www.mhlw.go.jp/content/10906000/000651933.pdf
- 令和2年7月29日 https://www.mhlw.go.jp/content/10906000/000654102.pdf
- 令和2年8月5日 https://www.mhlw.go.jp/content/10906000/000657357.pdf
- 令和2年8月12日 https://www.mhlw.go.jp/content/10906000/000659115.pdf
- 令和2年8月19日 https://www.mhlw.go.jp/content/10906000/000661165.pdf
- 令和2年8月26日 https://www.mhlw.go.jp/content/10906000/000663883.pdf
- 令和2年9月2日 https://www.mhlw.go.jp/content/10906000/000667711.pdf
- 令和2年9月9日 https://www.mhlw.go.jp/content/10906000/000670171.pdf
- 令和2年9月16日 https://www.mhlw.go.jp/content/10906000/000673422.pdf
- 令和2年9月23日 https://www.mhlw.go.jp/content/10906000/000675165.pdf
- 令和2年9月30日 https://www.mhlw.go.jp/content/10906000/000678222.pdf
- 令和2年10月7日 https://www.mhlw.go.jp/content/10906000/000680686.pdf
- 令和2年10月14日 https://www.mhlw.go.jp/content/10906000/000683221.pdf
- 令和2年10月21日 https://www.mhlw.go.jp/content/10906000/000686107.pdf
- 令和2年10月28日 https://www.mhlw.go.jp/content/10906000/000689607.pdf
- 令和2年11月4日 https://www.mhlw.go.jp/content/10906000/000692125.pdf
- 令和2年11月11日 https://www.mhlw.go.jp/content/10906000/000694590.pdf
- 令和2年11月18日 https://www.mhlw.go.jp/content/10906000/000696696.pdf
- 令和2年11月25日 ???
- 令和2年12月2日 https://www.mhlw.go.jp/content/10906000/000702069.pdf
- 令和2年12月9日 https://www.mhlw.go.jp/content/10906000/000704074.pdf
- 令和2年12月16日 https://www.mhlw.go.jp/content/10906000/000706508.pdf
- 令和2年12月23日 https://www.mhlw.go.jp/content/10906000/000710954.pdf
- 令和2年12月29日 https://www.mhlw.go.jp/content/10906000/000713230.pdf
- 令和3年1月6日 https://www.mhlw.go.jp/content/10906000/000716059.pdf
- 令和3年1月13日 https://www.mhlw.go.jp/content/10906000/000719997.pdf
- 令和3年1月20日 https://www.mhlw.go.jp/content/10906000/000724450.pdf
- 令和3年1月27日 https://www.mhlw.go.jp/content/10906000/000729529.pdf
- 令和3年2月3日 https://www.mhlw.go.jp/content/10906000/000734265.pdf
- 令和3年2月10日 https://www.mhlw.go.jp/content/10906000/000737675.pdf
- 令和3年2月17日 https://www.mhlw.go.jp/content/10906000/000741558.pdf
- 令和3年2月24日 https://www.mhlw.go.jp/content/10906000/000744930.pdf
- 令和3年3月3日 https://www.mhlw.go.jp/content/10906000/000748700.pdf
- 令和3年3月10日 https://www.mhlw.go.jp/content/10906000/000751942.pdf
- 令和3年3月17日 https://www.mhlw.go.jp/content/10906000/000755959.pdf
- 令和3年3月24日 https://www.mhlw.go.jp/content/10906000/000759133.pdf
- 令和3年3月31日 https://www.mhlw.go.jp/content/10906000/000764521.pdf
- 令和3年4月7日 https://www.mhlw.go.jp/content/10906000/000767330.pdf
- 令和3年4月14日 https://www.mhlw.go.jp/content/10906000/000769397.pdf
- 令和3年4月21日 https://www.mhlw.go.jp/content/10906000/000771872.pdf
- 令和3年4月28日 https://www.mhlw.go.jp/content/10906000/000775287.pdf
- 令和3年5月5日 https://www.mhlw.go.jp/content/10906000/000776153.pdf
- 令和3年5月12日 https://www.mhlw.go.jp/content/10906000/000779060.pdf
- 令和3年5月19日 https://www.mhlw.go.jp/content/10906000/000782185.pdf
- 令和3年5月26日 https://www.mhlw.go.jp/content/10906000/000785178.pdf
- 令和3年6月2日 https://www.mhlw.go.jp/content/10906000/000787852.pdf
- 令和3年6月9日 https://www.mhlw.go.jp/content/10906000/000790442.pdf
- 令和3年6月16日 https://www.mhlw.go.jp/content/10906000/000793909.pdf
- 令和3年6月23日 https://www.mhlw.go.jp/content/10906000/000796884.pdf
- 令和3年6月30日 https://www.mhlw.go.jp/content/10906000/000800096.pdf
- 令和3年7月7日 https://www.mhlw.go.jp/content/10906000/000803404.pdf
- 令和3年7月14日 https://www.mhlw.go.jp/content/10906000/000807083.pdf
- 令和3年7月21日 https://www.mhlw.go.jp/content/10906000/000809637.pdf
- 令和3年7月28日 https://www.mhlw.go.jp/content/10906000/000813216.pdf
- 令和3年8月4日 https://www.mhlw.go.jp/content/10906000/000816691.pdf
- 令和3年8月11日 https://www.mhlw.go.jp/content/10906000/000818427.pdf
- 令和3年8月18日 https://www.mhlw.go.jp/content/10906000/000820306.pdf
- 令和3年8月25日 https://www.mhlw.go.jp/content/10906000/000823800.pdf
- 令和3年9月1日 https://www.mhlw.go.jp/content/10906000/000826874.pdf
- 令和3年9月8日 https://www.mhlw.go.jp/content/10906000/000830345.pdf
4 厚労省のPDFファイルから4つの表を抜き出し、データベースに保存
4.1 説明動画
4.2 厚労省のPDFファイルから4つの表を抜き出し、データベースに保存の手順
4.2.1 必要なPythonパッケージのインストール
4.2.2 過去の厚労省のPDFファイルをダウンロードして保存する
- 今回表が4つになった後のPDFファイルのみを処理するので、令和2年12月2日以降のPDFファイルをダウンロード。私はwgetを用いて行なったが、好きなツールでOK
- 令和3年9月1日までのPDFファイルをダウンロード
wget -m -l 1 https://www.mhlw.go.jp/content/10906000/000702069.pdf https://www.mhlw.go.jp/content/10906000/000704074.pdf https://www.mhlw.go.jp/content/10906000/000706508.pdf https://www.mhlw.go.jp/content/10906000/000710954.pdf https://www.mhlw.go.jp/content/10906000/000713230.pdf https://www.mhlw.go.jp/content/10906000/000716059.pdf https://www.mhlw.go.jp/content/10906000/000719997.pdf https://www.mhlw.go.jp/content/10906000/000724450.pdf https://www.mhlw.go.jp/content/10906000/000729529.pdf https://www.mhlw.go.jp/content/10906000/000734265.pdf https://www.mhlw.go.jp/content/10906000/000737675.pdf https://www.mhlw.go.jp/content/10906000/000741558.pdf https://www.mhlw.go.jp/content/10906000/000744930.pdf https://www.mhlw.go.jp/content/10906000/000748700.pdf https://www.mhlw.go.jp/content/10906000/000751942.pdf https://www.mhlw.go.jp/content/10906000/000755959.pdf https://www.mhlw.go.jp/content/10906000/000759133.pdf https://www.mhlw.go.jp/content/10906000/000764521.pdf https://www.mhlw.go.jp/content/10906000/000767330.pdf https://www.mhlw.go.jp/content/10906000/000769397.pdf https://www.mhlw.go.jp/content/10906000/000771872.pdf https://www.mhlw.go.jp/content/10906000/000775287.pdf https://www.mhlw.go.jp/content/10906000/000776153.pdf https://www.mhlw.go.jp/content/10906000/000779060.pdf https://www.mhlw.go.jp/content/10906000/000782185.pdf https://www.mhlw.go.jp/content/10906000/000785178.pdf https://www.mhlw.go.jp/content/10906000/000787852.pdf https://www.mhlw.go.jp/content/10906000/000790442.pdf https://www.mhlw.go.jp/content/10906000/000793909.pdf https://www.mhlw.go.jp/content/10906000/000796884.pdf https://www.mhlw.go.jp/content/10906000/000800096.pdf https://www.mhlw.go.jp/content/10906000/000803404.pdf https://www.mhlw.go.jp/content/10906000/000807083.pdf https://www.mhlw.go.jp/content/10906000/000809637.pdf https://www.mhlw.go.jp/content/10906000/000813216.pdf https://www.mhlw.go.jp/content/10906000/000816691.pdf https://www.mhlw.go.jp/content/10906000/000818427.pdf https://www.mhlw.go.jp/content/10906000/000820306.pdf https://www.mhlw.go.jp/content/10906000/000823800.pdf https://www.mhlw.go.jp/content/10906000/000826874.pdf
4.2.3 PDFファイルからデータを抽出して、データベースにデータを出力するPythonスクリプトの作成手順
- pdfのあるディレクトリに移動 ( cd www.mhlw.go.jp/content/10906000/ )
- 以下の内容で、pdffiltertika.pyを作成
from tika import parser from bs4 import BeautifulSoup import re import sys import os import nkf import pickle import pandas as pd import sqlite3 import datetime #import warnings #warnings.simplefilter("ignore") fname=sys.argv[1] bname,ext=os.path.splitext(fname) pdf = parser.from_file(fname, xmlContent=True) xhtml_data = BeautifulSoup(pdf['content']) # データの整形 def myfilter(data): ans=[] tans=None redatetime=re.compile("令和([0-9]+)年([0-9]+)月([0-9]+)日([0-9]+)時.*") for i in data: for j in i.text.strip().split("\n"): k=re.sub("^[^0-9\.]+","",j.strip()) if re.match("^[0-9\. ]+$",k): if len(k)!=0 and len(k.split())>2: print(k) if len(k.split())>8: ans.append(k.split()) if j.find("令和")!=-1: tmp=nkf.nkf('-Z1w' , j.replace(" ","")).decode('utf-8') m=redatetime.match(tmp) if m: print(m) print(m.group(0)) print(m.group(1)) print(m.group(2)) print(m.group(3)) print(m.group(4)) print(m.group()) print(tmp) print(j) tans=(m.group(1),m.group(2),m.group(3),m.group(4)) return (tans,ans) # 2ページ目の表の処理 t1,ans1=myfilter(xhtml_data.find_all('div', attrs={'class': 'page'})[1].find_all('p')) # 3ページ目の表の処理 t2,ans2=myfilter(xhtml_data.find_all('div', attrs={'class': 'page'})[2].find_all('p')) # 文字列を数値化 for i in range(6): ans1[i]=list(map(lambda x:int(x),ans1[i])) for i in range(6,9): ans1[i]=list(map(lambda x:float(x),ans1[i])) for i in range(1): ans2[i]=list(map(lambda x:float(x),ans2[i])) for i in range(1,3): ans2[i]=list(map(lambda x:int(x),ans2[i])) # 資料から抜き出した年月日を数値化 t1=list(map(lambda x:int(x),t1)) t2=list(map(lambda x:int(x),t2)) # 資料から抜き出した年月日をdatetime型に変更 tt=datetime.date(t1[0]+2021-3,t1[1],t1[2]) # 資料から抜き出した年月日を %Y-%m-%d 形式の文字列に変換(ex. 2021-09-01) tts=datetime.date(t1[0]+2021-3,t1[1],t1[2]).strftime("%Y-%m-%d") # 変数t1,t2,ans1,ans2をpickeファイルに書き出し with open(bname+".pickle","wb") as f: pickle.dump((t1,t2,ans1,ans2),f) # データベースファイルの初期化 with sqlite3.connect("covid19_data.db") as conn: # テーブルの生成 conn.execute("create table if not exists pcr(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists pcr_m(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists pcr_f(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists death(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists death_m(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists death_f(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists mortality(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists mortality_m(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists mortality_f(t date, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, age real)") conn.execute("create table if not exists severe_r(t date, age real, age00 real, age10 real , age20 real , age30 real , age40 real , age50 real , age60 real , age70 real , age80 real, nc real, investigate real, undisclosed real)") conn.execute("create table if not exists severe(t date, age integer, age00 integer, age10 integer , age20 integer , age30 integer , age40 integer , age50 integer , age60 integer , age70 integer , age80 integer, nc integer, investigate integer, undisclosed integer)") conn.execute("create table if not exists hospitalization(t date, age integer, age00 integer, age10 integer , age20 integer , age30 integer , age40 integer , age50 integer , age60 integer , age70 integer , age80 integer, nc integer, investigate integer, undisclosed integer)") # 取り込んだデータを書き出し with sqlite3.connect("covid19_data.db") as conn: conn.execute("insert into pcr values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[0]) conn.execute("insert into pcr_m values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[1]) conn.execute("insert into pcr_f values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[2]) conn.execute("insert into death values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[3]) conn.execute("insert into death_m values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[4]) conn.execute("insert into death_f values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[5]) conn.execute("insert into mortality values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[6]) conn.execute("insert into mortality_m values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[7]) conn.execute("insert into mortality_f values( ?,?,?,?,? ,?,?,?,?,?, ? )", [tts]+ans1[8]) conn.execute("insert into severe_r values( ?,?,?,?,? ,?,?,?,?,?, ?,?,?,? )", [tts]+ans2[0]) conn.execute("insert into severe values( ?,?,?,?,? ,?,?,?,?,?, ?,?,?,? )", [tts]+ans2[1]) conn.execute("insert into hospitalization values( ?,?,?,?,? ,?,?,?,?,?, ?,?,?,? )", [tts]+ans2[2]) # SQLでテスト用 # select * from death order by t asc;
- 8個のスペースがtabに置き換わってしまってるので以下で変換(お好きなエディタで置換すればOK)
sed -e "s/\t/ /g" pdffiltertika.py > 1.py
mv 1.py pdffiltertika.py
4.3 作業自動化のためのGNU MakeのMakefileを作成およびデータ抽出
4.3.1 作業自動化のためのGNU MakeのMakefileを作成 手順
- pdfのあるディレクトリに移動 ( cd www.mhlw.go.jp/content/10906000/ )
- 以下の内容でMakefile作成
PDF=${wildcard *.pdf} PICKLE=${PDF:.pdf=.pickle} all: ${PICKLE} %.pickle: %.pdf python3 pdffiltertika.py $<
4.3.2 データ抽出
- データベースファイルの削除 と pickleファイルを削除
rm covid19_data.db *.pickle
- PDFファイルからデータ抽出
make
make
4.4 この章のまとめ
- 厚労省のPDFファイルから、表の数値をプログラムで取り出せるようにした。
5 厚労省のPDFファイルから4つの表を抜き出し、データベースに保存したデータのpandasのデータフレームへ取り込み
5.1 説明動画
5.2 厚労省のPDFファイルから4つの表を抜き出し、データベースに保存したデータのpandasのデータフレームへ取り込み手順
5.2.1 Pythonの対話環境起動
- virtualenv 環境にはいる
source bin/activate cd www.mhlw.go.jp/content/10906000/
- Pythonの対話環境起動
ipython
5.2.2 SQLite3のデータベースファイルからデータ取り出し
- 以下の名前の変数に時系列データを入れる
- pcrに陽性数
- pcr_mに陽性数(男性
- pcr_fに陽性数(女性
- deathに死者数の累計
- death_mに死者数の累計(男性
- death_fに死者数の累計(女性
- mortalityに死亡
- mortality_mに死亡率(男性
- mortality_fに死亡率(女性
- severe に重傷者数(累計ではないその時点の)
- severe_r に重傷化率
- hospitalization に入院を必要とする人数
- pcrに陽性数
import pandas as pd import sqlite3 import datetime sql = "select * from death order by t asc" with sqlite3.connect("covid19_data.db") as conn: death=pd.read_sql(sql, conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_m=pd.read_sql(sql.replace("death","death_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_f=pd.read_sql(sql.replace("death","death_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality=pd.read_sql(sql.replace("death","mortality"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_m=pd.read_sql(sql.replace("death","mortality_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_f=pd.read_sql(sql.replace("death","mortality_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr=pd.read_sql(sql.replace("death","pcr"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_m=pd.read_sql(sql.replace("death","pcr_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_f=pd.read_sql(sql.replace("death","pcr_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe_r=pd.read_sql(sql.replace("death","severe_r"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe=pd.read_sql(sql.replace("death","severe"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) hospitalization=pd.read_sql(sql.replace("death","hospitalization"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'})
5.2.3 取り込んだデータの確認
#死亡者数の累計表示 death #1週間毎の死亡者数 death.diff() #1週間毎の陽性者数あたりの死亡率 death.diff()/pcr.diff()*100.0
5.3 この章のまとめ
- データベースに格納してあった、時系列データをPythonのpandasのデータフレームに取り出した
6 厚労省のPDFファイルから4つの表を抜き出したデータを色々みてみる(2021/9/1まで)
6.1 説明動画
6.2 厚労省のPDFファイルから4つの表を抜き出したデータを色々いじってみる手順
6.2.1 Pythonの対話環境起動
- virtualenv 環境にはいる
source bin/activate cd www.mhlw.go.jp/content/10906000/
- Pythonの対話環境起動
ipython
6.2.2 データ取り込み
import pandas as pd import sqlite3 import datetime sql = "select * from death order by t asc" with sqlite3.connect("covid19_data.db") as conn: death=pd.read_sql(sql, conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_m=pd.read_sql(sql.replace("death","death_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_f=pd.read_sql(sql.replace("death","death_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality=pd.read_sql(sql.replace("death","mortality"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_m=pd.read_sql(sql.replace("death","mortality_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_f=pd.read_sql(sql.replace("death","mortality_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr=pd.read_sql(sql.replace("death","pcr"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_m=pd.read_sql(sql.replace("death","pcr_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_f=pd.read_sql(sql.replace("death","pcr_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe_r=pd.read_sql(sql.replace("death","severe_r"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe=pd.read_sql(sql.replace("death","severe"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) hospitalization=pd.read_sql(sql.replace("death","hospitalization"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'})
7 Matplotlibでグラフ表示1(Matplotlibの基礎確認)
7.1 説明動画
7.2 matplotlibでグラフ表示の手順
7.2.1 Pythonの対話環境起動
- virtualenv 環境にはいる
source bin/activate cd www.mhlw.go.jp/content/10906000/
- matplotlibがはいってないなら以下でインストール
pip install matplotlib
- Pythonの対話環境起動
ipython
7.2.2 データ取り込み等
import pandas as pd import sqlite3 import datetime import matplotlib.pyplot as plt import matplotlib sql = "select * from death order by t asc" with sqlite3.connect("covid19_data.db") as conn: death=pd.read_sql(sql, conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_m=pd.read_sql(sql.replace("death","death_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_f=pd.read_sql(sql.replace("death","death_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality=pd.read_sql(sql.replace("death","mortality"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_m=pd.read_sql(sql.replace("death","mortality_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_f=pd.read_sql(sql.replace("death","mortality_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr=pd.read_sql(sql.replace("death","pcr"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_m=pd.read_sql(sql.replace("death","pcr_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_f=pd.read_sql(sql.replace("death","pcr_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe_r=pd.read_sql(sql.replace("death","severe_r"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe=pd.read_sql(sql.replace("death","severe"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) hospitalization=pd.read_sql(sql.replace("death","hospitalization"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'})
7.2.3 重傷者の数をグラフ表示1
severe.plot() plt.show()
7.2.4 重傷者の数をグラフ表示2 グリッドを追加して表示
severe.plot() plt.grid() plt.show()
7.2.5 日本語フォントを指定
- これしないと文字化けする
- フォントのフルパスは実際使いたいフォントパスに変更してください。(“/usr/share/fonts/truetype/fonts-japanese-gothic.ttf”は私のUbuntu環境のfontのパスから適当に選択しました)
matplotlib.rcParams["font.family"] = matplotlib.font_manager.FontProperties(fname="/usr/share/fonts/truetype/fonts-japanese-gothic.ttf").get_name()
7.2.6 重傷者の数をグラフ表示3 軸ラベルも追加して表示
severe.plot() plt.xlabel("年月日") plt.ylabel("重傷者数(人)") plt.title("厚労省のPDFから抜き出した重傷者数(人)") plt.grid() plt.show()
7.3 この章のまとめ
- Matplotlibの使い方の基礎確認
8 Matplotlibでグラフ表示2(上下に2つのグラフ表示)
8.1 説明動画
8.2 matplotlibでグラフ表示の手順
8.2.1 Pythonの対話環境起動
- virtualenv 環境にはいる
source bin/activate cd www.mhlw.go.jp/content/10906000/
- matplotlibがはいってないなら以下でインストール
pip install matplotlib
- Pythonの対話環境起動
ipython
8.2.2 データ取り込み等
import pandas as pd import sqlite3 import datetime import matplotlib.pyplot as plt import matplotlib sql = "select * from death order by t asc" with sqlite3.connect("covid19_data.db") as conn: death=pd.read_sql(sql, conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_m=pd.read_sql(sql.replace("death","death_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_f=pd.read_sql(sql.replace("death","death_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality=pd.read_sql(sql.replace("death","mortality"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_m=pd.read_sql(sql.replace("death","mortality_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_f=pd.read_sql(sql.replace("death","mortality_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr=pd.read_sql(sql.replace("death","pcr"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_m=pd.read_sql(sql.replace("death","pcr_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_f=pd.read_sql(sql.replace("death","pcr_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe_r=pd.read_sql(sql.replace("death","severe_r"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe=pd.read_sql(sql.replace("death","severe"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) hospitalization=pd.read_sql(sql.replace("death","hospitalization"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'})
8.2.3 重傷者の数をグラフ表示3 軸ラベルも追加して表示
fig = plt.figure() axes= fig.subplots(2) severe.plot(ax=axes[0]) death.diff().plot(ax=axes[1]) axes[0].grid() axes[0].set_xlabel("年月日") axes[0].set_ylabel("重傷者数(人)") axes[0].set_title("厚労省PDFから抜き出した数値から作成") axes[1].grid() axes[1].set_xlabel("年月日") axes[1].set_ylabel("1週間毎の死者数(人)") plt.show()
8.3 この章のまとめ
- Matplotlibの使い方の基礎、複数のグラフの同時表示のやりかたの確認をした
9 Matplotlibでグラフ表示3(パイチャート)
9.1 説明動画
9.2 matplotlibでグラフ表示の手順
9.2.1 Pythonの対話環境起動
- virtualenv 環境にはいる
source bin/activate cd www.mhlw.go.jp/content/10906000/
- matplotlibがはいってないなら以下でインストール
pip install matplotlib
- Pythonの対話環境起動
ipython
9.2.2 データ取り込み等
- フォントのフルパスは実際使いたいフォントパスに変更してください。(“/usr/share/fonts/truetype/fonts-japanese-gothic.ttf”は私のUbuntu環境のfontのパスから適当に選択しました)
import pandas as pd import sqlite3 import datetime import matplotlib.pyplot as plt import matplotlib sql = "select * from death order by t asc" with sqlite3.connect("covid19_data.db") as conn: death=pd.read_sql(sql, conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_m=pd.read_sql(sql.replace("death","death_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_f=pd.read_sql(sql.replace("death","death_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality=pd.read_sql(sql.replace("death","mortality"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_m=pd.read_sql(sql.replace("death","mortality_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_f=pd.read_sql(sql.replace("death","mortality_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr=pd.read_sql(sql.replace("death","pcr"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_m=pd.read_sql(sql.replace("death","pcr_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_f=pd.read_sql(sql.replace("death","pcr_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe_r=pd.read_sql(sql.replace("death","severe_r"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe=pd.read_sql(sql.replace("death","severe"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) hospitalization=pd.read_sql(sql.replace("death","hospitalization"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) matplotlib.rcParams["font.family"] = matplotlib.font_manager.FontProperties(fname="/usr/share/fonts/truetype/fonts-japanese-gothic.ttf").get_name()
9.2.3 パイチャート
- 死者数の累計
tmp=death.tail(1).T[:-1] tmp.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp.plot(kind='pie', autopct='%1.1f%%',subplots=True) plt.title("新型コロナでの死者累計の割合2021/09/01") plt.show()
- 直近重傷者
tmp2=severe.tail(1).T[1:-3] tmp2.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp2.plot(kind='pie', autopct='%1.1f%%',subplots=True) plt.title("新型コロナでの重傷者の割合2021/09/01") plt.show()
- 直近1週間の死者
tmp3=death.diff().tail(1).T[:-1] tmp3.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp3.plot(kind='pie', autopct='%1.1f%%',subplots=True) plt.title("新型コロナでの直近1週間の死者の割合2021/09/01") plt.show()
- 3つのグラフ同時表示
fig = plt.figure() axes= fig.subplots(1,3) tmp.plot(kind='pie',ax=axes[0], autopct='%1.1f%%',subplots=True,legend=True) tmp2.plot(kind='pie',ax=axes[1], autopct='%1.1f%%',subplots=True,legend=False) tmp3.plot(kind='pie',ax=axes[2], autopct='%1.1f%%',subplots=True,legend=False) axes[0].set_title("新型コロナでの死者累計の割合2021/09/01") axes[1].set_title("新型コロナでの重傷者の割合2021/09/01") axes[2].set_title("新型コロナでの直近1週間の死者の割合2021/09/01") plt.show()
9.3 この章のまとめ
- Matplotlibの使い方の基礎、パイチャートの描画
10 新規PDFデータ追加
10.1 説明動画
10.2 データ追加の手順
10.2.1 virtualenv 環境にはいる
source bin/activate
10.2.2 pdfファイル追加
- 以下は令和3年9月8日のPDFファイルのURLなので、更新された分(というか処理したいPDFを入れて)処理する必要がある
- 複数ファイル追加もOK
- ただし、令和2年12月2日より前のPDFファイルはフォーマットが異るため、入れるとエラーになる
- 今後フォーマットが変更されると同じ処理で上手くデータ追加出来なくなる
wget -m -l 1 https://www.mhlw.go.jp/content/10906000/000830345.pdf
10.2.3 データ追加
- pdfファイルのあるディレクトリに移動
cd www.mhlw.go.jp/content/10906000/
- GNU makeで処理
- これで新しく追加した分のPDFファイルを処理して、抜き出した情報をデータベースに格納
make
10.3 この章のまとめ
- 新しくPDFファイルを追加したときの処理方法についての説明
11 主要なデータの確認及びグラフ表示
11.1 説明動画
11.2 主要なデータの確認及びグラフ表示
11.2.1 データ取り込み等
- フォントのフルパスは実際使いたいフォントパスに変更してください。(“/usr/share/fonts/truetype/fonts-japanese-gothic.ttf”は私のUbuntu環境のfontのパスから適当に選択しました)
- 以下の名前の変数に時系列データを入れる
- pcrに陽性数
- pcr_mに陽性数(男性
- pcr_fに陽性数(女性
- deathに死者数の累計
- death_mに死者数の累計(男性
- death_fに死者数の累計(女性
- mortalityに死亡
- mortality_mに死亡率(男性
- mortality_fに死亡率(女性
- severe に重傷者数(累計ではないその時点の)
- severe_r に重傷化率
- hospitalization に入院を必要とする人数
- pcrに陽性数
import pandas as pd import sqlite3 import datetime import matplotlib.pyplot as plt import matplotlib sql = "select * from death order by t asc" with sqlite3.connect("covid19_data.db") as conn: death=pd.read_sql(sql, conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_m=pd.read_sql(sql.replace("death","death_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) death_f=pd.read_sql(sql.replace("death","death_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality=pd.read_sql(sql.replace("death","mortality"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_m=pd.read_sql(sql.replace("death","mortality_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) mortality_f=pd.read_sql(sql.replace("death","mortality_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr=pd.read_sql(sql.replace("death","pcr"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_m=pd.read_sql(sql.replace("death","pcr_m"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) pcr_f=pd.read_sql(sql.replace("death","pcr_f"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe_r=pd.read_sql(sql.replace("death","severe_r"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) severe=pd.read_sql(sql.replace("death","severe"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) hospitalization=pd.read_sql(sql.replace("death","hospitalization"), conn, index_col='t', parse_dates={'Date': '%Y-%m-%d'}) # 日本語フォントの設定 matplotlib.rcParams["font.family"] = matplotlib.font_manager.FontProperties(fname="/usr/share/fonts/truetype/fonts-japanese-gothic.ttf").get_name() # 小数点以下の表示桁数を変更 pd.options.display.precision=3
11.2.2 死者数、最新から1週間での死者数、重傷者のパイチャート表示
fig = plt.figure() axes= fig.subplots(1,5) tmp=death.tail(1).T[:-1] tmp2=severe.tail(1).T[1:-3] tmp3=death.diff().tail(1).T[:-1] tmp4=hospitalization.tail(1).T[1:-3] tmp.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp2.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp3.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp4.index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代以上"] tmp.plot(kind='pie',ax=axes[0], autopct='%1.1f%%',subplots=True,legend=False) tmp2.plot(kind='pie',ax=axes[1], autopct='%1.1f%%',subplots=True,legend=False) tmp3.plot(kind='pie',ax=axes[2], autopct='%1.1f%%',subplots=True,legend=False) tmp4.plot(kind='pie',ax=axes[3], autopct='%1.1f%%',subplots=True,legend=False) tmp.plot(kind='pie',ax=axes[4], autopct='%1.1f%%',subplots=True,legend=True) axes[0].set_title("死者累計の割合") axes[1].set_title("重傷者の割合") axes[2].set_title("直近1週間の死者の割合") axes[3].set_title("入院治療等を要する者") plt.show()
11.2.3 1週間の死者数の計算およびグラフ表示
- 重傷者数
severe
- 1週間の死者数
death.diff()
- グラフ表示
fig = plt.figure() axes= fig.subplots(2) severe.plot(ax=axes[0]) death.diff().plot(ax=axes[1]) axes[0].grid() axes[0].set_xlabel("年月日") axes[0].set_ylabel("重傷者数(人)") axes[0].set_title("厚労省PDFから抜き出した数値から作成") axes[1].grid() axes[1].set_xlabel("年月日") axes[1].set_ylabel("1週間毎の死者数(人)") plt.show()
11.2.4 1週間毎の死亡率
11.3 この章のまとめ
- 主要な情報の確認と、グラフ化をおこなった
12 今後
- 今後文書追加するかも、しないかも
13 この文書のチェンジログ
- 2021/09/02 初版
- 2021/09/06 修正
- 2021/09/08 以下の章を追加
- Matplotlibでグラフ表示1(Matplotlibの基本確認) の章追加
- Matplotlibでグラフ表示2(上下に2つのグラフ表示)
- Matplotlibでグラフ表示3(パイチャート)
- 2021/09/09 以下の章を追加
- 新規PDFデータ追加
- 主要なデータの確認及びグラフ表示
Created: 2021-09-09 木 22:55