モダンな散布図行列
Text Update: 11/10, 2018 (JST)

データ分析を行うにあたりデータの分布を確認しておくことは重要なポイントのひとつです。データの分布を確認する基本的な方法としては、ヒストグラム、箱ひげ図、散布図などありますが、データ項目が多いとグラフを描くのも一苦労です。そこで、利用したいのが複数の散布図を一度に描く散布図行列(ペアプロット)です。ただ、ペアプロットを描く場合、描くグラフの数がデータ項目数の二乗個になりの処理時間がかかることに注意してください。
 

Packages and Datasets

本ページは標準パッケージ以外に以下の追加パッケージを用いています。
 

Package Version Description
tidyverse 1.2.1 Easily Install and Load the ‘Tidyverse’
GGally 1.4.0 Extension to ‘ggplot2’

 

また、本ページは以下のデータセットを用いています。
 

Dataset Package Version Description
iris datasets 3.4.4 Edgar Anderson’s Iris Data
airquality datasets 3.4.4 New York Air Quality Measurements
diamonds ggplot2 3.1.0 Prices of 50,000 round cut diamonds

 

モダンな散布図行列

GGally::ggpairs関数はggplot2ベースのモダンな相関行列を描く関数です。デフォルトではデータ型に応じた最適なグラフタイプを選択して描画してくれます。GGally::ggscatmatとことなりカテゴリカルデータ(因子型データ)も描画対象となります。
 

iris %>% 
  GGally::ggpairs()

 

GGally::ggscatmatとは異なりggplot2パッケージがベースですのでggplot2パッケージの関数と同様の指定が可能です。例えばSpeciesで層別して色分けしたい場合はggplot2パッケージと同様にggplot2::aes関数を用います。うれしいことに相関係数も層別で計算してくれます。
 

iris %>% 
  GGally::ggpairs(ggplot2::aes(colour = Species, alpha = 0.5))

 

様々なペアプロット

GGally::ggpairs関数は対角の上側(upper)と下側(lower)、対角線上(diag)の三つのエリアに対して以下のパラメータをリスト型で指定することにより様々なペアプロットを描くことが可能です。
 

parameter upper/lower diag 備考
continuous points, smooth, smooth_loess, density, cor, blank densityDiag, barDiag, blankDiag 連続量(数値型)に対するグラフ形式
combo box, box_no_facet, dot, dot_no_facet, facethist, facetdensity, denstrip, blank 連続量(数値型)とカテゴリカルデータ(因子型)の組合わせに対するグラフ形式
discrete facetbar, ratio, blank barDiag, blankDiag カテゴリカルデータ(因子型)に対するグラフ形式
na na, blank naDiag, blankDiag データ全てがNAの場合の表示方法

 
なお、各パラメータのデフォルト値は下表の通りです。
 

parameter upper lower diag
continuous cor points densityDiag
combo box_no_facet facethist
discrete facetbar facetbar barDiag
na na na naDiag

 

continuousパラメータ

continuousは連続量(数値型データ)に対して有効なオプションでupper/lowerdiagに指定できますが、upper/lowerに指定できる値とdiagに指定できる値が下表のように異なります。
 

parameter upper/lower diag
continuous points, smooth, smooth_loess, density, cor, blank densityDiag, barDiag, blankDiag

 
各パラメータ値により該当エリアに下表の描画を行います。
 

パラメータ値 描画内容 備考
points 散布図 lowerのデフォルト値
smooth 散布図+回帰直線(信頼区間付き)
smooth_loess 散布図+回帰線(信頼区間付き)
density 密度分布
cor 相関係数 upperのデフォルト値
blank (描画なし)
densityDiag 密度分布 diagのデフォルト値
barDiag 棒グラフ
blankDiag (描画なし)

 

iris %>% 
  GGally::ggpairs() + 
    ggplot2::ggtitle("upper:cor, lower:points, diag:densityDiag, as default")

iris %>% 
  GGally::ggpairs(upper = list(continuous = "smooth"),
                  lower = list(continuous = "smooth_loess"),
                  diag = list(continuous = "barDiag")) + 
    ggplot2::ggtitle("upper:smooth, lower:smooth_loess, diag:barDiag")

iris %>% 
  GGally::ggpairs(upper = list(continuous = "density"),
                  lower = list(continuous = "blank"),
                  diag = list(continuous = "blankDiag")) +
    ggplot2::ggtitle("upper:density, lower:blank, d:blankDiag")

 

comboパラメータ

