Instrucciones generales


Actividad 1: Manipulación básica de datos con dplyr

Objetivo

Practicar los cinco verbos principales de dplyr: select(), filter(), mutate(), arrange() y summarise().

Usaremos el dataset mtcars que viene incluido en R.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data(mtcars)
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

1.1 Selección y filtrado

  1. Selecciona únicamente las variables: mpg, hp, wt, am.
  2. Filtra los autos con más de 100 caballos de fuerza (hp > 100).
# Escribe tu código aquí
mtcars2 <- select(mtcars, mpg, hp, wt, am)
filter(mtcars2,
       hp > 100)
##                      mpg  hp    wt am
## Mazda RX4           21.0 110 2.620  1
## Mazda RX4 Wag       21.0 110 2.875  1
## Hornet 4 Drive      21.4 110 3.215  0
## Hornet Sportabout   18.7 175 3.440  0
## Valiant             18.1 105 3.460  0
## Duster 360          14.3 245 3.570  0
## Merc 280            19.2 123 3.440  0
## Merc 280C           17.8 123 3.440  0
## Merc 450SE          16.4 180 4.070  0
## Merc 450SL          17.3 180 3.730  0
## Merc 450SLC         15.2 180 3.780  0
## Cadillac Fleetwood  10.4 205 5.250  0
## Lincoln Continental 10.4 215 5.424  0
## Chrysler Imperial   14.7 230 5.345  0
## Dodge Challenger    15.5 150 3.520  0
## AMC Javelin         15.2 150 3.435  0
## Camaro Z28          13.3 245 3.840  0
## Pontiac Firebird    19.2 175 3.845  0
## Lotus Europa        30.4 113 1.513  1
## Ford Pantera L      15.8 264 3.170  1
## Ferrari Dino        19.7 175 2.770  1
## Maserati Bora       15.0 335 3.570  1
## Volvo 142E          21.4 109 2.780  1

1.2 Crear nuevas variables

  1. Crea una nueva variable llamada power_weight_ratio que sea hp / wt.
  2. Ordena el dataset de mayor a menor según esta nueva variable.
# Escribe tu código aquí

mutate(mtcars2, power_weight_ratio = hp/wt)
##                      mpg  hp    wt am power_weight_ratio
## Mazda RX4           21.0 110 2.620  1           41.98473
## Mazda RX4 Wag       21.0 110 2.875  1           38.26087
## Datsun 710          22.8  93 2.320  1           40.08621
## Hornet 4 Drive      21.4 110 3.215  0           34.21462
## Hornet Sportabout   18.7 175 3.440  0           50.87209
## Valiant             18.1 105 3.460  0           30.34682
## Duster 360          14.3 245 3.570  0           68.62745
## Merc 240D           24.4  62 3.190  0           19.43574
## Merc 230            22.8  95 3.150  0           30.15873
## Merc 280            19.2 123 3.440  0           35.75581
## Merc 280C           17.8 123 3.440  0           35.75581
## Merc 450SE          16.4 180 4.070  0           44.22604
## Merc 450SL          17.3 180 3.730  0           48.25737
## Merc 450SLC         15.2 180 3.780  0           47.61905
## Cadillac Fleetwood  10.4 205 5.250  0           39.04762
## Lincoln Continental 10.4 215 5.424  0           39.63864
## Chrysler Imperial   14.7 230 5.345  0           43.03087
## Fiat 128            32.4  66 2.200  1           30.00000
## Honda Civic         30.4  52 1.615  1           32.19814
## Toyota Corolla      33.9  65 1.835  1           35.42234
## Toyota Corona       21.5  97 2.465  0           39.35091
## Dodge Challenger    15.5 150 3.520  0           42.61364
## AMC Javelin         15.2 150 3.435  0           43.66812
## Camaro Z28          13.3 245 3.840  0           63.80208
## Pontiac Firebird    19.2 175 3.845  0           45.51365
## Fiat X1-9           27.3  66 1.935  1           34.10853
## Porsche 914-2       26.0  91 2.140  1           42.52336
## Lotus Europa        30.4 113 1.513  1           74.68605
## Ford Pantera L      15.8 264 3.170  1           83.28076
## Ferrari Dino        19.7 175 2.770  1           63.17690
## Maserati Bora       15.0 335 3.570  1           93.83754
## Volvo 142E          21.4 109 2.780  1           39.20863

