De acuerdo con lo expuesto en el apartado inicial del tema, para conocer la relación entre dos variables cuantitativas (discretas o continuas) podemos acudir a diferentes procedimientos:
La elaboración de un gráfico de dispersión.
El cálculo de algún estadístico que cuantifique esa relación.
Comenzaremos este apartado importando el dataframe
mtcars
. Es uno de los conjuntos de datos que incluye el
propio programa
data(mtcars)
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
Comprende las siguientes variables:
mpg: consumo (millas según galón).
cyl: número de cilindros.
disp: desplazamiento en pulgadas cúbicas.
hp: potencia en caballos.
drat: ratio del eje trasero.
wt: peso (cada 1000 libras).
qsec: aceleración en segundos para recorrer 1/4 de milla.
vs: disposición del motor (0 = en V, 1 = en línea recta)
am: transmisión (0 automática, 1 = manual)
gear: número de velocidades.
Algunas de estas variables son variables cualitativas que pueden transformarse en factores
mtcars$vs <- factor(mtcars$vs,
levels = c(0,1),
labels = c("en V", "en línea recta"))
mtcars$am <- factor(mtcars$am,
levels = c(0,1),
labels = c("automática", "manual"))
Para resaltar la importancia de una representación gráfica inicial se puede recurrir al cuarteto de Anscombe. Éste comprende cuatro conjuntos de datos con valores estadísticos casi idénticos, pero distribuciones muy diferentes. Este cuarteto todavía se usa a menudo para ilustrar la importancia de evaluar gráficamente los datos antes de comenzar su análisis, y la insuficiencia de las propiedades estadísticas básicas para describir conjuntos de datos.
El gráfico de dispersión muestra la relación entre 2 variables
cuantitativas. Consiste en una representación, en un sistema de
coordenadas cartesianas, de los datos de cada variable. Cada punto
corresponde al valor de cada pareja de datos). La función
plot()
crea este tipo de gráficos, cuyos argumentos más
usuales se muestran a continuación:
plot(x, y, type,…,)
Los argumentos de la función plot
son:
x
: vector numérico con las coordenadas del
eje horizontal.
y
: vector numérico con las coordenadas del
eje vertical.
type
: tipo de gráfico a dibujar. Las
opciones son:
...
: otros parámetros gráficos que pueden ser pasados
como argumentos para plot
.En el siguiente ejemplo se representa la relación entre el consumo y la potencia del motor.
plot(mtcars$mpg, mtcars$hp,
pch = 19, # Tipo de símbolo
col = "black") # Color del símbolo
La nube de puntos informa de diversas posibilidades:
Si existe una relación funcional: la nube de puntos se dispone aproximadamente en línea recta.
Si la relación entre las variables es fuerte o débil.
Si es directa (positiva: ambas variables aumentan de valor simultáneamente) o inversa (negativa: cuando una variable aumenta de valor la otra disminuye).
Si se ajusta a un modelo lineal o a otro modelo (ej: exponencial). En el segundo caso, la medición deberá utilizar los estadísticos más apropiados para esta circunstancia.
También posee otras utilidades, como la detección de casos excepcionales o “outliers”.
En ocasiones, es difícil apreciar la nube de puntos cuando hay
parejas con datos similares, que tienden a superponerse. Existe una
variante del gráfico de dispersión, a través de la función
sunflowerplot()
, que permite visualizar estos conjuntos de
datos. Si una pareja aparece una sola vez, se representará por un punto;
si la pareja se repite dos veces se representará por un punto y dos
rayitas rojas (pétalos); si la pareja se repite tres veces se
representará por un punto y tres rayitas rojas (pétalos) y así
sucesivamente. La estructura de la función sunflowerplot
con los argumentos más usuales es la siguiente:
sunflowerplot(x, y, pch, seg.col, seg.lwd, …)
Los argumentos de la función sunflowerplot
son:
x
: vector numérico con las
coordenadas del eje horizontal.
y
: vector numérico con las
coordenadas del eje vertical.
pch
: valor o vector numérico con el
tipo de punto a usar, por defecto pch=1
. Para conocer los
diferentes símbolos que se pueden obtener con el parámetro
pch
se recomienda consultar la Figura
@ref(fig:point1).
seg.col
: color de los
pétalos.
seg.lwd
: ancho de los
pétalos.
...
: otros parámetros gráficos que
pueden ser pasados como argumentos para plot
.
Como ejemplo, se representarán dos variables, en las que existe:
Una pareja de datos (1, 1) que aparece una sola vez,
Otra (2, 3) repetida cuatro veces,
Otra (3, 2) repetido seis veces
Otra (4, 5) repetido dos veces.
A título comparativo, se van a dibujar de manera contigua dos
gráficos de dispersión, uno con la función plot
y el otro
con la función sunflowerplot
.
x <- c(1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4)
y <- c(1, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 5, 5)
par(mfrow=c(1, 2))
plot(x, y, main='a) Usando plot')
sunflowerplot(x, y,
seg.col='blue',
seg.lwd=2,
cex=1.5,
main='b) Uso de sunflowerplot')
En el panel de la izquierda sólo se observan 4 puntos idénticos,
puesto que se superponen algunas parejas de datos. En el panel de la
derecha el diagrama obtenido con la función sunflowerplot
también aparecen cuatro puntos, pero la simbología explica que el punto
con coordenadas (1, 1) se representó con un punto, el punto (2, 3) está
representado por un punto y cuatro pétalos de color azul ya que él se
repite cuatro veces, y los puntos (3, 2) y (4, 5) se represetan con seis
y dos pétalos porque esas son las veces que ellos se repiten.
Como ilustración vamos a crear un diagrama de dispersión con la
función sunflowerplot
para las variables mpg
y
cyl
. El código necesario para cargar la base de datos y
construir el diagrama de dispersión se muestra a continuación.
sunflowerplot(mtcars$mpg,
mtcars$cyl)
Del diagrama de dispersión representando la relación entre el número de cilindros y el consumo se deduce que la mayoría de los vehículos con menor consumo tienen 4 cilindros, mientras los vehículos con 8 cilindros son los de mayor consumo (menor recorrido por cada unidad de combustible).
De la misma manera, la función symbols
proporciona
diagramas de dispersión que permiten la inclusión de información
adicional (por ejemplo, incorporando variables cuantitativas). En este
caso relacionaremos las variables mpg
/hp
y
drat
/disp
incorporando además el número de
cilindros como variable adicional.
subdat <- subset(mtcars, am == 'manual')
par(mfrow=c(1, 2))
with(subdat, symbols(mpg, hp,
circles = cyl, # Tamaño de los símbolos, según cilindros
las=1, # Etiquetas X e Y verticales
inches=0.1, # Tamaño de los símbolos
fg='red', # Color del borde del símbolo
main='Título')) # Título del gráfico
with(subdat, symbols(disp, drat,
squares = cyl,
las=1,
inches=0.1,
fg='dodgerblue4',
bg='pink', # Color del fondo del símbolo
main='Título'))
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: :
El fichero contaminación so2.csv sirve para analizar la relación entre la concentración de \(SO_2\) (un contaminante provocado por la combustión de combustibles fósiles) y una serie de variables atmosféricas y humanas. Las variables son las siguientes:
so2: concentración de SO2 (mgr por metro cúbico).
tem: temperatura media anual en ºC.
fab: número de empresas con más de 20 trabajadores.
pop: tamaño de la población (en miles de habitantes).
vv: velocidad media del viento (en km/h)
pp: precipitación media (en mm).
dias: número de días de lluvia al año.
Carga este fichero en R y comprueba su estructura.
contaminacion <- read.csv2('https://personales.unican.es/rasillad/docencia/G2040/TEMA_6/contaminacion_so2.csv')
str(contaminacion)
## 'data.frame': 41 obs. of 7 variables:
## $ so2 : int 10 13 12 17 56 36 29 14 10 24 ...
## $ tem : num 21.3 16.1 13.7 11.1 9.5 12.2 14.1 20.2 24.2 16.4 ...
## $ fab : int 213 91 453 454 412 80 434 136 207 368 ...
## $ pop : int 582 132 716 515 158 80 757 529 335 497 ...
## $ vv : num 9.36 12.79 13.57 14.04 14.04 ...
## $ pp : num 179 1232 525 329 1102 ...
## $ dias: int 36 100 67 86 127 114 111 116 128 115 ...
par(mfrow=c(2, 3))
plot(contaminacion$so2, contaminacion$tem, pch = 19, col = "black")
plot(contaminacion$so2, contaminacion$fab, pch = 12, col = "red")
plot(contaminacion$so2, contaminacion$pop, pch = 15, col = "pink")
plot(contaminacion$so2, contaminacion$vv, pch = 17, col = "blue")
plot(contaminacion$so2, contaminacion$pp, pch = 8, col = "brown")
plot(contaminacion$so2, contaminacion$dias, pch = 6, col = "orange")
par(mfrow = c(1,1))
⚠️ ATENCIÓN:
el papel de NA
Por defecto, cuando nuestros datos contienen algún valor ausente o
perdido (identificado en R por un NA
de “Not Available”),
las funciones cov()
y corr()
devuelven “NA”.
Para obtener el valor de correlación, se debe especificar cómo tratar
los valores ausentes mediante el argumento
use = "pairwise.complete.obs"
que calcula el coeficiente de
correlación para aquellas observaciones en las que no falta ningún valor
de “x” ni “y”.
La covarianza es un estadístico que mide cómo varían de forma conjunta dos variables. Se define como: \[\text{cov}(x,y)=\frac{1}{n}\sum_{i=1}^n(x_i-\bar x)(y_i-\bar y)\]
La covarianza entre dos variables, \(x\) e \(y\) es el promedio (suma dividida entre \(n\)) de las diferencias de los puntos respecto a sus promedios.
Se simboliza por \(\sigma_{xy}\) cuando ha sido calculada en la población; si se obtiene sobre una muestra, se designa por la letra \(Sxy\).
El resultado numérico fluctúa entre los rangos +infinito a –infinito (por lo tanto, positivos o negativos)
Covarianza positiva: relación positiva entre las dos variables. Esto significa que, a puntuaciones bajas de la primera variable \(x\), se asocian con las puntuaciones bajas de la segunda variable \(y\), mientras las puntuaciones altas de \(x\) se asocian con los valores altos de la variable \(y\).
Covarianza negativa: relación negativa entre las dos variables. Esto significa que puntuaciones bajas de \(x\) se asocian con los valores altos de \(y\), mientras las puntuaciones altas de \(x\) se asocian con los valores bajos de \(y\).
Una covarianza nula (0) significa que no existe una relación entre las dos variables estudiadas.
En realidad, no sirve tanto para cuantificar el grado de relación existente entre dos variables, sólo su tendencia. Podemos comprobarlo en el siguiente ejemplo, en el que se calcula la covarianza entre dos variables, \(x\) e \(y\).
x <- c(3,4,5,2,9,6,8,7,5,8)
y <- c(2,3,6,1,7,4,9,6,8,5)
cov(x,y)
## [1] 4.477778
Si en vez de dos vectores (como x e y) la función se aplica a un dataframe o a una matriz, se calcularán las covarianzas entre todas las columnas del conjunto de datos. Es lo que se conoce como matriz de covarianzas.
set.seed(15)
df <- data.frame(Var1 = rnorm(100), Var2 = runif(100), Var3 = rexp(100)) # Dataframe con 3 variables
cov(df) # Matriz de covarianzas de 'df'
## Var1 Var2 Var3
## Var1 0.98795201 -0.024517909 -0.079986687
## Var2 -0.02451791 0.084020062 -0.009591341
## Var3 -0.07998669 -0.009591341 2.118357213
De la misma manera también se puede calcular a partir de dos data frames.
df2 <- data.frame(Var4 = rnorm(100), Var5 = runif(100), Var6 = rexp(100))
cov(df, df2) # Matriz de covarianzas entre 'df' y 'df2'
## Var4 Var5 Var6
## Var1 -0.001427763 0.014351821 -0.05569541
## Var2 0.041006100 0.005160602 -0.06376888
## Var3 0.064429874 -0.053229349 0.03178257
rm(df, df2)
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: :
cov(contaminacion$so2, contaminacion$tem)
contaminacion
. \(so^2\) y la temperatura.cov(contaminacion)
¿Hay variables con un valor negativo de la covarianza? ¿Qué significa?
¿Cuál es el par de variables con una covarianza más elevada?
Son un conjunto de estadísticos encargados de cuantificar el grado de asociación entre dos variables. Los más importantes son:
r
de Pearson.
rho
de Spearman.
tau
de Kendall.
⚠️ ATENCIÓN:
¿Qué diferencia existe entre la covarianza y los índices de correlación?:
La covarianza informa de la dirección (positiva, negativa, cercana a zero) de la relación lineal de dos variables, mientras la correlación no sólo ofrece la direción, sino también la intensidad.
La covarianza es no acotada pues su tamaño depende de la escala de las variables, mientras que la correlación toma valores entre -1 y 1, independiente de la escala de las variables.
La covarianza enta no estándarizada, la correlación si.
Es denominado también “Correlación producto momento de Pearson”. Es un procedimiento de carácter paramétrico, por lo que sólo debe ser usado cuando ambas variables siguen una distribución normal, y deben proceder de una muestra aleatoria de individuos. En caso contrario se debe recurrir a:
Transformación de ambas variables, cambiando la escala de medición (transformación logarítmica).
Uso de los coeficientes de Spearman o Kendall
Se simbolizada por \(\rho_{x,y}\) cuando ha sido calculada en la población. Si se obtiene sobre una muestra, se designa por la letra \(r_{x,y}\). La fórmula para su cálculo es la siguiente:
\[r_{x,y}=\frac{cov(x,y)}{\sigma_x \sigma_y}\] Es decir, se divide covarianza entre el producto de las desviaciones típicas de \(x\) e \(y\). Su valor es independiente de las unidades en las que están medidas las variables \(x\) e \(y\) (adimensional), oscilando siempre entre –1 y +1.
Una correlación de +1: relación perfecta (positiva) entre las dos variables (puntuaciones bajas de la primera variable (X) se asocian con las puntuaciones bajas de la segunda variable (Y), mientras las puntuaciones altas de X se asocian con los valores altos de la variable Y.
Una correlación de -1: relación lineal inversa perfecta (negativa) entre las dos variables (puntuaciones bajas en X se asocian con los valores altos en Y, puntuaciones altas en X se asocian con valores bajos en Y).
Una correlación próxima a cero: no hay relación lineal entre las dos variables.
Una transformación lineal de una variable (multiplicación de una variable por una constante, suma de una constante) no afecta al coeficiente de correlación de Pearson
Presenta algunos problemas:
La correlación no implica causalidad: juicio de valor que requiere más información que un simple valor cuantitativo de un coeficiente de correlación.
Es sensible a valores extremos, sobre todo en muestras pequeñas, y a asociaciones no lineales, que deben detectarse previamente a través del diagrama de dispersión. En caso de que muestren patrones curvos, estaríamos ante un ejemplo de asociación no lineal entre dos variables.
La restricción del rango suele afectar al valor de la correlación obtenida, bien aumentando o disminuyendo su valor. Ejemplo: fuerte relación lineal positiva entre las dos variables cuando se incluyen todos los casos, pero mucho menor si se realiza sobre el subconjunto señalado en color gris.
n <- length(x)
x_y <- x * y
x_cuad <- x^2
y_cuad <- y^2
suma_x <- sum(x)
suma_y <- sum(y)
suma_x_cuad <- sum(x_cuad)
suma_y_cuad <- sum(y_cuad)
media_x <- sum(x)/n
media_y <- sum(y)/n
suma_x_y <- sum(x_y)
cov_x_y <- sum(x_y)/n - media_x * media_y
cov_x_y_bis <- cov(x,y)
desv_tip_x <- sqrt(suma_x_cuad/n - (media_x)^2)
desv_tip_y <- sqrt(suma_y_cuad/n - (media_y)^2)
r_pearson <- cov_x_y/(desv_tip_x*desv_tip_y)
tabla1_corr <- as.data.frame(cbind(x,y,
x_y,
x_cuad,
y_cuad))
tabla2_corr <- as.data.frame(cbind(n,
suma_x_cuad,suma_y_cuad,
media_x,media_y,
suma_x,suma_y,suma_x_y,
cov_x_y,
desv_tip_x,desv_tip_y,
r_pearson))
Se procede a limpiar de objetos el Global Environment
rm(tabla1_cov, tabla2_cov, cov_x_y, cov_x_y_bis, desv_tip_x, desv_tip_y, media_x, media_y, n, r_pearson, suma_x, suma_y, suma_x_y, suma_x_cuad, suma_y_cuad, x_cuad, y_cuad, x_y, tabla1_corr, tabla1_corr, tabla2_corr)
Como en el caso anterior, es posible calcular directamente el coeficiente de correlación. Existen dos opciones:
cor()
proporciona sólo el
coeficiente de correlación (asume por defecto el argumento
method = Pearson
).cor(x, y)
## [1] 0.7446014
cor.test
proporciona el
coeficiente de correlación de Pearson y su significación (p-value).cor.test(x,y)
##
## Pearson's product-moment correlation
##
## data: x and y
## t = 3.1551, df = 8, p-value = 0.01349
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2164525 0.9355994
## sample estimates:
## cor
## 0.7446014
En este último caso la información incluye:
t = 8.3732: valor del estadístico t.
df: los grados de libertad (N-1).
p-value: nivel de significación del test t .
95 percent confidence interval: intervalo de confianza del coeficiente de correlación con un nivel de probabilidad α =0.05.
sample estimates: coeficiente de correlación (cor.coeff = 0.93).
Si convertimos esa función en un objeto, podemos solicitar cada uno de los elementos de esa lista por separado.
res <- cor.test(x,y)
res$p.value # Valor p
## [1] 0.01349452
res$estimate # Coeficiente de correlación.
## cor
## 0.7446014
Utilizan los rangos (números de orden, posición) de dos grupos de variables y comparan entre sí dichos rangos. Asume que, en caso de existir relación entre dos conjuntos de datos, los valores estarán ordenados de manera similar. Hay dos coeficientes fundamentales:
El coeficiente de correlación de Spearman.
La tau de Kendall
¿Cuándo deben utilizarse?:
Cuando las variables no siguen una distribución normal.
Cuando las variables contienen “outliers”.
x <- c(7,5,8,9)
y <- c(4,7,9,8)
n <- length(x)
dx <- rank(x,ties.method = "average")
dy <- rank(y,ties.method = "average")
dx_menos_dy_2 <- (dx-dy)^2
suma_dx_menos_dy_2 <- sum(dx_menos_dy_2)
rho <- 1 - (6*suma_dx_menos_dy_2)/(n*(n^2-1))
La función de R para obtener el coeficiente de correlación de
Spearman es la misma vista para el de Pearson, pero en este caso el
argumento es method= "spearman"
.
correlacion.spearman <- cor(x,y,method = 'spearman')
También se puede obtener información adicional con la función
cor.test
.
spearman <- cor.test(x, y, method = "spearman")
spearman
##
## Spearman's rank correlation rho
##
## data: x and y
## S = 4, p-value = 0.4167
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.6
El último de los coeficientes de correlación, y el menos utilizado, es la tau \(\tau\) o coeficiente de Kendall. Es una medida de dependencia no paramétrica que identifica los pares concordantes y discordantes de dos variables. Una vez identificados, se calculan los totales y se hace el cociente.
donde \(C_n\) = número total de pares concordantes. \(NC_n\) = número total de pares no concordantes (discordantes).
La función de R para obtener el coeficiente de correlación de
Spearman es la misma vista para el de Pearson, pero en este caso el
argumento es method= "kendall"
.
res_kendall <- cor.test(x, y, method="kendall")
res_kendall
##
## Kendall's rank correlation tau
##
## data: x and y
## T = 4, p-value = 0.75
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## 0.3333333
rm(list=ls()) # Limpia el Global Environment
cat("\014") # Limpia la consola
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: :
contaminacion
, calcula el valor
del coeficiente de correlación de Pearson, de Spearman y de Kendall para
la pareja de variables so2
y tem
,so2_tem_Pearson <- cor(contaminacion$so2, contaminacion$tem, method="pearson")
so2_tem_Spearman <- cor(contaminacion$so2, contaminacion$tem, method="spearman")
so2_tem_Kendall <- cor(contaminacion$so2, contaminacion$tem, method="kendall")
p-value
obtenido al calcular el valor
del coeficiente de correlación de Spearman sobre la pareja de valores
so2
y vv
, determina si la relación es
estadísticamente significativa.cor.test(contaminacion$so2, contaminacion$vv, method="pearson")
cor.test(contaminacion$so2, contaminacion$vv, method="spearman")
Es muy frecuente que en el análisis estadístico se requiera analizar el grado de relación entre varias variables cuantitativas. Para evitar el cálculo de cualquiera de los coeficientes de correlación pareja a pareja, se puede elaborar una matriz de correlaciones. La matriz de correlaciones es una tabla que muestra los coeficientes de correlación entre un conjunto de variables. Cada variable aleatoria (\(x_i\)) en la tabla está correlacionada con cada uno de los otros valores en la tabla (\(x_j\)). Esto le permite ver qué pares tienen la correlación más alta, y por lo tanto, manifiestan una relación más estrecha.
En caso de que nuestro conjunto de datos disponga de variables que no
son cuantitativas, o de columnas con otro tipo de información (pe.
fechas, etiquetas alfanuméricas), es recomendable crear un nuevo
dataframe con las variables seleccionadas, ya que la función
corr
calculará los coeficientes de correlación entre todas
las variables.
coches <- mtcars[ , c(1,3,4,5,6,7)] # Objeto que incluye sólo como variables de análisis unas columnas concretas
str(coches)
## 'data.frame': 32 obs. of 6 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
head(coches, 6) # Muestra las 6 primeras columnas del objeto datos
## mpg disp hp drat wt qsec
## Mazda RX4 21.0 160 110 3.90 2.620 16.46
## Mazda RX4 Wag 21.0 160 110 3.90 2.875 17.02
## Datsun 710 22.8 108 93 3.85 2.320 18.61
## Hornet 4 Drive 21.4 258 110 3.08 3.215 19.44
## Hornet Sportabout 18.7 360 175 3.15 3.440 17.02
## Valiant 18.1 225 105 2.76 3.460 20.22
Creamos un objeto (matriz de correlación) para poder reutilizar esa matriz posteriormente en otros procedmientos. Por defecto, R proporciona los coeficientes de correlación con hasta 7 decimales. Es habitual mostrar los coeficientes de correlación con dos decimales.
matriz_corr1 <- round(cor(coches),2) # round( , 2) solicitud de dos decimales
matriz_corr1
## mpg disp hp drat wt qsec
## mpg 1.00 -0.85 -0.78 0.68 -0.87 0.42
## disp -0.85 1.00 0.79 -0.71 0.89 -0.43
## hp -0.78 0.79 1.00 -0.45 0.66 -0.71
## drat 0.68 -0.71 -0.45 1.00 -0.71 0.09
## wt -0.87 0.89 0.66 -0.71 1.00 -0.17
## qsec 0.42 -0.43 -0.71 0.09 -0.17 1.00
Una vez calculados los coeficientes de correlación, es necesario
identificar cuáles son estadísticamente significativo, obteniendo el
p-value
: si éste es menor que el nivel de significación (α
=0.05), el coeficiente es estadísticamente significativo. Para ello
recurriremos a la función rcorr
del paquete
Hmisc, que requiere una matriz para su cálculo
# install.packages("Hmisc")
library("Hmisc")
matriz_corr2 <- rcorr(as.matrix(coches)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz_corr2
## mpg disp hp drat wt qsec
## mpg 1.00 -0.85 -0.78 0.68 -0.87 0.42
## disp -0.85 1.00 0.79 -0.71 0.89 -0.43
## hp -0.78 0.79 1.00 -0.45 0.66 -0.71
## drat 0.68 -0.71 -0.45 1.00 -0.71 0.09
## wt -0.87 0.89 0.66 -0.71 1.00 -0.17
## qsec 0.42 -0.43 -0.71 0.09 -0.17 1.00
##
## n= 32
##
##
## P
## mpg disp hp drat wt qsec
## mpg 0.0000 0.0000 0.0000 0.0000 0.0171
## disp 0.0000 0.0000 0.0000 0.0000 0.0131
## hp 0.0000 0.0000 0.0100 0.0000 0.0000
## drat 0.0000 0.0000 0.0100 0.0000 0.6196
## wt 0.0000 0.0000 0.0000 0.0000 0.3389
## qsec 0.0171 0.0131 0.0000 0.6196 0.3389
Como en ocasiones anteriores, es posible solicitar únicamente o bien
los coeficientes de correlación (matriz_corr2$r
) o bien los
valores-p.
matriz_corr2$P # Muestra sólo los p-values
## mpg disp hp drat wt
## mpg NA 9.380328e-10 1.787835e-07 1.776240e-05 1.293958e-10
## disp 9.380328e-10 NA 7.142679e-08 5.282022e-06 1.222311e-11
## hp 1.787835e-07 7.142679e-08 NA 9.988772e-03 4.145827e-05
## drat 1.776240e-05 5.282022e-06 9.988772e-03 NA 4.784260e-06
## wt 1.293958e-10 1.222311e-11 4.145827e-05 4.784260e-06 NA
## qsec 1.708199e-02 1.314404e-02 5.766253e-06 6.195826e-01 3.388683e-01
## qsec
## mpg 1.708199e-02
## disp 1.314404e-02
## hp 5.766253e-06
## drat 6.195826e-01
## wt 3.388683e-01
## qsec NA
Igualmente, la función symnum
del paquete
stats ofrece algunas posibilidades adicionales de
representación en pantalla de esa matriz de correlación, por ejemplo,
reemplazando los números por símbolos según su nivel de
significación.
library(stats)
symnum(matriz_corr1,
abbr.colnames=FALSE,
symbols = c(" ", ".", ",", "+", "*", "B")) # Símbolos que reemplazarán a los valores del coeficiente de correlación
## mpg disp hp drat wt qsec
## mpg 1
## disp + 1
## hp , , 1
## drat , , . 1
## wt + + , , 1
## qsec . . , 1
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1
Podemos representar sólo una diagonal de la matriz de correlación, bien la superior, bien la inferior. Para ello primero debe calcularse la siguiente sintaxis.
lower.tri(matriz_corr1,
diag = FALSE)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] FALSE FALSE FALSE FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE FALSE FALSE FALSE
## [3,] TRUE TRUE FALSE FALSE FALSE FALSE
## [4,] TRUE TRUE TRUE FALSE FALSE FALSE
## [5,] TRUE TRUE TRUE TRUE FALSE FALSE
## [6,] TRUE TRUE TRUE TRUE TRUE FALSE
upper.tri(matriz_corr1,
diag = FALSE)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] FALSE TRUE TRUE TRUE TRUE TRUE
## [2,] FALSE FALSE TRUE TRUE TRUE TRUE
## [3,] FALSE FALSE FALSE TRUE TRUE TRUE
## [4,] FALSE FALSE FALSE FALSE TRUE TRUE
## [5,] FALSE FALSE FALSE FALSE FALSE TRUE
## [6,] FALSE FALSE FALSE FALSE FALSE FALSE
En este caso la diagonal superior será ocultada
upper <- matriz_corr1
upper[upper.tri(matriz_corr1)]<-""
upper <- as.data.frame(upper)
upper
## mpg disp hp drat wt qsec
## mpg 1
## disp -0.85 1
## hp -0.78 0.79 1
## drat 0.68 -0.71 -0.45 1
## wt -0.87 0.89 0.66 -0.71 1
## qsec 0.42 -0.43 -0.71 0.09 -0.17 1
También es posible Ocultar la parte inferior del triángulo, pero no es tan habitual.
lower <- matriz_corr1
lower[lower.tri(matriz_corr1, diag=TRUE)]<-""
lower <- as.data.frame(lower)
lower
## mpg disp hp drat wt qsec
## mpg -0.85 -0.78 0.68 -0.87 0.42
## disp 0.79 -0.71 0.89 -0.43
## hp -0.45 0.66 -0.71
## drat -0.71 0.09
## wt -0.17
## qsec
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: :
contaminacion
, elabora la matriz
de correlación entre todas sus variables e identifica cuáles son
significativas estadísticamente.rcorr(as.matrix(contaminacion)) # devuelve los coeficientes de correlación y p-value
matriz_contaminacion <- round(cor(contaminacion),2)
upper.tri(matriz_contaminacion,
diag = FALSE)
upper <- matriz_contaminacion
upper[upper.tri(matriz_contaminacion)]<-""
upper <- as.data.frame(upper)
upper
Existen diferentes procedimientos para visualizar una matriz de correlación:
Diagramas de puntos y diagramas combinados.
Función corrplot()
(correlograma).
Heatmap
El gráfico más básico para analizar la posible relación entre
variables es un gráfico múltiple de dispersión, elaborado con la función
pairs
, o bien con la función plot
.
Las matrices de dispersión obtenidas con la función
pairs
proporcionan un método simple de presentar las
relaciones entre pares de variables cuantitativas y son la versión
múltiple de la función plot
. Este gráfico consiste en una
matriz donde cada entrada presenta un gráfico de dispersión sencillo. Un
inconveniente es que si tenemos muchas variables el tamaño de cada
entrada se reduce demasiado impidiendo ver con claridad las relaciones
entre los pares de variables. La celda \((i,j)\) de una matriz de dispersión
contiene el gráfico de dispersión de la columna \(i\) versus la columna \(j\) de la matriz de datos.
En la Figura se muestra un ejemplo de una matriz de dispersión para un conjunto de datos, en la diagonal están los nombres de las variables y por fuera de la diagonal están los diagramas de dispersión para cada combinación de variables.
pairs(coches)
plot(coches) # Equivalente usando la función plot
La estructura de la función pairs
con los argumentos más
usuales se muestra a continuación:
pairs(x, labels, panel = points, …, horInd = 1:nc, verInd = 1:nc, lower.panel = panel, upper.panel = panel, diag.panel = NULL, text.panel = textPanel, label.pos = 0.5 + has.diag/3, line.main = 3, cex.labels = NULL, font.labels = 1, row1attop = TRUE, gap = 1, log = ““)
Los argumentos de la función pairs
son:
x
: matriz o dataframe con las
variables cuantitativas.
labels
: vector opcional con los
nombres a colocar en la diagonal. Por defecto se usan los nombres de
columnas del objeto x
.
panel
: función usual de la forma
function(x,y,...)
para determinar el contenido de los
paneles. Por defecto es points
, indicando que se dibujarán
los puntos de los pares de variables. Es posible utilizar aquí otras
funciones diseñadas por el usuario.
...
: Indica que es posible agregar
otros parámetros gráficos, tales como pch
y
col
, con los cuales puede especificarse un vector de
símbolos y colores a ser usados en los scatterplots.
lower.panel, upper.panel
: función
usual de la forma function(x,y,...)
para definir lo que se
desea dibujar en los paneles abajo y arriba de la diagonal.
diag.panel
: función de la forma
function(x,y,...)
para definir lo que se desea dibujar en
la diagonal.
text.panel
: Es opcional. Permite
que una función: function(x, y, labels, cex, font, ...)
sea
aplicada a los paneles de la diagonal.
label.pos
: Para especificar la
posición \(y\) de las etiquetas en el
text panel.
cex.labels, font.labels
: Parámetros
para la expansión de caracteres y fuentes a usar en las etiquetas de las
variables.
row1attop
: Parámetro lógico con el
cual se especifica si el gráfico para especificar si el diseño lucirá
como una matriz con su primera fila en la parte superior o como un
gráfico con fila uno en la base. Por defecto es lo primero.
La función se puede personalizar con varios argumentos. Por ejemplo,
es posible restringir el número de variables del dataframe original a un
número menor de variables. El objeto coches
son los datos
originales, mientras que subset.coches
es otro dataframe
con 3 variables.
subset_coches <- coches[ ,c('mpg', 'drat', 'qsec')]
pairs(subset_coches)
También es posible editar los nombres de las variables, modificar el aspecto del símbolo, inlcir una escala logarínmica, modificar las marcas horizontales en el eje vertical y eliminar los diagramas de dispersión de la diagonal inferior
pairs(subset_coches,
lower.panel=NULL,
cex.labels=1.5,
log='xy',
main='Matriz de dispersión',
las=1,
labels=c('Consumo', 'Radio del eje trasero', 'Aceleración'),
pch=3, cex=0.6, col='dodgerblue2')
En este caso, se incorpora una variable cualitativa, que ocupa la
columna 10. Debemos en este caso recurrir a los datos originales, que se
encuentran en mtcars
que contiene todas las variables y
usar una fórmula con la ayuda del operador ~
para indicar
las variables de interés, y usar una fórmula con la ayuda del operador
~
para indicar las variables de interés. Esta fórmula
NO debe contener nada del lado izquierdo mientras que
en el lado derecho se colocan todas las variables a considerar en la
matriz de dispersión, por esta razón el códido mostrado abajo se inicia
con la instrucción ~ mpg + disp + hp
.
grupos <- mtcars[, 10] # Variable gear convertida en factor y denominada grupos
pairs(~ mpg + disp + hp,
data = coches, # Data frame de variables
labels = colnames(mtcars), # Nombres de las variables
pch = 21, # Símbolo pch
bg = rainbow(5)[grupos], # Color de fondo del símbolo (pch 21 a 25)
col = rainbow(5)[grupos], # Color de borde del símbolo
main = "Vehículos", # Título del gráfico
row1attop = TRUE, # Si FALSE, cambia la dirección de la diagonal
gap = 1, # Distancia entre subplots
cex.labels = NULL, # Tamaño del texto de la diagonal
font.labels = 1) # Estilo de fuente del texto de la diagonal
A la hora de elaborar este gráfico es posible incluir condiciones,
como el que el valor de la variable \(mpg >
30\) y el valor de la variable \(disp
> 100\), diferenciando además la variable vs
con
el color rojo si tiene un valor 0 y verde con un valor 1. Para incluir
condiciones se usa el parámetro subset
de la siguiente
manera: subset= mpg < 30 & disp > 100
.
col1 <- ifelse(mtcars$vs == '0', 'red', 'green3')
pairs(~ hp + drat + wt,
data= mtcars,
lower.panel=NULL,
col=col1,
subset= mpg < 30 & disp > 100,
pch=19,
cex=0.8,
main="Matriz de dispersión para vehículos con mpg < 20 y disp > 200")
El paquete gclus proporciona una función muy similar
a la anterior llamada cpairs()
. Esta función mejora a
pairs
permitiendo ordenar las variables y colorear los
subplots.
# install.packages("gclus")
library(gclus)
corr <- abs(cor(coches)) # Matriz de correlación (en términos absolutos)
colors <- dmat.color(corr) # La misma matriz, sustituyendo los valores por colores
colors
## mpg disp hp drat wt qsec
## mpg NA "#F4BBDD" "#F4BBDD" "#D2F4F2" "#F4BBDD" "#FDFFDA"
## disp "#F4BBDD" NA "#F4BBDD" "#D2F4F2" "#F4BBDD" "#FDFFDA"
## hp "#F4BBDD" "#F4BBDD" NA "#FDFFDA" "#D2F4F2" "#D2F4F2"
## drat "#D2F4F2" "#D2F4F2" "#FDFFDA" NA "#D2F4F2" "#FDFFDA"
## wt "#F4BBDD" "#F4BBDD" "#D2F4F2" "#D2F4F2" NA "#FDFFDA"
## qsec "#FDFFDA" "#FDFFDA" "#D2F4F2" "#FDFFDA" "#FDFFDA" NA
## attr(,"Levels")
## [1] "[0.986,5.67]" "(5.67,10.3]" "(10.3,15]"
order <- order.single(corr) # Reordena la matriz, de tal manera que valores similares presentan colores parecidos.
order
## [1] 6 3 2 5 1 4
cpairs(coches, # ATENCIÓN: data frame, no la matriz de correlación
order, # Orden de las variables
panel.colors = colors, # Matriz de colores
border.color = "grey70", # Color de los bordes
gap = 0.45, # Distancia entre subplots
main = "Variables ordenadas coloreadas por correlación", # Título principal
show.points = TRUE, # Si FALSE, elimina todos los puntos
pch = 21, # Símbolo pch
bg = rainbow(3)[mtcars$carb]) # Colores según grupos (número de carburadores)
El paquete PerformanceAnalytics incorpora la función
chart.Correlation()
que crea un gráfico múltiple con:
Un histograma con la distribución de cada variable en la diagonal y su función de densidad.
Por debajo de la diagonal, diagramas de puntos bivariados con líneas de regresión suavizadas
Por encima de la diagonal, el valor del coeficiente de correlación más el nivel de significación estadística.
Cada nivel está asociado a un símbolo: p-values(0, 0.001, 0.01, 0.05, 0.1, 1) <=> símbolos(“”, “”, “”, “.”, ” “)
# install.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
chart.Correlation(coches, # ATENCION: dataframe original, no la matriz de corrrelación
method = "pearson",
histogram=TRUE,
pch=16)
La función corrplot
, del paquete homónimo, representa
gráficamente una matriz de correlación, resaltando las variables mejor
correlacionadas.
# install.packages("corrplot")
library(corrplot)
Los colores y tamaño de los símbolos son proporcionales al valor de los coeficientes de correlación (la leyenda correspondiente aparece a la derecha del correlograma). Por defecto:
Correlaciones positivas: azul.
Correlaciones negativas: rojo
Ejemplo: representación de los valores numéricos.
corrplot(matriz_corr1, # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag=FALSE) # Oculta el valor del coeficinte de correlación de la diagonal principal
col<- colorRampPalette(c("red", "white", "blue"))(20) # Mismo correlograma, pero usando una paleta de colores diferente
corrplot(matriz_corr1,
type="upper",
order="hclust",
col=col)
library(RColorBrewer)
corrplot(matriz_corr1,
type="upper",
order="hclust",
col=brewer.pal(n=8, name="RdBu")) # Otras paletas: brewer.pal(n=8, name="RdYlBu") ó col=brewer.pal(n=8, name="PuOr")
corrplot(matriz_corr1,
type="upper",
order="hclust",
col=c("black", "white"),
bg="lightblue")
Un mapa de calor es una técnica de visualización de datos que muestra la magnitud de un fenómeno en dos dimensiones usando colores, proporcionando pistas visuales sobre cómo se agrupa las variables que definen un fenómeno. La variación de color puede ser mediante matiz o intensidad.
Hay dos categorías diferentes de mapas de calor: el mapa de conjuntos y el mapa espacial.
En un mapa de conjuntos, las magnitudes se disponen en una matriz de tamaño de celda fijo cuyas filas y columnas representan las variables sometidas a análisis, siendo su orden intencional y arbitrario, con el objetivo de sugerir agrupamientos . El color de cada celda refleja la magnitud del coeficiente de correlación.
Por el contrario, en un mapa espacial, el fenómeno varía continuamente.
Ejemplo de mapa de calor
col<- colorRampPalette(c("blue", "white", "red"))(20) # Colores que vamos a utilizar
heatmap(matriz_corr1, # Matriz de correlación
col = col, # Paleta de colores
symm = TRUE) # TRUE cuando la matriz es simétrica (mismo número de filas y columnas)
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: :
EJERCICIO 1. A partir del dataframe
contaminacion
:
chart.Correlation
con las variables del dataset
contaminacion
utilizando Spearman como método para obtener
el coeficiente de correlación.chart.Correlation(contaminacion, # ATENCION: dataframe original, no la matriz de corrrelación
method="pearson",
histogram=TRUE,
pch=16)
contaminación
.col_nuevo <- colorRampPalette(c("blue", "white", "red"))(20) # Colores que vamos a utilizar
heatmap(matriz_corr_cont, # Matriz de correlación
col = col_nuevo, # Paleta de colores
symm = TRUE)
EJERCICIO 2. Importa los datos de la hoja
Ejemplo1
de la hoja de cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx.
#if(!require("readxl")) install.packages("readxl")
library(readxl)
download.file("https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx",
destfile = "regresion.xlsx",
mode="wb")
ejercicio1 <- read_excel("regresion.xlsx", sheet = "Ejemplo1")
ejercicio1
## # A tibble: 30 × 2
## x y
## <dbl> <dbl>
## 1 6.81 9.85
## 2 9.84 11.2
## 3 4.98 5.12
## 4 5 8.11
## 5 3.5 3.56
## 6 3.64 1.99
## 7 7.87 15.5
## 8 5.14 7.52
## 9 8.39 14.0
## 10 6.82 7.52
## # ℹ 20 more rows
plot(ejercicio1$x, ejercicio1$x)
Una posibilidad para evaluar el supuesto de normalidad es aplicar el test de Shapiro-Wilks.
Hipótesis H0: La variable presenta una distribución normal -> cuando p-value es mayor que alpha = 0,05 -> No rechazar H0 (sigue una distribución normal).
Hipótesis H1: La variable presenta una distribución no normal -> cuando p-value es menor que alpha = 0,05 -> Rechazar H0 (la distribución no es normal)
shapiro.test(ejercicio1$x)
shapiro.test(ejercicio1$y)
De acuerdo con lo mencionado anteriormente, ambas variables presentan una distribución normal.
Calcula los coeficientes de correlación de Pearson y Spearman y determina si existe una relación estadísticamente significativa entre las variables.
cor.test(ejercicio1$x,ejercicio1$y)
cor.test(ejercicio1$x,ejercicio1$y, method = "spearman")
EJERCICIO 3. Importa los datos de la hoja Ejemplo2
de la
hoja de cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx.
A partir de ella:
ejercicio2 <- read_excel("regresion.xlsx", sheet = "Ejemplo2")
ejercicio2
## # A tibble: 25 × 3
## peso edad grasas
## <dbl> <dbl> <dbl>
## 1 84 46 354
## 2 73 20 190
## 3 65 52 405
## 4 70 30 263
## 5 76 57 451
## 6 69 25 302
## 7 63 28 288
## 8 72 36 385
## 9 79 57 402
## 10 75 44 365
## # ℹ 15 more rows
Elabora una matriz de correlaciones entre las diferentes variables.
round(cor(ejercicio2),2)
Exporta tanto la matriz de correlaciones como la matriz de p-values a Excel.
library("Hmisc")
matriz.corr.ejercicio2 <- rcorr(as.matrix(ejercicio2)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz.corr.ejercicio2$r
matriz.corr.ejercicio2$P
Representa esa matriz gráficamente con un correlograma, utilizando para ello los números correspondientes a los coeficientes de correlación de Pearson.
library(corrplot)
corrplot(cor(ejercicio2), # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag = FALSE)
EJERCICIO 4. Importa los datos de la hoja Ejemplo3
de la
hoja de cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx.
A partir de ella:
ejercicio3 <- read_excel("regresion.xlsx", sheet = "Ejemplo3")
ejercicio3
## # A tibble: 30 × 6
## y1 y2 y3 y4 y5 y6
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6.81 6.84 6.85 6.86 6.75 6.64
## 2 9.84 8.66 8.07 7.71 12.2 16.9
## 3 4.98 4.81 4.73 4.68 5.30 5.96
## 4 5.00 5.53 5.79 5.95 3.95 1.85
## 5 3.50 3.71 3.81 3.88 3.09 2.26
## 6 3.64 3.41 3.30 3.23 4.10 5.03
## 7 7.87 8.70 9.12 9.37 6.21 2.89
## 8 5.14 5.46 5.62 5.71 4.51 3.25
## 9 8.39 8.61 8.72 8.78 7.95 7.08
## 10 6.82 6.30 6.04 5.88 7.86 9.95
## # ℹ 20 more rows
Elabora una matriz de correlaciones entre las diferentes variables.
round(cor(ejercicio3),2)
Exporta tanto la matriz de correlaciones como la matriz de p-values a Excel.
matriz.corr.ejercicio3 <- rcorr(as.matrix(ejercicio3)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz.corr.ejercicio3$r
matriz.corr.ejercicio3$P
Representa esa matriz gráficamente con un correlograma, utilizando para ello los números correspondientes a los coeficientes de correlación de Pearson.
corrplot(cor(ejercicio3), # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag = FALSE)