コロナ感染者数をいろいろな表現で理解してみる¶
- データプロセシング
- 数字と文章で表現
- ドーナッツグラフで表現
- 棒グラフで表現
- インフォグラフィックで表現
- 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]:
wafflechart がlong型のdataframeだと認識してくれないみたいなので、wide型にする。
In [3]:
df2 = pd.pivot_table(df,columns="prefectures",values=["patients","population"])
df2
Out[3]:
東京だけ取り出して、色々な表現をしてみたいと思います。
In [4]:
tokyo = df2["Tokyo"]
tokyo
Out[4]:
人口から患者人数を引いておきます。
In [5]:
tokyo["population"] = tokyo["population"] - tokyo["patients"]
tokyo
Out[5]:
数字と文章の表現¶
基本的には、全部同じデータを違う言い方で表現しています。
ドーナッツグラフ(円グラフ)で表現¶
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]:
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]:
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]:
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()
グラフサイズ変えただけで、だいぶ印象が変わりました。
結局、正解もないわけですが、グラフの作り方だけで印象が大きく異なることがわかりました。