読者です 読者をやめる 読者になる 読者になる

Mukku John Blog

取り組んでいること を つらつら と

ggplot2パッケージを使って、色んなグラフを作成してみる-2

Rグラフィックスクックブック

R グラフィックス クックブック 2回目

baseパッケージとggplot2パッケージを比べつつ、色んなグラフを作成してみます。
それぞれのグラフに特化した内容は、追って取り扱います。

この記事では、パッケージの違いを目で見て確認するまでにしておきます。
(グラフ作成のコマンド打って、描画されるのを見て、へぇ~と思うまで。)

この記事で対象とするグラフ

ヒストグラム

mtcarsデータセットを利用します。
R: Motor Trend Car Road Tests

> head(mtcars)
                   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

それぞれの軸にプロットする属性は、こちらになります。
横軸:mpg Miles/(US) gallon
縦軸は、mpgをある区間*1で区切った頻度

baseパッケージ
> hist(mtcars$mpg)

f:id:MukkuJohn:20160810211157p:plain
mpgが10~15区間の間にあるデータ数が6個という事になります。

気になるのが、ちょうど15のデータはどちらの区間に入るのか?ですね。

> mtcars[mtcars$mpg == 15, ]
              mpg cyl disp  hp drat   wt qsec vs am gear carb
Maserati Bora  15   8  301 335 3.54 3.57 14.6  0  1    5    8

色々不等号を試した結果、この結果でした。

> nrow(mtcars[10.0 < mtcars$mpg & mtcars$mpg <= 15.0, ])
[1] 6
> nrow(mtcars[15.0 < mtcars$mpg & mtcars$mpg <= 20.0, ])
[1] 12

なので、A~B区間とは、Aより大きい かつ B以下を表しています。

ビンの数を変更するのは、こちら

hist(mtcars$mpg,breaks = 10)

f:id:MukkuJohn:20160810212435p:plain

ggplot2パッケージ
> qplot(mtcars$mpg)
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.

f:id:MukkuJohn:20160810212535p:plain
どうやらデフォルトですと、ビンの数が30みたいです。

これでは、baseパッケージと比較できないので、ビン数を指定します。

> qplot(mpg,data = mtcars, binwidth = 5)

f:id:MukkuJohn:20160810212745p:plain
違いは、このへんでしょうか?

  • 背景
  • 目盛り
  • 横軸の範囲
  • 縦軸の説明分(?)

目盛り的には、baseパッケージの方が見やすいですね。個数が分かりますし。
ビンに含まれるデータの個数も、baseパッケージと同様に、
始点より大きい かつ 終点以下です。

ggplot2パッケージでは、それぞれの軸にマッピングするデータが
同じデータフレームオブジェクトに含まれる場合、下記のコマンドでもOKです。

> qplot(mpg,data = mtcars, binwidth = 5)
#上のコマンドと下のコマンドは同じ
> ggplot(mtcars, aes(x=mpg)) + geom_histogram(binwidth = 5)

箱ひげ図

ToothGrowthデータセットを利用します。
R: The Effect of Vitamin C on Tooth Growth in Guinea Pigs

> head(ToothGrowth)
   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
baseパッケージ
> plot(ToothGrowth$supp,ToothGrowth$len)

横軸にはファクタを、縦軸にはベクトルを指定すると勝手に箱ひげ図になります。
f:id:MukkuJohn:20160810214056p:plain

ここで箱ひげ図の読み方を。
まず、箱が2つありますが、それぞれ下記を表しています。

  • 左側の箱:supp == OJのlenの分布
  • 右側の箱:supp == VCのlenの分布

そして、箱のひげの読み方ですが、下の図で説明します。
f:id:MukkuJohn:20160810215059p:plain

  1. データの最大値
  2. データの第3四分位数
  3. データの中央値
  4. データの第1四分位数
  5. データの最小値

となっています。
四分位数は、データを大きさの順に並べ、4等分する位置です。
そして、その4等分された位置を下から第1四分位数、第2・・・と呼びます。

グラフに戻ります。箱ひげ図は、
baseパッケージでも、それぞれの軸にマッピングするデータが
同じデータフレームオブジェクトに含まれる場合、下記のコマンドでもOKです。

>plot(ToothGrowth$supp,ToothGrowth$len)
#上のコマンドと下のコマンドは同じ
>boxplot(len~supp,data = ToothGrowth)

複数の変数の相互関係を図示するためには、下記のコマンドを使います。

> boxplot(len~supp + dose, data = ToothGrowth)

f:id:MukkuJohn:20160810215946p:plain
VC.1の箱の上に点があります。これは外れ値と呼びます。
外れ値とは、下記の場合に表示されます。

  • 上側:第3四分位数に、四分位数の1.5倍を足した値より大きい場合
  • 下側:第1四分位数に、四分位数の1.5倍を引いた値より小さい場合

そして、外れ値が存在する場合は、外れ値を除いた範囲で
最大値/最小値が横線で図示されます。

ggplot2パッケージ
> qplot(ToothGrowth$supp, ToothGrowth$len, geom = "boxplot")

f:id:MukkuJohn:20160810220057p:plain
違いは、このへんでしょうか?

  • 背景
  • 目盛り
  • 最大値/最小値の横線

ggplot2パッケージでは、それぞれの軸にマッピングするデータが
同じデータフレームオブジェクトに含まれる場合、下記のコマンドでもOKです。

> qplot(supp,len,data = ToothGrowth,geom = "boxplot")
#上のコマンドと下のコマンドは同じ
> ggplot(ToothGrowth, aes(x = supp, y = len)) + geom_boxplot()

複数の変数の相互関係を図示するためには、下記のコマンドを使います。

qplot(interaction(ToothGrowth$supp,ToothGrowth$dose), ToothGrowth$len, geom = "boxplot")

f:id:MukkuJohn:20160810221105p:plain
むむむ。VC2に外れ値が出てきました。。。
baseパッケージには無かったのに。
どうやら、それぞれのパッケージで分位数の計算方法が異なるようです。
う~ん、これどうなんでしょうね。
同じデータで同じ表現をしているのに、考え方が異なるなんて。。。
統計学にも、目的は同じなんだけど、平行線のまま、統一する意味も意義もない話があるのかな?

関数曲線

{ \displaystyle
y = x^3-5x
}
こんな関数をプロットします。

baseパッケージ
> curve(x^3 - 5*x,from = -4,to = 4)

f:id:MukkuJohn:20160810223519p:plain

このcurve関数は、ユーザ定義の関数もプロットできます。

myfun <- function(x){
  x^3 - 5*x
}
curve(myfun(x), from = -10 , to = 10)

f:id:MukkuJohn:20160810225001p:plain

上のグラフに線を追加します。

curve(1-myfun(x), add = TRUE, col = "red")

f:id:MukkuJohn:20160810225028p:plain

ggplot2パッケージ
qplot(c(-10,10),fun=myfun,stat="function",geom = "line")

f:id:MukkuJohn:20160810225110p:plain
関数を直接プロットする場面ってあるのでしょうか?

とまぁ、色んなグラフを見てきましたが、
次からはそれぞれのグラフを細かく見ていきます。

*1:区間をビンと呼びます