GGally

可視化
Published

October 1, 2026

パッケージの概要

GGallyは、Rの可視化パッケージggplot2を拡張するパッケージです。ggpairs関数やggduo関数で変数同士の箱ひげ図や散布図などを一度に確認したり、ggcorr関数で変数間の相関を確認できます。

library(ggplot2)
library(GGally)
library(insuranceData)
library(tibble)
library(tidyr)
library(knitr)
library(dplyr) # stats,baseの関数がマスクされる

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union

ggpairs関数を利用した可視化

insuranceDataパッケージのAutoBiを題材に、ggpairs関数の利用方法を確認します。

AutoBiデータの各変数説明
変数名 説明
CASENUM 請求案件を識別するケース番号
ATTORNEY 弁護士利用の有無(1=あり, 2=なし)
CLMSEX 請求者の性別(1=男性, 2=女性)
MARITAL 婚姻状況(1=既婚, 2=独身, 3=配偶者と死別, 4=離婚・別居)
CLMINSUR 保険加入状況(1=加入, 2=未加入)
SEATBELT シートベルト着用状況(1=着用, 2=未着用)
CLMAGE 請求者の年齢
LOSS 損失額(千ドル単位)
data(AutoBi)
df <- as_tibble(AutoBi)
df
# A tibble: 1,340 × 8
   CASENUM ATTORNEY CLMSEX MARITAL CLMINSUR SEATBELT CLMAGE   LOSS
     <int>    <int>  <int>   <int>    <int>    <int>  <int>  <dbl>
 1       5        1      1      NA        2        1     50 34.9  
 2      13        2      2       2        1        1     28 10.9  
 3      66        2      1       2        2        1      5  0.33 
 4      71        1      1       1        2        2     32 11.0  
 5      96        2      1       4        2        1     30  0.138
 6      97        1      2       1        2        1     35  0.309
 7     120        1      1       2        2        1     19  3.54 
 8     136        1      2       2        2        1     34  4.88 
 9     152        2      2       2        2        1     61  0.874
10     155        2      1       2        2        1     NA  1.35 
# ℹ 1,330 more rows
summary(df)
    CASENUM         ATTORNEY         CLMSEX         MARITAL     
 Min.   :    5   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.: 8579   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000  
 Median :17453   Median :1.000   Median :2.000   Median :2.000  
 Mean   :17213   Mean   :1.489   Mean   :1.559   Mean   :1.593  
 3rd Qu.:25703   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
 Max.   :34253   Max.   :2.000   Max.   :2.000   Max.   :4.000  
                                 NA's   :12      NA's   :16     
    CLMINSUR        SEATBELT         CLMAGE           LOSS         
 Min.   :1.000   Min.   :1.000   Min.   : 0.00   Min.   :   0.005  
 1st Qu.:2.000   1st Qu.:1.000   1st Qu.:19.00   1st Qu.:   0.640  
 Median :2.000   Median :1.000   Median :31.00   Median :   2.331  
 Mean   :1.908   Mean   :1.017   Mean   :32.53   Mean   :   5.953  
 3rd Qu.:2.000   3rd Qu.:1.000   3rd Qu.:43.00   3rd Qu.:   3.995  
 Max.   :2.000   Max.   :2.000   Max.   :95.00   Max.   :1067.697  
 NA's   :41      NA's   :48      NA's   :189                       

デフォルト設定で実行

ATTORNEYなどをカテゴリ変数に変更したうえで、何も引数を指定せずにggpairs関数を実行(ワーニングなどは非表示にしています。)します。 結果は出力できますが、ggpairs関数では全ての変数同士の組み合わせで結果を表示することから、数が多くなりすぎてしまい、目盛りなども読み取ることができません。

# カテゴリ変数をfactorに変換
df <- df %>%
  mutate(
    ATTORNEY = factor(ATTORNEY, labels = c("Yes", "No")),
    CLMSEX   = factor(CLMSEX, labels = c("Male", "Female")),
    MARITAL  = factor(MARITAL,
                      labels = c("Married", "Single", "Widowed", "Divorced")),
    CLMINSUR = factor(CLMINSUR,
                      labels = c("Yes", "No")),
    SEATBELT = factor(SEATBELT,
                      labels = c("Yes", "No"))
  )

