6.9 Resúmenes estadísticos

Realizar resúmenes estadísticos es uno de los grandes motivos de aprender a trabajar con pipelines. Puede aplicarse promedio mean(), mediana median(), desviación estándar sd(), varianza var(), suma sum(), mínimo min(), máximo max(), además de cualquier función existente o creada siempre y cuando el resultado de dichas funciones sea un único valor (es decir, un vector de un elemento).

El resultado final de cualquier función de la familia de summarise() es una tabla conteniendo las columnas que se solicitaron como resumen estadístico. La estructura base es:

BASE_DE_DATOS %>% ... %>% 
  summarise(COLUMNA_NUEVA = FUNCION_ESTADÍSTICA(COLUMNA_ANTIGUA))
Las funciones estadísticas como mean(), median() y las demás mencionadas arriba, tienen problemas lidiando con valores NA. Si se calcula el promedio de una columna que se conoce contiene NA, se debe colocar el argumento na.rm = TRUE dentro de cada función para hacer esta obvie los NA y calcule el estimados estadístico deseado. Por ejemplo mean(vector, na.rm = TRUE).


Ejemplo 6.15 Considerando la base de datos WHO, calcular el promedio de la columna Life_exp, la mediana de la columna Polio, y el promedio y desviación estándar de GDP. Agrupa previamente por año (columna Year).

# Sin consideraro los NA
WHO %>% 
  group_by(Year) %>% 
  summarise(Promed = mean(Life_exp),
            Pol = median(Polio),
            GDP_prom = mean(GDP),
            GDP_sd = sd(GDP)) %>% 
  ungroup()
# # A tibble: 16 × 5
#    Year Promed   Pol GDP_prom GDP_sd
#   <dbl>  <dbl> <dbl>    <dbl>  <dbl>
# 1  2000   66.8    NA       NA     NA
# 2  2001   67.1    NA       NA     NA
# 3  2002   67.4    NA       NA     NA
# 4  2003   67.4    NA       NA     NA
# 5  2004   67.6    NA       NA     NA
# 6  2005   68.2    NA       NA     NA
# # … with 10 more rows
# Especificando el argumento na.rm = TRUE 
# para obviar los NA de cada columna
WHO %>% 
  group_by(Year) %>% 
  summarise(Promed = mean(Life_exp, na.rm = TRUE),
            Pol = median(Polio, na.rm = TRUE),
            GDP_prom = mean(GDP, na.rm = TRUE),
            GDP_sd = sd(GDP, na.rm = TRUE)) %>% 
  ungroup()
# # A tibble: 16 × 5
#    Year Promed   Pol GDP_prom GDP_sd
#   <dbl>  <dbl> <dbl>    <dbl>  <dbl>
# 1  2000   66.8    88    4709.  9182.
# 2  2001   67.1    89    4855.  8892.
# 3  2002   67.4    91    4599.  8541.
# 4  2003   67.4    91    4775.  9144.
# 5  2004   67.6    91    7056. 13504.
# 6  2005   68.2    93    7250. 13107.
# # … with 10 more rows

6.9.1 Otras funciones de la familia summarise()

En dplyr existen algunas funciones que tienen versiones similares a ellas. Consideremos esta agrupaciones como familias de funciones. En estas familias, como la de summarise(), encontrarás funciones de aplicación específica:

Tabla 3.3: Funciones de la familia summarise()
Función Descripción
summarise() Permite realizar resúmenes estadísticos especificados columna a columna.
summarise_all() Permite realizar resúmenes estadísticos aplicando una o más funciones a todas las columnas de la tabla.
summarise_at() Permite realizar resúmenes estadísticos aplicando una o más funciones a un grupo de columnas de la tabla.
summarise_if() Permite realizar resúmenes estadísticos aplicando una o más funciones si se cumple una condición lógica definida.
summarise_each() Idéntica a summarise_all() es considerada obsoleta (deprecated).
Variantes Algunas funciones tienes variantes escritas con “_” al final o con la palabra summarize (con z), hacen lo mismo que las originales sin “_” o con summarise (con s).


6.9.1.1 summarise_all()

