R言語におけるピアソン相関係数行列とスピアマン相関係数行列の例

⚡ スマートサマリー

Rにおけるピアソン相関係数とスピアマン相関係数は、2つの変数がどの程度連動して動くかを測定します。単一のペアの場合はcor()関数を、複数のペアの場合は相関行列を使用します。このチュートリアルでは、Hmiscを用いた有意性検定を追加し、GGallyのヒートマップで結果を視覚化します。

  • 📐 係数範囲: すべての相関関係は-1から1の間にあり、0は線形関係がないことを示し、両極端は完全な線形関係を示します。
  • 📈 ピアソン法: パラメトリックであり、線形関係を測定し、連続変数がほぼ正規分布に従うことを前提としている。
  • 🔢 スピアマン法: ノンパラメトリックであり、順位に基づいて機能し、外れ値や歪んだデータ、順序データに対して頑健である。
  • 🧮 マトリックスビュー: cor(df)はすべてのペアワイズ係数を返し、as.dist()は下三角部分のみを出力します。
  • 🔬 意義: 1組のペアの場合は cor.test()、p値の完全なマトリックスの場合は Hmisc の rcorr() を使用します。
  • 🎨 視覚化: ggcorr() はヒートマップを描画し、ggpairs() は分布と散布図の完全なマトリックスを作成します。

R の相関行列

R の二変量相関

二変量関係は、R の XNUMX つの変数間の関係 (または相関) を表します。このチュートリアルでは、相関の概念について説明し、それを使用して R の XNUMX つの変数間の関係を測定する方法を示します。

R プログラミングにおける相関関係

R プログラミングで XNUMX つの変数間の相関を計算するには、主に XNUMX つの方法があります。

  • ピアソン: パラメトリック相関
  • スピアマン: ノンパラメトリック相関

R のピアソン相関行列

ピアソン相関法は、通常、XNUMX つの変数間の関係の主なチェックとして使用されます。

その 相関係数r と表記される は、 線形 2つの変数xとyの関係。計算方法は以下のとおりです。

R のピアソン相関行列

 

  • R のピアソン相関行列 xの標準偏差は
  • R のピアソン相関行列 は y の標準偏差です

相関の範囲は -1 ~ 1 です。

  • rの値が0に近いか0に等しいということは、xとyの間に線形関係がほとんど、あるいは全くないことを意味する。
  • rの値が1または-1に近づくほど、線形関係は強くなる。

以下のt統計量を用いて、rがゼロと異なるかどうかを検定できます。これは、自由度n-2のスチューデントt分布と比較することで行います。

R のピアソン相関行列

Rにおけるスピアマンのランク相関

順位相関は、観測値を順位順に並べ、順位間の類似度を計算します。順位相関の利点は、外れ値に強く、データの分布に依存しないことです。また、順位相関は順序尺度変数にも適しています。

スピアマンの順位相関係数(ρと表記)も-1から1までの値を取り、両極端に近い値は強い単調相関関係を示します。計算方法は以下のとおりです。

Rにおけるスピアマンのランク相関

分子はxとyの順位間の共分散であり、分母はそれらの標準偏差の積である。

Rでは、どちらもcor()関数で計算され、この関数はx、y、およびmethodの3つの引数を取ります。

cor(x, y, method)

Arguments:

  • x: 最初のベクトル
  • y: XNUMX 番目のベクトル
  • 方法: 相関関係の計算に使用される式。 XNUMX つの文字列値:
    • 「ピアソン」
    • 「ケンダル」
    • 「槍兵」

ベクトルに欠損値が含まれている場合は、オプションの引数を追加できます: use = “complete.obs”

BudgetUK データセットを使用します。 このデータセットは、1980 年から 1982 年までの英国の世帯の予算配分を報告します。1519 の特徴を含む XNUMX の観測結果があり、その中には次のようなものがあります。

  • 食べ物: 食べ物をシェアする 支出をシェアする
  • 燃料: 燃料費をシェアする
  • : 衣料品支出の予算シェア
  • ウォルク: アルコール支出を共有する
  • wtrans: 交通費をシェアする
  • 心配: その他の財支出の割合
  • トテックス: 世帯支出総額 (ポンド)
  • 収入: 世帯純所得の合計
  • 年齢:世帯の年齢
  • 子供: 子どもの数

例:

