Colaborador: Ing. Francisco Valverde P.hD en informática

Realice los 13 ejercicios propuestos en esta lectura: Gráficos básicos

Esta sección es una introducción a los gráficos básicos en R orientada a la inspección visual y rápida de conjuntos de datos, que es fundamental en todo proceso de análisis y, particularmente, en sus fases iniciales.

No nos preocuparemos demasiado de los aspectos estéticos de estos gráficos. En primer lugar, porque más adelante trataremos otros tipo de gráficos más sofisticados y atractivos estéticamente. Pero también porque los detalles sobre cómo modificar el aspecto de los gráficos es tan prolijo y lleno de detalles que es mejor omitirlo en una primera aproximación. Además, internet contiene seguramente la respuesta a cualquier pregunta que se te ocurra sobre cómo modificar los valores por defecto: ejes, orientación de etiquetas, etc. Es un campo amplio y lleno de detalles pero que es más bien material de consulta puntual en un momento de necesidad que de exposición exhaustiva en un texto introductorio.

En particular, en esta sección trataremos la manera de representar:

• Una variable continua

• Una variable categórica

• La relación entre dos variables continuas

• La relación entre una variable continua y otra categórica

Representación gráfica de variables continuas: histogramas

Nuestros datos pueden contener una columna como, por ejemplo, edad. En apartados anteriores hemos aprendido:

• Cómo inspeccionar los valores extremos de esa variable (p.e., ordenando la tabla por edad y mostrando las primeras y las últimas filas con las funciones head y tail) por si, por ejemplo, existen edades negativas

• cómo obtener algunos estadísticos básicos de esa columna (usando summary sobre la tabla).

EJERCICIO 1

Inspecciona la columna Temp (temperatura) del conjunto de datos airquality de acuerdo con las sugerencias del párrafo anterior.

airquality$Temp
##   [1] 67 72 74 62 56 66 65 59 61 69 74 69 66 68 58 64 66 57 68 62 59 73 61 61 57
##  [26] 58 57 67 81 79 76 78 74 67 84 85 79 82 87 90 87 93 92 82 80 79 77 72 65 73
##  [51] 76 77 76 76 76 75 78 73 80 77 83 84 85 81 84 83 83 88 92 92 89 82 73 81 91
##  [76] 80 81 82 84 87 85 74 81 82 86 85 82 86 88 86 83 81 81 81 82 86 85 87 89 90
## [101] 90 92 86 86 82 80 79 77 79 76 78 78 77 72 75 79 81 86 88 97 94 96 94 91 92
## [126] 93 93 87 84 80 78 75 73 81 76 77 71 71 78 67 76 68 82 64 71 81 69 63 70 77
## [151] 75 76 68
head(airquality$Temp)
## [1] 67 72 74 62 56 66
tail(airquality$Temp)
## [1] 63 70 77 75 76 68
summary(airquality$Temp)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   56.00   72.00   79.00   77.88   85.00   97.00

Sin embargo, es mucho más informativa una representación visual de los datos. La manera más rápida (y recomendada) de hacerse una idea de la distribución de los datos de una columna numérica es usando histogramas. En R, para representar el histograma de la columna Sepal.Width de iris se puede hacer:

hist(iris$Sepal.Width)

Esa es la orden básica. Pero los gráficos pueden ser modificados para incluir títulos, etiquetas, colores, etc. Por ejemplo:

hist(iris$Sepal.Width, main = "iris: histograma de la anchura de los sépalos",
      xlab = "anchura del sépalo", ylab = "frecuencia",
      col = "steelblue")

Los argumentos main, xlab, ylab y col se pueden aplicar también a otros gráficos que veremos a continuación.

EJERCICIO 2

Por defecto, el eje horizontal de un histograma muestra el número de observaciones en cada bin. Examina la ayuda de hist para ver cómo mostrar en, lugar de los números absolutos, la proporción.

#?hist
hist(iris$Sepal.Width,breaks=5, main = "iris: histograma de la anchura de los sépalos",
     xlab = "anchura del sépalo", ylab = "frecuencia",
     col = "#CD919E")

EJERCICIO 3