1.3 Resumen por grupo

  1. Agrupa por tipo de transmisión (am).
  2. Calcula el promedio de mpg y hp por grupo.
# Escribe tu código aquí

mtcars %>%
  group_by(am) %>%
  summarize(promedio_mpg = mean(mpg),
            promedio_hp = mean(hp))
## # A tibble: 2 × 3
##      am promedio_mpg promedio_hp
##   <dbl>        <dbl>       <dbl>
## 1     0         17.1        160.
## 2     1         24.4        127.

Pregunta breve:
¿Qué diferencias observas entre transmisión automática (0) y manual (1)?

Los carros con transmisión automática tienen menor promedio de mpg pero mayor de hp en comparación con los de transmisión manual.


Actividad 2: Visualización y estadística descriptiva básica

Objetivo

Crear visualizaciones simples y obtener estadísticas descriptivas.

Seguimos usando mtcars.

library(ggplot2)

2.1 Estadística descriptiva

  1. Calcula la media y desviación estándar de mpg.
  2. Calcula la media de mpg por tipo de transmisión (am).
# Escribe tu código aquí
summarize(mtcars, 
          promedio_1_mpg = mean(mpg),
          sd(mpg))
##   promedio_1_mpg  sd(mpg)
## 1       20.09062 6.026948
mtcars %>%
  group_by(am) %>%
  summarize(promedio_mpg = mean(mpg),
            promedio_hp = mean(hp))
## # A tibble: 2 × 3
##      am promedio_mpg promedio_hp
##   <dbl>        <dbl>       <dbl>
## 1     0         17.1        160.
## 2     1         24.4        127.

2.2 Visualización

  1. Haz un histograma de mpg.
  2. Haz un boxplot de mpg según tipo de transmisión (am).
  3. Haz un scatterplot de wt vs mpg.
# Escribe tu código aquí