library(dplyr)
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv"
data <- read.csv(PATH) %>%
    filter(income < 500) %>%
    mutate(log_income = log(income),
           log_totexp = log(totexp),
           children_fac = factor(children, order = TRUE, labels = c("No", "Yes"))) %>%
    select(-c(X, X.1, children, totexp, income))
glimpse(data)

Code 説明

  • 最初にデータをインポートし、dplyr ライブラリの sinners() 関数を使用して確認します。
  • 3つの世帯が500以上の収入を報告しているので、filter(income < 500)でそれらを除外すると、行数が1,519から1,516に減少します。
  • 通貨変数をログに変換するのが一般的です。 これは、外れ値の影響を軽減し、データセットの歪度を軽減するのに役立ちます。

出力:

## Observations: 1,516
## Variables: 10
## $ wfood        <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0...
## $ wfuel        <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0...
## $ wcloth       <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0...
## $ walc         <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0...
## $ wtrans       <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0...
## $ wother       <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0...
## $ age          <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2...
## $ log_income   <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,...
## $ log_totexp   <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,...
## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...

「ピアソン」法と「スピアマン」法を使用して、収入と食糧変数の間の相関係数を計算できます。

cor(data$log_income, data$wfood, method = "pearson")

出力:

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

出力:

## [1] -0.2501252

これをすべての変数ペアに適用する前に、単一の係数をどのように読み取るべきかを明確にしておく価値がある。

相関係数の解釈方法

係数は、その意味を説明できるようになって初めて有用になります。以下の帯は慣例的な読み方を示しており、符号は強度とは別に読み取られます。

rの絶対値 関係の強さ
0.00〜0.19 非常に弱いか、またはまったくない
0.20〜0.39 弱い
0.40〜0.59 穏健派
0.60〜0.79 強い
0.80〜1.00 とても強い

したがって、log_incomeとwfoodの間で先に計算された-0.2467という値は、弱い負の相関関係を示しています。つまり、裕福な世帯ほど、食費に費やす予算の割合がわずかに少ないということです。

すべての係数には、以下の3つの注意点が適用されます。

  • 相関関係は因果関係ではありません。 相関係数rが強いということは、2つの変数が連動して動くことを示し、一方が他方の原因となることを決して示さない。多くの場合、測定されていない第三の変数が両方の変数に影響を与えている。
  • ピアソンは直線しか見えない。 完全なU字型の関係では、相関係数rはほぼゼロになります。数値を鵜呑みにする前に、必ずデータをグラフ化してください。
  • 大きさは重要性よりも重要だ。 1,516件の観測データがある場合、係数が0.06であっても統計的に有意であっても、実際には意味がない可能性がある。

cor.test() を使用して相関の有意性をテストする方法

cor() は係数のみを返します。単一のペアの場合、cor.test() は p 値と信頼区間を 1 つの呼び出しで追加します。

cor.test(data$log_income, data$wfood, method = "pearson")

その出力は、読む価値のある4つの部分から構成されている。

  1. tとdf: 検定統計量とその自由度、n – 2。
  2. p値: 真の相関がゼロである場合に、これほど大きな係数が現れる確率。
  3. 95パーセント信頼区間:真の相関関係の妥当な範囲。この範囲にゼロが含まれていない場合、そのレベルで相関関係は有意である。
  4. サンプル推定値: 係数そのもの。cor() が返すものと同じです。

同じ関数は、引数を1つ変更するだけで、順位に基づくテストを実行します。

# Spearman rank correlation with a p-value
cor.test(data$log_income, data$wfood, method = "spearman")

# One-sided test: is the correlation greater than zero?
cor.test(data$log_income, data$wfood, alternative = "greater")

どちらをいつ使うべきか。 特定のペアを調べる場合は、rcorr() では省略される信頼区間が得られる cor.test() を使用してください。行列全体の p 値を一度に取得する必要がある場合は、上記に示した Hmisc の rcorr() を使用してください。多くのペアをテストすると偽陽性率が上昇するため、大きな行列から結論を出す前に、p.adjust(p_value, method = “BH”) を使用して p 値を調整してください。

R の相関行列

二変量相関は良い出発点だが、多変量解析はより広い視野を与えてくれる。 相関行列 これは、すべての変数と他のすべての変数とのペアワイズ相関を保持する正方形の表です。

cor() 関数は相関行列を返します。 二変量相関との唯一の違いは、どの変数を指定する必要がないことです。 デフォルトでは、R はすべての変数間の相関を計算します。

