La regresión logística es un modelo estadístico de clasificación binaria, que estima la probabilidad de que ocurra un evento (valor 1) frente a que no ocurra (valor 0), en función de variables independientes. # Instalar paquetes y llamar librerías
# install.packages("titanic")
library(readr)
titanic_1_ <- read_csv("C:\\Users\\rrobl\\Downloads\\titanic.csv")
## Rows: 1310 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): name, sex, ticket, cabin, embarked, boat, home.dest
## dbl (7): pclass, survived, age, sibsp, parch, fare, body
##
## ℹ 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.
# install.packages("caret")
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Cargando paquete requerido: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Cargando paquete requerido: lattice
# install.packages("tidyverse")
library(tidyverse)
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ stringr 1.5.1
## ✔ forcats 1.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ purrr::lift() masks caret::lift()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
df <- read_csv("C:\\Users\\rrobl\\Downloads\\titanic.csv")
## Rows: 1310 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): name, sex, ticket, cabin, embarked, boat, home.dest
## dbl (7): pclass, survived, age, sibsp, parch, fare, body
##
## ℹ 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.
summary(df)
## pclass survived name sex
## Min. :1.000 Min. :0.000 Length:1310 Length:1310
## 1st Qu.:2.000 1st Qu.:0.000 Class :character Class :character
## Median :3.000 Median :0.000 Mode :character Mode :character
## Mean :2.295 Mean :0.382
## 3rd Qu.:3.000 3rd Qu.:1.000
## Max. :3.000 Max. :1.000
## NA's :1 NA's :1
## age sibsp parch ticket
## Min. : 0.1667 Min. :0.0000 Min. :0.000 Length:1310
## 1st Qu.:21.0000 1st Qu.:0.0000 1st Qu.:0.000 Class :character
## Median :28.0000 Median :0.0000 Median :0.000 Mode :character
## Mean :29.8811 Mean :0.4989 Mean :0.385
## 3rd Qu.:39.0000 3rd Qu.:1.0000 3rd Qu.:0.000
## Max. :80.0000 Max. :8.0000 Max. :9.000
## NA's :264 NA's :1 NA's :1
## fare cabin embarked boat
## Min. : 0.000 Length:1310 Length:1310 Length:1310
## 1st Qu.: 7.896 Class :character Class :character Class :character
## Median : 14.454 Mode :character Mode :character Mode :character
## Mean : 33.295
## 3rd Qu.: 31.275
## Max. :512.329
## NA's :2
## body home.dest
## Min. : 1.0 Length:1310
## 1st Qu.: 72.0 Class :character
## Median :155.0 Mode :character
## Mean :160.8
## 3rd Qu.:256.0
## Max. :328.0
## NA's :1189
str(df)
## spc_tbl_ [1,310 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ pclass : num [1:1310] 1 1 1 1 1 1 1 1 1 1 ...
## $ survived : num [1:1310] 1 1 0 0 0 1 1 0 1 0 ...
## $ name : chr [1:1310] "Allen, Miss. Elisabeth Walton" "Allison, Master. Hudson Trevor" "Allison, Miss. Helen Loraine" "Allison, Mr. Hudson Joshua Creighton" ...
## $ sex : chr [1:1310] "female" "male" "female" "male" ...
## $ age : num [1:1310] 29 0.917 2 30 25 ...
## $ sibsp : num [1:1310] 0 1 1 1 1 0 1 0 2 0 ...
## $ parch : num [1:1310] 0 2 2 2 2 0 0 0 0 0 ...
## $ ticket : chr [1:1310] "24160" "113781" "113781" "113781" ...
## $ fare : num [1:1310] 211 152 152 152 152 ...
## $ cabin : chr [1:1310] "B5" "C22 C26" "C22 C26" "C22 C26" ...
## $ embarked : chr [1:1310] "S" "S" "S" "S" ...
## $ boat : chr [1:1310] "2" "11" NA NA ...
## $ body : num [1:1310] NA NA NA 135 NA NA NA NA NA 22 ...
## $ home.dest: chr [1:1310] "St Louis, MO" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" ...
## - attr(*, "spec")=
## .. cols(
## .. pclass = col_double(),
## .. survived = col_double(),
## .. name = col_character(),
## .. sex = col_character(),
## .. age = col_double(),
## .. sibsp = col_double(),
## .. parch = col_double(),
## .. ticket = col_character(),
## .. fare = col_double(),
## .. cabin = col_character(),
## .. embarked = col_character(),
## .. boat = col_character(),
## .. body = col_double(),
## .. home.dest = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
df <- df[, c("survived", "pclass","sex","age")]
df <- na.omit(df)
df$survived <- as.factor(df$survived)
df$pclass <- as.factor(df$pclass)
df$sex <- as.factor(df$sex)
modelo <- glm(survived ~ ., data=df, family=binomial)
summary(modelo)
##
## Call:
## glm(formula = survived ~ ., family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.522074 0.326702 10.781 < 2e-16 ***
## pclass2 -1.280570 0.225538 -5.678 1.36e-08 ***
## pclass3 -2.289661 0.225802 -10.140 < 2e-16 ***
## sexmale -2.497845 0.166037 -15.044 < 2e-16 ***
## age -0.034393 0.006331 -5.433 5.56e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1414.62 on 1045 degrees of freedom
## Residual deviance: 982.45 on 1041 degrees of freedom
## AIC: 992.45
##
## Number of Fisher Scoring iterations: 4
prueba <- data.frame(pclass=as.factor(c(1,3)),
sex=as.factor(c("female","male")),age=c(25,40))
probabilidad <- predict(modelo, newdata=prueba, type="response")
cbind(prueba, Probabilidad_Sobrevive=probabilidad)
## pclass sex age Probabilidad_Sobrevive
## 1 1 female 25 0.93476160
## 2 3 male 40 0.06653593
Conclusión: El análisis mediante regresión logística evidencia que las variables clase (pclass), sexo y edad resultan altamente significativas para explicar la probabilidad de supervivencia en el Titanic, con niveles de significancia menores a 0.001 en todos los casos
Los coeficientes negativos señalan que viajar en segunda o tercera clase, ser hombre y tener mayor edad se asocia con una reducción importante en las probabilidades de sobrevivir En particular el sexo representa el factor de mayor impacto ya que los hombres muestran una disminución mucho más marcada en la posibilidad de sobrevivir en comparación con las mujeres
De igual manera los pasajeros de tercera clase enfrentaban una desventaja considerable frente a quienes viajaban en primera clase mientras que el incremento en la edad también reduce gradualmente la probabilidad de supervivencia
En conjunto los resultados del modelo respaldan la idea de que las mujeres las personas más jóvenes y los pasajeros de primera clase contaban con mayores oportunidades de sobrevivir durante el evento
Predicciones del modelo:
El modelo estima que una mujer de 25 años que viajaba en primera clase tenía una probabilidad de supervivencia de 93.48% lo que representa una posibilidad muy alta de sobrevivir En contraste un hombre de 40 años en tercera clase presentaba una probabilidad estimada de 6.65% lo que evidencia un nivel de supervivencia extremadamente bajo
Estos resultados ponen de manifiesto que el perfil con mayor ventaja correspondía a mujeres de clases altas mientras que el mayor riesgo recaía en hombres adultos que viajaban en tercera clase