1 INTRODUCCIÓN

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:

Comenzaremos este apartado importando el dataframe mtcars. Es uno de los conjuntos de datos que incluye el propio programa

data(mtcars)
str(mtcars)

Las variables son las siguientes:

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

2 REPRESENTACIÓN GRÁFICA DE DATOS CUANTITATIVOS

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, como evidencia su representación gráfica. El 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.

Figura 1: Cuarteto de Ambscombe

2.1 Gráfico de dispersión

El gráfico de dispersión permite la visualización de 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: {#par_type}

Figura 1: Cuarteto de Ambscombe

  • ...: 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,                                     # Tamaño
     col = "black")                                # Color

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”. Ésto pueden deberse a errores en la elaboración de la información, o a la mezcla de fenómenos distintos.

Figura 2: Tipos de nubes de puntos

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) Usando 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.

Ejemplo

Como ilustración vamos a crear un diagrama de dispersión con la función sunflowerplot para las variables número de alcobas y número de baños de la base de datos de apartamentos usados.

El código necesario para cargar la base de datos y construir el diagrama de dispersión se muestra a continuación. El diagrama de dispersión se construyó excluyendo la información del apartamento 594 porque éste aparece con 14 alcobas.

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 en dos dimensiones que permiten la inclusión de información adicional (por ejemplo, incorporando variables cuantitativas).

En este caso relacionaremos la variable precio y superficie en un único barrio, incorporando además el número de habitaciones como vairable adicional.

subdat <- subset(mtcars, am == 'manual')

par(mfrow=c(1, 2))

with(subdat, symbols(mpg, hp,
                     circles = cyl, 
                     las=1, 
                     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'))

Desafío: el fichero contaminación so2.csv sirve para analizar la relación entre la concentración de SO2 (un contaminante relacionado con la combustión de combustibles fósiles, en especial el carbón) 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/G14/TEMA_3/contaminacion_so2.csv')
str(contaminacion)

Elabora, en un único lienzo, 6 gráficos de dispersión relacionando la cantidad de dióxido de azufre (so2) con cada una de las restantes variables.

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

¿Se aprecian relaciones funcionales? Si existen, ¿son lineales o de otro tipo?

3 ESTADÍSTICOS: LA COVARIANZA

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)

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\).

3.1 Cálculo manual

Figura 3: Ejemplo desarrollado de covarianza

x <- c(2,3,4,4,5,6,6,7,7,8,10,10)
y <- c(1,3,2,4,4,4,6,4,6,7,9,10)

n <- length(x)
xy <- x * y
suma_x <- sum(x)
suma_y <- sum(y)
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)
tabla1_cov <- as.data.frame(cbind(x,y,x.y))
tabla2_cov <- as.data.frame(cbind(n,
                                  suma_x,suma_y,
                                  media_x,media_y,
                                  suma_x_y,
                                  cov_x_y))

tabla1_cov
tabla2_cov

3.2 La función cov().

Para un cálculo directo desde R, existe la función cov().

cov(x,y)
rm(x_y, tabla1_cov, tabla2_cov, cov_x_y,cov_x_y_bis, media_x, media_y, n, suma_x, suma_y, suma_x_y)

Desafío: Calcula la covarianza entre el contenido de so2 y cada una de las variables atmosféricas (temperatura, precipitación, viento y días de precipitación).

cov(contaminacion$so2, contaminacion$tem)
cov(contaminacion$so2, contaminacion$pp)
cov(contaminacion$so2, contaminacion$vv)
cov(contaminacion$so2, contaminacion$dias)

¿Qué par de variables tienen la covarianza negativa? ¿Qué significa ésto? ¿Cuál es el par de variables con una covarianza más elevada?

4 COEFICIENTES DE CORRELACIÓN

Son un conjunto de estadísticos encargados de cuantificar el grado de asociación entre dos variables. Los más importantes son:

¿Qué diferencia existe entre la covarianza y los índices de correlación?

4.1 Coeficiente de correlación de Pearson

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.

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

Figura 4: Resctricción del rango

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

4.1.1 Cálculo manual del coeficiente de correlación de Pearson.

Figura 5: Ejemplo desarrollado del coeficiente de correlación de Pearson

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_cov <- as.data.frame(cbind(x,y,
                                  x_y,
                                  x_cuad,
                                  y_cuad))

tabla2_cov <- 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)

4.1.2 Cálculo del coeficiente de correlación de Pearson a partir de funciones de R

Como en el caso anterior, es posible calcular directamente el coeficiente de correlación. Existen dos opciones:

  • OPCIÓN 1: la función cor() proporciona sólo el coeficiente de correlación (asume por defecto el argumento method = Pearson).
cor(x, y)                         
  • OPCION 2: la función cor.test proporciona el coeficiente de correlación de Pearson y su significación (p-value).
cor.test(x,y)   

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
res$estimate                                            # Coeficiente de correlación.

4.2 Otros coeficientes de correlación

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

