class: center, middle # El tidyverse en acción ### Análisis estadístico utilizando R <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/tidyverse.png" width="10%" /> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/readr.png" width="10%" /><img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/tidyr.png" width="10%" /><img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/tibble.png" width="10%" /><img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/pipe.png" width="10%" /><img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/dplyr.png" width="10%" /> UNQ UNTreF CONICET Ignacio Spiousas [<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:#A42339;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg>](https://github.com/spiousas) [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:#A42339;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>](https://twitter.com/Spiousas) Pablo Etchemendy [<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:black;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg>](https://github.com/https://github.com/petcheme) [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:#black;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>](https://twitter.com/petcheme) 2021-08-02 --- class: left, top, highlight-last-item # Leamos unos datos ```r test <- read_csv(here("./presentaciones/2-3/data/test.csv")) #* test ``` ``` FALSE # A tibble: 4 × 3 FALSE id test_1 test_2 FALSE <chr> <dbl> <dbl> FALSE 1 George 82 62 FALSE 2 Elaine 74 71 FALSE 3 Jerry 56 76 FALSE 4 Cosmo 98 91 ``` Están en formato tidy? .right.tiny[`*` Para leerlo en sus computadoras no deben usar la función `here()`.] .right.tiny[Ya vamos a ver por qué la usamos acá.] --- class: left, top, highlight-last-item # Leamos unos datos No hay problema, **tidyr** al rescate con pivot_longer() ![:scale 5%](https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/tidyr.png) ```r test2 <- test %>% pivot_longer(c(test_1, test_2), names_to = "test", values_to = "grade") %>% arrange(id, test) test2 ``` ``` FALSE # A tibble: 8 × 3 FALSE id test grade FALSE <chr> <chr> <dbl> FALSE 1 Cosmo test_1 98 FALSE 2 Cosmo test_2 91 FALSE 3 Elaine test_1 74 FALSE 4 Elaine test_2 71 FALSE 5 George test_1 82 FALSE 6 George test_2 62 FALSE 7 Jerry test_1 56 FALSE 8 Jerry test_2 76 ``` Pero... ¿Qué son los **%>%**? --- class: left, top, highlight-last-item # Piping **%>%** Se utiliza **%>%** para encadenar una secuencia de acciones donde el **output** del paso anterior es el **input** del actual. .pull-left[ Por ejemplo, si queremos ordenar los valores de una lista: ```r x <- c(1, 3, 1, 2, 1, 3) x_unique <- unique(x) x_sorted <- sort(x_unique) x_sorted ``` ``` FALSE [1] 1 2 3 ``` ] .pull-right[ Las funciones se pueden encadenar en una línea de código ```r x <- c(1, 3, 1, 2, 1, 3) x_sorted <- x %>% unique() %>% sort() x_sorted ``` ``` FALSE [1] 1 2 3 ``` ] Es decir, la función después del **%>%** toma como input lo que sale del paso anterior. .center[![:scale 10%](https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/pipe.png)] Igual tranquilxs que lo vamos a usar **MUCHO** y ya va a ir quedando claro --- class: left, top, highlight-last-item # Acá llega lo bueno! Una vez que tenemos los datos acomodados podemos usar las funciones de **dplyr** En lo que sigue vamos a usar los datos de **Palmer penguins** ```r penguins %>% head() %>% kbl() %>% kable_styling(font_size = 14) ``` <table class="table" style="font-size: 14px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> species </th> <th style="text-align:left;"> island </th> <th style="text-align:right;"> bill_length_mm </th> <th style="text-align:right;"> bill_depth_mm </th> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> <th style="text-align:left;"> sex </th> <th style="text-align:right;"> year </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> </tbody> </table> --- class: left, top, highlight-last-item # Calculemos el promedio del peso por especie Primero agrupamos los datos por especie ```r grouped_penguins <- group_by(penguins, species) ``` --- class: left, top, highlight-last-item # Calculemos el promedio del peso por especie Y ahora calculamos el promedio ```r summarise(grouped_penguins, mass = mean(body_mass_g)) ``` ``` FALSE # A tibble: 3 × 2 FALSE species mass FALSE <fct> <dbl> FALSE 1 Adelie NA FALSE 2 Chinstrap 3733. FALSE 3 Gentoo NA ``` Automáticamente se da cuenta que los promedios deben ser por especie -- Vamos a sacarnos de encima a los NAs ```r summarise(grouped_penguins, mean_mass = mean(body_mass_g, na.rm = TRUE)) ``` ``` FALSE # A tibble: 3 × 2 FALSE species mean_mass FALSE <fct> <dbl> FALSE 1 Adelie 3701. FALSE 2 Chinstrap 3733. FALSE 3 Gentoo 5076. ``` --- class: left, top, highlight-last-item # Calculemos el promedio del peso por especie Pongamos en práctica el **%>%** ```r penguins %>% group_by(species) %>% summarise(mean_mass = mean(body_mass_g, na.rm = TRUE)) ``` ``` FALSE # A tibble: 3 × 2 FALSE species mean_mass FALSE <fct> <dbl> FALSE 1 Adelie 3701. FALSE 2 Chinstrap 3733. FALSE 3 Gentoo 5076. ``` El operador **%>%** no sólo nos ayuda a tener menos líneas de código sino un código **más ordenado** --- class: left, top, highlight-last-item # Calculemos una nueva columna ![:scale 30%](https://allisonhorst.github.io/palmerpenguins/reference/figures/culmen_depth.png) La vamos a hacer con la suma del ancho y largo del pico. El verbo de **dplyr** que vamos a usar ahora es **mutate()** ```r penguins %>% group_by(species) %>% mutate(sum_bill = bill_length_mm + bill_depth_mm) %>% head() ``` ``` FALSE # A tibble: 6 × 9 FALSE # Groups: species [1] FALSE species island bill_length_mm bill_depth_mm flipper_length_… body_mass_g sex FALSE <fct> <fct> <dbl> <dbl> <int> <int> <fct> FALSE 1 Adelie Torge… 39.1 18.7 181 3750 male FALSE 2 Adelie Torge… 39.5 17.4 186 3800 fema… FALSE 3 Adelie Torge… 40.3 18 195 3250 fema… FALSE 4 Adelie Torge… NA NA NA NA <NA> FALSE 5 Adelie Torge… 36.7 19.3 193 3450 fema… FALSE 6 Adelie Torge… 39.3 20.6 190 3650 male FALSE # … with 2 more variables: year <int>, sum_bill <dbl> ``` --- class: left, top, highlight-last-item # Elijamos algunas columnas Vamos a quedarnos con la **especie**, la **isla** y la **nueva columna**. El verbo para seleccionar columnas es... bueno... **select()** ```r penguins %>% group_by(species) %>% mutate(sum_bill = bill_length_mm + bill_depth_mm) %>% select(c(species, island, sum_bill)) ``` ``` FALSE # A tibble: 344 × 3 FALSE # Groups: species [3] FALSE species island sum_bill FALSE <fct> <fct> <dbl> FALSE 1 Adelie Torgersen 57.8 FALSE 2 Adelie Torgersen 56.9 FALSE 3 Adelie Torgersen 58.3 FALSE 4 Adelie Torgersen NA FALSE 5 Adelie Torgersen 56 FALSE 6 Adelie Torgersen 59.9 FALSE 7 Adelie Torgersen 56.7 FALSE 8 Adelie Torgersen 58.8 FALSE 9 Adelie Torgersen 52.2 FALSE 10 Adelie Torgersen 62.2 FALSE # … with 334 more rows ``` --- class: left, top, highlight-last-item # Y ahora elijamos unos casos Vamos a quedarnos con los especímentes en los que **sum_bill** es **mayor a 58 mm ** En este caso el verbo de **dplyr** que tenemos que usar es **filter()** ```r penguins %>% group_by(species) %>% mutate(sum_bill = bill_length_mm + bill_depth_mm) %>% select(c(species, island, sum_bill)) %>% filter(sum_bill > 58) ``` ``` FALSE # A tibble: 232 × 3 FALSE # Groups: species [3] FALSE species island sum_bill FALSE <fct> <fct> <dbl> FALSE 1 Adelie Torgersen 58.3 FALSE 2 Adelie Torgersen 59.9 FALSE 3 Adelie Torgersen 58.8 FALSE 4 Adelie Torgersen 62.2 FALSE 5 Adelie Torgersen 58.7 FALSE 6 Adelie Torgersen 59.8 FALSE 7 Adelie Torgersen 63.2 FALSE 8 Adelie Torgersen 67.5 FALSE 9 Adelie Biscoe 59.2 FALSE 10 Adelie Biscoe 58.4 FALSE # … with 222 more rows ``` Pasamos de **334** filas a **222** --- class: left, top, highlight-last-item # Por último, ordenarlos Vamos a ordenar los casos de menos a mayor **sum_bill** El último verbo de **dplyr** que nos queda es **arrange()** ```r penguins %>% group_by(species) %>% mutate(sum_bill = bill_length_mm + bill_depth_mm) %>% select(c(species, island, sum_bill)) %>% filter(sum_bill > 58) %>% arrange(sum_bill) ``` ``` FALSE # A tibble: 232 × 3 FALSE # Groups: species [3] FALSE species island sum_bill FALSE <fct> <fct> <dbl> FALSE 1 Adelie Torgersen 58.1 FALSE 2 Adelie Biscoe 58.2 FALSE 3 Gentoo Biscoe 58.2 FALSE 4 Adelie Torgersen 58.3 FALSE 5 Adelie Biscoe 58.4 FALSE 6 Adelie Dream 58.4 FALSE 7 Adelie Biscoe 58.6 FALSE 8 Adelie Dream 58.6 FALSE 9 Adelie Torgersen 58.7 FALSE 10 Gentoo Biscoe 58.7 FALSE # … with 222 more rows ``` Vimos como concatenar verbos de **dplyr** para extraer información de un dataset. --- class: left, top, highlight-last-item # Ahora pensemos en una apliación ### ¿Y si queremos eliminar outliers de peso por isla y por especie? Vamos a eliminar los casos en los que el peso sea mayor a **mediana + 1.5IQR** y menor a **mediana - 1.5IQR**, donde IQR es el intervalo intercuartil Pensemos los pasos que tenemos que llevar adelante * Calcular la mediana y el IQR por isla y especie * Agrupar por isla y por especia (**group_by()**) * Calcular la mediana e IQR por grupo (**summarise()**) * Armar una columna con los límites para poder comparar (**mutate()**) * Elegir sólo a los animales que están en ese intervalo (**filter()**) --- class: left, top, highlight-last-item # Outliers por especie y por isla ![:scale 10%](https://allisonhorst.github.io/palmerpenguins/reference/figures/culmen_depth.png) ### Calcular la mediana y el IQR por isla y especie Tenemos que hacer un group_by por isla y especie ```r penguins %>% group_by(species, island) %>% mutate(median_mass = median(body_mass_g, na.rm = TRUE), IQR_mass = IQR(body_mass_g, na.rm = TRUE)) ``` ``` FALSE # A tibble: 344 × 10 FALSE # Groups: species, island [5] FALSE species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g FALSE <fct> <fct> <dbl> <dbl> <int> <int> FALSE 1 Adelie Torgersen 39.1 18.7 181 3750 FALSE 2 Adelie Torgersen 39.5 17.4 186 3800 FALSE 3 Adelie Torgersen 40.3 18 195 3250 FALSE 4 Adelie Torgersen NA NA NA NA FALSE 5 Adelie Torgersen 36.7 19.3 193 3450 FALSE 6 Adelie Torgersen 39.3 20.6 190 3650 FALSE 7 Adelie Torgersen 38.9 17.8 181 3625 FALSE 8 Adelie Torgersen 39.2 19.6 195 4675 FALSE 9 Adelie Torgersen 34.1 18.1 193 3475 FALSE 10 Adelie Torgersen 42 20.2 190 4250 FALSE # … with 334 more rows, and 4 more variables: sex <fct>, year <int>, FALSE # median_mass <dbl>, IQR_mass <dbl> ``` --- class: left, top, highlight-last-item # Outliers por especie y por isla ![:scale 10%](https://allisonhorst.github.io/palmerpenguins/reference/figures/culmen_depth.png) ### Armar una columna con los límites para poder comparar Una columna **median_mass + 1.5*IQR_mass** y otra **median_mass - 1.5I*QR_mas** ```r penguins %>% group_by(species, island) %>% mutate(median_mass = median(body_mass_g, na.rm = TRUE), IQR_mass = IQR(body_mass_g, na.rm = TRUE)) %>% mutate(lim_sup = median_mass + 1.5*IQR_mass, lim_inf = median_mass - 1.5*IQR_mass) ``` ``` FALSE # A tibble: 344 × 12 FALSE # Groups: species, island [5] FALSE species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g FALSE <fct> <fct> <dbl> <dbl> <int> <int> FALSE 1 Adelie Torgersen 39.1 18.7 181 3750 FALSE 2 Adelie Torgersen 39.5 17.4 186 3800 FALSE 3 Adelie Torgersen 40.3 18 195 3250 FALSE 4 Adelie Torgersen NA NA NA NA FALSE 5 Adelie Torgersen 36.7 19.3 193 3450 FALSE 6 Adelie Torgersen 39.3 20.6 190 3650 FALSE 7 Adelie Torgersen 38.9 17.8 181 3625 FALSE 8 Adelie Torgersen 39.2 19.6 195 4675 FALSE 9 Adelie Torgersen 34.1 18.1 193 3475 FALSE 10 Adelie Torgersen 42 20.2 190 4250 FALSE # … with 334 more rows, and 6 more variables: sex <fct>, year <int>, FALSE # median_mass <dbl>, IQR_mass <dbl>, lim_sup <dbl>, lim_inf <dbl> ``` --- class: left, top, highlight-last-item # Outliers por especie y por isla ![:scale 10%](https://allisonhorst.github.io/palmerpenguins/reference/figures/culmen_depth.png) ### Armar una columna con los límites para poder comparar Las podemos armar de un sólo paso: ```r penguins %>% group_by(species, island) %>% mutate(lim_sup = median(body_mass_g, na.rm = TRUE) + 1.5*IQR(body_mass_g, na.rm = TRUE), lim_inf = median(body_mass_g, na.rm = TRUE) - 1.5*IQR(body_mass_g, na.rm = TRUE)) ``` ``` FALSE # A tibble: 344 × 10 FALSE # Groups: species, island [5] FALSE species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g FALSE <fct> <fct> <dbl> <dbl> <int> <int> FALSE 1 Adelie Torgersen 39.1 18.7 181 3750 FALSE 2 Adelie Torgersen 39.5 17.4 186 3800 FALSE 3 Adelie Torgersen 40.3 18 195 3250 FALSE 4 Adelie Torgersen NA NA NA NA FALSE 5 Adelie Torgersen 36.7 19.3 193 3450 FALSE 6 Adelie Torgersen 39.3 20.6 190 3650 FALSE 7 Adelie Torgersen 38.9 17.8 181 3625 FALSE 8 Adelie Torgersen 39.2 19.6 195 4675 FALSE 9 Adelie Torgersen 34.1 18.1 193 3475 FALSE 10 Adelie Torgersen 42 20.2 190 4250 FALSE # … with 334 more rows, and 4 more variables: sex <fct>, year <int>, FALSE # lim_sup <dbl>, lim_inf <dbl> ``` --- class: left, top, highlight-last-item # Outliers por especie y por isla ![:scale 10%](https://allisonhorst.github.io/palmerpenguins/reference/figures/culmen_depth.png) ### Elegir sólo a los animales que están en ese intervalo Ahora tenemos que filtrar los casos menores a **lim_sup** y mayores a **lim_inf** ```r penguins %>% group_by(species, island) %>% mutate(lim_sup = median(body_mass_g, na.rm = TRUE) + 1.5*IQR(body_mass_g, na.rm = TRUE), lim_inf = median(body_mass_g, na.rm = TRUE) - 1.5*IQR(body_mass_g, na.rm = TRUE)) %>% filter((body_mass_g<lim_sup) & (body_mass_g>lim_inf)) ``` ``` FALSE # A tibble: 326 × 10 FALSE # Groups: species, island [5] FALSE species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g FALSE <fct> <fct> <dbl> <dbl> <int> <int> FALSE 1 Adelie Torgersen 39.1 18.7 181 3750 FALSE 2 Adelie Torgersen 39.5 17.4 186 3800 FALSE 3 Adelie Torgersen 40.3 18 195 3250 FALSE 4 Adelie Torgersen 36.7 19.3 193 3450 FALSE 5 Adelie Torgersen 39.3 20.6 190 3650 FALSE 6 Adelie Torgersen 38.9 17.8 181 3625 FALSE 7 Adelie Torgersen 39.2 19.6 195 4675 FALSE 8 Adelie Torgersen 34.1 18.1 193 3475 FALSE 9 Adelie Torgersen 42 20.2 190 4250 FALSE 10 Adelie Torgersen 37.8 17.1 186 3300 FALSE # … with 316 more rows, and 4 more variables: sex <fct>, year <int>, FALSE # lim_sup <dbl>, lim_inf <dbl> ``` Pasamos de **344** a **326** casos --- class: center, top # Referencias .left[.big[ - Wickham, H. (2014). Tidy data. Journal of statistical software, 59(1), 1-23. - Wickham, H., & Grolemund, G. (2016). R for data science: import, tidy, transform, visualize, and model data. " O'Reilly Media, Inc.". ]]