comboは連続量データ(数値型データ)とカテゴリカルデータ(因子型データ)の組み合わせに対して有効となるオプションでupper/lowerだけに指定できます。
 

parameter upper/lower diag
combo box, box_no_facet, dot, dot_no_facet, facethist, facetdensity, denstrip, blank (指定不可)

 

パラメータ値 描画内容 備考
box 箱ひげ図(層別区切り付き)
box_no_facet 箱ひげ図 upperのデフォルト値
dot 散布図(層別区切り付き)
dot_no_facet 散布図
facethist ヒストグラム(層別区切り付き) lowerのデフォルト値
facetdensity 密度分布(層別区切り付き)
denstrip 密度ストリップ(グラデーション)
blank (描画なし)

 

iris %>% 
  dplyr::select(Sepal.Length, Species) %>% 
  GGally::ggpairs() + 
    ggplot2::ggtitle("upper:box_no_facet, lower:facethist, as default")

 

iris %>% 
  dplyr::select(Sepal.Length, Species) %>% 
  GGally::ggpairs(upper = list(combo = "box"),
                  lower = list(combo = "facetdensity")) + 
    ggplot2::ggtitle("upper:box, lower:facetdensity")

 

iris %>% 
  dplyr::select(Sepal.Length, Species) %>% 
  GGally::ggpairs(upper = list(combo = "dot"),
                  lower = list(combo = "denstrip")) +
    ggplot2::ggtitle("upper:dot, lower:density")

 

iris %>% 
  dplyr::select(Sepal.Length, Species) %>% 
  GGally::ggpairs(upper = list(combo = "dot_no_facet"),
                  lower = list(combo = "blank")) + 
    ggplot2::ggtitle("upper:dot_no_facet, lower:blank")

 

discreteパラメータ

discreteはカテゴリカルデータ(因子型データ)どうしに対して有効なオプションでupper/lowerdiagに指定できますが、upper/lowerに指定できる値とdiagに指定できる値は異なります。指定した値はタイトルを参照してください。
 

parameter upper/lower diag
discrete facetbar, ratio, blank barDiag, blankDiag

 

set.seed(20)
diamonds %>% 
  dplyr::sample_n(20) %>% 
  dplyr::select(cut, color) %>% 
  GGally::ggpairs() +
    ggplot2::ggtitle("upper:facetbar, lower:facetbar, diag:barDiag, as default")

 

set.seed(20)
ggplot2::diamonds %>%
  dplyr::sample_n(20) %>% 
  dplyr::select(cut, color) %>% 
  GGally::ggpairs(upper = list(discrete = "ratio"),
                  lower = list(discrete = "blank"),
                  diag = list(discrete = "blankDiag")) + 
    ggplot2::ggtitle("upper:ratio, lower:Diag, diag:blankDiag")

 

描画パラメータを変更するには

ヒストグラムの階級幅を変更する

デフォルトで描かれるヒストグラムの階級はggplot2::geom_histgram関数と同じで30分割になっています。階級を変更したい場合はGGally::wrap関数を利用して引数(階級幅や階級数)を指定します。
 

iris %>% 
  dplyr::select(-Petal.Length, -Petal.Width) %>% 
  GGally::ggpairs(upper = list(continuous = "smooth"),
                  lower = list(continuous = "smooth_loess",
                               combo = GGally::wrap("facethist", binwidth = 0.5)),
                  diag = list(continuous = GGally::wrap("barDiag", binwidth = 0.5)),
                  title = "binwidth = 0.5")

 

NAが含まれる場合

データにNAが含まれている場合でも特別な指定をしなくても描画処理をしてくれます。例えばairqualityデータセットには複数の項目にNAが含まれています。
 

airquality %>% 
  head()
## # A tibble: 6 x 6
##   Ozone Solar.R  Wind  Temp Month   Day
## * <int>   <int> <dbl> <int> <int> <int>
## 1    41     190   7.4    67     5     1
## 2    36     118   8      72     5     2
## 3    12     149  12.6    74     5     3
## 4    18     313  11.5    62     5     4
## 5    NA      NA  14.3    56     5     5
## 6    28      NA  14.9    66     5     6

 
airqualityデータセットを用いて描画すると特段のエラーもなく描画できます。

airquality %>% 
  GGally::ggpairs(lower = list(continuous = "smooth_loess"),
                  diag = list(continuous = "barDiag"))

 

参考資料

 


CC BY-NC-SA 4.0 , Sampo Suzuki