El número de bins también es parametrizable. Examina otra vez la página de ayuda para modificar el valor por defecto.

El argumento breaks controla el número de barras o clases del histograma. El valor por defecto es breaks = “Sturges”.

hist(iris$Sepal.Width,breaks = "Sturges" , main = "iris: histograma de la anchura de los sépalos",
     xlab = "anchura del sépalo", ylab = "frecuencia",
     col = "#EEE9BF")

EJERCICIO 4

Estudia la distribución de las temperaturas en Nueva York (usa airquality).

Para guardar el gráfico, puedes usar los menús de Rstudio. Pero también puedes hacerlo programáticamente. En la página de ayuda de la función png se explica cómo hacerlo.

View(airquality)
summary(airquality)
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NA's   :37       NA's   :7                                       
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0  
## 
png(filename = "EJERCICIO 4.png",
    width = 560, height = 560)

plot(airquality$Temp,pch=1:5,
     main ="Gráfico de dispersión de las temperaturas de New York",
     xlab = "Dato",
     ylab = "Temperatura",
     bg="brown",
     col=rainbow(10),
     cex=2,
     lwd=1)

dev.off()
## png 
##   2
file.show("EJERCICIO 4.png")

EJERCICIO 5

Usa las funciones png y jpeg para guardar alguno de los gráficos anteriores en tu disco duro.

png(filename = "Histograma.png",
    width = 560, height = 560)

hist(iris$Sepal.Width, main = "iris: histograma de la anchura de los sépalos",
     xlab = "anchura del sépalo", ylab = "frecuencia",
     col = "steelblue")

dev.off()
## png 
##   2
file.show("Histograma.png")

#Guardar en formato .jpeg
jpeg(filename = "EJERCICIO 4.jpeg",
     width = 560, height = 560)


plot(airquality$Temp,pch=1:5,
     main ="Gráfico de dispersión de las temperaturas de New York",
     xlab = "Dato",
     ylab = "Temperatura",
     bg="brown",
     col=rainbow(10),
     cex=2,
     lwd=1)

dev.off()
## png 
##   2
file.show("EJERCICIO 4.jpeg")

Representación gráfica de variables categóricas: barras

En las tablas suelen coexistir variables continuas y categóricas. Por ejemplo, es interesante conocer la distribución (o frecuencia) de cada una de las categorías. Para eso se suelen usar los diagramas de barras; en particular, la función barplot de R.

Esta función no muestra directamente las frecuencias de una variable categórica. Es necesario calcular previamente dichas frecuencias, para lo cual usaremos la función table que se tratará con más detalle posteriormente.

Por ejemplo, la expresión siguiente muestra cómo en iris existe el mismo número de observaciones de cada especie:

barplot(table(iris$Species))

EJERCICIO 6

Usa los parámetros main, xlab, ylab y col discutidos en la sección anterior para mejorar el aspecto de este gráfico.

barplot(table(iris$Species))

#Usa los parámetros main, xlab, ylab y col discutidos en la sección anterior 
#para mejorar el aspecto de este gráfico.

barplot(table(iris$Species),
        main = "Gráfico de Barras de las Especies de la base Iris",
        xlab = "Especie",
        ylab = "Frecuencia",
        col = c("#76EEC6","#EE7600","#CDAD00"))

EJERCICIO 7

Investiga el argumento horiz de barplot para crear un gráfico de barras horizontales.

barplot(table(iris$Species),
        main = "Gráfico de Barras de las Especies de la base Iris (Horizontal)",
        xlab = "Frecuencia",
        ylab = "Especie",
        col = c("#76EEC6","#EE7600","#CDAD00"),
        horiz = TRUE)

Los diagramas de barras también pueden usarse para mostrar datos contenidos en vectores etiquetados. De hecho, table crea un vector etiquetado: asocia a cada etiqueta su frecuencia en la columna. Algunas tablas contienen un registro por etiqueta y entonces podemos usar gráficos de barras para representar esa información. Por ejemplo:

barplot(VADeaths[, 2], xlab = "tramos de edad", ylab = "tasa de mortalidad",
        main = "Tasa de mortalidad en Virginia\nmujer/rural")

