library("tidyverse")
## -- Attaching packages --------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.0.0     v purrr   0.2.5
## v tibble  1.4.2     v dplyr   0.7.6
## v tidyr   0.8.1     v stringr 1.3.1
## v readr   1.1.1     v forcats 0.3.0
## -- Conflicts ------------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
theme_set(theme_bw())

Apuntes del libro R for Data Science: Import, Tidy, Transform, Visualize, and Model Data, 1st, O’Reilly Media, Inc. 2017, ISBN:1491910399 9781491910399

Visualización de Datos

mpg es un dataframe con variables (en las columnas) y observaciones (en las filas). Datos desde la US Environmental Protection Agency de 38 modelos de autos

str(mpg)
## Classes 'tbl_df', 'tbl' and 'data.frame':    234 obs. of  11 variables:
##  $ manufacturer: chr  "audi" "audi" "audi" "audi" ...
##  $ model       : chr  "a4" "a4" "a4" "a4" ...
##  $ displ       : num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int  4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr  "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr  "f" "f" "f" "f" ...
##  $ cty         : int  18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int  29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr  "p" "p" "p" "p" ...
##  $ class       : chr  "compact" "compact" "compact" "compact" ...

Entre las variables que encontramos podemos mencionar dos:

  1. displ, tamaño de motor del auto, en litros
  2. hwy, eficiencia de combusltible en carretera, en millas por galón

¿Cómo que tipo de variables las identifica el programa?

variable clase
manufacturer chr
model chr
displ num
year int
cyl int
trans chr
drv chr
cty int
hwy int
fl chr
class chr

¿Cómo los debería redefinir? ¿necesito mas información?

Pero antes, no olvidar: Todo en R es un objeto

R tiene 6 tipos de vectores atómicos + 1 raw class que no discutiremos

Por atómico, queremos decir que el vector contiene datos de un solo tipo.

character: “a”, “swc” numeric: 2, 15.5 real or decimal integer: 2L (la L le dice a R que almacene esto como un entero) logical: VERDADERO, FALSO booleano complex: 1 + 4i (números complejos, partes reales e imaginarias)

R proporciona muchas funciones para examinar características de vectores y otros objetos, por ejemplo

class(): ¿qué tipo de objeto es (nivel alto)? typeof(): ¿cuál es el tipo de datos del objeto (nivel bajo)? lenght() - ¿cuánto tiempo es? ¿Qué pasa con los objetos bidimensionales? attributes() - ¿Tiene metadatos?

x <- "dataset"
typeof(x)
## [1] "character"
y <- 1:10
y
##  [1]  1  2  3  4  5  6  7  8  9 10
typeof(y)
## [1] "integer"
length(y)
## [1] 10
z <- as.numeric(y)
z
##  [1]  1  2  3  4  5  6  7  8  9 10
typeof(z)
## [1] "double"

Entre los tipos de estructuras de datos existen:

El primero, vectores, es la estructira de datos mas usada en r, y puede ser atomic vector y lists

Recordemos que un vector es una colección de elementos que son del tipo character, logical, integer o numeric

vector() # an empty 'logical' (the default) vector
## logical(0)
vector("character", length = 5) # a vector of mode 'character' with 5 elements
## [1] "" "" "" "" ""
character(5) # the same thing, but using the constructor directly
## [1] "" "" "" "" ""

Por lo tanto, veamos nuevamente las variables

str(mpg)
## Classes 'tbl_df', 'tbl' and 'data.frame':    234 obs. of  11 variables:
##  $ manufacturer: chr  "audi" "audi" "audi" "audi" ...
##  $ model       : chr  "a4" "a4" "a4" "a4" ...
##  $ displ       : num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int  4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr  "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr  "f" "f" "f" "f" ...
##  $ cty         : int  18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int  29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr  "p" "p" "p" "p" ...
##  $ class       : chr  "compact" "compact" "compact" "compact" ...

¿Cuales creen se deberían modificar?

