タグ:グラフ

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


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

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

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

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

【3-5】Rのggplot2で密度曲線を作るgeom_density関数

【3-6】Rのggplot2で箱ひげ図を作るgeom_boxplot関数

【3-7】棒グラフの基本とRのggplot2で棒グラフを作るgeom_bar関数

今回は折れ線グラフを紹介します。

折れ線グラフは時系列の変化を追うのに適しています。

今回は実際のサイトから表を読み込んでグラフを作成します。


1.データの読み込み


今回は気象庁のサイトから東京の平均気温を読み込みます。

スクリーンショット 2019-08-19 0.19.12



webサイトからデータを抜き出すにはrvestパッケージを使います。
以下コードですが、まだ説明していないものが多いのでそのままコピー→実行すると表を読み込めます。

# まだrvestパッケージをインストールしたことなければインストール
install.packages("rvest")
# rvestを呼び出す library(rvest) # urlを指定する
url <- "https://www.data.jma.go.jp/obd/stats/etrn/view/monthly_s3.php?prec_no=44&block_no=47662&year=&month=&day=&view=" #url を読み込む。
h <- read_html(url)
# 読み込んだhtmlの中で"テーブル形式" のものを読み込む tab <- h %>% html_nodes("table")
# 読み込むと5つのtableがあることがわかる。1つずつ確認すると4つ目が目的のtableだった。tableをdata.frame型に変換する。 dat <- tab[[4]] %>% html_table
head(dat)
スクリーンショット 2019-08-19 0.34.09


2.データハンドリング

このデータをグラフにしたいのですが以下の数点が気になります。

スクリーンショット 2019-08-19 16.09.58


「年の値」の列がいらない

一番右にある「年の値」はグラフを作るには必要なさそうです。
いらない列を削除するにはselect関数を使います。





wideデータになっている

【2-5】Rでデータを集計するのに便利なlongデータとgather関数でも紹介しましたが、今回のデータはwideデータになっています。Excelではwideデータでグラフを作成しますが、Rでデータ集計、グラフを作るにはlongデータに変える必要があります。

wideデータをlongデータに変える関数はgather関数です。



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


気温の値に数値ではない値がある

データをよく見ると )] のように数値ではないものが含まれています。

他にもよくみられるのが1,000以上のような , も計算には邪魔です。

試しにstr関数でデータの概要を見てみます。

str(dat)

スクリーンショット 2019-08-19 16.13.21



int : 整数
num : 数値(整数以外も含む)
chr : 文字列

2月と6〜11月は文字列になっているので計算してくれません。
そのため不要な記号を消す必要があります。
まだ紹介していませんが、数値以外の全てを消すparse_number関数というものがあります。


行が多すぎる

str関数に書いてますが145行あります。このままでもグラフは作れますが、今回はデータを間引きます。
行を削除するのはslice関数を使います。

今回は1880,1885,,,,,,2015,2019年を抜き出します。

スクリーンショット 2019-08-19 0.34.09

よく見ると最初の1880年は6行目のようです。

6,11,16,,,,,と抜き出すにはseq関数を使います。

seq(6, 145, 5)
スクリーンショット 2019-08-19 16.40.38

これで6から145までを5間隔で抜き出すことができます。ちなみに2019年は145行目です。

実際のコード


select関数、gather関数、parse_number関数、slice関数、この後グラフを作るggplot2関数は全てtidyverseパッケージに含まれています。

#tidyverseパッケージをインストールしていなければインストール。

install.packages("tidyverse")

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

library(tidyverse)

もしRの基礎を勉強中であれば上のヒントでデータハンドリングを試してみてください。
いくつか方法はありますが、以下1例です。

dat_long <- dat %>% select(-年の値) %>% slice(seq(6, 145, 5), 145) %>% gather(key = 月, value = 気温, -年, factor_key = FALSE) %>% mutate(気温 = parse_number(気温)) %>%
ポイントは以下のとおりです。
・gather関数でlongデータにする前にselect関数,slice関数を使いました。
・gather関数でfactor_key = TRUEをすれば1月,2月,,,となり、入れないと10月,11月,12月,1月,,,となります。
・parse_number関数はgather関数の後で使いました(1列で済むため)。
・parse_number関数はmutate関数とセットで使う