Los gráficos de barras son las representaciones más habituales para mostrar la distribución de vectores (entre ellos, las frecuencias de etiquetas). Sin embargo, existen alternativas modernas y superiores a ellos en algunos aspectos. Por ejemplo, los gráficos de puntos, implementados en R en la función dotchart.

Representación de la relación entre dos variables continuas: gráficos de dispersión

Los aspectos más interesantes de los datos se revelan no examinando las variables independientemente sino en relación con otras. Los gráficos de dispersión muestran la relación entre dos variables numéricas. En el ejemplo siguiente serán la velocidad y la distancia de frenado de un conjunto de coches recogidas en el conjunto de datos cars:

plot(cars$speed, cars$dist)

El gráfico muestra cómo aumenta dist en función de speed.

EJERCICIO 8

Representa gráficamente la anchura del sépalo contra su longitud (usando iris). Interpreta el gráfico.

hist(iris$Sepal.Width, main = "iris: histograma de la anchura de los sépalos",
     xlab = "anchura del sépalo", ylab = "frecuencia",
     col=palette("pastel 2"))

INTERPRETACION

El presente histograma representa la anchura del sépalo como podemos observar más de 30 observaciones de la base de datos iris tiene una anchura de 3.0 y menos de 5 observaciones tienen una anchura mayor a 4.0

EJERCICIO 9

De nuevo, usa los parámetros main, xlab, ylab y col discutidos en la sección anterior para mejorar el aspecto de los gráficos anteriores.

plot(airquality$Temp, main = "Gráfico Calidad del aire-Temperatura",
     xlab = "Índice", ylab = "Temperatura", 
     col = palette("pastel 1"))
lines(airquality$Temp)

En ocasiones, cuando una de las variables tiene un orden determinado (por ejemplo, es una variable temporal) pueden utilizarse líneas para unir los puntos de un diagrama de dispersión (o, más habitualmente, reemplazarlos por ellas). Por ejemplo, utilizando el hecho de que las observaciones de airquality están ordenadas temporalmente, podemos representar la temperatura en periodo que comprende así:

plot(airquality$Temp, type = "l")

Incluso, se pueden combinar varios elementos gráficos sobre la misma representación gráfica: por ejemplo, combinar puntos y líneas como aquí:

plot(airquality$Temp)
lines(airquality$Temp)

El anterior es un ejemplo de una característica de los gráficos básicos de R: a un primer gráfico se le pueden añadir progresivamente capas adicionales. En el caso anterior, a un gráfico de puntos se le han añadido líneas. Pero podrían añadirse más elementos. Por ejemplo, al gráfico anterior se le puede añadir un elemento más, una línea horizontal roja a la altura de la temperatura media, usando la función (muy útil) abline:

plot(airquality$Temp)
lines(airquality$Temp)
abline(h = mean(airquality$Temp), col = "red")

EJERCICIO 10

Consulta la ayuda de la función abline y úsala para añadir líneas (no solo horizontales) a alguno de los gráficos anteriores.

La función abline permite dibujar líneas horizontales (argumento h), líneas verticales (argumento v), líneas basadas en un intercepto y una pendiente (argumentos a y b), así como crear una recta de regresión.

plot(airquality$Temp)
lines(airquality$Temp)
abline(h = mean(airquality$Temp), col = "red") 

Con el argumento h, permite graficar una linea vertical en el eje y Gráficar línea horizontal

plot(airquality$Temp)
abline(v = 20, col = "Orange")

Gráficar línea vertical y horizontal

plot(airquality$Temp)
abline(h = 65, v = 20, col = "blue")

EJERCICIO 11

Consulta ?par, una página de ayuda en R que muestra gran cantidad de parámetros modificables en un gráfico. Investiga y usa col, lty y lwd. Nota: casi nadie conoce estos parámetros y, menos, de memoria; pero está bien saber que existen por si un día procede utilizarlos.

La funcion par() se utiliza para establecer parametros graficos. Los parametros parametros se pueden establecer especificandolos, como argumentos en forma de etiqueta=valor,o pasandolos como una lisa de valores

