Aplicación de Programas Informáticos 2025

Author
Affiliation

Eva Maure

Cátedra de Cálculo Estadístico y Biometría, FCA-UNCUYO

Penguins dataset

El conjunto de datos de palmerpenguins (creado por la Dra. Kristen Gorman, la Dra. Allison Horst y la Dra. Alison Hill) del proyecto #TidyTuesday muestra datos relacionados con las especies de pingüinos (Adelia, Barbijo y Papúa) que viven en el archipiélago de Palmer, en la costa noroeste de la península Antártica.

El dataset se encuentra en el paquete palmerpenguins .

#install.packages("palmerpenguins")
library(palmerpenguins)
library(tidyverse)
library(flextable)
library(plotly)

Análisis exloratorio

Siempre es importante conocer nuestros datos y cómo se estructura la información por lo que adelante se presentan unos ejemplos de funciones básicas para explorar un dataset.

head(penguins) #muestra la primera y ultima parte de un vector, matrix, array, table, data frame or function
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>
str(penguins) #muestra de forma compacta la estructura interna de un objeto de R
tibble [344 × 8] (S3: tbl_df/tbl/data.frame)
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num [1:344] 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
 $ bill_depth_mm    : num [1:344] 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
 $ flipper_length_mm: int [1:344] 181 186 195 NA 193 190 181 195 193 190 ...
 $ body_mass_g      : int [1:344] 3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ...
 $ year             : int [1:344] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...

Limpieza de datos

penguins2 <- drop_na(penguins) # del paquete {tidyr}
str(penguins2)
tibble [333 × 8] (S3: tbl_df/tbl/data.frame)
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num [1:333] 39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
 $ bill_depth_mm    : num [1:333] 18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
 $ flipper_length_mm: int [1:333] 181 186 195 193 190 181 195 182 191 198 ...
 $ body_mass_g      : int [1:333] 3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 1 2 1 2 1 2 2 ...
 $ year             : int [1:333] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
Note¿Qué se modificó en el nuevo conjunto de datos?

Variables Cualitativas

# Frecuencias para la variable especie
summary(penguins$species)
   Adelie Chinstrap    Gentoo 
      152        68       124 

Tabla de frecuencias

tb_frec_sex <- penguins %>%
    count(sex, name = "Frecuencia_Absoluta") %>% # Calcular Frecuencia Absoluta
  mutate(
       Frecuencia_Relativa = Frecuencia_Absoluta / sum(Frecuencia_Absoluta), 
       Porcentaje = Frecuencia_Relativa * 100
  ) %>%
  mutate(
    Frecuencia_Relativa = round(Frecuencia_Relativa, 3),
    Porcentaje = round(Porcentaje, 2)
  )

# Mostrar el resultado
tb_frec_sex 
# A tibble: 3 × 4
  sex    Frecuencia_Absoluta Frecuencia_Relativa Porcentaje
  <fct>                <int>               <dbl>      <dbl>
1 female                 165               0.48        48.0
2 male                   168               0.488       48.8
3 <NA>                    11               0.032        3.2
# mejora la apaciencia de la tablade frecuencias
flextable(tb_frec_sex)

sex

Frecuencia_Absoluta

Frecuencia_Relativa

Porcentaje

female

165

0.480

47.97

male

168

0.488

48.84

11

0.032

3.20

💻 Actividad: crear la tabla de frecuencias para las otras variables cualitativas

Introducción a ggplot2 mediante esquisse

{esquisse} es un paquete de R, disponible en CRAN, para crear gráficos con {ggplot2}, esta aplicación le permite utilizar esquisse directamente en línea, sin tener que instalar el paquete. Antes de crear un gráfico, primero debe importar los datos que se utilizarán para crear un gráfico, o utilizar un conjunto de datos de demostración.

https://dreamrs.shinyapps.io/esquisse/_w_60cbed60/?lang=es

💻 Actividad: crear un gráfico de barras para la variable species

Box-plot múltiple para una variable cuantitativa y una variable cualitativa

