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. ”
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.
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.