infographic-covid







コロナ感染者数をいろいろな表現で理解してみる

  • データプロセシング
  • 数字と文章で表現
  • ドーナッツグラフで表現
  • 棒グラフで表現
  • インフォグラフィックで表現
  • Scatter plotで表現

データプロセシング

必要なライブラリをインポートします。

In [1]:
import matplotlib.pyplot as plt
from pywaffle import Waffle
import pandas as pd
import numpy as np

12月3日時点の県別の累計コロナ患者数と、県別の人口のデータを入手。

In [2]:
df = pd.read_csv("C:\\Users\\Desktop\\covid.csv")
df.head()
Out[2]:
prefectures patients population
0 Japan 151727 126706000
1 Hokkaido 9457 5320000
2 Aomori 315 1278000
3 Iwate 212 1255000
4 Miyagi 1252 2323000

wafflechart がlong型のdataframeだと認識してくれないみたいなので、wide型にする。

In [3]:
df2 = pd.pivot_table(df,columns="prefectures",values=["patients","population"])
df2
Out[3]:
prefectures Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima Gifu Gunma Shizuoka Tochigi Tokushima Tokyo Tottori Toyama Wakayama Yamagata Yamaguchi Yamanashi
patients 10530 90 315 7158 332 320 5901 509 1161 1312 1781 702 182 42344 61 461 478 149 402 377
population 7525000 996000 1278000 6246000 1364000 779000 5107000 1882000 2008000 1960000 3675000 1957000 743000 13724000 565000 1056000 945000 1102000 1383000 823000

2 rows × 48 columns

東京だけ取り出して、色々な表現をしてみたいと思います。

In [4]:
tokyo = df2["Tokyo"]
tokyo
Out[4]:
patients         42344
population    13724000
Name: Tokyo, dtype: int64

人口から患者人数を引いておきます。

In [5]:
tokyo["population"] = tokyo["population"] - tokyo["patients"]
tokyo
Out[5]:
patients         42344
population    13681656
Name: Tokyo, dtype: int64

数字と文章の表現

東京は累計42344人の患者

東京は累計4万人の患者

東京は累計10万人あたり309人の患者

東京は人口1300万人いて累計4万人の患者

東京は累計で人口の0.003%が感染。

基本的には、全部同じデータを違う言い方で表現しています。

ドーナッツグラフ(円グラフ)で表現

In [6]:
fig, ax = plt.subplots(figsize=(5.0, 5.0))
ax.pie(tokyo,labels=tokyo.index,colors=['b','pink'], autopct='%1.1f%%')

# add white circle
centre_circle = plt.Circle((0,0),0.7,color='white', fc='white',linewidth=1.25)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)

plt.show()

私はなんとなく、少ない印象をうけます。どうでしょうか?

棒グラフで表現

In [7]:
fig, ax = plt.subplots(figsize=(5.0, 5.0))
ax.bar("Tokyo",13681656, width=3, label="population",color="pink")
ax.bar("Tokyo",42344, width=3,bottom=13681656,label="patient",color="blue")
plt.show()

私は、円グラフより棒グラフのほうが少ない印象を受けます。

インフォグラフィックで表現

数が大きすぎてエラーが起きるので、桁数を下げてみます。

  • 1つめは、患者数が1になるように42344で割ります。
  • 2つめは、10000で割ります。(1000で割ってもエラーがでるので)
In [8]:
tokyo_div42344 = tokyo.copy()
tokyo_div42344 = tokyo_div42344/42344
tokyo_div42344
Out[8]:
patients        1.000000
population    323.107312
Name: Tokyo, dtype: float64
In [9]:
fig = plt.figure(
    FigureClass=Waffle, 
    rows=20, 
    values=tokyo_div42344, 
    colors=["#8bd3dd", "#f582ae"],
    legend={'loc': 'center'},
    icons=["dizzy","smile"], 
    icon_style=["solid","regular"],
    icon_size=35,
    icon_legend=True,
    figsize=(10, 10)
)
plt.show()
In [10]:
tokyo_div10000 = tokyo.copy()
tokyo_div10000 = tokyo_div10000/10000
tokyo_div10000
Out[10]:
patients         4.2344
population    1368.1656
Name: Tokyo, dtype: float64
In [11]:
fig = plt.figure(
    FigureClass=Waffle, 
    rows=20, 
    values=tokyo_div10000, 
    colors=["#8bd3dd", "#f582ae"],
    legend={'loc': 'center'},
    icons=["dizzy","smile"], 
    icon_style=["solid","regular"],
    icon_size=35,
    icon_legend=True,
    figsize=(100, 100)
)
plt.show()

