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() # 折れ線グラフ
Appleの株価データ。

Figure 6.1: Appleの株価データ。


次は、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

早速、xTime(時間)、yDemand(BOD)を取って折れ線グラフを描いてみよう。

ggplot(BOD, aes(Time, demand)) + # x軸にTime、y軸にdemand
  geom_line() + # 折れ線グラフ
  geom_point() # ドットは添えるだけ
BODの折れ線グラフ。

Figure 6.2: BODの折れ線グラフ。

なお、ここでは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/日)

を表している。ここで、suppdoseごとに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ごとにdosemeanの関係を可視化してみよう。

ggplot(tg_mean, aes(dose, mean, group = supp)) + # x軸にdose、y軸にmean;group = suppが必要
  geom_line()
suppごとにグルーピングされた折れ線グラフ。

Figure 6.3: suppごとにグルーピングされた折れ線グラフ。

suppごとにdosemeanの関係をプロットすることができた。なお、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で大きさを指定
Figure 6.3の折れ線の色と線種をsuppごとに変え、さらにドットを付け足したグラフ。

Figure 6.4: Figure 6.3の折れ線の色と線種をsuppごとに変え、さらにドットを付け足したグラフ。

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() # 面グラフ
アメリカの人口の推移を表した面グラフ。

Figure 6.5: アメリカの人口の推移を表した面グラフ。

6.4 練習問題

  • ggplot2のeconomicsデータを使って、失業者数の推移をプロットしてみよう。

  • gcookbookのworldpopデータをもとに、geom_line()geom_point()を使い、世界人口の推移をプロットしてみよう。また、世界人口の素値ではなく常用対数をプロットするとどのようになるだろうか?(ヒント:log10(変数)で常用対数を計算することができる)


  1. https://ja.wikipedia.org/wiki/生物化学的酸素要求量

  2. データハンドリングなどについては、Chapter 9で詳しく見ることにする。