2 チュートリアル

2.1 早速手を動かす

まず、データ可視化用のパッケージであるggplot2を読み込んでみよう。パッケージはlibrary(パッケージ名)で読み込むことができる。

library(ggplot2)

# ※シャープ記号より後ろに書かれている内容はただのコメントアウト(=注釈)
# コメントアウトなので何を書いても怒られない
# ハッシュタグではない
# 自分でコードを書くときはメモとして使うようにしよう

チュートリアル用のデータとして、Rにデフォルトで入っているmtcarsを使うことにする。mtcarsは自動車の燃費などに関するデータである(コンソールに?mtcarsと入力すると詳細なヘルプをみることができる)。では、str(データ)で中身を確認してみよう。

str(mtcars) # 中身を確認
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

11の変数(variable)と32の観測値(observation)が記録されている。32行×11列のスプレッドシートがあるのと同じ状態だと考えてほしい。head(データ)で先頭6行のデータを確認してみよう。

head(mtcars) # 先頭6行を確認
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

変数は全部で11個あるが、まずは2つの変数に注目してみよう。その変数は、

  • disp:エンジンの排気量(立方インチ)

  • mpg:燃費(マイル/ガロン)

である。

素朴に思いつくのは、「排気量と燃費の相関関係はどうなっているか?」というものだろう。排気量と燃費はそれぞれ連続変数(continuous variable:量的変数、quantitative variableとも言う)なので、ここは散布図を描くのが妥当そうである。


では、ggplot2における可視化を、手順を追って見ていこう。


1. x軸とy軸にどの変数を対応づけたいかを考える

ggplot2でデータを可視化する際、最初に書かなければいけない基本のコードはggplot(data = データ, aes(x = x軸の変数, y = y軸の変数))である。

ggplot(data = mtcars, aes(x = disp, y = mpg))
背景のみのグラフ。

Figure 2.1: 背景のみのグラフ。

しかし、灰色の背景があるだけでデータはプロットされない。なぜなら、どのようなデザイン2でデータをプロットするかを指示していないからである。つまり、これだけではまだ足りない。


2. どのようなデザインでプロットしたいかを指示する

データをどのようなデザイン(geometry)でプロットしたいかを、geom_xxxx()で指定しなければならない。今回は散布図(データを点としてプロット)なので、geom_point()というコードを使う。

先程のコードに「+」でコードをつなげていくことでプロットできるようになる。

ggplot(data = mtcars, aes(x = disp, y = mpg)) + # コードを読みやすくするため、「+」のところで改行すると良い
  geom_point() # データを点(point)としてデザインするためのコードを追加
散布図。x軸は排気量、y軸は燃費を表している。

Figure 2.2: 散布図。x軸は排気量、y軸は燃費を表している。

完成。基本はこれだけである。

なお、ほとんどのグラフはx軸とy軸から構成されるので、実はコードの中に一々x = dispy = mpgと書く必要はない。また、データについても自明なので、data = mtcarsと書く必要もない。つまり、上のコードは下のように書くこともできる(これ以降、data, x, yは省略する)。

ggplot(mtcars, aes(disp, mpg)) +
  geom_point()
コードは若干違うが、上のFigure 2.2と全く同じ散布図。

Figure 2.3: コードは若干違うが、上のFigure 2.2と全く同じ散布図。


3. 変数を色(や形状)に対応づける

もちろん上の図ができた時点でOKだが、これだけではどうも味気ない。では、ここで一歩進んで、もう1つ変数を加えてみよう。その変数とは、

  • cyl:シリンダーの個数(4, 6, or 8)

である。このとき「シリンダーの個数によって、排気量と燃費の関係は違うのではないか?」ということが思いつく。

それでは、cylによって点の色を変えてみよう。以下のコードを書けばOKである。

ggplot(mtcars, aes(disp, mpg, color = cyl)) + # color = cyl を追加
  geom_point()
シリンダーの個数を点の色に対応づけた散布図。

Figure 2.4: シリンダーの個数を点の色に対応づけた散布図。

aes()color = cylを追加することで、cylを色に対応づけることができた。


しかし、このグラフは厳密には間違っている。どこが間違っているのだろうか? 少し考えてみてほしい。

















答え

図の右側の青いバー(凡例;legend)を見ると、その横にシリンダーの個数が連続変数として1刻みで描かれれている(4,5,6,7,8)。しかし、実際のデータには4,6,8という3種類の値しかない。もちろん個数は連続的なものだが、この場合は離散変数(discrete variable;質的変数、qualitative/categorical/factor variableとも言う)として扱ったほうがデータの表現として妥当だし、見やすくなるだろう3

この場合、cylfactor()でくくると解決する。

ggplot(mtcars, aes(disp, mpg, color = factor(cyl))) + # factor(cyl)に変更
  geom_point()
シリンダー数を離散変数とした上で色に対応づけた散布図。

Figure 2.5: シリンダー数を離散変数とした上で色に対応づけた散布図。

Rでは、factor(変数)とすることで、その変数を離散変数として扱うことができるようになる。その結果、凡例の表示も妥当なものとなった。

2.2 まとめ

このように、ggplot2を使うと、数行のコードでそれなりに見栄えの良い図が描けるようになる。

手順をもう一度おさらいしよう。

1. x軸とy軸にどの変数を対応づけたいかを考える

  • 何(y軸)を何(x軸)に応じてプロットしたいかを考えるのが可視化の第一歩である。

  • これが思いつけば可視化は大体うまくいったようなものである。

2. どのようなデザインでプロットしたいかを指示する

  • データの性質(特に離散変数か連続変数か)に応じてデザインを決める。

  • たとえば「x軸が連続変数でy軸が連続変数なら散布図」というように決める。こういうのは大体コンセンサスが取れている4ので、以降の章でそれを学んでいってほしい。

  • 今回は散布図しか描かなかったが、たとえば散布図の上に回帰直線を重ね書きする、というように、複数の表現を組み合わせてプロットすることも可能である。これは追々見ていくことにする。

3. 変数を色(や形状)に対応づける

  • x軸、y軸以外に追加したい変数がある場合は、色などに対応づける。

  • まずは基本のプロットができるようになることを目指すので、細かい色の調整方法などは後の方で少しだけ解説する。


下に載せているのはあくまでごく一部だが、ggplot2では以下のデザイン(geom_xxxx())を使うことが多い。

geom デザイン
geom_bar() 棒グラフ
geom_line() 折れ線グラフ
geom_point() 散布図、点
geom_errorbar() エラーバー
geom_pointrange() 点+線
geom_histogram() ヒストグラム
geom_density() 密度曲線
geom_boxplot() 箱ひげ図
geom_violin() バイオリンプロット
geom_area() 面グラフ
geom_smooth() 関数のフィッティング
geom_text() テキスト


これもまたごく一部だが、変数はxycolorだけでなく、以下の要素(aes())にも対応づけることができる。

aes() 要素
x x軸
y y軸
color 枠の色
fill 塗りつぶしの色
linetype 線の形
size 線の太さ、点の大きさ
shape 点の形


以降の章では、よく用いる可視化のパターンについて見ていくことにする。


  1. ggplot2において厳密にはレイヤー(layer)などと呼んだりするが、そこら辺は入門段階ではあまり気にしなくて良い。というか、ぶっちゃけ筆者自身も厳密なことはわかっていない。

  2. 変数が連続か離散かという区別は、可視化の上で結構重要なので意識しておくと良い。

  3. これはヒューリスティックであり、時には例外もある。しかし、大体の場合正しい。