El conjunto de datos iris, es una base de datos clásica y ampliamente utilizada en el campo del análisis estadístico multivariado. Esta base fue introducida por el estad´ıstico y bi´ologo Ronald A. Fisher en 1936, y contiene informaci´on morfol´ogica de flores de tres especies del g´enero Iris: setosa, versicolor y virginica. El conjunto de datos consta de 150 observaciones, donde cada observación representa una flor individual. Las flores han sido medidas con respecto a cuatro variables numéricas que describen dimensiones de sus partes morfológicas (sépalos y pétalos), y una variable categórica que indica la especie a la que pertenece la flor. Las variables incluidas son:
a) Calcular el vector de medias de las variables numéricas. ¿Qué nos indican estas medias?
#Paquetes ---------------------------------------------------
#install.packages("pacman")
library(pacman)
## Warning: package 'pacman' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## 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
p_load("datasets","DT", "fdth")
#load data--------------------------------------------------
data("iris")
data_num = iris[,-ncol(iris)]
X_bar = colMeans(data_num)
X_bar
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.843333 3.057333 3.758000 1.199333
El vector de medias nos muestra que la media de la longitud del sépalo es de 5.844cm, la media del ancho del sépalo es de 3.058cm, la media de la longitud del pétalo es de 3.758cm y la media del ancho del pétalo es de 1.1993cm.
b) Calcular la matriz de varianzas y covarianzas del conjunto de datos. ¿Qué pares de variables presentan mayor covarianza? ¿Qué nos dice esto sobre la relaci´on lineal entre ellas?
S = cov(data_num)
S
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 0.6856935 -0.0424340 1.2743154 0.5162707
## Sepal.Width -0.0424340 0.1899794 -0.3296564 -0.1216394
## Petal.Length 1.2743154 -0.3296564 3.1162779 1.2956094
## Petal.Width 0.5162707 -0.1216394 1.2956094 0.5810063
Tenemos una covarianza alta entre las variables ancho del pétalo y la longitud del pétalo con 1.29 lo que indica una relación lineal directa, alta y positiva, también entre longitud del sépalo y longitud del pétalo con 1.274 lo que indica una relación lineal directa, alta y positiva. Entre las otras variables las relaciones no son tan significativas.
c) Calcular la matriz de correlaciones entre las variables. ¿Hay variables altamente correlacionadas positiva o negativamente?
R = cor(data_num)
R
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
## Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
## Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
## Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
La primera correlación que llama la atención es entre las variables longitud de pétalo y ancho de pétalo, con una correlación alta y positiva de 0.96, también hay una alta correlación positiva entre las variables longitud de pétalo y longitud de sépalo con 0.87, para las variables ancho de petalo y longitud de sépalo hay una correlación alta positiva de 0.817. Hay otros pares de variables que muestran una correlación negativa, sin embargo,no tienen una fuerte correlación, por ejemplo, las variables longitud de pétalo y ancho de sépalo tienen una correlación de -0.428 lo que indica una poca correlación.
d) Calcular la distancia de Mahalanobis de cada observación al centroide (vector de medias) del conjunto de datos? ¿Qué observación está más alejada del centroide? ¿Cuál está más cercana? ¿Qué puede indicar esta distancia sobre las caracter´ısticas morfológicas de esa flor? Nota: Consulte una función en R que permita encontrar el valor máximo y mínimo de un vector.
#PUNTO D - Distancia de Mahalanobis
# Paquetes
library(pacman)
p_load("datasets","DT", "fdth")
# Datos
data("iris")
dim(iris)
## [1] 150 5
datatable(iris)
# Usar solo variables numéricas
datos_iris <- iris[ , 1:4]
# Calcular vector de medias
vector_medias = colMeans(datos_iris)
vector_medias
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.843333 3.057333 3.758000 1.199333
# Matriz de varianzas y covarianzas
S = cov(datos_iris)
S
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 0.6856935 -0.0424340 1.2743154 0.5162707
## Sepal.Width -0.0424340 0.1899794 -0.3296564 -0.1216394
## Petal.Length 1.2743154 -0.3296564 3.1162779 1.2956094
## Petal.Width 0.5162707 -0.1216394 1.2956094 0.5810063
# Centroide
center = vector_medias
# Matriz de covarianza
S = cov(datos_iris)
# Distancias al centroide
D2 <- mahalanobis(
x = datos_iris,
center = center,
cov = S
)
D <- sqrt(D2)
# Tabla con resultados
tabla_resultados <- data.frame(
Observacion = 1:nrow(datos_iris),
D2_Mahalanobis = D2,
D_Mahalanobis = D
)
MaxD = max(D)
MinD = min(D)
MinD
## [1] 0.5652194
MaxD
## [1] 3.619543
# Observación más lejana y más cercana
obs_max <- which.max(D)
obs_min <- which.min(D)
list(
tabla = tabla_resultados,
obs_mas_lejana = obs_max,
obs_mas_cercana = obs_min
)
## $tabla
## Observacion D2_Mahalanobis D_Mahalanobis
## 1 1 2.1344679 1.4609818
## 2 2 2.8491187 1.6879333
## 3 3 2.0813387 1.4426845
## 4 4 2.4523816 1.5660082
## 5 5 2.4621545 1.5691254
## 6 6 3.8834177 1.9706389
## 7 7 2.8621081 1.6917766
## 8 8 1.8333003 1.3539942
## 9 9 3.3840731 1.8395850
## 10 10 2.3752179 1.5411742
## 11 11 3.2831069 1.8119346
## 12 12 2.7747975 1.6657723
## 13 13 2.6132975 1.6165697
## 14 14 3.6034324 1.8982709
## 15 15 8.7375184 2.9559294
## 16 16 9.7127899 3.1165349
## 17 17 5.7605877 2.4001224
## 18 18 2.3213894 1.5236107
## 19 19 4.4996899 2.1212473
## 20 20 3.4388658 1.8544179
## 21 21 2.6360071 1.6235785
## 22 22 2.9292496 1.7115051
## 23 23 3.6134114 1.9008975
## 24 24 2.2371731 1.4957182
## 25 25 5.3023607 2.3026855
## 26 26 2.4453103 1.5637488
## 27 27 1.7658286 1.3288448
## 28 28 2.1971806 1.4822890
## 29 29 2.5027712 1.5820149
## 30 30 2.4643980 1.5698401
## 31 31 1.9849638 1.4088874
## 32 32 4.5911380 2.1426941
## 33 33 8.3583413 2.8910796
## 34 34 7.2213139 2.6872503
## 35 35 1.9820679 1.4078593
## 36 36 3.4173031 1.8485949
## 37 37 5.3372175 2.3102419
## 38 38 3.4513350 1.8577769
## 39 39 3.1549793 1.7762261
## 40 40 1.8926197 1.3757251
## 41 41 2.5485013 1.5964026
## 42 42 11.4240288 3.3799451
## 43 43 3.3144697 1.8205685
## 44 44 3.7085855 1.9257688
## 45 45 4.4840560 2.1175590
## 46 46 2.9786602 1.7258795
## 47 47 4.4333077 2.1055421
## 48 48 2.3594309 1.5360439
## 49 49 3.0076970 1.7342713
## 50 50 1.9285641 1.3887275
## 51 51 4.4528311 2.1101732
## 52 52 0.6273996 0.7920856
## 53 53 3.0186280 1.7374199
## 54 54 3.6125278 1.9006651
## 55 55 2.0404590 1.4284464
## 56 56 3.3195858 1.8219731
## 57 57 1.2763441 1.1297540
## 58 58 4.3093305 2.0758927
## 59 59 2.7426578 1.6560972
## 60 60 3.1665229 1.7794727
## 61 61 7.6832930 2.7718754
## 62 62 0.4323176 0.6575086
## 63 63 7.5614023 2.7498004
## 64 64 1.5482870 1.2443018
## 65 65 1.0372548 1.0184571
## 66 66 2.7865631 1.6693002
## 67 67 3.4732716 1.8636715
## 68 68 3.3289796 1.8245492
## 69 69 7.3923779 2.7188928
## 70 70 2.1837666 1.4777573
## 71 71 3.2615033 1.8059633
## 72 72 1.3601100 1.1662376
## 73 73 2.3885294 1.5454868
## 74 74 4.5073307 2.1230475
## 75 75 1.6095193 1.2686683
## 76 76 2.3362612 1.5284833
## 77 77 4.1982905 2.0489730
## 78 78 1.4219664 1.1924623
## 79 79 0.3194730 0.5652194
## 80 80 2.1112223 1.4530046
## 81 81 2.8147732 1.6777286
## 82 82 3.1338323 1.7702633
## 83 83 0.8579871 0.9262759
## 84 84 2.5178289 1.5867668
## 85 85 6.2164814 2.4932873
## 86 86 2.7910313 1.6706380
## 87 87 1.7971852 1.3405914
## 88 88 6.5544318 2.5601625
## 89 89 1.6677135 1.2913998
## 90 90 2.0056841 1.4162218
## 91 91 4.9630348 2.2277870
## 92 92 1.1821941 1.0872875
## 93 93 1.3713881 1.1710628
## 94 94 4.5698858 2.1377291
## 95 95 1.4932609 1.2219905
## 96 96 2.6869276 1.6391851
## 97 97 1.1870542 1.0895202
## 98 98 0.6575354 0.8108856
## 99 99 4.8207427 2.1956190
## 100 100 0.6341019 0.7963052
## 101 101 8.9395988 2.9899162
## 102 102 2.9682833 1.7228707
## 103 103 2.4451456 1.5636961
## 104 104 3.5551146 1.8855012
## 105 105 2.3541837 1.5343349
## 106 106 6.0617111 2.4620543
## 107 107 10.1378044 3.1839919
## 108 108 7.5880086 2.7546340
## 109 109 3.3301655 1.8248741
## 110 110 7.3453376 2.7102283
## 111 111 2.2611037 1.5036967
## 112 112 1.2342978 1.1109896
## 113 113 2.4316524 1.5593757
## 114 114 4.7588845 2.1814868
## 115 115 11.4105735 3.3779540
## 116 116 5.8815414 2.4251889
## 117 117 1.9743869 1.4051288
## 118 118 12.8130732 3.5795353
## 119 119 7.1768159 2.6789580
## 120 120 4.3974981 2.0970212
## 121 121 4.0399248 2.0099564
## 122 122 5.3595987 2.3150807
## 123 123 8.7973122 2.9660263
## 124 124 1.7967966 1.3404464
## 125 125 2.8868280 1.6990668
## 126 126 5.8835660 2.4256063
## 127 127 1.4473698 1.2030668
## 128 128 1.1348285 1.0652833
## 129 129 1.6688603 1.2918438
## 130 130 7.0710485 2.6591443
## 131 131 5.6935238 2.3861106
## 132 132 13.1010925 3.6195431
## 133 133 2.5441171 1.5950289
## 134 134 2.4087367 1.5520105
## 135 135 12.8803310 3.5889178
## 136 136 9.6569355 3.1075610
## 137 137 8.2028004 2.8640531
## 138 138 3.2575803 1.8048768
## 139 139 1.4687445 1.2119177
## 140 140 3.4924068 1.8687982
## 141 141 5.9713581 2.4436362
## 142 142 12.4413843 3.5272346
## 143 143 2.9682833 1.7228707
## 144 144 3.1069367 1.7626505
## 145 145 7.4592052 2.7311546
## 146 146 9.0639497 3.0106394
## 147 147 4.0366487 2.0091413
## 148 148 1.7670035 1.3292868
## 149 149 7.6824724 2.7717273
## 150 150 3.4787688 1.8651458
##
## $obs_mas_lejana
## [1] 132
##
## $obs_mas_cercana
## [1] 79
- Si la distancia es pequeña (como la observación más cercana con
𝐷≈0.565), significa que sus medidas de sépalo y pétalo son muy parecidas
al promedio del conjunto. Morfológicamente, es una flor representativa o
típica de la base de datos.
- Si la distancia es grande (como la observación más lejana con 𝐷≈3.62),
significa que sus medidas se alejan considerablemente del promedio, ya
sea porque una o varias dimensiones son extremas o porque la combinación
de valores es poco común según la correlación entre variables. En
términos morfológicos, esta flor podría ser atípica dentro de la
muestra: más grande, más pequeña o con proporciones inusuales en sus
sépalos y pétalos respecto al resto.
e) Usando la matriz de varianzas-covarianzas conjunta (matriz Sp de varianzas agrupadas) entre dos grupos espec´ıficos (Grupo 1: setosa y Grupo 2: versicolor), calcula la distancia de Mahalanobis de cada flor del grupo setosa al centroide del grupo versicolor. ¿Qué observación del grupo setosa es la m´as cercana al grupo versicolor desde una perspectiva multivariada? ¿Qué interpretación puedes dar sobre esa flor respecto a su similitud con la otra especie?
#obtenemos el vector de medias de versicolor
versi_data = subset(iris, Species == "versicolor")
versi_means = colMeans(versi_data[, 1:4])
versi_cov = cov(versi_data[,1:4])
versi_means
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.936 2.770 4.260 1.326
versi_cov
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 0.26643265 0.08518367 0.18289796 0.05577959
## Sepal.Width 0.08518367 0.09846939 0.08265306 0.04120408
## Petal.Length 0.18289796 0.08265306 0.22081633 0.07310204
## Petal.Width 0.05577959 0.04120408 0.07310204 0.03910612
#filtramos todas las flores de setosa
setosa_data =subset(iris, Species == "setosa")
setosa_cov = cov(setosa_data[,1:4])
#calculo de Sp
Sp = 1/100 *((50-1)*versi_cov%*%versi_cov + (50-1)*setosa_cov%*%setosa_cov)
Sp
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 0.06882616 0.036931494 0.05095208 0.017808086
## Sepal.Width 0.03693149 0.027535900 0.02386044 0.009308795
## Petal.Length 0.05095208 0.023860437 0.04691147 0.016236963
## Petal.Width 0.01780809 0.009308795 0.01623696 0.005897490
#calculo de mahalanobis
mahalanobis(setosa_data[,1:4], versi_means, Sp)
## 1 2 3 4 5 6 7 8
## 881.1417 670.9860 695.7109 801.3218 947.3688 730.8127 623.2432 913.1748
## 9 10 11 12 13 14 15 16
## 642.5454 1126.8588 1049.0044 1066.6295 969.1349 768.8631 1080.3440 915.3797
## 17 18 19 20 21 22 23 24
## 750.1978 659.4720 927.2403 834.0607 1061.3033 602.0438 765.0304 429.3617
## 25 26 27 28 29 30 31 32
## 1555.7082 790.9863 506.9971 949.5367 834.9411 949.7247 863.0935 612.0492
## 33 34 35 36 37 38 39 40
## 1903.0334 1279.7040 765.0697 694.4545 879.0641 1370.3049 625.2200 902.4936
## 41 42 43 44 45 46 47 48
## 641.7333 457.1020 727.6233 539.8206 864.3553 498.5776 1294.4900 771.0164
## 49 50
## 1058.2827 787.9744
La observación que tiene la menor distancia es la observación 24, con un valor de aproximadamente 429.3627. Esto indica que desde un punto de vista multivariado, esta flor presenta características morfológicas más similares a las del grupo versicolor que el resto de flores setosa. Podriamos decir que tiene medidas intermedias entre lo típico de setosa y versicolor o podría representar un caso atípico dentro de setosa, o un ejemplo de traslape morfológico entre ambas especies.
You can also embed plots, for example:
Dada la matriz de datos X, donde cada fila representa una observación y cada columna una variableS
a) Grafique el diagrama de dispersión en p = 2 dimensiones. Localice la media de la muestra en el diagrama.
# PUNTO A - DIAGRAMA DE DISPERSION
#Datos
X <- matrix(c(2,5,
4,3,
6,7),
ncol=2, byrow = TRUE)
#Colocar nombre a las columnas
colnames(X) <- c("Variable1", "Variable2")
#Calcular la media mustral por columnas
media_muestral <- colMeans(X)
# Graficar el diagrama de dispersión
plot(X[,1], X[,2],
xlab = "Variable 1",
ylab = "Variable 2",
main = "Diagrama de dispersión con media muestral",
pch = 19, col = "blue", xlim = c(0,8), ylim = c(0,8))
# Agregar el punto de la media en rojo
points(media_muestral[1], media_muestral[2],
col = "red", pch = 19, cex = 1.5)
# Agregar etiqueta para la media
text(media_muestral[1], media_muestral[2] + 0.3,
labels = "Media", col = "red")
Los puntos están cntrados alrededor de la media, indica baja variabilidad conjunta.
En el plano dimensiones, cada punto representa una observación . La media muestral aparece como un punto central alrededor del cual se distribuyen los datos.
b) Dibuje la representación con n = 3 observaciones en el espacio de datos y trace los vectores de desviación y1 = x1 − x¯ · 1, y2 = x2 − x¯ · 1.
# PUNTO B - REPRESENTACION CON n = 3 OBERVACIONES
# Matriz de medias repetida
medias_repetidas <- matrix(rep(media_muestral, each = nrow(X)),
nrow = nrow(X))
# Vectores de desviación
Y <- X - medias_repetidas
# Graficar puntos y media
plot(X[,1], X[,2],
xlab = "Variable 1",
ylab = "Variable 2",
main = "Vectores de desviación desde la media",
pch = 19, col = "blue", xlim = c(0,8), ylim = c(0,8))
points(media_muestral[1], media_muestral[2],
col = "red", pch = 19, cex = 1.5)
text(media_muestral[1], media_muestral[2] + 0.3,
labels = "Media", col = "red")
# Trazar los vectores de desviación
arrows(x0 = media_muestral[1], y0 = media_muestral[2],
x1 = X[,1], y1 = X[,2],
length = 0.1, col = "darkgreen", lwd = 2)
# Mostrar resultados en consola
Y
## Variable1 Variable2
## [1,] -2 0
## [2,] 0 -2
## [3,] 2 2
Se evidencia la ortogonalidad entre Y1 y Y2 generando un angulo de 90 grados entre los dos vectores.
Estos vectores muestran, para cada observación, cuánto se aleja de la media en cada variable.
Interpretación: si los vectores son grandes, hay mucha variabilidad respecto a la media; si son pequeños, los datos son homogéneos. En el gráfico, estas desviaciones se ven como flechas desde la media hacia cada punto.
c) Dibuje los vectores de desviación obtenidos en (b) que parten desde el origen. Calcule las longitudes de estos vectores y el coseno del ángulo entre ellos. Relacione estas cantidades con la matriz de covarianzas S y la matriz de correlaciones R.
# PUNTO C - LONGITUDES, COSENO DEL ANGULO, MATRIZ COVARIANZAS Y CORRELACIONES
#Matriz de desviaciones
Y <- X - medias_repetidas
#Longitudes de cada vector-obs (desde el origen)
longitudes <- apply(Y, 1, function(v) sqrt(sum(v^2)))
#Cosenos entre pares de vectores-obs
cos12 <- sum(Y[1,] * Y[2,]) / (longitudes[1] * longitudes[2])
cos13 <- sum(Y[1,] * Y[3,]) / (longitudes[1] * longitudes[3])
cos23 <- sum(Y[2,] * Y[3,]) / (longitudes[2] * longitudes[3])
#Matriz de covarianzas y de correlaciones
S <- cov(X)
R <- cor(X)
#Mostrar resultados
Y
## Variable1 Variable2
## [1,] -2 0
## [2,] 0 -2
## [3,] 2 2
longitudes
## [1] 2.000000 2.000000 2.828427
cos12; cos13; cos23
## [1] 0
## [1] -0.7071068
## [1] -0.7071068
S
## Variable1 Variable2
## Variable1 4 2
## Variable2 2 4
R
## Variable1 Variable2
## Variable1 1.0 0.5
## Variable2 0.5 1.0
#Gráfica con vectores desde el origen
plot(c(0, Y[,1]), c(0, Y[,2]), type = "n",
xlab = "Variable 1 centrada", ylab = "Variable 2 centrada",
xlim = c(-3, 3), ylim = c(-3, 3),
main = "Vectores de desviación desde el origen")
arrows(0, 0, Y[,1], Y[,2], col = c("blue","green","purple"),
length = 0.1, lwd = 2)
text(Y[,1], Y[,2], labels = paste0("y",1:3), pos = 3)
abline(h = 0, v = 0, col = "gray", lty = 2)
Cuando trasladamos los vectores de desviación al origen, podemos calcular:
Longitudes → son las distancias euclidianas de las desviaciones; se relacionan con la varianza de cada variable (diagonal de ).
Coseno del ángulo entre vectores → equivale al coeficiente de correlación entre las dos variables (elementos fuera de la diagonal en ).
Interpretación:
Si el coseno ≈ 1, las variables están fuertemente correlacionadas positivamente.
Si es ≈ 0, no hay correlación.
Si es ≈ -1, están correlacionadas negativamente.
d) Calcule la varianza muestral generalizada, es decir, el determinante de la matriz de covarianzas: |S|. Interprete el resultado.
# PUNTO D - CALCULO VARIANZA MUESTRAL GENERALIZADA (DETERMINANTE DE Sn)
# Matriz de covarianzas muestral
S <- cov(X)
# Determinante (varianza generalizada)
det_S <- det(S)
# Autovalores
eigs <- eigen(S)$values
S
## Variable1 Variable2
## Variable1 4 2
## Variable2 2 4
det_S
## [1] 12
eigs
## [1] 6 2
e) Calcule la varianza total. ¿cuál variable que contribuye más a la varianza total? Calcule el porcentaje de participación de esta variable?
var_total = sum(diag(S))
participacion = diag(S) / var_total * 100
S; var_total; participacion
## Variable1 Variable2
## Variable1 4 2
## Variable2 2 4
## [1] 8
## Variable1 Variable2
## 50 50
La variable con mayor varianza contribuye más a la dispersión total del conjunto. En este caso ambas variables contribuyen por igual on un porcentaje de 50% para cada una.