Se llevó a cabo un análisis exploratorio de datos en el set de datos train, con el fin de analizar las variables observadas según el género que es el interés central de nuestro trabajo. Con esto se pretende analizar de manera descriptiva algún patrón de asociación entre variables discriminadas según el sexo.
inicialmente creamos un directorio de trabajo
##directorio de trabajo##
setwd("C:/Users/HP/Desktop/blackfriday")
list.files()
## [1] "Prueba técnica - Data Scientist.docx"
## [2] "Prueba_tecnica_luisgamarra.Rmd"
## [3] "PruebaTécnicaDataScientist.Rmd"
## [4] "scrip.R"
## [5] "test.csv"
## [6] "trabajo.docx"
## [7] "train.csv"
Luego importamos los datos a R
library(tidyverse)
## -- Attaching packages ---------------------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.1 v purrr 0.3.2
## v tibble 2.1.3 v dplyr 0.8.3
## v tidyr 1.0.0 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts ------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
datostest<-read_csv("test.CSV")
## Parsed with column specification:
## cols(
## User_ID = col_double(),
## Product_ID = col_character(),
## Gender = col_character(),
## Age = col_character(),
## Occupation = col_double(),
## City_Category = col_character(),
## Stay_In_Current_City_Years = col_character(),
## Marital_Status = col_double(),
## Product_Category_1 = col_double(),
## Product_Category_2 = col_double(),
## Product_Category_3 = col_double()
## )
datostrain<-read_csv("train.csv")
## Parsed with column specification:
## cols(
## User_ID = col_double(),
## Product_ID = col_character(),
## Gender = col_character(),
## Age = col_character(),
## Occupation = col_double(),
## City_Category = col_character(),
## Stay_In_Current_City_Years = col_character(),
## Marital_Status = col_double(),
## Product_Category_1 = col_double(),
## Product_Category_2 = col_double(),
## Product_Category_3 = col_double(),
## Purchase = col_double()
## )
Los datos faltantes generan conflicto a la hora de analizar nuestros datos, ya sea dicho análisis exploratorio o un análisis mediante un modelo probabilístico.
###comprobar datos faltantes train##
sapply(datostrain, function(x) sum(is.na(x)))
## User_ID Product_ID
## 0 0
## Gender Age
## 0 0
## Occupation City_Category
## 0 0
## Stay_In_Current_City_Years Marital_Status
## 0 0
## Product_Category_1 Product_Category_2
## 0 173638
## Product_Category_3 Purchase
## 383247 0
###comprobar datos faltantes test##
sapply(datostest, function(x) sum(is.na(x)))
## User_ID Product_ID
## 0 0
## Gender Age
## 0 0
## Occupation City_Category
## 0 0
## Stay_In_Current_City_Years Marital_Status
## 0 0
## Product_Category_1 Product_Category_2
## 0 72344
## Product_Category_3
## 162562
Posterior mente realizamos un resumen de todas las variables, con el fin de conocer sus propiedades estadísticas o posibles errores que eventualmente puedan surgir.
summary(datostrain)
## User_ID Product_ID Gender
## Min. :1000001 Length:550068 Length:550068
## 1st Qu.:1001516 Class :character Class :character
## Median :1003077 Mode :character Mode :character
## Mean :1003029
## 3rd Qu.:1004478
## Max. :1006040
##
## Age Occupation City_Category
## Length:550068 Min. : 0.000 Length:550068
## Class :character 1st Qu.: 2.000 Class :character
## Mode :character Median : 7.000 Mode :character
## Mean : 8.077
## 3rd Qu.:14.000
## Max. :20.000
##
## Stay_In_Current_City_Years Marital_Status Product_Category_1
## Length:550068 Min. :0.0000 Min. : 1.000
## Class :character 1st Qu.:0.0000 1st Qu.: 1.000
## Mode :character Median :0.0000 Median : 5.000
## Mean :0.4097 Mean : 5.404
## 3rd Qu.:1.0000 3rd Qu.: 8.000
## Max. :1.0000 Max. :20.000
##
## Product_Category_2 Product_Category_3 Purchase
## Min. : 2.00 Min. : 3.0 Min. : 12
## 1st Qu.: 5.00 1st Qu.: 9.0 1st Qu.: 5823
## Median : 9.00 Median :14.0 Median : 8047
## Mean : 9.84 Mean :12.7 Mean : 9264
## 3rd Qu.:15.00 3rd Qu.:16.0 3rd Qu.:12054
## Max. :18.00 Max. :18.0 Max. :23961
## NA's :173638 NA's :383247
summary(datostest)
## User_ID Product_ID Gender
## Min. :1000001 Length:233599 Length:233599
## 1st Qu.:1001527 Class :character Class :character
## Median :1003070 Mode :character Mode :character
## Mean :1003029
## 3rd Qu.:1004477
## Max. :1006040
##
## Age Occupation City_Category
## Length:233599 Min. : 0.000 Length:233599
## Class :character 1st Qu.: 2.000 Class :character
## Mode :character Median : 7.000 Mode :character
## Mean : 8.085
## 3rd Qu.:14.000
## Max. :20.000
##
## Stay_In_Current_City_Years Marital_Status Product_Category_1
## Length:233599 Min. :0.0000 Min. : 1.000
## Class :character 1st Qu.:0.0000 1st Qu.: 1.000
## Mode :character Median :0.0000 Median : 5.000
## Mean :0.4101 Mean : 5.277
## 3rd Qu.:1.0000 3rd Qu.: 8.000
## Max. :1.0000 Max. :18.000
##
## Product_Category_2 Product_Category_3
## Min. : 2.00 Min. : 3.00
## 1st Qu.: 5.00 1st Qu.: 9.00
## Median : 9.00 Median :14.00
## Mean : 9.85 Mean :12.67
## 3rd Qu.:15.00 3rd Qu.:16.00
## Max. :18.00 Max. :18.00
## NA's :72344 NA's :162562
Se observa que varias variables como el ID o la ocupación de los compradores aparecen como variables cuantitativas, lo cual es un error; con el comando fix podemos corregir dichos inconvenientes ya que mediante esta opción se puede cambiar la clasificación de la variable.
fix(datostrain)
fix(datostest)
summary(datostrain)
## User_ID Product_ID Gender
## Length:550068 Length:550068 Length:550068
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Age Occupation City_Category
## Length:550068 Length:550068 Length:550068
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Stay_In_Current_City_Years Marital_Status Product_Category_1
## Length:550068 Length:550068 Length:550068
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Product_Category_2 Product_Category_3 Purchase
## Length:550068 Length:550068 Min. : 12
## Class :character Class :character 1st Qu.: 5823
## Mode :character Mode :character Median : 8047
## Mean : 9264
## 3rd Qu.:12054
## Max. :23961
summary(datostest)
## User_ID Product_ID Gender
## Length:233599 Length:233599 Length:233599
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
## Age Occupation City_Category
## Length:233599 Length:233599 Length:233599
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
## Stay_In_Current_City_Years Marital_Status Product_Category_1
## Length:233599 Length:233599 Length:233599
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
## Product_Category_2 Product_Category_3
## Length:233599 Length:233599
## Class :character Class :character
## Mode :character Mode :character
Con los resúmenes el anterior problema queda solucionado.
##Extraccion de las variables categoricas para el analisis grafico##
User_ID<-as.factor(datostrain$User_ID)
Gender<-as.factor(ifelse(datostrain$Gender=='M',"Masculino","Femenino"))
Occupation<-as.factor(datostrain$Occupation)
Product_ID<-as.factor(datostrain$Product_ID)
Marital_Status<-as.factor(ifelse(datostrain$Marital_Status==1,"Casado","Soltero"))
Age<-as.factor(datostrain$Age)
City_Category<-as.factor(datostrain$City_Category)
Stay_In_Current_City_Years<-as.factor(datostrain$Stay_In_Current_City_Years)
Product_Category_1<-as.factor(datostrain$Product_Category_1)
Product_Category_2<-as.factor(datostrain$Product_Category_2)
Product_Category_3<-as.factor(datostrain$Product_Category_3)
##variables continuas##
Purchase<-as.numeric(datostrain$Purchase)
A partir de los anteriores vectores construiremos dataframes pertinentes para en análisis grafico de los datos según el sexo.
#Frecuencia de ocupaciones segun el género#
ocupacion=data.frame(table(Occupation ,Gender))##data frame para ocupación##
##Resumen##
table(Occupation ,Gender)
## Gender
## Occupation Femenino Masculino
## 0 18112 51526
## 1 17984 29442
## 10 4003 8927
## 11 1500 10086
## 12 3469 27710
## 13 1498 6230
## 14 6763 20546
## 15 2390 9775
## 16 4107 21264
## 17 3929 36114
## 18 230 6392
## 19 2017 6444
## 2 8629 17959
## 20 8811 24751
## 3 7919 9731
## 4 17836 54472
## 5 2220 9957
## 6 8160 12195
## 7 10028 49105
## 8 361 1185
## 9 5843 448
##graficos##
ggplot(data=ocupacion, aes(x=Occupation, y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Genero') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia de ocupaciones segun el género")
En los hombres las ocupaciones 0,17, 4 y 7 son las mas frecuentes; en mujeres la 0, 1, 4 son las mas frecuentes.
#Frecuencia de intervalos de edades segun el género#
edad=data.frame(table(Age ,Gender))##data frame para ocupación##
##Resumen##
table(Age ,Gender)
## Gender
## Age Femenino Masculino
## 0-17 5083 10019
## 18-25 24628 75032
## 26-35 50752 168835
## 36-45 27170 82843
## 46-50 13199 32502
## 51-55 9894 28607
## 55+ 5083 16421
##graficos##
ggplot(data=edad, aes(x=Age, y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Edad') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia de edades segun el género")
En hombres los intervalos de edad más frecuentes son 18-25, 26-35 y 36-45, en mujeres son las mismas que en los hombres.
#Frecuencia de categoria de ciudades segun el género#
categoria=data.frame(table(City_Category ,Gender))##data frame para ocupación##
##Resumen##
table(City_Category ,Gender)
## Gender
## City_Category Femenino Masculino
## A 35704 112016
## B 57796 173377
## C 42309 128866
##graficos##
ggplot(data=categoria, aes(x=City_Category, y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Categoria de ciudad') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia de categoría de ciudad segun el género")
La categoría de ciudad más frecuente en hombres es la B, luego la C, lo mismo ocurre con las mujeres, quizás esta variable no tenga un buen poder discriminatorio.
#Frecuencia Anos de permanencia en la ciudad segun el género#
permanencia=data.frame(table(Stay_In_Current_City_Years ,Gender))##data frame para ocupación##
##Resumen##
table(Stay_In_Current_City_Years ,Gender)
## Gender
## Stay_In_Current_City_Years Femenino Masculino
## 0 17063 57335
## 1 51298 142523
## 2 24332 77506
## 3 24520 70765
## 4+ 18596 66130
##graficos##
ggplot(data=permanencia, aes(x=Stay_In_Current_City_Years, y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Anos de permanencia en la ciudad') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia Anos de permanencia en la ciudad segun el género")
El comportamiento de esta variable de años de permanencia en la ciudad es muy similar en ambos sexos.
#Frecuencia estados civiles segun el género#
estado=data.frame(table(Marital_Status ,Gender))##data frame para ocupación##
##Resumen##
table(Marital_Status ,Gender)
## Gender
## Marital_Status Femenino Masculino
## Casado 56988 168349
## Soltero 78821 245910
##graficos##
ggplot(data=estado, aes(x=Marital_Status , y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Estado Civil') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia estados civiles segun el género")
en ambos sexos el estado civil más frecuente es el soltero.
#Frecuencia productos de la categoria 1 segun el género#
categoria1=data.frame(table(Product_Category_1 ,Gender))##data frame para ocupación##
##Resumen##
table(Product_Category_1 ,Gender)
## Gender
## Product_Category_1 Femenino Masculino
## 1 24831 115547
## 10 1162 3963
## 11 4739 19548
## 12 1532 2415
## 13 1462 4087
## 14 623 900
## 15 1046 5244
## 16 2402 7426
## 17 62 516
## 18 382 2743
## 19 451 1152
## 2 5658 18206
## 20 723 1827
## 3 6006 14207
## 4 3639 8114
## 5 41961 108972
## 6 4559 15907
## 7 943 2778
## 8 33558 80367
## 9 70 340
##graficos##
ggplot(data=categoria1, aes(x=Product_Category_1 , y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Categoria 1') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia de productos de la categoria 1 segun el género")
A pesar de que las mismas categorías de productos son las más frecuentes en ambos sexos el orden de frecuencias no es la misma.
#Frecuencia productos de la categoria 2 segun el género#
categoria2=data.frame(table(Product_Category_2 ,Gender))##data frame para ocupación##
##Resumen##
table(Product_Category_2 ,Gender)
## Gender
## Product_Category_2 Femenino Masculino
## 10 736 2307
## 11 2754 11380
## 12 1744 3784
## 13 2669 7862
## 14 19693 35415
## 15 6432 31423
## 16 9496 33759
## 17 2484 10836
## 18 478 2292
## 2 9199 40018
## 3 617 2267
## 4 7619 18058
## 5 6155 20080
## 6 3291 13175
## 7 137 489
## 8 16529 47559
## 9 1497 4196
##graficos##
ggplot(data=categoria2, aes(x=Product_Category_2 , y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Categoria 2') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia de productos de la categoria 2 segun el género")
Esta variable de categoría de producto 2 parece ser una buena opción para discriminar, al igual que la variable categoría 1, ya que sus valores más frecuentes son diferentes en los sexos.
#Frecuencia productos de la categoria 3 segun el género#
categoria3=data.frame(table(Product_Category_3 ,Gender))##data frame para ocupación##
##Resumen##
table(Product_Category_3 ,Gender)
## Gender
## Product_Category_3 Femenino Masculino
## 10 414 1312
## 11 334 1471
## 12 2722 6524
## 13 1229 4230
## 14 5623 12805
## 15 4610 23403
## 16 6774 25862
## 17 3738 12964
## 18 880 3749
## 3 95 518
## 4 433 1442
## 5 4297 12361
## 6 828 4062
## 8 2941 9621
## 9 2676 8903
##graficos##
ggplot(data=categoria3, aes(x=Product_Category_3 , y=Freq,fill=Gender)) +
geom_bar(stat="identity", position="dodge")+ scale_fill_manual("Genero",values = c("Masculino"= "black","Femenino"="blue"))+
labs(x = 'Categoria 3') +
labs(y = 'Frecuencia') +
ggtitle("Frecuencia de productos de la categoria 3 segun el género")
Esta variable de categoría de producto 3 parece ser una buena opción para discriminar, al igual que la variable categoría 1 y 2, ya que sus valores más frecuentes son diferentes en los sexos.A pesar de que las mismas categorías de productos son las más frecuentes en ambos sexos el orden de frecuencias no es la misma.
Antes de correr el análisis tome la decisión de eliminar los datos faltantes y no eliminar las dos variables con tenían este inconveniente, de las dos formas se pierde información, sin embargo el modelo logístico podría verse afectado en gran medida en su poder clasificatorio de individuos al ser estas variables potenciales variables con diferencias por género.
##conjunto de datos sin datos faltantes train##
datostrain2 <- datostrain[!is.na(datostrain$Product_Category_2),]
datostrain2 <- datostrain2[!is.na(datostrain2$Product_Category_3),]
summary(datostrain2)
## User_ID Product_ID Gender
## Length:166821 Length:166821 Length:166821
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Age Occupation City_Category
## Length:166821 Length:166821 Length:166821
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Stay_In_Current_City_Years Marital_Status Product_Category_1
## Length:166821 Length:166821 Length:166821
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Product_Category_2 Product_Category_3 Purchase
## Length:166821 Length:166821 Min. : 185
## Class :character Class :character 1st Qu.: 7869
## Mode :character Mode :character Median :11756
## Mean :11658
## 3rd Qu.:15626
## Max. :23959
##conjunto de datos sin datos faltantes test##
datostest2 <- datostest[!is.na(datostest$Product_Category_2),]
datostest2 <- datostest2[!is.na(datostest2$Product_Category_3),]
summary(datostest2)
## User_ID Product_ID Gender
## Length:71037 Length:71037 Length:71037
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
## Age Occupation City_Category
## Length:71037 Length:71037 Length:71037
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
## Stay_In_Current_City_Years Marital_Status Product_Category_1
## Length:71037 Length:71037 Length:71037
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
## Product_Category_2 Product_Category_3
## Length:71037 Length:71037
## Class :character Class :character
## Mode :character Mode :character
para el trabajo de machine learning es claro que se va a trabajar con un algoritmo supervisado y trabajaremos modelos de clasificación ya que la variable de interés es categórica; específicamente se trabajara una regresión logística debido a que es especial para variables de interés o dependiente (y) dicotómicas. En los análisis anteriores mencionamos que se trabajarían en esta fase 2 sets de datos, uno de entrenamiento (train) y otro de prueba (test). Por lo tanto una vez obtenido el modelo o el algoritmo de clasificación con los datos train, probaremos los datos test en el modelo ajustado, y observaremos su desempeño.
##Modelo de clasificación con datos de entrenamiento sin datos faltantes##
##etiquetar los resultados de la variable genero como 1 y 0##
datostrain2$Gender <- factor(datostrain2$Gender,levels = c("M","F"),labels = c("1", "0"))
Aprendizaje<- glm(Gender ~Age+Occupation+City_Category+Stay_In_Current_City_Years+Marital_Status+Product_Category_1+Product_Category_2+Product_Category_3 , datostrain2, family = binomial(link="logit"))
summary(Aprendizaje)
##
## Call:
## glm(formula = Gender ~ Age + Occupation + City_Category + Stay_In_Current_City_Years +
## Marital_Status + Product_Category_1 + Product_Category_2 +
## Product_Category_3, family = binomial(link = "logit"), data = datostrain2)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.5956 -0.7295 -0.5753 -0.3567 2.8493
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.451106 0.119786 -3.766 0.000166 ***
## Age18-25 -0.630830 0.054102 -11.660 < 2e-16 ***
## Age26-35 -0.746872 0.053879 -13.862 < 2e-16 ***
## Age36-45 -0.594042 0.054874 -10.826 < 2e-16 ***
## Age46-50 -0.399837 0.057825 -6.915 4.69e-12 ***
## Age51-55 -0.706676 0.059132 -11.951 < 2e-16 ***
## Age55+ -0.754900 0.064031 -11.790 < 2e-16 ***
## Occupation1 0.526159 0.024872 21.154 < 2e-16 ***
## Occupation10 -0.317283 0.058372 -5.436 5.46e-08 ***
## Occupation11 -0.834332 0.056598 -14.741 < 2e-16 ***
## Occupation12 -0.983892 0.036673 -26.829 < 2e-16 ***
## Occupation13 -0.326728 0.063643 -5.134 2.84e-07 ***
## Occupation14 -0.102359 0.031720 -3.227 0.001251 **
## Occupation15 -0.381789 0.045662 -8.361 < 2e-16 ***
## Occupation16 -0.551684 0.037008 -14.907 < 2e-16 ***
## Occupation17 -1.100959 0.033920 -32.458 < 2e-16 ***
## Occupation18 -2.233634 0.129251 -17.281 < 2e-16 ***
## Occupation19 -0.070257 0.052481 -1.339 0.180659
## Occupation2 0.312357 0.030528 10.232 < 2e-16 ***
## Occupation20 0.100323 0.029399 3.413 0.000644 ***
## Occupation3 0.961197 0.033347 28.824 < 2e-16 ***
## Occupation4 -0.015846 0.025173 -0.629 0.529036
## Occupation5 -0.532791 0.048520 -10.981 < 2e-16 ***
## Occupation6 0.706952 0.032298 21.888 < 2e-16 ***
## Occupation7 -0.536803 0.026982 -19.895 < 2e-16 ***
## Occupation8 -0.069428 0.104916 -0.662 0.508130
## Occupation9 3.813864 0.098167 38.851 < 2e-16 ***
## City_CategoryB 0.014184 0.015790 0.898 0.369031
## City_CategoryC 0.082444 0.016760 4.919 8.70e-07 ***
## Stay_In_Current_City_Years1 0.149604 0.020075 7.452 9.17e-14 ***
## Stay_In_Current_City_Years2 0.063854 0.022375 2.854 0.004320 **
## Stay_In_Current_City_Years3 0.118042 0.022648 5.212 1.87e-07 ***
## Stay_In_Current_City_Years4+ -0.001541 0.023766 -0.065 0.948299
## Marital_Status1 0.039614 0.013571 2.919 0.003512 **
## Product_Category_110 0.081859 0.066896 1.224 0.221073
## Product_Category_111 0.152559 0.063745 2.393 0.016700 *
## Product_Category_112 0.739195 0.174957 4.225 2.39e-05 ***
## Product_Category_113 0.397854 0.076029 5.233 1.67e-07 ***
## Product_Category_115 0.103529 0.253418 0.409 0.682885
## Product_Category_12 0.270130 0.033774 7.998 1.26e-15 ***
## Product_Category_13 0.458805 0.046964 9.769 < 2e-16 ***
## Product_Category_14 0.402208 0.041020 9.805 < 2e-16 ***
## Product_Category_15 0.366383 0.024645 14.866 < 2e-16 ***
## Product_Category_16 0.044848 0.040767 1.100 0.271283
## Product_Category_18 0.414952 0.034611 11.989 < 2e-16 ***
## Product_Category_211 -0.226499 0.072892 -3.107 0.001888 **
## Product_Category_212 -0.010887 0.089249 -0.122 0.902915
## Product_Category_213 -0.089440 0.076429 -1.170 0.241903
## Product_Category_214 0.136404 0.070652 1.931 0.053528 .
## Product_Category_215 -0.350711 0.071227 -4.924 8.49e-07 ***
## Product_Category_216 -0.381303 0.121723 -3.133 0.001733 **
## Product_Category_22 -0.170564 0.068209 -2.501 0.012398 *
## Product_Category_23 -0.466092 0.104643 -4.454 8.42e-06 ***
## Product_Category_24 -0.114991 0.077168 -1.490 0.136186
## Product_Category_25 -0.118687 0.070430 -1.685 0.091956 .
## Product_Category_26 -0.381790 0.069964 -5.457 4.84e-08 ***
## Product_Category_28 -0.113639 0.063812 -1.781 0.074939 .
## Product_Category_29 -0.331708 0.080540 -4.119 3.81e-05 ***
## Product_Category_311 -0.304427 0.097705 -3.116 0.001835 **
## Product_Category_312 -0.126205 0.080745 -1.563 0.118049
## Product_Category_313 -0.120370 0.081995 -1.468 0.142100
## Product_Category_314 0.122163 0.076548 1.596 0.110510
## Product_Category_315 -0.447446 0.075579 -5.920 3.21e-09 ***
## Product_Category_316 -0.242341 0.075961 -3.190 0.001421 **
## Product_Category_317 -0.382615 0.079068 -4.839 1.30e-06 ***
## Product_Category_318 -0.433827 0.084958 -5.106 3.28e-07 ***
## Product_Category_33 -0.481313 0.138082 -3.486 0.000491 ***
## Product_Category_34 -0.008696 0.084114 -0.103 0.917661
## Product_Category_35 -0.139931 0.078512 -1.782 0.074703 .
## Product_Category_36 -0.403305 0.086012 -4.689 2.75e-06 ***
## Product_Category_38 -0.072274 0.078784 -0.917 0.358946
## Product_Category_39 -0.214293 0.079272 -2.703 0.006866 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 178032 on 166820 degrees of freedom
## Residual deviance: 162019 on 166749 degrees of freedom
## AIC: 162163
##
## Number of Fisher Scoring iterations: 5
Se observa que casi todas las variables son estadísticamente significativas, por lo que tienen un efecto la variable de respuesta (Genero); el estado civil y otras categorías de las variables como ocupación y edad también resultan no ser estadísticamente significativas, cabe recordar que R lo que hace es crear variables de diseño para aquellas variables categóricas, por lo cual cada categoría queda como una variable de diseño o dummy, y es acá justamente donde se hace más claro a lo que me refiero con que algunas categorías de las variables resultan no ser significativas.
En anterior resumen se observan las estimaciones de máxima verosimilitud de los coeficientes del modelos, llamémoslos betas, es con estos coeficientes que vamos a hacer predicciones del género y a observar el poder de predicción de nuestro algoritmo.
Miremos un poco el poder de predicción del modelo ajustado probando el conjunto de datos test y mediante una matrix de conflicto observar la tasa de error.
##Clasificacion de los individuos de el set de datos test en el modelo construido Aprendizaje##
##etiquetar los resultados de la variable genero como 1 y 0##
datostest2$Gender <- factor(datostest2$Gender,levels = c("M","F"),labels = c("1", "0"))
Prediccion <- round(predict(Aprendizaje, newdata =datostest2, type = "response"))
MC <- data.frame(table(datostest2[, "Gender"],Prediccion)) # Matriz de Confusión
names (MC) = c("Valor verdadero","Prediccion","Conteo")
MC
Se observa que las predicciones hechas por el modelo no son tan eficientes, como propuesta a mejorarlo sería ir sacando aquellas variables y categorías de variables que no tienen significancia estadística, a continuación se mostrara una medida de desempeño tanto en los datos train como el los datos test.
##Promedio de predicciones en los datos de test##
logit.predictions1 <- ifelse(Prediccion > 0, 1, 0)
mean(with(datostest2, logit.predictions1 ==Gender))
## [1] 0.2161972
#Promedio de predicciones en los datos del test##
logit.predictions <- ifelse(predict(Aprendizaje) > 0, 1, 0)
mean(with(datostrain2, logit.predictions ==Gender))
## [1] 0.2144634
Lo anterior quiere decir que mi modelo solo acertó aproximadamente el 21% de las predicciones en ambos sets de datos (train y test). la tasa de falsos negativos es alto y a diferencia de la de falsos positivos que es aproximadamente del 8%, es decir el modelo es bueno prediciendo en elgrupo de mujeres.
library(ROCR)
## Loading required package: gplots
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
grocr <- prediction(as.numeric(logit.predictions1), as.numeric(datostest2$Gender))
datos <- performance(grocr, "tpr", "fpr")
plot(datos)
del grafico anterior se puede inferir que el modelo no posee un buen rendimiento,como ya habiamos mencionado anteriormente, la line trazada esta muy cerca a la linea diagonal, lo cualquiere decir que esta dejando muchos puntos por debajo de la diagonal, es decir los esta clasificando mal.