ANÁLISIS DE CONGLOMERADOS
En el siguiente ejercicio se aplican diferentes métodos estadísticos para el análisis de conglomerados. Se busca generar agrupaciones o clasificaciones que conduzcan a la explicación de un fenómeno particular, en función de lo que pueden llegar a proporcionar los datos.
Los datos corresponden a 707438 registros de respuesta espectral del suelo para una altura dada (a). Los valores de respuesta espectral corresponden a 1501 longitudes de onda que se hallan en el rango: 1000 y 2500 nanómetros (nm).
Cargue de los datos proporcionados en formato *.xlsx previa preparación.
library(readxl)
spectra<-read_excel("D:/UNGEO/11.CLASES/2021_S1/METODOS_Aquiles_Darghan/SESION_15/Datos_espectro_0106.xlsx")
dfs=data.frame(spectra)
# dimensiones de los datos
dim(dfs)
## [1] 468 1502
Este método propuesto en 1967 por MacQueen, corresponde a uno de los algoritmos de aprendizaje automático que no requiere supervisión; es uno de los más emppleados para separar de un conjunto de datos, un conjunto de grupos (k clústeres ), donde k representa el número de grupos que son predefinidos por el analista.
set.seed(20)
# para iniciar en la columna 1 (Profundidad), ver Excel, 5 son los grupos de datos
k.meanssp <-kmeans(t(dfs[,-1]),5, nstart = 10)
# para que se aprecien todos los datos de los 5 grupos
# k.meanssp
Como parte de la evaluación preliminar de los datos, se extraen y plotean los registros de la primera columna con 468 valores de profundidad, relativos a la firma espectral de 2500 nanómetros.
#dfs[2]
# plot(dfs[,2])
# Datos de la fila No 2
# dfs[2,]
# ver todos los datos la firma espectral 2500
# dfs[,2]
# ploteo de la firma espectral 2500 (columna 2)
# Eje Y valores de profundidad, eje x, cantidad de datos = 468
plot((as.vector(t(dfs[,2]))), type="l")
Para análisis del comportamiento de las firmas espectrales, se plotean las respuestas asociadas a la primer y ultima última fila (468).
par(mfrow= c(1,2))
v = unlist(dfs[468,-1])
plot(v, type='l')
v = unlist(dfs[1,-1])
plot(v, type='l')
Empleo de componentes principales PCA
Partiendo del principio de componentes principales PCA, se plantea el resumen de firmas espectrales, determinando aquellas de interés, en cuyo caso sería posible la definición de un índice que explique ciertas propiedades y componentes del suelo.
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.0.5
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.0.5
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.0.5
res.pca = PCA(dfs[,-1])
# Graph of variables: default plot
# fviz_pca_var(res.pca, col.var = "black")
En el siguiente gráfico, un solo componente explica el 97.8 % no obstante, el objetivo es determinar cuál es el sector de las firmas espectrales que realmente está aportando información a este nivel. Con el histograma se busca conocer que longitud de onda se deberá usar.
par(mfrow= c(1,2))
fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 100))
# La mayoría se halla cerca a cero
PCA_spectra = prcomp(dfs[,-1])
hist(PCA_spectra$x[,1])
El siguiente gráfico presenta el comportamiento (valores de respuesta espectral) respecto del análisis PCA.
# par(mfrow= c(1,2))
PCA_1 = (PCA_spectra$x[,1])
# PCA_1
# v2 = unlist(PCA_1[1,1])
# plot(v2, type='l')
plot((as.vector(t(PCA_1[]))), type="l")
Es importante hacer un análisis respecto de la dimensión que mejor explica el comportamiento de la respuesta espectral, esta permite determinar que método de agrupamiento podrá tener una mejor representatividad en la discriminación de grupos (k-medias o k-medioides), para ello se lleva a valores de grados, y se analizan respecto a la horizontal.
Con un sencillo ploteo del histograma, es posible entender que aquellos próximos a cero (0) son los que se deberán emplear.
grados<-(acos((cor(dfs[,-1],PCA_1)))*180)/pi
hist(grados)
Aplicamos k-mendias para seleccionar el grupo más pequeño, para ello se generaron cinco clúster a los valores de grados.
set.seed(20)
k.meanssp <-kmeans(grados,5, nstart = 10)
# k.meanssp
# Nótese que la respuesta, K-means clustering with 5 clusters of sizes # 209, 672, 52, 233, 335, representa la cantidad total de firmas espectrales, 1501
Se tipifican los grupos para una mejor selección, ello a partir de las estadísticas de los cinco grupos
dfs_grupos = data.frame(grados,k.meanssp$cluster)
(tapply(dfs_grupos$grados,dfs_grupos$k.meanssp.cluster,length))
## 1 2 3 4 5
## 209 672 52 233 335
(tapply(dfs_grupos$grados,dfs_grupos$k.meanssp.cluster,mean))
## 1 2 3 4 5
## 4.658727 7.800095 27.905060 18.176439 12.460037
cluster_1 = dfs_grupos[which(dfs_grupos$k.meanssp.cluster==1),]
# dimensiones del cluster 209
dim (cluster_1)
## [1] 209 2
A partir de lo visto en el anterior histograma respecto de los valores en grados a partir de la horizontal, así como su comportamiento en cierta dimensión, se aplica k-medias para seleccionar un grupo más pequeño; para ello se da una definición preliminar de cinco clústeres.
set.seed(20)
k.meanssp <-kmeans(grados,5, nstart = 10)
# k.meanssp
De la aplicación de K-means se obtuvieron los cinco grupos definidos con la siguiente cantidad de datos por grupo: 209, 672, 52, 233, 335, esto representa que tal cantidad de datos, cuenta con cierta similitud inter-grupos.
A manera de análisis del comportamiento, se representan en un histograma las longitudes de onda del clúster uno, correspondiente a 209 respuestas espectrales, teniendo en cuenta que fueron estas las que quedaron mejor representadas en uno de los componentes.
hist (cluster_1$grados)
Surge la pregunta de cuáles son las longitudes de onda del clúster uno con 209 datos seleccionados en valores de gados, puesto que, a partir de ellos, se explicaría su aporte para un potencial estudio de propiedades del suelo.
Para tener una idea de cuáles son las 209 longitudes de onda que corresponden al clúster uno de las 1501 dadas, se listan en el siguiente bloque. Como podría suponerse, se aprecia que corresponden a un rango que se halla entre 1528.12 y 1352.08, es decir, que estas longitudes de onda comparten ciertas características respecto a los valores de respuesta espectral a la profundidad dada, razón por la cual, los valores en grados derivados de la representación en PCA, son explicados en cierta dimensión.
cluster_1
## grados k.meanssp.cluster
## X1528.12 6.212644 1
## X1527.18 6.188738 1
## X1526.25 6.164515 1
## X1525.32 6.139274 1
## X1524.39 6.112921 1
## X1523.46 6.086291 1
## X1522.53 6.060239 1
## X1521.61 6.034584 1
## X1520.68 6.008378 1
## X1519.76 5.981371 1
## X1518.83 5.954029 1
## X1517.91 5.926922 1
## X1516.99 5.899871 1
## X1516.07 5.872397 1
## X1515.15 5.844096 1
## X1514.23 5.814951 1
## X1513.32 5.785146 1
## X1512.4 5.754855 1
## X1511.49 5.724046 1
## X1510.57 5.692756 1
## X1509.66 5.661375 1
## X1508.75 5.630619 1
## X1507.84 5.600563 1
## X1506.93 5.570522 1
## X1506.02 5.539573 1
## X1505.12 5.507337 1
## X1504.21 5.473887 1
## X1503.31 5.439281 1
## X1502.4 5.403431 1
## X1501.5 5.366271 1
## X1500.6 5.328404 1
## X1499.7 5.290836 1
## X1498.8 5.254395 1
## X1497.9 5.219674 1
## X1497.01 5.187246 1
## X1496.11 5.157558 1
## X1495.22 5.130891 1
## X1494.32 5.106873 1
## X1493.43 5.084915 1
## X1492.54 5.064213 1
## X1491.65 5.043655 1
## X1490.76 5.021878 1
## X1489.87 4.998355 1
## X1488.98 4.973943 1
## X1488.1 4.949956 1
## X1487.21 4.926176 1
## X1486.33 4.900767 1
## X1485.44 4.872453 1
## X1484.56 4.842416 1
## X1483.68 4.812919 1
## X1482.8 4.784554 1
## X1481.92 4.756000 1
## X1481.04 4.726252 1
## X1480.17 4.696203 1
## X1479.29 4.667265 1
## X1478.42 4.639345 1
## X1477.54 4.611021 1
## X1476.67 4.581248 1
## X1475.8 4.550380 1
## X1474.93 4.519612 1
## X1474.06 4.489855 1
## X1473.19 4.461095 1
## X1472.32 4.432893 1
## X1471.45 4.405127 1
## X1470.59 4.378222 1
## X1469.72 4.352774 1
## X1468.86 4.328509 1
## X1468 4.304571 1
## X1467.14 4.280011 1
## X1466.28 4.254851 1
## X1465.42 4.229755 1
## X1464.56 4.205638 1
## X1463.7 4.183106 1
## X1462.84 4.162320 1
## X1461.99 4.142841 1
## X1461.13 4.123925 1
## X1460.28 4.105181 1
## X1459.43 4.086545 1
## X1458.58 4.067906 1
## X1457.73 4.048973 1
## X1456.88 4.029333 1
## X1456.03 4.009041 1
## X1455.18 3.988337 1
## X1454.33 3.967271 1
## X1453.49 3.945538 1
## X1452.64 3.922639 1
## X1451.8 3.898769 1
## X1450.96 3.874669 1
## X1450.12 3.850972 1
## X1449.28 3.827409 1
## X1448.44 3.803285 1
## X1447.6 3.778564 1
## X1446.76 3.753990 1
## X1445.92 3.730025 1
## X1445.09 3.706646 1
## X1444.25 3.683130 1
## X1443.42 3.658307 1
## X1442.59 3.631296 1
## X1441.75 3.602505 1
## X1440.92 3.573141 1
## X1440.09 3.544045 1
## X1439.26 3.514909 1
## X1438.43 3.485442 1
## X1437.61 3.456077 1
## X1436.78 3.427399 1
## X1435.96 3.399766 1
## X1435.13 3.373544 1
## X1434.31 3.349122 1
## X1433.49 3.326439 1
## X1432.66 3.304653 1
## X1431.84 3.283171 1
## X1431.02 3.262067 1
## X1430.21 3.241779 1
## X1429.39 3.222382 1
## X1428.57 3.203831 1
## X1427.76 3.187334 1
## X1426.94 3.174993 1
## X1426.13 3.169004 1
## X1425.31 3.171170 1
## X1424.5 3.182925 1
## X1423.69 3.205488 1
## X1422.88 3.239785 1
## X1422.07 3.286467 1
## X1421.26 3.348019 1
## X1420.45 3.435573 1
## X1419.65 3.584783 1
## X1418.84 3.894667 1
## X1418.04 4.576368 1
## X1417.23 5.831086 1
## X1412.43 5.996645 1
## X1411.63 5.166966 1
## X1410.84 4.632910 1
## X1410.04 4.317420 1
## X1409.24 4.142228 1
## X1408.45 4.045765 1
## X1407.66 3.991828 1
## X1406.87 3.960159 1
## X1406.07 3.934644 1
## X1405.28 3.901154 1
## X1404.49 3.852979 1
## X1403.71 3.793889 1
## X1402.92 3.732808 1
## X1402.13 3.676596 1
## X1401.35 3.629227 1
## X1400.56 3.595179 1
## X1399.78 3.579273 1
## X1398.99 3.582363 1
## X1398.21 3.598454 1
## X1397.43 3.613532 1
## X1396.65 3.605908 1
## X1395.87 3.568407 1
## X1395.09 3.540906 1
## X1394.31 3.563539 1
## X1393.53 3.600440 1
## X1392.76 3.622397 1
## X1391.98 3.686461 1
## X1391.21 3.822380 1
## X1390.43 3.976816 1
## X1389.66 4.104329 1
## X1388.89 4.200776 1
## X1388.12 4.275642 1
## X1387.35 4.337580 1
## X1386.58 4.394120 1
## X1385.81 4.450550 1
## X1385.04 4.509342 1
## X1384.27 4.571292 1
## X1383.51 4.635902 1
## X1382.74 4.700609 1
## X1381.98 4.760297 1
## X1381.22 4.810033 1
## X1380.45 4.849551 1
## X1379.69 4.884892 1
## X1378.93 4.924628 1
## X1378.17 4.974537 1
## X1377.41 5.035406 1
## X1376.65 5.104479 1
## X1375.89 5.177378 1
## X1375.14 5.250129 1
## X1374.38 5.320249 1
## X1373.63 5.387028 1
## X1372.87 5.450733 1
## X1372.12 5.510895 1
## X1371.37 5.565772 1
## X1370.61 5.613877 1
## X1369.86 5.655538 1
## X1369.11 5.692824 1
## X1368.36 5.727170 1
## X1367.61 5.758052 1
## X1366.87 5.784552 1
## X1366.12 5.807646 1
## X1365.37 5.830215 1
## X1364.63 5.854244 1
## X1363.88 5.878818 1
## X1363.14 5.901918 1
## X1362.4 5.923244 1
## X1361.66 5.944597 1
## X1360.91 5.967599 1
## X1360.17 5.992290 1
## X1359.43 6.017247 1
## X1358.7 6.040985 1
## X1357.96 6.062918 1
## X1357.22 6.083361 1
## X1356.48 6.102669 1
## X1355.75 6.121099 1
## X1355.01 6.139037 1
## X1354.28 6.157201 1
## X1353.55 6.176128 1
## X1352.81 6.195769 1
## X1352.08 6.216005 1
La extracción de las longitudes de onda correspondientes al primer clúster (209) datos puede llevarse a cabo con diferentes enfoques, en este caso se contempla inicialmente una transposición del marco de datos (data frame) original creado (spectra) con los 1501 datos.
dfst = t(dfs)
# las 1501 columnas pasan a ser filas
colnames(dfs[,-1])[k.meanssp$cluster == 1]
## [1] "X1528.12" "X1527.18" "X1526.25" "X1525.32" "X1524.39" "X1523.46"
## [7] "X1522.53" "X1521.61" "X1520.68" "X1519.76" "X1518.83" "X1517.91"
## [13] "X1516.99" "X1516.07" "X1515.15" "X1514.23" "X1513.32" "X1512.4"
## [19] "X1511.49" "X1510.57" "X1509.66" "X1508.75" "X1507.84" "X1506.93"
## [25] "X1506.02" "X1505.12" "X1504.21" "X1503.31" "X1502.4" "X1501.5"
## [31] "X1500.6" "X1499.7" "X1498.8" "X1497.9" "X1497.01" "X1496.11"
## [37] "X1495.22" "X1494.32" "X1493.43" "X1492.54" "X1491.65" "X1490.76"
## [43] "X1489.87" "X1488.98" "X1488.1" "X1487.21" "X1486.33" "X1485.44"
## [49] "X1484.56" "X1483.68" "X1482.8" "X1481.92" "X1481.04" "X1480.17"
## [55] "X1479.29" "X1478.42" "X1477.54" "X1476.67" "X1475.8" "X1474.93"
## [61] "X1474.06" "X1473.19" "X1472.32" "X1471.45" "X1470.59" "X1469.72"
## [67] "X1468.86" "X1468" "X1467.14" "X1466.28" "X1465.42" "X1464.56"
## [73] "X1463.7" "X1462.84" "X1461.99" "X1461.13" "X1460.28" "X1459.43"
## [79] "X1458.58" "X1457.73" "X1456.88" "X1456.03" "X1455.18" "X1454.33"
## [85] "X1453.49" "X1452.64" "X1451.8" "X1450.96" "X1450.12" "X1449.28"
## [91] "X1448.44" "X1447.6" "X1446.76" "X1445.92" "X1445.09" "X1444.25"
## [97] "X1443.42" "X1442.59" "X1441.75" "X1440.92" "X1440.09" "X1439.26"
## [103] "X1438.43" "X1437.61" "X1436.78" "X1435.96" "X1435.13" "X1434.31"
## [109] "X1433.49" "X1432.66" "X1431.84" "X1431.02" "X1430.21" "X1429.39"
## [115] "X1428.57" "X1427.76" "X1426.94" "X1426.13" "X1425.31" "X1424.5"
## [121] "X1423.69" "X1422.88" "X1422.07" "X1421.26" "X1420.45" "X1419.65"
## [127] "X1418.84" "X1418.04" "X1417.23" "X1412.43" "X1411.63" "X1410.84"
## [133] "X1410.04" "X1409.24" "X1408.45" "X1407.66" "X1406.87" "X1406.07"
## [139] "X1405.28" "X1404.49" "X1403.71" "X1402.92" "X1402.13" "X1401.35"
## [145] "X1400.56" "X1399.78" "X1398.99" "X1398.21" "X1397.43" "X1396.65"
## [151] "X1395.87" "X1395.09" "X1394.31" "X1393.53" "X1392.76" "X1391.98"
## [157] "X1391.21" "X1390.43" "X1389.66" "X1388.89" "X1388.12" "X1387.35"
## [163] "X1386.58" "X1385.81" "X1385.04" "X1384.27" "X1383.51" "X1382.74"
## [169] "X1381.98" "X1381.22" "X1380.45" "X1379.69" "X1378.93" "X1378.17"
## [175] "X1377.41" "X1376.65" "X1375.89" "X1375.14" "X1374.38" "X1373.63"
## [181] "X1372.87" "X1372.12" "X1371.37" "X1370.61" "X1369.86" "X1369.11"
## [187] "X1368.36" "X1367.61" "X1366.87" "X1366.12" "X1365.37" "X1364.63"
## [193] "X1363.88" "X1363.14" "X1362.4" "X1361.66" "X1360.91" "X1360.17"
## [199] "X1359.43" "X1358.7" "X1357.96" "X1357.22" "X1356.48" "X1355.75"
## [205] "X1355.01" "X1354.28" "X1353.55" "X1352.81" "X1352.08"
lon_hon=colnames(dfs[,-1])[k.meanssp$cluster == 1]
Como parte del ejercicio, puede ser recomendable en ciertos casos, conservar en un formato alterno (*.xlsx) el resultado del dataframe transpuesto. Con ello se busca un mejor entendimiento del proceso, en cuyo caso puede ser desplegado en Excel.
openxlsx::write.xlsx(dfst,"D:/UNGEO/11.CLASES/2021_S1/METODOS_Aquiles_Darghan/SESION_15/1501_traspuesta.xlsx")
Ajuste de los datos del cluter uno
lon_on=colnames(dfs[,-1])[k.meanssp$cluster == 1]
lon_on=stringr::str_sub(lon_on, 2)
# se deja con valor numérico
lon_on = as.numeric(lon_on)
lon_on
## [1] 1528.12 1527.18 1526.25 1525.32 1524.39 1523.46 1522.53 1521.61 1520.68
## [10] 1519.76 1518.83 1517.91 1516.99 1516.07 1515.15 1514.23 1513.32 1512.40
## [19] 1511.49 1510.57 1509.66 1508.75 1507.84 1506.93 1506.02 1505.12 1504.21
## [28] 1503.31 1502.40 1501.50 1500.60 1499.70 1498.80 1497.90 1497.01 1496.11
## [37] 1495.22 1494.32 1493.43 1492.54 1491.65 1490.76 1489.87 1488.98 1488.10
## [46] 1487.21 1486.33 1485.44 1484.56 1483.68 1482.80 1481.92 1481.04 1480.17
## [55] 1479.29 1478.42 1477.54 1476.67 1475.80 1474.93 1474.06 1473.19 1472.32
## [64] 1471.45 1470.59 1469.72 1468.86 1468.00 1467.14 1466.28 1465.42 1464.56
## [73] 1463.70 1462.84 1461.99 1461.13 1460.28 1459.43 1458.58 1457.73 1456.88
## [82] 1456.03 1455.18 1454.33 1453.49 1452.64 1451.80 1450.96 1450.12 1449.28
## [91] 1448.44 1447.60 1446.76 1445.92 1445.09 1444.25 1443.42 1442.59 1441.75
## [100] 1440.92 1440.09 1439.26 1438.43 1437.61 1436.78 1435.96 1435.13 1434.31
## [109] 1433.49 1432.66 1431.84 1431.02 1430.21 1429.39 1428.57 1427.76 1426.94
## [118] 1426.13 1425.31 1424.50 1423.69 1422.88 1422.07 1421.26 1420.45 1419.65
## [127] 1418.84 1418.04 1417.23 1412.43 1411.63 1410.84 1410.04 1409.24 1408.45
## [136] 1407.66 1406.87 1406.07 1405.28 1404.49 1403.71 1402.92 1402.13 1401.35
## [145] 1400.56 1399.78 1398.99 1398.21 1397.43 1396.65 1395.87 1395.09 1394.31
## [154] 1393.53 1392.76 1391.98 1391.21 1390.43 1389.66 1388.89 1388.12 1387.35
## [163] 1386.58 1385.81 1385.04 1384.27 1383.51 1382.74 1381.98 1381.22 1380.45
## [172] 1379.69 1378.93 1378.17 1377.41 1376.65 1375.89 1375.14 1374.38 1373.63
## [181] 1372.87 1372.12 1371.37 1370.61 1369.86 1369.11 1368.36 1367.61 1366.87
## [190] 1366.12 1365.37 1364.63 1363.88 1363.14 1362.40 1361.66 1360.91 1360.17
## [199] 1359.43 1358.70 1357.96 1357.22 1356.48 1355.75 1355.01 1354.28 1353.55
## [208] 1352.81 1352.08
dflon=data.frame(lon_on)
# dimensiones de los datos de lon_on como dataframe
dim(dflon)
## [1] 209 1
Como se citó previamente, el rango de los datos del clúster uno corresponde a con 1352.08-1528.12:
range(lon_on)
## [1] 1352.08 1528.12
# describe(lon_hon)
Como parte del análisis del grupo de firmas espectrales, se grafica el rango obtenido. Teniendo en cuenta que tales firmas presentan similitud respecto a la respuesta espectral, podría decirse que entre los valores 1360 y 1525 se da una distribución uniforme, como se aprecia en el histograma. De manera análoga, se grafican los 209 datos del clúster uno, respecto a sus valores de firma espectral.
par(mfrow= c(1,2))
# longitudes de onda selecionadas
hist(lon_on)
select=data.frame(lon_on)
plot(lon_on)
# select
A partir de la selección de las firmas posibles del clúster uno, se generan sobre este siete (7) conglomerados, teniendo en cuenta el último dígito del número de C.C de los autores del ejercicio.
set.seed(20)
k.meanssp <-kmeans(dflon,7, nstart = 10)
k.meanssp
## K-means clustering with 7 clusters of sizes 27, 32, 26, 31, 33, 27, 33
##
## Cluster means:
## lon_on
## 1 1361.679
## 2 1485.930
## 3 1402.550
## 4 1514.277
## 5 1457.772
## 6 1382.004
## 7 1430.248
##
## Clustering vector:
## [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2
## [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 5 5 5 5 5 5 5 5 5 5
## [75] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
## [112] 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [149] 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 1 1 1
## [186] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 900.9378 2127.7776 905.4741 2086.4810 2161.7725 956.0443 2003.3166
## (between_SS / total_SS = 98.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
plot((as.vector(t(dflon[]))), type="l")
# otra manera de plotaerlo
Aplicando de nuevo el principio de componentes principales PCA, se plantea un resumen sobre el clúster uno de firmas espectrales, acotando aún mas en aquellas de interés, con lo cual, y a manera de ejemplo, posibilitaría la definición de un índice que facilitara la explicación de ciertos componentes del suelo.
library(factoextra)
res.pca = PCA(dflon[])
# Graph of variables: default plot
fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 100))
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
Una manera sencilla de entender el comportamiento de los nuevos grupos derivados del clúster uno en sub- clústeres, es graficando los resultados, a partir de ello se generó un nuevo histograma. En cuanto al grafico de separación de longitud de onda, si se hubiere tomado la totalidad de los datos, 1501 valores, es probable que se hubiera generado solapamiento y no una discriminación de bandas continuas, sin embargo, al haber efectuado una primera discriminación, seleccionando de allí al clúster uno obteniendo 209 valores y, posteriormente un ejercicio de sub-clústers con siete (7) grupos, la discriminación permite entender mejor el comportamiento de las 209 longitudes de onda.
PCA_longon = prcomp(dflon[])
hist(PCA_longon$x[])
grup=k.meanssp$cluster
length(grup)
## [1] 209
k.meanssp$size
## [1] 27 32 26 31 33 27 33
lambda_1=seq(1:209)
plot(lambda_1,grup)
abline(v=c(lambda_1),col=grup)
**************************** Seguir en línea 547 de ejemplo k-Means ****************************************