スクリーンショット 2019-08-19 22.10.57

スクリーンショット 2019-08-19 22.15.21

1880年の1月,2月,,,と並んでいませんがグラフ作成に支障はありません。

これでデータの完成です。

3.折れ線グラフの基本的な作り方

折れ線グラフを作る時はgeom_line関数を使います。
aes関数の中でgroupを設定します。

ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年))

スクリーンショット 2019-08-20 11.48.02


もしgroupを指定しないと目的のグラフになりません。

ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温))
スクリーンショット 2019-08-20 11.48.11




4.group毎に色を変える

group毎に色を変えるにはcolor(もしくはcol)を指定します。

ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年, color = 年))
スクリーンショット 2019-08-20 11.47.49

色の薄い最近の方が暑いのがわかります。

今回色がグラデーションになっています。これは年の型がint型(数値)になっているためです。
数値でなくfactorに変換するとグラデーションではなくなります。as.factor関数(もしくはfactor関数)を使います。

ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年, color = as.factor(年)))
スクリーンショット 2019-08-20 11.49.29

数が多すぎてどの色が何年かわからなくなりました・・・
ただgroupの数が少ない時は便利です。


5.グラデーションの色を指定する
グラデーションの色を指定するにはscale_colour_gradientn関数を使います。
scale_color_gradientn(c("最小値の色", "最大値の色"))と指定します。

ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年, color = 年)) + scale_colour_gradientn(colours = c("black", "red"))
スクリーンショット 2019-08-20 11.47.37



最初と最後だけでなく、途中の色も指定できます。
ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年, color = 年)) + scale_colour_gradientn(colours = c("blue", "yellow", "red"))
スクリーンショット 2019-08-20 11.47.21


6.線の色を透過させる

線が重なっているところは新しい線が上書きしています。
第3章では何度も紹介していますが、色の透過はalphaで指定します。groupに関わらず一括で指定するのでaes関数の外で指定します。

ggplot() + theme_gray(base_family = "HiraKakuPro-W3") + geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年, color = 年), alpha = 0.5) + scale_colour_gradientn(colours = c("blue", "yellow", "red"))
スクリーンショット 2019-08-20 11.47.09


ちなみに年を間引かなければこのようになります。

スクリーンショット 2019-08-20 11.43.46


こうみても気温が少しずつ上昇している傾向が伺えます。


7.折れ線グラフに点をつける

もう少しデータを間引き、1880年と2018年のデータだけにします。
dat_long <- 
  dat %>% 
    select(-年の値) %>% 
    slice(6, 144) %>% 
    gather(key = 月, value = 気温, -年, factor_key = TRUE) %>% 
    mutate(気温 = parse_number(気温))


折れ線につける点は折れ線グラフに散布図を重ねます。
散布図は【3-3】Rのggplot2で散布図を作るgeom_point関数で紹介しました。
ggplot() + 
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_line(data = dat_long, aes(x = 月, y = 気温, group = 年, col = as.factor(年)), alpha = 0.5) +
  geom_point(data = dat_long, aes(x = 月, y = 気温, col = as.factor(年)))
スクリーンショット 2019-08-20 15.29.42



上のコードではdata=とaes()の一部が同じです。このように同じデータ、aesを使う場合はggplot()に入れる事ができます。加えてラベルのas.factor(年)の見栄えをlabs関数で変更します。
ggplot(data = dat_long, aes(x = 月, y = 気温, col = as.factor(年))) + 
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_line(aes(group = 年), alpha = 0.5) +
  geom_point() +
  labs(color = "")
スクリーンショット 2019-08-20 19.24.13


8.線のタイプを変更する


線のタイプはlinetypeで指定します。
注意点としてはgeom_point関数のshape時に紹介しましたがfactor型にする必要があります。



ggplot(data = dat_long, aes(x = 月, y = 気温)) + 
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_line(aes(group = as.factor(年), linetype= as.factor(年)), alpha = 0.5) +
  geom_point()
スクリーンショット 2019-08-20 19.26.21

9.数値を入れる場合

