Introducción

La siguiente información fue obtenida de wkipedia el 10 de noviembre de 2025 en la siguiente liga: https://es.wikipedia.org/wiki/Conjunto_de_datos_flor_iris

“El conjunto de datos flor Iris o conjunto de datos iris de Fisher es un conjunto de datos multivariante introducido por Ronald Fisher en su artículo de 1936, The use of multiple measurements in taxonomic problems (El uso de medidas múltiples en problemas taxonómicos) como un ejemplo de análisis discriminante lineal. A veces, se llama Iris conjunto de datos de Anderson porque Edgar Anderson coleccionó los datos para cuantificar la variación morfológica de la flor Iris de tres especies relacionadas. Dos de las tres especies se coleccionaron en la Península de la Gaspesia «todos son de la misma pastura, y recolectado el mismo día y medidos al mismo tiempo por la misma persona con el mismo aparato».

El conjunto de datos contiene 50 muestras de cada una de tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor). Se midió cuatro rasgos de cada muestra: el largo y ancho del sépalo y pétalo, en centímetros. Basado en la combinación de estos cuatro rasgos, Fisher desarrolló un modelo discriminante lineal para distinguir entre una especie y otra. ”

Aspectos metodológicos con R

Empezaremos por definir el directorio de trabajo donde se aloja la base de datos ylas librerias que usaremos para el presente análisis

setwd("D:/Documents/Curso R Octubre 2025")
library ("haven")
library ("dplyr")
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library("ggplot2")
library("tidyr")

Abriremos el archivo que se encuentra en formato CSV y exploramos su estructura.

iris_data<-read.csv("a1_iris.csv",header=TRUE,sep=",")
str(iris_data)
## 'data.frame':    150 obs. of  5 variables:
##  $ sepal.length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ sepal.width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ petal.length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ petal.width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ variety     : chr  "Setosa" "Setosa" "Setosa" "Setosa" ...

De acuerdo a la estructura se trata de un archivo con 150 observaciones y variables. Las primeras cuatro variables son numéricas y se refieren a Longitud del sépalo (sepal.length), Ancho del sépalo (sepal.Width), Longitud del pétalo (petal.length) y Ancho del pétalo (petal.width). La variable variety se refiere a la Especie que tiene tres categorías: Setosa, Versicolor y Virginica. Veamos cuántos casos hay de cada especie.

table(iris_data$variety)
## 
##     Setosa Versicolor  Virginica 
##         50         50         50

Los resultados indican 50 casos en cada categoría.

Estadística Descriptiva

Empezaremos obteniendo las medidas descriptivas de las variables cuantitativas por cada especie, se guarda en el objeto resumen_largo

resumen_largo <- iris_data %>%
  group_by(variety) %>%
  summarise(
    across(
      where(is.numeric),
      list(
        n = ~ sum(!is.na(.)),
        min = ~ min(., na.rm = TRUE),
        Q1 = ~ quantile(., 0.25, na.rm = TRUE),
        mediana = ~ median(., na.rm = TRUE),
        media = ~ mean(., na.rm = TRUE),
        Q3 = ~ quantile(., 0.75, na.rm = TRUE),
        max = ~ max(., na.rm = TRUE),
        sd = ~ sd(., na.rm = TRUE)
      ),
      .names = "{.col}_{.fn}"
    )
  ) %>%
  pivot_longer(
    cols = -variety,
    names_to = c("variable", "estadístico"),
    names_sep = "_",
    values_to = "valor"
  ) %>%
  pivot_wider(
    names_from = estadístico,
    values_from = valor
  ) %>%
  arrange(variety, variable)

