I. 行と列(R)

次の数値を表にし、会社別に何人分のワクチン数があるかのバー・プロットを作成します。

日本政府は、ファイザーから年内に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")

II.行と列(Python)

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.