数値を追加するにはgeom_text関数が使えますが、数値の位置が点の位置と重なってしまいます。
加えて右のラベルの点とaが重なって見栄えが悪いです。

ggplot(data = dat_long, aes(x = 月, y = 気温, col = as.factor(年))) + 
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_line(aes(group = 年), alpha = 0.5) +
  geom_text(aes(label = 気温)) +
  geom_point()
スクリーンショット 2019-08-20 19.29.02



vjustで上下にずらすことができます。ただそもそも点の位置が近いとどうしても重なります。
ラベルに表示させないためにはshow.legend=FALSEを指定します。

ggplot(data = dat_long, aes(x = 月, y = 気温, col = as.factor(年))) + 
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_line(aes(group = 年), alpha = 0.5) +
  geom_text(aes(label = 気温), vjust = 1.5, show.legend = FALSE) +
  geom_point()
スクリーンショット 2019-08-20 19.28.12




文字が重なって困る時は自動的に場所を調整してくれるgeom_text-repel関数が使えます。

ただgeom_text_repel関数はtidyverseパッケージに入ってません。ggrepelパッケージのインストールが必要です。

#一度も使ったことがなければインストール
install.packages("ggrepel") #インストール後はlibraryで呼び出す
library(ggrepel)
geom_text → geom_text_repelに変更するだけで自動調整してくれます。
ggplot(data = dat_long, aes(x = 月, y = 気温, col = as.factor(年))) + 
  theme_gray(base_family = "HiraKakuPro-W3") +
  geom_line(aes(group = 年), alpha = 0.5) +
  geom_text_repel(aes(label = 気温), show.legend = FALSE) +
  geom_point()
スクリーンショット 2019-08-20 19.26.34




10.まとめ

今回は折れ線グラフの作成について紹介しました。

折れ線グラフではgroupの指定が重要だと感じています。

またRを使ったグラフ作成はデータハンドリングが大半を締めますので、なれない方は第2章を参考にしてください。


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


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

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

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

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

【3-5】Rのggplot2で密度曲線を作るgeom_density関数

今回は箱ひげ図(boxplot)を紹介します。

箱ひげ図は正規分布でないデータやマンホイットニーのU検定などノンパラメトリックの検定で使われます。RコマンダーやEZRでも検定と一緒に箱ひげ図が出てきますが、変数名が日本語だと□□と文字化けしてしまいます。Rstudioでggplot関数を使えば文字化け対策やグループ毎に色を付けるなどきれいなグラフが作れます。

1.データの読み込み

今回もggplotパッケージが含まれているtidyverseパッケージを読み込みます。
#tidyverseパッケージをインストールしていなければインストール。していれば次へ

install.packages("tidyverse")

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

library(tidyverse)

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

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

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



2.箱ひげ図(boxplot)とは?


箱ひげ図は以下のようなグラフです。

スクリーンショット 2019-07-21 23.28.32


棒グラフは「平均値」だけですが、箱ひげ図は「最小値, 第一四分位数, 中央値, 第三四分位数, 最大値」を示します。
また「ひげ」の外にあるデータは「外れ値」として点で表示され、大まかな分布を知ることができます。



3.四分位とは

四分位範囲も含め箱ひげ図で表示されるデータは全て「順位」で決められています。スクリーンショット 2019-07-22 1.00.16

これらはqantile関数で直接求めることができます。



4.箱ひげ図の特徴

(平均ではなく)中央値を比較するのに向いている

箱ひげ図は平均ではなく中央値を表示します。
そのため正規分布でないデータやノンパラメトリックの検定でよく使われます。

スクリーンショット 2019-07-22 1.18.14


簡易的な分布がわかる

棒グラフ±標準偏差ではある程度の分布は示してくれますが、実際今回のデータの最大値・最小値がどうだったのか等は教えてくれません。それに比べ箱ひげ図はある程度の分布を表してくれます。

ただ注意したいのが、データに二峰性の分布があると箱ひげ図でも分布がうまく反映できません。


スクリーンショット 2019-07-22 1.10.06



グラフを使って何を示したいのか?が大切になってきます。


5.箱ひげ図の基本的な作り方

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

6.線の色を変える

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

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


スクリーンショット 2019-07-17 1.12.10


7.中に色をぬる

