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`.

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:
con
es la desviación estándar de x
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:
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:
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.
- t y df: el estadístico de prueba y sus grados de libertad, n – 2.
- valor de p: la probabilidad de ver un coeficiente tan grande si la correlación real fuera cero.
- 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.
- 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")
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:
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 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:
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 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:
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")) |