library(tidyverse)
glimpse(mpg)
## Observations: 234
## Variables: 11
## $ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "...
## $ model        <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 qua...
## $ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0,...
## $ year         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1...
## $ cyl          <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6...
## $ trans        <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)...
## $ drv          <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4",...
## $ cty          <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 1...
## $ hwy          <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 2...
## $ fl           <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p",...
## $ class        <chr> "compact", "compact", "compact", "compact", "comp...
mpg$model <- as.factor(mpg$model)
mpg$displ <- as.numeric(mpg$displ)
mpg$year <- as.numeric(mpg$year) 
mpg$cyl <- as.factor(mpg$cyl)
mpg$trans <- as.factor(mpg$trans)
mpg$drv <- as.factor(mpg$drv)
mpg$cty <- as.numeric(mpg$cty)
mpg$hwy <- as.numeric(mpg$hwy)
mpg$fl <- as.factor(mpg$fl)
mpg$class <- as.factor(mpg$class)

Creando el primer plot

Plot mpg, considerando como eje x a displ (variable independiente) y en el eje y hwy (variable dependiente, es aquella cuyos valores dependen de los que tomen otra variable)

mpg %>%
  ggplot( ) +
  geom_point(mapping = aes(x = displ, y = hwy)) # el mapping no es obligatorio

La gráfica muestra una relación negativa entre el tamaño del motor (displ) y la eficiencia del combustible (hwy). En otras palabras, los autos con motores grandes usan más combustible.

¿Esto confirma o refuta su hipótesis sobre la eficiencia del combustible y el tamaño del motor?

Volviendo un poco a la función, ggplot crea un sistema de coordenadas, por lo que al correr ggplot(data = mpg) nos dará…

ggplot(data = mpg)

La función geom_point ( ) agrega una capa de puntos a tu gráfica, lo que crea un diagrama de dispersión.

Cada función geom en ggplot2 toma un argumento de mapeo. Esto define cómo las variables en su conjunto de datos se asignan a las propiedades visuales.

El argumento de mapeo siempre está emparejado con aes ( ), y los argumentos x e y de aes ( ) especifican qué variables se deben asignar a los ejes x e y. ggplot2 busca las variables asignadas en el argumento de datos, en este caso, mpg

Entonces, el esquema general sería:

ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

Ejercicio 1

  1. Ejecuta ggplot(data = mpg) ¿Qué ves? ¿Por qué?

  2. ¿Cuantas filas y columnas hay en mpg?

  3. ¿Qué describe la variable drv? ¿Necesitaré alguna referencia o metadata del dataframe?

  4. Haz un scatterplotde hwy vs cyl

  5. ¿Qué sucede si hacemos un scatterplot de class vs drv? ¿Por qúe no es útil?

Soluciones ejercicio 1

ggplot(data = mpg)

Al crear ggplot un sistema de coordinadas, ggplot(data = mpg) crea un gráfico vacío

  1. Filas: 234, columnas: 11
glimpse(mpg)
## Observations: 234
## Variables: 11
## $ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "...
## $ model        <fct> a4, a4, a4, a4, a4, a4, a4, a4 quattro, a4 quattr...
## $ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0,...
## $ year         <dbl> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1...
## $ cyl          <fct> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6...
## $ trans        <fct> auto(l5), manual(m5), manual(m6), auto(av), auto(...
## $ drv          <fct> f, f, f, f, f, f, f, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4...
## $ cty          <dbl> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 1...
## $ hwy          <dbl> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 2...
## $ fl           <fct> p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p...
## $ class        <fct> compact, compact, compact, compact, compact, comp...
  1. Factor, levels: f = front-wheel drive, r = rear wheel drive, 4 = 4wd
levels(as.factor(mpg$drv))
## [1] "4" "f" "r"
ggplot(data=mpg)+
  geom_point(mapping=aes(x = hwy, y = cyl))

mpg %>%
  ggplot( )+
  geom_point(mapping = aes(x=class, y=drv, color=class))

Estéticas de mapping

“The greatest value of a picture is when it forces us to notice what we never expected to see.” — John Tukey

Observemos la distribución de los puntos… (usando la estética color o colour )

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class))+
  scale_color_manual(values = c("2seater" = "red",  "compact" = "black",  "midsize" = "black",  "minivan" = "black", "pickup" = "black",  "subcompact" = "black", "suv" = "black"))

Un grupo de puntos parece estar fuera de la tendencia lineal. Estos autos tienen un kilometraje más alto de lo que cabría esperar. ¿Cómo puedes explicar el por qué de estos autos??

¿y que tal si en vez de usar colores usamos la estética size?

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, size = class))
## Warning: Using size for a discrete variable is not advised.

Warning: Usar tamaños para variables discretas NO ES RECOMENDADO ya que mapear una variable no ordenada (clase) con una estética ordenada (tamaño) no es una buena idea

