PRIA práctica 3: Introducción al data Wrangling y visualización con R

Author

Jesús Turpín

Published

November 2, 2023

Data Wrangling

El data wrangling es un término ampliamente utilizado en la ciencia de datos para describir el proceso de preparación de datos crudos (raw) para su análisis. Este proceso implica varias acciones claves:

  • Recopilar: Implica reunir datos de diversas fuentes y formatos.
  • Integrar: Conlleva combinar datos de diferentes fuentes para obtener una vista unificada.
  • Limpiar: Se refiere a encontrar y corregir errores o inconsistencias en los datos para asegurar su calidad.
  • Transformar: Consiste en cambiar la estructura de los datos para facilitar su manipulación o análisis.
  • Enriquecer: Se añade información adicional a los datos para aumentar su utilidad o precisión.
  • Filtrar: Incluye eliminar datos irrelevantes o redundantes para enfocarse en la información más valiosa.
  • Agilizar: Se busca mejorar la accesibilidad y eficiencia de los datos para el análisis.

El objetivo del data wrangling es transformar datos desorganizados o en bruto en un conjunto estructurado y limpio, listo para ser analizado y utilizado en la toma de decisiones basada en datos.

Como científico de datos, enfrentarás el desafío de convertir conjuntos de datos complejos y a menudo no estructurados en insights útiles. Estos insights son cruciales para las decisiones de negocio, y preparar los datos adecuadamente es un paso que no se debe subestimar.

Data Wrangling with dplyr and tidyr Cheat Sheet

1. El dataset Gapminder

  1. 1 Instala y carga la librería gapminder.
#install.packages("gapminder")
library(gapminder)

1.2 Usa la función help para entender los datos. Explóralo con glimpse, como alternativa a str. Compara ambas salidas. ¿Cuál prefieres? Razona tu respuesta

?gapminder
str(gapminder)
glimpse(gapminder)

Con glimpse la salida es algo más tidy, mostrando prácticamente la misma información

2. Verbos dplyr

2.1 Usa filter para filtrar por el año 1952 y guarda el resultado en la variable gm_1952.

gm_1952 <- gapminder %>%
  filter(year == 1952)

2.2 Filtra por país (China) y por año (2002) y guarda el resultado en la variable china_2002

china_2002 <- gapminder %>%
  filter(year == 2002 & country == "China")

2.3 Ordena por lifExp en ambos sentidos. Localiza el año más reciente con datos y filtra por éste. ¿Qué países son los extremos?

gapminder %>%
  arrange(lifeExp)
# A tibble: 1,704 × 6
   country      continent  year lifeExp     pop gdpPercap
   <fct>        <fct>     <int>   <dbl>   <int>     <dbl>
 1 Rwanda       Africa     1992    23.6 7290203      737.
 2 Afghanistan  Asia       1952    28.8 8425333      779.
 3 Gambia       Africa     1952    30    284320      485.
 4 Angola       Africa     1952    30.0 4232095     3521.
 5 Sierra Leone Africa     1952    30.3 2143249      880.
 6 Afghanistan  Asia       1957    30.3 9240934      821.
 7 Cambodia     Asia       1977    31.2 6978607      525.
 8 Mozambique   Africa     1952    31.3 6446316      469.
 9 Sierra Leone Africa     1957    31.6 2295678     1004.
10 Burkina Faso Africa     1952    32.0 4469979      543.
# ℹ 1,694 more rows
gapminder %>%
  arrange(desc(lifeExp))
# A tibble: 1,704 × 6
   country          continent  year lifeExp       pop gdpPercap
   <fct>            <fct>     <int>   <dbl>     <int>     <dbl>
 1 Japan            Asia       2007    82.6 127467972    31656.
 2 Hong Kong, China Asia       2007    82.2   6980412    39725.
 3 Japan            Asia       2002    82   127065841    28605.
 4 Iceland          Europe     2007    81.8    301931    36181.
 5 Switzerland      Europe     2007    81.7   7554661    37506.
 6 Hong Kong, China Asia       2002    81.5   6762476    30209.
 7 Australia        Oceania    2007    81.2  20434176    34435.
 8 Spain            Europe     2007    80.9  40448191    28821.
 9 Sweden           Europe     2007    80.9   9031088    33860.
