Cargar librerias
library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
library(pscl)
## Warning: package 'pscl' was built under R version 4.2.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
library(car)
## Warning: package 'car' was built under R version 4.2.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
library(nnet)
## Warning: package 'nnet' was built under R version 4.2.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ purrr::some() masks car::some()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(plotly)
## Warning: package 'plotly' was built under R version 4.2.3
##
## Attaching package: 'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
library(caret)
## Warning: package 'caret' was built under R version 4.2.3
## Loading required package: lattice
##
## Attaching package: 'caret'
##
## The following object is masked from 'package:purrr':
##
## lift
library(dplyr)
Acondicionamiento de los datos
data$Tipo_apuesta <- as.factor(data$Tipo_apuesta)
data <- data %>%
mutate(Apuesta = ifelse(Apuesta == "Si", 1, 0))
data$Edad[is.na(data$Edad)] <- mean(data$Edad, na.rm = TRUE)
data$Estrato[is.na(data$Estrato)] <- mean(data$Estrato, na.rm = TRUE)
data_long <- data %>%
pivot_longer(cols = starts_with("Factores."),
names_to = "Factor",
values_to = "Respuesta")
data_wide <- data_long %>%
mutate(Indicador = 1) %>%
pivot_wider(names_from = Respuesta,
values_from = Indicador,
values_fill = list(Indicador = 0))
colnames(data_wide) <- make.names(colnames(data_wide)
)
data_unique <- data_wide %>%
distinct(ID, .keep_all = TRUE)
colnames(data_unique)
## [1] "ID"
## [2] "Facultad"
## [3] "Programa"
## [4] "Edad"
## [5] "Estrato"
## [6] "Sexo"
## [7] "Apuesta"
## [8] "Frecuencia"
## [9] "Tipo_apuesta"
## [10] "Gasto"
## [11] "Ingresos"
## [12] "Factor"
## [13] "Emoción.y.adrenalina..Busco.la.emoción.y.la.adrenalina.que.proporciona.la.actividad.de.apostar."
## [14] "Entretenimiento..Lo.hago.como.forma.de.entretenimiento.y.diversión."
## [15] "NA."
## [16] "No.tengo.motivos.para.apostar"
## [17] "Ganancias.financieras..Busco.ganancias.financieras.y.la.posibilidad.de.obtener.beneficios.económicos."
## [18] "Conocimiento.del.deporte.o.evento..Me.motiva.el.conocimiento.que.tengo.sobre.el.deporte.o.evento.en.el.que.estoy.apostando."
## [19] "Publicidad.y.promociones..La.publicidad.y.las.promociones.de.las.casas.de.apuestas.me.impulsan.a.participar."
## [20] "Ninguna.de.las.anteriores"
## [21] "Socialización..Participar.en.apuestas.es.una.manera.de.socializar.con.amigos.o.familiares."
## [22] "Influencia.de.amigos.o.familiares..La.influencia.de.amigos.o.familiares.me.motiva.a.realizar.apuestas."
data_unique <- data_unique %>%
select(-Factor)
data_unique <- data_unique %>%
rename(
Emoción_y_adrenalina =Emoción.y.adrenalina..Busco.la.emoción.y.la.adrenalina.que.proporciona.la.actividad.de.apostar.,
Entretenimiento =Entretenimiento..Lo.hago.como.forma.de.entretenimiento.y.diversión.,
Ganancias =Ganancias.financieras..Busco.ganancias.financieras.y.la.posibilidad.de.obtener.beneficios.económicos.,
Conocimiento_deporte =Conocimiento.del.deporte.o.evento..Me.motiva.el.conocimiento.que.tengo.sobre.el.deporte.o.evento.en.el.que.estoy.apostando.,
Publicidad =Publicidad.y.promociones..La.publicidad.y.las.promociones.de.las.casas.de.apuestas.me.impulsan.a.participar.,
Socialización =Socialización..Participar.en.apuestas.es.una.manera.de.socializar.con.amigos.o.familiares.,
Influencia.amigos.familiares =Influencia.de.amigos.o.familiares..La.influencia.de.amigos.o.familiares.me.motiva.a.realizar.apuestas.,
)
vif_model <- lm(Apuesta ~ Edad + Estrato + Facultad + Sexo, data = data_unique)
vif(vif_model)
## GVIF Df GVIF^(1/(2*Df))
## Edad 1.072872 1 1.035795
## Estrato 1.134734 1 1.065239
## Facultad 1.226977 7 1.014718
## Sexo 1.109947 1 1.053540
data_unique$Frecuencia <- as.factor(data_unique$Frecuencia)
Ajustar los niveles de ‘Frecuencia’ con los nombres exactos y
Ajustar el modelo de regresión logística multinomial
## [1] "Diaria"
## [2] "Semanal"
## [3] "Quincenal"
## [4] "Mensual"
## [5] "Raramente (lapsos de mas de un mes entre apuestas)"
## [6] "No apuesta"
## # weights: 60 (45 variable)
## initial value 696.994434
## iter 10 value 260.628499
## iter 20 value 248.406949
## iter 30 value 247.060093
## iter 40 value 247.044538
## final value 247.044479
## converged
## Warning in sqrt(diag(vc)): Se han producido NaNs
## Call:
## multinom(formula = Frecuencia ~ Emoción_y_adrenalina + Entretenimiento +
## Ganancias + Socialización + Influencia.amigos.familiares +
## Conocimiento_deporte + Publicidad + No.tengo.motivos.para.apostar,
## data = data_unique)
##
## Coefficients:
## (Intercept)
## Semanal 0.2789467
## Quincenal 13.0044760
## Mensual 14.6530420
## Raramente (lapsos de mas de un mes entre apuestas) 32.1482367
## No apuesta -6.1108101
## Emoción_y_adrenalina
## Semanal 2.285576
## Quincenal -10.009170
## Mensual -13.267188
## Raramente (lapsos de mas de un mes entre apuestas) -28.459775
## No apuesta -7.253757
## Entretenimiento Ganancias
## Semanal 42.97205 1.512933
## Quincenal 29.88985 -11.212596
## Mensual 28.08713 -13.554307
## Raramente (lapsos de mas de un mes entre apuestas) 11.57276 -29.705769
## No apuesta -5.18355 -22.674181
## Socialización
## Semanal 40.562433
## Quincenal 28.347734
## Mensual -34.161152
## Raramente (lapsos de mas de un mes entre apuestas) 7.594537
## No apuesta -7.318094
## Influencia.amigos.familiares
## Semanal -24.240155
## Quincenal -25.516659
## Mensual 42.165382
## Raramente (lapsos de mas de un mes entre apuestas) 24.670164
## No apuesta -3.844212
## Conocimiento_deporte
## Semanal -44.735411
## Quincenal 38.185832
## Mensual 36.537271
## Raramente (lapsos de mas de un mes entre apuestas) 20.246048
## No apuesta -7.096638
## Publicidad
## Semanal -12.272865
## Quincenal -14.530318
## Mensual -11.636598
## Raramente (lapsos de mas de un mes entre apuestas) 44.301206
## No apuesta -2.067811
## No.tengo.motivos.para.apostar
## Semanal -5.805613
## Quincenal -22.150195
## Mensual -19.517499
## Raramente (lapsos de mas de un mes entre apuestas) -18.070940
## No apuesta 49.327434
##
## Std. Errors:
## (Intercept)
## Semanal 0.4371362
## Quincenal 0.4351461
## Mensual 0.4526052
## Raramente (lapsos de mas de un mes entre apuestas) 0.4400067
## No apuesta 398.9881606
## Emoción_y_adrenalina
## Semanal 0.7514667
## Quincenal 0.7424268
## Mensual 0.8233224
## Raramente (lapsos de mas de un mes entre apuestas) 0.7360605
## No apuesta 398.9829081
## Entretenimiento Ganancias
## Semanal 2.593677e-01 6.336886e-01
## Quincenal 2.915348e-01 6.354437e-01
## Mensual 3.124085e-01 6.817212e-01
## Raramente (lapsos de mas de un mes entre apuestas) 2.581205e-01 6.215690e-01
## No apuesta 2.601096e-15 8.011634e-05
## Socialización
## Semanal 4.366464e-01
## Quincenal 4.186023e-01
## Mensual 1.297908e-24
## Raramente (lapsos de mas de un mes entre apuestas) 5.981138e-01
## No apuesta 1.027399e-15
## Influencia.amigos.familiares
## Semanal 2.040306e-13
## Quincenal NaN
## Mensual 4.324837e-01
## Raramente (lapsos de mas de un mes entre apuestas) 4.324837e-01
## No apuesta 2.544488e-21
## Conocimiento_deporte
## Semanal NaN
## Quincenal 3.836200e-01
## Mensual 3.878229e-01
## Raramente (lapsos de mas de un mes entre apuestas) 3.202141e-01
## No apuesta 4.106141e-20
## Publicidad
## Semanal NaN
## Quincenal NaN
## Mensual 1.259343e-29
## Raramente (lapsos de mas de un mes entre apuestas) 1.028598e-28
## No apuesta 8.963211e-29
## No.tengo.motivos.para.apostar
## Semanal 1.594640e-11
## Quincenal 4.972247e-13
## Mensual 3.071706e-11
## Raramente (lapsos de mas de un mes entre apuestas) 5.172319e-03
## No apuesta 5.172323e-03
##
## Residual Deviance: 494.089
## AIC: 574.089
Calcular la suma de cada motivación para cada frecuencia
data_resumen <- data_unique %>%
group_by(Frecuencia) %>%
summarise(
Emoción_y_adrenalina = mean(Emoción_y_adrenalina, na.rm = TRUE),
Entretenimiento = mean(Entretenimiento, na.rm = TRUE),
Ganancias = mean(Ganancias, na.rm = TRUE),
Socialización = mean(Socialización, na.rm = TRUE),
Influencia.amigos.familiares = mean(Influencia.amigos.familiares, na.rm = TRUE),
Conocimiento_deporte = mean(Conocimiento_deporte, na.rm = TRUE),
Publicidad = mean(Publicidad, na.rm = TRUE),
No.tengo.motivos.para.apostar = mean(No.tengo.motivos.para.apostar, na.rm = TRUE),
.groups = 'drop'
)
Graficar
plot2<-ggplot(data_grafico, aes(x = Frecuencia, y = Proporcion, fill = Motivacion)) +
geom_bar(stat = "identity", position = position_dodge()) +
labs(title = "Proporción de Motivaciones para Apostar según Frecuencia de Apuestas",
x = "Frecuencia de Apuestas",
y = "Proporción") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(plot2)
Validación del modelo multinomial
train_control <- trainControl(method = "cv", number = 10) # 10-fold cross-validation
modelo_multinom_cv <- train(Frecuencia ~ Emoción_y_adrenalina + Entretenimiento +
Ganancias + Socialización +
Influencia.amigos.familiares +
Conocimiento_deporte +
Publicidad +
No.tengo.motivos.para.apostar,
data = data_unique,
method = "multinom",
trControl = train_control)
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 229.656312
## iter 20 value 218.854205
## iter 30 value 217.645257
## iter 40 value 217.634740
## final value 217.634726
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 240.352934
## iter 20 value 233.867354
## iter 30 value 233.269536
## final value 233.269144
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 229.668810
## iter 20 value 218.892845
## iter 30 value 217.769945
## iter 40 value 217.745609
## iter 50 value 217.728199
## iter 60 value 217.725507
## iter 60 value 217.725506
## iter 60 value 217.725506
## final value 217.725506
## converged
## # weights: 60 (45 variable)
## initial value 628.907574
## iter 10 value 237.167298
## iter 20 value 223.677696
## iter 30 value 222.565693
## iter 40 value 222.550196
## final value 222.550157
## converged
## # weights: 60 (45 variable)
## initial value 628.907574
## iter 10 value 247.315937
## iter 20 value 237.677210
## iter 30 value 237.110175
## final value 237.109610
## converged
## # weights: 60 (45 variable)
## initial value 628.907574
## iter 10 value 237.179023
## iter 20 value 223.710106
## iter 30 value 222.686058
## iter 40 value 222.650581
## iter 50 value 222.640521
## iter 60 value 222.635868
## final value 222.635163
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 236.515818
## iter 20 value 224.223989
## iter 30 value 222.711106
## iter 40 value 222.702133
## final value 222.702109
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 246.406286
## iter 20 value 237.571141
## iter 30 value 237.174726
## final value 237.174632
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 236.527245
## iter 20 value 224.252968
## iter 30 value 222.836684
## iter 40 value 222.803338
## iter 50 value 222.792386
## iter 60 value 222.787854
## final value 222.786659
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 234.015022
## iter 20 value 223.635993
## iter 30 value 222.728232
## iter 40 value 222.722212
## final value 222.722198
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 244.039185
## iter 20 value 237.727256
## iter 30 value 237.109231
## final value 237.108972
## converged
## # weights: 60 (45 variable)
## initial value 627.115814
## iter 10 value 234.026599
## iter 20 value 223.672314
## iter 30 value 222.857767
## iter 40 value 222.822607
## iter 50 value 222.809015
## iter 60 value 222.806673
## final value 222.806603
## converged
## # weights: 60 (45 variable)
## initial value 630.699333
## iter 10 value 235.856352
## iter 20 value 225.580121
## iter 30 value 223.687044
## iter 40 value 223.672082
## final value 223.672029
## converged
## # weights: 60 (45 variable)
## initial value 630.699333
## iter 10 value 246.223362
## iter 20 value 239.140951
## iter 30 value 238.278934
## final value 238.278673
## converged
## # weights: 60 (45 variable)
## initial value 630.699333
## iter 10 value 235.868442
## iter 20 value 225.612482
## iter 30 value 223.803763
## iter 40 value 223.774420
## iter 50 value 223.760771
## iter 60 value 223.757978
## final value 223.757303
## converged
## # weights: 60 (45 variable)
## initial value 628.907574
## iter 10 value 233.540803
## iter 20 value 223.780216
## iter 30 value 222.724706
## iter 40 value 222.716407
## final value 222.716383
## converged
## # weights: 60 (45 variable)
## initial value 628.907574
## iter 10 value 244.039244
## iter 20 value 237.997398
## iter 30 value 237.342830
## final value 237.342673
## converged
## # weights: 60 (45 variable)
## initial value 628.907574
## iter 10 value 233.552997
## iter 20 value 223.815225
## iter 30 value 222.859520
## iter 40 value 222.820399
## iter 50 value 222.805299
## iter 60 value 222.802893
## final value 222.802036
## converged
## # weights: 60 (45 variable)
## initial value 623.532295
## iter 10 value 226.366985
## iter 20 value 216.549234
## iter 30 value 215.182828
## iter 40 value 215.176245
## final value 215.176225
## converged
## # weights: 60 (45 variable)
## initial value 623.532295
## iter 10 value 237.559863
## iter 20 value 230.922484
## iter 30 value 230.293952
## final value 230.293848
## converged
## # weights: 60 (45 variable)
## initial value 623.532295
## iter 10 value 226.380132
## iter 20 value 216.582513
## iter 30 value 215.307147
## iter 40 value 215.279357
## iter 50 value 215.271876
## iter 60 value 215.264644
## final value 215.262526
## converged
## # weights: 60 (45 variable)
## initial value 625.324055
## iter 10 value 232.315239
## iter 20 value 222.425505
## iter 30 value 220.879292
## iter 40 value 220.871138
## final value 220.871122
## converged
## # weights: 60 (45 variable)
## initial value 625.324055
## iter 10 value 242.369199
## iter 20 value 235.842841
## iter 30 value 235.106758
## final value 235.106625
## converged
## # weights: 60 (45 variable)
## initial value 625.324055
## iter 10 value 232.326866
## iter 20 value 222.454084
## iter 30 value 220.990523
## iter 40 value 220.967566
## iter 50 value 220.963589
## iter 60 value 220.955616
## final value 220.953474
## converged
## # weights: 60 (45 variable)
## initial value 630.699333
## iter 10 value 238.441490
## iter 20 value 226.661690
## iter 30 value 225.020200
## iter 40 value 225.009687
## final value 225.009658
## converged
## # weights: 60 (45 variable)
## initial value 630.699333
## iter 10 value 248.456182
## iter 20 value 240.696610
## iter 30 value 239.825299
## final value 239.825109
## converged
## # weights: 60 (45 variable)
## initial value 630.699333
## iter 10 value 238.453072
## iter 20 value 226.699215
## iter 30 value 225.146159
## iter 40 value 225.116732
## iter 50 value 225.100235
## iter 60 value 225.096717
## iter 70 value 225.095441
## final value 225.095416
## converged
## # weights: 60 (45 variable)
## initial value 623.532295
## iter 10 value 234.515606
## iter 20 value 223.844689
## iter 30 value 222.465952
## iter 40 value 222.448329
## final value 222.448275
## converged
## # weights: 60 (45 variable)
## initial value 623.532295
## iter 10 value 244.338087
## iter 20 value 237.284971
## iter 30 value 236.721114
## final value 236.721036
## converged
## # weights: 60 (45 variable)
## initial value 623.532295
## iter 10 value 234.526989
## iter 20 value 223.873788
## iter 30 value 222.580218
## iter 40 value 222.548450
## iter 50 value 222.541332
## iter 60 value 222.534275
## final value 222.532569
## converged
## # weights: 60 (45 variable)
## initial value 696.994434
## iter 10 value 271.302483
## iter 20 value 263.270526
## iter 30 value 262.116617
## final value 262.115809
## converged
# Ver el resumen del modelo
print(modelo_multinom_cv)
## Penalized Multinomial Regression
##
## 389 samples
## 8 predictor
## 6 classes: 'Diaria', 'Semanal', 'Quincenal', 'Mensual', 'Raramente (lapsos de mas de un mes entre apuestas)', 'No apuesta'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 350, 351, 350, 350, 352, 351, ...
## Resampling results across tuning parameters:
##
## decay Accuracy Kappa
## 0e+00 0.7204837 0.5699707
## 1e-04 0.7253617 0.5772784
## 1e-01 0.7253617 0.5772784
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was decay = 0.1.
Modelo de Regresión Logístico
Seleccionar solo las columnas relevantes para el modelo
data_modelo <- data %>%
select(Apuesta, Edad, Estrato, Sexo)
Ajustar el modelo de regresión logística
modelo_logistico <- glm(Apuesta ~ Edad + Estrato + Sexo,
data = data_modelo,
family = binomial())
Resumen del modelo
summary(modelo_logistico)
##
## Call:
## glm(formula = Apuesta ~ Edad + Estrato + Sexo, family = binomial(),
## data = data_modelo)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.8878 -1.1603 0.6894 1.0768 1.8517
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.24798 1.02359 4.150 3.32e-05 ***
## Edad -0.14089 0.04509 -3.125 0.00178 **
## Estrato -0.25538 0.09938 -2.570 0.01018 *
## SexoMujer -1.22007 0.24476 -4.985 6.20e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 538.13 on 388 degrees of freedom
## Residual deviance: 496.66 on 385 degrees of freedom
## AIC: 504.66
##
## Number of Fisher Scoring iterations: 4
Calcular las probabilidades predichas usando el modelo
logístico
data_modelo$Probabilidad <- predict(modelo_logistico, newdata = data_modelo, type = "response")
Crear una curva de datos para diferentes combinaciones de Edad, Sexo
y Estrato
data_curve <- expand.grid(
Edad = seq(min(data_modelo$Edad, na.rm = TRUE), max(data_modelo$Edad, na.rm = TRUE), length.out = 100),
Sexo = unique(data_modelo$Sexo),
Estrato = unique(data_modelo$Estrato)
)
Calcular las probabilidades predichas para la curva de datos
data_curve$Probabilidad <- predict(modelo_logistico, newdata = data_curve, type = "response")
Graficar los resultados
Plot1<-ggplot() +
geom_col(data = data_modelo, aes(x = Edad, y = Probabilidad, fill = Sexo), position = "dodge", alpha = 0.5) +
geom_line(data = data_curve, aes(x = Edad, y = Probabilidad, group = interaction(Sexo, Estrato), color = factor(Estrato)), linetype = "solid", linewidth = 0.8) + # Curva de regresión
labs(title = "Probabilidad de Apostar según Edad, Sexo y Estrato",
x = "Edad",
y = "Probabilidad de Apostar",
fill = "Sexo",
color = "Estrato") +
scale_fill_manual(values = c("lightblue", "pink")) + # Ajustar los colores para Sexo
scale_color_manual(values = c("darkblue", "darkred", "green", "orange", "purple", "yellow", "black")) +
theme_minimal() +
theme(legend.position = "bottom")
ggplotly(Plot1)
Convertir la variable ‘Apuesta’ en un factor con dos niveles
data_modelo$Apuesta <- as.factor(data_modelo$Apuesta)
Verificar los niveles de la variable ‘Apuesta’
levels(data_modelo$Apuesta)
## [1] "0" "1"
Ajustar el modelo usando validación cruzada
modelo_logistico_cv <- train(Apuesta ~ Edad + Estrato + Sexo,
data = data_modelo,
method = "glm",
family = "binomial",
trControl = train_control)
Resumen del modelo con validación cruzada
print(modelo_logistico_cv)
## Generalized Linear Model
##
## 389 samples
## 3 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 350, 350, 351, 350, 350, 350, ...
## Resampling results:
##
## Accuracy Kappa
## 0.6017746 0.1934052