中の色はfill = ○○を使います。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_boxplot(aes(x = 性別, y = 身長), fill = "red", data = dat)

スクリーンショット 2019-07-17 1.12.19


色を薄くする時はalpha = ○○を使います。
alphaは0〜1の値を選択します。

ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_boxplot(aes(x = 性別, y = 身長), fill = "red", alpha = 0.5, data = dat)


スクリーンショット 2019-07-17 1.12.26


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

グループ毎に色を指定するにはaes関数の中にcolorやfillを入れます。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_boxplot(aes(x = 性別, y = 身長, fill = 性別), alpha = 0.5, data = dat)


スクリーンショット 2019-07-17 1.12.32

9.応用編:グラフを横にする

グラフの向きを横にするにはcoord_flip()を使います。()の中は何も入れません。

ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_boxplot(aes(x = 性別, y = 身長, fill = 性別), alpha = 0.5, data = dat)+
  coord_flip()



スクリーンショット 2019-07-17 1.12.38




10.応用編:ひげ(wisker)の求め方


箱ひげ図は「最小値, 第一四分位数, 中央値, 第三四分位数, 最大値」を示します。
ただ上記のグラフのようにひげは外れ値がなければひげの上端・下端が最大・最小値になるのですが、男性のように外れ値があると髭の長さは上記のどれにも当てはまりません。

もしひげの上端(下端)の値が実際何なんなのか?をこちらの記事で紹介しています。



ひげの上端・下端を求める関数を自作しました。もう少し勉強してみたい方はこちらもご参照ください。


11.まとめ

今回は箱ひげ図を紹介しました。

RコマンダーやEZRで納得の行く箱ひげ図にならなかった場合に是非試してみてください。

第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と確率密度関数を同時に描きたい





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


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

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

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


今回はヒストグラムを紹介します。


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.ヒストグラムとは?

ヒストグラムはデータの分布を確認することができます。

スクリーンショット 2019-07-12 15.00.10
まず1本1本の縦棒のことを"bin"といいます。
これをみると身長140台〜190台の分布で、170cm付近が一番多そうです。
ただ170cmを中心にすると左右対称ではない印象を受けます。



ヒストグラムを見ることでわかることの例

分布がどうなっているか?

分布には正規分布やポワソン分布など様々な分布があります
正規分布かどうかを確認するときにはヒストグラムで直接データを確認することが必要です。
他にも対数正規分布やポワソン分布など色々な分布があります。


外れ値がないか?

とんでもないところにデータがあれば、それが偶然飛び抜けたデータなのか入力ミスなのか確認することをおすすめします。

カテゴリーごとの分布がわかる

もし山が2つある分布だったとします。
その場合、もしかしたら2つ以上の別のグループが潜んでいるかもしれません。
各グループに分けるとそれぞれのグループで正規分布になっているかもしれません。

また各グループごとの比較をするときにも使えます。
下は同じデータですが棒グラフとヒストグラム、どちらが見やすいでしょうか?

スクリーンショット 2019-07-12 15.57.34




2.ヒストグラムの基本的な作り方

ggplot2でヒストグラムを作る時にはgeom_histogram関数を使います。
ggplot()+
theme_gray(base_family = "HiraKakuPro-W3")+
geom_histogram(aes(x = 身長), bins = 30, data = dat)


スクリーンショット 2019-07-12 17.55.09

ヒストグラムのy軸は個数なので指定の必要がありません。

3.bins, binwidthについて

ヒストグラムはbin1つの幅を指定する必要があります。
幅を変えると見え方が変わります。

bins = binの数を指定する
binwidth = binの幅を指定する

何も指定しないと自動的にbins = 30としてグラフを作ります。


スクリーンショット 2019-07-12 14.58.43
binsの数を減らすと1つの幅が広くなることがわかります。


スクリーンショット 2019-07-12 14.58.48
binwidthを増やすと1本の幅が広くなっているのがわかります。

どのbins(またはbinwidth)がいいかは数字を変えグラフをみて傾向を探りながら見つけてみてください。


4.線の色を赤にする

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

binの周りの線の色を変えるにはcolor="○○"で指定します。
代表的な色なら"red"などが使えますが、color = "#FFFFFF"のような指定もできます。


