3.METODOS
3.1APLICANDO CLUSTER JERARQUICO
AGRUPAMIENTO DE INDIVIDUOS
library(readxl)
<- read_excel("data_media.xlsx") datosc
Estructura: Tenemos 24 variables de formato numerico y 1 variable en formato character(meses)
str(datosc)
## tibble [12 x 25] (S3: tbl_df/tbl/data.frame)
## $ meses: chr [1:12] "Ene" "Feb" "Mar" "Abr" ...
## $ Caud : num [1:12] 40.6 56 71.9 47.6 26.3 23.1 23.5 21.7 22.8 22.4 ...
## $ Temp : num [1:12] 19.2 20.2 20.2 20.1 18.5 17.2 16.6 15.7 16.5 18.6 ...
## $ pH : num [1:12] 7.7 7.8 7 7 8 7 7.8 7 7 8 ...
## $ Turb : num [1:12] 47.2 301.9 391.7 100.4 12.5 ...
## $ CE : num [1:12] 488 440 402 426 595 ...
## $ OD : num [1:12] 8.7 8.84 8.94 8.51 8.55 8.64 9 8.76 8.7 8.64 ...
## $ SD : num [1:12] 338 308 278 284 380 ...
## $ Akal : num [1:12] 95.6 91 81.6 91.3 120.4 ...
## $ DI : num [1:12] 211 189 165 176 255 ...
## $ Cls : num [1:12] 14.3 12.8 12.8 11.9 21.8 24.8 18.8 19.3 19.9 17.8 ...
## $ so : num [1:12] 138.6 116.5 97.5 114.6 146.7 ...
## $ N03 : num [1:12] 2.98 2.78 2.54 2.41 3.38 3.64 3.83 3.58 3.61 3.38 ...
## $ N02 : num [1:12] 0.2 0.13 0.08 0.1 0.21 0.3 0.23 0.28 0.18 0.24 ...
## $ PO : num [1:12] 0.2 0.14 0.09 0.18 0.23 0.28 0.32 0.38 0.36 0.34 ...
## $ Cu : num [1:12] 0.04 0.065 0.077 0.038 0.03 0.027 0.022 0.025 0.028 0.023 ...
## $ Al : num [1:12] 1.707 7.207 10.89 3.644 0.408 ...
## $ Fe : num [1:12] 2.176 7.595 11.37 4.471 0.434 ...
## $ Mu : num [1:12] 0.118 0.324 0.342 0.173 0.111 0.089 0.074 0.064 0.049 0.045 ...
## $ Pb : num [1:12] 0.024 0.081 0.079 0.056 0.015 0.02 0.013 0.015 0.022 0.012 ...
## $ Cd : num [1:12] 0.002 0.005 0.003 0.002 0.003 0.002 0.002 0.002 0.002 0.001 ...
## $ Zn : num [1:12] 0.372 0.611 0.641 0.343 0.468 0.323 0.273 0.28 0.28 0.171 ...
## $ As : num [1:12] 0.029 0.126 0.088 0.074 0.024 0.023 0.022 0.019 0.022 0.022 ...
## $ Colo : num [1:12] 178600 247014 208035 174967 160299 ...
## $ Cole : num [1:12] 74326 95332 90325 58096 63802 ...
Convirtiendo en un dataframe:
=as.data.frame(datosc) datosc
rownames(datosc)<- datosc$meses
Eliminanos la variable meses(cualitativa)
$meses=NULL
datoschead(datosc,3)
## Caud Temp pH Turb CE OD SD Akal DI Cls so N03 N02 PO
## Ene 40.6 19.2 7.7 47.2 487.71 8.70 337.86 95.6 211.4 14.3 138.6 2.98 0.20 0.20
## Feb 56.0 20.2 7.8 301.9 440.00 8.84 307.96 91.0 189.1 12.8 116.5 2.78 0.13 0.14
## Mar 71.9 20.2 7.0 391.7 401.96 8.94 278.04 81.6 164.6 12.8 97.5 2.54 0.08 0.09
## Cu Al Fe Mu Pb Cd Zn As Colo Cole
## Ene 0.040 1.707 2.176 0.118 0.024 0.002 0.372 0.029 178600 74326
## Feb 0.065 7.207 7.595 0.324 0.081 0.005 0.611 0.126 247014 95332
## Mar 0.077 10.890 11.370 0.342 0.079 0.003 0.641 0.088 208035 90325
ANALISIS EXPLORATORIO
#Verificando si hay valores faltantes:
#Detectando y graficando los % de datos perdidos
#No hay valores perdidos en ninguna variable
library(DataExplorer)
library(ggplot2)
plot_missing(datosc,ggtheme=theme_minimal())
#estandarizamos los datos porque las variables se encuentran en diferentes escalas
<- as.data.frame(scale(datosc)) datosc
CLUSTER JERARQUICO AGLOMERATIVO
Distancia euclidiana y metodo de enlace Ward.D2
#-----------------------------------
#calculando la matriz de disimilaridad
<- dist(datosc, method = "euclidean")
d
#el metodo ward.d2 ,para reconstruir la matriz distancia
<- hclust(d, method = "ward.D2" ) res.hc
$merge res.hc
## [,1] [,2]
## [1,] -10 -11
## [2,] -8 -9
## [3,] -1 -12
## [4,] -6 2
## [5,] -7 4
## [6,] -5 1
## [7,] -2 -3
## [8,] 3 6
## [9,] -4 7
## [10,] 5 8
## [11,] 9 10
#formacion de "n" cluster hasta 1 cluster
#observamos que son 11 etapas:
#En la etapa 1
#el individuo 10 y el individuo 11 forman un cluster
#En la entapa 2
#el individuo 8 y el individuo 9 forman un cluster
#y asi sucesivamente hasta llegar a la etapa 11 donde se
#forma un solo cluster
#estructura:
str(res.hc)
## List of 7
## $ merge : int [1:11, 1:2] -10 -8 -1 -6 -7 -5 -2 3 -4 5 ...
## $ height : num [1:11] 1.55 1.9 2.54 3.36 3.95 ...
## $ order : int [1:12] 4 2 3 7 6 8 9 1 12 5 ...
## $ labels : chr [1:12] "Ene" "Feb" "Mar" "Abr" ...
## $ method : chr "ward.D2"
## $ call : language hclust(d = d, method = "ward.D2")
## $ dist.method: chr "euclidean"
## - attr(*, "class")= chr "hclust"
options(scipen = 999)#sin notacion cientifica
#distancia
$height res.hc
## [1] 1.554549 1.904331 2.540561 3.359679 3.950460 4.065524 4.075132
## [8] 4.573464 7.031689 7.392952 18.178469
EL NUMERO DE CLUSTER
#Hemos considerado que un cambio brusco seria de la etapa 9
#a la etapa 10,entonces el numero de cluster es 3
library(ggplot2)
<- data.frame(etapa=1:11,distancia=res.hc$height)#distancia
alturas alturas
## etapa distancia
## 1 1 1.554549
## 2 2 1.904331
## 3 3 2.540561
## 4 4 3.359679
## 5 5 3.950460
## 6 6 4.065524
## 7 7 4.075132
## 8 8 4.573464
## 9 9 7.031689
## 10 10 7.392952
## 11 11 18.178469
#screeplot con las distancias
ggplot(alturas) + aes(x=etapa,y=distancia) +
geom_point() + geom_line() +
scale_x_continuous(breaks=seq(1,15)) +
geom_vline(xintercept = 9,col="red",lty=2) +
theme_bw()
# Dividir en 3 clusters
#La asignacion de cada elemento(mes) a cada cluster
<- cutree(res.hc, k = 3)
grp grp
## Ene Feb Mar Abr May Jun Ju! Ago Set Oct Nov Dic.
## 1 2 2 2 1 3 3 3 3 1 1 1
#cluster1:
#enero,mayo,octubre,noviembre y diciembre
#cluster2:
#febrero,marzo,abril
#cluster3:
#junio,julio,agosto,setiembre
DEDONGRAMA
visualizacion de los 3 cluster:
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_dend(res.hc, k=3, cex = 0.5,
k_colors = rainbow(3), # Colores del arco iris
color_labels_by_k = TRUE,
rect=T)
CONCLUSION DEL DENDOGRAMA:
estiage(fujo bajo del rio):
junio,julio,agosto y setiembre
transicion(incremento o disminucion del flujo del rio):
octubre, noviembre , diciembre , enero y mayo
avenida(flujo alto de rio):
febrero, marzo y abril.
En nuestro dendograma concluimos que los meses de transicion son octubre, noviembre , diciembre , enero y mayo son meses que esta en un ritmo de cambio o bien sube el nivel del agua del rio o bien baja el nivel del agua del rio,es decir para que el nivel del agua del rio sea de flujo alto(avenida),en los meses previos como enero,diciembre,noviembre,octubre tuvo que aumentar de poco a poco el nivel del agua hasta que febrero,marzo y abril (periodo flujo del rio es alto),luego llegando al mes de mayo comienza a disminuir el nivel del agua de rio rimac este es el mes transicion, despues en los meses posteriores junio,julio,agosto y setiembre el nivel flujo del rio es bajo.
#conclusion del tesista:
#estiaje:
#mayo,junio,julio, agosto, setiembre y octubre
#transicion(generan cambios inesperados o esperados):
#noviembre, diciembre y enero
#avenida:
#febrero, marzo y abril.
GRAFICA#ACP con CLUSTER
GRAFICO 1
#Se puede apreciar que con 2 componentes retenemos 83.8% de la inercia total
library(factoextra)
fviz_cluster(list(data = datosc, cluster = grp),
palette =c("#DB1515", "#3722BF", "#D41AC4") ,
ellipse.type = "convex", # Concentration ellipse
repel = T, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_bw())
Insumo para un modelo predictivo como regresion lineal
# Juntando el archivo de "datos" con la columna de "cluster"
<- cbind(datosc,grp) datos.j
#convirtiendo en factor la varaible "grp"
$grp <- factor(datos.j$grp)
datos.j
#Si deseamos exportar :
# write.csv(datos.j,"Compras con Jerarquico Aglomerativo.csv")
Analisis de componenentes principales:
En las variables(24)
ANALISIS EXPLORATORIO :
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
ggcorr(datosc)
#Se puede observar que entre las 24 variables,
#hay correlaciones muy altas , correlaciones altas y correlaciones medias.
#esto podria traer problemas de multicolinealidad.
Prueba de Esfericidad de Bartlett
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
<- corr.test(datosc) # se crea la matriz de correlaciones
correlaciones#correlaciones$r # existe correlaciones entre las variables
library(rela)
<-as.matrix(correlaciones$r)
roptions(scipen=999)
<-dim(datosc) ;n n
## [1] 12 24
cortest.bartlett(r,nrow(datosc))
## Warning in log(detR): Se han producido NaNs
## $chisq
## [1] NaN
##
## $p.value
## [1] NaN
##
## $df
## [1] 276
#¿Por que sucede esto?
#Puede ser que nuestras variables estan altamente correlacionadas,
#verficamos la determinante de la matriz correlacion de las variables.
det(correlaciones$r)
## [1] -0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001650829
#si la determinante de la matriz correlacion es muy
#pequeña pero no es cero indica que mis variables
#estan altamente intercorrelaciones.
#https://www.uv.es/ceaces/multivari/factorial/matriz.htm
# Prueba de Esfericidad de Bartlett
#Prueba de Esfericidad de Bartlett
#Ho: |Rp|=1 (las correlaciones teóricas entre cada par de variables es nulo)
#H1: |Rp|≠1 (las correlaciones teóricas entre cada par de variables NO es nulo)
#conclusion:
#p-valor < 0.05 ,
#se rechaza la H0, se puede afirmar que las las correlaciones
#teóricas entre cada par de variables NO es nulo.
#en otras palabras nuestra matriz correlacion es diferente
# a la matriz identidad podemos realizar analisis de componentes principales.
Indicador Kaiser-Meyer-Olkinn KMO y MSA
library(psych)
KMO(datosc)
## Error in solve.default(r) :
## sistema es computacionalmente singular: número de condición recíproco = 2.02895e-19
## matrix is not invertible, image not found
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = datosc)
## Overall MSA = 0.5
## MSA for each item =
## Caud Temp pH Turb CE OD SD Akal DI Cls so N03 N02 PO Cu Al
## 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
## Fe Mu Pb Cd Zn As Colo Cole
## 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
#la advetencia que sale significa que mis variables
#estan altamente correlacionadas
#Por otro lado el indicador "kmo" es superior igual 0.5
#que indica que puedo trabajar con todas
#las 24 variables
3.2Análisis de Componentes Principales con el paquete ade4
CORROBORANDO LA GRAFICA 1
¿se podra explicar con 2 componentes todas las 24 variables ?
vamos a comprobar:
En el Grafico 1, se podia apreciar que
con 2 componentes(retiene 83.8% de la inercia total)
se podria explicar todas las 24 variables.
¿Cuantos componentes?
library(ade4)
<- dudi.pca(datosc,scannf=FALSE,nf=ncol(datosc))
acp summary(acp)
## Class: pca dudi
## Call: dudi.pca(df = datosc, scannf = FALSE, nf = ncol(datosc))
##
## Total inertia: 24
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 17.7541 2.3548 1.3683 0.9189 0.5800
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 73.976 9.812 5.701 3.829 2.417
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 73.98 83.79 89.49 93.32 95.73
##
## (Only 5 dimensions (out of 11) are shown)
Podemos observar que con 2 componenetes retenemos 83.79 % de la inercia total
Podemos observar que con 3 componenetes retenemos 89.49 % de la inercia total
Podemos observar que con 4 componenetes retenemos 93.32 % de la inercia total
Podemos observar que con 5 componenetes retenemos 95.73 % de la inercia total
CRITERIO DE LA MEDIA
# Valores propios
#el criterio de la media:
$eig acp
## [1] 17.75412281 2.35476144 1.36828719 0.91885927 0.58004727 0.40691705
## [7] 0.24251967 0.16344726 0.11008407 0.06970343 0.03125052
#estamos trabajando con la matriz correlacion cada variable deberia retener
#1% de la inercia total , nos podemos quedar hasta con 3 componenetes(89.49% inercia total)
#pero tambien con 2 componentes se retiene 83.79% (inercia total)
# Grafica de Valores propios - ScreePlot
#El primer componente retiene 74% de la inercia total
#El segundo componete retiene 9.8% de la inercia total
#El tercer componente retiene 5.7% de la inercia total
fviz_eig(acp, addlabels=TRUE, hjust = -0.3,
barfill="white", barcolor ="darkblue",
linecolor ="red") + ylim(0,80) + theme_minimal()
Conclusion:
Con 2 componentes podemos explicar todas las 24 variables reteniendo 83.79% % de la inercia total
#Por eso que en la GRAFICA 1 , la agrupacion de los meses en 3 cluster
#se explica 83.79% (inercia total).
inertia.dudi(acp)
## Inertia information:
## Call: inertia.dudi(x = acp)
##
## Decomposition of total inertia:
## inertia cum cum(%)
## Ax1 17.75412 17.75 73.98
## Ax2 2.35476 20.11 83.79
## Ax3 1.36829 21.48 89.49
## Ax4 0.91886 22.40 93.32
## Ax5 0.58005 22.98 95.73
## Ax6 0.40692 23.38 97.43
## Ax7 0.24252 23.63 98.44
## Ax8 0.16345 23.79 99.12
## Ax9 0.11008 23.90 99.58
## Ax10 0.06970 23.97 99.87
## Ax11 0.03125 24.00 100.00
ANALISIS DE COMPONENTES PRINCIPALES
Con 2 componentes principales
<- dudi.pca(datosc,scannf=FALSE,nf=2)
acp summary(acp)
## Class: pca dudi
## Call: dudi.pca(df = datosc, scannf = FALSE, nf = 2)
##
## Total inertia: 24
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 17.7541 2.3548 1.3683 0.9189 0.5800
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 73.976 9.812 5.701 3.829 2.417
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 73.98 83.79 89.49 93.32 95.73
##
## (Only 5 dimensions (out of 11) are shown)
¿Como estan agrupadas las variables?
Nos basamos del criterio de las correlaciones
# Correlaciones entre las variables y los componentes
#acp$c1 vectores propios
$co[c(1,2)] acp
## Comp1 Comp2
## Caud -0.9856905 -0.01901796
## Temp -0.8575730 0.34464942
## pH 0.1718367 0.32044552
## Turb -0.9346113 -0.23625366
## CE 0.9441237 -0.27906809
## OD -0.2805474 -0.66047211
## SD 0.9217281 -0.33148387
## Akal 0.9013802 -0.30784486
## DI 0.9190383 -0.32601318
## Cls 0.7834060 -0.44555826
## so 0.9720223 -0.12524082
## N03 0.8933136 -0.39175400
## N02 0.8656142 -0.26140158
## PO 0.9171172 0.02090579
## Cu -0.9478302 -0.27917688
## Al -0.9482153 -0.21768133
## Fe -0.9559193 -0.19131422
## Mu -0.9553130 -0.27329191
## Pb -0.9570670 -0.17625217
## Cd -0.6493169 -0.55943616
## Zn -0.8225078 -0.45618080
## As -0.9213033 -0.15271183
## Colo -0.8002671 0.02046972
## Cole -0.7701392 -0.05606211
componente1:#FACTORES DE NO AIREACION
caudal temp Turb CE SD Akal Di Cls so NO3 NO2 PO Cu Al Fe Mu Pb Cd Zn As Colo Cole
componente2:# FACTORES DE AIREACION
OD pH
Un análisis realizados en los tanques de aireación para asegurar condiciones ideales, los dos parámetros más importantes son el pH y el oxígeno disuelto (OD) El pH en tanques de aireación debe estar entre 6.5 a 8.5 para evitar el estrés en las colonias microbianas, y permitirles una actividad
https://www.hannacolombia.com/aqua/blog/item/midiendo-ph-y-od-en-tanques-de-aireacion-de-aguas-residuales#:~:text=Adem%C#3%A1s%20de%20una%20variedad%20de,microbianas%2C%20y%20permitirles%20una%20actividad
GRAFICA 2
library(factoextra)
fviz_pca_var(acp, col.var="steelblue")+theme_minimal()
#podemos observar que todos las variables estan asociados mas a la dimension1(componente1),
#excepto las variables "pH" y "OD" que pertenecen a la dimension2(componente2) pero
#con la matriz de correlacion ya determinamos la variable "pH" y "OD" pertenece a la dimension2.
VARIABLES DE AIRIACION (PH Y OD ),a medida que aumenta la variable “PH” de manera inversamente proporcional la variable “OD” disminuye (estan muy relacionados).
VARIABLES DE NO AIRIACION, a medida que aumentan las variables(caudal,temperatura(temp),turbidez(Turb), cobre(Cu),aluminio(Al),Hierro(Fe),Manganeso(Mn),Plomo(Pb),cadmio(Cd),Zinc(Zn),Arsenico(As), Coliformes totales(CoTo),Coliformes termotolerables(Cote) de forma inversamente proporcional disminuye las variables(Coductividad electrica(CE),Solidos Disuelto(SD),Alcalinidad(Akal),Dureza total(DI),cloruros(cls) ,sulfatos(so),nitratos(NO3),nitritos(NO2),fosfatos(PO))
Por ejemplo con la variable “Alcalinidad(Akal)”
Una alta alcalinidad(Akal)
por ejemplo a una alta alcalinidad(Akal) tambien afectara de manera directa a las variables (Coductividad electrica(CE),Solidos Disuelto(SD) ,Dureza total(DI),cloruros(cls),sulfatos(so),nitratos(NO3),nitritos(NO2),fosfatos(PO)) y tambien afectara de manera inversamente inversamente proporcional a las variables (caudal,temperatura(temp),turbidez(Turb),cobre(Cu),aluminio(Al),Hierro(Fe),Manganeso(Mn), Plomo(Pb),cadmio(Cd),Zinc(Zn),Arsenico(As),Coliformes totales(CoTo),Coliformes termotolerables(Cote) .
¿Si aumenta la cantidad de plomo(Pb) en el rio rimac ,afectara sobre en la Alcalinidad(AKal) ?
Si aumenta la concentracion de plomo(Pb) afectara a la Alcalinidad(Akal) de manera negativa es decir disminuye la concentracion de alcalinidad.
#biplot
library(factoextra)
fviz_pca_biplot(acp, repel = F,
col.var = "steelblue",
col.ind = "black" )
###indicadores
En los meses de Marzo y febrero esta asociado
SCORES
Insumo para modelos predictivos como regresion lineal
# Scores o Puntuaciones de cada individuo
#10 primeros
$li[1:10,] acp
## Axis1 Axis2
## Ene -1.127415 1.2241429
## Feb -7.321424 -1.5374149
## Mar -8.892270 -1.2061457
## Abr -3.864966 2.5559978
## May 1.653208 -0.3952227
## Jun 3.526615 -1.9367091
## Ju! 3.869064 -1.6735475
## Ago 3.572872 -1.2874593
## Set 2.750543 -0.5237799
## Oct 2.683794 1.3317449