<jupyter_start><jupyter_text>新型コロナウイルスの感染状況を分析するためのノートブックデータを可視化するために、個人的に作成しているものです。内容の正確性を保証するものではありませんので、ご注意下さい。以下リポジトリでPR受付中です。https://github.com/karaage0703/covid19_memo  データのダウンロードSIGNATEのCOVID-19チャレンジ（フェーズ1）で作成されたオープンデータ（Google Spread Sheet)を用いて分析https://signate.jp/competitions/260<jupyter_code>!wget --no-check-certificate --output-document=data.csv 'https://docs.google.com/spreadsheets/d/10MFfRQTblbOpuvOs_yjIYgntpMGBg592dL8veXoPpp4/export?gid=0&format=csv'<jupyter_output>--2020-04-12 13:20:09--  https://docs.google.com/spreadsheets/d/10MFfRQTblbOpuvOs_yjIYgntpMGBg592dL8veXoPpp4/export?gid=0&format=csv
Resolving docs.google.com (docs.google.com)... 192.168.3.11, 192.168.127.12, 172.16.31.10, ...
Connecting to docs.google.com (docs.google.com)|192.168.3.11|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/csv]
Saving to: ‘data.csv’

data.csv                [ <=>                ]   2.43M  14.0MB/s    in 0.2s    

2020-04-12 13:20:09 (14.0 MB/s) - ‘data.csv’ saved [2548035]<jupyter_text>死亡率と性別の関係SIGNATEのフォーラムの以下の分析例を、Google Colaboratoryで動作するように改変https://signate.jp/competitions/261/discussions/20200401125031-59 データをpandasを使って読み込み、内容を確認する<jupyter_code>import pandas as pd

# SIGNATE COVID-2019 Dataset からデータを読み込み、ステータスと性別を抽出
df = pd.read_csv("data.csv")
df = df[["ステータス","性別"]]

# ステータスのフラグを変換
df["ステータス"] = df["ステータス"].replace({0: '罹患中', 1: '回復', 2: '死亡'})

f = lambda x: '{:.2%}'.format(x)<jupyter_output><empty_output><jupyter_text>ステータス別の人数と割合<jupyter_code>status_cnt = df["ステータス"].value_counts()
status_ratio = df["ステータス"].value_counts(normalize=True).apply(f) 

status_table = pd.concat([status_cnt, status_ratio], axis=1)
status_table.columns= ["人数","割合(%)"]
status_table<jupyter_output><empty_output><jupyter_text>性別の人数と割合<jupyter_code>gender_cnt = df["性別"].value_counts()
gender_ratio = df["性別"].value_counts(normalize=True).apply(f)
 
gender_table = pd.concat([gender_cnt, gender_ratio],  axis=1)
gender_table.columns= ["人数","割合"]
gender_table<jupyter_output><empty_output><jupyter_text>性別による死亡率の違い<jupyter_code>df["ステータス"] = df["ステータス"].replace({'罹患中': '生存', "回復": '生存', 2: '死亡'})
ct = pd.crosstab(df["性別"],df["ステータス"])
ct
print("死亡における男性の割合：{:.0%}".format(ct.loc["男性","死亡"]/ct.loc[:,"死亡"].sum()))<jupyter_output>死亡における男性の割合：69%<jupyter_text>p値の確認<jupyter_code># Fisher's exact test
import scipy.stats as st
_, p = st.fisher_exact(ct[0:2])
print(f'p値 = {p :.3f}')<jupyter_output><empty_output><jupyter_text>Bar Chart Race以下discussionを参考に都道府県別の累積罹患者数推移をBar Chart Raceを使って可視化https://signate.jp/competitions/261/discussions/20200401171320-59 matplotlibの日本語化https://karaage.hatenadiary.jp/entry/2018/12/17/073000<jupyter_code>!pip install japanize-matplotlib
import japanize_matplotlib
import pandas as pd
import datetime
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.animation as animation
#import seaborn as sns
#sns.set(font='Yu Gothic', style='white')
#mpl.rcParams['font.family'] = 'YuGothic'
pref_area = {
    "北海道":"北海道",
    "青森県":"東北",
    "岩手県":"東北",
    "宮城県":"東北",
    "秋田県":"東北",
    "山形県":"東北",
    "福島県":"東北",
    "茨城県":"北関東・甲信",
    "栃木県":"北関東・甲信",
    "群馬県":"北関東・甲信",
    "埼玉県":"南関東",
    "千葉県":"南関東",
    "東京都":"南関東",
    "神奈川県":"南関東",
    "新潟県":"北陸",
    "富山県":"北陸",
    "石川県":"北陸",
    "福井県":"北陸",
    "山梨県":"北関東・甲信",
    "長野県":"北関東・甲信",
    "岐阜県":"東海",
    "静岡県":"東海",
    "愛知県":"東海",
    "三重県":"東海",
    "滋賀県":"近畿",
    "京都府":"近畿",
    "大阪府":"近畿",
    "兵庫県":"近畿",
    "奈良県":"近畿",
    "和歌山県":"近畿",
    "鳥取県":"中国",
    "島根県":"中国",
    "岡山県":"中国",
    "広島県":"中国",
    "山口県":"中国",
    "徳島県":"四国",
    "香川県":"四国",
    "愛媛県":"四国",
    "高知県":"四国",
    "福岡県":"九州",
    "佐賀県":"九州",
    "長崎県":"九州",
    "熊本県":"九州",
    "大分県":"九州",
    "宮崎県":"九州",
    "鹿児島県":"九州",
    "沖縄県":"九州"
}

