La exploración de las diferencias entre las estructuras de las flores de tres especies del género Iris, y el posterior análisis confirmatorio a través de pruebas de hipótesis (análisis de varianza y contrastes post hoc), pusieron en evidencia que la distribución de las dimensiones de la especie setosa se colocaba, en todos los casos, lejos de las respectivas distribuciones de sus hermanas de género (versicolor y virginica), a través de una brecha importante que permite inferir una clara diferenciación, sobre todo de los pétalos, entre las tres especies.
En efecto, discriminar a los especímenes de I. setosa por el tamaño de sus pétalos constituye una tarea bastante segura, lo cual libera al analista de mayor procedimiento, pues no hay traslape alguno en los valores de estas dimensiones (longitud y anchura), con una brecha ante su pariente más cercana de varios milímetros (entre dos y siete mm, en términos generales).
Sin embargo, también se hizo evidente el traslape de las distribuciones de las otras dos especies (I. versicolor e I. virginica), por lo que la pregunta predictiva se plantea de la manera siguiente: ¿es posible predecir de manera razonable la especie de una planta del género Iris (ya sea I. versicolor o I. virginica) a partir de las dimensiones de sus flores?
library(ggplot2)
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(caret)
## Cargando paquete requerido: lattice
iris_aae <- read.csv("iris_aae.csv", header = TRUE, row.names = "id")
head(iris_aae)
## sepal_length sepal_width petal_length petal_width variety area.sepalo
## 1 5.1 3.5 1.4 0.2 Setosa 17.85
## 2 4.9 3.0 1.4 0.2 Setosa 14.70
## 3 4.7 3.2 1.3 0.2 Setosa 15.04
## 4 4.6 3.1 1.5 0.2 Setosa 14.26
## 5 5.0 3.6 1.4 0.2 Setosa 18.00
## 6 5.4 3.9 1.7 0.4 Setosa 21.06
## area.petalo
## 1 0.28
## 2 0.28
## 3 0.26
## 4 0.30
## 5 0.28
## 6 0.68
iris_aae <- iris_aae %>%
mutate(setosa_vs_not = ifelse(variety == "Setosa", 1, 0))
head(iris_aae)
## sepal_length sepal_width petal_length petal_width variety area.sepalo
## 1 5.1 3.5 1.4 0.2 Setosa 17.85
## 2 4.9 3.0 1.4 0.2 Setosa 14.70
## 3 4.7 3.2 1.3 0.2 Setosa 15.04
## 4 4.6 3.1 1.5 0.2 Setosa 14.26
## 5 5.0 3.6 1.4 0.2 Setosa 18.00
## 6 5.4 3.9 1.7 0.4 Setosa 21.06
## area.petalo setosa_vs_not
## 1 0.28 1
## 2 0.28 1
## 3 0.26 1
## 4 0.30 1
## 5 0.28 1
## 6 0.68 1
tail(iris_aae)
## sepal_length sepal_width petal_length petal_width variety area.sepalo
## 145 6.7 3.3 5.7 2.5 Virginica 22.11
## 146 6.7 3.0 5.2 2.3 Virginica 20.10
## 147 6.3 2.5 5.0 1.9 Virginica 15.75
## 148 6.5 3.0 5.2 2.0 Virginica 19.50
## 149 6.2 3.4 5.4 2.3 Virginica 21.08
## 150 5.9 3.0 5.1 1.8 Virginica 17.70
## area.petalo setosa_vs_not
## 145 14.25 0
## 146 11.96 0
## 147 9.50 0
## 148 10.40 0
## 149 12.42 0
## 150 9.18 0
modelo_log_setosaVsNot.Todas <- glm(setosa_vs_not ~ petal_length + petal_width +
sepal_length + sepal_width,
data = iris_aae, family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_setosaVsNot.Todas)
##
## Call:
## glm(formula = setosa_vs_not ~ petal_length + petal_width + sepal_length +
## sepal_width, family = binomial, data = iris_aae)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -16.946 457457.096 0 1
## petal_length -20.088 107724.592 0 1
## petal_width -21.608 154350.613 0 1
## sepal_length 11.759 130504.039 0 1
## sepal_width 7.842 59415.383 0 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1.9095e+02 on 149 degrees of freedom
## Residual deviance: 3.2940e-09 on 145 degrees of freedom
## AIC: 10
##
## Number of Fisher Scoring iterations: 25
modelo_log_setosaVsNot.SoloDiferentes <- glm(setosa_vs_not ~ petal_length +
petal_width, data = iris_aae,
family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_setosaVsNot.SoloDiferentes)
##
## Call:
## glm(formula = setosa_vs_not ~ petal_length + petal_width, family = binomial,
## data = iris_aae)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 69.45 43042.94 0.002 0.999
## petal_length -17.60 43449.07 0.000 1.000
## petal_width -33.89 115850.84 0.000 1.000
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1.9095e+02 on 149 degrees of freedom
## Residual deviance: 5.1700e-09 on 147 degrees of freedom
## AIC: 6
##
## Number of Fisher Scoring iterations: 25
Comentario: en ambos modelos, tanto con las cuatro variables disponibles como con las seleccionadas por su poder de discriminación, se lanza una advertencia de que las probabilidades de acertar son perfectas. En realidad, el procedimiento no hace más que la exploración previa: constatar que la distribución de I. setosa no se traslapa con las de sus parientes de género, y que, inclusive, hay una brecha que permite al taxónomo separar con las solas medidas del pétalo a los ejemplares.
Optaremos ahora por trabajar con la especie de mayor tamaño (I. virginica), cuyas distribuciones se traslapan, en efecto, con las de I. versicolor. Sin embargo, conservaremos en el esquema analítico los datos de la especie pequeña I. setosa, con fines de control y de apreciación del efecto de su presencia comparativa.
iris_aae <- iris_aae %>%
mutate(virgi_vs_not = ifelse(variety == "Virginica", 1, 0))
head(iris_aae)
## sepal_length sepal_width petal_length petal_width variety area.sepalo
## 1 5.1 3.5 1.4 0.2 Setosa 17.85
## 2 4.9 3.0 1.4 0.2 Setosa 14.70
## 3 4.7 3.2 1.3 0.2 Setosa 15.04
## 4 4.6 3.1 1.5 0.2 Setosa 14.26
## 5 5.0 3.6 1.4 0.2 Setosa 18.00
## 6 5.4 3.9 1.7 0.4 Setosa 21.06
## area.petalo setosa_vs_not virgi_vs_not
## 1 0.28 1 0
## 2 0.28 1 0
## 3 0.26 1 0
## 4 0.30 1 0
## 5 0.28 1 0
## 6 0.68 1 0
tail(iris_aae)
## sepal_length sepal_width petal_length petal_width variety area.sepalo
## 145 6.7 3.3 5.7 2.5 Virginica 22.11
## 146 6.7 3.0 5.2 2.3 Virginica 20.10
## 147 6.3 2.5 5.0 1.9 Virginica 15.75
## 148 6.5 3.0 5.2 2.0 Virginica 19.50
## 149 6.2 3.4 5.4 2.3 Virginica 21.08
## 150 5.9 3.0 5.1 1.8 Virginica 17.70
## area.petalo setosa_vs_not virgi_vs_not
## 145 14.25 0 1
## 146 11.96 0 1
## 147 9.50 0 1
## 148 10.40 0 1
## 149 12.42 0 1
## 150 9.18 0 1
modelo_log_virgiVsNot.Todas <- glm(virgi_vs_not ~ petal_length + petal_width +
sepal_length + sepal_width,
data = iris_aae, family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_virgiVsNot.Todas) # resumen del modelo
##
## Call:
## glm(formula = virgi_vs_not ~ petal_length + petal_width + sepal_length +
## sepal_width, family = binomial, data = iris_aae)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -42.638 25.708 -1.659 0.0972 .
## petal_length 9.429 4.737 1.990 0.0465 *
## petal_width 18.286 9.743 1.877 0.0605 .
## sepal_length -2.465 2.394 -1.030 0.3032
## sepal_width -6.681 4.480 -1.491 0.1359
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 190.954 on 149 degrees of freedom
## Residual deviance: 11.899 on 145 degrees of freedom
## AIC: 21.899
##
## Number of Fisher Scoring iterations: 12
Comentario: Como se constata en el modelo resumido, los coeficientes asociados con las dimensiones de los sépalos no son diferentes de cero, pero sí lo de las dimensiones de los pétalos, por lo que procedemos a modelar con base en las solas variables del pétalo.
modelo_log_virgiVsNot.SoloDiferentes <- glm(virgi_vs_not ~ petal_length + petal_width,
data = iris_aae, family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary.glm(modelo_log_virgiVsNot.SoloDiferentes) # resumen del modelo
##
## Call:
## glm(formula = virgi_vs_not ~ petal_length + petal_width, family = binomial,
## data = iris_aae)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -45.272 13.611 -3.326 0.000881 ***
## petal_length 5.755 2.306 2.496 0.012575 *
## petal_width 10.447 3.756 2.782 0.005409 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 190.954 on 149 degrees of freedom
## Residual deviance: 20.564 on 147 degrees of freedom
## AIC: 26.564
##
## Number of Fisher Scoring iterations: 10
Comentario: en ausencia de las variables con coeficientes de cero, las variables restantes, las del pétalo, separan con claridad a los ejemplares de la I. virginica; inclusive, con cierta sorpresa se tiene que la anchura del pétalo lo hace con mayor fuerza que la longitud.
predicciones <- ifelse(predict(modelo_log_virgiVsNot.SoloDiferentes,
type = "response") > 0.5, 1, 0)
library(caret)
confusionMatrix(as.factor(predicciones), as.factor(iris_aae$virgi_vs_not))
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 97 3
## 1 3 47
##
## Accuracy : 0.96
## 95% CI : (0.915, 0.9852)
## No Information Rate : 0.6667
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.91
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9700
## Specificity : 0.9400
## Pos Pred Value : 0.9700
## Neg Pred Value : 0.9400
## Prevalence : 0.6667
## Detection Rate : 0.6467
## Detection Prevalence : 0.6667
## Balanced Accuracy : 0.9550
##
## 'Positive' Class : 0
##
ggplot(iris_aae, aes(x = sepal_length, y = sepal_width,
color = variety, shape = variety)) +
geom_point() +
scale_color_manual(values = c("orange", "limegreen", "darkred")) +
labs(title = "Tamaño del sépalo en el género Iris",
x = "Longitud del sépalo (cm)", y = "Anchura del sépalo (cm)") +
theme(legend.position = c(.65, .85))
ggplot(iris_aae, aes(x = petal_length, y = petal_width, color = variety,
shape = variety)) +
geom_point() +
scale_color_manual(values = c("orange", "limegreen", "darkred")) +
labs(title = "Tamaño del pétalo en el género Iris",
x = "Longitud del pétalo (cm)", y = "Anchura del pétalo (cm)") +
theme(legend.position = c(.9, .2))
ggplot(iris_aae, aes(x = petal_length, fill = variety)) +
geom_density(alpha = 0.3) +
labs(title = "Pétalos del género Iris", subtitle = "Longitud del pétalo (cm)",
y = "Densidad", x = "") +
theme(legend.position = c(.9, .8)) # longitud pétalo
ggplot(iris_aae, aes(x = petal_width, fill = variety)) +
geom_density(alpha = 0.3) +
labs(title = "Pétalos del género Iris", subtitle = "Anchura del pétalo (cm)",
y = "Densidad", x = "") +
theme(legend.position = c(.9, .8)) # anchura pétalo
ggplot(iris_aae, aes(x = sepal_length, fill = variety)) +
geom_density(alpha = 0.3) +
labs(title = "Sépalos del género Iris", subtitle = "Longitud del sépalo (cm)",
y = "Densidad", x = "") +
theme(legend.position = c(.9, .8)) # longitud del sépalo
ggplot(iris_aae, aes(x = sepal_width, fill = variety)) +
geom_density(alpha = 0.3) +
labs(title = "Sépalos del género Iris", subtitle = "Anchura del sépalo (cm)",
y = "Densidad", x = "") +
theme(legend.position = c(.9, .8)) # anchura del sépalo
\(I. virginica = -45.27 + 5.75(LongPetalo) + 10.4(AnchPetalo)\)
Como ambos coeficientes relacionados con las variables son positivos, tanto la longitud como la anchura aumentan las probabilidades de que la planta pertenezca a la especie I. virginica cuando sus valores son muy altos.
Ambos coeficientes son significativos a más de 95 %. Sin embargo, la anchura del pétalo es más del doble de potente que la longitud del pétalo para separar a la especie I. virginica de las otras.
La sensibilidad del modelo es de 97 % – sólo aparecen tres plantas de 100 predichas como virginica pero que, en realidad, no lo son.
La especificidad alcanza 94 % – sólo tres plantas que, siendo efectivamente virginica, no las reconoce como tales.
La exactitud se eleva a 0.96 – sólo seis de 150 casos se clasificaron erróneamente (intervalo de confianza a 95 %: 0.915, 0.985)
Basado en las dimensiones de los pétalos, el modelo predice la probabilidad de que un planta provenga de la especie Iris virginica. Las medidas de los sépalos aportan poca información para hacer esta distinción.
Atendiendo a las probabilidades asociadas con la distribución de cada variable, y asociándolas con las de dos o más variables, se establece una regla de predicción probabilística.
Limitaciones: cuando las distribuciones de las variables no están superpuestas, el modelo logit no hace nada en realidad, por lo que se hace necesario realizar un análisis exploratorio exhaustivo que permita al analista vislumbrar las variables pertinentes para la clasificación.
Fortalezas: si las variables se eligen bien, con bases teóricas sólidas y un muestreo cuidadoso, el modelo de predicción logit puede proporcionar poderosas predicciones de una variable dicotómica basada en los valores de uno o varias variables cuantitativas o cualitativas.
Anderson, Edgar (1935). The irises of the Gaspe Peninsula, Bulletin of the American Iris Society, 59, 2-5.
Fisher, Ronald A. (1936). The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7, Part II, 179-188. doi:10.1111/j.1469-1809.1936.tb02137.x
citation("dplyr")
## To cite package 'dplyr' in publications use:
##
## Wickham H, François R, Henry L, Müller K, Vaughan D (2023). _dplyr: A
## Grammar of Data Manipulation_. doi:10.32614/CRAN.package.dplyr
## <https://doi.org/10.32614/CRAN.package.dplyr>, R package version
## 1.1.4, <https://CRAN.R-project.org/package=dplyr>.
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {dplyr: A Grammar of Data Manipulation},
## author = {Hadley Wickham and Romain François and Lionel Henry and Kirill Müller and Davis Vaughan},
## year = {2023},
## note = {R package version 1.1.4},
## url = {https://CRAN.R-project.org/package=dplyr},
## doi = {10.32614/CRAN.package.dplyr},
## }
citation("ggplot2")
## To cite ggplot2 in publications, please use
##
## H. Wickham. ggplot2: Elegant Graphics for Data Analysis.
## Springer-Verlag New York, 2016.
##
## A BibTeX entry for LaTeX users is
##
## @Book{,
## author = {Hadley Wickham},
## title = {ggplot2: Elegant Graphics for Data Analysis},
## publisher = {Springer-Verlag New York},
## year = {2016},
## isbn = {978-3-319-24277-4},
## url = {https://ggplot2.tidyverse.org},
## }
citation("caret")
## To cite caret in publications use:
##
## Kuhn, M. (2008). Building Predictive Models in R Using the caret
## Package. Journal of Statistical Software, 28(5), 1–26.
## https://doi.org/10.18637/jss.v028.i05
##
## A BibTeX entry for LaTeX users is
##
## @Article{,
## title = {Building Predictive Models in R Using the caret Package},
## volume = {28},
## url = {https://www.jstatsoft.org/index.php/jss/article/view/v028i05},
## doi = {10.18637/jss.v028.i05},
## number = {5},
## journal = {Journal of Statistical Software},
## author = {{Kuhn} and {Max}},
## year = {2008},
## pages = {1–26},
## }