6 トレンドデータ
x軸が時間であったり、連続変数かつ何かしらの説明要因である場合、折れ線グラフ(line graph)を描くのがセオリーである。
library(ggplot2) # 忘れずにパッケージを読み込む
6.1 基本の折れ線グラフ
まずは、gcookbookのaapl
データ(Appleの週ごとの株価データ)を可視化してみよう。
library(gcookbook) # パッケージの読み込み
head(aapl) # 先頭6行
## date adj_price
## 1 1980-12-12 0.023268
## 2 1980-12-19 0.022863
## 3 1980-12-26 0.028731
## 4 1981-01-02 0.027921
## 5 1981-01-09 0.025797
## 6 1981-01-16 0.025089
変数はそれぞれ、
date
:記録日adj_price
:株価
を表している。では、株価の時系列変化をプロットしてみよう。geom_line()
で折れ線グラフを描くことができる。
ggplot(aapl, aes(date, adj_price)) + # x軸にdate、y軸にadj_price
geom_line() # 折れ線グラフ
次は、Rにデフォルトで入っているBOD
(生物化学的酸素要求量に関するデータセット)を可視化してみよう。なお、生物化学的酸素要求量(biochemical oxygen demand; BOD)とは水質指標のことである18。
head(BOD) # 6行しかないのですべて表示される
## Time demand
## 1 1 8.3
## 2 2 10.3
## 3 3 19.0
## 4 4 16.0
## 5 5 15.6
## 6 7 19.8
早速、x
にTime
(時間)、y
にDemand
(BOD)を取って折れ線グラフを描いてみよう。
ggplot(BOD, aes(Time, demand)) + # x軸にTime、y軸にdemand
geom_line() + # 折れ線グラフ
geom_point() # ドットは添えるだけ
なお、ここではgeom_point()
を加えることで、ドットもプロットしている。BOD
のようにデータポイントが少ない場合、折れ線だけでなく、ドットを添えると視覚的に楽になるように思われる(個人的意見だが)。逆に、Figure 6.1のようにデータポイントが多い場合、ドットは不要である。
6.2 グルーピングされた折れ線グラフ
では、例のごとく、折れ線グラフを複数のグループごとに描いてみよう。ここでは、Rにデフォルトで入っているToothGrowth
(モルモットの歯に関するデータセット)を使ってみることにする。早速データを確認してみよう。
head(ToothGrowth) # 先頭6行
## len supp dose
## 1 4.2 VC 0.5
## 2 11.5 VC 0.5
## 3 7.3 VC 0.5
## 4 5.8 VC 0.5
## 5 6.4 VC 0.5
## 6 10.0 VC 0.5
変数はそれぞれ、
len
:モルモットの歯の長さsupp
:ビタミンCの与え方(VC or OJ;アスコルビン酸かオレンジジュース)dose
:ビタミンCの投与量(mg/日)
を表している。ここで、supp
とdose
ごとにlen
の平均値をプロットしてみようと思うのだが、ToothGrowth
には平均値のデータが入っておらず、自分で計算しなくてはならない。そこで、以下のコードを使って、平均値のデータセット(tg_mean
)を新しく作ることにする。なお、今はまだ下のコードの内容を理解できなくても良い19。
library(tidyverse) # データ加工用のパッケージ群を読み込む。色々メッセージが出るだろうが気にしなくて良い。
tg_mean = ToothGrowth %>% # ToothGrowthデータの
group_by(supp, dose) %>% # suppとdoseごとに
summarise(mean = mean(len)) # lenの平均値を計算せよ
tg_mean
## # A tibble: 6 x 3
## # Groups: supp [?]
## supp dose mean
## <fct> <dbl> <dbl>
## 1 OJ 0.5 13.2
## 2 OJ 1 22.7
## 3 OJ 2 26.1
## 4 VC 0.5 7.98
## 5 VC 1 16.8
## 6 VC 2 26.1
mean
はモルモットの歯の長さ(len
)の平均値を表している。
それでは、以下のコードを実行して、supp
ごとにdose
とmean
の関係を可視化してみよう。
ggplot(tg_mean, aes(dose, mean, group = supp)) + # x軸にdose、y軸にmean;group = suppが必要
geom_line()
supp
ごとにdose
とmean
の関係をプロットすることができた。なお、geom_line()
をグルーピングする際には、group
に変数を指定しなければならない(指定しないとどうなるのだろうか? 気になる人は確認してみよう)。
ただし、このままでは見にくいので、折れ線の色(color
)と線種(linetype
)にも変数を指定しよう。また、geom_line()
のsize
で折れ線の太さを調整しよう。
加えて、ドットも付け足しておこう。Chapter 5でも見たように、shape
に変数を指定するとドットの形を変えることができる。また、geom_point()
のsize
でドットの大きさを調整しよう。
ggplot(tg_mean, aes(dose, mean, color = supp, group = supp, linetype = supp, shape = supp)) + # color、linetype、shape = suppを追加
geom_line(size = 1.5) + # sizeで太さを指定
geom_point(size = 5) # ドットは添えるだけ。sizeで大きさを指定
6.3 面グラフ
時間に伴う数量の変化の大きさをグループごとに比較・強調したい際には、面グラフ(area graph; area chart)が向いている。
ここでは、gcookbookのuspopage
(1900〜2002年のアメリカの人口統計)を使ってみよう。
head(uspopage)
## Year AgeGroup Thousands
## 1 1900 <5 9181
## 2 1900 5-14 16966
## 3 1900 15-24 14951
## 4 1900 25-34 12161
## 5 1900 35-44 9273
## 6 1900 45-54 6437
変数はそれぞれ、
Year
:年AgeGroup
:年齢のカテゴリThousands
:人口
を表している。面グラフはgeom_area()
で描くことができる。また、グループごとに色分けするには、fill
に変数を指定すれば良い。
ggplot(uspopage, aes(Year, Thousands, fill = AgeGroup)) + # x軸にYear、y軸にThousands;fill = AgeGroupと指定することで、自動で塗りつぶされる
geom_area() # 面グラフ
6.4 練習問題
ggplot2の
economics
データを使って、失業者数の推移をプロットしてみよう。gcookbookの
worldpop
データをもとに、geom_line()
とgeom_point()
を使い、世界人口の推移をプロットしてみよう。また、世界人口の素値ではなく常用対数をプロットするとどのようになるだろうか?(ヒント:log10(変数)
で常用対数を計算することができる)