Matriz de correlación de Pearson y Spearman en R con ejemplo

⚡ Resumen inteligente

La correlación de Pearson y Spearman en R mide la fuerza con la que dos variables se mueven juntas, utilizando `cor()` para un solo par y una matriz de correlación para varios. Este tutorial incluye pruebas de significancia con `Hmisc` y visualiza el resultado con mapas de calor de `GGally`.

  • 📐 Rango de coeficientes: Toda correlación se sitúa entre -1 y 1, donde 0 indica que no existe relación lineal y cualquiera de los extremos indica una relación perfecta.
  • 📈 Método de Pearson: Es paramétrico, mide la asociación lineal y asume que las variables continuas siguen una distribución aproximadamente normal.
  • 🔢 Método Spearman: Es un método no paramétrico que funciona con rangos y es robusto ante valores atípicos y datos asimétricos u ordinales.
  • 🧮 Vista de matriz: cor(df) devuelve todos los coeficientes por pares, y as.dist() imprime solo el triángulo inferior.
  • 🔬 Significado: cor.test() para un par, o rcorr() de Hmisc para una matriz completa de valores p.
  • ???? Visualización: La función ggcorr() dibuja un mapa de calor y la función ggpairs() construye una matriz completa de distribuciones y diagramas de dispersión.

Matriz de correlación en R

Correlación bivariada en R

Una relación bivariada describe una relación -o correlación- entre dos variables en R. En este tutorial, discutiremos el concepto de correlación y mostraremos cómo se puede utilizar para medir la relación entre dos variables cualesquiera en R.

Correlación en programación R

Hay dos métodos principales para calcular la correlación entre dos variables en programación R:

  • Pearson: Correlación paramétrica
  • Lancero: Correlación no paramétrica

Matriz de correlación de Pearson en R

El método de correlación de Pearson se utiliza generalmente como verificación principal de la relación entre dos variables.

El coeficiente de correlación, escrito r, mide la fuerza de la lineal Relación entre dos variables x e y. Se calcula de la siguiente manera:

Matriz de correlación de Pearson en R

con

  • Matriz de correlación de Pearson en R es la desviación estándar de x
  • Matriz de correlación de Pearson en R es la desviación estándar de y

La correlación oscila entre -1 y 1.

  • Un valor de r cercano o igual a 0 implica poca o ninguna relación lineal entre x e y.
  • Cuanto más se acerque r a 1 o a -1, más fuerte será la relación lineal.

Puedes comprobar si r difiere de cero con el estadístico t que se muestra a continuación, comparándolo con la distribución t de Student con n – 2 grados de libertad:

Matriz de correlación de Pearson en R

Correlación de rango de Spearman en R

La correlación de rangos ordena las observaciones por rango y calcula el grado de similitud entre ellas. Tiene la ventaja de ser robusta ante valores atípicos y no depende de la distribución de los datos. Además, es la opción más adecuada para variables ordinales.

La correlación de rangos de Spearman, escrita como rho, también varía de -1 a 1, y los valores cercanos a cualquiera de los extremos indican una relación monótona fuerte. Se calcula de la siguiente manera:

Correlación de rango de Spearman en R

El numerador es la covarianza entre los rangos de x e y, y el denominador es el producto de sus desviaciones estándar.

En R, ambos se calculan con la función cor(), que toma tres argumentos: x, y y método.

cor(x, y, method)

Argumentos:

  • x: Primer vector
  • y: Segundo vector
  • Método: La fórmula utilizada para calcular la correlación. Tres valores de cadena:
    • “pearson”
    • “kendall”
    • "lancero"

Se puede agregar un argumento opcional si los vectores contienen un valor faltante: use = “complete.obs”

Usaremos el conjunto de datos de BudgetUK. Este conjunto de datos informa la asignación presupuestaria de los hogares británicos entre 1980 y 1982. Hay 1519 observaciones con diez características, entre ellas:

  • comida: compartir comida compartir gastar
  • combustible: compartir el gasto en combustible
  • tela: proporción del presupuesto para gastos en ropa
  • Walc: compartir el gasto en alcohol
  • wtrans: compartir el gasto en transporte
  • padre: proporción del gasto en otros bienes
  • totexp: gasto total del hogar en libras
  • ingresos: ingreso neto total del hogar
  • edad : edad del hogar
  • niños: numero de niños

Ejemplo

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 Explicación

  • Primero importamos los datos y echamos un vistazo con la función glimpse() de la biblioteca dplyr.
  • Tres hogares declaran un ingreso de 500 o más, por lo que filter(income < 500) los elimina y el número de filas baja de 1,519 a 1,516.
  • Es una práctica común convertir una variable monetaria en log. Ayuda a reducir el impacto de los valores atípicos y disminuye la asimetría en el conjunto de datos.

