第3章ではggplot2を使ったグラフの作り方を紹介しています。


【3-1】ExcelにはないRでグラフを作るメリットと特徴

【3-2】ggplot2でグラフを作る流れを説明します

【3-3】Rのggplot2で散布図を作るgeom_point関数

【3-4】Rのggplot2でヒストグラムを作るgeom_histogram関数

今回は密度曲線を紹介します。

密度曲線は馴染みがないヒストグラムと同じくデータの分布を知るのに有効です。
自分は分布の見やすさや相手の提示のしやすさでいうとヒストグラムより好きです。

1.データの読み込み

今回もggplotパッケージが含まれているtidyverseパッケージを読み込みます。
#tidyverseパッケージを読み込みます。

if(!require(tidyverse)) install.packages("tidyverse", repos = "http://cran.us.r-project.org")

#既にtidyverseパッケージをインストールしている方は以下でもOK

library(tidyverse)

#データ取り込みます。今回はdatという変数にデータを入れます

url <- "https://github.com/mitti1210/myblog/blob/master/heights.csv?raw=true"
dat <- read.csv(url)

このデータはヒストグラムを作る時に作ったデータと同じものを使用しています。



2.密度曲線とは?


山(モード)を知るのに便利


下のグラフは正規分布のような形ではなく山が2個あります。

この山のことを「モード」といい、もしかしたら2つ以上の別の集団が潜んでいるのでは?と考えるヒントをくれます。

スクリーンショット 2019-07-14 22.21.16


ちなみにこの密度曲線を男女で色分けすると下のようになります。

スクリーンショット 2019-07-14 22.21.25
なにもかも「正規分布かどうか!?」だけではなく、純粋にどんな分布になっているかをみることも大切だと思います。


面積が1になる

密度曲線は基本面積が1になります。

スクリーンショット 2019-07-14 22.20.21



棒グラフ・ヒストグラム・密度曲線

棒グラフは棒の長さが平均を示す以外情報を持っていません。
ヒストグラムや密度曲線は棒グラフよりも男性と女性の傾向が把握できます。
個人的には密度曲線の方が見やすく感じます。

スクリーンショット 2019-07-14 22.30.45

3.密度曲線の基本的な作り方

ggplot2でヒストグラムを作る時にはgeom_density関数を使います。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_density(aes(x = 身長), data = dat)
スクリーンショット 2019-07-14 22.22.56
スクリーンショット 2019-07-14 22.20.10


ヒストグラムを作るgeom_histogram関数はbinの幅を決めるbins(binwidth)がありますが、geom_densityにもbw = ○○で先の滑らかさを設定する項目があります。bwの数値が増えるとなめらかになるのがわかります。

スクリーンショット 2019-07-14 22.21.47

このbw=○○はgeom_histogramのbinwidth=○○に対応しています。

スクリーンショット 2019-07-14 22.21.53

設定を変えながらちょうどいい数値を見つけてみてください。


4.先の色を変える

線の色を変えるにはcolor = "○○"を使います。

ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_density(aes(x = 身長), color = "red", data = dat)

スクリーンショット 2019-07-14 22.20.30



5.線の中の入りを塗る

色を塗るにはfill = "○○"を使います。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_density(aes(x = 身長), fill = "red", data = dat)
スクリーンショット 2019-07-14 22.20.39

色を透過させるにはalpha = 0~1の数値をつかいます。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_density(aes(x = 身長), fill = "red", alpha = 0.5, data = dat)
スクリーンショット 2019-07-14 22.20.46

6.グループ毎に色を変える

グループ毎に色を変える場合はaes関数の中にfill = グループを入れます。
上のグラフとfill = ○○の位置が違うことに注目してください。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_density(aes(x = 身長, fill = 性別), alpha = 0.5,  data = dat)
スクリーンショット 2019-07-14 22.20.54


そしてgeom_density関数の特徴なのですが、グループを分けるとそれぞれの面積が1となります。このグラフは女性70人、男性130人で女性の方が少ないのですが、面積はどちらも1なので面積比が人数比と一致していません。

分布をみるにはこれで問題ないのですが、もし面積=人数比にしたい場合はもう1つ処理を加えます。

aes関数の中に y = ..count.. を入れます。そうすることで集計方法が変わります。countの前後に2個ピリオドを入れます。

ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_density(aes(x = 身長, y = ..count..,  fill = 性別), alpha = 0.5,  data = dat)
スクリーンショット 2019-07-14 22.21.01

縦軸がcount(個数)となりヒストグラムと同じ集計方法になります。


8.応用(密度曲線とヒストグラムを重ねる)

密度曲線とヒストグラムを重ねることができます。
以下のサイトを参考にさせていただきました。

データのhistogramと確率密度関数を同時に描きたい


ポイントは2つあります

①ヒストグラムにy = ..density.. を使う
②geom_histgramのbinwidthとgeom_densityのbwを同じ数字にする

ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_histogram(aes(x = 身長, y = ..density.., fill = 性別), position = "nudge", alpha = 0.5, binwidth = 2, data = dat)+
  geom_density(aes(x = 身長, fill = 性別), alpha = 0.5, bw = 2 , data = dat)

スクリーンショット 2019-07-15 0.37.32


9.応用編(グループ毎に別のグラフにする)


facet_gridを使うことでグループ毎にグラフを作ることができます。
facet_grid(縦 ~ 横)という表記をします。

facet_gridについて詳しく知りたい時は【3-4】Rのggplot2でヒストグラムを作るgeom_histogram関数もご参照ください。

ggplot()+
theme_gray(base_family = "HiraKakuPro-W3")+ geom_density(aes(x = 身長, y = ..count.., fill = 性別), alpha = 0.5, data = dat)+
facet_grid(性別 ~ .)

スクリーンショット 2019-07-15 0.57.03



10.まとめ

今回は密度曲線について紹介しました。
密度曲線は棒グラフや箱ひげ図ではわからない分布を見ることができますので、いきなり平均や標準偏差の数値だけで判断するのではなく分布をみる習慣をつけてみてください。


11.参考

Introduction to Data Science

データのhistogramと確率密度関数を同時に描きたい