ggpairs(df)

変数を絞って実行

表示される数を減らすため、変数を2つのグループに分けます。ただし、CASENUMはデータ番号となり、特に意味はないため除外します。また、LOSSは重要な項目であるため、どちらの変数グループにも含めます。

ggpairs(df[, c("ATTORNEY", "CLMSEX", "MARITAL","LOSS")])

ggpairs(df[, c("CLMINSUR", "SEATBELT", "CLMAGE", "LOSS")])

表示される数が少なく、前よりも見やすくなりました。ただ、LOSSは一部の数字だけが極端に大きく、傾向を把握しにくくなっているため、対数変換を行います。

df$logLOSS <- log(df$LOSS)

ggpairs(df[, c("ATTORNEY", "CLMSEX", "MARITAL","logLOSS")])

ggpairs(df[, c("CLMINSUR", "SEATBELT", "CLMAGE", "logLOSS")])

LOSSの傾向が確認しやすくなりました。

表示する情報の指定

ggpairsの出力結果は、変数の組み合わせなどに応じて選択されますが、自分で指定することもできます。 指定する際は「情報が表示される領域」と「変数の種類(カテゴリ変数、数値変数など)の組み合わせ」ごとに指定します。「情報が表示される領域」は、対角線の部分(左上から右下まで)と、対角線の上側の部分、下側の部分の3つに区分でき、各区分ごとに出力する内容を指定できます。

  出力位置 指定方法
1   対角線     diag
2   上半分    upper
3   下半分    lower
        組み合わせの種類   指定方法
1           数値変数同士 continuous
2 カテゴリ変数と数値変数      combo
3       カテゴリ変数同士   discrete

各区分ごとに表示する情報を指定します。どのような情報を指定しているかは、コメントに記載しています。 また、見栄えも順次調整していきます。

ggpairs(
  df[, c("ATTORNEY", "CLMSEX", "MARITAL", "logLOSS")],

  upper = list(
    discrete = wrap("count"), # countは件数
    combo = wrap("facetdensity") # facetdensityはカテゴリごとの分布
  ),
  lower = list(
    discrete = wrap("facetbar"), # facetbarはカテゴリごとの棒グラフ
    combo = wrap("box_no_facet") # box_no_facetは箱ひげ図
  ),
  diag = list( 
    continuous = wrap("densityDiag"), # densityDiagは密度曲線
    discrete = wrap("barDiag") # barDiagは棒グラフ
  )
)

背景をホワイトベースに変更

ggpairs(
  df[, c("ATTORNEY", "CLMSEX", "MARITAL", "logLOSS")],

  upper = list(
    discrete = wrap("count"), # countは件数
    combo = wrap("facetdensity") # facetdensityはカテゴリごとの分布
  ),
  lower = list(
    discrete = wrap("facetbar"), # facetbarはカテゴリごとの棒グラフ
    combo = wrap("box_no_facet") # box_no_facetは箱ひげ図
  ),
  diag = list( 
    continuous = wrap("densityDiag"), # densityDiagは密度曲線
    discrete = wrap("barDiag") # barDiagは棒グラフ
  )
) +
  theme_bw() # 背景を白に

ggpairs(
  df[, c("ATTORNEY", "CLMSEX", "MARITAL", "logLOSS")],

  upper = list(
    discrete = wrap("count"), # countは件数
    combo = wrap("facetdensity") # facetdensityはカテゴリごとの分布
  ),
  lower = list(
    discrete = wrap("facetbar"), # facetbarはカテゴリごとの棒グラフ
    combo = wrap("box_no_facet") # box_no_facetは箱ひげ図
  ),
  diag = list( 
    continuous = wrap("densityDiag"), # densityDiagは密度曲線
    discrete = wrap("barDiag") # barDiagは棒グラフ
  )
) +
  theme_bw() + # 背景を白に
  theme(
  axis.text = element_text(size = 7), # 軸メモリのサイズ指定
  strip.text = element_text(size = 7), # パネルタイトルのサイズ指定
)

X軸のメモリを微調整

