class: center, middle, inverse, title-slide .title[ # Evaluación 2: ] .subtitle[ ## Herramientas de an analisis de datos y bases de modelamiento II ] .author[ ### Alejandro Mendez Miranda ] --- # Pregunta 1 Una Regresion logistica simple, regresion logistica multiple con y sin variables dummies (clase 10). Para esta pregunta se utilizarĆ”n las siguiente librerĆa. ```r set.seed(1) library(tidyverse) #Lectura de datos ``` El dataset utilizado es el llamado Eucalyptus, disponibilizado en el siguiente link de [Kaggle](https://www.kaggle.com/datasets/ishadss/eucalyptus). Este dataset fue utilizado en un reporte denominado *Machine Learning Applied to Fourteen Agricultural Datasets* de *Kristen Thomson y Robert J.McQueen*. Este set de datos se utilizó para determinar que especies son las mejores para la conservación de suelos. ```r datos1 <- read_csv("dataset_194_eucalyptus.csv", na = c("?", "NA")) ``` ``` ## Rows: 736 Columns: 20 ## -- Column specification -------------------------------------------------------- ## Delimiter: "," ## chr (6): Abbrev, Locality, Map_Ref, Latitude, Sp, Utility ## dbl (14): Rep, Altitude, Rainfall, Frosts, Year, PMCno, DBH, Ht, Surv, Vig, ... ## ## i Use `spec()` to retrieve the full column specification for this data. ## i Specify the column types or set `show_col_types = FALSE` to quiet this message. ``` --- # Pregunta 1 Los datos de este dataset son los siguientes: ```r head(datos1) ``` ``` ## # A tibble: 6 x 20 ## Abbrev Rep Locality Map_Ref Latitude Altitude Rainfall Frosts Year Sp ## <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> ## 1 Cra 1 Central_Ha~ N135_3~ 39__38 100 850 -2 1980 co ## 2 Cra 1 Central_Ha~ N135_3~ 39__38 100 850 -2 1980 fr ## 3 Cra 1 Central_Ha~ N135_3~ 39__38 100 850 -2 1980 ma ## 4 Cra 1 Central_Ha~ N135_3~ 39__38 100 850 -2 1980 nd ## 5 Cra 1 Central_Ha~ N135_3~ 39__38 100 850 -2 1980 ni ## 6 Cra 1 Central_Ha~ N135_3~ 39__38 100 850 -2 1980 ob ## # ... with 10 more variables: PMCno <dbl>, DBH <dbl>, Ht <dbl>, Surv <dbl>, ## # Vig <dbl>, Ins_res <dbl>, Stem_Fm <dbl>, Crown_Fm <dbl>, Brnch_Fm <dbl>, ## # Utility <chr> ``` --- #Pregunta 1 Las variables son: .pull-left[ * Abbrev - site abbreviation - enumerated * Rep - site rep - integer * Locality - site locality in the North Island - enumerated * Map_Ref - map location in the North Island - enumerated * Latitude - latitude approximation - enumerated * Altitude - altitude approximation - integer * Rainfall - rainfall (mm pa) - integer * Frosts - frosts (deg. c) - integer * Year - year of planting - integer ] .pull-right[ * Sp - species code - enumerated * PMCno - seedlot number - integer * DBH - best diameter base height (cm) - real * Ht - height (m) - real * Surv - survival - integer * Vig - vigour - real * Ins_res - insect resistance - real * Stem_Fm - stem form - real * Crown_Fm - crown form - real * Brnch_Fm - branch form - real Class: * Utility - utility rating - enumerated ] --- # Pregunta 1 Para realizar la regresión logĆstica simple solo se seleccionaron las siguientes variables: * Ht - height (m) - real * Utility - utility rating - enumerated `Ht` o altura es una variable continua, pero `Utility` es una variable que tiene las categorĆas `none, low, average, best, good`. Esta variable `Utility` la usaremos a predecir.Para simplificar el problema se convirtió en dos categorĆas `none, low, average` `\(\rightarrow\)` `0` y `good, best` `\(\rightarrow\)` `1`. Para ello se utilizó el siguiente código, donde reemplazamos los valores mencionados anteriormente al filtrarlos en el dataset. ```r datos1$Utility[datos1$Utility == "none"] <- 0 datos1$Utility[datos1$Utility == "average"] <- 0 datos1$Utility[datos1$Utility == "low"] <- 0 datos1$Utility[datos1$Utility == "best"] <- 1 datos1$Utility[datos1$Utility == "good"] <- 1 datos1$Utility <- as.integer(datos1$Utility) datos1$Ht <- as.numeric(datos1$Ht) ``` AdemĆ”s en las Ćŗltimas dos lineas se transformó las variables a un tipo de dato utilizable al momento de realizar la regresión logĆstica. --- #Pregunta 1 El dataset contiene valores `NA` por lo que se optó por eliminar las filas que las contuvieran. Primero se cuenta la cantidad de datos, luego la cantidad de NA en el dataset, luego se eliminan los NA y se vuelve a contar la cantidad de datos. ```r length(datos1$DBH) ``` ``` ## [1] 736 ``` ```r sum(is.na(datos1)) ``` ``` ## [1] 448 ``` ```r datos1 <- datos1 %>% drop_na() sum(is.na(datos1)) ``` ``` ## [1] 0 ``` ```r length(datos1$DBH) ``` ``` ## [1] 641 ``` Son menos de 100 datos los que se eliminan, por lo que se dejó esta propuesta por sobre otra metodologĆa. --- # Pregunta 1 A continuación se realiza la regresión logĆstica utilizando la función `gml` y considerando un modelo tipo `Utility~Ht`. Al agregar el parĆ”metro `family = binomial` seƱalamos que se realice una regresión logĆstica. ```r modelo1 <- glm(Utility~Ht, datos1, family = binomial) summary(modelo1) ``` ``` ## ## Call: ## glm(formula = Utility ~ Ht, family = binomial, data = datos1) ## ## Deviance Residuals: ## Min 1Q Median 3Q Max ## -2.7944 -0.8048 -0.4405 0.9441 2.0395 ## ## Coefficients: ## Estimate Std. Error z value Pr(>|z|) ## (Intercept) -3.25856 0.28187 -11.56 <2e-16 *** ## Ht 0.34807 0.03001 11.60 <2e-16 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## (Dispersion parameter for binomial family taken to be 1) ## ## Null deviance: 886.24 on 640 degrees of freedom ## Residual deviance: 676.09 on 639 degrees of freedom ## AIC: 680.09 ## ## Number of Fisher Scoring iterations: 4 ``` --- # Pregunta 1 Del código generamos un modelo tipo $$ y = \frac{e^{-3.25856 + 0.34807Ht}}{1 + e^{-3.25856 + 0.34807Ht}}$$ Ahora, para analizar si el modelo es estadĆsticamente significativo, se utiliza el código visto en clases. ```r dif_res <- modelo1$null.deviance - modelo1$deviance gdl <- modelo1$df.null - modelo1$df.residual valor_p <- pchisq(dif_res, gdl, lower.tail = F) valor_p ``` ``` ## [1] 1.275768e-47 ``` El anĆ”lisis estadĆstico da cuenta que el modelo es significativo. --- # Pregunta 1 Si realizamos el grĆ”fico como vimos en clases obtenemos ```r plot(Utility~Ht, datos1, col = "darkblue",main = "Modelo", ylab = "P(Utility=1|Ht)", xlab = "Ht", pch = "I") curve(predict(modelo1, data.frame(Ht = x), type = "response"), col = "firebrick", lwd = 2.5, add = TRUE) ``` <img src="tarea3_files/figure-html/unnamed-chunk-9-1.png" style="display: block; margin: auto;" /> --- # Pregunta 1 Finalmente para evaluar el modelo de manera simple, analizamos que tan acertado fue en las predicciones. Las predicciones en forma de probabilidad se guardaron en la variable `predicted1`. Se eligió como humbral de predicción el valor 0.5, por lo tanto, si la probabilidad es sobre 0.5 se obtendrĆ” la categorĆa `1`, en caso contrario la categorĆa serĆ” `0`, estos resultados se guardaron nuevamente en la variable `predicted`. Finalmente se agregaron estos valores al dataset y se mostró la tabla de predicciones ```r predicted1 <- predict(modelo1, datos1[c("Ht", "Abbrev")], type = "response") predicted1[1:5] ``` ``` ## 1 2 3 4 5 ## 0.5518663 0.5250572 0.2697075 0.5102837 0.6209615 ``` ```r predicted1 <- ifelse(predicted1 > 0.5, 1, 0) predicted1[1:5] ``` ``` ## 1 2 3 4 5 ## 1 1 0 1 1 ``` ```r datos1$prediction1 <- predicted1 ``` --- # Pregunta 1 ```r table(datos1$prediction1, datos1$Utility) ``` ``` ## ## 0 1 ## 0 268 94 ## 1 72 207 ``` El acierto de las predicciones fue: ```r misclasificerror <- mean(predicted1 != datos1$Utility) print(paste('Accuracy', 1-misclasificerror)) ``` ``` ## [1] "Accuracy 0.741029641185647" ``` --- # Pregunta 1.1 Ahora, para realizar la regresión logĆstica mĆŗltiple con variables dummy se adicionó una variable categórica. Por lo demĆ”s, el proceso es prĆ”cticamente el mismo al anterior. La variable agregada es: * Abbrev - site abbreviation - enumerated ```r datos <- read_csv("dataset_194_eucalyptus.csv", na = c("?", "NA")) datos$Utility[datos$Utility == "none"] <- "bad" datos$Utility[datos$Utility == "average"] <- "bad" datos$Utility[datos$Utility == "low"] <- "bad" datos$Utility[datos$Utility == "best"] <- "good" datos$Utility[datos$Utility == "good"] <- "good" ``` Pero ahora las variables a predecir no serĆ”n numĆ©ricas, serĆ”n factores. --- # Pregunta 1.1 ```r datos$Utility <- as.factor(datos$Utility) datos$Abbrev <- as.factor(datos$Abbrev) datos$Ht <- as.numeric(datos$Ht) ``` Pero ahora las variables a predecir no serĆ”n numĆ©ricas, serĆ”n factores. AdemĆ”s se transformó las variables segĆŗn correspondĆa. ```r unique(datos$Abbrev) ``` ``` ## [1] Cra Cly Nga Wai K81 Wak K82 WSp K83 Lon Puk Paw K81a Mor Wen ## [16] WSh ## Levels: Cly Cra K81 K81a K82 K83 Lon Mor Nga Paw Puk Wai Wak Wen WSh WSp ``` Son los valores Ćŗnicos de la variable `Abbrev` --- # Pregunta 1.1 Se eliminan los valores NA y se genera el modelo. ```r datos <- datos %>% drop_na() modelo <- glm(Utility~Ht + Abbrev, datos, family = binomial) summary(modelo) ``` ``` ## ## Call: ## glm(formula = Utility ~ Ht + Abbrev, family = binomial, data = datos) ## ## Deviance Residuals: ## Min 1Q Median 3Q Max ## -2.8237 -0.6738 -0.1767 0.7328 2.3815 ## ## Coefficients: ## Estimate Std. Error z value Pr(>|z|) ## (Intercept) -4.11096 0.57242 -7.182 6.88e-13 *** ## Ht 0.57071 0.04868 11.723 < 2e-16 *** ## AbbrevK81 0.90097 0.52202 1.726 0.084361 . ## AbbrevK81a -1.47994 0.60397 -2.450 0.014272 * ## AbbrevK82 -1.86762 0.65401 -2.856 0.004295 ** ## AbbrevK83 -1.97633 0.59361 -3.329 0.000871 *** ## AbbrevLon 0.18439 0.52840 0.349 0.727121 ## AbbrevNga -0.36726 0.67923 -0.541 0.588714 ## AbbrevPaw -1.90291 0.62122 -3.063 0.002190 ** ## AbbrevPuk -0.85021 0.51475 -1.652 0.098598 . ## AbbrevWai -2.01639 0.54910 -3.672 0.000240 *** ## AbbrevWak -1.86034 0.53032 -3.508 0.000452 *** ## AbbrevWSh -0.99061 1.27879 -0.775 0.438550 ## AbbrevWSp -3.98577 0.66065 -6.033 1.61e-09 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## (Dispersion parameter for binomial family taken to be 1) ## ## Null deviance: 886.24 on 640 degrees of freedom ## Residual deviance: 571.64 on 627 degrees of freedom ## AIC: 599.64 ## ## Number of Fisher Scoring iterations: 5 ``` --- # Pregunta 1.1 Se muestran los coeficientes por separado ```r modelo$coefficients ``` ``` ## (Intercept) Ht AbbrevK81 AbbrevK81a AbbrevK82 AbbrevK83 ## -4.1109621 0.5707063 0.9009728 -1.4799372 -1.8676220 -1.9763261 ## AbbrevLon AbbrevNga AbbrevPaw AbbrevPuk AbbrevWai AbbrevWak ## 0.1843883 -0.3672587 -1.9029100 -0.8502058 -2.0163854 -1.8603388 ## AbbrevWSh AbbrevWSp ## -0.9906071 -3.9857730 ``` --- # Pregunta 1.1 Al igual que antes se evanlĆŗa el modelo. ```r predicted <- predict(modelo, datos[c("Ht", "Abbrev")], type = "response") predicted <- ifelse(predicted > 0.5, "good", "bad") datos$prediction <- predicted table(datos$prediction, datos$Utility) ``` ``` ## ## bad good ## bad 274 67 ## good 66 234 ``` Y se obtiene la precisión. ```r misclasificerror2 <- mean(predicted != datos$Utility) print(paste('Accuracy', 1-misclasificerror2)) ``` ``` ## [1] "Accuracy 0.792511700468019" ``` Que es mayor al modelo anterior con solo una variable. --- # Pregunta 1.2 Ahora, para realizar la regresión logĆstica mĆŗltiple sin variables dummy se adicionó la variable `DBH`. * DBH - best diameter base height (cm) - real Por lo demĆ”s, el proceso es prĆ”cticamente el mismo al anterior ```r datos2 <- read_csv("dataset_194_eucalyptus.csv", na = c("?", "NA")) datos2$Utility[datos2$Utility == "none"] <- "bad" datos2$Utility[datos2$Utility == "average"] <- "bad" datos2$Utility[datos2$Utility == "low"] <- "bad" datos2$Utility[datos2$Utility == "best"] <- "good" datos2$Utility[datos2$Utility == "good"] <- "good" ``` Las variables a predecir no serĆ”n numĆ©ricas, serĆ”n factores. AdemĆ”s se transformó las variables segĆŗn corresponda. --- # Pregunta 1.2 ```r datos2$Utility <- as.factor(datos2$Utility) datos2$DBH <- as.numeric(datos2$DBH) datos2$Ht <- as.numeric(datos2$Ht) ``` A diferencia de antes, ahora tenemos dos variables numĆ©ricas que ayudarĆ”n a predecir una variable categórica. --- # Pregunta 1.2 Se eliminan los valores NA y se genera el modelo. ```r datos2 <- datos2 %>% drop_na() modelo2 <- glm(Utility~Ht + DBH, datos2, family = binomial) summary(modelo2) ``` ``` ## ## Call: ## glm(formula = Utility ~ Ht + DBH, family = binomial, data = datos2) ## ## Deviance Residuals: ## Min 1Q Median 3Q Max ## -2.7732 -0.7923 -0.4221 0.9046 2.1056 ## ## Coefficients: ## Estimate Std. Error z value Pr(>|z|) ## (Intercept) -3.22036 0.28379 -11.348 < 2e-16 *** ## Ht 0.25620 0.04191 6.113 9.79e-10 *** ## DBH 0.05607 0.01932 2.903 0.0037 ** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## (Dispersion parameter for binomial family taken to be 1) ## ## Null deviance: 886.24 on 640 degrees of freedom ## Residual deviance: 666.74 on 638 degrees of freedom ## AIC: 672.74 ## ## Number of Fisher Scoring iterations: 10 ``` --- # Pregunta 1.2 Se muestran los coeficientes por separado ```r modelo2$coefficients ``` ``` ## (Intercept) Ht DBH ## -3.22035932 0.25619575 0.05606956 ``` --- # Pregunta 1.2 Al igual que antes se evanlĆŗa el modelo. ```r predicted2 <- predict(modelo2, datos2[c("Ht", "DBH")], type = "response") predicted2 <- ifelse(predicted2 > 0.5, "good", "bad") datos2$prediction <- predicted2 table(datos2$prediction, datos2$Utility) ``` ``` ## ## bad good ## bad 272 93 ## good 68 208 ``` Y se obtiene la precisión. ```r misclasificerror3 <- mean(predicted2 != datos2$Utility) print(paste('Accuracy', 1-misclasificerror3)) ``` ``` ## [1] "Accuracy 0.748829953198128" ``` --- # Pregunta 1.2 Si comparamos los 3 modelos ```r print(paste('Accuracy', 1-misclasificerror)) #Simple ``` ``` ## [1] "Accuracy 0.741029641185647" ``` ```r print(paste('Accuracy', 1-misclasificerror2)) #Multiple + Dummy ``` ``` ## [1] "Accuracy 0.792511700468019" ``` ```r print(paste('Accuracy', 1-misclasificerror3))#Multiple sin dummy ``` ``` ## [1] "Accuracy 0.748829953198128" ``` Al utilizar las variables Dummy se encuentra el mejor modelo. --- # Pregunta 2 Para realizar el anĆ”lisis de clusters se utilizó el mismo dataset y la librerĆa `factoextra`. ```r library(factoextra) datos2 <- read_csv("dataset_194_eucalyptus.csv", na = c("?", "NA")) ``` Pero solo se seleccionaron las variables continuas y una categórica. Estas columnas van de la 10 a la 19. Estas se muestran en pantalla utilizando la función `colnames(datos2)`. ```r datos2 <- datos2[10:19] colnames(datos2) ``` ``` ## [1] "Sp" "PMCno" "DBH" "Ht" "Surv" "Vig" ## [7] "Ins_res" "Stem_Fm" "Crown_Fm" "Brnch_Fm" ``` La columna `Sp` contiene la abreviación de la especie. Al igual que antes, se siguió el mismo procedimiento para eliminar los datos `NA`. ```r datos2 <- datos2 %>% drop_na() length(datos2$DBH) ``` ``` ## [1] 641 ``` --- # Pregunta 2 Para asegurar la normalización de los datos se realizó antes del anĆ”lisis de clusters. Para ello se utilizó un ciclo `for` donde a cada columna, exceptuando la variable con datos categóricos. Para aquello utilizamos la función `mutate_at` junto con el operador pipe `>%>`, donde uno seƱalando la columna puede aplicar transformaciones, en este caso se escala y se transforma en un vector. ```r for (i in colnames(datos2)) { if (i != "Sp") {datos2 <- datos2 %>% mutate_at(c(i), ~(scale(.) %>% as.vector)) } } head(datos2) ``` ``` ## # A tibble: 6 x 10 ## Sp PMCno DBH Ht Surv Vig Ins_res Stem_Fm Crown_Fm Brnch_Fm ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 co -0.841 -0.0370 0.205 -0.638 0.929 0.150 0.718 1.07 0.838 ## 2 fr -0.898 -0.0402 0.131 0.979 1.42 1.38 0.718 0.397 0.195 ## 3 ma -1.11 -0.0419 -0.616 -0.315 -0.748 -0.464 0.0168 0.397 0.195 ## 4 nd -0.709 -0.0392 0.0907 0.332 0.633 0.150 0.438 1.07 0.838 ## 5 ni 0.143 -0.0394 0.399 0.979 0.929 -0.219 0.438 -0.272 0.195 ## 6 ob -0.837 -0.0379 0.755 0.332 1.92 1.38 2.82 1.07 2.12 ``` --- # Pregunta 2 Como son muchos datos se utilizó la media de los valores. Es por esto que el anĆ”lisis de clusters se realizarĆ” sobre la media de cada especie almacenadas en la variable `Sp`. Para ello primero agrupamos los datos segĆŗn la especie con la función `group_by`, para luego calcular la media utilizando la función `summarize_at`, la cual recibe las variables a calcular y el nombre con que quedarĆ” la columna. ```r datos2 <- datos2 %>% group_by(Sp) %>% summarise_at(vars(c(PMCno, DBH, Ht, Surv, Vig, Ins_res, Stem_Fm, Crown_Fm, Brnch_Fm)), list(meanval = mean)) head(datos2) ``` ``` ## # A tibble: 6 x 10 ## Sp PMCno_meanval DBH_meanval Ht_meanval Surv_meanval Vig_meanval ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 ag -1.58 -0.0439 -0.818 -0.881 -1.07 ## 2 am 0.0935 -0.0371 0.443 -0.0191 0.0307 ## 3 br -0.520 -0.0437 -0.700 0.712 -0.554 ## 4 bxs -1.55 -0.0422 -0.552 0.241 -0.203 ## 5 co -0.0993 -0.0386 0.317 -0.0498 0.0879 ## 6 cr -1.31 -0.0386 0.201 0.321 0.122 ## # ... with 4 more variables: Ins_res_meanval <dbl>, Stem_Fm_meanval <dbl>, ## # Crown_Fm_meanval <dbl>, Brnch_Fm_meanval <dbl> ``` --- # Pregunta 2 Para graficar el dendograma se transforman los datos al tipo data.frame de R para cambiar el nombre de los Ćndices con los nombres de la columna `Sp` utilizando la función `row.names()`. Como `Sp` es la primera columna y ya se utilizó, se filtra al usar `datos[2:10]`. Se seleccionaron 3 clusters para agregarlos al dendograma en la función `hcut` en el parĆ”metro `k`. ```r datos2 <- data.frame(datos2) row.names(datos2) <- datos2$Sp datos2 <- datos2[2:10] centers = 3 dend3 <- hcut(datos2, k = centers) dend3 ``` ``` ## ## Call: ## stats::hclust(d = x, method = hc_method) ## ## Cluster method : ward.D2 ## Distance : euclidean ## Number of objects: 25 ``` Ya que la función `hcut` solo computa el dendograma, se debe graficar. --- # Pregunta 2 Para graficarlo se utiliza la función `fviz_dend`. ```r fviz_dend(dend3, k_colors = c("red", "blue", "green")) ``` <img src="tarea3_files/figure-html/unnamed-chunk-33-1.png" style="display: block; margin: auto;" /> --- # Pregunta 2 Para realizar el cómputo de los clusters con el algoritmo k-means se utiliza la función `kmeans`, donde se agrega la cantidad de clusters. Para graficarlo se utiliza la función `fviz_cluster`. ```r CA <- kmeans(datos2, centers = centers) fviz_cluster(CA, data = datos2) ``` <img src="tarea3_files/figure-html/unnamed-chunk-34-1.png" style="display: block; margin: auto;" /> --- # Pregunta 3 Nuevamente se utilizarĆ” el mismo dataset. ```r library(tidyverse) datos.pca <- read_csv("dataset_194_eucalyptus.csv", na = c("?", "NA")) ``` Ahora se seleccionarĆ”n las variables continuas, pero la variable categórica serĆ” `Utility`, el mismo que usamos para la regresión logĆstica. AdemĆ”s, se eliminan los datos NA. ```r datos.pca$Utility[datos.pca$Utility == "none"] <- "bad" datos.pca$Utility[datos.pca$Utility == "average"] <- "bad" datos.pca$Utility[datos.pca$Utility == "low"] <- "bad" datos.pca$Utility[datos.pca$Utility == "best"] <- "good" datos.pca$Utility[datos.pca$Utility == "good"] <- "good" datos.pca$Utility <- as.factor(datos.pca$Utility) datos.pca <- datos.pca[11:20] datos.pca <- datos.pca %>% drop_na() length(datos.pca$DBH) ``` ``` ## [1] 641 ``` --- # Pregunta 3 Para esta pregunta se utilizarĆ” la librerĆa `FactoMineR`, para utilizar el algoritmo de cĆ”lculo de PCA y para realizar los grĆ”ficos. La función `PCA` calcula PCA, para ello entregamos las variables continuas como `datos.pca[1:9]`, especificamos que normalice los datos en el parĆ”metro `scale.unit = TRUE`, `ncp = 9` es para especificar cuantos componentes se calcularĆ”n y `graph = F` evita que realice el grĆ”fico. ```r library(FactoMineR) euca.pca <- PCA(X = datos.pca[1:9], scale.unit = TRUE, ncp = 9, graph = F) ``` --- # Pregunta 3 Podemos obtener los valores propios para estimar el porcentaje de explicabilidad de cada componente. Para ello utilizamos la función `get_eigenvalue`. ```r eig.val <- get_eigenvalue(euca.pca) eig.val ``` ``` ## eigenvalue variance.percent cumulative.variance.percent ## Dim.1 2.7147227 30.163585 30.16359 ## Dim.2 1.8096953 20.107725 50.27131 ## Dim.3 1.1565639 12.850710 63.12202 ## Dim.4 1.0107184 11.230204 74.35222 ## Dim.5 0.8600824 9.556472 83.90870 ## Dim.6 0.6274665 6.971850 90.88055 ## Dim.7 0.3485748 3.873054 94.75360 ## Dim.8 0.2546750 2.829722 97.58332 ## Dim.9 0.2175010 2.416678 100.00000 ``` --- # Pregunta 3 Con la función `fviz_eig` visualizamos la explicabilidad de cada componente. ```r fviz_eig(euca.pca, addlabels = TRUE, ylim = c(0, 50)) ``` <img src="tarea3_files/figure-html/unnamed-chunk-39-1.png" style="display: block; margin: auto;" /> --- # Pregunta 3 Para visualizar las variables que mĆ”s aportan a la componente 1 se utiliza la función `fviz_contrib`, con `choice = "var"` especificamos que muestre en tĆ©rmino de las variables, `axes = 1` para seƱalar que sea la primera componente y `top = 10` para mostrar las primeras 10 variables. ```r fviz_contrib(euca.pca, choice = "var", axes = 1, top = 10) ``` <img src="tarea3_files/figure-html/unnamed-chunk-40-1.png" style="display: block; margin: auto;" /> --- # Pregunta 3 Lo mismo para la componente 2. ```r fviz_contrib(euca.pca, choice = "var", axes = 2, top = 10) ``` <img src="tarea3_files/figure-html/unnamed-chunk-41-1.png" style="display: block; margin: auto;" /> --- # Pregunta 3 Lo mismo para la componente 3. ```r fviz_contrib(euca.pca, choice = "var", axes = 3, top = 10) ``` <img src="tarea3_files/figure-html/unnamed-chunk-42-1.png" style="display: block; margin: auto;" /> --- # Pregunta 3 Lo mismo para la suma de las 3 componentes. ```r fviz_contrib(euca.pca, choice = "var", axes = 1:3, top = 10) ``` <img src="tarea3_files/figure-html/unnamed-chunk-43-1.png" style="display: block; margin: auto;" /> --- # Pregunta 3 .pull-left[ Para visualizar los vectores de las variables en las dos componentes que mĆ”s explican los datos, utilizamos la función `fviz_pca_var`. ```r p3 <- fviz_pca_var(euca.pca, col.var = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07") ) ``` ] .pull-right[ ```r p3 ``` <!-- --> ] --- # Pregunta 3 .pull-left[ Ahora, si agregamos los valores utilizados, separados por la variable `Utility` y utilizando la función `fviz_pca_ind` obtenemos. ```r p2 <- fviz_pca_ind(euca.pca, geom.ind = "point", col.ind = datos.pca$Utility, addEllipses = TRUE, legend.title = "Groups" ) ``` ] .pull-right[ ```r p2 ``` <!-- --> ] --- # Pregunta 3 .pull-left[ Si combinamos todo y utilizando la función `fviz_pca_biplot`. ```r p1 <- fviz_pca_biplot(euca.pca, col.ind = datos.pca$Utility, palette = "jco", addEllipses = TRUE, label = "var", pointshape = 21, pointsize = 2, geom.ind = "point", fill.ind = datos.pca$Utility, col.var = "black", repel = TRUE, legend.title = "Utility") ``` ] .pull-right[ ```r p1 ``` <!-- --> ]