ggplot2を使って、データ分布を要約する-2
R グラフィックス クックブック 16回目
ggplot2パッケージを利用して、データ分布を可視化していきます。
利用するデータ
2つのデータセットを使います。
1つ目:R: Old Faithful Geyser Data
間欠泉の噴出時間(eruptions)と次に噴出までの間隔(waiting)です。
> str(faithful) 'data.frame': 272 obs. of 2 variables: $ eruptions: num 3.6 1.8 3.33 2.28 4.53 ... $ waiting : num 79 54 74 62 85 55 88 85 51 85 ... > head(faithful) eruptions waiting 1 3.600 79 2 1.800 54 3 3.333 74 4 2.283 62 5 4.533 85 6 2.883 55
2つ目:
R: Risk Factors Associated with Low Infant Birth Weight
乳幼児の出生時の体重に関わるリスク要因のデータです。
> str(birthwt) 'data.frame': 189 obs. of 10 variables: $ low : int 0 0 0 0 0 0 0 0 0 0 ... $ age : int 19 33 20 21 18 21 22 17 29 26 ... $ lwt : int 182 155 105 108 107 124 118 103 123 113 ... $ race : int 2 3 1 1 1 3 1 3 1 1 ... $ smoke: int 0 0 1 1 1 0 0 0 1 1 ... $ ptl : int 0 0 0 0 0 0 0 0 0 0 ... $ ht : int 0 0 0 0 0 0 0 0 0 0 ... $ ui : int 1 0 0 1 1 0 0 0 0 0 ... $ ftv : int 0 3 1 2 0 0 1 1 1 0 ... $ bwt : int 2523 2551 2557 2594 2600 2622 2637 2637 2663 2665 ... > head(birthwt) low age lwt race smoke ptl ht ui ftv bwt 85 0 19 182 2 0 0 0 1 0 2523 86 0 33 155 3 0 0 0 0 3 2551 87 0 20 105 1 1 0 0 0 1 2557 88 0 21 108 1 1 0 0 1 2 2594 89 0 18 107 1 1 0 0 1 0 2600 91 0 21 124 3 0 0 0 0 0 2622
密度曲線
標本データに基づいた母集団の分布の推定の曲線です。
密度曲線を表示するには、geom_density()を使います。
ggplot(faithful, aes(x=waiting)) + geom_density()
ヒストグラムと比較してみると、分布の曲線になっていることが
イメージできます。
曲線の下部や横の線の輪郭線が邪魔な場合は、
geom_line(stat="density")を使います。*1
ggplot(faithful, aes(x=waiting)) + geom_line(stat = "density") + expand_limits(y=0)
x軸にマッピングする項目は、
データフレームの1列か、1つのベクトルである必要があります。
ヒストグラムと同様*2に、
データフレームでない項目は、ggplot()の引数に、NULLとベクトルを指定します。
w <- faithful$waiting ggplot(NULL,aes(x=w)) + geom_density()
平滑化帯域幅によって、曲線が滑らかになったり、粗く(?)なったりします。
この帯域幅は、adjustを指定することで変更できます。
#帯域幅のデフォルト値は、1 ggplot(faithful, aes(x=waiting)) + geom_line(stat = "density", adjust=.25, colour="red") + geom_line(stat = "density") + geom_line(stat = "density", adjust=2, colour="blue")
上のグラフは、曲線の端が切れてしまっています。
曲線の端が切れている場合は、x軸の範囲を指定します。
上のグラフ + xlim(35,105)
fillを指定する事で、塗りつぶしができます。
ggplot(faithful, aes(x=waiting)) + geom_density(fill="blue",alpha=.2)+ xlim(35,105)
密度曲線は、これらの考察が必要です。
- 平滑化されすぎていないか
- 密度曲線がデータの最適なモデルになっていないのか
- データのサンプルサイズが小さくないか
ヒストグラムと重ねることで
推定した分布(=密度曲線)と、観測値の分布(=ヒストグラム)を
合わせて確認・考察することができます。
ただ密度曲線のy軸と、ヒストグラムのy軸のスケールが合いません。
(上記の密度曲線のy軸を確認してみてください。)
そこで、ヒストグラムを密度曲線に合わせてスケールダウンすることが必要です。
#y=..density..でヒストグラムをスケールダウンしています。 ggplot(faithful,aes(x=waiting,y=..density..))+ geom_histogram(fill="cornsilk",colour="grey60",size=.2)+ geom_density()+ xlim(35,105)
グループ化した密度曲線
前回の記事*3で、グループ化したヒストグラムを扱いました。
当然ながら、推定した分布である密度曲線も、グループ化して扱います。
ヒストグラムのグループ化と同様に、グループにマッピングする項目は
ファクターでないといけません。
#前記事と同様に、ファクタに変換しラベル付けもしておきます。 library(plyr) birthwt1 <- birthwt birthwt1$smoke <- factor(birthwt1$smoke) birthwt1$smoke <- revalue(birthwt1$smoke,c("0"="No Smoke","1"="Smoke"))
グループ化は、colourかfillにマッピングします。
#colourにマッピングします ggplot(birthwt1,aes(x=bwt,colour=smoke)) + geom_density()
#fillにマッピングします #塗りつぶしが重なるため、透明度を指定します ggplot(birthwt1,aes(x=bwt,fill=smoke)) + geom_density(alpha=.3)
ファセットグリッドを使って、グループ化することもできます。
ggplot(birthwt1,aes(x=bwt)) + geom_density() + facet_grid(smoke ~ .)
ファセットグリッドを使うことで、グラフごとに
ヒストグラムと重ねることができます。
ggplot(birthwt1,aes(x=bwt, y=..density..)) + geom_histogram(binwidth=200,fill="cornsilk",colour="grey60",size=.2)+ geom_density()+ facet_grid(smoke ~ .)
頻度の折れ線
頻度の折れ線とは、観測値の頻度を表す線です。
つまるところ、ヒストグラムの棒が、線になっているだけです。
geom_freqpoly()を使います。
ggplot(faithful, aes(x=waiting)) + geom_freqpoly()
ヒストグラムと同じなので、ビンの幅を指定できます。
ggplot(faithful,aes(x=waiting)) + geom_freqpoly(binwidth=4) + theme_bw()
もちろんヒストグラムと重ねて表示できます。
ggplot(faithful,aes(x=waiting)) + geom_histogram(fill="cornsilk",colour="grey60") + geom_freqpoly() + theme_bw()
次回は、箱ひげ図を扱います。
*1:積み上げ面グラフの輪郭線を表示させない手法と同じです。 mukkujohn.hatenablog.com
*2:ヒストグラム作成記事はこちら。 mukkujohn.hatenablog.com
*3:脚注2と同じ記事です。