ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

1つの連続変数をグラフにする(ggplot2パッケージ)[R]

ggplot2パッケージ(tidyverseパッケージに含まれている)のdiamondsデータを使う。

> library(tidyverse)
> head(diamonds)
# A tibble: 6 x 10
  carat cut       color clarity depth table price     x     y     z
  <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1  0.31 Good      E     SI1      63.3  55     544  4.33  4.36  2.75
2  0.8  Very Good H     VS2      59.1  59    2953  6.02  6.07  3.57
3  0.78 Very Good H     VS1      61.9  57.1  2854  5.87  5.95  3.66
4  0.3  Ideal     G     VVS2     61.5  57     684  4.29  4.33  2.65
5  1.5  Good      F     SI2      59.7  61    8181  7.39  7.44  4.43
6  1.2  Very Good E     SI2      61.4  58    6130  6.81  6.88  4.2 
  • carat:重さ(カラット)
  • cut:カットの質(5段階)
  • color:色(7段階)
  • clarity:透明度(8段階)
  • depth \frac{2z}{(x+y)}
  • table:最も幅広い部分に対する最上部の幅
  • price:値段(USD)
  • x, y, z:それぞれ長さ・幅・高さ(mm)

カラット(carat)は連続変数なので、頻度分布を図示する場合はいくつかの階級(bin)に分ける必要がある。

geom_histogram( )を使ってヒストグラムを描く

binsで階級数を、binwidthで階級幅を指定できる。
デフォルトはbins=30

ggplot(data = diamonds, aes(x = carat)) +
  geom_histogram(binwidth = 0.1, 
                 fill = "navy",
                 alpha=0.5)

色や線種で指定できるものは以下のとおり。

  • fill:棒を塗りつぶす色
  • alpha:棒の透過性。0(完全透明)から1(完全不透明)の間で指定。
  • colour:棒の枠線の色
  • linetype:棒の枠線の種類
  • size:棒の枠線の太さ

※ 線については以前まとめた記事があります(2022-07-17 追加)

necostat.hatenablog.jp

図1:ヒストグラム

geom_area( )を使って面グラフを描く

面グラフは折れ線グラフの下を塗りつぶしたもの。
geom_area()を使うときは集計方法としてstat="bin"を指定する必要がある(geom_*stat_*の関係性は後述)。
他の引数はgeom_histogram()を参照。

ggplot(data = diamonds, aes(x = carat)) +
  geom_area(stat = "bin", 
            bins = 50, 
            fill = "deeppink",
            alpha=0.5)

図2:面グラフ

geom_freqplot( )を使って折れ線グラフを描く

面グラフの折れ線部分のみ。
指定する引数はbins, binwidth, colour, linetype, sizeなど。

ggplot(data = diamonds, aes(x = carat)) +
  geom_freqpoly() 

図も省略。

geom_density( )を使って密度プロットを描く

colour, linetype, sizeで線の色などを指定できる(linetype=0あるいはsize=0とすると線は描かない)。
fill, alphaを指定して線の下を塗りつぶすことができる。

ggplot(data = diamonds, aes(x = carat)) +
  geom_density(linetype = 0,
               fill = "seagreen",
               alpha=0.5) 

図3:密度プロット

stat_bin( )との対応しているgeom_*関数

「データの集計方法」と「グラフの形状」は密接に関連していて、前者はstat_*()というレイヤーで、後者はgeom_*()というレイヤーで指定する。
どちらをメインで使ってもいい。他方はメインで使うレイヤーの引数に指定する。
例えば次の2つのコードは同じ意味になる。

geom_area(stat = "bin")

stat_bin(geom = "area")

ちなみにgeom_area()ではデフォルトstat_bin()ではないので、geom_area(stat="bin")と指定しないとエラーが出る。

連続変数を階級に分けるとき(stat_bin())に使用できるグラフの形状(geom=で指定できるもの)は次のようなものがある。

  • "bar":ヒストグラムを描く("histogram"`と指定するわけではないみたい)。
  • "step":ヒストグラムの枠線だけ
  • "area":面グラフ。geom_area()に相当。
  • "line":面グラフの折線部分のみ。geom_freqpoly()に相当。
  • "point":点のみ
  • "text":点の代わりに文字を書く

おわりに

  • 基本的に連続変数はbinを設定して集計・表示する。densityはbinを極限に小さくしたとイメージして理解する。

参考資料

  • 本家ページ:

ggplot2.tidyverse.org

  • geom_*stat_*の関係が詳しくまとめられています

ggplot2のstat_*()関数についてのまとめ - Qiita