a|1e|2d|1
e|1s|2t|1a|2d|3i|2s|2t|1i|1c|2a|1

Joshua Kunst, Septiembre 2017

Que haremos?

  • Introducción
  • Análsis Exploratorio de Datos (AED)
  • Estadística Descriptiva (ED)
    • Medidas de Tendencia
    • Visualización de datos
  • Estudiar Ejemplos , hacer ejemplos, equivocarnos, corregirnos, vivir ejemplos

Introducción

Introducción

Fuente: R for Data Science, Wickham & Grolemund

Introducción

Antes de explicar debemos entender

El Análisis Exploratorio y la Estadística Descriptiva son parte clave para el entendimiento

AED y ED van de la mano. AED es el fin y ED una herramienta para lograrlo

Escuchar lo que los datos nos hablan

Glosario

  • Una variable es una cantidad, que puede ser medida: estatura, magnitud de un sismo, velocidad de un huracán, inteligencia (¿?)
  • Un valor es un estado de la variable cuando se mide: 1.20 metros, 8° Richter
  • Una observación o caso es un conjunto de mediciones -no de la misma variable necesariamente- pero si en un mismo instante y a un mismo objeto.

Glosario

  • Datos tabulados es un conjunto de valores cada uno asociado a una variable y una observación

Prerequisitos

Antes de partir necesitamos:

  • Entusiasmo
  • Mantener la mente abierta
  • Familiarizado con ggplot2 y dplyr

Análisis Exploratorio de Datos

Análisis Exploratorio de Datos

No existe definición formal con reglas a seguir. Es un estado mental

  • Generar preguntas acerca de los datos
  • Buscar respuestas visualizando, transformando los datos
  • Hacer nuevas preguntas a partir de lo aprendido

Generar conocimiento

Generar conocimiento no solo implica extraer la información que tratan de medir los datos

Este conocimiento puede estar también en conocer si los datos fueron bien medidos o existen algunos registros datos mal registrados

Validar calidad de los datos

Visualizando Distribuciones

Distribución

Distribución se relaciona a la forma que varían los datos de medición en medición

Estudiando la forma de como se distribuyen los datos podemos ver cuales son los más comunes, o ver si exsiten casos raros

Y variará principalmente del tipo de variable analizada: categórica o continua

Dataset Legos

# cargar paquete con funciones que nos ayudarán
library(tidyverse)

# leo datos desde una url
legos <- read_csv("https://raw.githubusercontent.com/seankross/lego/master/data-tidy/legosets.csv")

# primer paso! paso #1
glimpse(legos)
## Observations: 6,172
## Variables: 14
## $ Item_Number  <chr> "10246", "10247", "10248", "10249", "10581", "105...
## $ Name         <chr> "Detective's Office", "Ferris Wheel", "Ferrari F4...
## $ Year         <int> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2...
## $ Theme        <chr> "Advanced Models", "Advanced Models", "Advanced M...
## $ Subtheme     <chr> "Modular Buildings", "Fairground", "Vehicles", "W...
## $ Pieces       <int> 2262, 2464, 1158, 898, 13, 39, 32, 105, 13, 11, 5...
## $ Minifigures  <int> 6, 10, NA, NA, 1, 2, 2, 3, 2, 2, 3, 1, NA, NA, NA...
## $ Image_URL    <chr> "http://images.brickset.com/sets/images/10246-1.j...
## $ GBP_MSRP     <dbl> 132.99, 149.99, 69.99, 59.99, 9.99, 16.99, 19.99,...
## $ USD_MSRP     <dbl> 159.99, 199.99, 99.99, 79.99, 9.99, 19.99, 24.99,...
## $ CAD_MSRP     <dbl> 199.99, 229.99, 119.99, NA, 12.99, 24.99, 29.99, ...
## $ EUR_MSRP     <dbl> 149.99, 179.99, 89.99, 69.99, 9.99, 19.99, 24.99,...
## $ Packaging    <chr> "Box", "Box", "Box", "Box", "Box", "Box", "Box", ...
## $ Availability <chr> "Retail - limited", "Retail - limited", "LEGO exc...

¿Cuántos temas hay?

legos %>% count(Theme, sort = TRUE)
## # A tibble: 115 x 2
##                      Theme     n
##                      <chr> <int>
##  1                   Duplo   471
##  2               Star Wars   379
##  3                    Town   314
##  4 Collectable Minifigures   311
##  5                    City   282
##  6                Bionicle   276
##  7                 Technic   243
##  8                 Creator   219
##  9                  Castle   206
## 10                  Racers   195
## # ... with 105 more rows

¿Cuántos temas hay?

ggplot(legos) +
  geom_bar(aes(Theme))

¿Cuántos temas hay?

Muy seguro nos encontraremos con cosas de este estilo donde tenemos que modificar nuestros resultados