print(resumen_largo)
## # A tibble: 12 × 10
##    variety    variable         n   min    Q1 mediana media    Q3   max    sd
##    <chr>      <chr>        <dbl> <dbl> <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 Setosa     petal.length    50   1    1.4     1.5  1.46   1.58   1.9 0.174
##  2 Setosa     petal.width     50   0.1  0.2     0.2  0.246  0.3    0.6 0.105
##  3 Setosa     sepal.length    50   4.3  4.8     5    5.01   5.2    5.8 0.352
##  4 Setosa     sepal.width     50   2.3  3.2     3.4  3.43   3.68   4.4 0.379
##  5 Versicolor petal.length    50   3    4       4.35 4.26   4.6    5.1 0.470
##  6 Versicolor petal.width     50   1    1.2     1.3  1.33   1.5    1.8 0.198
##  7 Versicolor sepal.length    50   4.9  5.6     5.9  5.94   6.3    7   0.516
##  8 Versicolor sepal.width     50   2    2.52    2.8  2.77   3      3.4 0.314
##  9 Virginica  petal.length    50   4.5  5.1     5.55 5.55   5.88   6.9 0.552
## 10 Virginica  petal.width     50   1.4  1.8     2    2.03   2.3    2.5 0.275
## 11 Virginica  sepal.length    50   4.9  6.22    6.5  6.59   6.9    7.9 0.636
## 12 Virginica  sepal.width     50   2.2  2.8     3    2.97   3.18   3.8 0.322

Con el fin de realizar comparaciones entre las especies y para indagar sobre datos atípicos se realizan gráficas de caja.

iris_long <- iris_data %>%
  pivot_longer(cols = where(is.numeric),
               names_to = "variable",
               values_to = "valor")

ggplot(iris_long, aes(x = variety, y = valor, fill = variety)) +
  geom_boxplot(outlier.color = "red", outlier.size = 1.5) +
  facet_wrap(~ variable, scales = "free_y") +
  labs(title = "Boxplots por especie y variable (detección de valores atípicos)",
       x = "Especie", y = "Valor") +
  theme_minimal() +
  theme(legend.position = "none")

Si vemos las gráfica de las variables longitud y el ancho del pétalo, se puede inferir valores más pequeños en la especie Setosa y los valores mayores en Virginica. El sépalo presenta un comportamiento similar en la longitud, sin embargo en el ancho se observa que la especie Setosa tiene los valores mayores y versicolor tiene valores similares a Virginica. Otro aspecto que se nota en las gráficas es que en varias especies se presentan datos atípicos tanto por arriba como por abajo. Construiremos una nueva base de datos donde se sutituyan estos valores atpicos. Para los atípicos por abajo por q1-1.5RI y para los atípicos por arriba por q3+1.5RI (RI=Rango Intercuartil) Se guardan los datos en otro data set llamado iris_wins.

iris_wins <- iris_data %>%
  group_by(variety) %>%
  mutate(across(
    where(is.numeric),
    ~ {
      Q1 <- quantile(., 0.25, na.rm = TRUE)
      Q3 <- quantile(., 0.75, na.rm = TRUE)
      IQR_value <- Q3 - Q1
      lower_limit <- Q1 - 1.5 * IQR_value
      upper_limit <- Q3 + 1.5 * IQR_value
      
      # Sustituye valores fuera de los límites por el valor del límite
      ifelse(. < lower_limit, lower_limit,
             ifelse(. > upper_limit, upper_limit, .))
    }
  )) %>%
  ungroup()

Graficando de nuevo, nos quedaría así:

iris_long <- iris_wins %>%
  pivot_longer(cols = where(is.numeric),
               names_to = "variable",
               values_to = "valor")

ggplot(iris_long, aes(x = variety, y = valor, fill = variety)) +
  geom_boxplot(outlier.color = "red", outlier.size = 1.5) +
  facet_wrap(~ variable, scales = "free_y") +
  labs(title = "Boxplots por especie y variable (sin valores atípicos)",
       x = "Especie", y = "Valor") +
  theme_minimal() +
  theme(legend.position = "none")

Realizaremos ahora una exploración gráfica para explorar la relación entre variables cuantitativas con el objetivo de visualizar posible separación entre las especies de flores

library(GGally)

iris_wins %>%
  GGally::ggpairs(aes(color = variety))
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

A partir de esta matriz de gráficas podemos inferir que existe una correlación fuerte entre la longitud del sépalo con la longitud y anchura del sépalo, siendo la máxima asociación entre la longitud y la anchura del pétalo. Este tipo de correlaciones sugieren ajustes de modelos lineales entre estas variables.