5  Estadística Descriptiva

Esta práctica contiene ejercicios que muestran cómo realizar un análisis descriptivo de un conjunto de datos mediante estadísticos muestrales, como por ejemplo:

5.1 Ejercicios Resueltos

Para la realización de esta práctica se requieren los siguientes paquetes:

library(tidyverse) 
# Incluye los siguientes paquetes:
# - readr: para la lectura de ficheros csv. 
# - dplyr: para el preprocesamiento y manipulación de datos.
library(DescTools) # para el cálculo de la moda.
library(moments) # para el cálculo del coeficiente de asimetría y apuntamiento.
library(vtable) # para resúmenes estadísticos.
library(skimr) # para resúmenes estadísticos.
library(summarytools) # para resúmenes estadísticos.
library(knitr) # para el formateo de tablas.

DescToolsdplyrknitrmomentsreadrskimrsummarytoolsvtable

Si se va a usar Copilot para resolver los ejercicios se recomienda añadir el siguiente contexto al comienzo del script o al fichero r.instructions.md.

---
name: "Reglas de programación para R"
applyTo: "**/*.[rR], **/*.qmd"
---

## Reglas de programación para R

- Usar tidyverse para todas las tareas de preprocesamiento (dplyr/tidyr/readr/stringr/lubridate/forcats/purrr).
- Preferir tuberías con |> (o %>% si se usa en el archivo).
- Evitar la manipulación de datos en base R (merge, aggregate, subset) a menos que se solicite explícitamente.
- Mantener el código legible y usar verbos explícitos: select, mutate, summarise, group_by, pivot_longer/wider.
- Cuando no haya ambigüedad no antepongas el nombre del paquete a la función.
- En los nombres de variables y valores respetar el uso de mayúsculas y minúsculas (camelCase o snake_case) y ser consistente en todo el código.
- No generar nuevos data frames, ni modificar los asistentes, salvo cuando se indique explícitamente.
- Utiliza el prefijo `df_` para los nombres de los data frames.
- Organizar las salidas con la función tidy del paquete broom y mostrar solo las columnas relevantes (estimate, std.error, statistic, p.value).
- Mostrar los data frames o las tablas con la función kable del paquete knitr.
- Para gráficos usar ggplot2 y mantener un estilo limpio y profesional.

Ejercicio 5.1 Se realizó una encuesta a 40 personas de más de 70 años sobre el número de medicamentos distintos que tomaban habitualmente. El resultado de dicha encuesta fue el siguiente:

3 − 1 − 2 − 2 − 0 − 1 − 4 − 2 − 3 − 5 − 1 − 3 − 2 − 3 − 1 − 4 − 2 − 4 − 3 − 2
3 − 5 − 0 − 1 − 2 − 0 − 2 − 3 − 0 − 1 − 1 − 5 − 3 − 4 − 2 − 3 − 0 − 1 − 2 − 3
  1. Crear un conjunto de datos con la variable medicamentos.

    df <- data.frame(medicamentos = c(3, 1, 2, 2, 0, 1, 4, 2, 3, 5, 1, 3, 2, 3, 1, 4, 2, 4, 3, 2, 3, 5, 0, 1, 2, 0, 2, 3, 0, 1, 1, 5, 3, 4, 2, 3, 0, 1, 2, 3))
    library(tidyverse)
    df <- tibble(medicamentos = c(3, 1, 2, 2, 0, 1, 4, 2, 3, 5, 1, 3, 2, 3, 1, 4, 2, 4, 3, 2, 3, 5, 0, 1, 2, 0, 2, 3, 0, 1, 1, 5, 3, 4, 2, 3, 0, 1, 2, 3))
    Se realizó una encuesta a 40 personas de más de 70 años sobre el número de medicamentos distintos que tomaban habitualmente.
    
    Crear un data frame de nombre df con una columna llamada medicamentos que contenga los siguientes valores: 3, 1, 2, 2, 0, 1, 4, 2, 3, 5, 1, 3, 2, 3, 1, 4, 2, 4, 3, 2, 3, 5, 0, 1, 2, 0, 2, 3, 0, 1, 1, 5, 3, 4, 2, 3, 0, 1, 2 y 3.
  2. Calcular el tamaño muestral.

    El tamaño muestral generalmente es el número de filas del data frame. Para calcular el número de filas podemos usar la función nrow del paquete base de R.

    Parámetros:
    • df: data frame del que calcular el número de filas.
    nrow(df)
    [1] 40

    El tamaño muestral generalmente es el número de filas del data frame. Para calcular el número de filas podemos usar la función la función count del paquete dplyr de tidyverse.

    Parámetros:
    • df: data frame del que calcular el número de filas.
    n
    40
    Calcular el número de filas del data frame df.
  3. Calcular el número medio de medicamentos que toman las personas de la muestra e interpretarlo.

    Podemos calcular la media con la función mean del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular la media.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la media.
    mean(df$medicamentos)
    [1] 2.225

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular la media hay que pasarle como argumento la función mean del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular la media.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la media.
    df |> summarise(media = mean(medicamentos)) |> 
        kable()
    media
    2.225
    Calcular la media de la columna medicamentos del data frame df.
    
    Interpreta el resultado obtenido.
  4. Calcular la mediana e interpretarla.

    Podemos calcular la mediana con la función median del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular la mediana.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la mediana.
    median(df$medicamentos)
    [1] 2

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular la mediana hay que pasarle como argumento la función median del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular la mediana.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la mediana.
    df |> summarise(mediana = median(medicamentos)) |>
        kable()
    mediana
    2
    Calcular la mediana de la columna medicamentos del data frame df.
    
    Interpreta el resultado obtenido.
  5. Calcular la moda e interpretarla.

    Para calcular la moda podemos usar la función Mode del paquete DescTools.

    Parámetros:
    • x: vector numérico del que calcular la moda.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la moda.
    library(DescTools)
    Mode(df$medicamentos, na.rm = TRUE)
    [1] 2 3
    attr(,"freq")
    [1] 10

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular la moda podemos usar la función Mode del paquete DescTools.

    Parámetros:
    • x: vector numérico del que calcular la moda.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la moda.
    library(tidyverse) 
    df |> summarise(moda = Mode(medicamentos, na.rm = TRUE)) |>
        kable()
    moda
    2
    3
    Calcular la moda de la columna medicamentos del data frame df. Usa la función Mode del paquete DescTools.
    
    Interpretar el resultado obtenido.

    Existen dos modas 2 y 3 que son los valores más frecuentes en el conjunto de datos. Por tanto, el conjunto de datos es bimodal.

  6. Calcular el mínimo.

    Podemos calcular el mínimo con la función min del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular el mínimo.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el mínimo.
    min(df$medicamentos)
    [1] 0

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular el mínimo hay que pasarle como argumento la función min del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular el mínimo.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el mínimo.
    df |> summarise(mínimo = min(medicamentos, na.rm = TRUE))
    mínimo
    0
    Calcular el mínimo de la columna medicamentos del data frame df.
  7. Calcular el máximo.

    Podemos calcular el máximo con la función max del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular el máximo.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el máximo.
    max(df$medicamentos)
    [1] 5

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular el máximo hay que pasarle como argumento la función max del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular el máximo.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el máximo.
    df |> summarise(máximo = max(medicamentos))
    máximo
    5
    Calcular el máximo de la columna medicamentos del data frame df.
  8. Calcular los cuartiles e interpretarlos.

    Podemos calcular los cuartiles con la función quantile del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular los cuartiles.
    • probs: vector de probabilidades para calcular los cuartiles. Por defecto es c(0, 0.25, 0.5, 0.75, 1).
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular los cuartiles.
    quantile(df$medicamentos, prob = c(0.25, 0.5, 0.75))
    25% 50% 75% 
      1   2   3 

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular los cuartiles hay que pasarle como argumento la función quantile del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular los cuartiles.
    • probs: vector de probabilidades para calcular los cuartiles. Por defecto es c(0, 0.25, 0.5, 0.75, 1).
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular los cuartiles.

    Es necesario usar la función unnest del paquete tidyr para desanidar el resultado de la función quantile.

    df |> summarise(cuartiles = list(quantile(medicamentos, prob = c(0.25, 0.5, 0.75)))) |>
        unnest(cuartiles) |> 
        kable()
    cuartiles
    1
    2
    3
    Calcular los cuartiles de la columna medicamentos del data frame df.
    
    Interpreta el resultado obtenido.
  9. Calcular los percentiles 5 y 95 e interpretarlos.

    Podemos calcular los percentiles también con la función quantile del paquete base de R, simplemente indicando el vector de probabilidades acumuladas correspondientes a los percentiles que queremos calcular.

    quantile(df$medicamentos, prob = c(0.05, 0.95))
     5% 95% 
      0   5 

    Podemos calcular los percentiles también con la función quantile del paquete base de R, simplemente indicando el vector de probabilidades acumuladas correspondientes a los percentiles que queremos calcular.

    df |> summarise(percentiles = list(quantile(medicamentos, prob = c(0.05, 0.95)))) |>
        unnest(percentiles) |> 
        kable()
    percentiles
    0
    5
    Calcular los percentiles 5 y 95 de la columna medicamentos del data frame df.
    
    Interpreta el resultado obtenido.
  10. Calcular el rango.

    max(df$medicamentos) - min(df$medicamentos)
    [1] 5
    df |> summarise(rango = max(medicamentos) - min(medicamentos)) |>
        kable()
    rango
    5
    Calcular el rango de la columna medicamentos del data frame df.
  11. Calcular el rango intercuartílico.

    Podemos calcular el rango intercuartílico con la función IQR del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular el rango intercuartílico.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el rango intercuartílico.
    IQR(df$medicamentos)
    [1] 2

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular el rango intercuartílico hay que pasarle como argumento la función IQR del paquete base de R.

    Parámetros:
    • x: vector numérico del que calcular el rango intercuartílico.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el rango intercuartílico.
    df |> summarise(IQR = IQR(medicamentos)) |>
        kable()
    IQR
    2
    Calcular el rango intercuartílico de la columna medicamentos del data frame df.
    
    Interpreta el resultado obtenido.
  12. Calcular la varianza

    Podemos usar la función var del paquete stats de R para calcular la cuasivarianza o varianza corregida \(\sum \frac{(x_i-\bar x)^2}{n-1}\). Para calcular la varianza hay que corregir la cuasivarianza multiplicando por \(\frac{n-1}{n}\), donde \(n\) es el tamaño muestral.

    Parámetros:
    • x: vector numérico del que calcular la cuasivarianza.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la cuasivarianza.
    n <- nrow(df)
    # Cuasivarianza
    print(paste("Cuasivarianza:", var(df$medicamentos)))
    [1] "Cuasivarianza: 2.025"
    # Varianza
    print(paste("Varianza: ", var(df$medicamentos)*(n-1)/n))
    [1] "Varianza:  1.974375"

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular la cuasivarianza hay que pasarle como argumento la función var del paquete stats de R. Para calcular la varianza hay que corregir la cuasivarianza multiplicando por \(\frac{n-1}{n}\), donde \(n\) es el tamaño muestral.

    Parámetros:
    • x: vector numérico del que calcular la cuasivarianza.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la cuasivarianza.
    df |> summarise(cuasivarianza = var(medicamentos), 
        varianza = var(medicamentos)*(n()-1)/n()) |> 
        kable()
    cuasivarianza varianza
    2.025 1.974375
    Calcular la varianza de la columna medicamentos del data frame df. Para ello, primero calcula la cuasivarianza y luego corrige la cuasivarianza multiplicando por (n-1)/n, donde n es el tamaño muestral.
  13. Calcular la desviación típica.

    Podemos usar la función sd del paquete stats de R para calcular la cuasidesviación típica o desviación típica corregida \(\sqrt{\sum \frac{(x_i-\bar x)^2}{n-1}}\). Para calcular la desviación típica hay que corregir la cuasidesviación típica multiplicando por \(\sqrt{\frac{n-1}{n}}\), donde \(n\) es el tamaño muestral.

    Parámetros:
    • x: vector numérico del que calcular la cuasivarianza.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la cuasivarianza.
    n <- nrow(df)
    # Cuasidesviación típica
    print(paste("Cuasidesviación típica:", sd(df$medicamentos)))
    [1] "Cuasidesviación típica: 1.42302494707577"
    # Desviación típica
    print(paste("Desviación típica: ", sd(df$medicamentos)*sqrt((n-1)/n)))
    [1] "Desviación típica:  1.40512454963964"

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular la cuasivarianza hay que pasarle como argumento la función sd del paquete stats de R para calcular la cuasidesviación típica o desviación típica corregida \(\sqrt{\sum \frac{(x_i-\bar x)^2}{n-1}}\). Para calcular la desviación típica hay que corregir la cuasidesviación típica multiplicando por \(\sqrt{\frac{n-1}{n}}\), donde \(n\) es el tamaño muestral.

    Parámetros:
    • x: vector numérico del que calcular la cuasivarianza.
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular la cuasivarianza.
    df |> summarise(cuasidesviación = sd(medicamentos), 
        desviación = sd(medicamentos)*sqrt((n()-1)/n())) |> 
        kable()
    cuasidesviación desviación
    1.423025 1.405125
    Calcular la desviación típica de la columna medicamentos del data frame df. Para ello, primero calcula la cuasidesviación típica y luego corrige la cuasidesviación típica multiplicando por la raíz cuadrada de (n-1)/n, donde n es el tamaño muestral.
    
    Interpreta el resultado obtenido.
  14. Calcular el coeficiente de variación.

    No existe una función en R para calcular el coeficiente de variación, pero se puede calcular dividiendo la desviación típica entre el valor absoluto de la media. Se suele expresar como porcentaje multiplicando por 100.

    sd(df$medicamentos, na.rm = TRUE) / abs(mean(df$medicamentos, na.rm = TRUE)) * 100
    [1] 63.95618

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular el coeficiente de variación se divide la desviación típica entre el valor absoluto de la media y se multiplica por 100 para expresarlo como porcentaje.

    df |> summarise(coef_variacion = sd(medicamentos, na.rm = TRUE) / abs(mean(medicamentos, na.rm = TRUE)) * 100) |> 
        kable()
    coef_variacion
    63.95618
    Calcular el coeficiente de variación de la columna medicamentos del data frame df. Exprésarlo como un porcentaje.
    
    Interpreta el resultado obtenido.
  15. Calcular el coeficiente de asimetría.

    Para calcular el coeficiente de asimetría podemos usar la función skewness del paquete moments.

    Parámetros:
    • x: vector numérico del que calcular el coeficiente de asimetría
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el coeficiente de asimetría.
    library(moments)
    skewness(df$medicamentos, na.rm = TRUE)
    [1] 0.1913698

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular el coeficiente de asimetría podemos usar la función skewness del paquete moments.

    Parámetros:
    • x: vector numérico del que calcular el coeficiente de asimetría
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el coeficiente de asimetría.
    library(moments)
    df |> summarise(coef_asimetria = skewness(medicamentos, na.rm = TRUE)) |> 
        kable()
    coef_asimetria
    0.1913698
    Calcular el coeficiente de asimetría de la columna medicamentos del data frame df. Utiliza la función skewness del paquete moments.
    
    Interpreta el resultado obtenido.

    Como \(g_1\) está próxima a 0, la distribución es casi simétrica.

  16. Calcular el coeficiente de apuntamiento.

    Para calcular el coeficiente de apuntamiento podemos usar la función kurtosis del paquete moments.

    Parámetros:
    • x: vector numérico del que calcular el coeficiente de apuntamiento
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el coeficiente de apuntamiento.
    library(moments)
    kurtosis(df$medicamentos, na.rm = TRUE)
    [1] 2.320303

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular el coeficiente de apuntamiento podemos usar la función kurtosis del paquete moments.

    Parámetros:

    • x: vector numérico del que calcular el coeficiente de asimetría
    • na.rm: si es TRUE se eliminan los valores perdidos antes de calcular el coeficiente de asimetría.
    library(moments)
    df |> summarise(coef_apuntamiento = kurtosis(medicamentos, na.rm = TRUE)) |> 
        kable()
    coef_apuntamiento
    2.320303
    Calcular el coeficiente de apuntamiento de la columna medicamentos del data frame df. Utiliza la función kurtosis del paquete moments.
    
    Interpreta el resultado obtenido.

    Como \(g_2>0\), la distribución es más apuntada de lo normal (leptocúrtica). Como además \(g_2\not\in(-2,2)\) se puede concluir que la muestra es demasiado apuntada para provenir de una población normal.