私は2個目より1個目のほうが、患者が身近にいる印象をうけました。10000の場合は、赤色の面積が圧倒的に多いからでしょうか。

Scatter plotを使って表現

グラフの(1, 1)の間に、人数分の点をランダムに配置します。グレーが非感染者で、赤が感染者です。

In [12]:
fig, ax = plt.subplots(figsize=(1.0, 1.0))
plt.show()

点をランダムに配置するために、xとyの数値を1以内にランダムに発生させます。

In [13]:
healthy_x = np.random.rand(13724000)
healthy_y = np.random.rand(13724000)
patient_y = np.random.rand(42344)
patient_x = np.random.rand(42344)
patient_x
Out[13]:
array([0.68707941, 0.44853013, 0.78553448, ..., 0.3225398 , 0.15360898,
       0.24739492])
In [14]:
fig, ax = plt.subplots(figsize=(10.0, 10.0))
ax.scatter(healthy_x,healthy_y,s=0.01,c="grey")
ax.scatter(patient_x,patient_y,s=0.01,c="red")
ax.axis("off")
plt.show()

多い気がします。でも、東京都の面積を考慮できていませんね。
今度は、桁を1つづつ小さくしていきます。

In [15]:
healthy_x = np.random.rand(1372400)
patient_x = np.random.rand(4234)
healthy_y = np.random.rand(1372400)
patient_y = np.random.rand(4234)
In [16]:
fig, ax = plt.subplots(figsize=(10.0, 10.0))
ax.scatter(healthy_x,healthy_y,s=0.05,c="grey")
ax.scatter(patient_x,patient_y,s=0.05,c="red")
ax.axis("off")
plt.show()
In [17]:
healthy_x = np.random.rand(137240)
patient_x = np.random.rand(423)
healthy_y = np.random.rand(137240)
patient_y = np.random.rand(423)
In [18]:
fig, ax = plt.subplots(figsize=(10.0, 10.0))
ax.scatter(healthy_x,healthy_y,s=0.5,c="grey")
ax.scatter(patient_x,patient_y,s=0.5,c="red")
ax.axis("off")
plt.show()
In [19]:
healthy_x = np.random.rand(13724)
patient_x = np.random.rand(42)
healthy_y = np.random.rand(13724)
patient_y = np.random.rand(42)
In [20]:
fig, ax = plt.subplots(figsize=(10.0, 10.0))
ax.scatter(healthy_x,healthy_y,s=2,c="grey")
ax.scatter(patient_x,patient_y,s=2,c="red")
ax.axis("off")
plt.show()
In [21]:
healthy_x = np.random.rand(1372)
patient_x = np.random.rand(4)
healthy_y = np.random.rand(1372)
patient_y = np.random.rand(4)
In [22]:
fig, ax = plt.subplots(figsize=(10.0, 10.0))
ax.scatter(healthy_x,healthy_y,s=2,c="grey")
ax.scatter(patient_x,patient_y,s=2,c="red")
ax.axis("off")
plt.show()

だいぶ、少なく感じます。
今度はグラフサイズ(figsize=(10,10))から、(5,5)にしてみます。

In [23]:
fig, ax = plt.subplots(figsize=(5.0, 5.0))
ax.scatter(healthy_x,healthy_y,s=2,c="grey")
ax.scatter(patient_x,patient_y,s=2,c="red")
ax.axis("off")
plt.show()
In [24]:
fig, ax = plt.subplots(figsize=(1.0, 1.0))
ax.scatter(healthy_x,healthy_y,s=2,c="grey")
ax.scatter(patient_x,patient_y,s=2,c="red")
ax.axis("off")
plt.show()

グラフサイズ変えただけで、だいぶ印象が変わりました。
結局、正解もないわけですが、グラフの作り方だけで印象が大きく異なることがわかりました。

category