Aplicará la o las funciones especificadas a todas las columnas. Si alguna columna no cumple con lo necesario para se analizada (por ejemplo: intentar obtener el promedio de una columna categórica), se genera error. Asegúrate de que la tabla por completo es analizable, o utiliza la función de dplyr select() para seleccionar las columnas de trabajo antes de aplicar summarise_all(). La estructura básica es:

BASE_DE_DATOS %>% 
  summarise_all(.funs = lst(LISTA_DE_FUNCIONES))

Ejemplo 6.16 Obtener el promedio, y varianza de las columnas GDP, Life_exp y Pop por país de Colombia, México y Perú (recuerda que la base tiene estos nombres en inglés).

WHO %>% 
  filter(Country %in% c("Colombia","Mexico","Peru")) %>% 
  group_by(Country) %>% 
  dplyr::select(GDP, Life_exp, Pop) %>% 
  summarise_all(.funs = lst(mean, var), 
                na.rm=TRUE)%>% 
  ungroup()
# Adding missing grouping variables: `Country`
# # A tibble: 3 × 7
#   Country  GDP_mean Life_exp_mean  Pop_mean   GDP_var Life_exp_var Pop_var
#   <chr>       <dbl>         <dbl>     <dbl>     <dbl>        <dbl>   <dbl>
# 1 Colombia    3322.          73.3 31767433.  7555129.        1.16  4.08e14
# 2 Mexico      5179.          75.7 27585265. 15368266.        0.386 2.02e15
# 3 Peru        2929.          73.7 16854322.  5660203.        1.64  1.77e14

6.9.1.2 summarise_at()

Otra función muy útil al momento de aplicar diferentes funciones estadísticas a varias columnas es summarise_at(). Esta función permite seleccionar las columnas de trabajo, como si incorporara su propia función select(). La estructura básica es:

BASE_DE_DATOS %>% 
  summarise_at(.vars = vars(COLUMNAS_DE_TRABAJO),
               .funs = lst(LISTA_DE_FUNCIONES))

Ejemplo 6.17 Siguiendo el ejemplo @ref:(exm:summariseall), recrear el resultado utilizando summarise_at():

WHO %>% 
  filter(Country %in% c("Colombia","Mexico","Peru")) %>% 
  group_by(Country) %>% 
  summarise_at(.vars = vars(GDP, Life_exp, Pop), 
               .funs = lst(mean, median, sd),  
               na.rm=TRUE)%>% 
  ungroup()
# # A tibble: 3 × 10
#   Country  GDP_mean Life_exp…¹ Pop_m…² GDP_m…³ Life_…⁴ Pop_m…⁵ GDP_sd Life_…⁶ Pop_sd
#   <chr>       <dbl>      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>
# 1 Colombia    3322.       73.3  3.18e7   2434.    73.5  4.30e7  2749.   1.08  2.02e7
# 2 Mexico      5179.       75.7  2.76e7   6976.    75.6  1.15e7  3920.   0.621 4.50e7
# 3 Peru        2929.       73.7  1.69e7   2601.    73.8  2.61e7  2379.   1.28  1.33e7
# # … with abbreviated variable names ¹​Life_exp_mean, ²​Pop_mean, ³​GDP_median,
# #   ⁴​Life_exp_median, ⁵​Pop_median, ⁶​Life_exp_sd

6.9.1.3 summarise_if()

Aplicar condicionales para seleccionar columnas es muy útil. Esta función permite indicar una condición lógica con funciones de la familia is(), como is.numeric() que haría la petición de seleccionar solo las funciones numéricas y sobre todas ellas aplicar alguna función estadística. La estructura básica es:

BASE_DE_DATOS %>% 
  summarise_if(.predicate = FUNCIÓN_IS_SIN_PARÉNTESIS,
               .funs = lst(LISTA_DE_FUNCIONES))

Ejemplo 6.18 Realizar el promedio y desviación estándar de las columnas numéricas que existan entre las siguientes: GDP, Life_exp, Pop, Status1, Status2; agrupando por país para Colombia, México y Perú (recuerda que la base tiene estos nombres en inglés):

WHO %>% 
  filter(Country %in% c("Colombia","Mexico","Peru")) %>% 
  group_by(Country) %>% 
  dplyr::select(GDP, Life_exp, Pop, Status1, Status2) %>% 
  summarise_if(is.numeric, 
               .funs = lst(mean, sd),  
               na.rm=TRUE)%>% 
  ungroup()