Salida:

## 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, ...

Podemos calcular el coeficiente de correlación entre las variables ingresos y alimentos con los métodos “pearson” y “searman”.

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

Salida:

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

Salida:

## [1] -0.2501252

Antes de extender esto a cada par de variables, conviene definir cómo se debe interpretar un solo coeficiente.

Cómo interpretar un coeficiente de correlación

Un coeficiente solo es útil una vez que se puede explicar su significado. Las bandas que se muestran a continuación representan la lectura convencional, y el signo se lee por separado de la intensidad.

Valor absoluto de r Fuerza de la relación
0.00 a 0.19 Muy débil o ninguno
0.20 a 0.39 Débil
0.40 a 0.59 Moderado
0.60 a 0.79 Fuerte
0.80 a 1.00 Muy fuerte

El valor de -0.2467 calculado anteriormente entre log_income y wfood es, por lo tanto, una relación negativa débil: los hogares más ricos gastan una proporción ligeramente menor de su presupuesto en alimentos.

A cada coeficiente se le aplican tres precauciones.

  • La correlación no es causalidad. Un valor de r elevado indica que las dos variables se mueven juntas, nunca que una cause la otra. Una tercera variable, no medida, suele ser la que impulsa a ambas.
  • Pearson solo ve líneas rectas. Una relación en forma de U perfecta arroja un valor de r cercano a cero. Siempre grafica los datos antes de confiar en el valor numérico.
  • El tamaño importa más que la importancia. Con 1,516 observaciones, un coeficiente de 0.06 puede ser estadísticamente significativo y, sin embargo, carecer de sentido en la práctica.

Cómo probar la significancia de la correlación con cor.test()

cor.() devuelve el coeficiente y nada más. Para un solo par, cor.test() suma el valor p y un intervalo de confianza en una sola llamada.

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

El resultado consta de cuatro partes que merece la pena leer.

  1. t y df: el estadístico de prueba y sus grados de libertad, n – 2.
  2. valor de p: la probabilidad de ver un coeficiente tan grande si la correlación real fuera cero.
  3. intervalo de confianza del 95 por ciento: el rango plausible para la correlación verdadera. Si excluye el cero, la relación es significativa a ese nivel.
  4. estimación de la muestra: el coeficiente en sí, idéntico al que devuelve cor().

La misma función ejecuta las pruebas basadas en rangos cambiando un argumento:

# 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")

Cuándo usar cuál. Utilice `cor.test()` cuando examine un par específico, ya que proporciona el intervalo de confianza que `rcorr()` omite. Utilice `rcorr()` de `Hmisc`, como se muestra arriba, cuando necesite valores p para una matriz completa a la vez. Tenga en cuenta que probar muchos pares aumenta la tasa de falsos positivos, por lo que debe ajustar los valores p con `p.adjust(p_value, method = “BH”)` antes de extraer conclusiones de una matriz grande.

Matriz de correlación en R

Una correlación bivariada es un buen comienzo, pero una visión multivariada ofrece una perspectiva más amplia. matriz de correlación es una tabla cuadrada que contiene la correlación por pares de cada variable con todas las demás.

La función cor() devuelve una matriz de correlación. La única diferencia con la correlación bivariada es que no necesitamos especificar qué variables. De forma predeterminada, R calcula la correlación entre todas las variables.

No se puede calcular una correlación para un factor, así que elimine todas las columnas categóricas antes de pasar el marco de datos a cor().

Una matriz de correlación es simétrica, lo que significa que los valores por encima de la diagonal tienen los mismos valores que el de abajo. Es más visual mostrar la mitad de la matriz.

children_fac se excluye porque cor() no puede operar sobre un factor.

# 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 Explicación

  • cor(datos[, 1:9])Calcula la matriz de correlación en las nueve columnas numéricas.
  • ronda(…, 2)Redondea cada coeficiente a dos decimales.
  • como.dist()Imprime solo el triángulo inferior, ya que la matriz es simétrica.

Salida:

##            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

Nivel significativo

Un coeficiente por sí solo no indica si la relación es estadísticamente fiable. La función rcorr() de la biblioteca Hmisc devuelve el valor p para cada par. Podemos descargar la biblioteca desde Conda y copia el código para pegarlo en la terminal:

conda install -c r r-hmisc

rcorr() requiere que un marco de datos se almacene como una matriz. Podemos convertir nuestros datos en una matriz antes de calcular la matriz de correlación con el valor 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