因子に対して相関を計算することはできないため、データフレームを cor() 関数に渡す前に、すべてのカテゴリ列を削除してください。

相関行列は対称です。これは、対角線上の値が下のものと同じ値を持つことを意味します。 マトリックスの半分を表示すると、より視覚的になります。

children_fac は、cor() が因子に対して操作できないため除外されます。

# the last column of data is a factor level. We don't include it in the code
mat_1 <-as.dist(round(cor(data[,1:9]),2))
mat_1

Code 説明

  • cor(data[, 1:9])9つの数値列の相関行列を計算します。
  • round(…, 2)すべての係数を小数点以下2桁に丸めてください。
  • as.dist()行列は対称なので、下三角部分のみを出力します。

出力:

##            wfood wfuel wcloth  walc wtrans wother   age log_income
## wfuel       0.11                                                  
## wcloth     -0.33 -0.25                                            
## walc       -0.12 -0.13  -0.09                                     
## wtrans     -0.34 -0.16  -0.19 -0.22                               
## wother     -0.35 -0.14  -0.22 -0.12  -0.29                        
## age         0.02 -0.05   0.04 -0.14   0.03   0.02                 
## log_income -0.25 -0.12   0.10  0.04   0.06   0.13  0.23           
## log_totexp -0.50 -0.36   0.34  0.12   0.15   0.15  0.21       0.49

重要なレベル

係数だけでは、その関係が統計的に信頼できるかどうかはわかりません。Hmiscライブラリのrcorr()関数は、すべてのペアのp値を返します。ライブラリは以下からダウンロードできます。 コンダ コードをコピーしてターミナルに貼り付けます。

conda install -c r r-hmisc

rcorr() では、データ フレームを行列として保存する必要があります。 p 値を使用して相関行列を計算する前に、データを行列に変換できます。

library("Hmisc")
data_rcorr <-as.matrix(data[, 1: 9])

mat_2 <-rcorr(data_rcorr)
# mat_2 <-rcorr(as.matrix(data)) returns the same output

リスト オブジェクト mat_2 には XNUMX つの要素が含まれています。

  • r: 相関行列の出力
  • n:観測回数
  • P: p値

XNUMX 番目の要素である p 値に興味があります。 相関係数の代わりに p 値を使用して相関行列を表示するのが一般的です。

p_value <-round(mat_2[["P"]], 3)
p_value

Code 説明

  • mat_2[[“P”]]: p 値は P という要素に保存されます。
  • ラウンド(mat_2[[“P”]], 3): 要素を XNUMX 桁の数字で丸めます

出力:

           wfood wfuel wcloth  walc wtrans wother   age log_income log_totexp
wfood         NA 0.000  0.000 0.000  0.000  0.000 0.365      0.000          0
wfuel      0.000    NA  0.000 0.000  0.000  0.000 0.076      0.000          0
wcloth     0.000 0.000     NA 0.001  0.000  0.000 0.160      0.000          0
walc       0.000 0.000  0.001    NA  0.000  0.000 0.000      0.105          0
wtrans     0.000 0.000  0.000 0.000     NA  0.000 0.259      0.020          0
wother     0.000 0.000  0.000 0.000  0.000     NA 0.355      0.000          0
age        0.365 0.076  0.160 0.000  0.259  0.355    NA      0.000          0
log_income 0.000 0.000  0.000 0.105  0.020  0.000 0.000         NA          0
log_totexp 0.000 0.000  0.000 0.000  0.000  0.000 0.000      0.000         NA

R での相関行列の視覚化

ヒートマップは、相関行列を読み取るもう一つの方法です。GGallyライブラリはggplot2を拡張したもので、condaではなくCRANからインストールされます。

install.packages("GGally")

相関行列の視覚化

このライブラリには、すべての変数の相関や分布などの要約統計を表示するためのさまざまな関数が含まれています。 マトリックス.

ggcorr() 関数には多くの引数があります。 チュートリアルで使用する引数のみを紹介します。

ggcorr 関数

ggcorr(df, method = c("pairwise", "pearson"),
  nbreaks = NULL, digits = 2, low = "#3B9AB2",
  mid = "#EEEEEE", high = "#F21A00",
  geom = "tile", label = FALSE,
  label_alpha = FALSE)

