Fuente: R for Data Science, Wickham & Grolemund
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
Antes de partir necesitamos:
ggplot2
y dplyr
No existe definición formal con reglas a seguir. Es un estado mental
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
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
# 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
Conjunto de procedimientos para resumir datos
Sintetizar información
Lo abres y
Tipos de Variables
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
Nos señalan el valor en torno al cual se concentran los datos
Son valores que nos describen la dispersión de los datos. Es decir, que tan concentrados están:
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
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á:
No todos los gráficos tiene ek mismo objetivo. Ni tampoco comparten siempre la dificultad para ser interpretados
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")
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
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()
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))
Fuente: http://uc-r.github.io/lollipop
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: 8,668
## Variables: 13
## $ `#EventID` <chr> "ci38012400", "ci38012384", "nn00607260", "n...
## $ Time <dttm> 2017-09-27 19:29:41, 2017-09-27 19:10:22, 2...
## $ Latitude <dbl> 33.47117, 34.99200, 37.07770, 38.81333, 38.5...
## $ Longitude <dbl> -116.4818, -118.1970, -117.8687, -122.8275, ...
## $ `Depth/km` <dbl> 13.16, -0.84, 15.80, 1.73, 1.77, 9.75, 16.07...
## $ Author <chr> "ci", "ci", "nn", "nc", "nc", "ci", "ci", "c...
## $ Catalog <chr> "ci", "ci", "nn", "nc", "nc", "ci", "ci", "c...
## $ Contributor <chr> "ci", "ci", "nn", "nc", "nc", "ci", "ci", "c...
## $ ContributorID <chr> "ci38012400", "ci38012384", "nn00607260", "n...
## $ MagType <chr> "ml", "ml", "ml", "md", "md", "ml", "ml", "m...
## $ Magnitude <dbl> 0.98, 1.30, 0.90, 0.68, 1.68, 1.32, 1.78, 1....
## $ MagAuthor <chr> "ci", "ci", "nn", "nc", "nc", "ci", "ci", "c...
## $ EventLocationName <chr> "20km ESE of Anza, CA", "7km SSW of Mojave, ...