ggpairs(
  df[, c("ATTORNEY", "CLMSEX", "MARITAL", "logLOSS")],

  upper = list(
    discrete = wrap("count"), # countは件数
    combo = wrap("facetdensity") # facetdensityはカテゴリごとの分布
  ),
  lower = list(
    discrete = wrap("facetbar"), # facetbarはカテゴリごとの棒グラフ
    combo = wrap("box_no_facet") # box_no_facetは箱ひげ図
  ),
  diag = list( 
    continuous = wrap("densityDiag"), # densityDiagは密度曲線
    discrete = wrap("barDiag") # barDiagは棒グラフ
  )
) +
  theme_bw() + # 背景を白に
  theme(
  axis.text = element_text(size = 8), # 軸メモリのサイズ指定
  strip.text = element_text(size = 7), # パネルタイトルのサイズ指定
) +
  theme(
  axis.text.x = element_text(
    angle = 45,
    hjust = 1
  )
) # X軸のメモリを斜めにして、hjustで位置調整

最初に比べると見やすくなってきました。現状でも「各項目(または各項目の組み合わせ)の実現値の件数」や、「ATTORNEY(弁護士利用の有無)で損失額の平均・分布が異なっていること」などが、確認できます。

上半分にある「logLOSSとMARITALの組み合わせ」など、カテゴリが多い項目の結果を見やすくすることには限界があるため、詳細を確認したい場合は変数の組み合わせを絞る(例えば、CLMSEXとlogLOSSだけを確認する)、重要でなさそうなカテゴリを統合(または詳細を確認したい値だけに絞る)することが考えられます。

最後に、損失への影響が大きそうなATTORNEYとlogLOSSだけでggpairs関数を実行した場合の結果や、ATTORNEYの値別に色分けをして、CLMSEXとlogLOSSの関係を確認してみます。

# ATTORNEYとlogLOSSの関係を確認
ggpairs(
  df[, c("ATTORNEY", "logLOSS")],

  upper = list(
    discrete = wrap("count"), # countは件数
    combo = wrap("facetdensity") # facetdensityはカテゴリごとの分布
  ),
  lower = list(
    discrete = wrap("facetbar"), # facetbarはカテゴリごとの棒グラフ
    combo = wrap("box_no_facet") # box_no_facetは箱ひげ図
  ),
  diag = list( 
    continuous = wrap("densityDiag"), # densityDiagは密度曲線
    discrete = wrap("barDiag") # barDiagは棒グラフ
  )
) +
  theme_bw() + # 背景を白に
  theme(
  axis.text = element_text(size = 8), # 軸メモリのサイズ指定
  strip.text = element_text(size = 7), # パネルタイトルのサイズ指定
) +
  theme(
  axis.text.x = element_text(
    angle = 45,
    hjust = 1
  )
) # X軸のメモリを斜めにして、hjustで位置調整

# NAを除いたうえで、ATTORNEYの値で色分けを実施
df_drop_na <- df %>%
  drop_na(ATTORNEY, CLMSEX, logLOSS)

ggpairs(
  df_drop_na[, c("ATTORNEY","CLMSEX", "logLOSS")],
  
  aes(color = ATTORNEY, alpha = 0.5), # ATTORENEYの値で色分け

  upper = list(
    discrete = wrap("count"), # countは件数
    combo = wrap("facetdensity") # facetdensityはカテゴリごとの分布
  ),
  lower = list(
    discrete = wrap("facetbar"), # facetbarはカテゴリごとの棒グラフ
    combo = wrap("box_no_facet") # box_no_facetは箱ひげ図
  ),
  diag = list( 
    continuous = wrap("densityDiag"), # densityDiagは密度曲線
    discrete = wrap("barDiag") # barDiagは棒グラフ
  )
) +
  theme_bw() + # 背景を白に
  theme(
  axis.text = element_text(size = 8), # 軸メモリのサイズ指定
  strip.text = element_text(size = 6), # パネルタイトルのサイズ指定
) +
  theme(
  axis.text.x = element_text(
    angle = 45,
    hjust = 1
  )
) # X軸のメモリを斜めにして、hjustで位置調整