penguins %>%
 filter(!is.na(body_mass_g)) %>%
 ggplot() +
  aes(x = "", y = body_mass_g, fill = species) +
  geom_boxplot() +
  scale_fill_hue(direction = 1) +
  labs(
    x = "Especie de pingüino",
    y = "Peso de cuerpo en gramEspecie de pingüinoos",
    title = "Peso de cuerpo de pingüinos según especie"
  ) +
  theme_minimal() +
  theme(legend.position = "top")

penguins %>%
 filter(!is.na(body_mass_g)) %>%
 filter(!is.na(sex)) %>%
 ggplot() +
  aes(x = species, y = body_mass_g, fill = species) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Accent", direction = 1) +
  labs(
    x = "Especie de pingüino",
    y = "Peso de cuerpo en gramos",
    title = "Peso de cuerpo de pingüinos según especie",
    caption = "Especie"
  ) +
  theme_classic() +
  theme(legend.position = "top") +
  facet_wrap(vars(sex))

g2<-ggplot(penguins) +
  aes(x = species, y = body_mass_g, fill = species) +
  geom_boxplot(alpha=0.5) +
  scale_fill_brewer(palette = "Accent", direction = 1) +
  labs(
    x = "Especie de pingüino",
    y = "Peso de cuerpo en gramos",
    title = "Peso de cuerpo de pingüinos según especie",
  ) +
  theme_classic() +
  theme(legend.position = "top")

💻 Actividad: agregar otra geometria al box-plot creado

penguins %>%
 filter(!is.na(body_mass_g)) %>%
 filter(!is.na(sex)) %>%
 ggplot() +
  aes(x = species, y = body_mass_g, fill = species) +
  geom_boxplot() +
  geom_jitter(aes(y = body_mass_g)) +
  scale_fill_brewer(palette = "Accent", direction = 1) +
  labs(
    x = "Especie de pingüino",
    y = "Peso de cuerpo en gramos",
    title = "Peso de cuerpo de pingüinos según especie",
    caption = "Especie"
  ) +
  theme_classic() +
  theme(legend.position = "top") +
  facet_wrap(vars(sex))

💻 Actividad: crear un gráfico de dispersión para dos variables y utilizar {plotly} para hacer el gráfico interactivo.

g2<-ggplot(palmerpenguins::penguins) +
  aes(
    x = body_mass_g,
    y = flipper_length_mm,
    colour = species,
    shape = species
  ) +
  geom_point(size = 1.55) +
  scale_color_hue(direction = 1) +
  labs(x = "Peso de cuerpo (g)", y = "Largo de aleta (mm)") +
  theme_light()

ggplotly(g2)

💻 Actividad: crear gráfico que muestre la distribución de una variable cualitativas

penguins %>%
 filter(!is.na(sex)) %>%
 ggplot() +
  aes(x = body_mass_g, fill = sex, group = sex) +
  geom_histogram(bins = 12L, alpha=0.5, position = "identity") +
  scale_fill_hue(direction = 1) +
  theme_minimal() +
  facet_wrap(vars(species))

# Histogram example: flipper length by species
ggplot(data = penguins, aes(x = flipper_length_mm)) +
  geom_histogram(aes(fill = species), alpha = 0.5, position = "identity") +
  scale_fill_manual(values = c("darkorange","darkorchid","cyan4"))
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_bin()`).

mass_flipper <- ggplot(data = penguins, 
                       aes(x = flipper_length_mm,
                           y = body_mass_g)) +
  geom_point(aes(color = species, 
                 shape = species),
             size = 3,
             alpha = 0.8) +
  scale_color_manual(values = c("darkorange","purple","cyan4")) +
  labs(title = "Penguin size, Palmer Station LTER",
       subtitle = "Flipper length and body mass for Adelie, Chinstrap and Gentoo Penguins",
       x = "Flipper length (mm)",
       y = "Body mass (g)",
       color = "Penguin species",
       shape = "Penguin species") +
  theme(legend.position.inside = c(0.2, 0.7),
        plot.title.position = "plot",
        plot.caption = element_text(hjust = 0, face= "italic"),
        plot.caption.position = "plot")