Pregunta 1

  1. Cargue el archivo CreditCard_Fraude.csv en la variable CreditCard. Este archivo posee dos columnas (Amount y class). La primera variable hace referencia a la cantidad de dinero en una transac- ción crediticia. La segunda variable solo posee dos valores (va- riable categórica), cero (0) hace referencia a que la transacción no esta catalogada como fraude y uno (1) cuando la transacción esta catalogada como fraude.Se pide dar respuesta a las siguientes cuestiones :
  1. ¿Cual es la cantidad de transacciones fraudulentas y no fraudulentas?. Realiza un diagrama de barras para mostrar sus resultados.

  2. ¿Cuanto es el monto total de las transacciones fraudulen- tas? y ¿Cuanto es la media de las transacciones no fraudu- lentas?

  3. 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.

1.1 Parte preliminar

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)

1.2 Respuesta a la (i)

  1. ¿Cual es la cantidad de transacciones fraudulentas y no fraudulentas?. Realiza un diagrama de barras para mostrar sus resultados.
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.

1.3 Respuesta a la (ii)

  1. ¿Cuanto es el monto total de las transacciones fraudulen- tas? y ¿Cuanto es la media de las transacciones no fraudu- lentas?
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.

1.4 Respuesta a la (iii)

  1. 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 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.

Pregunta 2

  1. Cargue el archivo paises.txt. Este archivo es un subconjunto de datos del articulo de Poe et al. (1999) sobre derechos humanos. La lista a continuacion explica las variables a estudiar en el idioma original del articulo de investigación :

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"

Pregunta 3

  1. Cargue el archivo de datos llamado RainForest.csv en una varia- ble de tipo dataframe llamada rf y desarrolle los siguientes items

: 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

  1. Implemente un cluster de tipo K-Means y un cluster jerárqui- co para este conjunto de datos . Considere que la mejor forma

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.

3.1 Carga de librerias y datos

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)

3.2 Solucion a la pregunta a

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]

3.2 Solucion a la pregunta b

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.

3.2 Solucion a la pregunta c

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.

3.2 Solucion a la pregunta d

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.

Pregunta 4

  1. Considere el archivo de datos CreditCardDataset.csv.LO que buscamos en este conjunto de datos es segmentar los clientes para poder definir una estrategia de marketing. El conjunto de datos muestra el resumen del comportamiento de uso de menos de 9000 titulares de tarjetas de crédito activos durante los últimos 6 meses del año 2021. El archivo está a nivel de cliente con 18 variables que se usara para la construccion de un modelo de clustering jerárquico. A continuación el cliente nos comparte un Diccionario con los nombres de variables y su significado.
  1. CUSTID : Identification of Credit Card holder (Categorical)
  2. BALANCE : Balance amount left in their account to make purchases (
  3. BALANCEFREQUENCY : How frequently the Balance is updated, score between 0 and 1 (1 = frequently updated, 0 = not frequently updated)
  4. PURCHASES : Amount of purchases made from account
  5. ONEOFFPURCHASES : Maximum purchase amount done in one-go
  6. INSTALLMENTSPURCHASES : Amount of purchase done in installment
  7. CASHADVANCE : Cash in advance given by the user
  8. PURCHASESFREQUENCY : How frequently the Purchases are being made, score between 0 and 1 (1 = frequently purcha- sed, 0 = not frequently purchased)
  9. ONEOFFPURCHASESFREQUENCY : How frequently Pur- chases are happening in one-go (1 = frequently purchased, 0 = not frequently purchased)
  10. PURCHASESINSTALLMENTSFREQUENCY : How fre- quently purchases in installments are being done (1 = fre- quently done, 0 = not frequently done)
  11. CASHADVANCEFREQUENCY : How frequently the cash in advance being paid
  12. CASHADVANCETRX : Number of Transactions made with Çash in Advanced"
  13. PURCHASESTRX : Numbe of purchase transactions made
  14. CREDITLIMIT : Limit of Credit Card for user ñ) PAYMENTS : Amount of Payment done by user
  15. MINIMUM_PAYMENTS : Minimum amount of payments made by user
  16. PRCFULLPAYMENT : Percent of full payment paid by user
  17. TENURE : Tenure of credit card service for user Luego de haber construido el modelo de tipo cluster para este conjunto de datos . Realice un análisis descriptivo de todas las variables para cada cluster obtenido. De esta manera busque describir a cada conjunto de datos que genera el modelo de tipo cluster.
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]]