_________________________________________________________________________________________________________________________


1 Instalamos y cargamos los paquetes

# Vamos a instalar un nuevo paquete
install.packages("summarytools")
# Cargamos otros paquetes que usarán en el análisis descriptivo
library(readxl)      
library(tidyverse)   
library(summarytools) 

2 Cargamos las bases de datos

# Precipitación en el Valle Central de Catamarca.
PP_77_22 <- read_excel("PP_77_22.xlsx")

# Mandarinas Criolla y Clementina del Campo Experimental de la FCA.
MANDARINAS <- read_excel("MANDARINAS_2024.xlsx")

# Encuesta a estudiantes del Taller de R.
ALUMNOS_2024 <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vTwVt48G81FHfD_K9jcVmhjN3otTkR0-5Y8mC23oaEOTmhiG4So0kjw6I0b2tkU5ilpehvlhqBjId9i/pub?output=csv", show_col_types = FALSE)

3 Tablas de frecuencias

# Trabajamos con la base de datos "ALUMNOS_2024"
names(ALUMNOS_2024)
## [1] "Marca temporal"       "Genero"               "Edad"                
## [4] "Nivel.dificultad.R"   "Asig.rend.aprob.2024"

3.1 Tablas para variables cualitativas nominales

freq(ALUMNOS_2024$Genero)
## Frequencies  
## ALUMNOS_2024$Genero  
## Type: Character  
## 
##                               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## --------------------------- ------ --------- -------------- --------- --------------
##                    Femenino     11     45.83          45.83     45.83          45.83
##                   Masculino     12     50.00          95.83     50.00          95.83
##       Prefiero no responder      1      4.17         100.00      4.17         100.00
##                        <NA>      0                               0.00         100.00
##                       Total     24    100.00         100.00    100.00         100.00
# modifica el idioma de salida a español en las tablas y medidas obtenidas con "summarytools" 
st_options(lang = "es") 
# Agregamos argumentos a la función freq()
freq(ALUMNOS_2024$Genero, 
       justify =  "center", #Controla la alineación del texto centrada en la tabla.
       report.nas = FALSE, # no se incluiran los valores faltantes (NA) en la tabla.
       headings = FALSE, # no se muestran los encabezados o títulos de la tabla. 
       cumul = FALSE) #indica que no se mostrarán los porcentajes acumulados en la tabla.
## 
##                              Frec.     %    
## --------------------------- ------- --------
##          Femenino             11     45.83  
##          Masculino            12     50.00  
##    Prefiero no responder       1      4.17  
##            Total              24     100.00

3.2 Tablas para variables cualitativas ordinales

# Trabajamos con la base de datos "MANDARINAS"
freq(MANDARINAS$NIVEL_DE_DAÑO)
## Frecuencias  
## MANDARINAS$NIVEL_DE_DAÑO  
## Tipo: Numérico  
## 
##               Frec.   % Válido   % Válido acu.   % Total   % Total acu.
## ----------- ------- ---------- --------------- --------- --------------
##           0      35       8.35            8.35      8.35           8.35
##           1     237      56.56           64.92     56.56          64.92
##           2      96      22.91           87.83     22.91          87.83
##           3      51      12.17          100.00     12.17         100.00
##        <NA>       0                                 0.00         100.00
##       Total     419     100.00          100.00    100.00         100.00
freq(MANDARINAS$NIVEL_DE_DAÑO, 
     report.nas = FALSE, # eliminación de valores faltantes
     justify = "center") # alineación centrada
## Frecuencias  
## MANDARINAS$NIVEL_DE_DAÑO  
## Tipo: Numérico  
## 
##              Frec.     %      % Acu. 
## ----------- ------- -------- --------
##      0        35      8.35     8.35  
##      1        237    56.56    64.92  
##      2        96     22.91    87.83  
##      3        51     12.17    100.00 
##    Total      419    100.00   100.00

3.3 Tablas para variables cuantitativas discretas

# Trabajamos con la base de datos "ALUMNOS_2024"
freq(ALUMNOS_2024$Asig.rend.aprob.2024,
     report.nas = FALSE,
     justify = "center")
## Frecuencias  
## ALUMNOS_2024$Asig.rend.aprob.2024  
## Tipo: Numérico  
## 
##              Frec.     %      % Acu. 
## ----------- ------- -------- --------
##      0         2      8.33     8.33  
##      1         2      8.33    16.67  
##      2         6     25.00    41.67  
##      3         6     25.00    66.67  
##      4         4     16.67    83.33  
##      6         1      4.17    87.50  
##      7         1      4.17    91.67  
##      8         2      8.33    100.00 
##    Total      24     100.00   100.00

3.4 Tablas para variables cuantitativas continuas

