次の数値を表にし、会社別に何人分のワクチン数があるかのバー・プロットを作成します。
日本政府は、ファイザーから年内に1億4400万回分(7720万人分)の供給を受ける契約を結んでいるほか、英アストラゼネカから1億2000万回分(6000万人分)、米モデルナから5000万回分(2500万人分)の供給契約を結んでいます。さらにファイザーからは、9月末までに追加で5000万回分が追加で供給されると伝えられています。
会社名とワクチン数のtibbleを作成します。tibbleはデータ・フレームの一種ですが、データ・フレームより扱いやすい形式です。
Companyとdosesを列名(varibles)とします。インデクスは会社名となります。Pythonでは、ふつう、列名(observersions)をインデクスと呼びます。
会社名を列名とすることはできません。“Phizer”が2つありますのでエラーになります。
# import a libary
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.3 ✓ purrr 0.3.4
## ✓ tibble 3.0.4 ✓ dplyr 1.0.5
## ✓ tidyr 1.1.2 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
# create a tibble
df <- tibble(
company = c("Phizer", "AstraZeneca", "moderna", "Phizer"),
doses = c(144000000, 120000000, 50000000, 50000000)
)
df
## # A tibble: 4 x 2
## company doses
## <chr> <dbl>
## 1 Phizer 144000000
## 2 AstraZeneca 120000000
## 3 moderna 50000000
## 4 Phizer 50000000
mutate()で、ワクチン数の1/2を集計し、新たにperson列を追加します。
# add a column
df_person <- df %>%
mutate(person = doses/2)
df_person
## # A tibble: 4 x 3
## company doses person
## <chr> <dbl> <dbl>
## 1 Phizer 144000000 72000000
## 2 AstraZeneca 120000000 60000000
## 3 moderna 50000000 25000000
## 4 Phizer 50000000 25000000
グラフを作成します。companyを列名としたので、fill=companyとするだけでcompanyでグループ化されたグラフを作成することができます。
# create a bar plot
ggplot(df_person, aes(x=company, y=person, fill=company)) +
geom_bar(stat="identity")
Iと同じデータ・フレームを作成します。
# import a libary
import pandas as pd
mydic = {'company':['Phizer', 'AstraZeneca', 'moderna', 'Phizer'],
'doses':[144000000, 120000000, 50000000, 50000000]}
mydf = pd.DataFrame(mydic)
mydf['person'] = mydf.doses/2
mydf
## company doses person
## 0 Phizer 144000000 72000000.0
## 1 AstraZeneca 120000000 60000000.0
## 2 moderna 50000000 25000000.0
## 3 Phizer 50000000 25000000.0
Seabornを用いると、Rのggplot2と同じようにhueでcompanyを選ぶだけで会社ごとの合計のグラフを描くことができます。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
sns.set_palette('Set2')
sns.barplot(data=mydf, x="company", y='person', hue='company', ci=None, estimator=sum)
plt.title('How many persons can get vaccinated in Japan?')
plt.xlabel('company')
plt.ylabel('persons')
sns.despine()
plt.show()
表を作成します。
mydf_person = mydf.groupby('company').person.sum()
mydf_person
## company
## AstraZeneca 60000000.0
## Phizer 97000000.0
## moderna 25000000.0
## Name: person, dtype: float64
To be continued.