library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readr)
library(caret)
## Warning: package 'caret' was built under R version 4.5.3
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
## Warning: package 'lattice' was built under R version 4.5.3
library(pROC)
## Warning: package 'pROC' was built under R version 4.5.3
## Type 'citation("pROC")' for a citation.
##
## Adjuntando el paquete: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
bd_limpia <- read_csv("bd_limpia_eav2025.csv") %>%
mutate(
cp2_1 = as.factor(cp2_1),
nom_mun_mv = as.factor(nom_mun_mv),
cp4_1 = as.numeric(cp4_1)
)
## Rows: 4955 Columns: 34
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (14): nom_mun_mv, percepcion_seguridad_municipio, autoridad_denuncia, pr...
## dbl (20): cp4_1, cp2_1, razon_inseguridad_principal, victima_delito_hogar, d...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Verificar
names(bd_limpia)
## [1] "cp4_1" "cp2_1"
## [3] "nom_mun_mv" "percepcion_seguridad_municipio"
## [5] "razon_inseguridad_principal" "victima_delito_hogar"
## [7] "denuncia_delito" "autoridad_denuncia"
## [9] "evaluacion_denuncia" "probabilidad_castigo_delito"
## [11] "autoridad_responsable_seguridad" "aprobacion_fiscalia"
## [13] "policia_presencia_suficiente" "policia_genera_seguridad"
## [15] "confianza_policia_colonia" "policia_trato_respetuoso"
## [17] "policia_resuelve_conflictos" "policia_justa"
## [19] "evaluacion_policia_municipal" "evaluacion_fuerza_civil"
## [21] "evaluacion_guardia_nacional" "evaluacion_ejercito_marina"
## [23] "evaluacion_transito" "contacto_policia"
## [25] "institucion_contacto" "policia_cumplio_funcion"
## [27] "policia_solicito_soborno" "policia_respondio_llamado"
## [29] "percepcion_violencia_mujeres_hogar" "acoso_callejero_ofensivo"
## [31] "acoso_callejero_ofensivo.1" "mujeres_responsables_vestimenta"
## [33] "mujeres_responsables_no_alejarse" "problema_seguridad_principal"
dim(bd_limpia)
## [1] 4955 34
nrow(bd_limpia)
## [1] 4955
str(bd_limpia)
## tibble [4,955 × 34] (S3: tbl_df/tbl/data.frame)
## $ cp4_1 : num [1:4955] 48 48 79 66 27 39 57 55 29 62 ...
## $ cp2_1 : Factor w/ 2 levels "0","1": 2 2 2 1 2 1 2 1 2 1 ...
## $ nom_mun_mv : Factor w/ 41 levels "Agualeguas","Allende",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ percepcion_seguridad_municipio : chr [1:4955] "Seguro(a)" "Seguro(a)" "Seguro(a)" "Seguro(a)" ...
## $ razon_inseguridad_principal : num [1:4955] NA NA NA NA NA 3 NA NA NA NA ...
## $ victima_delito_hogar : num [1:4955] 0 0 0 0 0 0 0 0 0 0 ...
## $ denuncia_delito : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
## $ autoridad_denuncia : chr [1:4955] NA NA NA NA ...
## $ evaluacion_denuncia : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
## $ probabilidad_castigo_delito : chr [1:4955] "Probable" "Probable" "Probable" "Probable" ...
## $ autoridad_responsable_seguridad : chr [1:4955] "Policía Estatal" "La Fiscalía General de Justicia" "La Fiscalía General de Justicia" "La Fiscalía General de Justicia" ...
## $ aprobacion_fiscalia : num [1:4955] 1 1 1 1 8888 ...
## $ policia_presencia_suficiente : num [1:4955] 1 1 1 1 0 0 1 0 1 1 ...
## $ policia_genera_seguridad : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
## $ confianza_policia_colonia : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
## $ policia_trato_respetuoso : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
## $ policia_resuelve_conflictos : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
## $ policia_justa : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
## $ evaluacion_policia_municipal : num [1:4955] 9 10 9 9 1 5 9 7 8 8 ...
## $ evaluacion_fuerza_civil : num [1:4955] 9 10 9 9 5 5 10 8 8 9 ...
## $ evaluacion_guardia_nacional : num [1:4955] 8 10 9 9 5 5 10 8 8 9 ...
## $ evaluacion_ejercito_marina : num [1:4955] 9 10 9 9 5 8 10 8 8 9 ...
## $ evaluacion_transito : num [1:4955] 9 10 7 7 1 2 10 7 5 6 ...
## $ contacto_policia : num [1:4955] 0 0 0 0 0 0 0 0 0 0 ...
## $ institucion_contacto : chr [1:4955] NA NA NA NA ...
## $ policia_cumplio_funcion : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
## $ policia_solicito_soborno : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
## $ policia_respondio_llamado : chr [1:4955] NA NA NA NA ...
## $ percepcion_violencia_mujeres_hogar: chr [1:4955] "Casi no ocurre" "Casi no ocurre" "Casi no ocurre" "Casi no ocurre" ...
## $ acoso_callejero_ofensivo : num [1:4955] 1 1 0 0 1 ...
## $ acoso_callejero_ofensivo.1 : num [1:4955] 1 1 0 0 1 0 0 1 1 1 ...
## $ mujeres_responsables_vestimenta : num [1:4955] 1 0 0 0 0 0 0 0 1 0 ...
## $ mujeres_responsables_no_alejarse : num [1:4955] 1 1 0 1 1 1 0 1 1 0 ...
## $ problema_seguridad_principal : chr [1:4955] "Robos patrimoniales" "Robos patrimoniales" "Ninguno" "Ninguno" ...
Primer análisis
# Variable a predecir
bd_analisis <- bd_limpia %>%
mutate(across(
c(
evaluacion_policia_municipal,
evaluacion_fuerza_civil,
evaluacion_guardia_nacional,
evaluacion_ejercito_marina,
evaluacion_transito
),
~ ifelse(. %in% c(7777, 8888, 9999), NA, .)
)) %>%
mutate(
confianza_policiaca = rowMeans(
across(c(
evaluacion_policia_municipal,
evaluacion_fuerza_civil,
evaluacion_guardia_nacional,
evaluacion_ejercito_marina,
evaluacion_transito
)),
na.rm = TRUE
),
confianza_policiaca = ifelse(
is.nan(confianza_policiaca),
NA,
confianza_policiaca
)
) %>%
filter(
percepcion_seguridad_municipio %in% c(
"Muy seguro(a)",
"Seguro(a)",
"Inseguro(a)",
"Muy inseguro(a)"
)
) %>%
mutate(
percepcion_seguridad_municipio = as.factor(percepcion_seguridad_municipio)
)
summary(bd_analisis$confianza_policiaca)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.000 6.800 7.800 7.494 8.600 10.000 9
Modelo lineal
# Primer modelo
# Se crea una base específica para el modelo lineal
# Esto evita problemas con NA y con niveles nuevos al predecir
variables_lm <- c(
"confianza_policiaca",
"percepcion_seguridad_municipio",
"razon_inseguridad_principal",
"denuncia_delito"
)
bd_lm <- bd_analisis %>%
select(all_of(variables_lm)) %>%
mutate(
percepcion_seguridad_municipio = as.factor(percepcion_seguridad_municipio),
razon_inseguridad_principal = as.factor(razon_inseguridad_principal),
denuncia_delito = as.factor(denuncia_delito)
) %>%
na.omit() %>%
droplevels()
table(bd_lm$percepcion_seguridad_municipio)
##
## Inseguro(a) Muy inseguro(a)
## 86 11
m1 <- lm(
confianza_policiaca ~ percepcion_seguridad_municipio + razon_inseguridad_principal + denuncia_delito,
data = bd_lm
)
summary(m1)
##
## Call:
## lm(formula = confianza_policiaca ~ percepcion_seguridad_municipio +
## razon_inseguridad_principal + denuncia_delito, data = bd_lm)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0287 -0.8928 0.3312 1.0254 3.4377
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 6.374554 0.341695 18.656
## percepcion_seguridad_municipioMuy inseguro(a) -0.906490 0.509950 -1.778
## razon_inseguridad_principal2 0.268246 0.370525 0.724
## razon_inseguridad_principal3 -0.491699 0.617614 -0.796
## razon_inseguridad_principal4 -0.658525 0.696090 -0.946
## razon_inseguridad_principal5 2.225446 1.602751 1.389
## razon_inseguridad_principal6 -0.767510 1.142375 -0.672
## razon_inseguridad_principal7 -1.174554 1.602751 -0.733
## razon_inseguridad_principal9 -1.560467 1.596538 -0.977
## razon_inseguridad_principal11 -0.774554 1.602751 -0.483
## razon_inseguridad_principal12 -0.001028 0.953215 -0.001
## razon_inseguridad_principal13 -2.374554 1.602751 -1.482
## razon_inseguridad_principal14 -1.360467 1.596538 -0.852
## denuncia_delito1 0.185913 0.333610 0.557
## Pr(>|t|)
## (Intercept) <2e-16 ***
## percepcion_seguridad_municipioMuy inseguro(a) 0.0791 .
## razon_inseguridad_principal2 0.4711
## razon_inseguridad_principal3 0.4282
## razon_inseguridad_principal4 0.3469
## razon_inseguridad_principal5 0.1687
## razon_inseguridad_principal6 0.5035
## razon_inseguridad_principal7 0.4657
## razon_inseguridad_principal9 0.3312
## razon_inseguridad_principal11 0.6302
## razon_inseguridad_principal12 0.9991
## razon_inseguridad_principal13 0.1422
## razon_inseguridad_principal14 0.3966
## denuncia_delito1 0.5788
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.566 on 83 degrees of freedom
## Multiple R-squared: 0.1419, Adjusted R-squared: 0.007448
## F-statistic: 1.055 on 13 and 83 DF, p-value: 0.4088
# Dividir en conjunto de prueba y de entrenamiento
# Propuesta de división en 70% para train y 30% para prueba
set.seed(8)
entrenamiento <- createDataPartition(
bd_lm$percepcion_seguridad_municipio,
p = 0.7,
list = FALSE
)
datos_entrenamiento <- bd_lm[entrenamiento, ]
datos_prueba <- bd_lm[-entrenamiento, ]
# Ajuste de niveles para evitar el error de new levels
niveles_percepcion <- levels(droplevels(datos_entrenamiento$percepcion_seguridad_municipio))
niveles_razon <- levels(droplevels(datos_entrenamiento$razon_inseguridad_principal))
niveles_denuncia <- levels(droplevels(datos_entrenamiento$denuncia_delito))
datos_entrenamiento <- datos_entrenamiento %>%
mutate(
percepcion_seguridad_municipio = factor(
percepcion_seguridad_municipio,
levels = niveles_percepcion
),
razon_inseguridad_principal = factor(
razon_inseguridad_principal,
levels = niveles_razon
),
denuncia_delito = factor(
denuncia_delito,
levels = niveles_denuncia
)
) %>%
droplevels()
datos_prueba <- datos_prueba %>%
mutate(
percepcion_seguridad_municipio = factor(
as.character(percepcion_seguridad_municipio),
levels = niveles_percepcion
),
razon_inseguridad_principal = factor(
as.character(razon_inseguridad_principal),
levels = niveles_razon
),
denuncia_delito = factor(
as.character(denuncia_delito),
levels = niveles_denuncia
)
) %>%
filter(
!is.na(percepcion_seguridad_municipio),
!is.na(razon_inseguridad_principal),
!is.na(denuncia_delito)
) %>%
droplevels()
cat("Entrenamiento =", nrow(datos_entrenamiento), "observaciones\n")
## Entrenamiento = 69 observaciones
cat("Prueba =", nrow(datos_prueba), "observaciones\n")
## Prueba = 27 observaciones
# Predicción de variable con base en entrenamiento
mtrain <- lm(
confianza_policiaca ~ percepcion_seguridad_municipio + razon_inseguridad_principal + denuncia_delito,
data = datos_entrenamiento
)
summary(mtrain)
##
## Call:
## lm(formula = confianza_policiaca ~ percepcion_seguridad_municipio +
## razon_inseguridad_principal + denuncia_delito, data = datos_entrenamiento)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.8750 -0.8710 0.1496 1.1250 2.9554
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 6.16116 0.48344 12.744
## percepcion_seguridad_municipioMuy inseguro(a) -0.73468 0.66640 -1.102
## razon_inseguridad_principal2 0.45989 0.49970 0.920
## razon_inseguridad_principal3 0.16419 0.86529 0.190
## razon_inseguridad_principal4 -0.11073 0.86566 -0.128
## razon_inseguridad_principal5 2.43884 1.78693 1.365
## razon_inseguridad_principal6 0.58488 1.77420 0.330
## razon_inseguridad_principal9 -1.21512 1.77420 -0.685
## razon_inseguridad_principal11 -0.56116 1.78693 -0.314
## razon_inseguridad_principal12 0.19908 1.07804 0.185
## razon_inseguridad_principal13 -2.16116 1.78693 -1.209
## razon_inseguridad_principal14 -1.01512 1.77420 -0.572
## denuncia_delito1 0.05397 0.44985 0.120
## Pr(>|t|)
## (Intercept) <2e-16 ***
## percepcion_seguridad_municipioMuy inseguro(a) 0.275
## razon_inseguridad_principal2 0.361
## razon_inseguridad_principal3 0.850
## razon_inseguridad_principal4 0.899
## razon_inseguridad_principal5 0.178
## razon_inseguridad_principal6 0.743
## razon_inseguridad_principal9 0.496
## razon_inseguridad_principal11 0.755
## razon_inseguridad_principal12 0.854
## razon_inseguridad_principal13 0.232
## razon_inseguridad_principal14 0.570
## denuncia_delito1 0.905
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.72 on 56 degrees of freedom
## Multiple R-squared: 0.119, Adjusted R-squared: -0.06979
## F-statistic: 0.6303 on 12 and 56 DF, p-value: 0.8074
# Validación cruzada regresión lineal
# La validación cruzada se hace solo con datos_entrenamiento
control_lm <- trainControl(
method = "cv",
number = 5
)
modelo_cv_lm <- train(
confianza_policiaca ~ percepcion_seguridad_municipio + razon_inseguridad_principal + denuncia_delito,
data = datos_entrenamiento,
method = "lm",
trControl = control_lm
)
## Warning in predict.lm(modelFit, newdata): prediction from rank-deficient fit;
## attr(*, "non-estim") has doubtful cases
## Warning in predict.lm(modelFit, newdata): prediction from rank-deficient fit;
## attr(*, "non-estim") has doubtful cases
## Warning in predict.lm(modelFit, newdata): prediction from rank-deficient fit;
## attr(*, "non-estim") has doubtful cases
print(modelo_cv_lm)
## Linear Regression
##
## 69 samples
## 3 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 56, 56, 55, 54, 55
## Resampling results:
##
## RMSE Rsquared MAE
## 1.80831 0.04104261 1.511032
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
cat("RMSE CV =", round(modelo_cv_lm$results$RMSE, 4), "\n")
## RMSE CV = 1.8083
cat("R2 CV =", round(modelo_cv_lm$results$Rsquared, 4), "\n")
## R2 CV = 0.041
# Evaluación final en conjunto de prueba
pred_lm <- predict(
mtrain,
newdata = datos_prueba
)
metricas_lm <- postResample(
pred = pred_lm,
obs = datos_prueba$confianza_policiaca
)
metricas_lm
## RMSE Rsquared MAE
## 1.29318830 0.06092538 1.13914840
cat("RMSE test =", round(metricas_lm["RMSE"], 4), "\n")
## RMSE test = 1.2932
cat("R2 test =", round(metricas_lm["Rsquared"], 4), "\n")
## R2 test = 0.0609
cat("MAE test =", round(metricas_lm["MAE"], 4), "\n")
## MAE test = 1.1391
Modelo logístico
# Variable dependiente
# contacto_policia 1 significa que sí tuvo contacto
# contacto_policia 0 significa que no tuvo contacto
bd_modelo <- bd_limpia %>%
mutate(across(
c(
contacto_policia,
evaluacion_policia_municipal,
evaluacion_fuerza_civil,
evaluacion_guardia_nacional
),
~ ifelse(. %in% c(7777, 8888, 9999), NA, .)
)) %>%
filter(!is.na(contacto_policia)) %>%
filter(contacto_policia %in% c(0, 1)) %>%
mutate(
contacto_policia = ifelse(contacto_policia == 1, 1, 0),
contacto_policia = factor(contacto_policia, levels = c(0, 1)),
cp2_1 = as.factor(cp2_1),
policia_presencia_suficiente = as.factor(policia_presencia_suficiente),
policia_genera_seguridad = as.factor(policia_genera_seguridad),
confianza_policia_colonia = as.factor(confianza_policia_colonia)
) %>%
select(
contacto_policia,
cp4_1,
cp2_1,
policia_presencia_suficiente,
policia_genera_seguridad,
confianza_policia_colonia,
evaluacion_policia_municipal,
evaluacion_fuerza_civil,
evaluacion_guardia_nacional
) %>%
na.omit() %>%
droplevels()
table(bd_modelo$contacto_policia)
##
## 0 1
## 4229 185
# Train y test
set.seed(42)
trainIndex <- createDataPartition(
bd_modelo$contacto_policia,
p = 0.7,
list = FALSE
)
train <- bd_modelo[trainIndex, ]
test <- bd_modelo[-trainIndex, ]
# Ajuste de niveles para evitar problemas de predicción con factores
niveles_cp2_1 <- levels(droplevels(train$cp2_1))
niveles_presencia <- levels(droplevels(train$policia_presencia_suficiente))
niveles_seguridad <- levels(droplevels(train$policia_genera_seguridad))
niveles_confianza <- levels(droplevels(train$confianza_policia_colonia))
train <- train %>%
mutate(
cp2_1 = factor(cp2_1, levels = niveles_cp2_1),
policia_presencia_suficiente = factor(
policia_presencia_suficiente,
levels = niveles_presencia
),
policia_genera_seguridad = factor(
policia_genera_seguridad,
levels = niveles_seguridad
),
confianza_policia_colonia = factor(
confianza_policia_colonia,
levels = niveles_confianza
)
) %>%
droplevels()
test <- test %>%
mutate(
cp2_1 = factor(as.character(cp2_1), levels = niveles_cp2_1),
policia_presencia_suficiente = factor(
as.character(policia_presencia_suficiente),
levels = niveles_presencia
),
policia_genera_seguridad = factor(
as.character(policia_genera_seguridad),
levels = niveles_seguridad
),
confianza_policia_colonia = factor(
as.character(confianza_policia_colonia),
levels = niveles_confianza
)
) %>%
filter(
!is.na(cp2_1),
!is.na(policia_presencia_suficiente),
!is.na(policia_genera_seguridad),
!is.na(confianza_policia_colonia)
) %>%
droplevels()
cat("Train =", nrow(train), "observaciones\n")
## Train = 3091 observaciones
cat("Test =", nrow(test), "observaciones\n")
## Test = 1323 observaciones
# Regresión logística
modelo_logit <- glm(
contacto_policia ~ cp4_1 + cp2_1 + policia_presencia_suficiente + policia_genera_seguridad + confianza_policia_colonia +
evaluacion_policia_municipal + evaluacion_fuerza_civil + evaluacion_guardia_nacional,
data = train,
family = binomial
)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(modelo_logit)
##
## Call:
## glm(formula = contacto_policia ~ cp4_1 + cp2_1 + policia_presencia_suficiente +
## policia_genera_seguridad + confianza_policia_colonia + evaluacion_policia_municipal +
## evaluacion_fuerza_civil + evaluacion_guardia_nacional, family = binomial,
## data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.957e+01 1.132e+03 -0.026 0.97917
## cp4_1 -2.784e-02 5.904e-03 -4.716 2.4e-06
## cp2_11 -5.317e-02 1.822e-01 -0.292 0.77037
## policia_presencia_suficiente1 2.203e-01 2.411e-01 0.914 0.36093
## policia_presencia_suficiente8888 3.223e-01 1.048e+00 0.308 0.75839
## policia_presencia_suficiente9999 2.311e+00 1.562e+00 1.479 0.13909
## policia_genera_seguridadNo 1.392e+01 9.573e+02 0.015 0.98840
## policia_genera_seguridadNo hay policía -2.153e-01 1.258e+03 0.000 0.99986
## policia_genera_seguridadSí 1.330e+01 9.573e+02 0.014 0.98892
## confianza_policia_coloniaNo 1.388e+01 6.047e+02 0.023 0.98168
## confianza_policia_coloniaNo hay policía -8.650e-01 1.138e+03 -0.001 0.99939
## confianza_policia_coloniaSí 1.408e+01 6.047e+02 0.023 0.98143
## evaluacion_policia_municipal -1.369e-01 6.639e-02 -2.063 0.03916
## evaluacion_fuerza_civil -7.894e-02 7.191e-02 -1.098 0.27230
## evaluacion_guardia_nacional 1.934e-01 6.800e-02 2.844 0.00445
##
## (Intercept)
## cp4_1 ***
## cp2_11
## policia_presencia_suficiente1
## policia_presencia_suficiente8888
## policia_presencia_suficiente9999
## policia_genera_seguridadNo
## policia_genera_seguridadNo hay policía
## policia_genera_seguridadSí
## confianza_policia_coloniaNo
## confianza_policia_coloniaNo hay policía
## confianza_policia_coloniaSí
## evaluacion_policia_municipal *
## evaluacion_fuerza_civil
## evaluacion_guardia_nacional **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1078.3 on 3090 degrees of freedom
## Residual deviance: 1016.8 on 3076 degrees of freedom
## AIC: 1046.8
##
## Number of Fisher Scoring iterations: 16
# Validación cruzada
# La validación cruzada se hace solo con train
control <- trainControl(method = "cv",number = 5)
modelo_cv <- train(
contacto_policia ~ cp4_1 + cp2_1 + policia_presencia_suficiente + policia_genera_seguridad + confianza_policia_colonia +
evaluacion_policia_municipal + evaluacion_fuerza_civil + evaluacion_guardia_nacional,
data = train,
method = "glm",
family = binomial,
trControl = control
)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
print(modelo_cv)
## Generalized Linear Model
##
## 3091 samples
## 8 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 2473, 2473, 2472, 2473, 2473
## Resampling results:
##
## Accuracy Kappa
## 0.9576193 -0.0006242122
# Predicciones sobre test
prob <- predict(modelo_logit,newdata = test,type = "response")
pred <- ifelse(prob > 0.5, 1, 0)
pred <- factor(pred,levels = c("0", "1"))
test$contacto_policia <- factor(test$contacto_policia,levels = c("0", "1"))
# Matriz de confusión
# Se indica que la clase positiva es 1
confusionMatrix(pred,test$contacto_policia, positive = "1"
)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 1268 55
## 1 0 0
##
## Accuracy : 0.9584
## 95% CI : (0.9462, 0.9685)
## No Information Rate : 0.9584
## P-Value [Acc > NIR] : 0.5358
##
## Kappa : 0
##
## Mcnemar's Test P-Value : 3.305e-13
##
## Sensitivity : 0.00000
## Specificity : 1.00000
## Pos Pred Value : NaN
## Neg Pred Value : 0.95843
## Prevalence : 0.04157
## Detection Rate : 0.00000
## Detection Prevalence : 0.00000
## Balanced Accuracy : 0.50000
##
## 'Positive' Class : 1
##
# Precisión, sensibilidad y especificidad
metricas <- confusionMatrix(pred,test$contacto_policia,positive = "1"
)
cat("Precisión =", round(metricas$overall["Accuracy"], 4), "\n")
## Precisión = 0.9584
cat("Sensibilidad =", round(metricas$byClass["Sensitivity"], 4), "\n")
## Sensibilidad = 0
cat("Especificidad =", round(metricas$byClass["Specificity"], 4), "\n")
## Especificidad = 1
# Curva ROC
roc_logit <- roc(
response = test$contacto_policia,
predictor = prob,
levels = c("0", "1")
)
## Setting direction: controls < cases
plot(roc_logit)
auc(roc_logit)
## Area under the curve: 0.6298