colors = {
    "北海道":'#7db0dd',
    "東北":'#8bade0',
    "北陸":'#99a9e2',
    "北関東・甲信":'#a6a6e2',
    "南関東":'#b1a2e1',
    "東海":'#c59cdc',
    "近畿":'#d497d3',
    "中国":'#de94c6',
    "四国":'#e393b6',
    "九州":'#e495a5'
}<jupyter_output><empty_output><jupyter_text>データ整形<jupyter_code># SIGNATE COVID-2019 Dataset をダウンロードして【罹患者】のみをCSVファイルとして用意しておく
# 用意したCSVファイルをpd.DataFrameとして読み込む
df = pd.read_csv('data.csv')
df.shape
# 列の絞り込み
df = df.loc[:, ['公表日', '受診都道府県']]
# 公表日か受診都道府県のいずれかが欠損している記録は除外
df.dropna(how='any', inplace=True)
# 公表日をdatetime64型に変換
df['公表日'] = pd.to_datetime(df['公表日'], format='%Y/%m/%d')
# 都道府県フラグ列を追加
df = pd.concat([df, pd.get_dummies(df['受診都道府県'])], axis=1)
df.set_index('公表日', inplace=True)

df.tail()
# 日毎の罹患者公表数を集計
df_count = df.resample('D').sum()
df_count.tail()
# 日毎の罹患者公表数を累積として集計
df_cumsum = df_count.cumsum()
df_cumsum.tail()
# 累積罹患者公表数の多い10都道府県を日毎に集計
patient_report = {}
for _, se in df_cumsum.iterrows():
    patient_report[se.name.date()] = se.sort_values(ascending=False).head(10)
# 例）2020/03/20時点の累積罹患者を表示
patient_report[datetime.date(2020, 3, 20)]<jupyter_output><empty_output><jupyter_text>可視化<jupyter_code># Bar Chart Race描画用の関数の作成
def draw_barchart(date):
    data = patient_report[date].sort_values()
    ax.clear()
    ax.barh(data.index, data.values, color=[colors[pref_area[x]] for x in data.index])
    
    for i, (name, value) in enumerate(zip(data.index, data.values)):
        area = pref_area[name]
        ax.text(value, i, name, size=14, weight=600, ha='right', va='bottom')
        ax.text(value, i-.25, area, size=10, color='#444444', ha='right', va='baseline')
        ax.text(value, i, value, size=14, ha='left',  va='bottom')

    ax.text(1, 0.4, data.name.date(), transform=ax.transAxes,color='#777777', size=38, ha='right', weight=800)
    ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:.0f}'))
    ax.xaxis.set_ticks_position('top')
    ax.tick_params(axis='x', colors='#777777', labelsize=12)
    ax.set_yticks([])
    ax.margins(0, 0.01)
    ax.grid(which='major', axis='x', linestyle='-')
    ax.set_axisbelow(True)
#    plt.xlim(0, 600)
    plt.box(False)
# 例）2020/03/20時点の累積罹患者を表示
fig, ax = plt.subplots(figsize=(15, 8))
draw_barchart(datetime.date(2020, 4, 1))<jupyter_output><empty_output><jupyter_text>アニメGIFを作成するためにimagemagickをインストール参考：https://qiita.com/shinmura0/items/ed96863281637e4fa10c<jupyter_code>!apt-get install imagemagick
# 罹患者推移をgifファイルとして保存
fig, ax = plt.subplots(figsize=(15, 8))
animator = animation.FuncAnimation(fig, draw_barchart, frames=list(patient_report.keys()))
animator.save('output.gif', writer="imagemagick")
from google.colab import files
files.download('output.gif')<jupyter_output><empty_output><jupyter_text>References<jupyter_code><jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.194570821959357, 'fraction_numerical': 0.049590536851683346, 'mean_word_length': 5.516798418972332, 'pattern_counts': {'":': 58, '<': 44, '<?xml version=': 0, '>': 44, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 4, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '395201', 'license': 'MIT', 'n_tokens_mistral': 3665, 'n_tokens_neox': 3638, 'n_words': 352, 'path': 'signate_covid_19.ipynb', 'repo_name': 'Nobukuni-Hyakutake/covid19_memo', 'size': '6604'}