スクリーンショット 2019-07-12 14.58.26


5.binの色を赤にする

binの中の色を変えるにはfillを使います。

ggplot()+
theme_gray(base_family = "HiraKakuPro-W3")+
geom_histogram(aes(x = 身長), fill = "red", bins = 30, data = dat)
スクリーンショット 2019-07-12 14.58.30

6.alpha = ○○でfillの色を薄くする

ここで周りの線の色を黒にした上で、fillの色を薄くします。
色を薄くするときはalpha = ○○で色を薄くすることができます。
alphaは0〜1の値を入力します。

ggplot()+
theme_gray(base_family = "HiraKakuPro-W3")+
geom_histogram(aes(x = 身長), color = "black", fill = "red", alpha = 0.5, bins = 30, data = dat)

スクリーンショット 2019-07-12 14.59.10



7.グループごとで色分けする

グループごとに色分けするときはaes()の中にfill = グループの列名を入れます。

aes関数に関しては前回の記事のでも説明していますので気になる方はをご参照ください。

fillでグループ分けするときはpositionを指定する必要があります。

①position = "stack" 重ねずに積み上げる
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_histogram(aes(x = 身長, fill = 性別), bins = 30, position = "stack", alpha = 0.7,  data = dat)

②position = "nudge" 色を重ねる
色を重ねるときはalpha = で透過率を上げる必要があります。
ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_histogram(aes(x = 身長, fill = 性別), bins = 30, position = "nudge", alpha = 0.7,  data = dat)

スクリーンショット 2019-07-12 20.40.41

スクリーンショット 2019-07-12 14.59.28


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

スクリーンショット 2019-07-13 7.53.20

最後にこのグラフのようにグループ毎にグラフを作る方法を紹介します。

グループ毎にグラフを作るときは主に①facet_grid、②facet_wrapの2つがありますが今回はfacet_gridを紹介します。

facet_grid(縦 ~ 横)という表記をします。

ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+
  geom_histogram(aes(x = 身長, fill = 性別), bins = 30, position = "nudge", alpha = 1,  data = dat)+
  facet_grid(性別 ~ .)

スクリーンショット 2019-07-13 18.59.42

縦に並べるか横に並べるかですが、次の考え方が参考になります。

水平方向の変化を見るグラフは垂直方向、垂直方向の変化を見るグラフは水平方向

今回のヒストグラムは水平方向の変化なので縦に並べる方が比較しやすいことがわかります。


9.まとめ

今回はヒストグラムの基本的な作り方を紹介しました。

最初に「左右対称ではない?」と書きましたが、男性と女性の2つの分布が重なっていることが原因だとわかります。ちなみにこのデータは男性が173±10cm(130人)、女性が157cm±5cm(70人)を組み合わせたデータでした。

統計になれないとExcelで表を作り平均と標準偏差だけ計算して比較したくなりますが、分析する前に分布を確認する習慣のきっかけになれば幸いです。

前回、Rのggplot2を使ってグラフを作成する基本を紹介しました。

今回は散布図を作り方を紹介します。
併せてggplot2を使うのに必要なaes関数にも慣れていきたいと思います。

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/data01.csv?raw=true"
dat <- read.csv(url)


データを確認します。最初の数行を確認するのはhead関数を使います
head(dat)

歩行(0:非自立、1:自立)と氏名、性別、年齢、身長、体重、SIAS(脳卒中の評価)、BBS(バランスの評価)、MMSE(認知機能の評価)が入っています(架空のデータです)。




2.散布図の基本的な作り方

散布図を作るにはgeom_point関数を使います。

スクリーンショット 2019-05-23 0.07.49


今回はp1という変数名に横軸に身長、縦軸に体重の散布図を作成します。
またtheme〜というのはMacで日本語が□□と文字化けしないようにフォントを指定しています。
Windowsではなくて大丈夫(なはず)です。

p1 <- 
  dat %>%
  ggplot()+
    theme_gray(base_family = "HiraKakuPro-W3")+
    geom_point(aes(x = 身長, y = 体重))
p1
もしくは
p1 <- 
  ggplot()+
    theme_gray(base_family = "HiraKakuPro-W3")+
    geom_point(aes(x = 身長, y = 体重), data = dat)