10 Israel           Asia       2007    80.7   6426679    25523.
# ℹ 1,694 more rows
gapminder %>%
  filter(year == max(gapminder$year)) %>%
  arrange(lifeExp) %>%
  head(1)
# A tibble: 1 × 6
  country   continent  year lifeExp     pop gdpPercap
  <fct>     <fct>     <int>   <dbl>   <int>     <dbl>
1 Swaziland Africa     2007    39.6 1133066     4513.
gapminder %>%
  filter(year == max(gapminder$year)) %>%
  arrange(desc(lifeExp)) %>%
  head(1)
# A tibble: 1 × 6
  country continent  year lifeExp       pop gdpPercap
  <fct>   <fct>     <int>   <dbl>     <int>     <dbl>
1 Japan   Asia       2007    82.6 127467972    31656.

2.4 Crea una nueva columna popM, con la población en millones de habitantes.

gapminder %>%
  mutate(popM = pop*10**(-6)) 
# A tibble: 1,704 × 7
   country     continent  year lifeExp      pop gdpPercap  popM
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl> <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.  8.43
 2 Afghanistan Asia       1957    30.3  9240934      821.  9.24
 3 Afghanistan Asia       1962    32.0 10267083      853. 10.3 
 4 Afghanistan Asia       1967    34.0 11537966      836. 11.5 
 5 Afghanistan Asia       1972    36.1 13079460      740. 13.1 
 6 Afghanistan Asia       1977    38.4 14880372      786. 14.9 
 7 Afghanistan Asia       1982    39.9 12881816      978. 12.9 
 8 Afghanistan Asia       1987    40.8 13867957      852. 13.9 
 9 Afghanistan Asia       1992    41.7 16317921      649. 16.3 
10 Afghanistan Asia       1997    41.8 22227415      635. 22.2 
# ℹ 1,694 more rows

2.5 Extrae los 10 países con mayor población, expresados en millones de habitantes en el año 2007. Filtra por esos 10 países y extrae la población de los mismos en 1957.

paises <- gapminder %>%
  filter(year == 2007) %>%
  arrange(desc(pop)) %>%
  head(10) %>%
  select(country) %>%
  pull()

gapminder %>%
  filter(year == 1957,
         country %in% paises) %>% # country %in% gapminder_2007$country
  mutate(popM = pop*10**(-6)) %>%
  select(country, popM) %>%
  arrange(desc(popM))
# A tibble: 10 × 2
   country        popM
   <fct>         <dbl>
 1 China         637. 
 2 India         409  
 3 United States 172. 
 4 Japan          91.6
 5 Indonesia      90.1
 6 Brazil         65.6
 7 Bangladesh     51.4
 8 Pakistan       46.7
 9 Nigeria        37.2
10 Mexico         35.0

Solución alternativa con 2 dataframes, usando “join”. Función pull, útil, pero no imprescindible.

2.6 Encuentra el promedio de esperanza de vida (lifeExp) para cada continente y resúmelo en una tabla.

gapminder %>%
  group_by(continent) %>%
  summarise(lifeExp = mean(lifeExp))
# A tibble: 5 × 2
  continent lifeExp
  <fct>       <dbl>
1 Africa       48.9
2 Americas     64.7
3 Asia         60.1
4 Europe       71.9
5 Oceania      74.3

2.7 Añade una columna llamada gdpPercapLog que sea el logaritmo de gdpPercap, luego organiza los datos por esta nueva columna de forma descendente.

gapminder %>%
  mutate(gdpPercapLog = log(gdpPercap)) %>%
  arrange(desc(gdpPercapLog))