# Trabajamos con la base de datos "MANDARINAS"
# Paso 1: Crear intervalos de clase 
TF_PESO_MANDARINAS<- cut(MANDARINAS$PESO, 
                             breaks = seq(min(MANDARINAS$PESO), max(MANDARINAS$PESO), by = 30), # Ajustar el rango de los intervalos
                             right = FALSE, # Definir si el intervalo incluye el límite superior
                             include.lowest = TRUE)

# Paso 2: Crear la tabla de frecuencias con los intervalos de clase
freq(TF_PESO_MANDARINAS, 
     report.nas = FALSE, 
     justify = "center" )
## Frecuencias  
## TF_PESO_MANDARINAS  
## Tipo: Factor  
## 
##                  Frec.     %      % Acu. 
## --------------- ------- -------- --------
##     [37,67)       10      2.40     2.40  
##     [67,97)       37      8.87    11.27  
##    [97,127)       90     21.58    32.85  
##    [127,157)      150    35.97    68.82  
##    [157,187)      87     20.86    89.69  
##    [187,217)      39      9.35    99.04  
##    [217,247]       4      0.96    100.00 
##      Total        417    100.00   100.00

Como lo hicimos…

  • cut() toma una variable numérica (en este caso, MANDARINAS$PESO) y la divide en categorías o intervalos de clase. El resultado se almacena en el objeto TF_PESO_MANDARINAS, que será un vector categórico con los intervalos definidos.

  • breaks define los límites de los intervalos. En este caso, seq() genera una secuencia de valores que comienzan desde el valor mínimo (min(MANDARINAS$PESO)) hasta el valor máximo (max(MANDARINAS$PESO)), con un paso de 30 unidades (by = 30). Esto significa que cada intervalo de clase tendrá una amplitud de 30 unidades.

  • right = FALSE indica que el límite superior no está incluido en el intervalo, mientras que el límite inferior sí lo está. Por ejemplo, si se crea un intervalo [10, 40), incluirá 10 pero no 40.

  • include.lowest = TRUE esta opción asegura que el valor más bajo de MANDARINAS$PESO se incluya en el primer intervalo. Si no se especifica , podría ser excluido si el valor mínimo coincide con un límite.

4 Medidas de resumen

4.1 Paquete R base

# Calcular medidas de resumen
mean(PP_77_22$PP)
## [1] 439.2239
# Otro camino... crear el vector "PRECIPITACION"
PRECIPITACION <- PP_77_22$PP
PRECIPITACION
##  [1] 666.4 553.2 675.7 532.4 528.7 410.9 569.2 484.0 610.2 379.3 449.4 299.9
## [13] 421.0 402.6 430.0 629.4 362.1 340.2 175.3 359.2 288.8 444.6 657.1 547.7
## [25] 463.0 552.2 239.0 338.0 278.9 263.1 301.4 481.0 339.3 248.3 359.0 251.3
## [37] 455.2 554.4 598.3 440.2 511.9 441.6 561.6 401.0 414.9 493.4
# Medidas de resumen

MIN <- min(PRECIPITACION)
Q1 <- quantile(PRECIPITACION, probs = 0.25)
MEDIA <- mean(PRECIPITACION)
MEDIANA <- median(PRECIPITACION)
Q3 <- quantile(PRECIPITACION, probs = 0.75)
MAX <- max(PRECIPITACION)
RANGO <- range(PRECIPITACION)
SD <- sd(PRECIPITACION)
CV <- (SD / MEDIA) * 100  

# Imprimimos los objetos
MIN
## [1] 175.3
Q1
##   25% 
## 344.9
MEDIA
## [1] 439.2239
MEDIANA
## [1] 440.9
Q3
##     75% 
## 543.875
MAX
## [1] 675.7
RANGO
## [1] 175.3 675.7
SD
## [1] 125.9872
CV
## [1] 28.68405
summary(PRECIPITACION)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.3   344.9   440.9   439.2   543.9   675.7

4.2 Paquete tidyverse

Resumen_tidy <- PP_77_22 %>%
  summarise(Media = mean(PP),
    Mediana = median(PP),
    Rango = paste(range(PP), collapse = " - "),
    Std = sd(PP))
Resumen_tidy
## # A tibble: 1 × 4
##   Media Mediana Rango           Std
##   <dbl>   <dbl> <chr>         <dbl>
## 1  439.    441. 175.3 - 675.7  126.
Resumen_mandarinas <- MANDARINAS %>% 
  filter(GRUPO==1 | GRUPO == 3) %>% 
  group_by(VARIEDAD) %>% 
  summarise(MINIMUM = min(PESO),
            MEAN = mean(PESO),
            MEDIAN = median(PESO),
            MAXIMUM = max(PESO))
