Mukku John Blog

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

ggplot2を使って、データ分布を要約する-1

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

ヒストグラム

ヒストグラム - Wikipedia
faithfulデータセットを使います。
ヒストグラムを作成するには、geom_histogram()を使います。

x軸に、waiting列をマッピングします。

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

f:id:MukkuJohn:20160914220416p:plain

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


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

w <- faithful$waiting
#最初のグラフと同じ結果になります。
ggplot(NULL,aes(x=w)) + geom_histogram()

f:id:MukkuJohn:20160914220731p:plain


デフォルトは30のビン*1に分かれています。
変更するためには、geom_histogram()の引数のbinwidthを指定します。

#ビンの幅を5に設定する
ggplot(faithful, aes(x=waiting)) +
  geom_histogram(binwidth=5, fill="white", colour="black")

f:id:MukkuJohn:20160914221337p:plain

#ビンの数を15にする
binSize <- diff(range(faithful$waiting)) / 15
ggplot(faithful, aes(x=waiting)) +
  geom_histogram(binwidth=binSize, fill="white", colour="black")

f:id:MukkuJohn:20160914221447p:plain


ヒストグラムは、ビンの幅や数、また、データの境界によって見え方が変わります。

h <- ggplot(faithful, aes(x=waiting))
#ビンの幅を8で、x値の最小値を31から始める
#31 -> 39 -> 47 -> …
h + geom_histogram(binwidth=8, fill="white", colour="black", origin=31)

f:id:MukkuJohn:20160914221746p:plain

#ビンの幅を8で、x値の最小値を35から始める
#35 -> 43 -> 51 -> …
h + geom_histogram(binwidth=8, fill="white", colour="black", origin=35)

f:id:MukkuJohn:20160914221835p:plain

同じビンの幅ですが、どこから開始するかで大きく見え方が変わりました。
うまいこと分布を確認ためには、ビンの幅や境界を模索する必要があるようです。

グループ化したヒストグラム

birthwtデータセットを使います。
グループ化には、ファセットグリッドを使います。

ggplot(birthwt,aes(x=bwt)) + 
  geom_histogram(fill="white", colour="black") +
  facet_grid(smoke ~ .)

f:id:MukkuJohn:20160914222732p:plain

ファセットの指定に、smokeを指定しましたが、データは、01で表現されています。
そのため、ファセットのラベルも0と1になっています。

ラベル名を付与するには、ファクタにする必要があります。

#バックアップ
birthwt1 <- birthwt
#ファクタに変換
birthwt1$smoke <- factor(birthwt1$smoke)
#ファクタのラベルを付ける関数を使うため
library(plyr)
#ファクタのラベル付け
birthwt1$smoke <- revalue(birthwt1$smoke,c("0"="No Smoke","1"="Smoke"))

ファクタに変換後、再度同じコードでプロットします。

ggplot(birthwt1,aes(x=bwt)) + 
  geom_histogram(fill="white", colour="black") +
  facet_grid(smoke ~ .)

f:id:MukkuJohn:20160914223245p:plain


ファセットグリッドでのグループ化は、y軸のスケールは全て同じになります。
y軸が同じスケールだと、分布を確認するのがつらい場合があります。
race列でグループ化します。

ggplot(birthwt, aes(x=bwt)) + 
  geom_histogram(fill="white",colour="black") +
  facet_grid(race ~ .)

f:id:MukkuJohn:20160914223615p:plain

真ん中のrace=2のヒストグラムは、分布が分からないですね。

それぞれのヒストグラムで、y軸スケールを独立させるには、
facet_grid()のscales引数にfreeを指定します。

ggplot(birthwt, aes(x=bwt)) + 
  geom_histogram(fill="white",colour="black") +
  facet_grid(race ~ ., scales = "free")

f:id:MukkuJohn:20160914223840p:plain

他のグループ化の方法として、ヒストグラム自体を重ねて表示する方法があります。
smokeでグループ化します。

ggplot(birthwt1, aes(x=bwt,fill=smoke)) +
  geom_histogram(position = "identity", alpha=0.4)

f:id:MukkuJohn:20160914223940p:plain

raceでグループ化します。

ggplot(birthwt1, aes(x=bwt,fill=race)) +
  geom_histogram(position = "identity", alpha=0.4)

f:id:MukkuJohn:20160914224442p:plain

ヒストグラムを重ねて表示するためには、fillに指定する項目が
ファクタであることが条件になります。

次回は、密度曲線を扱います。

*1:任意に区切った区間。この本が分かりやすい。 mukkujohn.hatenablog.com