# A tibble: 1,704 × 7
   country   continent  year lifeExp     pop gdpPercap gdpPercapLog
   <fct>     <fct>     <int>   <dbl>   <int>     <dbl>        <dbl>
 1 Kuwait    Asia       1957    58.0  212846   113523.         11.6
 2 Kuwait    Asia       1972    67.7  841934   109348.         11.6
 3 Kuwait    Asia       1952    55.6  160000   108382.         11.6
 4 Kuwait    Asia       1962    60.5  358266    95458.         11.5
 5 Kuwait    Asia       1967    64.6  575003    80895.         11.3
 6 Kuwait    Asia       1977    69.3 1140357    59265.         11.0
 7 Norway    Europe     2007    80.2 4627926    49357.         10.8
 8 Kuwait    Asia       2007    77.6 2505559    47307.         10.8
 9 Singapore Asia       2007    80.0 4553009    47143.         10.8
10 Norway    Europe     2002    79.0 4535591    44684.         10.7
# ℹ 1,694 more rows

2.8 Filtra los países donde la expectativa de vida lifeExp es mayor que 80 años.

gapminder %>%
  filter(lifeExp > 80) %>%
  select(country) %>%
  distinct()
# A tibble: 13 × 1
   country         
   <fct>           
 1 Australia       
 2 Canada          
 3 France          
 4 Hong Kong, China
 5 Iceland         
 6 Israel          
 7 Italy           
 8 Japan           
 9 New Zealand     
10 Norway          
11 Spain           
12 Sweden          
13 Switzerland     

2.9 Calcula la suma del PIB (gdpPercap * pop) para cada país y año, agrupando por país y año.

gapminder %>%
  mutate(PIB = (gdpPercap * pop)/1000000)
# A tibble: 1,704 × 7
   country     continent  year lifeExp      pop gdpPercap    PIB
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>  <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.  6567.
 2 Afghanistan Asia       1957    30.3  9240934      821.  7585.
 3 Afghanistan Asia       1962    32.0 10267083      853.  8759.
 4 Afghanistan Asia       1967    34.0 11537966      836.  9648.
 5 Afghanistan Asia       1972    36.1 13079460      740.  9679.
 6 Afghanistan Asia       1977    38.4 14880372      786. 11698.
 7 Afghanistan Asia       1982    39.9 12881816      978. 12599.
 8 Afghanistan Asia       1987    40.8 13867957      852. 11821.
 9 Afghanistan Asia       1992    41.7 16317921      649. 10596.
10 Afghanistan Asia       1997    41.8 22227415      635. 14122.
# ℹ 1,694 more rows
gapminder %>%
  mutate(PIB = (gdpPercap * pop)/1000000) %>%
  group_by(country, year) %>%
  summarise(PIBa = sum(PIB))
`summarise()` has grouped output by 'country'. You can override using the
`.groups` argument.
# A tibble: 1,704 × 3
# Groups:   country [142]
   country      year   PIBa
   <fct>       <int>  <dbl>
 1 Afghanistan  1952  6567.
 2 Afghanistan  1957  7585.
 3 Afghanistan  1962  8759.
 4 Afghanistan  1967  9648.
 5 Afghanistan  1972  9679.
 6 Afghanistan  1977 11698.
 7 Afghanistan  1982 12599.
 8 Afghanistan  1987 11821.
 9 Afghanistan  1992 10596.
10 Afghanistan  1997 14122.
# ℹ 1,694 more rows

2.10 Crea una nueva columna que clasifique a los países en ‘Alto PIB per cápita’ si gdpPercap es mayor que 10000, y ‘Bajo PIB per cápita’ en caso contrario.

gapminder %>%
  mutate(tipo_pib =
           case_when(gdpPercap > 10000 ~ "Alto PIB per cápita",
                     TRUE ~ "Bajo PIB per cápita" )
  )
