Mathematical.jp

よいこの低学年向けすうがくひろば



PythonによるCSVファイル取り込み


PythonによるCSVデータの取り込み

NIDD 国立感染症研究所

全数把握疾患、報告数、累積報告数、都道府県別

サンプルにするデータはIDWR速報データの五類感染症に関して都道府県別発生件数を週ごとにまとめられたCSVファイルを使用します。

発生頻度が0のところは見にくいのでこういった部分を省いてデータを集約して見やすくし、さらには週ごとのデータも集約する方法になります。

Jupyter Lab

今回はAnaconda3のJupyter Lab上で操作を進めていくことにします。同じanaconda3上にjupyternotebookというのがありますが現在は開発が止まっているのでjupyter labのほうですすめていくほうが無難でしょう。

集計CSVデータのダウンロード

以下のリンクからデータをダウンロード。

IDWR速報データ 2022年第5週

その他2022年第6週から第13週は右サイドバーの一番下のリンクが貼ってあるのでそれぞれをダウンロードして適当なフォルダに入れておきます。

pandasのインポート

jupyter labを開いたら適当なファイル名をつけてpandasとglobのインポートを実施。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import pandas as pd
from glob import glob
import pandas as pd from glob import glob
import pandas as pd
from glob import glob

次にglobでファイルのあるパスを指定して読みこませます(.csvの前にある*はワイルドカード)。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別/*.csv')
glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別/*.csv')
glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別/*.csv')

※)パスの指定がわからない場合はファイルのある所に直接入っていって次のようにパスをそのまま最初の’と*の間にコピペします。

Shift + Enterで実行させて次のようにファイルを読み込ませる。

それを新しくzensu_haakuの中に入れる。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
zensu_haaku = glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別/*.csv')
zensu_haaku
zensu_haaku = glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別/*.csv') zensu_haaku
zensu_haaku = glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別/*.csv')
zensu_haaku

0番目のファイルをdir_pathへ格納します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
dir_path = zensu_haaku[0]
dir_path
dir_path = zensu_haaku[0] dir_path
dir_path = zensu_haaku[0]
dir_path

仮置きの中にpd.read_csvでファイル読み込みさせる。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df_temp = pd.read_csv(dir_path, encoding='sjis')
df_temp
df_temp = pd.read_csv(dir_path, encoding='sjis') df_temp
df_temp = pd.read_csv(dir_path, encoding='sjis')
df_temp

主にデータの入っている箇所の列と、なんの症例か判別するために主要感染症名のある行を取り出してcolumnsに入れておきます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
columns = df_temp.iloc[1, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
columns
columns = df_temp.iloc[1, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]] columns
columns = df_temp.iloc[1, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
columns

右上に欠損値のNaNがあるのでここを“都道府県別”という文字列を代入します。
次のように入力。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
columns = columns.fillna('都道府県別')
columns
columns = columns.fillna('都道府県別') columns
columns = columns.fillna('都道府県別')
columns

次にデータの入っている都道府県別の行を取り出していく。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df = df_temp.iloc[4:50, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
df
df = df_temp.iloc[4:50, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]] df
df = df_temp.iloc[4:50, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
df

なんの列名(病名)かわかるように先ほど作成したcolumnsを入れてやるようにします。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df.columns = columns
df
df.columns = columns df
df.columns = columns
df

いつの時期のものかわかるように週数を入れます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df['週数'] = df_temp.iloc[0, 0]
df
df['週数'] = df_temp.iloc[0, 0] df
df['週数'] = df_temp.iloc[0, 0]
df

一連のデータ抽出の流れをまとめてaffected_extractという関数にまとめます。ファイルのパスを認識させるために関数名の後の()の中にdir_pathと入力してファイルを引き込んでやります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def affected_extract(dir_path):
df_temp = pd.read_csv(dir_path, encoding = 'sjis')
columns = df_temp.iloc[1, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
columns = columns.fillna('都道府県別')
df = df_temp.iloc[4:50, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
df.columns = columns
df['週数'] = df_temp.iloc[0, 0]
return df
df = affected_extract(dir_path)
df.head()
def affected_extract(dir_path): df_temp = pd.read_csv(dir_path, encoding = 'sjis') columns = df_temp.iloc[1, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]] columns = columns.fillna('都道府県別') df = df_temp.iloc[4:50, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]] df.columns = columns df['週数'] = df_temp.iloc[0, 0] return df df = affected_extract(dir_path) df.head()
def affected_extract(dir_path):
df_temp = pd.read_csv(dir_path, encoding = 'sjis')
columns = df_temp.iloc[1, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
columns = columns.fillna('都道府県別')
df = df_temp.iloc[4:50, [0, 17, 35, 41,45,55,81,93,123,129,131,133,137,141,143,145,149,153,159,161,163,169]]
df.columns = columns
df['週数'] = df_temp.iloc[0, 0]
return df
df = affected_extract(dir_path)
df.head()

データの集約

pd.concat

抽出のコードが出来たので週ごとのデータをひとつのデータにまとめます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df = pd.DataFrame()
for dir_path in zensu_haaku:
df_temp = affected_extract(dir_path)
df = pd.concat([df, df_temp])
df
df = pd.DataFrame() for dir_path in zensu_haaku: df_temp = affected_extract(dir_path) df = pd.concat([df, df_temp]) df
df = pd.DataFrame()
for dir_path in zensu_haaku:
df_temp = affected_extract(dir_path)
df = pd.concat([df, df_temp])
df

左下の行数を見ればわかるように368 rows × 23 columnsとなっているのでデータが集約出来ていることがわかります。

左の行番を順通りにするために以下のように入力。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df = df.reset_index(drop = True)
df = df.reset_index(drop = True)
df = df.reset_index(drop = True)

次にこれをCSVファイルとして出力します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df.to_csv('zensu_data.csv', index = False)
df.to_csv('zensu_data.csv', index = False)
df.to_csv('zensu_data.csv', index = False)

実行するとzensu_haku.csvという名前のファイルが作られます。
これをダブルクリックしてやればjupyter lab上で以下のように作成されたファイルが閲覧出来るようになります。

CSVファイルの文字化け修正

なおカレントディレクトリから開く場合csvファイルが以下のように文字化けしていることがあります。

次のように対処していきます。

まず対象の文字化けしているCSVを右クリックしてそれをメモ帳か何かで開きます。

名前を付けて保存をクリック。

この時文字コードをANSIに変換して上書き保存。

文字コードをANSIにして上書き保存します。

再度開き直せば次のように表示されるようになります。

出力

都道府県ごとのデータを出力してexport_dirというフォルダに格納します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for i in prefectures:
df_affected = df[df['都道府県別'] == i]
df_affected.to_csv('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir' + '/' + i + '.csv')
for i in prefectures: df_affected = df[df['都道府県別'] == i] df_affected.to_csv('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir' + '/' + i + '.csv')
for i in prefectures:
df_affected = df[df['都道府県別'] == i]
df_affected.to_csv('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir' + '/' + i + '.csv')
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir/*.csv')
glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir/*.csv')
glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir/*.csv')

all_csv_dataへ格納します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
all_csv_data = glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir/*.csv')
all_csv_data
all_csv_data = glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir/*.csv') all_csv_data
all_csv_data = glob ('D:\統計データ\全数把握疾患、報告数、累積報告数都道府県別\export_dir/*.csv')
all_csv_data

for文のなかにconcatを使ってdf_all_csv_dataへデータを結合します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df_all_csv_data = pd.DataFrame()
for i in all_csv_data:
df_read_csv = pd.read_csv(i)
df_all_csv_data = pd.concat([df_read_csv, df_all_csv_data])
df_all_csv_data = pd.DataFrame() for i in all_csv_data: df_read_csv = pd.read_csv(i) df_all_csv_data = pd.concat([df_read_csv, df_all_csv_data])
df_all_csv_data = pd.DataFrame()
for i in all_csv_data:
df_read_csv = pd.read_csv(i)
df_all_csv_data = pd.concat([df_read_csv, df_all_csv_data])

余計な列があるのでこれを次のようにして削除します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df_drop = df_all_csv_data.drop('Unnamed: 0', axis = 1)
df_all_csv_data = df_drop
df_all_csv_data
df_drop = df_all_csv_data.drop('Unnamed: 0', axis = 1) df_all_csv_data = df_drop df_all_csv_data
df_drop = df_all_csv_data.drop('Unnamed: 0', axis = 1)
df_all_csv_data = df_drop
df_all_csv_data

次のように入力して行番をリセット。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df_all_csv_data = df_all_csv_data.reset_index(drop = True)
df_all_csv_data
df_all_csv_data = df_all_csv_data.reset_index(drop = True) df_all_csv_data
df_all_csv_data = df_all_csv_data.reset_index(drop = True)
df_all_csv_data

最後に次のようにしてCSVデータを出力。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df_all_csv_data.to_csv('all_csv_data.csv', index = False)
df_all_csv_data.to_csv('all_csv_data.csv', index = False)
df_all_csv_data.to_csv('all_csv_data.csv', index = False)

データの描画

seabornの日本語対応をしていないのでそれぞれに対応する病名を次のように表記。

結核tuberculosis
腸管出血性大腸菌感染症EHEC(Enterohemorrhagic Escherichia coli infection)
E型肝炎Hepatitis E
A型肝炎Hepatitis A
回帰熱recurrent fever
つつが虫病Tsutsugamushi disease
日本脳炎Japanese encephalitis
レジオネラ症Legionellosis
アメーバ赤痢Amoebiasis
ウイルス性肝炎Viral hepatitis
カルバペネム耐性腸内細菌感染症CRE(carbapenem-resistant Enterobacteriaceae)
急性脳炎Acute encephalitis
クロイツフェルト・ヤコブ病CJD(Creutzfeldt-Jakob disease)
劇症型溶血性レンサ球菌感染症Severe invasive streptococcal disease
後天性免疫不全症候群HIV
侵襲性インフルエンザ菌感染症Invasive Haemophilus influenzae disease
侵襲性肺炎球菌感染症invasive pneumococcal disease
梅毒Syphilis
播種性クリプトコックス症Cryptococcosis
破傷風tetanus
百日咳Whooping cough
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
df_prefectures_master.index = ['mie', 'kyoto', 'saga', 'hyogo', 'hokkaido', 'tiba', 'wakayama', 'saitama', 'ooita', 'oosaka', 'nara', 'miyagi', 'miyazaki', 'toyama', 'yamaguti', 'yamagata', 'yamanasi', 'gifu', 'okayama', 'iwate', 'tottori', 'hirosima', 'tokusima', 'ehime', 'aiti', 'niigata', 'tokyo', 'totigi', 'siga','kumamoto', 'isikawa', 'kanagawa', 'fukui', 'fukuoka', 'fukusima', 'akita', 'gunma', 'ibaraki', 'nagasaki', 'nagano', 'aomori', 'sizuoka', 'kagawa', 'kouti', 'tottori', 'kagosima' ]
df_prefectures_master.columns = ['tuberculosis', 'EHEC', 'Hepatitis E', 'Hepatitis A', 'recurrent fever', 'Tsutsugamushi disease', 'Japanese encephalitis', 'Legionellosis', 'Amoebiasis', 'Viral hepatitis', 'CRE', 'Acute encephalitis', 'CJD', 'Severe invasive streptococcal disease', 'HIV', 'Invasive Haemophilus influenzae disease', 'invasive pneumococcal disease', 'Syphilis', 'Cryptococcosis', 'tetanus', 'Whooping cough']
df_prefectures_master
df_prefectures_master.index = ['mie', 'kyoto', 'saga', 'hyogo', 'hokkaido', 'tiba', 'wakayama', 'saitama', 'ooita', 'oosaka', 'nara', 'miyagi', 'miyazaki', 'toyama', 'yamaguti', 'yamagata', 'yamanasi', 'gifu', 'okayama', 'iwate', 'tottori', 'hirosima', 'tokusima', 'ehime', 'aiti', 'niigata', 'tokyo', 'totigi', 'siga','kumamoto', 'isikawa', 'kanagawa', 'fukui', 'fukuoka', 'fukusima', 'akita', 'gunma', 'ibaraki', 'nagasaki', 'nagano', 'aomori', 'sizuoka', 'kagawa', 'kouti', 'tottori', 'kagosima' ] df_prefectures_master.columns = ['tuberculosis', 'EHEC', 'Hepatitis E', 'Hepatitis A', 'recurrent fever', 'Tsutsugamushi disease', 'Japanese encephalitis', 'Legionellosis', 'Amoebiasis', 'Viral hepatitis', 'CRE', 'Acute encephalitis', 'CJD', 'Severe invasive streptococcal disease', 'HIV', 'Invasive Haemophilus influenzae disease', 'invasive pneumococcal disease', 'Syphilis', 'Cryptococcosis', 'tetanus', 'Whooping cough'] df_prefectures_master
df_prefectures_master.index = ['mie', 'kyoto', 'saga', 'hyogo', 'hokkaido', 'tiba', 'wakayama', 'saitama', 'ooita', 'oosaka', 'nara', 'miyagi', 'miyazaki', 'toyama', 'yamaguti', 'yamagata', 'yamanasi', 'gifu', 'okayama', 'iwate', 'tottori', 'hirosima', 'tokusima', 'ehime', 'aiti', 'niigata', 'tokyo', 'totigi', 'siga','kumamoto', 'isikawa', 'kanagawa', 'fukui', 'fukuoka', 'fukusima', 'akita', 'gunma', 'ibaraki', 'nagasaki', 'nagano', 'aomori', 'sizuoka', 'kagawa', 'kouti', 'tottori', 'kagosima' ]
df_prefectures_master.columns = ['tuberculosis', 'EHEC', 'Hepatitis E', 'Hepatitis A', 'recurrent fever', 'Tsutsugamushi disease', 'Japanese encephalitis', 'Legionellosis', 'Amoebiasis', 'Viral hepatitis', 'CRE', 'Acute encephalitis', 'CJD', 'Severe invasive streptococcal disease', 'HIV', 'Invasive Haemophilus influenzae disease', 'invasive pneumococcal disease', 'Syphilis', 'Cryptococcosis', 'tetanus', 'Whooping cough']
df_prefectures_master

seabornのインポート

次のように入力。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

都道府県ごとの疾患別感染状況をわかりやすくするためにヒートマップでCSVの数値データを可視化。
次のように入力。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
plt.figure(figsize = (15, 6))
cmap = sns.light_palette("#00008b", as_cmap = True)
sns.heatmap(df_prefectures_master, cmap = cmap)
plt.figure(figsize = (15, 6)) cmap = sns.light_palette("#00008b", as_cmap = True) sns.heatmap(df_prefectures_master, cmap = cmap)
plt.figure(figsize = (15, 6))
cmap = sns.light_palette("#00008b", as_cmap = True)
sns.heatmap(df_prefectures_master, cmap = cmap)

一番左側の疾患が結核で右から4番目の濃い色の列が梅毒になります。

一部の地域を除いて梅毒が密集人口の高いところで頻発しておりとりわけと東京での結核と梅毒感染者が多いことがわかります。

PAGE TOP