ggplot(mtcars, aes(x = mpg)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

ggplot(mtcars, aes(x = am, y = mpg)) +
  geom_boxplot()
## Warning: Orientation is not uniquely specified when both the x and y aesthetics are
## continuous. Picking default orientation 'x'.
## Warning: Continuous x aesthetic
## ℹ did you forget `aes(group = ...)`?

ggplot(mtcars, aes(x = mpg, y = wt)) +
  geom_point()

Pregunta breve:
¿Observas alguna relación entre peso (wt) y rendimiento de gasolina (mpg)?


Actividad 3: Preprocesamiento básico de datos

Objetivo

Practicar limpieza básica: valores perdidos, recodificación y estandarización.

Crearemos un pequeño dataset simulado.

set.seed(123)

datos <- data.frame(
  id = 1:20,
  edad = sample(18:60, 20, replace = TRUE),
  estres = sample(1:5, 20, replace = TRUE),
  horas_sueno = rnorm(20, mean = 7, sd = 1)
)

# Introducir algunos valores perdidos
datos$horas_sueno[c(3, 7)] <- NA

datos
##    id edad estres horas_sueno
## 1   1   48      2    6.679944
## 2   2   32      1    5.688478
## 3   3   31      3          NA
## 4   4   20      4    6.870589
## 5   5   59      1    7.886736
## 6   6   60      3    6.848604
## 7   7   54      5          NA
## 8   8   31      4    3.772677
## 9   9   42      2    6.228208
## 10 10   43      5    7.286549
## 11 11   44      1    5.779488
## 12 12   22      1    7.434550
## 13 13   44      2    7.800177
## 14 14   45      3    6.836069
## 15 15   26      4    8.242919
## 16 16   46      5    6.065615
## 17 17   52      5    7.393709
## 18 18   25      3    7.403631
## 19 19   43      1    6.113563
## 20 20   24      2    5.681062

3.1 Valores perdidos

  1. Identifica cuántos valores perdidos hay en cada variable.
  2. Calcula la media de horas_sueno ignorando los NA.
  3. Crea una nueva variable donde reemplaces los NA por la media.
# Escribe tu código aquí
summary(datos)
##        id             edad           estres      horas_sueno   
##  Min.   : 1.00   Min.   :20.00   Min.   :1.00   Min.   :3.773  
##  1st Qu.: 5.75   1st Qu.:29.75   1st Qu.:1.75   1st Qu.:6.078  
##  Median :10.50   Median :43.00   Median :3.00   Median :6.842  
##  Mean   :10.50   Mean   :39.55   Mean   :2.85   Mean   :6.667  
##  3rd Qu.:15.25   3rd Qu.:46.50   3rd Qu.:4.00   3rd Qu.:7.401  
##  Max.   :20.00   Max.   :60.00   Max.   :5.00   Max.   :8.243  
##                                                 NA's   :2
#Calcula la media de horas_sueño ignorando los NA
mean(datos$horas_sueno, na.rm = TRUE)
## [1] 6.667365
x <- mean(datos$horas_sueno, na.rm = TRUE)
# Para hacer el reemplazo hay que usar los corchetes rectos con la posición de los valores perdidos y eso se reemplaza por la x

datos <- datos %>%
  mutate(horas_sueno = ifelse(is.na(horas_sueno), x, horas_sueno))

summary(datos)
##        id             edad           estres      horas_sueno   
##  Min.   : 1.00   Min.   :20.00   Min.   :1.00   Min.   :3.773  
##  1st Qu.: 5.75   1st Qu.:29.75   1st Qu.:1.75   1st Qu.:6.102  
##  Median :10.50   Median :43.00   Median :3.00   Median :6.758  
##  Mean   :10.50   Mean   :39.55   Mean   :2.85   Mean   :6.667  
##  3rd Qu.:15.25   3rd Qu.:46.50   3rd Qu.:4.00   3rd Qu.:7.396  
##  Max.   :20.00   Max.   :60.00   Max.   :5.00   Max.   :8.243

3.2 Recodificación

  1. Recodifica estres en una variable binaria:
    • 1–3 = “Bajo”
    • 4–5 = “Alto”
# Escribe tu código aquí

datos %>%
  mutate(estres = ifelse(estres %in% 4:5, "Alto", "Bajo"))
##    id edad estres horas_sueno
## 1   1   48   Bajo    6.679944
## 2   2   32   Bajo    5.688478
## 3   3   31   Bajo    6.667365
## 4   4   20   Alto    6.870589
## 5   5   59   Bajo    7.886736
## 6   6   60   Bajo    6.848604
## 7   7   54   Alto    6.667365
## 8   8   31   Alto    3.772677
## 9   9   42   Bajo    6.228208
## 10 10   43   Alto    7.286549
## 11 11   44   Bajo    5.779488
## 12 12   22   Bajo    7.434550
## 13 13   44   Bajo    7.800177
## 14 14   45   Bajo    6.836069
## 15 15   26   Alto    8.242919
## 16 16   46   Alto    6.065615
## 17 17   52   Alto    7.393709
## 18 18   25   Bajo    7.403631
## 19 19   43   Bajo    6.113563
## 20 20   24   Bajo    5.681062

3.3 Estandarización

  1. Estandariza (z-score) la variable edad.
  2. Verifica que la media sea aproximadamente 0 y la desviación estándar aproximadamente 1.
# Escribe tu código aquí
# Se necesita la función
datos %>%
  mutate(edad_z = (edad - mean(edad))/ sd(edad))
##    id edad estres horas_sueno     edad_z
## 1   1   48      2    6.679944  0.6836184
## 2   2   32      1    5.688478 -0.6108070
## 3   3   31      3    6.667365 -0.6917085
## 4   4   20      4    6.870589 -1.5816260
## 5   5   59      1    7.886736  1.5735358
## 6   6   60      3    6.848604  1.6544374
## 7   7   54      5    6.667365  1.1690279
## 8   8   31      4    3.772677 -0.6917085
## 9   9   42      2    6.228208  0.1982089
## 10 10   43      5    7.286549  0.2791105
## 11 11   44      1    5.779488  0.3600120
## 12 12   22      1    7.434550 -1.4198228
## 13 13   44      2    7.800177  0.3600120
## 14 14   45      3    6.836069  0.4409136
## 15 15   26      4    8.242919 -1.0962165
## 16 16   46      5    6.065615  0.5218152
## 17 17   52      5    7.393709  1.0072247
## 18 18   25      3    7.403631 -1.1771180
## 19 19   43      1    6.113563  0.2791105
## 20 20   24      2    5.681062 -1.2580196

Pregunta final:
¿Por qué es útil estandarizar variables en algunos modelos estadísticos?

Media de 0

Sirve para comparar variables que se encuentran en escalas distintas, ya que al pasarlos a z-score sus medias quedan en 0.


Entrega

Sube tu archivo .Rmd compilado en HTML o PDF, junto con respuestas breves a las preguntas conceptuales.