# A tibble: 1,704 × 7
   country     continent  year lifeExp      pop gdpPercap tipo_pib           
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl> <chr>              
 1 Afghanistan Asia       1952    28.8  8425333      779. Bajo PIB per cápita
 2 Afghanistan Asia       1957    30.3  9240934      821. Bajo PIB per cápita
 3 Afghanistan Asia       1962    32.0 10267083      853. Bajo PIB per cápita
 4 Afghanistan Asia       1967    34.0 11537966      836. Bajo PIB per cápita
 5 Afghanistan Asia       1972    36.1 13079460      740. Bajo PIB per cápita
 6 Afghanistan Asia       1977    38.4 14880372      786. Bajo PIB per cápita
 7 Afghanistan Asia       1982    39.9 12881816      978. Bajo PIB per cápita
 8 Afghanistan Asia       1987    40.8 13867957      852. Bajo PIB per cápita
 9 Afghanistan Asia       1992    41.7 16317921      649. Bajo PIB per cápita
10 Afghanistan Asia       1997    41.8 22227415      635. Bajo PIB per cápita
# ℹ 1,694 more rows
gapminder %>%
  mutate(tipo_pib =
           if_else(gdpPercap > 10000, 
                   "Alto PIB per cápita",
                   "Bajo PIB per cápita" ))
# A tibble: 1,704 × 7
   country     continent  year lifeExp      pop gdpPercap tipo_pib           
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl> <chr>              
 1 Afghanistan Asia       1952    28.8  8425333      779. Bajo PIB per cápita
 2 Afghanistan Asia       1957    30.3  9240934      821. Bajo PIB per cápita
 3 Afghanistan Asia       1962    32.0 10267083      853. Bajo PIB per cápita
 4 Afghanistan Asia       1967    34.0 11537966      836. Bajo PIB per cápita
 5 Afghanistan Asia       1972    36.1 13079460      740. Bajo PIB per cápita
 6 Afghanistan Asia       1977    38.4 14880372      786. Bajo PIB per cápita
 7 Afghanistan Asia       1982    39.9 12881816      978. Bajo PIB per cápita
 8 Afghanistan Asia       1987    40.8 13867957      852. Bajo PIB per cápita
 9 Afghanistan Asia       1992    41.7 16317921      649. Bajo PIB per cápita
10 Afghanistan Asia       1997    41.8 22227415      635. Bajo PIB per cápita
# ℹ 1,694 more rows

2.11 Utiliza mutate_if para transformar todas las columnas numéricas aplicando el logaritmo natural, pero sólo si todas las entradas en esa columna son positivas.

gapminder %>%
  select(lifeExp, pop, gdpPercap) %>%
  mutate_if(~all(. > 0), log)
# A tibble: 1,704 × 3
   lifeExp   pop gdpPercap
     <dbl> <dbl>     <dbl>
 1    3.36  15.9      6.66
 2    3.41  16.0      6.71
 3    3.47  16.1      6.75
 4    3.53  16.3      6.73
 5    3.59  16.4      6.61
 6    3.65  16.5      6.67
 7    3.69  16.4      6.89
 8    3.71  16.4      6.75
 9    3.73  16.6      6.48
10    3.73  16.9      6.45
# ℹ 1,694 more rows
gapminder %>%
  select(lifeExp, pop, gdpPercap) %>%
  mutate(across(where(~all(. > 0)), log))
# A tibble: 1,704 × 3
   lifeExp   pop gdpPercap
     <dbl> <dbl>     <dbl>
 1    3.36  15.9      6.66
 2    3.41  16.0      6.71
 3    3.47  16.1      6.75
 4    3.53  16.3      6.73
 5    3.59  16.4      6.61
 6    3.65  16.5      6.67
 7    3.69  16.4      6.89
 8    3.71  16.4      6.75
 9    3.73  16.6      6.48