Ejercicio 5.2 El fichero colesterol.csv contiene información de una muestra de pacientes donde se han medido la edad, el sexo, el peso, la altura y el nivel de colesterol, además de su nombre.

  1. Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero colesterol.csv.

    df <- read.csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    library(tidyverse)
    df <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    Crear un data frame de nombre df con los datos de todos los pacientes del estudio a partir del fichero https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv.
  2. Obtener un resumen del data frame que muestre las variables que contiene, su tipo, el número de filas y el número de columnas.

    Para obtener las variables de un data frame podemos usar la función str del paquete base de R.

    Parámetros:
    • object: objeto del que obtener su estructura.
    str(df)
    spc_tbl_ [14 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
     $ nombre    : chr [1:14] "José Luis Martínez Izquierdo" "Rosa Díaz Díaz" "Javier García Sánchez" "Carmen López Pinzón" ...
     $ edad      : num [1:14] 18 32 24 35 46 68 51 22 35 46 ...
     $ sexo      : chr [1:14] "H" "M" "H" "M" ...
     $ peso      : num [1:14] 85 65 NA 65 51 66 62 60 90 75 ...
     $ altura    : num [1:14] 1.79 1.73 1.81 1.7 1.58 1.74 1.72 1.66 1.94 1.85 ...
     $ colesterol: num [1:14] 182 232 191 200 148 249 276 NA 241 280 ...
     - attr(*, "spec")=
      .. cols(
      ..   nombre = col_character(),
      ..   edad = col_double(),
      ..   sexo = col_character(),
      ..   peso = col_double(),
      ..   altura = col_double(),
      ..   colesterol = col_double()
      .. )
     - attr(*, "problems")=<externalptr> 

    Para obtener las variables y sus tipos de un data frame podemos usar la función glimpse del paquete dplyr de tidyverse.

    Parámetros:
    • data: data frame del que obtener las variables.
    Rows: 14
    Columns: 6
    $ nombre     <chr> "José Luis Martínez Izquierdo", "Rosa Díaz Díaz",…
    $ edad       <dbl> 18, 32, 24, 35, 46, 68, 51, 22, 35, 46, 53, 58, 2…
    $ sexo       <chr> "H", "M", "H", "M", "M", "H", "H", "M", "H", "H",…
    $ peso       <dbl> 85, 65, NA, 65, 51, 66, 62, 60, 90, 75, 55, 78, 1…
    $ altura     <dbl> 1.79, 1.73, 1.81, 1.70, 1.58, 1.74, 1.72, 1.66, 1…
    $ colesterol <dbl> 182, 232, 191, 200, 148, 249, 276, NA, 241, 280, …

    Para obtener las variables y sus tipos de un data frame podemos usar la función dfSummary del paquete summarytools.

    Parámetros:
    • x: data frame del que obtener las variables.
    library(summarytools)
    print(dfSummary(df, plain.ascii = FALSE, style = "grid"), method = "render")

    Data Frame Summary

    df

    Dimensions: 14 x 6
    Duplicates: 0
    No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
    1 nombre [character]
    1. Antonio Fernández Ocaña
    2. Antonio Ruiz Cruz
    3. Carmen López Pinzón
    4. Carolina Rubio Moreno
    5. Javier García Sánchez
    6. José Luis Martínez Izquie
    7. José María de la Guía San
    8. Macarena Álvarez Luna
    9. Marisa López Collado
    10. Miguel Angel Cuadrado Gut
    [ 4 others ]
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    1 ( 7.1% )
    4 ( 28.6% )
    14 (100.0%) 0 (0.0%)
    2 edad [numeric]
    Mean (sd) : 38.2 (15.6)
    min ≤ med ≤ max:
    18 ≤ 35 ≤ 68
    IQR (CV) : 25 (0.4)
    12 distinct values 14 (100.0%) 0 (0.0%)
    3 sexo [character]
    1. H
    2. M
    8 ( 57.1% )
    6 ( 42.9% )
    14 (100.0%) 0 (0.0%)
    4 peso [numeric]
    Mean (sd) : 70.9 (16.1)
    min ≤ med ≤ max:
    51 ≤ 65 ≤ 109
    IQR (CV) : 17 (0.2)
    12 distinct values 13 (92.9%) 1 (7.1%)
    5 altura [numeric]
    Mean (sd) : 1.8 (0.1)
    min ≤ med ≤ max:
    1.6 ≤ 1.8 ≤ 2
    IQR (CV) : 0.1 (0.1)
    14 distinct values 14 (100.0%) 0 (0.0%)
    6 colesterol [numeric]
    Mean (sd) : 220.2 (39.8)
    min ≤ med ≤ max:
    148 ≤ 210 ≤ 280
    IQR (CV) : 55 (0.2)
    13 distinct values 13 (92.9%) 1 (7.1%)

    Generated by summarytools 1.1.4 (R version 4.3.3)
    2026-05-07

    Obtener un resumen del data frame df que muestre las columnas que contiene, su tipo, el número de filas y el número de columnas.
  3. Calcular el número de valores perdidos en cada variable.

    Para calcular el número de valores perdidos podemos usar la función colSums del paquete base de R, aplicada a la función is.na que devuelve un vector lógico indicando si cada elemento es NA o no.

    Parámetros:
    • x: matriz o data frame del que calcular el número de valores perdidos.
        nombre       edad       sexo       peso     altura colesterol 
             0          0          0          1          0          1 

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. Para obtener un resumen de todas las variables del data frame, hay que indicar el argumento across(everything(), ...). En particular, para calcular el número de valores perdidos podemos aplicar la función sum al vector que devuelve la función is.na del paquete base de R.

    nombre edad sexo peso altura colesterol
    0 0 0 1 0 1

    Podemos obtener un resumen estadístico con la función skim del paquete skimr. El resumen incluye el número de valores perdidos para cada variable además de otros estadísticos.

    Parámetros:
    • data: data frame del que obtener el resumen estadístico.
    Data summary
    Name df
    Number of rows 14
    Number of columns 6
    _______________________
    Column type frequency:
    character 2
    numeric 4
    ________________________
    Group variables None

    Variable type: character

    skim_variable n_missing complete_rate min max empty n_unique whitespace
    nombre 0 1 14 31 0 14 0
    sexo 0 1 1 1 0 2 0

    Variable type: numeric

    skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
    edad 0 1.00 38.21 15.62 18.00 24.75 35.00 49.75 68.00 ▇▅▃▅▂
    peso 1 0.93 70.92 16.13 51.00 61.00 65.00 78.00 109.00 ▇▅▅▂▂
    altura 0 1.00 1.77 0.12 1.58 1.70 1.75 1.84 1.98 ▆▇▆▃▃
    colesterol 1 0.93 220.23 39.85 148.00 194.00 210.00 249.00 280.00 ▂▇▂▅▅
    Calcular el número de valores perdidos en cada columna del data frame df.
  4. Calcular el tamaño muestral según el sexo.

    Para calcular la frecuencia absoluta podemos usar la función table del paquete base de R.

    table(df$sexo)
    
    H M 
    8 6 

    Para calcular la frecuencia absoluta podemos usar la función count del paquete dplyr de tidyverse.

    sexo n
    H 8
    M 6
    Calcular el tamaño muestral según el sexo de los pacientes del data frame df.
  5. Calcular la media y la desviación típica del nivel de colesterol sin tener en cuenta los datos perdidos.

    Para calcular la media y la desviación típica podemos usar las funciones mean y sd del paquete base de R. Es importante indicar el parámetro na.rm = TRUE para eliminar los valores perdidos antes de calcular la media y la desviación típica.

    # Media
    mean(df$colesterol, na.rm = TRUE)
    [1] 220.2308
    # Desviación típica:
    sd(df$colesterol, na.rm = TRUE)
    [1] 39.84795

    Podemos obtener un resumen estadístico con la función summarise del paquete dplyr de tidyverse. En particular, para calcular la media y la desviación típica hay que pasarle como argumento las funciones mean y sd del paquete base de R. Es importante indicar el parámetro na.rm = TRUE para eliminar los valores perdidos antes de calcular la media y la desviación típica.

    library(dplyr)
    df |> summarise(media = mean(colesterol, na.rm = TRUE), 
                    desviación_típica = sd(colesterol, na.rm = TRUE)) |> 
        kable()
    media desviación_típica
    220.2308 39.84795
    Calcular la media y la desviación típica de la columna colesterol de los pacientes del data frame df sin tener en cuenta los datos perdidos.
  6. Realizar un resumen estadístico de todas las variables que incluya la media, el mínimo, los cuartiles, el máximo y la desviación típica para las variables cuantitativas y la frecuencia absoluta para las variables cualitativas.

    Para obtener un resumen estadístico del conjunto de datos podemos usar la función summary del paquete base de R.

    Parámetros:

    • object: objeto del que obtener el resumen estadístico. Suele ser un data frame o un vector.
        nombre               edad           sexo          
     Length:14          Min.   :18.00   Length:14         
     Class :character   1st Qu.:24.75   Class :character  
     Mode  :character   Median :35.00   Mode  :character  
                        Mean   :38.21                     
                        3rd Qu.:49.75                     
                        Max.   :68.00                     
    
          peso            altura        colesterol   
     Min.   : 51.00   Min.   :1.580   Min.   :148.0  
     1st Qu.: 61.00   1st Qu.:1.705   1st Qu.:194.0  
     Median : 65.00   Median :1.755   Median :210.0  
     Mean   : 70.92   Mean   :1.769   Mean   :220.2  
     3rd Qu.: 78.00   3rd Qu.:1.840   3rd Qu.:249.0  
     Max.   :109.00   Max.   :1.980   Max.   :280.0  
     NA's   :1                        NA's   :1      

    Para obtener un resumen estadístico del conjunto de datos podemos usar la función st del paquete vtable.

    Parámetros:
    • data: data frame del que obtener el resumen estadístico.
    Summary Statistics
    Variable N Mean Std. Dev. Min Pctl. 25 Pctl. 75 Max
    edad 14 38 16 18 25 50 68
    sexo 14
    ... H 8 57%
    ... M 6 43%
    peso 13 71 16 51 61 78 109
    altura 14 1.8 0.12 1.6 1.7 1.8 2
    colesterol 13 220 40 148 194 249 280

    Para obtener un resumen estadístico del conjunto de datos podemos usar la función skim del paquete skimr.

    Parámetros:
    • data: data frame del que obtener el resumen estadístico.
    skim(df)
    Data summary
    Name df
    Number of rows 14
    Number of columns 6
    _______________________
    Column type frequency:
    character 2
    numeric 4
    ________________________
    Group variables None

    Variable type: character

    skim_variable n_missing complete_rate min max empty n_unique whitespace
    nombre 0 1 14 31 0 14 0
    sexo 0 1 1 1 0 2 0

    Variable type: numeric

    skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
    edad 0 1.00 38.21 15.62 18.00 24.75 35.00 49.75 68.00 ▇▅▃▅▂
    peso 1 0.93 70.92 16.13 51.00 61.00 65.00 78.00 109.00 ▇▅▅▂▂
    altura 0 1.00 1.77 0.12 1.58 1.70 1.75 1.84 1.98 ▆▇▆▃▃
    colesterol 1 0.93 220.23 39.85 148.00 194.00 210.00 249.00 280.00 ▂▇▂▅▅

    Para obtener un resumen estadístico del conjunto de datos podemos usar las funciones descr del paquete summarytools.

    Parámetros:
    • x: vector o data frame del que obtener el resumen estadístico. Por defecto calcula la media, la desviación típica, los cuartiles, el mínimo, el máximo, el rango intercuartílico, el coeficiente de variación, y los coeficientes de asimetría y apuntamiento.
    descr(df) |>
    kable()
    altura colesterol edad peso
    Mean 1.7685714 220.2307692 38.2142857 70.9230769
    Std.Dev 0.1150155 39.8479482 15.6213787 16.1269006
    Min 1.5800000 148.0000000 18.0000000 51.0000000
    Q1 1.7000000 194.0000000 24.0000000 61.0000000
    Median 1.7550000 210.0000000 35.0000000 65.0000000
    Q3 1.8500000 249.0000000 51.0000000 78.0000000
    Max 1.9800000 280.0000000 68.0000000 109.0000000
    MAD 0.1111950 41.5128000 17.7912000 14.8260000
    IQR 0.1350000 55.0000000 25.0000000 17.0000000
    CV 0.0650330 0.1809372 0.4087837 0.2273858
    Skewness 0.2052057 -0.0022401 0.3238511 0.9149779
    SE.Skewness 0.5973799 0.6163361 0.5973799 0.6163361
    Kurtosis -0.9852205 -1.2502343 -1.2886761 -0.1208155
    N.Valid 14.0000000 13.0000000 14.0000000 13.0000000
    N 14.0000000 14.0000000 14.0000000 14.0000000
    Pct.Valid 100.0000000 92.8571429 100.0000000 92.8571429
    Realizar un resumen estadístico de todas las columnas del data frame df que incluya la media, el mínimo, los cuartiles, el máximo y la desviación típica para las variables cuantitativas y la frecuencia absoluta para las variables cualitativas.
  7. ¿En qué variable es más representativa la media?

    Para obtener un resumen estadístico del conjunto de datos podemos usar la función st del paquete vtable.

    Parámetros:
    • data: data frame del que obtener el resumen estadístico.
    • vars: vector de nombres de las variables a incluir en el resumen estadístico.
    • group: nombre de la variable por la que agrupar los datos.
    • summ: vector de funciones a aplicar a las variables seleccionadas.
    • summ.names: vector de nombres para las funciones aplicadas.
    st(df, summ = c('mean(x, na.rm = TRUE)', 'sd(x, na.rm = TRUE)', 'sd(x, na.rm = TRUE)/mean(x, na.rm = TRUE)*100'),
    summ.names = c("Media", "Desviación Típica", "Coef. Variación"))
    Summary Statistics
    Variable Media Desviación Típica Coef. Variación
    edad 38 16 41
    sexo 14
    ... H 8 57%
    ... M 6 43%
    peso 71 16 23
    altura 1.8 0.12 6.5
    colesterol 220 40 18

    Para obtener un resumen estadístico del conjunto de datos podemos usar las funciones summarise y across del paquete dplyr de tidyverse.

    Parámetros:
    • .cols: Indica las columnas de las que se obtendrá el resúmen estadístico. Para seleccionar solo las variables numéricas hay que pasarel el argumento where(is.numeric).
    • .fns: Indica el nombre y la función a aplicar. En este caso utilizaremos la media mean, desviación típica sd y el coeficiente de variación sd / abs(mean) * 100.
    df |> summarise(across(.cols = where(is.numeric), .fns = list(Media = ~ mean(.x, na.rm = TRUE), `Desviación Típica` = ~ sd(.x, na.rm = TRUE), `Coef. Variación` = ~ sd(.x, na.rm=TRUE) / mean(.x, na.rm=TRUE) * 100))) |>
        kable()
    edad_Media edad_Desviación Típica edad_Coef. Variación peso_Media peso_Desviación Típica peso_Coef. Variación altura_Media altura_Desviación Típica altura_Coef. Variación colesterol_Media colesterol_Desviación Típica colesterol_Coef. Variación
    38.21429 15.62138 40.87837 70.92308 16.1269 22.73858 1.768571 0.1150155 6.503301 220.2308 39.84795 18.09372

    Para obtener un resumen estadístico de todas las variables del conjunto de datos tenemos que encadenar las siguientes operaciones:

    1. Seleccionar las variables numéricas con la función select del paquete dplyr de tidyverse, pasándoloe el argumento where(is.numeric).
    2. Pivotar el data frame con la función pivot_longer del paquete tidyr de tidyverse para pasarlo a formato largo.
    3. Dividir el data frame por grupos con la función group_by del paquete dplyr de tidyverse.
    4. Calcular el resumen estadístico con la función summarise del paquete dplyr de tidyverse, aplicando las funciones mean, sd y la fórmula del coeficiente de variación.
    # Seleccionamos las variables numéricas.
    df |> select(where(is.numeric)) |>
        # Pivotamos el data frame a formato largo.
        pivot_longer(everything(), names_to = "Variable", values_to = "Valor") |>
        # Agrupamos por variable.
        group_by(Variable) |>
        # Calculamos la media, desviación típica y coeficiente de variación.
        summarise("Media" = mean(Valor, na.rm = TRUE), 
        "Desviación Típica" = sd(Valor, na.rm = TRUE),
        "Coef. Variación" = sd(Valor, na.rm = T) / mean(Valor, na.rm = T) * 100) |>
        # Mostramos el resultado en una tabla.
        kable()
    Variable Media Desviación Típica Coef. Variación
    altura 1.768571 0.1150155 6.503301
    colesterol 220.230769 39.8479482 18.093724
    edad 38.214286 15.6213787 40.878374
    peso 70.923077 16.1269006 22.738580
    Calcular la media, la desviación típica y el coeficiente de variación de las columnas numéricas del data frame df.
    
    Interpreta el resultado obtenido para determinar en qué variable es más representativa la media.

    La variable con el coeficiente de variación más pequeño es la altura, por lo que es la que tiene la media más representativa.

  8. Realizar un resumen estadístico con el coeficiente de asimetría y el coeficiente de apuntamiento del peso y la estatura según el sexo. ¿Qué grupo tiene peso más normal, los hombres o las mujeres? ¿Y una estatura más normal?

    Para obtener un resumen estadístico del conjunto de datos podemos usar la función st del paquete vtable.

    Parámetros:
    • data: data frame del que obtener el resumen estadístico.
      • vars: vector de nombres de las variables a incluir en el resumen estadístico.
      • group: nombre de la variable por la que agrupar los datos.
      • summ: vector de funciones a aplicar a las variables seleccionadas.
      • summ.names: vector de nombres para las funciones aplicadas.
    library(vtable)
    st(df, vars = c("peso", "altura"), group = "sexo", summ = c('skewness(x, na.rm = TRUE)', 'kurtosis(x, na.rm = TRUE)'),
    summ.names = c("Coef. Asimetría", "Coef. Apuntamiento"))
    Summary Statistics
    sexo
    H
    M
    Variable Coef. Asimetría Coef. Apuntamiento Coef. Asimetría Coef. Apuntamiento
    peso 0.61 2.5 -0.47 1.9
    altura 0.27 1.9 -0.07 1.8

    Para obtener un resumen estadístico con el coeficiente de asimetría y el coeficiente de apuntamiento del peso y la estatura según el sexo tenemos que encadenar las siguientes operaciones:

    1. Seleccionar las variables deseadas con la función select del paquete dplyr de tidyverse.
    2. Dividir el data frame por grupos según el sexo con la función group_by del paquete dplyr de tidyverse.
    3. Calcular el resumen estadístico con la función summarise del paquete dplyr de tidyverse, aplicando las funciones skewness y kurtosis del paquete moments.
    library(moments)
    # Seleccionamos las variables peso y altura.
    df |> select(sexo, peso, altura) |>
    # Agrupamos por sexo.
    group_by(sexo) |>
    # Calculamos los coeficientes de asimetria y apuntamiento para cada grupo.
    summarise(across(.cols = everything(), .fns = list("Coef. Asimetría" = ~ skewness(.x, na.rm = TRUE), "Coef. Apuntamiento" = ~ kurtosis(.x, na.rm = TRUE)))) |>
    kable()
    sexo peso_Coef. Asimetría peso_Coef. Apuntamiento altura_Coef. Asimetría altura_Coef. Apuntamiento
    H 0.6107239 2.508255 0.2668417 1.904435
    M -0.4661293 1.852431 -0.0699589 1.756341
    Realizar un resumen estadístico con el coeficiente de asimetría y el coeficiente de apuntamiento de las columnas peso y estatura según el sexo de los pacientes del data frame df. Utiliza las funciones skewness y kurtosis del paquete moments.
    
    Interpreta el resultado obtenido para determinar qué grupo tiene un peso más normal y qué grupo tiene una estatura más normal.

    Las mujeres tienen un peso más normal ya que tanto el coeficiente de asimetría como el de apuntamiento están más próximos a 0. Lo mismo ocurre con la altura.

5.2 Ejercicios propuestos

Ejercicio 5.3 En un estudio se ha medido la tensión arterial de 25 individuos. Además se les ha preguntado si fuman y beben:

Fumador Bebedor Tensión arterial
no 80
no no 92
75
56
no 89
no no 93
no 101
67
no no 89
63
no no 98
58
no 91
71
no no 52
no 98
104
no no 57
no no 89
no 70
93
no 69
no 82
no 70
no 49
  1. Calcular la media aritmética, desviación típica, coeficiente de asimetría y curtosis de la tensión arterial de los fumadores y de los no fumadores. ¿Se puede considerar que las muestras provienen de una distribución normal?

  2. Calcular la media aritmética, desviación típica, coeficiente de asimetría y curtosis de la tensión arterial de los bebedores y de los no bebedores. ¿Se puede considerar que las muestras provienen de una distribución normal?

  3. Calcular la media aritmética, desviación típica, coeficiente de asimetría y curtosis de la tensión arterial de los grupos que se obtienen según el consumo de alcohol y tabaco. ¿Se puede considerar que las muestras provienen de una distribución normal?

Ejercicio 5.4 El conjunto de datos neonatos contiene información sobre una muestra de 320 recién nacidos en un hospital durante un año que cumplieron el tiempo normal de gestación.

  1. Calcular la media y la mediana muestral del peso de los nacidos e interpretarlos.

  2. Calcular el peso medio de los recién nacidos de la muestra según si la madre ha fumado o no durante el embarazo. Calcular también el peso medio de los recién nacidos de madres que no han fumado durante el embarazo, según si la madre fumaba o no antes del embarazo. ¿Qué conclusiones se pueden sacar?

  3. ¿Cuál es la puntuación Apgar al minuto de nacer más frecuente?

  4. Calcular la media de la diferencia entre las puntuaciones Apgar a los 5 minutos y al minuto de nacer. ¿Cómo evolucionan los recién nacidos?

  5. Calcular los cuartiles muestrales del peso de los recién nacidos e interpretarlos.

  6. Comparar los cuartiles muestrales del peso de los recién nacidos según el sexo.

  7. ¿Por encima de qué peso estarán el 10% de los niños con mayor peso?

  8. Si se considera que un niño es atípico por bajo peso si se encuentra entre el 5% de los pesos más bajos, ¿por debajo de qué peso tiene que estar?

  9. Calcular el recorrido y el rango intercuartílico muestrales del peso de los recién nacidos e interpretarlos.

  10. Calcular la varianza y la desviación típica del peso de los recién nacidos e interpretarlos.

  11. ¿En qué grupo hay más variabilidad del peso de los recién nacidos, en las madres fumadoras o en las madres no fumadoras durante el embarazo? ¿En qué grupo será más representativo el peso medio?

  12. ¿Qué variable presenta más variabilidad relativa, el peso de los recién nacidos o el Apgar al minuto de nacer?

  13. Calcular el coeficiente de asimetría y de apuntamiento muestrales del peso de los recién nacidos e interpretarlos.

  14. ¿Qué distribución es más asimétrica, la de los pesos de recién nacidos en madres mayores de 20 años o en madres menores de 20 años?

  15. ¿Qué distribución es más apuntada, la del peso de los recién nacidos en hombres o en mujeres?

  16. De acuerdo a la forma de la distribución, ¿puede considerarse la puntuación Apgar al minuto de nacer como una variable normal? ¿Y el número de cigarros fumados al día durante el embarazo?