4.2.1 Coeficiente de correlación de Spearman

Figura 6: Ejemplo desarrollado del coeficiente de correlación de Spearman

4.2.1.1 Cálculo manual del coeficiente de correlación de Spearman.

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

4.2.1.2 Cálculo mediante funciones de R.

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

4.2.2 Coeficiente de Kendall

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.

Figura 7: Formula tau de Kendall

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
rm(list=ls())    # Limpia el Global Environment 
cat("\014")      # Limpia la consola 

Desafío. A partir del dataframe contaminacion, compara el valor del coeficiente de correlación de Pearson, de Spearman y de Kendall para las parejas de variables so2 y tem, y so2 y vv.

so2_tem_Pearson <- cor.test(contaminacion$so2, contaminacion$tem, method="Pearson")
so2_tem_Spearman <- cor.test(contaminacion$so2, contaminacion$tem, method="Spearman")
so2_tem_Kendall <- cor.test(contaminacion$so2, contaminacion$tem, method="kendall")

so2_vv_Pearson <- cor.test(contaminacion$so2, contaminacion$vv, method="Pearson")
so2_vv_Spearman <- cor.test(contaminacion$so2, contaminacion$vv, method="Spearman")
so2_vv_Kendall <- cor.test(contaminacion$so2, contaminacion$vv, method="kendall")

5 LA MATRIZ DE CORRELACIONES

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)
head(coches, 6)                                    # Muestra las 6 primeras columnas del objeto datos

5.1 Elaboración de una matriz de correlaciones numérica.

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

Una vez calculados los coeficientes de correlación, es necesario identificar cuáles son estadísticamente significativo. Para ello se calcula el p-value. Si el p-value es menor al nivel de significación (α =0.05), el coeficiente es estadísticamente significativo. Para ello recurriremos a la función rcorr del paquete Hmisc.

# 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

Como en ocasiones anteriores, es posible solicitar únicamente o bien los coeficientes de correlación o bien los valores-p.

matriz_corr2$r                                      # Muestra sólo los coeficientes de correlación
matriz_corr2$P                                      # Muestra sólo los p-values

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

Podemos representar sólo una diagonal de la matriz de correlación, bien la superior, bien la inferior. En este caso la diagonal superior será ocultada.

lower.tri(matriz_corr1, 
          diag = FALSE)
upper.tri(matriz_corr1, 
          diag = FALSE)

upper <- matriz_corr1

upper[upper.tri(matriz_corr1)]<-""

upper <- as.data.frame(upper)

upper

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

5.2 Representación gráfica de una matriz de correlaciones.

Existen diferentes procedimientos para visualizar una matriz de correlación:

  • Diagramas de puntos y diagramas combinados.

  • Función corrplot() (correlograma).

  • Heatmap

5.2.1 Diagramas de puntos

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 @ref(fig:ex0pairs) 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.

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
order <- order.single(corr)                     # Reordena la matriz, de tal manera que valores similares presentan colores parecidos. 
order
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 = "Person",
                  histogram=TRUE,
                  pch=16)

5.2.2 El correlograma

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
  • Representación de círculos coloreados (signo positivo o negativo) con tamaños proporcionales al valor del coeficiente de correlación.
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)
  • Incorporación de otras paletas de colores
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")
  • Modificación del fondo de la matriz y simbolos con dos colores
corrplot(matriz_corr1, 
         type="upper", 
         order="hclust", 
         col=c("black", "white"),
         bg="lightblue")

5.3 Mapa de calor (“Heat map”)

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)

Desafío. A partir del dataframe contaminacion,

  • Elabora una matriz de corralaciones y sus repectivos valores-p
matriz_corr_cont <- rcorr(as.matrix(contaminacion))             # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz_corr_cont
  • Repite la matriz de correlaciones, pero en este caso ocultando la diagonal superior.
lower.tri(matriz_corr_cont, 
               diag = FALSE)
upper.tri(matriz_corr_cont, 
               diag = FALSE)

upper_cont <- matriz_corr_cont
upper_cont[upper.tri(matriz_corr_cont)]<-""
upper_cont <- as.data.frame(upper_cont)

upper_cont
  • Elabora un gráfico de correlaciones con la función chart.Correlation son las variables del dataset contaminacionutilizando Spearman como método para obtener el coeficiente de correlación.

  • Elabora un mapa de calor que represente las correlaciones entre las variables del dataset 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) 

ACTIVIDADES DE EVALUACIÓN CONTINUA

El fichero word 03_Actividad_evaluacion_continua_3_2023 contiene una serie de actividades encaminadas a poner en práctica los conocimientos adquiridos. Cada alumnos deberá elaborar un script que contenga los procedimientos necesarios para responder a las cuestiones planteadas, y enviarlo posteriormente al profesor a través de correo electrónico.

Los resultados de esta actividad pueden consultarse en 03_Actividad_evaluacion_continua_3_2023_resuelta