¿Cuántos temas hay?

library(forcats)

# creamos variable derivada que agrupe grupe las otras
# categorías que no corresponden a los 7 más grandes 
# fct_lump
legos <- mutate(legos, Theme2 = fct_lump(Theme, n = 7))
ggplot(legos) + geom_bar(aes(Theme2))

¿Cuáles son los tipos de envoltorio?

legos %>% count(Packaging, sort = TRUE)
## # A tibble: 14 x 2
##                Packaging     n
##                    <chr> <int>
##  1                   Box  3102
##  2         Not specified  1747
##  3               Polybag   619
##  4             Foil pack   291
##  5          Blister pack   100
##  6              Canister    78
##  7           Loose Parts    72
##  8                   Tub    40
##  9                Bucket    36
## 10                 Other    36
## 11        Shrink-wrapped    18
## 12 Box with backing card    17
## 13           Plastic box    10
## 14                   Tag     6

¿Cuáles son los tipos de envoltorio?

ggplot(legos) +
  geom_bar(aes(Packaging))

¿Y esas etiquetas?

¿Y esas etiquetas?

ggplot(legos) +
  geom_bar(aes(Packaging)) +
  coord_flip() # rotar :D

¿Y esas etiquetas?

legos <- mutate(legos, Packaging = fct_infreq(Packaging)) # ordenar
ggplot(legos) +
  geom_bar(aes(Packaging)) + coord_flip() # rotar :D

¿Desde cuándo se tenemos registros de sets de legos?*

ggplot(legos) +
  geom_bar(aes(Year))

¿Cuántas piezas traen los sets?

ggplot(legos) +
  geom_histogram(aes(Pieces))

¿Cuántas piezas traen los sets?

legos <- mutate(legos, Pieces2 = ifelse(Pieces > 1000, 1000, Pieces))
ggplot(legos) + geom_histogram(aes(Pieces2))

¿Cuántas minifuguras traen los sets?

ggplot(legos) +
  geom_histogram(aes(Minifigures))

¿Cuántos sets traen más de 25 figuras? ¿Cuáles son?

legos %>% 
  filter(Minifigures > 25) %>% 
  select(Name, Year, Theme, Minifigures)
## # A tibble: 5 x 4
##                            Name  Year     Theme Minifigures
##                           <chr> <int>     <chr>       <int>
## 1     The Battle for Helms Deep  2013     Games          28
## 2 Star Wars: The Battle of Hoth  2012     Games          32
## 3             Community Workers  2006 Education          31
## 4             Community Workers  2005 Education          31
## 5             Community Workers  1996     Dacta          30

Al infinito y más allá

Estadística Descriptiva

Estadística Descriptiva

Conjunto de procedimientos para resumir datos

  • Medidas de tendencia central y dispersión. No solo basta con ver que valores puede tomar una variable
  • Visualización de datos. Distintos gráficos nos cuentan diferente información acerca de la variable(s)

Sintetizar información

Motivación

  • Te mandan un inocente archivo
  • Te pieden que describas el contenido
  • Y obtengas información relevante
  • Claramente nunca habías visto este tipo de información

Lo abres y

Glosario

Tipos de Variables

  • Categórica
    • Nominal. Especie: perro, gato
    • Ordinal. Satistacción bueno, malo, …
  • Cuantitativa
    • Discreta. # hijos: 0, 1, 2, …
    • Continua. Peso; 3.54, 5.45

Medidas de Tendencia y Dispersión

Son indicadores (generalmente un número) obtenidos de los datos que resumen información y nos hablan de alguna característica de la distribución de la variable

Nos ayudan a tener una idea más fina en donde se concentran las variables y que tan concentrados están los valores

Medidas de Tendencia Central

Nos señalan el valor en torno al cual se concentran los datos

  • Media o Promedio: La suma de los datos dividido por la cantidad de los mismos
  • Mediana: Es el valor que está al medio cuando los datos se ordenan
  • Moda: Es el valor que más se repite. Este se usa cuando la variable es discreta

Medidas de Dispersión

Son valores que nos describen la dispersión de los datos. Es decir, que tan concentrados están:

  • Desviación estándar: Mide el grado de dispersión en torno a la media
  • Rango: Es el tamaño del intervalo que cubren los datos, el mayor valor menos el mínimo

Ejemplo equipos

DataSaurus

library(datasauRus) # install.packages("datasauRus")

# exploramos
datasaurus_dozen
## # A tibble: 1,846 x 3
##    dataset       x       y
##      <chr>   <dbl>   <dbl>
##  1    dino 55.3846 97.1795
##  2    dino 51.5385 96.0256
##  3    dino 46.1538 94.4872
##  4    dino 42.8205 91.4103
##  5    dino 40.7692 88.3333
##  6    dino 38.7179 84.8718
##  7    dino 35.6410 79.8718
##  8    dino 33.0769 77.5641
##  9    dino 28.9744 74.4872
## 10    dino 26.1538 71.4103
## # ... with 1,836 more rows
# contamos categorías de la variable `dataset`
datasaurus_dozen %>% 
  count(dataset)
