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 la relación entre las variables.
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:
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
$vs <- factor(mtcars$vs,
mtcarslevels = c(0,1),
labels = c("en V", "en línea recta"))
$am <- factor(mtcars$am,
mtcarslevels = 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, 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
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
.
<- c(1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4)
x <- c(1, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 5, 5)
y 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.
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,
$cyl) mtcars
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.
<- subset(mtcars, am == 'manual')
subdat
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.
<- read.csv2('https://personales.unican.es/rasillad/docencia/G14/TEMA_3/contaminacion_so2.csv')
contaminacion 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?
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\).
Figura 3: Ejemplo desarrollado de covarianza
<- c(2,3,4,4,5,6,6,7,7,8,10,10)
x <- c(1,3,2,4,4,4,6,4,6,7,9,10)
y
<- length(x)
n <- x * y
xy <- sum(x)
suma_x <- sum(y)
suma_y <- sum(x)/n
media_x <- sum(y)/n
media_y <- sum(x.y)
suma_x_y <- sum(x.y)/n - media.x * media.y
cov_x_y <- cov(x,y)
cov_x_y_bis <- as.data.frame(cbind(x,y,x.y))
tabla1_cov <- as.data.frame(cbind(n,
tabla2_cov
suma_x,suma_y,
media_x,media_y,
suma_x_y,
cov_x_y))
tabla1_cov tabla2_cov
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?
Son un conjunto de estadísticos encargados de cuantificar el grado de asociación entre dos variables. Los más importantes son:
Correlación de Pearson.
Spearman rho.
Kendall tau.
¿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.
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
Figura 5: Ejemplo desarrollado del coeficiente de correlación de Pearson
<- length(x)
n <- x * y
x_y <- x^2
x_cuad <- y^2
y_cuad
<- sum(x)
suma_x <- sum(y)
suma_y <- sum(x_cuad)
suma_x_cuad <- sum(y_cuad)
suma_y_cuad <- sum(x)/n
media_x <- sum(y)/n
media_y <- sum(x_y)
suma_x_y
<- sum(x_y)/n - media_x * media_y
cov_x_y <- cov(x,y)
cov_x_y_bis
<- sqrt(suma_x_cuad/n - (media_x)^2)
desv_tip_x <- sqrt(suma_y_cuad/n - (media_y)^2)
desv_tip_y
<- cov.x.y/(desv.tip.x*desv.tip.y)
r_pearson
<- as.data.frame(cbind(x,y,
tabla1_cov
x_y,
x_cuad,
y_cuad))
<- as.data.frame(cbind(n,
tabla2_cov
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)
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)
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.
<- cor.test(x,y)
res $p.value # Valor p
res$estimate # Coeficiente de correlación. res
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”.
Figura 6: Ejemplo desarrollado del coeficiente de correlación de Spearman
<- c(7,5,8,9)
x <- c(4,7,9,8)
y <- length(x)
n <- rank(x,ties.method = "average")
dx <- rank(y,ties.method = "average")
dy <- (dx-dy)^2
dx_menos_dy_2 <- sum(dx_menos_dy_2)
suma_dx_menos_dy_2
<- 1 - (6*suma_dx_menos_dy_2)/(n*(n^2-1)) rho
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"
.
<- cor(x,y,method = 'spearman') correlacion.spearman
También se puede obtener información adicional con la función
cor.test
.
<- cor.test(x, y, method = "spearman")
spearman spearman
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"
.
<- cor.test(x, y, method="kendall")
res_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
.
<- cor.test(contaminacion$so2, contaminacion$tem, method="Pearson")
so2_tem_Pearson <- cor.test(contaminacion$so2, contaminacion$tem, method="Spearman")
so2_tem_Spearman <- cor.test(contaminacion$so2, contaminacion$tem, method="kendall")
so2_tem_Kendall
<- cor.test(contaminacion$so2, contaminacion$vv, method="Pearson")
so2_vv_Pearson <- cor.test(contaminacion$so2, contaminacion$vv, method="Spearman")
so2_vv_Spearman <- cor.test(contaminacion$so2, contaminacion$vv, method="kendall") so2_vv_Kendall
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.
<- mtcars[ , c(1,3,4,5,6,7)] # Objeto que incluye sólo como variables de análisis unas columnas concretas
coches str(coches)
head(coches, 6) # Muestra las 6 primeras columnas del objeto datos
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.
<- round(cor(coches),2) # round( , 2) solicitud de dos decimales
matriz_corr1 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")
<- rcorr(as.matrix(coches)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz_corr2 matriz_corr2
Como en ocasiones anteriores, es posible solicitar únicamente o bien los coeficientes de correlación o bien los valores-p.
$r # Muestra sólo los coeficientes de correlación
matriz_corr2$P # Muestra sólo los p-values matriz_corr2
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)
<- matriz_corr1
upper
upper.tri(matriz_corr1)]<-""
upper[
<- as.data.frame(upper)
upper
upper
También es posible Ocultar la parte inferior del triángulo, pero no es tan habitual.
<- matriz_corr1
lower lower_tri(matriz_corr1, diag=TRUE)]<-""
lower[<- as.data.frame(lower)
lower lower
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 @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.
<- coches[ ,c('mpg', 'drat', 'qsec')]
subset_coches 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
.
<- mtcars[, 10] # Variable gear convertida en factor y denominada grupos
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
.
<- ifelse(mtcars$vs == '0', 'red', 'green3')
col1 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)
<- abs(cor(coches)) # Matriz de correlación (en términos absolutos)
corr <- dmat.color(corr) # La misma matriz, sustituyendo los valores por colores
colors
colors<- order.single(corr) # Reordena la matriz, de tal manera que valores similares presentan colores parecidos.
order
ordercpairs(coches, # ATENCIÓN: data frame, no la matriz de correlación
# Orden de las variables
order, 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)
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
<- colorRampPalette(c("red", "white", "blue"))(20) # Mismo correlograma, pero usando una paleta de colores diferente
colcorrplot(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
<- colorRampPalette(c("blue", "white", "red"))(20) # Colores que vamos a utilizar
colheatmap(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
,
<- rcorr(as.matrix(contaminacion)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz_corr_cont matriz_corr_cont
lower.tri(matriz_corr_cont,
diag = FALSE)
upper.tri(matriz_corr_cont,
diag = FALSE)
<- matriz_corr_cont
upper_cont upper.tri(matriz_corr_cont)]<-""
upper_cont[<- as.data.frame(upper_cont)
upper_cont
upper_cont
Elabora un gráfico de correlaciones con la función
chart.Correlation
son las variables del dataset
contaminacion
utilizando 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
.
<- colorRampPalette(c("blue", "white", "red"))(20) # Colores que vamos a utilizar
col_nuevo 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