10    3.73  16.9      6.45
# ℹ 1,694 more rows
all_positive <- function(x) { all(x > 0) }
gapminder %>%
  select(lifeExp, pop, gdpPercap) %>%
  mutate(across(where(all_positive), log))
# A tibble: 1,704 × 3
   lifeExp   pop gdpPercap
     <dbl> <dbl>     <dbl>
 1    3.36  15.9      6.66
 2    3.41  16.0      6.71
 3    3.47  16.1      6.75
 4    3.53  16.3      6.73
 5    3.59  16.4      6.61
 6    3.65  16.5      6.67
 7    3.69  16.4      6.89
 8    3.71  16.4      6.75
 9    3.73  16.6      6.48
10    3.73  16.9      6.45
# ℹ 1,694 more rows

2.12 Para cada continente, encuentra el país con la mayor población (pop) cada año.

gapminder %>%
  group_by(continent, year) %>%
  filter(pop == max(pop)) %>%
  select(continent, country, year) 
# A tibble: 60 × 3
# Groups:   continent, year [60]
   continent country    year
   <fct>     <fct>     <int>
 1 Oceania   Australia  1952
 2 Oceania   Australia  1957
 3 Oceania   Australia  1962
 4 Oceania   Australia  1967
 5 Oceania   Australia  1972
 6 Oceania   Australia  1977
 7 Oceania   Australia  1982
 8 Oceania   Australia  1987
 9 Oceania   Australia  1992
10 Oceania   Australia  1997
# ℹ 50 more rows

2.13 Obten el mínimo, el máximo y la media de la esperanza de vida (lifeExp) y el PIB per cápita (gdpPercap) por continente.

gapminder %>%
  group_by(continent) %>%
  summarize(min_lifeExp = min(lifeExp), 
            max_lifeExp = max(lifeExp),
            mean_lifeExp = mean(lifeExp),
            min_gdpPercap = min(gdpPercap),
            max_gdpPercap = max(gdpPercap),
            mean_gdpPercap = mean(gdpPercap))
# A tibble: 5 × 7
  continent min_lifeExp max_lifeExp mean_lifeExp min_gdpPercap max_gdpPercap
  <fct>           <dbl>       <dbl>        <dbl>         <dbl>         <dbl>
1 Africa           23.6        76.4         48.9          241.        21951.
2 Americas         37.6        80.7         64.7         1202.        42952.
3 Asia             28.8        82.6         60.1          331        113523.
4 Europe           43.6        81.8         71.9          974.        49357.
5 Oceania          69.1        81.2         74.3        10040.        34435.
# ℹ 1 more variable: mean_gdpPercap <dbl>

Visualización con ggplot 2

Gramática de los Gráficos con ggplot2

https://rstudio.github.io/cheatsheets/data-visualization.pdf

Componentes básicos

  • Datos: El conjunto de datos que queremos visualizar.
  • Aesthetics (Aes): Define las variables a utilizar y cómo se mapean a aspectos visuales como ejes, color, tamaño, etc.
  • Geometrías (Geom): Las formas gráficas que representan los datos (puntos, líneas, barras).
  • Escala: Controla cómo se mapean los datos a los aesthetics (por ejemplo, qué rango de colores usar, leyendas, etiquetas).
  • Coordenadas: El sistema de coordenadas (Cartesiano, polar, etc.).
  • Facetas: Para crear gráficos con múltiples paneles.
  • Temas: Controla la apariencia no relacionada con los datos del gráfico (colores de fondo, tipos de letra, etc.).

Taller la gramática de los gráficos (Samuel Calderon)

library(ggplot2)

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = cty, color = class)) +
  facet_wrap(~ cyl)

ggplot(data = df, aes(x = var1, y = var2)) +
  geom_point(aes(color = factor1)) +
  labs(
    title = "Título del Gráfico",
    subtitle = "Subtítulo del Gráfico",
    caption = "Fuente de los Datos",
    x = "Etiqueta del Eje X",
    y = "Etiqueta del Eje Y",
    color = "Leyenda de Factor1"
  )