Resumen_mandarinas
## # A tibble: 2 × 5
##   VARIEDAD   MINIMUM  MEAN MEDIAN MAXIMUM
##   <chr>        <dbl> <dbl>  <dbl>   <dbl>
## 1 Clementina      37  149.    145     231
## 2 Criolla         52  133.    137     203

4.3 Paquete summarytools

# Generar el resumen
descr(PRECIPITACION)
## Estadísticas descriptivas  
## PRECIPITACION  
## N: 46  
## 
##                      PRECIPITACION
## ------------------ ---------------
##              Media          439.22
##           Dev.std.          125.99
##                Min          175.30
##                 Q1          340.20
##            Mediana          440.90
##                 Q3          547.70
##                Max          675.70
##                DAP          149.96
##                 RI          198.98
##                 CV            0.29
##          Asimetría            0.00
##       ES-Asimetría            0.35
##           Curtosis           -0.88
##         Num.Válido           46.00
##         Pct.Válido          100.00
descr(MANDARINAS$PESO, 
      na.rm = TRUE, # elimina los valores faltantes de la tabla
      headings = FALSE) # elimina el encabezado de la tabla
## 
##                        PESO
## ------------------ --------
##              Media   141.72
##           Dev.std.    36.62
##                Min    37.00
##                 Q1   117.00
##            Mediana   143.00
##                 Q3   164.00
##                Max   273.00
##                DAP    34.10
##                 RI    47.00
##                 CV     0.26
##          Asimetría     0.07
##       ES-Asimetría     0.12
##           Curtosis     0.22
##         Num.Válido   419.00
##         Pct.Válido   100.00

4.4 Combinación de paquetes

MANDARINAS %>% 
  group_by(VARIEDAD) %>%
  filter(GRUPO==1) %>% 
  descr(PESO)
## Estadísticas descriptivas  
## PESO por VARIEDAD  
## Data frame: MANDARINAS  
## N: 30  
## 
##                      Clementina   Criolla
## ------------------ ------------ ---------
##              Media       146.47    135.27
##           Dev.std.        34.57     26.95
##                Min        37.00     85.00
##                 Q1       135.00    109.00
##            Mediana       142.00    138.00
##                 Q3       158.00    155.00
##                Max       231.00    182.00
##                DAP        15.57     25.95
##                 RI        21.25     41.00
##                 CV         0.24      0.20
##          Asimetría        -0.26     -0.34
##       ES-Asimetría         0.43      0.43
##           Curtosis         2.36     -0.98
##         Num.Válido        30.00     30.00
##         Pct.Válido       100.00    100.00

4.5 Comparación de paquetes para obtener medidas de resumen

  • R base ofrece simplicidad,
  • tidyverse optimiza el flujo de trabajo en proyectos más complejos,
  • summarytools proporciona rapidamente medidas descriptivas detalladas.

5 Bonus track

5.1 Paquete `gganimate``

El paquete gganimate es una extensión de ggplot2 diseñada para crear visualizaciones animadas en R. Este paquete permite añadir un componente temporal a los gráficos, lo que facilita ilustrar cambios dinámicos en los datos a lo largo del tiempo o de otra variable de interés. Utilizando una sintaxis similar a la de ggplot2, gganimate incorpora “transiciones” y “vistas” para definir cómo los elementos del gráfico evolucionan entre estados. Esto lo hace ideal para presentar tendencias, patrones o procesos de manera intuitiva y atractiva. Entre sus aplicaciones destacan los gráficos de series temporales, simulaciones y estudios de fenómenos dinámicos en áreas como climatología, biología, entre otros.

5.2 Instalamos y cargamos librerías

install.packages("gganimate")
library(ggplot2)
library(gganimate)

5.3 Usaremos la base de datos “PP_77_22”

# Paso 1:reamos el gráfico base con líneas, puntos, y una línea de referencia roja
p <- ggplot(PP_77_22, aes(ANIO, PP)) + # Creamos el objeto p (gráfico base)
  geom_line(color = "blue", linewidth = 1) +  # Línea azul
  geom_point(color = "red", size = 2) +  # Puntos rojos
  geom_hline(yintercept = 439, color = "red", linetype = "dashed", linewidth = 1) +  # Línea de referencia roja con valor promedio de pp
  labs(title = "Evolución de la precipitación en el periodo 1977 - 2022",
       x = "Año",
       y = "Precipitación (mm)") +
  theme_minimal()

# Paso 2: Agregar la animación
anim <- p +    
  transition_reveal(ANIO) # función que permite animar gráficos mostrando progresivamente los datos.

# Paso 3: Mostrar la animación
animate(anim, #función que produce la animación del objeto "anim".
        nframes = 200, # número de fotogramas de la animación. Un mayor número de fotogramas produce una animación más fluida, pero aumentar el tiempo de renderización y el tamaño del archivo.
        fps = 10) # Controla la velocidad de la animación.