インタラクティブ可視化事例

[1]:
import os

import pandas as pd

import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
[2]:
df = pd.read_pickle("https://github.com/plotly-dash-book/events/raw/plotly/20210112/plotly/data.pickle")
df.iloc[[0]].T
[2]:
通し 1
厚労省NO 1
無症状病原体保有者 NaN
国内 A-1
チャーター便 NaN
年代 30
性別 男性
確定日 2020-01-15 00:00:00
発症日 2020-01-03 00:00:00
受診都道府県 神奈川県
居住都道府県 神奈川県
居住管内 NaN
居住市区町村 NaN
キー 神奈川県
発表 神奈川県
都道府県内症例番号 1
市町村内症例番号 NaN
ステータス 退院
備考 NaN
ソース https://www.mhlw.go.jp/stf/newpage_08906.html
ソース2 https://www.pref.kanagawa.jp/docs/ga4/bukanshi...
ソース3 NaN
人数 1
累計 1.000000
前日比 1.000000
発症数 0.000000
死者合計 NaN
退院数累計 1.000000
退院数 1.000000
PCR検査実施人数 NaN
PCR検査前日比 NaN
職業_正誤確認用 NaN
勤務先_正誤確認用 NaN
Hospital Pref Kanagawa
Residential Pref Kanagawa
Release Kanagawa Prefecture
Gender Male
X 139.642347
Y 35.447504
確定日YYYYMMDD 2020/1/15
受診都道府県コード 14.000000
居住都道府県コード 14.000000
更新日時 12/25/2020 12:04

感染者の位置情報

[3]:
after_oct_df = df.loc[df["確定日"] > "2020-10-01"]

px.set_mapbox_access_token(os.environ["MAPBOX_TOKEN"])
px.scatter_mapbox(
    after_oct_df,
    lat="Y",
    lon="X",
    size="人数",
    size_max=10,
    color="年代",
    hover_data=["性別", "発症日", "受診都道府県", "居住都道府県"],
    animation_frame=after_oct_df["確定日"].map(lambda x: f"{x:%m/%d}"),
    zoom=4,
    center={"lat": 36, "lon": 138},
    title="感染者の居住地",
    width=1000,
    height=800,
)

感染者数の推移(年代別)

[4]:
age_df = (
    df.groupby(["確定日", "年代"]).size().reset_index().rename({0: "感染者数"}, axis=1)
)
age_df.head()
[4]:
確定日 年代 感染者数
0 2020-01-15 30 1
1 2020-01-24 40 1
2 2020-01-25 30 1
3 2020-01-26 40 1
4 2020-01-28 40 2
[5]:
px.bar(
    age_df,
    x="確定日",
    y="感染者数",
    color="年代",
    title="感染者数の推移(年代別)"
).show()
[6]:
prefectures_df = (
    df.groupby(["確定日", "居住都道府県"])
    .size()
    .reset_index()
    .rename({0: "感染者数"}, axis=1)
)
prefectures_df.head()
[6]:
確定日 居住都道府県 感染者数
0 2020-01-15 神奈川県 1
1 2020-01-24 中華人民共和国 1
2 2020-01-25 中華人民共和国 1
3 2020-01-26 中華人民共和国 1
4 2020-01-28 中華人民共和国 2

感染者数の推移(居住都道府県別)

[7]:
px.bar(
    prefectures_df,
    x="確定日",
    y="感染者数",
    color="居住都道府県",
    title="感染者数の推移(居住都道府県別)"
).show()

レンジスライダ/レンジセレクタ

[8]:
fixed_date_sum_df = age_df.groupby("確定日").sum()
fixed_date_sum_df.head()
[8]:
感染者数
確定日
2020-01-15 1
2020-01-24 1
2020-01-25 1
2020-01-26 1
2020-01-28 3
[9]:
line_fig = px.line(fixed_date_sum_df, x=fixed_date_sum_df.index, y="感染者数")
line_fig.update_xaxes(
    rangeslider={"visible": True},
    rangeselector={
        "buttons": [
            {"count": 3, "label": "3m", "step": "month"},
            {"count": 1, "label": "1m", "step": "month"},
            {"count": 7, "label": "7d", "step": "day"},
        ]
    },
)
line_fig.show()

ツリーマップ

[10]:
latest_df = df.loc[
    df["確定日"] == df["確定日"].max(), ["確定日", "居住都道府県", "年代", "性別"]
].dropna()
px.treemap(latest_df, path=["居住都道府県", "年代", "性別"])