3.1 Usando la variable gm_1952, crea un diagrama de dispersión donde se represente la renta per cápita en función de la población. Ahora la esperanza de vida en función de la población.

gm_1952 %>%
  ggplot(aes(x = pop, y = gdpPercap)) +
  geom_point()

gm_1952 %>%
  ggplot(aes(x = pop, y = lifeExp)) +
  geom_point()

3.2 Aplica a las gráficas anteriores un escalado logarítmico (log10) en el eje x e y

gm_1952 %>%
  ggplot(aes(x = pop, y = gdpPercap)) +
  geom_point() + 
  scale_x_log10() +
  scale_y_log10()

gm_1952 %>%
  ggplot(aes(x = pop, y = lifeExp)) +
  geom_point() + 
  scale_x_log10() +
  scale_y_log10()

3.3 Realiza un diagrama de dispersión de la esperanza de vida en función de la población, pero mapea la variable continent por color. Usa escalado para el eje x

gm_1952 %>%
  ggplot(aes(x = pop, y = lifeExp, color = continent)) +
  geom_point() + 
  scale_x_log10() 

3.4 Repite la representación anterior pero añade el mapeo de la renta per cápita por tamaño del punto

gm_1952 %>%
  ggplot(aes(x = pop, y = lifeExp, size = gdpPercap, color = continent)) +
  geom_point() + 
  scale_x_log10() 

3.5 Ahora, en lugar de mapear por continente, utiliza contienente como variable “faceta” y genera 5 gráficas en un lienzo con la esperanza de vida en función de la población en 1952.

gm_1952 %>%
  ggplot(aes(x = pop, y = lifeExp, size = gdpPercap)) +
  geom_point() + 
  scale_x_log10() +
  facet_wrap(~ continent)

3.6 Representa la esperanza de vida en función del año, usando facetas (por continente). Utiliza la función de agregación apropiada. Prueba diagramas de dispersión, líneas ó barras.

gapminder %>%
  mutate(pop = pop/1000000) %>%
  group_by(year, continent) %>%
  summarise(lifeExp = median(lifeExp), pop = median(pop)) %>%
  ggplot(aes(x = year, y = lifeExp, size = pop)) +
  geom_point() +
  facet_wrap(~ continent)
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.

3.7 Representa la población total en función del año, usando facetas (por continente). Utiliza la función de agregación apropiada.

gapminder %>%
  mutate(pop = pop/1000000) %>%
  group_by(year, continent) %>%
  summarise(pop = sum(pop)) %>%
  ggplot(aes(x = year, y = pop)) +
  geom_line() +
  facet_wrap(~ continent, scales = "free")
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.

3.8 Representa en una sola gráfica, sin el uso de facetas, la información de los dos ejercicios anteriores, pero utiliza colores para mapear los continentes.

gapminder %>%
  mutate(pop = pop/1000000) %>%
  group_by(year, continent) %>%
  summarise(lifeExp = median(lifeExp), pop = median(pop)) %>%
  ggplot(aes(x = year, y = lifeExp, size = pop, color = continent)) +
  geom_point() 
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.

gapminder %>%
  mutate(pop = pop/1000000) %>%
  group_by(year, continent) %>%
  summarise(pop = sum(pop)) %>%
  ggplot(aes(x = year, y = pop, color = continent)) +
  geom_line() 
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.

3.9 Representa la renta per cápita en 2007 mapeando los puntos del diagrama de dispersión por color según el contienente y por tamaño, según la población.

gapminder %>%
  filter(year == 2007) %>%
  ggplot(aes(x = pop, y = gdpPercap, color = continent, size = pop)) +
  geom_point() + 
  scale_x_log10() +
  scale_y_log10()

3.10 Representa la evolución de la renta per cápita año a año entre Japón vs EEUU en una gráfica de líneas.