El objeto de lista mat_2 contiene tres elementos:

  • r: Salida de la matriz de correlación
  • n: Número de observación
  • P: valor p

Nos interesa el tercer elemento, el valor p. Es común mostrar la matriz de correlación con el valor p en lugar del coeficiente de correlación.

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

Code Explicación

  • mat_2[[“P”]]: Los valores p se almacenan en el elemento llamado P
  • ronda(mat_2[[“P”]], 3): Redondea los elementos con tres dígitos

Salida:

           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

Visualización de la matriz de correlación en R

Un mapa de calor es otra forma de leer una matriz de correlación. La biblioteca GGally extiende ggplot2 y se instala desde CRAN en lugar de conda:

install.packages("GGally")

Visualización de la matriz de correlación

La biblioteca incluye diferentes funciones para mostrar el resumen estadístico, como la correlación y distribución de todas las variables en un matriz.

La función ggcorr() tiene muchos argumentos. Introduciremos solo los argumentos que usaremos en el tutorial:

La función ggcorr

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

Argumentos:

  • df: Conjunto de datos utilizado
  • Método:Fórmula para calcular la correlación. De forma predeterminada, se calculan los pares y Pearson.
  • n se rompe: Devuelve un rango categórico para la coloración de los coeficientes. De forma predeterminada, no hay interrupciones y el degradado de color es continuo.
  • dígitos: Redondea el coeficiente de correlación. Por defecto, establecido en 2
  • low: Controla el nivel inferior de la coloración.
  • medio: Controla el nivel medio de la coloración.
  • high: Controla el alto nivel de la coloración.
  • geom: controla la forma del argumento geométrico. Por defecto, "mosaico"
  • Etiqueta: Valor booleano. Mostrar o no la etiqueta. De forma predeterminada, establecido en "FALSO"

Mapa de calor básico

El gráfico más básico del paquete es un mapa de calor. La leyenda del gráfico muestra un gradiente de color de -1 a 1, donde el color cálido indica una correlación positiva fuerte y el color frío, una correlación negativa.

library(GGally)
ggcorr(data)

Code Explicación

  • ggcorr(datos): Sólo se necesita un argumento, que es el nombre del marco de datos. Las variables a nivel de factor no se incluyen en el gráfico.

Salida:

Mapa de calor básico

Agregar control al mapa de calor

Podemos agregar más controles al gráfico:

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

Code Explicación

  • n descansos = 6: rompe la leyenda con 6 rangos.
  • bajo = “azul acero”: Utilice colores más claros para una correlación negativa
  • medio = “blanco”: Utilice colores blancos para la correlación de rangos medios
  • alto = “rojo oscuro”: Utilice colores oscuros para una correlación positiva
  • geom = “círculo”:Utilice un círculo como forma de las ventanas en el mapa de calor. El tamaño del círculo es proporcional al valor absoluto de la correlación.

Salida:

Agregar control al mapa de calor

Agregar etiqueta al mapa de calor

GGally nos permite agregar una etiqueta dentro de las ventanas:

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

Code Explicación

  • etiqueta = VERDADERO: Suma los valores de los coeficientes de correlación dentro del mapa de calor.
  • color = “gris50”: Elige el color, es decir, gris.
  • tamaño_etiqueta = 3: Establece el tamaño de la etiqueta en 3

Salida:

Agregar etiqueta al mapa de calor

La función ggpairs

La biblioteca GGally también proporciona ggpairs(), que devuelve una matriz de gráficos. Para k variables seleccionadas, el resultado es una cuadrícula de ak x k: la diagonal muestra la distribución de cada variable, mientras que los paneles por encima y por debajo de la diagonal pueden contener cálculos diferentes. La sintaxis es:

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

Argumentos:

  • df: Conjunto de datos utilizado
  • columnas: Seleccione las columnas para dibujar el gráfico.
  • título: Incluir un título
  • superior: Controla las casillas situadas encima de la diagonal del gráfico. Es necesario especificar el tipo de cálculos o gráfico que se desea devolver. Si continuous = “cor”, le pedimos a R que calcule la correlación. Tenga en cuenta que el argumento debe ser una lista. Hay otros argumentos disponibles; consulte la Documentación de GGally para más información.
  • lower:Controla los cuadros debajo de la diagonal.
  • mapaping: Indica la estética del gráfico. Por ejemplo, podemos calcular la gráfica para diferentes grupos.

Análisis bivariado con ggpair con grouping