O podríamos haber asignado la clase a la estética alfa, que controla la transparencia de los puntos, o a la estética de la forma, que controla la forma de los puntos.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, alpha = class))
## Warning: Using alpha for a discrete variable is not advised.

o

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, shape = class), color = "blue")
## Warning: The shape palette can deal with a maximum of 6 discrete values
## because more than 6 becomes difficult to discriminate; you have 7.
## Consider specifying shapes manually if you must have them.
## Warning: Removed 62 rows containing missing values (geom_point).

¿y suv?

¿Qué pasó con los SUV? ggplot2 solo usará seis shape a la vez. De forma predeterminada, los grupos adicionales quedarán sin trazar cuando utilice la estética shape.

Para cada estética, utiliza aes ( ) para asociar el nombre de la estética con una variable para mostrar. La función aes ( ) reúne cada una de las asignaciones estéticas utilizadas por una capa y las pasa al argumento de asignación de la capa. La sintaxis destaca una visión útil sobre x e y: las ubicaciones x e y de un punto son en sí mismas estéticas, propiedades visuales que se pueden asignar a las variables para mostrar información sobre los datos.

También puede establecer las propiedades estéticas de su geom manualmente. Por ejemplo, podemos hacer que todos los puntos de nuestra trama sean azules:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy), color = "blue")

Aquí, el color no transmite información sobre una variable, pero cambia la apariencia de la gráfica. Para establecer una estética manualmente, establezca la estética por nombre como un argumento de su función geom; es decir, va fuera de aes ( ). Tendrás que elegir un nivel que tenga sentido para esa estética:

mpg %>%
  ggplot( ) +
  geom_point(mapping = aes(x = displ, y = hwy, colour = class))

Ahora, como se genera un sistema de coordenadas, a ese sistema le puedo agregar diferentes capas, pero primero empezemos con un gráfico

# Setup
data("midwest", package = "ggplot2")

# Add plot components
gg <- ggplot(midwest, aes(x = area, y = poptotal,
                          color = state, size = popdensity)) + 
  geom_point() + 
  geom_smooth(se = FALSE) +
  xlim(0, 0.1) +
  ylim(0, 500000) +
  labs(title = "Area vs. Population",
       x = "Area",
       y = "Population",
       caption = "Source: midwest")

# Call plot
gg
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

El tema predeterminado en ggplot2 es theme_gray. Puede usar un conjunto de temas prefabricados que son temas cohesivos que no requieren la modificación de elementos individuales.

gg + theme_gray()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg + theme_bw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg + theme_linedraw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg + theme_light()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg <- gg + theme_dark()
gg
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg <- gg + theme_classic()

gg
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg + theme_void()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).
## Warning: Removed 15 rows containing missing values (geom_point).

gg
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 15 rows containing non-finite values (stat_smooth).

## Warning: Removed 15 rows containing missing values (geom_point).

gg <- gg +
  theme_bw()

summary(gg)
## data: PID, county, state, area, poptotal, popdensity, popwhite,
##   popblack, popamerindian, popasian, popother, percwhite,
##   percblack, percamerindan, percasian, percother, popadults,
##   perchsd, percollege, percprof, poppovertyknown,
##   percpovertyknown, percbelowpoverty, percchildbelowpovert,
##   percadultpoverty, percelderlypoverty, inmetro, category [437x28]
## mapping:  x = ~area, y = ~poptotal, colour = ~state, size = ~popdensity
## scales:   x, xmin, xmax, xend, xintercept, xmin_final, xmax_final, xlower, xmiddle, xupper, y, ymin, ymax, yend, yintercept, ymin_final, ymax_final, lower, middle, upper 
## faceting: <ggproto object: Class FacetNull, Facet, gg>
##     compute_layout: function
##     draw_back: function
##     draw_front: function
##     draw_labels: function
##     draw_panels: function
##     finish_data: function
##     init_scales: function
##     map_data: function
##     params: list
##     setup_data: function
##     setup_params: function
##     shrink: TRUE
##     train_scales: function
##     vars: function
##     super:  <ggproto object: Class FacetNull, Facet, gg>
## -----------------------------------
## geom_point: na.rm = FALSE
## stat_identity: na.rm = FALSE
## position_identity 
## 
## geom_smooth: na.rm = FALSE, se = FALSE
## stat_smooth: na.rm = FALSE, se = FALSE, method = auto, formula = y ~ x
## position_identity

Introdujo los diagramas de caja-bigote…