Análisis exploratorio de datos

B0305 – Lab Eco Gral
https://ucr-ecologia.github.io/B0305-lab-eco-gral/

Prof. G. Avalos y T. Nakov

Escuela de Biologia, Universidad de Costa Rica

01 Aug 2025

¿Qué es el análisis exploratorio de datos?

Análisis exploratorio de datos

Análisis exploratorio de datos

Explora los datos de manera sistemática

  • Genera preguntas sobre tus datos.
  • Busca respuestas visualizando, transformando y modelando tus datos.
  • Usa lo que aprendes para refinar tus preguntas y/o generar nuevas preguntas.
 Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund. R for Data Science, 2ed. 

Análisis exploratorio de datos

  • El objetivo es desarrollar una comprensión de los datos
  • Lo hacemos haciendo preguntas (¿Cómo cambia la tasa de crecimiento con la temperatura?)
  • Cuantas más preguntas hagamos, más ideas obtendremos y será más probable encontrar respuestas significativas
  • No hay reglas sobre las preguntas que podemos hacer, pero buenos puntos de partida son:
    • ¿Cuál es la variación dentro de mis variables?
    • ¿Cuál es la covariación entre mis variables?

Resumen de los datos

  • ‘Panorama general’ del conjunto de datos:
    • ¿Cuántas variables?
    • Tipos de variables (números, categorías, fechas, …)?
    • Rangos, medias, conteos de categorías, …?
    • ¿Cuántos datos faltantes?
dim(penguins)
[1] 344   8
ncol(penguins)
[1] 8
nrow(penguins)
[1] 344
summary(penguins)
      species          island       bill_len        bill_dep    
 Adelie   :152   Biscoe   :168   Min.   :32.10   Min.   :13.10  
 Chinstrap: 68   Dream    :124   1st Qu.:39.23   1st Qu.:15.60  
 Gentoo   :124   Torgersen: 52   Median :44.45   Median :17.30  
                                 Mean   :43.92   Mean   :17.15  
                                 3rd Qu.:48.50   3rd Qu.:18.70  
                                 Max.   :59.60   Max.   :21.50  
                                 NA's   :2       NA's   :2      
  flipper_len      body_mass        sex           year     
 Min.   :172.0   Min.   :2700   female:165   Min.   :2007  
 1st Qu.:190.0   1st Qu.:3550   male  :168   1st Qu.:2007  
 Median :197.0   Median :4050   NA's  : 11   Median :2008  
 Mean   :200.9   Mean   :4202                Mean   :2008  
 3rd Qu.:213.0   3rd Qu.:4750                3rd Qu.:2009  
 Max.   :231.0   Max.   :6300                Max.   :2009  
 NA's   :2       NA's   :2                                 

Distribuciones (Variación)

Preparación

Configuración del entorno: Ya configuramos nuestro entorno en la clase anterior.

# Si aún no has configurado el entorno:
renv::restore()  # Instala todos los paquetes necesarios

Cargar los paquetes necesarios:

library(ggplot2)
library(dplyr)
# Establecer tema global para todos los gráficos
theme_set(theme_bw())

Variables categóricas (discretas)

# library(ggplot2)
ggplot(penguins) +
    aes(x=species) +
    geom_bar(fill="steelblue")

# library(ggplot2)
ggplot(penguins) +
    aes(x=species, fill = species) +
    geom_bar()

Variables categóricas (discretas)

# library(dplyr)
penguins |> 
    group_by(species) |> 
    tally()
# A tibble: 3 × 2
  species       n
  <fct>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124
# library(dplyr)
penguins |> 
    group_by(island) |> 
    tally()
# A tibble: 3 × 2
  island        n
  <fct>     <int>
1 Biscoe      168
2 Dream       124
3 Torgersen    52

Variables numéricas (continuas)

# library(ggplot2)
ggplot(penguins) +
    aes(x = bill_len) +
    geom_histogram(
        fill = "steelblue", 
        color= "white"
    )

# library(ggplot2)
ggplot(penguins) +
    aes(y = bill_len) +
    geom_boxplot(
        fill = "steelblue"
        )

Sidenote on boxplots

Variables numéricas (continuas) - Datos de histograma

min_bill <- min(penguins$bill_len, na.rm=TRUE)
max_bill <- max(penguins$bill_len, na.rm=TRUE)
bin_breaks <- seq(min_bill, max_bill, by=2)
bill_len_bin <- cut(penguins$bill_len, breaks = bin_breaks)
table(bill_len_bin)
bill_len_bin
(32.1,34.1] (34.1,36.1] (36.1,38.1] (38.1,40.1] (40.1,42.1] (42.1,44.1] 
          4          21          40          35          39          30 
(44.1,46.1] (46.1,48.1] (48.1,50.1] (50.1,52.1] (52.1,54.1] (54.1,56.1] 
         39          41          42          36           7           5 
(56.1,58.1] 
          1 

Variables numéricas (continuas) - Datos de boxplot

