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()
x軸にマッピングする項目は、
データフレームの1列か、1つのベクトルである必要があります。
データフレームでない項目は、ggplot()の引数に、NULLとベクトルを指定します。
w <- faithful$waiting #最初のグラフと同じ結果になります。 ggplot(NULL,aes(x=w)) + geom_histogram()
デフォルトは30のビン*1に分かれています。
変更するためには、geom_histogram()の引数のbinwidthを指定します。
#ビンの幅を5に設定する ggplot(faithful, aes(x=waiting)) + geom_histogram(binwidth=5, fill="white", colour="black")
#ビンの数を15にする binSize <- diff(range(faithful$waiting)) / 15 ggplot(faithful, aes(x=waiting)) + geom_histogram(binwidth=binSize, fill="white", colour="black")
ヒストグラムは、ビンの幅や数、また、データの境界によって見え方が変わります。
h <- ggplot(faithful, aes(x=waiting))
#ビンの幅を8で、x値の最小値を31から始める #31 -> 39 -> 47 -> … h + geom_histogram(binwidth=8, fill="white", colour="black", origin=31)
#ビンの幅を8で、x値の最小値を35から始める #35 -> 43 -> 51 -> … h + geom_histogram(binwidth=8, fill="white", colour="black", origin=35)
同じビンの幅ですが、どこから開始するかで大きく見え方が変わりました。
うまいこと分布を確認ためには、ビンの幅や境界を模索する必要があるようです。
グループ化したヒストグラム
birthwtデータセットを使います。
グループ化には、ファセットグリッドを使います。
ggplot(birthwt,aes(x=bwt)) + geom_histogram(fill="white", colour="black") + facet_grid(smoke ~ .)
ファセットの指定に、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 ~ .)
ファセットグリッドでのグループ化は、y軸のスケールは全て同じになります。
y軸が同じスケールだと、分布を確認するのがつらい場合があります。
race列でグループ化します。
ggplot(birthwt, aes(x=bwt)) + geom_histogram(fill="white",colour="black") + facet_grid(race ~ .)
真ん中のrace=2のヒストグラムは、分布が分からないですね。
それぞれのヒストグラムで、y軸スケールを独立させるには、
facet_grid()のscales引数にfreeを指定します。
ggplot(birthwt, aes(x=bwt)) + geom_histogram(fill="white",colour="black") + facet_grid(race ~ ., scales = "free")
他のグループ化の方法として、ヒストグラム自体を重ねて表示する方法があります。
smokeでグループ化します。
ggplot(birthwt1, aes(x=bwt,fill=smoke)) + geom_histogram(position = "identity", alpha=0.4)
raceでグループ化します。
ggplot(birthwt1, aes(x=bwt,fill=race)) + geom_histogram(position = "identity", alpha=0.4)
ヒストグラムを重ねて表示するためには、fillに指定する項目が
ファクタであることが条件になります。
次回は、密度曲線を扱います。
*1:任意に区切った区間。この本が分かりやすい。 mukkujohn.hatenablog.com