El parametro “lty”: El tipo de línea. Los tipos de línea se pueden especificar como un número entero (0=en blanco, 1=sólido (predeterminado), 2=guión, 3=punto, 4=punto, 5=guión largo, 6=dos guiones) o como una de las cadenas de caracteres “en blanco”, “sólido”, “discontinuo”, “punteado”, “punteado”, “guión largo” o “dos guiones”, donde “en blanco” usa “líneas invisibles”(es decir, no las dibuja).

Alternativamente, se puede dar una cadena de hasta 8 caracteres (de c(1:9, “A”:“F”)), dando la longitud de los segmentos de línea que se dibujan y se saltan alternativamente.

El parametro “lwd”: Cómo definir el ancho de línea al crear un gráfico.El ancho de línea, un número positivo, cuyo valor predeterminado es 1.

par(col="skyblue",lty=3, lwd=3)
plot(iris$Petal.Length, iris$Petal.Width,main ="Caracteristicas del Sepalo")
abline(h=1, v=5)

Representación de la relación entre una variable continua y otra categórica: diagramas de caja (boxplots)

Los diagramas de cajas (boxplot) estudian la distribución de una variable continua en función de una variable categórica. Están emparentados con los histogramas porque resumen la distribución de una variable continua. Para ello utilizan una representación todavía mas esquemática que la de un histograma: una caja y unos segmentos que acotan las regiones donde la variable continua concentra el grueso de las observaciones.

Por ejemplo, podemos estudiar la distribución de la anchura del sépalo en iris en función de la especie usando diagramas de cajas así:

boxplot(iris$Sepal.Width ~ iris$Species, col = "gray",
        main = "Especies de iris\nsegún la anchura del sépalo")

La notación y ~ x es muy común en R y significa que vas a hacer algo con y en función de x; en este caso, algo es un diagrama de cajas. Cuando construyamos modelos, querremos entender la variable objetivo y en función de una o más variables predictoras y volveremos a hacer uso de esa notación14.

El gráfico anterior ilustra la potencia de los diagramas de caja. Para las setosas, existe una observación atípica, mucho menor que el resto, pero cuya atipicidad queda oculta por otras observaciones normales correspondientes a virgínicas o versicolores. Esa observación atípica no llamaría la atención si se representan gráficamente todos los valores, independientemente de su tipo, pero se manifiesta claramente al segmentar la representación por especie.

EJERCICIO 12

Identifica la observación atípica. ¿Es atípica también con respecto a otras variables?

Teniendo en cuenta que el grafico representado muestra los diagramas de caja segun la variable de "iris$Sepal.Width", clasificada segun "iris$Species", nos damos cuenta que el valor atipico identificado, de manera grafica, no es atipica con respecto a otras variables, ya que resulta en ser un valor propio de la clasificacion setosa, que es indendiente de la clasificacion de versicolor y virginica.

EJERCICIO 13

Muestra la distribución de las temperaturas en Nueva York en función del mes.

head(airquality)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6
boxplot(airquality$Temp~airquality$Month, col ="darkolivegreen3",main ="Temperaturas en Nueva York en función del mes", xlab ="Mes",ylab ="Temperatura")

En el grafico propuesto, se muestra mediante diagramas de caja y bigotes, las temperaturas de Nueva York segun el mes, es decir desde el mes 5(mayo) hasta el mes 9(septiembre)para su realizacion se uso la base de datos integrada en R llamada  "airquality", la variable numerica que representa a la temperatura "Temp" y la variable cualitativa que representa los meses "Month", adicionalmente el parametro main con el que ubicamos el titulo al grafico el parametro col para adicionar color al diagrama, y finalmente, xlab y ylab para adicionar nombres a los ejes del grafico.

En el ejemplo anterior se ha usado el color steelblue. Si buscas en internet encontrarás la lista completa de aquellos colores cuyos nombres entiende R o cómo usar sus representaciones RGB u otras.

Seguro, entenderás mejor los ejemplos de esa página que el mismo cuerpo de la documentación

En R existe un tipo de datos muy especial: formula; sirve para especificar relaciones entre variables y aunque fue creado para especificar modelos estadísticos, se utiliza frecuentemente en otros contextos.