## # A tibble: 13 x 2
##       dataset     n
##         <chr> <int>
##  1       away   142
##  2   bullseye   142
##  3     circle   142
##  4       dino   142
##  5       dots   142
##  6    h_lines   142
##  7 high_lines   142
##  8 slant_down   142
##  9   slant_up   142
## 10       star   142
## 11    v_lines   142
## 12 wide_lines   142
## 13    x_shape   142
# creamos dos sub data frames
d1 <- datasaurus_dozen %>% filter(dataset == "away")
d2 <- datasaurus_dozen %>% filter(dataset == "dino")

Exploramos la primera

glimpse(d1)
## Observations: 142
## Variables: 3
## $ dataset <chr> "away", "away", "away", "away", "away", "away", "away"...
## $ x       <dbl> 32.33111, 53.42146, 63.92020, 70.28951, 34.11883, 67.6...
## $ y       <dbl> 61.411101, 26.186880, 30.832194, 82.533649, 45.734551,...
d1 %>% 
  summarise(
    x_mean = mean(x),
    y_mean = mean(y),
    x_sd = sd(x),
    y_sd = sd(y),
    xy_corr = cor(x, y)
  )
## # A tibble: 1 x 5
##    x_mean   y_mean     x_sd     y_sd     xy_corr
##     <dbl>    <dbl>    <dbl>    <dbl>       <dbl>
## 1 54.2661 47.83472 16.76982 26.93974 -0.06412835

Luego la segunda

glimpse(d2)
## Observations: 142
## Variables: 3
## $ dataset <chr> "dino", "dino", "dino", "dino", "dino", "dino", "dino"...
## $ x       <dbl> 55.3846, 51.5385, 46.1538, 42.8205, 40.7692, 38.7179, ...
## $ y       <dbl> 97.1795, 96.0256, 94.4872, 91.4103, 88.3333, 84.8718, ...
d2 %>% 
  summarise(
    x_mean = mean(x),
    y_mean = mean(y),
    x_sd = sd(x),
    y_sd = sd(y),
    xy_corr = cor(x, y)
  )
## # A tibble: 1 x 5
##     x_mean   y_mean     x_sd    y_sd     xy_corr
##      <dbl>    <dbl>    <dbl>   <dbl>       <dbl>
## 1 54.26327 47.83225 16.76514 26.9354 -0.06447185

Resultados muy similares ¿Asumimos que los datos distribuyen igual?

ggplot(d1) + geom_point(aes(x, y))
ggplot(d2) + geom_point(aes(x, y))

datasaurus_dozen %>% 
  group_by(dataset) %>% 
  summarise(
    x_mean = mean(x),
    y_mean = mean(y),
    x_sd = sd(x),
    y_sd = sd(y),
    xy_corr = cor(x, y)
  )
## # A tibble: 13 x 6
##       dataset   x_mean   y_mean     x_sd     y_sd     xy_corr
##         <chr>    <dbl>    <dbl>    <dbl>    <dbl>       <dbl>
##  1       away 54.26610 47.83472 16.76982 26.93974 -0.06412835
##  2   bullseye 54.26873 47.83082 16.76924 26.93573 -0.06858639
##  3     circle 54.26732 47.83772 16.76001 26.93004 -0.06834336
##  4       dino 54.26327 47.83225 16.76514 26.93540 -0.06447185
##  5       dots 54.26030 47.83983 16.76774 26.93019 -0.06034144
##  6    h_lines 54.26144 47.83025 16.76590 26.93988 -0.06171484
##  7 high_lines 54.26881 47.83545 16.76670 26.94000 -0.06850422
##  8 slant_down 54.26785 47.83590 16.76676 26.93610 -0.06897974
##  9   slant_up 54.26588 47.83150 16.76885 26.93861 -0.06860921
## 10       star 54.26734 47.83955 16.76896 26.93027 -0.06296110
## 11    v_lines 54.26993 47.83699 16.76996 26.93768 -0.06944557
## 12 wide_lines 54.26692 47.83160 16.77000 26.93790 -0.06657523
## 13    x_shape 54.26015 47.83972 16.76996 26.93000 -0.06558334
ggplot(filter(datasaurus_dozen, dataset != "circle")) +
  geom_point(aes(x, y, color = dataset), size = 0.6) + 
  facet_wrap(~ dataset) + # hacer mini multiples segun la variable dataset
  theme(legend.position = "none")

Si te dicen que en una película a la mitad se pone entretenida, existen muchas películas que que cumplen dicha característica y no necesariamente habla de la que tu conoces que a la mitad se vuelve entretenida

