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

Mukku John Blog

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

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

f:id:MukkuJohn:20160917132923p:plain

ヒストグラムと比較してみると、分布の曲線になっていることが
イメージできます。
f:id:MukkuJohn:20160917133003p:plain

曲線の下部や横の線の輪郭線が邪魔な場合は、
geom_line(stat="density")を使います。*1

ggplot(faithful, aes(x=waiting)) + 
  geom_line(stat = "density") + 
  expand_limits(y=0)

f:id:MukkuJohn:20160917133712p:plain


x軸にマッピングする項目は、
データフレームの1列か、1つのベクトルである必要があります。

ヒストグラムと同様*2に、
データフレームでない項目は、ggplot()の引数に、NULLとベクトルを指定します。

w <- faithful$waiting
ggplot(NULL,aes(x=w)) + geom_density()

f:id:MukkuJohn:20160917134103p:plain


平滑化帯域幅によって、曲線が滑らかになったり、粗く(?)なったりします。
この帯域幅は、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")

f:id:MukkuJohn:20160917134521p:plain

上のグラフは、曲線の端が切れてしまっています。
曲線の端が切れている場合は、x軸の範囲を指定します。

上のグラフ + xlim(35,105)

f:id:MukkuJohn:20160917134705p:plain

fillを指定する事で、塗りつぶしができます。

ggplot(faithful, aes(x=waiting)) +
  geom_density(fill="blue",alpha=.2)+
  xlim(35,105)

f:id:MukkuJohn:20160917134909p:plain


密度曲線は、これらの考察が必要です。

  • 平滑化されすぎていないか
  • 密度曲線がデータの最適なモデルになっていないのか
  • データのサンプルサイズが小さくないか

ヒストグラムと重ねることで
推定した分布(=密度曲線)と、観測値の分布(=ヒストグラム
合わせて確認・考察することができます。

ただ密度曲線の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)

f:id:MukkuJohn:20160917135927p:plain

グループ化した密度曲線

前回の記事*3で、グループ化したヒストグラムを扱いました。
当然ながら、推定した分布である密度曲線も、グループ化して扱います。

ヒストグラムのグループ化と同様に、グループにマッピングする項目は
ファクターでないといけません。

#前記事と同様に、ファクタに変換しラベル付けもしておきます。
library(plyr)
birthwt1 <- birthwt
birthwt1$smoke <- factor(birthwt1$smoke)
birthwt1$smoke <- revalue(birthwt1$smoke,c("0"="No Smoke","1"="Smoke"))

グループ化は、colourfillマッピングします。

#colourにマッピングします
ggplot(birthwt1,aes(x=bwt,colour=smoke)) + 
  geom_density()

f:id:MukkuJohn:20160917140941p:plain

#fillにマッピングします
#塗りつぶしが重なるため、透明度を指定します
ggplot(birthwt1,aes(x=bwt,fill=smoke)) + 
  geom_density(alpha=.3)

f:id:MukkuJohn:20160917141052p:plain


ファセットグリッドを使って、グループ化することもできます。

ggplot(birthwt1,aes(x=bwt)) +
  geom_density() +
  facet_grid(smoke ~ .)

f:id:MukkuJohn:20160917141200p:plain

ファセットグリッドを使うことで、グラフごとに
ヒストグラムと重ねることができます。

ggplot(birthwt1,aes(x=bwt, y=..density..)) +
  geom_histogram(binwidth=200,fill="cornsilk",colour="grey60",size=.2)+
  geom_density()+
  facet_grid(smoke ~ .)

f:id:MukkuJohn:20160917141313p:plain

頻度の折れ線

頻度の折れ線とは、観測値の頻度を表す線です。
つまるところ、ヒストグラムの棒が、線になっているだけです。

geom_freqpoly()を使います。

ggplot(faithful, aes(x=waiting)) + geom_freqpoly()

f:id:MukkuJohn:20160917141721p:plain

ヒストグラムと同じなので、ビンの幅を指定できます。

ggplot(faithful,aes(x=waiting)) + 
  geom_freqpoly(binwidth=4) + theme_bw()

f:id:MukkuJohn:20160917141819p:plain

もちろんヒストグラムと重ねて表示できます。

ggplot(faithful,aes(x=waiting)) +
  geom_histogram(fill="cornsilk",colour="grey60") +
  geom_freqpoly() + 
  theme_bw()

f:id:MukkuJohn:20160917142017p:plain

次回は、箱ひげ図を扱います。

*1:積み上げ面グラフの輪郭線を表示させない手法と同じです。 mukkujohn.hatenablog.com

*2:ヒストグラム作成記事はこちら。 mukkujohn.hatenablog.com

*3:脚注2と同じ記事です。