코로나바이러스의 연대별 중증율 분석

최근 코로나 바이러스의 정보가 많이 나돌고 있습니다만, 누가 투고했는지 모르는 것 같은 정보라면 올바른지 어떤지 판단이 어렵다고 생각합니다.

진정으로 올바른 정보를 얻으려면 가능한 한 1 차 정보를 직접 분석해야합니다. 이 기사에서는, 홋카이도가 공개하고 있는 양성 환자 속성 데이터 를 사용해, 연대 마다의 중증율을 비교합니다.

데이터 로드



분석에는 Python의 Pandas를 사용합니다. 먼저 Pandas를 가져옵니다.
import pandas as pd

그런 다음 데이터를 읽습니다.
df = pd.read_csv("https://www.harp.lg.jp/opendata/dataset/1369/resource/3132/010006_hokkaido_covid19_patients.csv", encoding="shift-jis")

읽은 데이터는 head 메소드 등으로 확인할 수 있습니다.
df.head()



연대와 중증도의 분류



그런데, 이번은 연대마다의 중증도를 비교해 갑니다. 먼저 현재 데이터에서 어떻게 분류되는지 확인합니다.

우선은 연대부터 보겠습니다.
df["患者_年代"].value_counts()
非公表      231
20代      223
70代      219
60代      202
50代      193
40代      176
80代      163
30代      157
90代       75
10代       33
10未満      16
100代       5
10歳未満      4
高齢者        1
Name: 患者_年代, dtype: int64

대체로, 「~대」로 나누어지고 있습니다만, 일부 표기 흔들림(10 미만과 10세 미만)이나 연령 불상(고령자와 비공표)이 있습니다.

기존 카테고리에서는 분석이 어려워지므로 여기에서 카테고리를 정의하고 각 데이터에 새 카테고리를 할당합니다.

먼저 원래 카테고리가 새 카테고리 중 어느 것에 적용되는지 정의합니다.
age_dict = {
    "10未満": "10代以下",
    "10歳未満": "10代以下",
    "10代": "10代以下",
    "20代": "20代",
    "30代": "30代",
    "40代": "40代",
    "50代": "50代",
    "60代": "60代",
    "70代": "70代",
    "80代": "80代",
    "90代": "90代以上",
    "100代": "90代以上",
    "非公表": "不明",
    "高齢者": "不明"
}

그런 다음 새 범주 열을 DataFrame에 추가합니다.
df["年代カテゴリ"] = [age_dict[key] for key in df["患者_年代"]]

여기서 정의한 연대 카테고리를 바탕으로 중증자수를 집계합니다.

마찬가지로 환자 상태에 대해서도 원래 카테고리를 확인하고 새 카테고리를 정의합니다.
df["患者_状態"].value_counts()
軽症 会話可        1004
−              108
非公表            102
無症状            102
無症状 会話可         97
軽症              88
軽症、会話可          54
中等症 会話可         35
軽症・会話可          30
中等症             29
重症              13
重症 会話不可          9
ベッド上安静、会話可       7
無症状、会話可          5
重傷 会話不可          3
死亡後陽性が判明         2
中等症 会話不可         2
症状なし 会話可         2
ベッド上安静 会話可       1
陰性確認済み           1
軽症 高熱            1
調査中              1
意思疎通程度           1
中等症・会話可          1
Name: 患者_状態, dtype: int64
stat_dict = {
    "重症": "3.重症",
    "重症 会話不可": "3.重症",
    "重傷 会話不可": "3.重症",
    "中等症 会話可": "2.中等症",
    "中等症": "2.中等症",
    "中等症 会話不可": "2.中等症",
    "中等症・会話可": "2.中等症",
    "軽症 会話可": "1.軽症",
    "軽症": "1.軽症",
    "軽症、会話可": "1.軽症",
    "軽症・会話可": "1.軽症",
    "軽症 高熱": "1.軽症",
    "無症状 会話可": "0.症状なし",
    "無症状": "0.症状なし",
    "無症状、会話可": "0.症状なし",
    "症状なし 会話可": "0.症状なし",
    "−": "不明",
    "非公表": "不明",
    "ベッド上安静、会話可": "不明",
    "死亡後陽性が判明": "不明",
    "意思疎通程度": "不明",
    "陰性確認済み": "不明",
    "調査中": "不明",
    "ベッド上安静 会話可": "不明"
}
df["状態カテゴリ"] = [stat_dict[key] for key in df["患者_状態"]]

이것으로 연대 카테고리와 상태 카테고리 할당이 완료되었습니다. 실제로 어떻게 할당되었는지는 head 메소드 등으로 확인할 수 있습니다.
df.head()



연대별 중증자 수 집계



범주가 준비되었으므로 즉시 상태 범주별로 환자 수를 집계합니다. 집계에는 crosstab에 의한 크로스 집계를 채용했습니다.
// matplotlibの日本語化
pip install japanize-matplotlib
import japanize_matplotlib
import seaborn as sns
sns.set(font="IPAexGothic")

pd.crosstab(df["年代カテゴリ"], df["状態カテゴリ"]).apply(
    lambda x: x/sum(x), axis=1
).plot(
    kind="bar",
    logy=True,
    rot=45,
    figsize=(8,4),
    color=["grey", "grey", "orange", "red", "grey"]
).legend(loc="upper left")



전체적으로 중등증, 중증의 수는 적게(10% 미만)이므로, y축을 로그 표시로 했습니다.

코로나바이러스는 젊은이에서는 경증으로 머무르고, 고령자에서는 중증화하기 쉽다고 잘 알려져 있습니다만, 실제로 집계해 보면 확실히 그 경향이 보입니다.

30대까지는 중등증, 중증례는 거의 존재하지 않고, 40대부터 80대에 걸쳐 연령에 비례하여 중증자수의 비율이 분명히 증가하고 있습니다.

요약



이번에는 홋카이도의 코로나 바이러스 양성자 속성 데이터를 이용하여 중증화율이 연령에 비례하여 커지는 것을 확인했습니다.

이와 같이, 나라나 도도부현이 공개하고 있는 1차 데이터를 스스로 분석하는 것으로, 보다 정확한 지견을 얻을 수 있습니다.

오픈 데이터가 반드시 옳다는 것은 아니지만, 가능한 한 정확한 정보를 신속하게 얻기 위한 방법의 하나로서, 이번에 소개한 방법을 시험해 보는 것은 어떨까요?

이상입니다.

좋은 웹페이지 즐겨찾기