class: center, middle, inverse, title-slide .title[ # Taller 2.1: Herramientas adicionales para limpieza de datos ] .author[ ### Carlos Daboin Contreras ] .date[ ### October, 2023 ] --- # Friendly remainder * Los analistas y cientÃficos de datos dedican el 80% de su tiempo a la limpieza de datos. * Hay mil maneras de tener datos desordenados, pero solo una de tenerlos ordenados. * LibrerÃas de análisis de datos como dplyr y ggplot2 funcionan de maravilla en datos **TIDY**. * Para el análisis de regresión necesitamos los datos en este formato.  --- layout:true # World Development Indicators (WDI) --- Descarquemos un archivo de los WDI directamente desde el [databank del Banco Mundial](https://databank.worldbank.org/source/world-development-indicators). ```r WDI_wide<-read_csv("../data/WDI_extract_data.csv") ``` ¿Se parece a los datos que usamos la clase anterior para el análisis de datos? --- Un vistazo a las primeras filas. ```r # head() muestra por default las primeras 10 WDI_wide %>% head() ``` ``` ## # A tibble: 6 × 65 ## `Country Name` `Country Code` `Series Name` `Series Code` `1960 [YR1960]` ## <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG GDP per capita (c… NY.GDP.PCAP.… 59.77323370321… ## 2 Afghanistan AFG GDP (current US$) NY.GDP.MKTP.… 537777811.1111… ## 3 Afghanistan AFG Life expectancy a… SP.DYN.LE00.… 32.446 ## 4 Afghanistan AFG Population, total SP.POP.TOTL 8996967 ## 5 Albania ALB GDP per capita (c… NY.GDP.PCAP.… .. ## 6 Albania ALB GDP (current US$) NY.GDP.MKTP.… .. ## # ℹ 60 more variables: `1961 [YR1961]` <chr>, `1962 [YR1962]` <chr>, ## # `1963 [YR1963]` <chr>, `1964 [YR1964]` <chr>, `1965 [YR1965]` <chr>, ## # `1966 [YR1966]` <chr>, `1967 [YR1967]` <chr>, `1968 [YR1968]` <chr>, ## # `1969 [YR1969]` <chr>, `1970 [YR1970]` <chr>, `1971 [YR1971]` <chr>, ## # `1972 [YR1972]` <chr>, `1973 [YR1973]` <chr>, `1974 [YR1974]` <chr>, ## # `1975 [YR1975]` <chr>, `1976 [YR1976]` <chr>, `1977 [YR1977]` <chr>, ## # `1978 [YR1978]` <chr>, `1979 [YR1979]` <chr>, `1980 [YR1980]` <chr>, … ``` --- No olvidemos de revisar las últimas (las mayores sorpresas suelen encontrarse allÃ.) ```r # tail() muestra por default las últimas 10 WDI_wide %>% tail() ``` ``` ## # A tibble: 6 × 65 ## `Country Name` `Country Code` `Series Name` `Series Code` `1960 [YR1960]` ## <chr> <chr> <chr> <chr> <chr> ## 1 World WLD Population, … SP.POP.TOTL 3032156070 ## 2 <NA> <NA> <NA> <NA> <NA> ## 3 <NA> <NA> <NA> <NA> <NA> ## 4 <NA> <NA> <NA> <NA> <NA> ## 5 Data from database… <NA> <NA> <NA> <NA> ## 6 Last Updated: 07/3… <NA> <NA> <NA> <NA> ## # ℹ 60 more variables: `1961 [YR1961]` <chr>, `1962 [YR1962]` <chr>, ## # `1963 [YR1963]` <chr>, `1964 [YR1964]` <chr>, `1965 [YR1965]` <chr>, ## # `1966 [YR1966]` <chr>, `1967 [YR1967]` <chr>, `1968 [YR1968]` <chr>, ## # `1969 [YR1969]` <chr>, `1970 [YR1970]` <chr>, `1971 [YR1971]` <chr>, ## # `1972 [YR1972]` <chr>, `1973 [YR1973]` <chr>, `1974 [YR1974]` <chr>, ## # `1975 [YR1975]` <chr>, `1976 [YR1976]` <chr>, `1977 [YR1977]` <chr>, ## # `1978 [YR1978]` <chr>, `1979 [YR1979]` <chr>, `1980 [YR1980]` <chr>, … ``` --- **Hay varios problemas:** - Cada año es una columna - Cada fila tiene muchas observaciones. - Cada columna tiene multiples variables. - Nombres con espacios: son incómodos a la hora de programar. - Los missing values se identifican con ".." y esto hace que los valores estén en formato texto. - Tiene comentarios, espacios en blanco, y otros elementos que nos entorpecen. - En la misma tabla tengo paÃses, continentes, y bloques geopolÃticos. - Necesitamos la columna de continente por separado. --- Tratemos de replicar los datos que usamos en la clase pasada desde cero. .pull-left[ Pasemos de esto  ] .pull-right[ ...a esto  ] --- layout: false # Planifiquemos la reparación Nuestros aliados serán las librerÃas: dplyr, janitor, stringr (nueva) y tidyr (nueva). Etapa 1: Limpieza general y filtrado. * Cambiar nombres de las columnas para que sean code-firendly. * Remover variables que no necesitmaos. * Remover observaciones que no necesitamos. Etapa 2: Transformación a formato tidy. * Cambiar de formato original a formato tidy. Etapa 3: Mejoras adicionales * Cambiar variables numéricas a formato númerico. * Añadir columna con el continente al que pertenece cada paÃs. --- layout: true # Etapa 1: Limpieza general y filtrado .footnote[Recuerda que los dos puntos despues del nombre de una libreria sirven para invocar a sus funciones.] --- ```r WDI_long<-WDI_wide %>% # janitor::clean_names() remueve espacios y Mayusc de column names * janitor::clean_names() ``` ``` ## # A tibble: 4 × 8 ## country_name country_code series_name series_code x1960_yr1960 x1961_yr1961 ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG GDP per capit… NY.GDP.PCA… 59.77323370… 59.86089999… ## 2 Afghanistan AFG GDP (current … NY.GDP.MKT… 537777811.1… 548888895.5… ## 3 Afghanistan AFG Life expectan… SP.DYN.LE0… 32.446 32.962 ## 4 Afghanistan AFG Population, t… SP.POP.TOTL 8996967 9169406 ## # ℹ 2 more variables: x1962_yr1962 <chr>, x1963_yr1963 <chr> ``` --- ```r WDI_long<-WDI_wide %>% # janitor::clean_names() remueve espacios y mayusculas del nombre de las columnas janitor::clean_names() %>% # Remover columnas que no van a necesitar * dplyr::select(-series_code) ``` ``` ## # A tibble: 4 × 8 ## country_name country_code series_name x1960_yr1960 x1961_yr1961 x1962_yr1962 ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG GDP per capi… 59.77323370… 59.86089999… 58.45800869… ## 2 Afghanistan AFG GDP (current… 537777811.1… 548888895.5… 546666677.7… ## 3 Afghanistan AFG Life expecta… 32.446 32.962 33.471 ## 4 Afghanistan AFG Population, … 8996967 9169406 9351442 ## # ℹ 2 more variables: x1963_yr1963 <chr>, x1964_yr1964 <chr> ``` --- .pull-left[ ```r WDI_long<-WDI_wide %>% # janitor::clean_names() remueve espacios y mayusculas del nombre de las columnas janitor::clean_names() %>% # Remover columnas que no van a necesitar dplyr::select(-series_code) %>% # Remover registros problematicos * dplyr::filter(! (is.na(country_code) | country_name=="World")) # ``` ``` ## # A tibble: 4 × 8 ## country_name country_code series_name x1960_yr1960 x1961_yr1961 x1962_yr1962 ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG GDP per capi… 59.77323370… 59.86089999… 58.45800869… ## 2 Afghanistan AFG GDP (current… 537777811.1… 548888895.5… 546666677.7… ## 3 Afghanistan AFG Life expecta… 32.446 32.962 33.471 ## 4 Afghanistan AFG Population, … 8996967 9169406 9351442 ## # ℹ 2 more variables: x1963_yr1963 <chr>, x1964_yr1964 <chr> ``` ] .pull-right[ **Operadores lógicos:** * ! (NOT) se usa para negar una condición lógica. * | (OR) es un operador lógico de unión de condiciones. * & (AND) es un operador lógico de intersección de condiciones. ] --- layout:true # Etapa 2: Pongamos la data en formato tidy --- Asà está quedando nuestra data: ```r head(WDI_long) ``` ``` ## # A tibble: 6 × 64 ## country_name country_code series_name x1960_yr1960 x1961_yr1961 x1962_yr1962 ## <chr> <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG GDP per capi… 59.77323370… 59.86089999… 58.45800869… ## 2 Afghanistan AFG GDP (current… 537777811.1… 548888895.5… 546666677.7… ## 3 Afghanistan AFG Life expecta… 32.446 32.962 33.471 ## 4 Afghanistan AFG Population, … 8996967 9169406 9351442 ## 5 Albania ALB GDP per capi… .. .. .. ## 6 Albania ALB GDP (current… .. .. .. ## # ℹ 58 more variables: x1963_yr1963 <chr>, x1964_yr1964 <chr>, ## # x1965_yr1965 <chr>, x1966_yr1966 <chr>, x1967_yr1967 <chr>, ## # x1968_yr1968 <chr>, x1969_yr1969 <chr>, x1970_yr1970 <chr>, ## # x1971_yr1971 <chr>, x1972_yr1972 <chr>, x1973_yr1973 <chr>, ## # x1974_yr1974 <chr>, x1975_yr1975 <chr>, x1976_yr1976 <chr>, ## # x1977_yr1977 <chr>, x1978_yr1978 <chr>, x1979_yr1979 <chr>, ## # x1980_yr1980 <chr>, x1981_yr1981 <chr>, x1982_yr1982 <chr>, … ``` --- Pongamos los años en una sola columna con la función **tidyr::pivot_longer()** <img src="Workshop_021_slides_files/tidyr-gather.png" width="100%" /> --- layout: true class: inverse # Ejemplo de pivot_longer(): datos de Billboard --- ```r ### Cada semana esta en una columna, y los valores son la cantidad de reproducciones por semana head(tidyr::billboard) ``` ``` ## # A tibble: 6 × 79 ## artist track date.entered wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8 ## <chr> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 2 Pac Baby… 2000-02-26 87 82 72 77 87 94 99 NA ## 2 2Ge+her The … 2000-09-02 91 87 92 NA NA NA NA NA ## 3 3 Doors Do… Kryp… 2000-04-08 81 70 68 67 66 57 54 53 ## 4 3 Doors Do… Loser 2000-10-21 76 76 72 69 67 65 55 59 ## 5 504 Boyz Wobb… 2000-04-15 57 34 25 17 17 31 36 49 ## 6 98^0 Give… 2000-08-19 51 39 34 26 26 19 2 2 ## # ℹ 68 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>, ## # wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>, ## # wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>, ## # wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>, ## # wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>, ## # wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>, ## # wk43 <dbl>, wk44 <dbl>, wk45 <dbl>, wk46 <dbl>, wk47 <dbl>, wk48 <dbl>, … ``` --- ```r tidyr::billboard %>% tidyr::pivot_longer( cols = starts_with("wk"), # columnas para transponer en formato long names_to = "week", # string con el nombre de la columna que contendra los nombres de las columnas names_prefix = "wk", # expresion regular (investigen esto) que remueve la parte de los nombres que no nos guste values_to = "rank", # columna nueva que tendra los valores de las columnas transpuestas values_drop_na = TRUE # muchas celdas no tenian valores. Escoge si los conservas o los remueves )%>%head() ``` ``` ## # A tibble: 6 × 5 ## artist track date.entered week rank ## <chr> <chr> <date> <chr> <dbl> ## 1 2 Pac Baby Don't Cry (Keep... 2000-02-26 1 87 ## 2 2 Pac Baby Don't Cry (Keep... 2000-02-26 2 82 ## 3 2 Pac Baby Don't Cry (Keep... 2000-02-26 3 72 ## 4 2 Pac Baby Don't Cry (Keep... 2000-02-26 4 77 ## 5 2 Pac Baby Don't Cry (Keep... 2000-02-26 5 87 ## 6 2 Pac Baby Don't Cry (Keep... 2000-02-26 6 94 ``` --- layout:true # Etapa 2: Pongamos la data en formato tidy --- ```r WDI_long<-WDI_long %>% # Cada variable debe tener su propia columna # 1. Unifica las columnas de año. # tidyr::pivot_longer trasnpone K columnas en 2 columnas: # una con los nombres de las antiguas columnas, y otra con los valores tidyr::pivot_longer(cols = starts_with("x"), names_to = "year", values_to="value" ) # Pregunta: Que información hay en la columna value? head(filter(WDI_long,country_code=="AFG"&year=="x1960_yr1960")) ``` ``` ## # A tibble: 4 × 5 ## country_name country_code series_name year value ## <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG GDP per capita (current US$) x1960… 59.7… ## 2 Afghanistan AFG GDP (current US$) x1960… 5377… ## 3 Afghanistan AFG Life expectancy at birth, total (years) x1960… 32.4… ## 4 Afghanistan AFG Population, total x1960… 8996… ``` --- Aún falta: Hay que poner cada indicador en su propia columna con la función **tidyr::pivot_wider()** <img src="Workshop_021_slides_files/tidyr-spread.png" width="60%" height="60%" /> --- layout: true class: inverse # Ejemplo de pivot_wider(): datos de ingresos y alquileres --- Tienes estimados y margeness de error para ingresos y precios de alquiler: ```r head(us_rent_income) ``` ``` ## # A tibble: 6 × 5 ## GEOID NAME variable estimate moe ## <chr> <chr> <chr> <dbl> <dbl> ## 1 01 Alabama income 24476 136 ## 2 01 Alabama rent 747 3 ## 3 02 Alaska income 32940 508 ## 4 02 Alaska rent 1200 13 ## 5 04 Arizona income 27517 148 ## 6 04 Arizona rent 972 4 ``` --- ```r # Generando una columna para los estimados y otra para los alquileres us_rent_income %>% pivot_wider(names_from = variable, # La variable con las variables a trasponer values_from = c(estimate, moe) # La(s) variable(s) que tienen los valores ) %>% head() ``` ``` ## # A tibble: 6 × 6 ## GEOID NAME estimate_income estimate_rent moe_income moe_rent ## <chr> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 01 Alabama 24476 747 136 3 ## 2 02 Alaska 32940 1200 508 13 ## 3 04 Arizona 27517 972 148 4 ## 4 05 Arkansas 23789 709 165 5 ## 5 06 California 29454 1358 109 3 ## 6 08 Colorado 32401 1125 109 5 ``` --- layout: true # Etapa 2: Pongamos la data en formato tidy --- ```r WDI_long<-WDI_long %>% # 2. Asigna una columna nueva a cada indicador # tidyr::pivot_wider() selecciona los valores en una columna y los usa para # nombrar nuevas variables. Luego rellena estas columnas con los valores que le indiques tidyr::pivot_wider(names_from = c("series_name"), values_from= value) ``` --- layout: true # Etapa 3: Cambios adicionales --- Asi lucen los datos ahora ```r head(WDI_long) ``` ``` ## # A tibble: 6 × 7 ## country_name country_code year GDP per capita (curr…¹ `GDP (current US$)` ## <chr> <chr> <chr> <chr> <chr> ## 1 Afghanistan AFG x1960_yr… 59.7732337032148 537777811.111111 ## 2 Afghanistan AFG x1961_yr… 59.8608999923829 548888895.555556 ## 3 Afghanistan AFG x1962_yr… 58.4580086983139 546666677.777778 ## 4 Afghanistan AFG x1963_yr… 78.7064287776753 751111191.111111 ## 5 Afghanistan AFG x1964_yr… 82.0953065340517 800000044.444444 ## 6 Afghanistan AFG x1965_yr… 101.108325163758 1006666637.77778 ## # ℹ abbreviated name: ¹​`GDP per capita (current US$)` ## # ℹ 2 more variables: `Life expectancy at birth, total (years)` <chr>, ## # `Population, total` <chr> ``` --- Corrijamos detalles menores de nombres y formato. ```r WDI_long<-WDI_long %>% # 3. Put more code-firendly names (These are too long, and have spaces) dplyr::rename(gdp_pc="GDP per capita (current US$)", population="Population, total", gdp="GDP (current US$)", life_exp="Life expectancy at birth, total (years)") %>% # 4. change format to numeric dplyr::mutate_at(vars(gdp, gdp_pc,life_exp, population), as.numeric) %>% # 5. fix the years column: x1961_yr1961 get last 4 characters dplyr::mutate(year=substr(year, stringr::str_length(year)-3, stringr::str_length(year))) %>% # 6. Remove year 2020 since it has too many missing estimates to date dplyr::mutate(year=as.numeric(year)) %>% dplyr::filter(year<2020) ``` --- ```r head(WDI_long) ``` ``` ## # A tibble: 6 × 7 ## country_name country_code year gdp_pc gdp life_exp population ## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 Afghanistan AFG 1960 59.8 537777811. 32.4 8996967 ## 2 Afghanistan AFG 1961 59.9 548888896. 33.0 9169406 ## 3 Afghanistan AFG 1962 58.5 546666678. 33.5 9351442 ## 4 Afghanistan AFG 1963 78.7 751111191. 34.0 9543200 ## 5 Afghanistan AFG 1964 82.1 800000044. 34.5 9744772 ## 6 Afghanistan AFG 1965 101. 1006666638. 34.9 9956318 ``` --- Tenemos una base de datos con los códigos de cada paÃs y los nombres del continente al que pertenecen. .pull-left[ ```r ## Carlos creó el archivo "data/country-and-continent-codes-list.csv" en excel para que tengamos datos de continentes # Lee los datos y limpialos un poco, then join them continents<-readr::read_delim("../data/country-and-continent-codes-list.csv") continents<-continents %>% janitor::clean_names() %>% dplyr::select(continent_name ,three_letter_country_code) ``` ] .pull-right[ ```r continents ``` ``` ## # A tibble: 264 × 2 ## continent_name three_letter_country_code ## <chr> <chr> ## 1 Asia AFG ## 2 Europe ALB ## 3 Antarctica ATA ## 4 Africa DZA ## 5 Oceania ASM ## 6 Europe AND ## 7 Africa AGO ## 8 Americas ATG ## 9 Europe AZE ## 10 Asia AZE ## # ℹ 254 more rows ``` ] Juntemos los nombres de cada continente a nuestra data.frame con la función **dplry::left_join()**. --- Usando left_join(). ```r WDI_long<-WDI_long %>% # 7. We need continent names: Join the continent names data. # there are registers for groups of countries, you need an inner join # there are other kinds of join: left, right, full dplyr::inner_join(continents, by=c("country_code"="three_letter_country_code")) ``` --- Asi quedo nuestro data set final ```r WDI_long%>% select(country_name, year, gdp_pc, gdp, population, life_exp, continent_name) ``` ``` ## # A tibble: 13,440 × 7 ## country_name year gdp_pc gdp population life_exp continent_name ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> ## 1 Afghanistan 1960 59.8 537777811. 8996967 32.4 Asia ## 2 Afghanistan 1961 59.9 548888896. 9169406 33.0 Asia ## 3 Afghanistan 1962 58.5 546666678. 9351442 33.5 Asia ## 4 Afghanistan 1963 78.7 751111191. 9543200 34.0 Asia ## 5 Afghanistan 1964 82.1 800000044. 9744772 34.5 Asia ## 6 Afghanistan 1965 101. 1006666638. 9956318 34.9 Asia ## 7 Afghanistan 1966 138. 1399999967. 10174840 35.4 Asia ## 8 Afghanistan 1967 161. 1673333418. 10399936 35.9 Asia ## 9 Afghanistan 1968 129. 1373333367. 10637064 36.4 Asia ## 10 Afghanistan 1969 129. 1408888922. 10893772 36.9 Asia ## # ℹ 13,430 more rows ``` --- layout:true class: inverse # Joins: Junta datos provenientes de fuentes diferentes --- Es muy poco probable que todos los datos que necesitamos estén en un solo lugar. En el caso anterior tuvimos que conseguir una base de datos de codigo paÃs y continente para añadir estos últimos a la data. Supongamos que queremos unir las tablas A y B mediante la columna "cédula". Hay al menos 4 maneras de proceder: - inner_join(): Preservo a los individuos cuyas cédulas estan en A y B. - left_join(): Preservo a los individuos cuyas cédulas estan en A. Si no aparecen en B, simplemente no tendrán la información proveniente de esta tabla. - right_join(): Preservo a los individuos cuyas cédulas estan en B. Si no aparecen en A, simplemente no tendrán la información proveniente de esta tabla. - full_join(): Preservo a los individuos cuyas cédulas estan en A ó B. Todos serán preservados, pero los que no aparecen en A y B tendrán información incompleta. --- En resumen: <img src="Workshop_021_slides_files/joins_data.jpg" width="40%" height="40%" /> --- Trabajamos en Ezeiza y tenemos que calcular que aerolineas tuvo mas retrasos en las llegadas. Tenemos dos tablas. .pull-left[ Vuelos: ```r ## Correlo en tu sesion de R head(flights[,c("month","day","flight","origin","dest","carrier")]) ``` ``` ## # A tibble: 6 × 6 ## month day flight origin dest carrier ## <int> <int> <int> <chr> <chr> <chr> ## 1 1 1 1545 EWR IAH UA ## 2 1 1 1714 LGA IAH UA ## 3 1 1 1141 JFK MIA AA ## 4 1 1 725 JFK BQN B6 ## 5 1 1 461 LGA ATL DL ## 6 1 1 1696 EWR ORD UA ``` ] .pull-right[ Aerolineas ```r head(airlines) ``` ``` ## # A tibble: 6 × 2 ## carrier name ## <chr> <chr> ## 1 9E Endeavor Air Inc. ## 2 AA American Airlines Inc. ## 3 AS Alaska Airlines Inc. ## 4 B6 JetBlue Airways ## 5 DL Delta Air Lines Inc. ## 6 EV ExpressJet Airlines Inc. ``` ] --- Esta es la manera de unirlas .pull-left[ ```r #### Que aerolineas tuvieron los mayores retrasos en las llegadas? #### #### 1. Join `airlines` to `flights` #### 2. Compute and order the average arrival delays by airline. Display full names, no codes. flights %>% tidyr::drop_na(arr_delay) %>% * dplyr::left_join(airlines, by="carrier") %>% dplyr::group_by(name) %>% dplyr::summarise(mean_arrival_delays=mean(arr_delay)) %>% dplyr::arrange(-mean_arrival_delays) %>% head(10) ``` ] .pull-right[ ``` ## # A tibble: 10 × 2 ## name mean_arrival_delays ## <chr> <dbl> ## 1 Frontier Airlines Inc. 21.9 ## 2 AirTran Airways Corporation 20.1 ## 3 ExpressJet Airlines Inc. 15.8 ## 4 Mesa Airlines Inc. 15.6 ## 5 SkyWest Airlines Inc. 11.9 ## 6 Envoy Air 10.8 ## 7 Southwest Airlines Co. 9.65 ## 8 JetBlue Airways 9.46 ## 9 Endeavor Air Inc. 7.38 ## 10 United Air Lines Inc. 3.56 ``` ] --- layout:false # Fin de la primera parte. En la segunda parte haremos un repaso de regresiones lineales en R. * Este repaso lo haremos sobre un documento Rmarkdown, que facilita una discusión natural de los papers, datos, y métodos que estaremos revisando en el curso. * Si es su primera vez usando Rmarkdown, le aconsejo visitar [este sitio web](https://rmarkdown.rstudio.com/). Recuerden hacer los ejercicios breves al final de dicho documento, les servirá para resolver el trabajo práctico.