gapminder %>%
  filter(country == "Japan" | country == "EEUU") %>%
  ggplot(aes(x = pop, y = gdpPercap, color = continent, size = pop)) +
  geom_point() + 
  scale_x_log10() +
  scale_y_log10()

gapminder %>%
  filter(country == "United States" | country == "Japan") %>%
  
  ggplot(aes(x = year, y = gdpPercap, color = country)) + 
    geom_line()

3.11 Representa un diagrama de barras para comparar la renta per cápita en 2007 de europa vs EEUU+Canada.

gapminder %>%
  filter(year == 2007) %>%
  filter(country %in% 
           c("Canada", "United States") | continent == "Europe" ) %>%
  mutate(continent = if_else(continent == "Europe", "Europa", "EEUU+Canada")) %>%
  mutate(PIB = gdpPercap*pop) %>%
  group_by(continent) %>%
  summarise(PIB = sum(PIB), pop = sum(pop)) %>%
  mutate(gdpPercap = PIB/pop) %>%
  ggplot(aes(x = continent, y = gdpPercap)) +
  geom_col()

3.12 Dibuja un histograma con los datos de la población mundial en 2007 según gapminder.

gapminder %>%
  filter(year == 2007) %>%
  ggplot(aes(pop)) +
  geom_histogram(bins = 39)

3.13 Modifica la gráfica usando escala logarítmica. Prueba realizar diagrama de densidad en lugar de un histograma.

gapminder %>%
  filter(year == 2007) %>%
  ggplot(aes(pop)) +
  geom_histogram(bins = 39) + 
  scale_x_log10()

3.14 Investiga el paquete esquisse para crear gráficos sin código, usando los addins de RStudio. No es necesario instalarlo para la actividad, pero anota un enlace al vídeo o documentación que encuentres.

https://www.youtube.com/watch?v=IJRdNxemygw

3.15 Representa el histograma y diagrama de densidad de la esperanza de vida mundial por países en 2007. ¿Es una distribución simétrica?

gapminder %>%
  filter(year == 2007) %>%
  ggplot(aes(lifeExp)) +
  geom_histogram(bins = 39) 

gapminder %>%
  filter(year == 2007) %>%
  ggplot(aes(lifeExp)) +
  geom_density()

Realiza el experimento del teorema central del límite utilizando como variable la esperanza de vida en el año 2007 de todos los países que aparecen ese año en gapminder.

Toma muestras de n = 50 para calcular las medias y realiza 1000 réplicas de ese experimento para obtener las medias. Representa gráficamente el histograma y/o density plot. ¿La gráfica de las 1000 medias ahora sigue una distribución simétrica aproximadamente normal?

gapminder_life_exp <- gapminder %>%
  select(lifeExp)
simular_experimento <- function(df, n) {
  muestra <- sample_n(df, n)
  medias <- colMeans(muestra)
  return(medias)
}
sims <- 1000
n <- 50
resultados <- replicate(sims, simular_experimento(gapminder_life_exp,n))
gapminder_life_exp_medias <- data.frame(lifeExp_means = resultados)
gapminder_life_exp_medias %>% head(10)
   lifeExp_means
1       57.34528
2       59.56210
3       57.71232
4       58.59676
5       59.38540
6       60.37946
7       58.89262
8       61.26174
9       59.21908
10      57.32392
gapminder_life_exp_medias %>%
  ggplot(aes(lifeExp_means)) +
  geom_histogram(bins = 39) 

gapminder_life_exp_medias %>%
  ggplot(aes(lifeExp_means)) +
  geom_density() 

gapminder_life_exp_medias %>%
  ggplot(aes(x = lifeExp_means)) +
  geom_histogram(aes(y = after_stat(density)), bins = 39, fill = "blue", color = "black") +
  geom_density(color = "red") +
  scale_y_continuous(sec.axis = sec_axis(~ . * length(gapminder_life_exp_medias), name = "Probabilidad"))+
  theme_bw()