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)
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
library(nnet)
library(tidyverse)
## 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 'stringr' 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.0 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── 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 conflicted package (<http://conflicted.r-lib.org/>) 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(dplyr)
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
Cargar los datos Excel
Datos_Encuesta1 <- read_excel("C:/Users/HWP/Desktop/Mario/Datos_Encuesta.xlsx")
data <- Datos_Encuesta1
Acondicionamiento de los datos
Asegurar que Tipo_apuesta sea un factor
data$Tipo_apuesta <- as.factor(data$Tipo_apuesta)
Asegurar que la variable ‘Apuesta’ sea binaria (0 o 1)
data <- data %>%
mutate(Apuesta = ifelse(Apuesta == "Si", 1, 0))
Manejo de datos faltantes para variables numéricas
data$Edad[is.na(data$Edad)] <- mean(data$Edad, na.rm = TRUE)
data$Estrato[is.na(data$Estrato)] <- mean(data$Estrato, na.rm = TRUE)
Crear variables indicadoras para cada respuesta
data_wide <- data_long %>%
mutate(Indicador = 1) %>% # Crear una columna indicadora
pivot_wider(names_from = Respuesta,
values_from = Indicador,
values_fill = list(Indicador = 0)) # Rellenar con 0 donde no hay respuesta
Asegurar que las respuestas de factores tengan nombres
adecuados
colnames(data_wide) <- make.names(colnames(data_wide))
Eliminar filas con IDs repetidos (Mantendremos solo la primera
ocurrencia)
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.,
)
Asegurar que ‘Frecuencia’ es un factor
data_unique$Frecuencia <- as.factor(data_unique$Frecuencia)
Ajustar los niveles de ‘Frecuencia’ con los nombres exactos
data_unique$Frecuencia <- factor(data_unique$Frecuencia,
levels = c("Diaria", "Semanal", "Quincenal", "Mensual", "Raramente (lapsos de mas de un mes entre apuestas)", "No apuesta"))
levels(data_unique$Frecuencia)
## [1] "Diaria"
## [2] "Semanal"
## [3] "Quincenal"
## [4] "Mensual"
## [5] "Raramente (lapsos de mas de un mes entre apuestas)"
## [6] "No apuesta"
Establecer categoria de referencia
data_unique$Frecuencia <- relevel(data_unique$Frecuencia, ref = "Raramente (lapsos de mas de un mes entre apuestas)")
Ajustar el modelo de regresión logística multinomial inicial
modelo_multinom <- multinom(Frecuencia ~ Emoción_y_adrenalina + Entretenimiento +
Ganancias + Socialización +
Influencia.amigos.familiares +
Conocimiento_deporte +
Publicidad +
No.tengo.motivos.para.apostar,
data = data_unique)
## # weights: 60 (45 variable)
## initial value 696.994434
## iter 10 value 262.792623
## iter 20 value 247.828098
## iter 30 value 247.047584
## iter 40 value 247.044481
## iter 40 value 247.044479
## iter 40 value 247.044479
## final value 247.044479
## converged
summary(modelo_multinom)
## 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) Emoción_y_adrenalina Entretenimiento Ganancias
## Diaria -11.630010 7.941106 -8.535383 9.187658
## Semanal -9.320442 8.196511 8.850437 8.669854
## Quincenal -6.434666 5.741514 5.607984 5.784074
## Mensual -5.160224 2.857637 4.179396 3.816491
## No apuesta -12.842564 -5.938669 -5.156633 -6.565183
## Socialización Influencia.amigos.familiares Conocimiento_deporte
## Diaria -2.817240 -6.619584 -13.291942
## Semanal 10.419139 -14.635839 -22.562855
## Quincenal 8.044172 -17.768336 5.230688
## Mensual -11.502773 5.160222 3.956252
## No apuesta -1.683276 -7.923096 -10.800062
## Publicidad No.tengo.motivos.para.apostar
## Diaria -10.52902 13.034397
## Semanal -20.12330 11.865613
## Quincenal -23.27397 4.199204
## Mensual -21.42419 7.796738
## No apuesta -12.47895 37.703302
##
## Std. Errors:
## (Intercept) Emoción_y_adrenalina Entretenimiento Ganancias
## Diaria 2.4367362 2.5058742 0.0441990 2.4736347
## Semanal 3.7454819 3.7536435 3.7584890 3.7556292
## Quincenal 0.2394196 0.3276005 0.4407123 0.3766472
## Mensual 3.4491862 3.4756684 3.4712766 3.4694396
## No apuesta 702.5314482 154.6256955 131.5616764 41.2317727
## Socialización Influencia.amigos.familiares Conocimiento_deporte
## Diaria 1.2582825 3.742280e-02 2.331642e-04
## Semanal 3.8512978 1.906145e-04 3.441155e-07
## Quincenal 0.9259542 1.007994e-06 5.883975e-01
## Mensual 0.1340788 3.544516e+00 3.490815e+00
## No apuesta 327.3499177 8.721068e-01 2.453024e-01
## Publicidad No.tengo.motivos.para.apostar
## Diaria 1.478654e-03 5.8605271
## Semanal 1.577566e-06 18.6816514
## Quincenal 8.191226e-09 0.1522336
## Mensual 2.534964e-05 20.5090944
## No apuesta 1.830165e-02 46.6266749
##
## Residual Deviance: 494.089
## AIC: 574.089
Calcular los z-values (coeficientes / errores estándar)
z_values <- coeficientes / errores_estandar
Calcular los p-valores para los z-values usando la distribución
normal estándar
p_valores <- 2 * (1 - pnorm(abs(z_values)))
Imprimir los p-valores
print(p_valores)
## (Intercept) Emoción_y_adrenalina Entretenimiento Ganancias
## Diaria 1.816986e-06 0.001529663 0.00000000 0.0002038202
## Semanal 1.283015e-02 0.028990566 0.01853338 0.0209715808
## Quincenal 0.000000e+00 0.000000000 0.00000000 0.0000000000
## Mensual 1.346354e-01 0.410972438 0.22859190 0.2713186759
## No apuesta 9.854152e-01 0.969363388 0.96873448 0.8734905849
## Socialización Influencia.amigos.familiares Conocimiento_deporte
## Diaria 0.02515872 0.0000000 0.0000000
## Semanal 0.00682308 0.0000000 0.0000000
## Quincenal 0.00000000 0.0000000 0.0000000
## Mensual 0.00000000 0.1454389 0.2570749
## No apuesta 0.99589719 0.0000000 0.0000000
## Publicidad No.tengo.motivos.para.apostar
## Diaria 0 0.02614173
## Semanal 0 0.52533190
## Quincenal 0 0.00000000
## Mensual 0 0.70382663
## No apuesta 0 0.41873326
Matriz de correlacion
Calcular la matriz de correlación de las variables predictoras
cor_matrix <- cor(data_unique[, c("Emoción_y_adrenalina", "Entretenimiento",
"Ganancias", "Socialización",
"Influencia.amigos.familiares",
"Conocimiento_deporte",
"Publicidad", "No.tengo.motivos.para.apostar")])
print(cor_matrix)
## Emoción_y_adrenalina Entretenimiento Ganancias
## Emoción_y_adrenalina 1.00000000 -0.16717271 -0.20322410
## Entretenimiento -0.16717271 1.00000000 -0.13545854
## Ganancias -0.20322410 -0.13545854 1.00000000
## Socialización -0.07707199 -0.05137215 -0.06245074
## Influencia.amigos.familiares -0.05104659 -0.03402498 -0.04136259
## Conocimiento_deporte -0.10372243 -0.06913594 -0.08404535
## Publicidad -0.05104659 -0.03402498 -0.04136259
## No.tengo.motivos.para.apostar -0.47445944 -0.31624980 -0.38445020
## Socialización Influencia.amigos.familiares
## Emoción_y_adrenalina -0.07707199 -0.05104659
## Entretenimiento -0.05137215 -0.03402498
## Ganancias -0.06245074 -0.04136259
## Socialización 1.00000000 -0.01568661
## Influencia.amigos.familiares -0.01568661 1.00000000
## Conocimiento_deporte -0.03187389 -0.02111083
## Publicidad -0.01568661 -0.01038961
## No.tengo.motivos.para.apostar -0.14580131 -0.09656764
## Conocimiento_deporte Publicidad
## Emoción_y_adrenalina -0.10372243 -0.05104659
## Entretenimiento -0.06913594 -0.03402498
## Ganancias -0.08404535 -0.04136259
## Socialización -0.03187389 -0.01568661
## Influencia.amigos.familiares -0.02111083 -0.01038961
## Conocimiento_deporte 1.00000000 -0.02111083
## Publicidad -0.02111083 1.00000000
## No.tengo.motivos.para.apostar -0.19621742 -0.09656764
## No.tengo.motivos.para.apostar
## Emoción_y_adrenalina -0.47445944
## Entretenimiento -0.31624980
## Ganancias -0.38445020
## Socialización -0.14580131
## Influencia.amigos.familiares -0.09656764
## Conocimiento_deporte -0.19621742
## Publicidad -0.09656764
## No.tengo.motivos.para.apostar 1.00000000
Selección de variables para modelo optimizado
data_unique$Frecuencia <- ifelse(data_unique$Frecuencia %in% c("Diaria", "Semanal"),
"Diaria_Semanal",
as.character(data_unique$Frecuencia))
data_unique$Frecuencia <- factor(data_unique$Frecuencia,
levels = c("Diaria_Semanal", "Quincenal", "Mensual", "Raramente (lapsos de mas de un mes entre apuestas)","No apuesta"))
Establecer categoria de referencia
data_unique$Frecuencia <- relevel(data_unique$Frecuencia, ref = "Raramente (lapsos de mas de un mes entre apuestas)")
Modelo optimizado
modelo_multinom <- multinom(Frecuencia ~ Emoción_y_adrenalina + Entretenimiento +
Ganancias + Socialización +
Influencia.amigos.familiares +
Conocimiento_deporte +
Publicidad +
No.tengo.motivos.para.apostar,
data = data_unique)
## # weights: 50 (36 variable)
## initial value 626.071348
## iter 10 value 251.717050
## iter 20 value 238.086215
## iter 30 value 237.701276
## final value 237.700390
## converged
summary(modelo_multinom)
## 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) Emoción_y_adrenalina Entretenimiento Ganancias
## Diaria_Semanal -10.152199 9.102372 9.682189 9.655757
## Quincenal -6.562615 5.869465 5.735931 5.912021
## Mensual -6.738306 4.435732 5.757477 5.394574
## No apuesta -13.336525 -5.680259 -4.057439 -5.012629
## Socialización Influencia.amigos.familiares Conocimiento_deporte
## Diaria_Semanal 11.2506304 -14.846770 -23.049733
## Quincenal 8.1718832 -18.587828 5.358639
## Mensual -12.0723348 6.738292 5.534327
## No apuesta -0.8734645 -8.114345 -10.084105
## Publicidad No.tengo.motivos.para.apostar
## Diaria_Semanal -20.24256 8.295915
## Quincenal -24.68472 5.661999
## Mensual -24.33559 1.809215
## No apuesta -13.19335 33.679071
##
## Std. Errors:
## (Intercept) Emoción_y_adrenalina Entretenimiento Ganancias
## Diaria_Semanal 2.3554000 2.3676542 2.3760277 2.3699980
## Quincenal 5.2430326 5.2478032 5.2560945 5.2510973
## Mensual 0.2598198 0.5008376 0.4693478 0.4556354
## No apuesta 565.0699753 54.5726790 122.7945326 61.9010236
## Socialización Influencia.amigos.familiares Conocimiento_deporte
## Diaria_Semanal 2.519992e+00 2.601139e-05 3.571375e-08
## Quincenal 5.319302e+00 5.001852e-05 5.270516e+00
## Mensual 2.418854e-04 8.568390e-01 5.969893e-01
## No apuesta 2.083674e+02 2.182560e-01 1.522044e-01
## Publicidad No.tengo.motivos.para.apostar
## Diaria_Semanal 2.397355e-07 11.704852
## Quincenal 2.250620e-07 31.426284
## Mensual 4.526767e-09 0.531381
## No apuesta 2.716703e-03 117.061203
##
## Residual Deviance: 475.4008
## AIC: 539.4008
Matriz de correlación
cor(data_unique[, c("Emoción_y_adrenalina", "Entretenimiento", "Ganancias", "Socialización", "Influencia.amigos.familiares", "Conocimiento_deporte", "Publicidad","No.tengo.motivos.para.apostar")])
## Emoción_y_adrenalina Entretenimiento Ganancias
## Emoción_y_adrenalina 1.00000000 -0.16717271 -0.20322410
## Entretenimiento -0.16717271 1.00000000 -0.13545854
## Ganancias -0.20322410 -0.13545854 1.00000000
## Socialización -0.07707199 -0.05137215 -0.06245074
## Influencia.amigos.familiares -0.05104659 -0.03402498 -0.04136259
## Conocimiento_deporte -0.10372243 -0.06913594 -0.08404535
## Publicidad -0.05104659 -0.03402498 -0.04136259
## No.tengo.motivos.para.apostar -0.47445944 -0.31624980 -0.38445020
## Socialización Influencia.amigos.familiares
## Emoción_y_adrenalina -0.07707199 -0.05104659
## Entretenimiento -0.05137215 -0.03402498
## Ganancias -0.06245074 -0.04136259
## Socialización 1.00000000 -0.01568661
## Influencia.amigos.familiares -0.01568661 1.00000000
## Conocimiento_deporte -0.03187389 -0.02111083
## Publicidad -0.01568661 -0.01038961
## No.tengo.motivos.para.apostar -0.14580131 -0.09656764
## Conocimiento_deporte Publicidad
## Emoción_y_adrenalina -0.10372243 -0.05104659
## Entretenimiento -0.06913594 -0.03402498
## Ganancias -0.08404535 -0.04136259
## Socialización -0.03187389 -0.01568661
## Influencia.amigos.familiares -0.02111083 -0.01038961
## Conocimiento_deporte 1.00000000 -0.02111083
## Publicidad -0.02111083 1.00000000
## No.tengo.motivos.para.apostar -0.19621742 -0.09656764
## No.tengo.motivos.para.apostar
## Emoción_y_adrenalina -0.47445944
## Entretenimiento -0.31624980
## Ganancias -0.38445020
## Socialización -0.14580131
## Influencia.amigos.familiares -0.09656764
## Conocimiento_deporte -0.19621742
## Publicidad -0.09656764
## No.tengo.motivos.para.apostar 1.00000000
Graficar
# 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'
)
# Transformar los datos para el gráfico
data_grafico <- pivot_longer(data_resumen,
cols = -Frecuencia,
names_to = "Motivacion",
values_to = "Proporcion")
# 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 cruzada
train_control <- trainControl(method = "cv", number = 10)
Ajustar el modelo multinomial usando validación cruzada
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: 50 (36 variable)
## initial value 563.303269
## iter 10 value 217.004091
## iter 20 value 213.076860
## iter 30 value 212.685431
## iter 40 value 212.671158
## final value 212.671136
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 252.788089
## iter 20 value 229.676386
## iter 30 value 227.772727
## iter 30 value 227.772726
## iter 30 value 227.772726
## final value 227.772726
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 217.047624
## iter 20 value 213.136847
## iter 30 value 212.834193
## iter 40 value 212.792383
## iter 50 value 212.789123
## iter 60 value 212.785291
## iter 70 value 212.771715
## final value 212.769107
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 220.620433
## iter 20 value 215.867752
## iter 30 value 215.684906
## iter 40 value 215.675051
## final value 215.675037
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 254.874723
## iter 20 value 232.367848
## iter 30 value 230.681088
## iter 30 value 230.681087
## iter 30 value 230.681087
## final value 230.681087
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 220.663868
## iter 20 value 215.942949
## iter 30 value 215.834982
## iter 40 value 215.794202
## iter 50 value 215.792684
## iter 60 value 215.788522
## iter 70 value 215.769377
## iter 80 value 215.767730
## iter 90 value 215.765534
## iter 100 value 215.761593
## final value 215.761593
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 216.497925
## iter 20 value 213.009682
## iter 30 value 212.679700
## iter 40 value 212.658417
## iter 50 value 212.658027
## iter 50 value 212.658025
## iter 50 value 212.658025
## final value 212.658025
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 236.877487
## iter 20 value 228.551309
## iter 30 value 228.438819
## final value 228.438747
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 216.544914
## iter 20 value 213.078651
## iter 30 value 212.831000
## iter 40 value 212.790299
## iter 50 value 212.787989
## iter 60 value 212.781277
## iter 70 value 212.768753
## final value 212.767011
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 220.646199
## iter 20 value 214.842494
## iter 30 value 214.660020
## iter 40 value 214.645807
## final value 214.645778
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 237.875788
## iter 20 value 229.742178
## iter 30 value 229.647595
## final value 229.647574
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 220.694176
## iter 20 value 214.916507
## iter 30 value 214.801877
## iter 40 value 214.765806
## iter 50 value 214.764085
## iter 60 value 214.759731
## iter 70 value 214.739000
## iter 80 value 214.738274
## iter 90 value 214.732823
## iter 100 value 214.730381
## final value 214.730381
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 217.583992
## iter 20 value 214.520171
## iter 30 value 214.232176
## iter 40 value 214.207328
## final value 214.207286
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 251.198686
## iter 20 value 231.214809
## iter 30 value 229.338012
## final value 229.338009
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 217.628865
## iter 20 value 214.585978
## iter 30 value 214.374544
## iter 40 value 214.333342
## iter 50 value 214.326319
## iter 60 value 214.322118
## iter 70 value 214.303442
## final value 214.303146
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 219.146252
## iter 20 value 214.333583
## iter 30 value 214.087424
## iter 40 value 214.059448
## final value 214.059388
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 257.492869
## iter 20 value 231.629359
## iter 30 value 229.032815
## final value 229.032781
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 219.192360
## iter 20 value 214.400357
## iter 30 value 214.222946
## iter 40 value 214.183739
## iter 50 value 214.178145
## iter 60 value 214.173564
## iter 70 value 214.162007
## iter 80 value 214.160246
## iter 90 value 214.153694
## iter 100 value 214.147390
## final value 214.147390
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 566.522145
## iter 10 value 219.623762
## iter 20 value 214.788616
## iter 30 value 214.556307
## iter 40 value 214.540584
## final value 214.540559
## converged
## # weights: 50 (36 variable)
## initial value 566.522145
## iter 10 value 238.268013
## iter 20 value 229.772215
## iter 30 value 229.661756
## final value 229.661659
## converged
## # weights: 50 (36 variable)
## initial value 566.522145
## iter 10 value 219.670806
## iter 20 value 214.856799
## iter 30 value 214.699328
## iter 40 value 214.662111
## iter 50 value 214.659718
## iter 60 value 214.655506
## iter 70 value 214.635776
## iter 80 value 214.634942
## iter 90 value 214.629570
## iter 100 value 214.626978
## final value 214.626978
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 216.609564
## iter 20 value 213.268620
## iter 30 value 213.005378
## iter 40 value 212.990972
## final value 212.990952
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 249.493198
## iter 20 value 229.961232
## iter 30 value 228.259505
## final value 228.259503
## converged
## # weights: 50 (36 variable)
## initial value 563.303269
## iter 10 value 216.652626
## iter 20 value 213.335590
## iter 30 value 213.158376
## iter 40 value 213.112523
## iter 50 value 213.110298
## iter 60 value 213.105937
## iter 70 value 213.090506
## iter 80 value 213.088215
## iter 90 value 213.085604
## iter 100 value 213.078067
## final value 213.078067
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 564.912707
## iter 10 value 216.784494
## iter 20 value 212.656333
## iter 30 value 212.413934
## iter 40 value 212.392428
## final value 212.392374
## converged
## # weights: 50 (36 variable)
## initial value 564.912707
## iter 10 value 236.398998
## iter 20 value 227.733308
## iter 30 value 227.609456
## final value 227.609316
## converged
## # weights: 50 (36 variable)
## initial value 564.912707
## iter 10 value 216.830447
## iter 20 value 212.724372
## iter 30 value 212.554546
## iter 40 value 212.519875
## iter 50 value 212.512655
## iter 60 value 212.507497
## iter 70 value 212.498494
## iter 80 value 212.495960
## iter 90 value 212.489898
## iter 100 value 212.480613
## final value 212.480613
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 560.084394
## iter 10 value 215.220934
## iter 20 value 209.322284
## iter 30 value 208.772815
## iter 40 value 208.734469
## final value 208.734368
## converged
## # weights: 50 (36 variable)
## initial value 560.084394
## iter 10 value 250.194805
## iter 20 value 226.574877
## iter 30 value 224.069853
## final value 224.069837
## converged
## # weights: 50 (36 variable)
## initial value 560.084394
## iter 10 value 215.265746
## iter 20 value 209.378048
## iter 30 value 208.904644
## iter 40 value 208.865071
## iter 50 value 208.854733
## iter 60 value 208.850102
## iter 70 value 208.831103
## iter 80 value 208.830684
## iter 90 value 208.824682
## iter 100 value 208.822144
## final value 208.822144
## stopped after 100 iterations
## # weights: 50 (36 variable)
## initial value 626.071348
## iter 10 value 261.684510
## iter 20 value 253.526885
## iter 30 value 253.376775
## final value 253.376601
## converged
# Ver el resumen del modelo
print(modelo_multinom_cv)
## Penalized Multinomial Regression
##
## 389 samples
## 8 predictor
## 5 classes: 'Raramente (lapsos de mas de un mes entre apuestas)', 'Diaria_Semanal', 'Quincenal', 'Mensual', 'No apuesta'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 350, 350, 350, 350, 350, 350, ...
## Resampling results across tuning parameters:
##
## decay Accuracy Kappa
## 0e+00 0.7251388 0.5771276
## 1e-04 0.7251388 0.5771276
## 1e-01 0.7251388 0.5771276
##
## 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
Analisis de colinealidad
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
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")
# Verificar los datos para detectar posibles problemas
print(head(data_modelo))
## # A tibble: 6 × 5
## Apuesta Edad Estrato Sexo Probabilidad
## <dbl> <dbl> <dbl> <chr> <dbl>
## 1 1 18 2 Hombre 0.769
## 2 0 22 2 Hombre 0.654
## 3 0 19 3 Mujer 0.398
## 4 0 22 1 Hombre 0.710
## 5 0 24 2 Hombre 0.588
## 6 0 22 2 Hombre 0.654
print(head(data_curve))
## Edad Sexo Estrato Probabilidad
## 1 17.00000 Hombre 2 0.7928420
## 2 17.13131 Hombre 2 0.7897870
## 3 17.26263 Hombre 2 0.7866990
## 4 17.39394 Hombre 2 0.7835781
## 5 17.52525 Hombre 2 0.7804243
## 6 17.65657 Hombre 2 0.7772376
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, 349, 351, 351, 349, 351, ...
## Resampling results:
##
## Accuracy Kappa
## 0.6040789 0.1988965