#install.packages("palmerpenguins")
library(palmerpenguins)
library(tidyverse)
library(flextable)
library(plotly)Aplicación de Programas Informáticos 2025
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 .
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 Rtibble [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 ...
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")