¿Cual es la cantidad de transacciones fraudulentas y no fraudulentas?. Realiza un diagrama de barras para mostrar sus resultados.
¿Cuanto es el monto total de las transacciones fraudulen- tas? y ¿Cuanto es la media de las transacciones no fraudu- lentas?
Haga un histograma de la variable Amount para las tran- sacciones fraudulentas.Explique una metodologÃa por la cual usted recomendarÃa analizar con mayor profundidad algunas transacciones que se pueden observar en dicho histograma. Fundamente su recomendación. Si usted cree necesario puede también usar un boxplot.
Primero cargamos las librerias necesarias para las resoluciones y anclamos el directorio de trabajo.
library(readxl)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.5
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.7
## v tidyr 1.1.3 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'dplyr' was built under R version 4.0.5
## Warning: package 'stringr' was built under R version 4.0.5
## Warning: package 'forcats' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(dplyr)
library(ggplot2)
Luego de cargar el directorio cargamos la base de datos junto al directorio.
setwd("D:/FELIX INCA SUR/R STUDIO/MACHINE LEARNING MODULO 2")
base <- read.csv("CreditCard_Fraude.csv", header = TRUE)
g1 <- base %>% mutate(Fraude = ifelse(Class==0, "No Fraude", "Si Fraude")) %>%
ggplot(aes(x=Fraude)) + geom_bar() + geom_text(stat= "count", aes(label= ..count..), vjust = -0.5)+
labs(title = "NNumero de Operaciones Segun condicion de Fraude")
g1
base <- base %>% mutate(Fraude = ifelse(Class==0, "No Fraude", "Si Fraude"))
prop.table(table(base$Fraude))
##
## No Fraude Si Fraude
## 0.998272514 0.001727486
Por lo tanto son 2.8 Millones de operaciones que no son Fraude y solo 492 que si son Fraude, lo que equivale al 0.1% de las operaciones.
g2 <- base %>% mutate(Fraude = ifelse(Class==0, "No Fraude", "Si Fraude")) %>%
group_by(Fraude) %>% summarise(Monto = sum(Amount))%>%
ggplot(aes(x=Fraude, y= Monto)) + geom_bar(stat = "identity") +
geom_text(aes(label = Monto), vjust = -0.5)
g2
prop.table(with(base, tapply(Amount, list(Fraude), FUN= sum)))
## No Fraude Si Fraude
## 0.997610422 0.002389578
Por lo tanto el monto de las operaciones que no fraudulentas en esta fecha especifica fue de 25.1 millones y solo 60 mil fueron fraudulentas, las que representan el 0.2% del monto de operaciones.
Primero creamos el histograma de los montos:
base %>% ggplot(aes(Amount))+ geom_histogram(bins = 50)
De la anterior grafica, no se puede distingir adecuadamente los valores extremos y simpelemente se pude determinar que no hay una distribucion normal, sino que es sesgada a la derecha.
base %>% ggplot(aes(X,Amount, color= Fraude)) + geom_point()
Usando un box plot se puede mostrar un resultado mucho mejor.
base %>% ggplot(aes(Fraude, Amount))+ geom_boxplot() + geom_point()
De esta forma se puede hacer un analisis muchisimo mas fino, de la cual podemos obtener que la media y mediana de los montos son:
base %>% summarise(Promedio = mean(Amount), Mediana = median(Amount))
## Promedio Mediana
## 1 88.34962 22
De esta manera se observa que realmente hay un sesgo, dado que el promedio es de 88 um y la mediana de 22, lo que implica este sesgo hacia la derecha, especialmente por montos mayores.
La metodologia a aplicar pra un analisis mas detallado, podria reflejarse en dos partes, uno inferencial a traves de las regresiones logisticas a fin de inferir probabilidades de que exista o no fraude en una operacion y por otra parte un analisis de clusters a fin de identificar los principales factores que pudieran relacionarse y causar que una operacion pueda ser considerada como Fraude.
Este analisis debera estar en funcion a multiples caracteristicas que se puedan identificar en el proceso de identificacion y procesamiento de las operaciones.
Especialmente es necesario poder determinar los movimientos por categorias de montos(estableciendo rangos de montos), los cuales tendran diferente comportamiento, diferente valor esperado por transaccion y menor volatilidad que si se analiza en todo su conjunto.
country: A character variable listing the country by name. democ: The country’s score on the Polity III democracy scale.
Scores range from 0 (least democratic) to 10 (most democra- tic).
sdnew: The U.S. State Department scale of political terror. Scores range from 1 (low state terrorism, fewest violations of
personal integrity) to 5 (highest violations of personal inte- grity).
military: A dummy variable coded 1 for a military regime, 0 otherwise.
gnpcats: Level of per capita GNP in five categories: 1 = under $1000, 2 = $1000– $1999, 3 = $2000–$2999, 4 = $3000–$3999, 5 = over $4000. lpop: Logarithm of national population. civ_war: A dummy variable coded 1 if involved in a civil war, 0 otherwise.
int_war: A dummy variable coded 1 if involved in an interna- tional war, 0 otherwise.
A partir de la data, muestre como responder a las siguientes cuestiones : a) Compare los resultados que obtiene creando un modelo de árbol y un de modelo de bosque aleatorio para predecir la variable gnpcats
###2.1 Carga Previa
Primeramente cargamos la base de datos y las librerias para la solucion del problema
setwd("D:/FELIX INCA SUR/R STUDIO/MACHINE LEARNING MODULO 2")
base2 <- read.table("paises.txt")
###2.2 Arbol Aleatorio
Como primera parte creamos el modelo de arbol aleatorio y como primer paso es necesario poder aleatorizar los datos que usaremos en el modelo.
indice_desordenado <- sample(1:nrow(base2))
base2 <- base2[indice_desordenado,]
Luego pasamos a la limpieza del archivo a fin de eliminar los valores NA
base2_prueba <- na.omit(base2)
base2_prueba$democ <- as.factor(base2_prueba$democ)
base2_prueba$sdnew <- as.factor(base2_prueba$sdnew)
base2_prueba$military <- as.factor(base2_prueba$military)
base2_prueba$gnpcats <- as.factor(base2_prueba$gnpcats)
base2_prueba$civ_war <- as.factor(base2_prueba$civ_war)
base2_prueba$int_war <- as.factor(base2_prueba$int_war)
Una vez limpiado el data set, segmentamos la base en entrenamiento y testeo.
data_train <- base2_prueba %>% sample_frac(0.85)
data_test <- base2_prueba[-c(as.integer(rownames(data_train))), ]
Luego analizamos la distribucion de la variable dependiente en las muestras seleccionadas.
prop.table(table(data_train$gnpcats))
##
## <1000 >4000 1000-1999 2000-2999 3000-3999
## 0.40566038 0.29245283 0.15094340 0.08490566 0.06603774
prop.table(table(data_test$gnpcats))
##
## <1000 >4000 1000-1999 2000-2999 3000-3999
## 0.40540541 0.32432432 0.21621622 0.05405405 0.00000000
Por lo tanto las proporciones tienen un gap del mas-menos 10% en los segementos de aquellos tienen menos de 1000 USD y aquellos que obtienen mas de 4000 USD.
Esto nos podria estar indicando una gran disparidad en los ingresos medios en los extremos de las distribuciones, escencialmnete se podria seguir segmentando estos ingresos a fin de encontrar patrones de simulitud.
Luego pasamos a construir el modelo y cargamos las librerias adecuadas para esta opcion
library(rpart)
## Warning: package 'rpart' was built under R version 4.0.5
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.0.5
Luego aplicamos el modelo del arbol de decision
fit1 <- rpart(formula = gnpcats~democ+sdnew+military+lpop+civ_war+int_war , data = data_train, method = "class")
Despues de ello graficamos el modelo para ver a detalle el arbol de decision.
rpart.plot(x= fit1, extra = 104)
Como se puede observar el modelo no predice los rangos de 2000-2999 y 3000-3999; los cuales pueden estar siendo subestimados en la clasificacion del modelo.
Con el modelo, es necesario predecir la clasificacion del modelo, de acuerdo a los parametros hallados.
Predicciones <- predict(object = fit1 , newdata = data_test, type = "class")
Como medida de eficacia necesitamos construir el indicador de accuracy, para poder compara modelos.
tabla_resumen <- table(data_test$gnpcats, Predicciones)
tabla_resumen
## Predicciones
## <1000 >4000 1000-1999 2000-2999 3000-3999
## <1000 14 1 0 0 0
## >4000 1 11 0 0 0
## 1000-1999 4 2 2 0 0
## 2000-2999 1 0 1 0 0
## 3000-3999 0 0 0 0 0
y el indicador de accuracy es:
Accuracy <- sum(diag(tabla_resumen))/sum(tabla_resumen)
Accuracy*100
## [1] 72.97297
Aplicando hiperparametros para la mejora optima del modelo de arbol de decision:
Mejora_especificacion <- function(modelo){
Predicciones <- predict(object = modelo , newdata = data_test, type = "class")
tabla_resumen <- table(data_test$gnpcats, Predicciones)
Accuracy <- sum(diag(tabla_resumen))/sum(tabla_resumen)
Accuracy
}
Mejora_especificacion(fit1)
## [1] 0.7297297
Y ahora mejorando el accuracy con controles:
controles <- rpart.control(minsplit = 30, minbucket = 3, maxdepth = 10, 0.01)
fit2 <- rpart(formula = gnpcats~democ+sdnew+military+lpop+civ_war+int_war , data = data_train,method = 'class',control = controles)
Accuracy_Arbol_control <- Mejora_especificacion(fit2)
Accuracy_Arbol_control
## [1] 0.7297297
Como podemos observar, los controles no aumentan el accuracy por lo que nos mantenemos con el accuracy del modelo 1(fit1).
###2.3 Modelo de Bosques Aleatorios
Para el modelo es necesario poder tener ya lista la data limpia, caso que ya la tenemos, por lo que al tener ya partida la data en entrenamiento y testeo, solo nos quedaria aplicar el modelo de random forest
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.0.5
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
fit3 <- randomForest(formula = gnpcats~democ+sdnew+military+lpop+civ_war+int_war , data = data_train)
fit3
##
## Call:
## randomForest(formula = gnpcats ~ democ + sdnew + military + lpop + civ_war + int_war, data = data_train)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 48.11%
## Confusion matrix:
## <1000 >4000 1000-1999 2000-2999 3000-3999 class.error
## <1000 32 9 1 1 0 0.2558140
## >4000 8 23 0 0 0 0.2580645
## 1000-1999 14 2 0 0 0 1.0000000
## 2000-2999 4 4 1 0 0 1.0000000
## 3000-3999 3 4 0 0 0 1.0000000
Ahora prediciendo con el modelo:
Prediccion_rf <- predict(object = fit3, newdata = data_test)
Hallando la matriz de confusion del modelo de Random Forest.
library(caret)
## Warning: package 'caret' was built under R version 4.0.5
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
accuracy_random_forest <- caret::confusionMatrix(Prediccion_rf, data_test$gnpcats)
accuracy_random_forest <- accuracy_random_forest$overall[1]
accuracy_random_forest
## Accuracy
## 0.8378378
###2.4 Comparativa de los Modelos
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.0.5
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
Resumen <- data.frame(Accuracy = c(Accuracy, Accuracy_Arbol_control, accuracy_random_forest))
rownames(Resumen) <- c("Accuracy modelo base Arbol", "Modelo Arbol con controles", "Modelo de Bosques Aleatorios")
kable(Resumen)
| Accuracy | |
|---|---|
| Accuracy modelo base Arbol | 0.7297297 |
| Modelo Arbol con controles | 0.7297297 |
| Modelo de Bosques Aleatorios | 0.8378378 |
if(max(Resumen)==Accuracy){
print(paste("El mejor modelo es el Arbol basico con un Accuracy de ",Accuracy))
} else if(max(Resumen)==Accuracy_Arbol_control){
print(paste("El mejor modelo es el Arbol de Decision con Hiperparametros con Accuracy de ",Accuracy_Arbol_control))
} else(
print(paste("El mejor modelo son los Bosques de Aleatorios con Accuracy de ",accuracy_random_forest))
)
## [1] "El mejor modelo son los Bosques de Aleatorios con Accuracy de 0.837837837837838"
## [1] "El mejor modelo son los Bosques de Aleatorios con Accuracy de 0.837837837837838"
: a) Elimine la columna X b) Realice un análisis de datos exploratorio al conjunto de datos.Busque argumentar porque eliminaria las variables bark,root, rootsk y branch
de agrupar este conjunto de datos es en 4 clusters. d) Busque comparar un modelo de tipo árbol y un modelo de tipo bosque aleatorio para la variable species.
Primeramente hacemos una carga de base de datos y librerias para el procesamiento de datos y su respectivo modelamiento
setwd("D:/FELIX INCA SUR/R STUDIO/MACHINE LEARNING MODULO 2")
rf <- read.csv("RainForest.csv", header = TRUE)
Primeros vemos la estructura de la base de datos a fin de determinar la variable a eliminar.
str(rf)
## 'data.frame': 65 obs. of 8 variables:
## $ X : int 27 61 62 63 65 80 81 82 83 84 ...
## $ dbh : int 6 23 20 23 24 5 5 8 10 8 ...
## $ wood : int NA 353 208 445 590 14 10 31 59 30 ...
## $ bark : int NA NA NA NA NA NA NA NA NA NA ...
## $ root : int 6 135 NA NA NA 2 NA NA NA 6 ...
## $ rootsk : num 0.3 13 NA NA NA 2.4 NA NA NA 1 ...
## $ branch : int NA 35 41 50 NA NA NA NA NA 4 ...
## $ species: chr "Acacia mabellae" "Acacia mabellae" "Acacia mabellae" "Acacia mabellae" ...
rf <- rf[,-1]
Viendo y analizando el numero de observaciones con NA.
library(naniar)
## Warning: package 'naniar' was built under R version 4.0.5
vis_miss(rf)
library(SmartEDA)
## Warning: package 'SmartEDA' was built under R version 4.0.5
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(kableExtra)
kable(ExpData(rf, type = 2))
| Index | Variable_Name | Variable_Type | Sample_n | Missing_Count | Per_of_Missing | No_of_distinct_values |
|---|---|---|---|---|---|---|
| 1 | dbh | integer | 65 | 0 | 0.000 | 26 |
| 2 | wood | integer | 64 | 1 | 0.015 | 55 |
| 3 | bark | integer | 4 | 61 | 0.938 | 4 |
| 4 | root | integer | 13 | 52 | 0.800 | 11 |
| 5 | rootsk | numeric | 13 | 52 | 0.800 | 11 |
| 6 | branch | integer | 43 | 22 | 0.338 | 33 |
| 7 | species | character | 65 | 0 | 0.000 | 4 |
Haciendo un analisis con respecto a la variable wood, se puede identificar una relacion postiva con respecto a las otras variables, sin embargo no hay manera de poder concluir al 100% de seguridad esta realcion en las variables que no sean branch, por la insuficiencia de datos por mas del 30% y en algunas mas del 90% de variables perdidas.
ExpNumViz(rf, target ="wood")
## [[1]]
##
## [[2]]
##
## [[3]]
##
## [[4]]
##
## [[5]]
ExpCatViz(rf)
## [[1]]
##
## [[2]]
Por lo tanto, no se puede tomar en consideracion las variables bark,root, rootsk y branch por su falta de consistencia al tener mas de 93%, 80%, 80% y 33% de valores NA.
Primeramente para la implementacion del algoritmo K-mean es necesario limpiar la base de datos:
rf <- rf[,c(1,2,7)]
Ahora aplicamos el modelo K-means:
rf <- na.omit(rf)
rf[,3] <- as.factor(rf[,3])
label_rows <- rownames(rf[,3])
rf <- rf[,-3]
fit4 <- kmeans(x = rf, centers = 4, nstart = 10)
Visualizando el modelo Kmeans
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.0.5
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(object = fit4, data = rf, ellipse.type = 'convex')
Aplicando un scaling a la data.
rf <- scale(rf)
row.names(rf) <- label_rows
fit5 <- kmeans(x = rf, centers = 4, nstart = 10)
fviz_cluster(object = fit5, data = rf, ellipse.type = 'confidence')
Ahora aplicando un modelo de jeraquizacion: Primero cargamos la libreria necesarias
library(tidyverse)
library(factoextra)
Calculamos las distancias euclideans para cada punto.
rf_d <- dist(x= rf, method = "euclidean")
fviz_dist(dist.obj = rf_d)
Ahora con tranquilidad podemos hacer el modelo jerarquico:
cluster_jerarquico <- hclust(d = rf_d,method = "complete")
grafica <- fviz_dend(x = cluster_jerarquico, k= 4,
cex = 0.5,
rect = TRUE,
rect_fill = TRUE,
horiz = FALSE,
palette = 'jco',
rect_border = 'jco',
color_labels_by_k = TRUE)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
grafica
De esta manera, podemos hacer un podado del modelo para especificar de mejor manera el modelo:
sub_grp <- cutree(cluster_jerarquico , k = 4)
fviz_cluster(list(data = rf, cluster = paste0( "Grupo", sub_grp)),
alpha = 1 ,
palette = 'jco',
ellipse.type = "norm")
## Too few points to calculate an ellipse
library(cluster)
## Warning: package 'cluster' was built under R version 4.0.5
hc_divisive <- diana(x = rf, stand = TRUE)
divisivePlot <- fviz_dend(hc_divisive, k = 4,
palette = 'jco')
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
divisivePlot
Ambos modelos no varian de manera significativa sobre la clasificacion de los datos, sin embargo el motodo de jerarquizacion de dendogramas es el mas eficaz.
Armando un modelo de arbol aleatorio.
setwd("D:/FELIX INCA SUR/R STUDIO/MACHINE LEARNING MODULO 2")
rf <- read.csv("RainForest.csv", header = TRUE)
rf <- rf[,-1]
rf <- rf[,c(1,2,7)]
rf[,3] <- as.factor(rf[,3])
rf <- na.omit(rf)
DesorderIndex <- sample(1:nrow(rf))
rf <- rf[DesorderIndex, ]
data_train <- rf %>% sample_frac(0.8)
data_test <- rf[-c(as.integer(rownames(data_train))), ]
library(rpart)
library(rpart.plot)
fit6 <- rpart(formula = species ~ . , data = data_train, method = 'class')
rpart.plot(x = fit6, extra = 106)
## Warning: extra=106 but the response has 4 levels (only the 2nd level is
## displayed)
Mejora_especificacion2 <- function(modelo){
Predicciones <- predict(object = modelo , newdata = data_test, type = "class")
tabla_resumen <- table(data_test$species, Predicciones)
Accuracy <- sum(diag(tabla_resumen))/sum(tabla_resumen)
Accuracy
}
Mejora_especificacion2(fit6)
## [1] 0.4615385
Ahora armando el modelo de bosques aleatorios.
fit7 <- randomForest(formula = species ~ . , data = data_train)
pred <- predict(object = fit7, newdata = data_test)
library(caret)
caret::confusionMatrix(pred, data_test$species)
## Confusion Matrix and Statistics
##
## Reference
## Prediction Acacia mabellae Acmena smithii B. myrtifolia C. fraseri
## Acacia mabellae 5 0 0 0
## Acmena smithii 0 3 0 0
## B. myrtifolia 0 1 1 0
## C. fraseri 1 0 0 2
##
## Overall Statistics
##
## Accuracy : 0.8462
## 95% CI : (0.5455, 0.9808)
## No Information Rate : 0.4615
## P-Value [Acc > NIR] : 0.005275
##
## Kappa : 0.7815
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: Acacia mabellae Class: Acmena smithii
## Sensitivity 0.8333 0.7500
## Specificity 1.0000 1.0000
## Pos Pred Value 1.0000 1.0000
## Neg Pred Value 0.8750 0.9000
## Prevalence 0.4615 0.3077
## Detection Rate 0.3846 0.2308
## Detection Prevalence 0.3846 0.2308
## Balanced Accuracy 0.9167 0.8750
## Class: B. myrtifolia Class: C. fraseri
## Sensitivity 1.00000 1.0000
## Specificity 0.91667 0.9091
## Pos Pred Value 0.50000 0.6667
## Neg Pred Value 1.00000 1.0000
## Prevalence 0.07692 0.1538
## Detection Rate 0.07692 0.1538
## Detection Prevalence 0.15385 0.2308
## Balanced Accuracy 0.95833 0.9545
El modelo de Rain forest es el mejor con un accuracy del 100%, algo muy improbable pero por ser un ejercicio con pocas variables estas se ajustan casi perfectamente.
setwd("D:/FELIX INCA SUR/R STUDIO/MACHINE LEARNING MODULO 2")
base4 <- read.csv("CreditCardDataset.csv", header = TRUE)
Realizando el analisis exploratorio, se obtienen los siguientes resultados.
kable(ExpData(base4, type = 2))
| Index | Variable_Name | Variable_Type | Sample_n | Missing_Count | Per_of_Missing | No_of_distinct_values |
|---|---|---|---|---|---|---|
| 1 | CUST_ID | character | 8950 | 0 | 0.000 | 8950 |
| 2 | BALANCE | numeric | 8950 | 0 | 0.000 | 8871 |
| 3 | BALANCE_FREQUENCY | numeric | 8950 | 0 | 0.000 | 43 |
| 4 | PURCHASES | numeric | 8950 | 0 | 0.000 | 6203 |
| 5 | ONEOFF_PURCHASES | numeric | 8950 | 0 | 0.000 | 4014 |
| 6 | INSTALLMENTS_PURCHASES | numeric | 8950 | 0 | 0.000 | 4452 |
| 7 | CASH_ADVANCE | numeric | 8950 | 0 | 0.000 | 4323 |
| 8 | PURCHASES_FREQUENCY | numeric | 8950 | 0 | 0.000 | 47 |
| 9 | ONEOFF_PURCHASES_FREQUENCY | numeric | 8950 | 0 | 0.000 | 47 |
| 10 | PURCHASES_INSTALLMENTS_FREQUENCY | numeric | 8950 | 0 | 0.000 | 47 |
| 11 | CASH_ADVANCE_FREQUENCY | numeric | 8950 | 0 | 0.000 | 54 |
| 12 | CASH_ADVANCE_TRX | integer | 8950 | 0 | 0.000 | 65 |
| 13 | PURCHASES_TRX | integer | 8950 | 0 | 0.000 | 173 |
| 14 | CREDIT_LIMIT | numeric | 8949 | 1 | 0.000 | 205 |
| 15 | PAYMENTS | numeric | 8950 | 0 | 0.000 | 8711 |
| 16 | MINIMUM_PAYMENTS | numeric | 8637 | 313 | 0.035 | 8636 |
| 17 | PRC_FULL_PAYMENT | numeric | 8950 | 0 | 0.000 | 47 |
| 18 | TENURE | integer | 8950 | 0 | 0.000 | 7 |
vis_miss(base4)
seleccionando las observaciones sin NAs Luego, pasamos a definir el modelo de cluster, para este caso se usara el modelo de de jerarquizacion:
base4 <- na.omit(base4)
row.names(base4) <- base4$CUST_ID
base4 <- base4[,-1]
data_train <- base4 %>% sample_frac(0.6)
data_test <- base4[-c(as.integer(rownames(data_train))), ]
## Warning in `[.data.frame`(base4, -c(as.integer(rownames(data_train))), ): NAs
## introducidos por coerción
base_d <- scale(data_train)
base_dd <- dist(x = base_d, method = "euclidean")
#fviz_dist(dist.obj = base_dd)
Definimos el modelo jerarquico:
hc <- hclust(d = base_dd, method = "complete")
fviz_dend(x = hc, k= 3,
cex = 0.5,
rect = TRUE,
rect_fill = TRUE,
horiz = FALSE,
palette = 'jco',
rect_border = 'jco',
color_labels_by_k = TRUE) -> basic_plot
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
sub_grp <- cutree(hc , k = 3)
fviz_cluster(list(data = data_train, cluster = paste0( "Grupo", sub_grp)),
alpha = 1 ,
palette = 'jco',
ellipse.type = "norm")
data_train %>%
mutate(Cluster = paste0("Grupo ", sub_grp)) %>%
group_by(Cluster) -> cl_Aglo
km.res <- kmeans(x = base_dd, centers = 4, nstart = 10)
fviz_cluster(object = km.res, data = base_dd, ellipse.type = 'confidence')
Analisis descriptivo de los Clusters
ExpNumViz(data = cl_Aglo, target = "Cluster")
## [[1]]
##
## [[2]]
##
## [[3]]
##
## [[4]]
##
## [[5]]
##
## [[6]]
##
## [[7]]
##
## [[8]]
##
## [[9]]
##
## [[10]]
##
## [[11]]
##
## [[12]]
##
## [[13]]
##
## [[14]]
##
## [[15]]
##
## [[16]]
##
## [[17]]