引数:

  • df: 使用したデータセット
  • 方法: 相関を計算する式。デフォルトでは、ペアワイズとピアソンが計算されます。
  • nbreaks: 係数の色のカテゴリ範囲を返します。 デフォルトでは、切れ目はなく、色のグラデーションは連続的です。
  • 数字: 相関係数を四捨五入します。 デフォルトでは 2 に設定されます
  • 低いです: 発色の下位レベルを制御します。
  • ミッド: 発色の中間レベルを制御します
  • 高いです: 高度な発色をコントロールします。
  • ジオム: 幾何学的引数の形状を制御します。 デフォルトでは「タイル」
  • ラベル: ブール値。 ラベルを表示するかどうか。 デフォルトでは、「FALSE」に設定されます。

基本的なヒートマップ

パッケージの最も基本的なプロットはヒート マップです。グラフの凡例には -1 から 1 までのグラデーション カラーが表示され、暖色は強い正の相関関係を示し、寒色は負の相関関係を示します。

library(GGally)
ggcorr(data)

Code 説明

  • ggcorr(データ): 必要な引数は XNUMX つだけで、それはデータ フレーム名です。 因子水準変数はプロットには含まれません。

出力:

基本的なヒートマップ

ヒート マップにコントロールを追加する

グラフにさらにコントロールを追加できます。

ggcorr(data,
    nbreaks = 6,
    low = "steelblue",
    mid = "white",
    high = "darkred",
    geom = "circle")

Code 説明

  • nbreaks=6: 6 ランクで伝説を打ち破る。
  • 低 = 「スチールブルー」: 負の相関がある場合は明るい色を使用します。
  • ミッド = 「白」: 中間範囲の相関には白色を使用します
  • 高い = 「暗い」: 正の相関を示すには暗い色を使用します
  • ジオム = 「円」: ヒート マップのウィンドウの形状として円を使用します。円のサイズは相関の絶対値に比例します。

出力:

ヒート マップにコントロールを追加する

ヒートマップへのラベルの追加

GGally を使用すると、ウィンドウ内にラベルを追加できます。

ggcorr(data,
    nbreaks = 6,
    label = TRUE,
    label_size = 3,
    color = "grey50")

Code 説明

  • ラベル = TRUE: ヒート マップ内に相関係数の値を追加します。
  • カラー = “グレー50”: 色を選択します (例: グレー)
  • ラベルサイズ = 3: ラベルのサイズを 3 に設定します。

出力:

ヒートマップへのラベルの追加

ggpairs 関数

GGallyライブラリにはggpairs()関数もあり、これはプロットのマトリックスを返します。k個の変数を選択した場合、結果はak×kのグリッドになります。対角線は各変数の分布を示し、対角線の上と下のパネルにはそれぞれ異なる計算結果を表示できます。構文は次のとおりです。

ggpairs(df, columns = 1:ncol(df), title = NULL,
    upper = list(continuous = "cor"),
    lower = list(continuous = "smooth"),
    mapping = NULL)		

引数:

  • df: 使用したデータセット
  • コラム: プロットを描画する列を選択します
  • タイトル:タイトルを入れる
  • アッパー: プロットの対角線より上のボックスを制御します。返す計算またはグラフの種類を指定する必要があります。continuous = “cor” の場合、R に相関を計算するように指示します。引数はリストである必要があることに注意してください。他の引数も利用可能です。 GGallyのドキュメント をご覧ください。
  • 下側: 対角線の下のボックスを制御します。
  • 地図ping:グラフの美しさを示します。 たとえば、さまざまなグループのグラフを計算できます。

ggpairとgrouを用いた二変量解析ping

次のグラフは XNUMX つの情報をプロットしています。

  • 世帯に子供がいるかどうかによってグループ化された log_totexp、log_income、age、および wtrans 変数の間の相関行列。
  • 各変数の分布をグループごとにプロットする
  • グループごとの傾向を含む散布図を表示します
library(ggplot2)
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor",
        size = 3)),
    lower = list(continuous = wrap("smooth",
        alpha = 0.3,
        size = 0.1)),
    mapping = aes(color = children_fac))