summary(penguins$bill_len)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  32.10   39.23   44.45   43.92   48.50   59.60       2 

Relaciones (Covariación)

Categórica + Categórica

penguins |> 
    ggplot(aes(x = island)) +
    geom_bar(aes(fill = species))

penguins |> 
    ggplot(aes(x = island)) +
    geom_bar(
        aes(fill = species), 
        position = "dodge"
    )

Categórica + Categórica

penguins |> 
    group_by(species, island) |> 
    tally()
# A tibble: 5 × 3
# Groups:   species [3]
  species   island        n
  <fct>     <fct>     <int>
1 Adelie    Biscoe       44
2 Adelie    Dream        56
3 Adelie    Torgersen    52
4 Chinstrap Dream        68
5 Gentoo    Biscoe      124
penguins |> 
    group_by(species, island, sex) |> 
    tally()
# A tibble: 13 × 4
# Groups:   species, island [5]
   species   island    sex        n
   <fct>     <fct>     <fct>  <int>
 1 Adelie    Biscoe    female    22
 2 Adelie    Biscoe    male      22
 3 Adelie    Dream     female    27
 4 Adelie    Dream     male      28
 5 Adelie    Dream     <NA>       1
 6 Adelie    Torgersen female    24
 7 Adelie    Torgersen male      23
 8 Adelie    Torgersen <NA>       5
 9 Chinstrap Dream     female    34
10 Chinstrap Dream     male      34
11 Gentoo    Biscoe    female    58
12 Gentoo    Biscoe    male      61
13 Gentoo    Biscoe    <NA>       5

Categórica + Numérica - histogramas

penguins |> 
    ggplot(aes(x = bill_len)) +
    geom_histogram(
        aes(fill = sex), 
        color = "white"
    )

penguins |> 
    ggplot(aes(x = bill_len)) +
    geom_histogram(
        aes(fill = sex), 
        color = "white",
        position = "dodge"
    )

Categórica + Numérica - boxplots

penguins |> 
    ggplot(aes(x = species, y = bill_len)) +
    geom_boxplot(aes(fill = species))

penguins |> 
    ggplot(aes(x = species, y = bill_len)) +
    geom_boxplot(aes(fill = island)) +
    scale_fill_viridis_d()

Categórica + Numérica - heatmaps

penguins |> 
    group_by(island, species) |> 
    summarise(mean_bill_len = mean(bill_len, na.rm = TRUE)) |> 
    ggplot() +
    aes(x = island, y = species, fill = mean_bill_len) +
    geom_tile(color = "white") +
    geom_text(aes(label = round(mean_bill_len, 2)), color = "white")

Categórica + Numérica - datos

penguins |> 
    group_by(year) |> 
    summarise(
        mean_bill_len = 
            mean(bill_len, na.rm = TRUE),
        mean_body_mass = 
            mean(body_mass, na.rm = TRUE),
        )
# A tibble: 3 × 3
   year mean_bill_len mean_body_mass
  <int>         <dbl>          <dbl>
1  2007          43.7          4125.
2  2008          43.5          4267.
3  2009          44.5          4210.
penguins |> 
    filter(
        island == "Dream", 
        species == "Adelie", 
        sex == "male",
        body_mass >= 4500) |> 
    select(island, species, sex, body_mass)
  island species  sex body_mass
1  Dream  Adelie male      4650
2  Dream  Adelie male      4600

Numérica + Numérica - scatterplots

ggplot(penguins) +
    aes(
        x = body_mass, 
        y = flipper_len
    ) +
    geom_point(
        alpha = 0.4,
        aes(size = body_mass)
    )

ggplot(penguins) +
    aes(
        x = body_mass, 
        y = flipper_len
    ) +
    geom_point(
        size = 5, alpha = 0.4,
        aes(
            color = species, 
            shape = sex
        )
    )

Numérica + Numérica - scatterplots con regression

ggplot(penguins) +
    aes(x = body_mass, y = flipper_len) +
    geom_point(
        size = 5, alpha = 0.4,
        aes(color = species, shape = sex)
    ) +
    geom_smooth(method = "lm")

Numérica + Numérica - scatterplots con regression

ggplot(penguins) +
    aes(x = body_mass, y = flipper_len) +
    geom_point(size = 5, alpha = 0.4, aes(color = island, shape = sex)) +
    geom_smooth(method = "lm") +
    facet_wrap(vars(species), ncol = 3)

Ejercicios

Usando el conjunto de datos incorporado iris:

  • Grafica el número de observaciones por especies usando geom_bar
  • Calcula la media de Sepal.Length por Species usando group_by y summarise
  • Grafica una regresión entre Sepal.Length y Petal.Length para la especie setosa. (Filtra primero para la especie setosa, luego grafica)

Bibliografia

Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund. R for Data Science, 2ed. https://r4ds.hadley.nz/

Especificamente:

Capitulo 1: https://r4ds.hadley.nz/data-visualize.html

Capitulo 10: https://r4ds.hadley.nz/EDA.html