Visualización de datos

Visualización de datos

Se refiere a la representación gráfica de los datos codificando la información como: posición, tamaño, formas, colores

Existen muchos tipos de gráficos, y su uso dependerá:

  • Tipo de variable
  • Información que quiero extraer

No todos los gráficos tiene ek mismo objetivo. Ni tampoco comparten siempre la dificultad para ser interpretados

Variables Categóricas

La forma más usual de visualizar una variable categórica es a través de gráfico de barras o columnas

legos2 <- filter(legos, Theme2 != "Other")
ggplot(legos2) + geom_bar(aes(Theme, fill = Theme))

También un muy usado es el pie chart

También un muy (ab)usado es el pie chart

También existen otras alternativas como el treemap ¿?

library(treemapify) # install.packages("treemapify")
ggplot(count(legos2, Theme)) +
  geom_treemap(aes(area = n, fill = n)) +
  geom_treemap_text(aes(area = n, label = Theme), color = "white")

Variables Numéricas

La forma más usual de visualizar la distribución es usando el histograma

ggplot(legos2) +
  geom_histogram(aes(Year))

Revisemos http://tinlizzie.org/histograms/

Según la forma de la distribución, existen categorías:

Existen otras alternativas. En datos simétricos:

Datos bimodales

Datos uniformemente distribuídos

Variable Asimétrica

2 Variables Categóricas

El heatmap es una usual alternativa

legos2 %>% 
  mutate(Pieces_cat = cut_number(Pieces, 7)) %>% 
  count(Theme, Pieces_cat) %>% 
  ggplot() +
  geom_tile(aes(Theme, Pieces_cat, fill = n)) + scale_fill_viridis()

2 Variables Numéricas + Tips

ggplot(legos) + 
  geom_point(aes(Pieces, USD_MSRP))

Wakatela

ggplot(legos) + 
  geom_point(aes(Pieces, USD_MSRP)) +
  scale_y_sqrt() + scale_x_sqrt()

Le sigue faltando cariño

ggplot(legos2) + 
  geom_point(aes(Pieces, USD_MSRP, size = Minifigures, color = Year, shape = Theme), alpha = 0.7) +
  scale_y_sqrt(name = "Precio USD", labels = dollar, limits = c(0, 300)) +
  scale_x_sqrt(name = "Piezas", labels = comma, limits = c(0, 2000)) 

No saturar de cariño

No saturar ni sobre complejizar

ggplot(legos) + 
  geom_point(aes(Pieces, USD_MSRP, size = Minifigures, color = Year), alpha = 0.7) +
  scale_color_viridis(option = "A") + 
  scale_y_sqrt(name = "Precio USD", labels = dollar, limits = c(0, 300)) +
  scale_x_sqrt(name = "Piezas", labels = comma, limits = c(0, 2000)) 

Menciones Honrosas (menos estándar)

Lollipop

Fuente: http://uc-r.github.io/lollipop

Joyploy

Ejercicio I

Datos

Dado la contigencia, estudiaremos la magnitud de los temblores en el pasado mes.

seismic monitor data api https://earthquake.usgs.gov/fdsnws/event/1/

library(tidyverse)

data <- read_delim("https://earthquake.usgs.gov/fdsnws/event/1/query?starttime=2017-09-01&endtime=2017-09-31&format=text", delim = "|")
glimpse(data)
## Observations: 9,962
## Variables: 13
## $ `#EventID`        <chr> "ak16965324", "ci38015888", "us2000axbj", "u...
## $ Time              <dttm> 2017-09-30 23:50:56, 2017-09-30 23:43:39, 2...
## $ Latitude          <dbl> 63.14940, 36.06100, 42.65200, 42.65450, 42.6...
## $ Longitude         <dbl> -152.7432, -117.4702, -111.4566, -111.4606, ...
## $ `Depth/km`        <dbl> 11.60, 4.54, 6.15, 4.98, 3.19, 39.10, 2.96, ...
## $ Author            <chr> "ak", "ci", "us", "us", "us", "ak", "ci", "u...
## $ Catalog           <chr> "ak", "ci", "us", "us", "us", "ak", "ci", "u...
## $ Contributor       <chr> "ak", "ci", "us", "us", "us", "ak", "ci", "u...
## $ ContributorID     <chr> "ak16965324", "ci38015888", "us2000axbj", "u...
## $ MagType           <chr> "ml", "ml", "ml", "ml", "ml", "ml", "ml", "m...
## $ Magnitude         <dbl> 1.10, 0.64, 3.20, 2.80, 2.70, 1.20, 1.87, 5....
## $ MagAuthor         <chr> "ak", "ci", "us", "us", "us", "ak", "ci", "u...
## $ EventLocationName <chr> "145km E of McGrath, Alaska", "33km N of Sea...

Dudas?!