p1

スクリーンショット 2019-05-23 0.30.30


基本はこれで完成です。ただもっと形を変えてみます。

点の色を赤にしてみる

色を変えるにはcolor =○○を使います。
主要な色であれば"red"や"blue"など色名を""で囲みます。
"#00BFC4"などRGBで指定することもできます。

p2 <- 
  ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 身長, y = 体重), color = "red",  data = dat)
p2

スクリーンショット 2019-05-23 0.32.14


点の色を性別で分けてみる

男女別に色分けもできます。
p3 <-
  ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 身長, y = 体重, color = 性別), data = dat)
p3

スクリーンショット 2019-05-23 0.33.39


p2とp3の違いがわかるでしょうか?

スクリーンショット 2019-05-23 0.43.27


ここでaes関数に関してもう少し詳しく説明します。


aes関数について

aes関数はデータフレームの変数名グラフに指定する場合に使います
x軸やy軸はイメージしやすいですが色・形・サイズなどに関しては①変数名の値を使いたければaes関数に入れる②変数名を使わず自分で値を指定したい場合はaes関数に入れないとなります。

スクリーンショット 2019-05-23 0.53.37


これを応用するともっとグラフを変えることができます。


点の大きさを変える。形も変える。

点の大きさはsizeで、形はshapeで指定します。

shapeは番号によって形が選べます。

スクリーンショット 2019-05-22 20.29.48


p4 <-
  ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 身長, y = 体重, color = 性別), size = 3, shape = 3, data = dat)
p4

スクリーンショット 2019-05-23 0.57.45


形を歩行の値で変更する

shapeをaes関数に入れてみます。

p5 <-
  ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 身長, y = 体重, color = 性別, shape = 歩行), size = 3, data = dat)
p5

エラー: A continuous variable can not be mapped to shape

あれっ?エラーが出ました。連続変数はshapeには使えませんよと怒られました

これは歩行が0,1で今のところ連続変数だからです。
確かに上のshapeの番号で1.5といった番号はエラーが出そうです。
なのでこのグラフの中だけ歩行をカテゴリー変数に変えます。factor関数を使います。

p5 <-
  ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 身長, y = 体重, color = 性別, shape = factor(歩行)), size = 3, data = dat)
p5

スクリーンショット 2019-05-23 0.59.20


これでエラーが消えました。ただ凡例がfactor(歩行)なんてなってしまいました。

凡例の名前だけでなく、軸やタイトルの名前を変えてみます。
名前を変えるのはlabs関数です。

p6 <-
  ggplot() +
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 身長, y = 体重, color = 性別, shape = factor(歩行)), size = 3, data = dat)+
  labs(x = "身長", y = "体重", color = "性別", shape = "歩行", title = "散布図", caption = "これは仮想のデータです")
p6
スクリーンショット 2019-05-23 1.01.39
これで変わりました。


横軸がカテゴリー変数の場合

横軸がカテゴリー変数でも散布図は使えます。

p7 <- 
  ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 性別, y = 身長), data = dat)
p7

スクリーンショット 2019-05-23 1.08.50


ただ重なってよくわかりません。このように縦軸や横軸にカテゴリー変数を使う場合は点の位置をずらすとわかりやすくなります。

点を重ならないようにずらすのは2つの方法があります。

①geom_point関数の中でposition = "jitter"を追加する

p8 <- 
  ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_point(aes(x = 性別, y = 身長), position = "jitter", data = dat)
p8

スクリーンショット 2019-05-23 1.09.56


②geom_jitter関数を使う
p9 <- 
  ggplot()+
  theme_gray(base_family = "HiraKakuPro-W3")+ 
  geom_jitter(aes(x = 性別, y = 身長, color = 性別), data = dat)
p9

スクリーンショット 2019-05-23 1.10.04

これで男女の分布の違いが見やすくなりました。



まとめ

今回は散布図について紹介しました。
Rを使った散布図はxとyの値を変えるだけで作れますし、colorやshapeを使うことで更に情報を付け加えることができます。

今回のデータセットは他にも変数があるのでぜひ他の散布図も作成してみてください。

↑このページのトップヘ