Code 説明

  • columns = c(“log_totexp”, “log_income”, “年齢”, “wtrans”): グラフに表示する変数を選択します
  • title = 「英国家計の収入支出の二変量分析」:タイトルを追加します
  • アッパー = リスト(): グラフの上部を制御します。 つまり対角線上
  • 連続 = Wrap(“cor”, サイズ = 3)): 相関係数を計算します。 グラフの美しさを制御するために、引数Continuousをwrap()関数内にラップします(すなわち、size = 3)。 - lower = list(): グラフの下部分を制御します。 つまり、対角線より下です。
  • 連続 = ラップ(「スムーズ」、アルファ = 0.3、サイズ = 0.1): 線形傾向の散布図を追加します。 グラフの美しさを制御するために、引数Continuousをwrap()関数内にラップします(すなわち、size=0.1、alpha=0.3)。
  • 地図ping = aes(color = children_fac): 子どものいない世帯の場合は「いいえ」、子どものいる世帯の場合は「はい」とラベル付けされた順序付き因子children_facで各パネルを分割します。

出力:

ggpairとGrouを用いた二変量解析ping

部分グループを用いたggpairによる二変量解析ping

下のグラフは少し違います。地図の位置を変えています。ping 上位引数の内部。

ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"),
    title = "Bivariate analysis of revenue expenditure by the British household",
    upper = list(continuous = wrap("cor",
            size = 3),
        mapping = aes(color = children_fac)),
    lower = list(
        continuous = wrap("smooth",
            alpha = 0.3,
            size = 0.1))
)

Code 説明

  • 以下の点を除き、前の例とまったく同じコードです。
  • 地図ping = aes(color = children_fac): リストを upper = list() に移動します。グラフの上部では、グループごとに計算結果を積み重ねたいだけです。

出力:

ggpairを用いた部分グループによる二変量解析ping

Rにおける相関関係:重要なポイントと関数リファレンス

  • 二変量関係は、R の XNUMX つの変数間の関係 (または相関) を表します。
  • XNUMX つの変数間の相関関係を計算するには、主に XNUMX つの方法があります。 R Programming :ピアソン&スピアマン。
  • ピアソン相関法は、通常、XNUMX つの変数間の関係の主なチェックとして使用されます。
  • ランク相関では、観測値をランクごとに並べ替え、ランク間の類似性レベルを計算します。
  • スピアマンの順位相関係数は-1から1までの値を取り、両極端に近い値は強い単調な関係を示します。
  • 相関行列とは、すべての変数間のペアワイズ相関を保持する正方形の表のことである。
  • p値は、観測された相関関係が統計的にゼロと区別できるかどうかを示します。

このチュートリアルで使用されている相関関数はすべて以下にリストされています。

図書館 DevOps Tools Engineer試験のObjective 方法 Code
ベース(Base) 二変量相関 ピアソン
cor(dfx2, method = "pearson")
ベース(Base) 二変量相関 スピアマン
cor(dfx2, method = "spearman")
ベース(Base) 多変量相関 ピアソン
cor(df, method = "pearson")
ベース(Base) 多変量相関 スピアマン
cor(df, method = "spearman")
ミスク P値 -
rcorr(as.matrix(data[,1:9]))[["P"]]
GGally ヒートマップ -
ggcorr(df)
GGally 多変量プロット行列 -
ggpairs(df, columns = c("x1", "x2"))

よくあるご質問

関係が単調ではあるが線形ではない場合、外れ値が存在する場合、または変数が順序尺度である場合は、スピアマンの順位相関係数を使用してください。ピアソンの順位相関係数は、線形性とほぼ正規分布に従う連続データを前提としています。

ケンドールのタウは、順位の差ではなく、一致するペアと一致しないペアの数を数えます。同順位が多い小規模サンプルではスピアマンの順位相関係数よりも頑健ですが、大規模データセットでは計算に時間がかかります。

いいえ。相関係数は、単に同時変動を測定するものです。交絡変数が両方の系列に影響を与える可能性があり、係数だけでは実際の影響の方向性を判断することはできません。

相関行列は、トレーニング前に冗長な特徴量を明らかにするのに役立ちます。なぜなら、相関の高い2つの予測変数は、追加情報がほとんどなく、線形モデルを不安定にするからです。AIチームは、ターゲット変数からのデータ漏洩を検出するためにも相関行列を使用します。

はい。AIアシスタントは、どのペアが閾値を超えているかを要約したり、削除すべき冗長な特徴量を提案したり、ヒートマップの色を説明したりすることができます。行動を起こす前に、各主張を自身のcor.test()の出力と照らし合わせて確認してください。