El siguiente gráfico muestra tres informaciones:

  • La matriz de correlación entre las variables log_totexp, log_ Income, age y wtrans agrupadas según si el hogar tiene un hijo o no.
  • Trazar la distribución de cada variable por grupo.
  • Mostrar el diagrama de dispersión con la tendencia por grupo
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 Explicación

  • columnas = c(“log_totexp”, “log_ingresos”, “edad”, “wtrans”): Elige las variables a mostrar en el gráfico.
  • título = “Análisis bivariado del gasto en ingresos del hogar británico”: Añade un titulo
  • superior = lista(): controla la parte superior del gráfico. Es decir. Por encima de la diagonal
  • continuo = envoltura(“cor”, tamaño = 3)): Calcule el coeficiente de correlación. Envolvemos el argumento continuo dentro de la función wrap() para controlar la estética del gráfico (es decir, tamaño = 3) -lower = list(): controla la parte inferior del gráfico. Es decir. Debajo de la diagonal.
  • continuo = envoltura (“liso”, alfa = 0.3, tamaño = 0.1): agregue un diagrama de dispersión con una tendencia lineal. Envolvemos el argumento de forma continua dentro de la función wrap() para controlar la estética del gráfico (es decir, tamaño=0.1, alfa=0.3).
  • mapaping = aes(color = children_fac): Dividir cada panel por children_fac, el factor ordenado etiquetado como “No” para hogares sin niños y “Sí” para hogares con niños

Salida:

Análisis bivariado con ggpair con Grouping

Análisis bivariado con ggpair con grupo parcialping

El gráfico que aparece a continuación es un poco diferente. Cambiamos la posición del mapa.ping dentro del argumento superior.

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 Explicación

  • Exactamente el mismo código que el ejemplo anterior excepto por:
  • mapaping = aes(color = children_fac): Mueve la lista en upper = list(). Solo queremos que el cálculo se apile por grupo en la parte superior del gráfico.

Salida:

Análisis bivariado con ggpair con grupo parcialping

Correlación en R: Puntos clave y referencia de funciones

  • Una relación bivariada describe una relación -o correlación- entre dos variables en R.
  • Hay dos métodos principales para calcular la correlación entre dos variables en Programación R: Pearson y Spearman.
  • El método de correlación de Pearson se utiliza generalmente como verificación principal de la relación entre dos variables.
  • Una correlación de rango ordena las observaciones por rango y calcula el nivel de similitud entre los rangos.
  • La correlación de rangos de Spearman varía de -1 a 1, y los valores cercanos a cualquiera de los extremos indican una relación monótona fuerte.
  • Una matriz de correlación es una tabla cuadrada que contiene la correlación por pares de cada variable.
  • Un valor p indica si una correlación observada es estadísticamente distinguible de cero.

A continuación se enumeran todas las funciones de correlación utilizadas en este tutorial:

Biblioteca Objetivo Método Code
Base Correlación bivariada Pearson
cor(dfx2, method = "pearson")
Base Correlación bivariada Lancero
cor(dfx2, method = "spearman")
Base Correlación multivariada Pearson
cor(df, method = "pearson")
Base Correlación multivariada Lancero
cor(df, method = "spearman")
hmisc Valor de p -
rcorr(as.matrix(data[,1:9]))[["P"]]
GGally Mapa de calor -
ggcorr(df)
GGally Matriz de gráficos multivariados -
ggpairs(df, columns = c("x1", "x2"))

Preguntas Frecuentes

Utilice el coeficiente de correlación de Spearman cuando la relación sea monótona pero no lineal, cuando haya valores atípicos o cuando la variable sea ordinal. El coeficiente de correlación de Pearson presupone linealidad y datos continuos aproximadamente normales.

El coeficiente tau de Kendall cuenta los pares concordantes y discordantes en lugar de clasificar las diferencias. Es más robusto que el de Spearman en muestras pequeñas con muchos empates, aunque su cálculo es más lento en conjuntos de datos grandes.

No. La correlación solo mide la covarianza. Una variable de confusión puede influir en ambas series, y la dirección de cualquier efecto real no puede determinarse únicamente a partir del coeficiente.

Las matrices de correlación revelan características redundantes antes del entrenamiento, ya que dos predictores altamente correlacionados aportan poca información y desestabilizan los modelos lineales. Los equipos de IA también las utilizan para detectar fugas de datos de la variable objetivo.

Sí. Los asistentes de IA pueden resumir qué pares superan un umbral, sugerir qué características redundantes eliminar y explicar los colores del mapa de calor. Confirme cada afirmación con el resultado de su propia función cor.test() antes de actuar.

Resumir este post con: