ggplot2パッケージを使って、色んなグラフを作成してみる-2
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)
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)
ggplot2パッケージ
> qplot(mtcars$mpg) stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
どうやらデフォルトですと、ビンの数が30みたいです。
これでは、baseパッケージと比較できないので、ビン数を指定します。
> qplot(mpg,data = mtcars, binwidth = 5)
違いは、このへんでしょうか?
- 背景
- 目盛り
- 横軸の範囲
- 縦軸の説明分(?)
目盛り的には、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)
横軸にはファクタを、縦軸にはベクトルを指定すると勝手に箱ひげ図になります。
ここで箱ひげ図の読み方を。
まず、箱が2つありますが、それぞれ下記を表しています。
- 左側の箱:supp == OJのlenの分布
- 右側の箱:supp == VCのlenの分布
そして、箱のひげの読み方ですが、下の図で説明します。
- データの最大値
- データの第3四分位数
- データの中央値
- データの第1四分位数
- データの最小値
となっています。
四分位数は、データを大きさの順に並べ、4等分する位置です。
そして、その4等分された位置を下から第1四分位数、第2・・・と呼びます。
グラフに戻ります。箱ひげ図は、
baseパッケージでも、それぞれの軸にマッピングするデータが
同じデータフレームオブジェクトに含まれる場合、下記のコマンドでもOKです。
>plot(ToothGrowth$supp,ToothGrowth$len) #上のコマンドと下のコマンドは同じ >boxplot(len~supp,data = ToothGrowth)
複数の変数の相互関係を図示するためには、下記のコマンドを使います。
> boxplot(len~supp + dose, data = ToothGrowth)
VC.1の箱の上に点があります。これは外れ値と呼びます。
外れ値とは、下記の場合に表示されます。
- 上側:第3四分位数に、四分位数の1.5倍を足した値より大きい場合
- 下側:第1四分位数に、四分位数の1.5倍を引いた値より小さい場合
そして、外れ値が存在する場合は、外れ値を除いた範囲で
最大値/最小値が横線で図示されます。
ggplot2パッケージ
> qplot(ToothGrowth$supp, ToothGrowth$len, geom = "boxplot")
違いは、このへんでしょうか?
- 背景
- 目盛り
- 最大値/最小値の横線
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")
むむむ。VC2に外れ値が出てきました。。。
baseパッケージには無かったのに。
どうやら、それぞれのパッケージで分位数の計算方法が異なるようです。
う~ん、これどうなんでしょうね。
同じデータで同じ表現をしているのに、考え方が異なるなんて。。。
統計学にも、目的は同じなんだけど、平行線のまま、統一する意味も意義もない話があるのかな?
関数曲線
こんな関数をプロットします。
baseパッケージ
> curve(x^3 - 5*x,from = -4,to = 4)
このcurve関数は、ユーザ定義の関数もプロットできます。
myfun <- function(x){ x^3 - 5*x } curve(myfun(x), from = -10 , to = 10)
上のグラフに線を追加します。
curve(1-myfun(x), add = TRUE, col = "red")
ggplot2パッケージ
qplot(c(-10,10),fun=myfun,stat="function",geom = "line")
関数を直接プロットする場面ってあるのでしょうか?
とまぁ、色んなグラフを見てきましたが、
次からはそれぞれのグラフを細かく見ていきます。