head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Preparación de datos
Como vamos a trabajar con transmisión por engranajes la convertiremos a variable factorial
mtcars$am <- as.factor(mtcars$am)
levels(mtcars$am) <- c("Automatic", "Manual")
par(mfrow = c(1, 2))
boxplot(mtcars$mpg, col="blue", xlab="Millas por galón", ylab="Millas por galón", main="MPG boxplot")
h <- hist(mtcars$mpg, breaks=10, col="blue", xlab="Millas por galón", main="Histograma de Millas por galón")
xx <-seq(min(mtcars$mpg),max(mtcars$mpg),length=40)
yy <-dnorm(xx,mean=mean(mtcars$mpg),sd=sd(mtcars$mpg))
yy <- yy * diff(h$mids[1:2])*length(mtcars$mpg)
lines(xx, yy, col="black", lwd=2)
De los diagramas anteriores vemos que MPG tiene una media cercana a 20 y su valor se distribuye normalmente con una desviación estándar de 6.3
Ahora vamos a comprobar cómo cambiará MPG según el tipo de transmisión:
boxplot(mpg~am, data=mtcars, col = c("red", "green"), xlab = "Transmisión", ylab = "Millas por galón",
main = "MPG por Tipo de Transmisión")
Del diagrama anterior vemos que:
El 75% de los autos con más de 20 mpg son de transición manual
solo el 25 por ciento de los autos con transición automatizada tienen mpg más de 20
Veamos la correlación entre MPG y otras variables:
autoCars <- mtcars[mtcars$am == "Automatic",]
manualCars <- mtcars[mtcars$am == "Manual",]
t.test(autoCars$mpg, manualCars$mpg)
##
## Welch Two Sample t-test
##
## data: autoCars$mpg and manualCars$mpg
## t = -3.7671, df = 18.332, p-value = 0.001374
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -11.280194 -3.209684
## sample estimates:
## mean of x mean of y
## 17.14737 24.39231
El código realiza una prueba t para comparar dos grupos, en este caso, el rendimiento en millas por galón (mpg) en autoCars y manualCars. La prueba t es una técnica estadística utilizada para determinar si dos grupos tienen diferencias significativas en una variable cuantitativa.
La hipótesis nula es que ambos grupos tienen la misma media
La hipótesis alternativa es que las medias de los grupos son diferentes.
Decisión: Si el p-valor =0.001374<0.05 es menor que el nivel de significancia establecido, se rechazará a hipótesis nula.
Conclusión: Con un nivel de significancia del 5%, existe evidncia estadística para rechazar la hipótesis nula, por lo tanto, se concluirá que existe una diferencia en la media de MPG de los automóviles con transmisión automática y manual es significativa.
Modelo de regresión lineal de variable única
Ahora vamos a construir un modelo de regresión lineal para describir la relación entre MPG y transmisión automática o manual:
fit <- lm(mpg~am, data = mtcars)
summary(fit)
##
## Call:
## lm(formula = mpg ~ am, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.3923 -3.0923 -0.2974 3.2439 9.5077
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 17.147 1.125 15.247 1.13e-15 ***
## amManual 7.245 1.764 4.106 0.000285 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.902 on 30 degrees of freedom
## Multiple R-squared: 0.3598, Adjusted R-squared: 0.3385
## F-statistic: 16.86 on 1 and 30 DF, p-value: 0.000285
Del modelo lineal anterior, vemos:
Hipótesis Nula: El modelo es válido
Hipótesis Alternante: el modelo no es válido
Decisión: El valor p =0.0002<0.05. Se rechaza Ho.
Conclusión: A un nivel de significancia del 5%, existe evidencia estadística para rechazar H0, es decir, muestra que la diferencia en la media es significativa y no es casual
Los autos automatizados tienen 17.147 MPG en promedio
Los autos manuales tienen 7.245 MPG más que los autos automatizados
El valor R-Squared (0.36) muestra que nuestro modelo solo cubre el 36% de la varianza, por lo que este modelo no está calificado para el ajuste.
Modelo de regresión lineal multivariable
Para un mejor ajuste vamos a construir un modelo de regresión lineal de múltiples variables.
¿Qué variables incluir?
Primero debemos decidir qué variables incluir. Si construimos el modelo con todas las variables incluidas, tendremos:
summary(lm(mpg ~ cyl+disp+hp+drat+wt+qsec+factor(vs)+factor(am)+gear+carb, data = mtcars))$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.30337416 18.71788443 0.6573058 0.51812440
## cyl -0.11144048 1.04502336 -0.1066392 0.91608738
## disp 0.01333524 0.01785750 0.7467585 0.46348865
## hp -0.02148212 0.02176858 -0.9868407 0.33495531
## drat 0.78711097 1.63537307 0.4813036 0.63527790
## wt -3.71530393 1.89441430 -1.9611887 0.06325215
## qsec 0.82104075 0.73084480 1.1234133 0.27394127
## factor(vs)1 0.31776281 2.10450861 0.1509915 0.88142347
## factor(am)Manual 2.52022689 2.05665055 1.2254035 0.23398971
## gear 0.65541302 1.49325996 0.4389142 0.66520643
## carb -0.19941925 0.82875250 -0.2406258 0.81217871
Del resumen anterior, vemos que ninguna de las variables son buenos predictores de MPG con respecto al valor p (más de 0.05)
Selección de variables paso a paso
Construimos el siguiente comando para tomar una decisión sobre las variables a incluir:
library(MASS)
fit <- lm(mpg ~ cyl+disp+hp+drat+wt+qsec+factor(vs)+factor(am)+gear+carb, data = mtcars)
summary(fit)
##
## Call:
## lm(formula = mpg ~ cyl + disp + hp + drat + wt + qsec + factor(vs) +
## factor(am) + gear + carb, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.4506 -1.6044 -0.1196 1.2193 4.6271
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.30337 18.71788 0.657 0.5181
## cyl -0.11144 1.04502 -0.107 0.9161
## disp 0.01334 0.01786 0.747 0.4635
## hp -0.02148 0.02177 -0.987 0.3350
## drat 0.78711 1.63537 0.481 0.6353
## wt -3.71530 1.89441 -1.961 0.0633 .
## qsec 0.82104 0.73084 1.123 0.2739
## factor(vs)1 0.31776 2.10451 0.151 0.8814
## factor(am)Manual 2.52023 2.05665 1.225 0.2340
## gear 0.65541 1.49326 0.439 0.6652
## carb -0.19942 0.82875 -0.241 0.8122
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.65 on 21 degrees of freedom
## Multiple R-squared: 0.869, Adjusted R-squared: 0.8066
## F-statistic: 13.93 on 10 and 21 DF, p-value: 3.793e-07
Step: AIC=61.31
mpg ~ wt + qsec + factor(am)
#el mejor modelo
mejor_modelo <- step(fit, direction = "both")
## Start: AIC=70.9
## mpg ~ cyl + disp + hp + drat + wt + qsec + factor(vs) + factor(am) +
## gear + carb
##
## Df Sum of Sq RSS AIC
## - cyl 1 0.0799 147.57 68.915
## - factor(vs) 1 0.1601 147.66 68.932
## - carb 1 0.4067 147.90 68.986
## - gear 1 1.3531 148.85 69.190
## - drat 1 1.6270 149.12 69.249
## - disp 1 3.9167 151.41 69.736
## - hp 1 6.8399 154.33 70.348
## - qsec 1 8.8641 156.36 70.765
## <none> 147.49 70.898
## - factor(am) 1 10.5467 158.04 71.108
## - wt 1 27.0144 174.51 74.280
##
## Step: AIC=68.92
## mpg ~ disp + hp + drat + wt + qsec + factor(vs) + factor(am) +
## gear + carb
##
## Df Sum of Sq RSS AIC
## - factor(vs) 1 0.2685 147.84 66.973
## - carb 1 0.5201 148.09 67.028
## - gear 1 1.8211 149.40 67.308
## - drat 1 1.9826 149.56 67.342
## - disp 1 3.9009 151.47 67.750
## - hp 1 7.3632 154.94 68.473
## <none> 147.57 68.915
## - qsec 1 10.0933 157.67 69.032
## - factor(am) 1 11.8359 159.41 69.384
## + cyl 1 0.0799 147.49 70.898
## - wt 1 27.0280 174.60 72.297
##
## Step: AIC=66.97
## mpg ~ disp + hp + drat + wt + qsec + factor(am) + gear + carb
##
## Df Sum of Sq RSS AIC
## - carb 1 0.6855 148.53 65.121
## - gear 1 2.1437 149.99 65.434
## - drat 1 2.2139 150.06 65.449
## - disp 1 3.6467 151.49 65.753
## - hp 1 7.1060 154.95 66.475
## <none> 147.84 66.973
## - factor(am) 1 11.5694 159.41 67.384
## - qsec 1 15.6830 163.53 68.200
## + factor(vs) 1 0.2685 147.57 68.915
## + cyl 1 0.1883 147.66 68.932
## - wt 1 27.3799 175.22 70.410
##
## Step: AIC=65.12
## mpg ~ disp + hp + drat + wt + qsec + factor(am) + gear
##
## Df Sum of Sq RSS AIC
## - gear 1 1.565 150.09 63.457
## - drat 1 1.932 150.46 63.535
## <none> 148.53 65.121
## - disp 1 10.110 158.64 65.229
## - factor(am) 1 12.323 160.85 65.672
## - hp 1 14.826 163.35 66.166
## + carb 1 0.685 147.84 66.973
## + factor(vs) 1 0.434 148.09 67.028
## + cyl 1 0.414 148.11 67.032
## - qsec 1 26.408 174.94 68.358
## - wt 1 69.127 217.66 75.350
##
## Step: AIC=63.46
## mpg ~ disp + hp + drat + wt + qsec + factor(am)
##
## Df Sum of Sq RSS AIC
## - drat 1 3.345 153.44 62.162
## - disp 1 8.545 158.64 63.229
## <none> 150.09 63.457
## - hp 1 13.285 163.38 64.171
## + gear 1 1.565 148.53 65.121
## + cyl 1 1.003 149.09 65.242
## + factor(vs) 1 0.645 149.45 65.319
## + carb 1 0.107 149.99 65.434
## - factor(am) 1 20.036 170.13 65.466
## - qsec 1 25.574 175.67 66.491
## - wt 1 67.572 217.66 73.351
##
## Step: AIC=62.16
## mpg ~ disp + hp + wt + qsec + factor(am)
##
## Df Sum of Sq RSS AIC
## - disp 1 6.629 160.07 61.515
## <none> 153.44 62.162
## - hp 1 12.572 166.01 62.682
## + drat 1 3.345 150.09 63.457
## + gear 1 2.977 150.46 63.535
## + cyl 1 2.447 150.99 63.648
## + factor(vs) 1 1.121 152.32 63.927
## + carb 1 0.011 153.43 64.160
## - qsec 1 26.470 179.91 65.255
## - factor(am) 1 32.198 185.63 66.258
## - wt 1 69.043 222.48 72.051
##
## Step: AIC=61.52
## mpg ~ hp + wt + qsec + factor(am)
##
## Df Sum of Sq RSS AIC
## - hp 1 9.219 169.29 61.307
## <none> 160.07 61.515
## + disp 1 6.629 153.44 62.162
## + carb 1 3.227 156.84 62.864
## + drat 1 1.428 158.64 63.229
## - qsec 1 20.225 180.29 63.323
## + cyl 1 0.249 159.82 63.465
## + factor(vs) 1 0.249 159.82 63.466
## + gear 1 0.171 159.90 63.481
## - factor(am) 1 25.993 186.06 64.331
## - wt 1 78.494 238.56 72.284
##
## Step: AIC=61.31
## mpg ~ wt + qsec + factor(am)
##
## Df Sum of Sq RSS AIC
## <none> 169.29 61.307
## + hp 1 9.219 160.07 61.515
## + carb 1 8.036 161.25 61.751
## + disp 1 3.276 166.01 62.682
## + cyl 1 1.501 167.78 63.022
## + drat 1 1.400 167.89 63.042
## + gear 1 0.123 169.16 63.284
## + factor(vs) 1 0.000 169.29 63.307
## - factor(am) 1 26.178 195.46 63.908
## - qsec 1 109.034 278.32 75.217
## - wt 1 183.347 352.63 82.790
summary(mejor_modelo)
##
## Call:
## lm(formula = mpg ~ wt + qsec + factor(am), data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.4811 -1.5555 -0.7257 1.4110 4.6610
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.6178 6.9596 1.382 0.177915
## wt -3.9165 0.7112 -5.507 6.95e-06 ***
## qsec 1.2259 0.2887 4.247 0.000216 ***
## factor(am)Manual 2.9358 1.4109 2.081 0.046716 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.459 on 28 degrees of freedom
## Multiple R-squared: 0.8497, Adjusted R-squared: 0.8336
## F-statistic: 52.75 on 3 and 28 DF, p-value: 1.21e-11
step <- stepAIC(fit, direction="both", trace=FALSE)
summary(step)$coeff
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.617781 6.9595930 1.381946 1.779152e-01
## wt -3.916504 0.7112016 -5.506882 6.952711e-06
## qsec 1.225886 0.2886696 4.246676 2.161737e-04
## factor(am)Manual 2.935837 1.4109045 2.080819 4.671551e-02
summary(step)$r.squared
## [1] 0.8496636
El análisis anterior nos muestra que:
Además del método de transmisión, el peso y la aceleración tienen un gran impacto en la descripción del MPG.
El valor r-cuadrado (0.85) nos muestra que nuestro modelo cubre el 85 % de la varianza en MPG, por lo que es robusto y altamente predictivo.
##################################################################
library(caret)
## Warning: package 'caret' was built under R version 4.2.2
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.2
## Loading required package: lattice
set.seed(123)
indx <- createDataPartition(mtcars$mpg, p = 0.7, list = FALSE)
train <- mtcars[indx, ]
test <- mtcars[-indx, ]
# Installing the package
#install.packages("caTools") # For Logistic regression
#install.packages("ROCR") # For ROC curve to evaluate model
# Loading package
library(caTools)
## Warning: package 'caTools' was built under R version 4.2.2
library(ROCR)
## Warning: package 'ROCR' was built under R version 4.2.2
# Splitting dataset
split <- sample.split(mtcars, SplitRatio = 0.8)
split
## [1] TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
train_reg <- subset(mtcars, split == "TRUE")
test_reg <- subset(mtcars, split == "FALSE")
# Training model
logistic_model <- glm(vs~ wt + disp, data = train_reg, family = "binomial")
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
logistic_model
##
## Call: glm(formula = vs ~ wt + disp, family = "binomial", data = train_reg)
##
## Coefficients:
## (Intercept) wt disp
## 15.517 197.507 -4.016
##
## Degrees of Freedom: 22 Total (i.e. Null); 20 Residual
## Null Deviance: 30.79
## Residual Deviance: 1.07e-08 AIC: 6
# Summary
summary(logistic_model)
##
## Call:
## glm(formula = vs ~ wt + disp, family = "binomial", data = train_reg)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -7.286e-05 -2.100e-08 -2.100e-08 2.100e-08 6.363e-05
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 15.517 75916.635 0.000 1.000
## wt 197.507 88180.554 0.002 0.998
## disp -4.016 1660.664 -0.002 0.998
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 3.0789e+01 on 22 degrees of freedom
## Residual deviance: 1.0699e-08 on 20 degrees of freedom
## AIC: 6
##
## Number of Fisher Scoring iterations: 25
la variable vs es una variable
categórica que indica si un automóvil tiene un motor de 8 cilindros
(vs = 1) o un motor de menos de 8
cilindros (vs = 0). Por lo tanto,
vs es la respuesta o la variable
dependiente en el modelo.
En la base de datos mtcars, la variable
wt representa el peso del vehículo en
libras. Es una variable continua y puede ser utilizada como predictor o
variable independiente en un modelo estadístico.
En la base de datos mtcars, la variable
disp representa el desplazamiento del
motor en pulgadas cúbicas. Es una variable continua y puede ser
utilizada como predictor o variable independiente en un modelo
estadístico.
# INTERPRETACIONES DE LAS VARIABLES
# Variable: wt=el peso del vehículo en libras.
# Planteamiento de hipótesis:
# HO: La variable DISP NO influye en el modelo
# H1: La variable DISP influye en el modelo
# P value =0.998>0.05 NO SE RECHAZA H0 con un nivel de significancia al 5% hay evidencia estadística para afirmar que la variable DISP NO influye en el modelo. Es decir, el peso del vehículo en libras no influye en el modelo del motor que tiene mas o menos de 8 cilindros.
# INTERPRETACIONES DE LAS VARIABLES
# Variable: disp: representa el desplazamiento del motor en pulgadas cúbica
# Planteamiento de hipótesis:
# HO: La variable WT NO influye en el modelo
# H1: La variableWT influye en el modelo
# P value =0.998>0.05 NO SE RECHAZA H0 con un nivel de significancia al 5% hay evidencia estadística para afirmar que la variable WT NO influye en el modelo. Es decir el desplazamiento del motor en pulgadas cúbica no influye en el modelo del motor que tiene mas o menos de 8 cilindros.
# Predict test data based on model
predict_reg <- predict(logistic_model,test_reg, type = "response")
predict_reg
## Datsun 710 Hornet 4 Drive Valiant Merc 450SLC
## 1.000000e+00 2.220446e-16 2.220446e-16 2.220446e-16
## Cadillac Fleetwood Chrysler Imperial Pontiac Firebird Fiat X1-9
## 2.220446e-16 2.220446e-16 2.220446e-16 1.000000e+00
## Lotus Europa
## 2.220446e-16
# Changing probabilities
predict_reg <- ifelse(predict_reg >0.5, 1, 0)
Estos resultados son las probabilidades previstas de la respuesta binaria (ya sea 0 o 1) en el conjunto de pruebas, para cada observación. Los valores cercanos a 1.0 indican una alta probabilidad de ser 1, mientras que los valores cercanos a 0.0 indican una alta probabilidad de ser 0. Sin embargo, debido a la naturaleza de la representación de la computadora de los números pequeños, algunos valores pueden ser tan pequeños que se redondearán a cero. Esto no significa que la probabilidad sea exactamente 0 o 1, sino que es muy pequeña.
# Evaluating model accuracy
# using confusion matrix
table(test_reg$vs, predict_reg)
## predict_reg
## 0 1
## 0 4 0
## 1 3 2
Interpretación:
La matriz de confusión es una herramienta que muestra el rendimiento de un modelo de clasificación. En este caso, se comparan los valores reales de “vs” en el conjunto de prueba con las predicciones del modelo logístico.
La tabla muestra que hay 4 casos en los que el modelo predijo correctamente que un automóvil tenía un motor de menos de 8 cilindros (vs = 0), y se identificaron correctamente como vs = 0 en el conjunto de prueba. También hay 2 casos en los que el modelo predijo correctamente que un automóvil tenía un motor de 8 cilindros (vs = 1), y se identificaron correctamente como vs = 1 en el conjunto de prueba.
Sin embargo, hay 3 casos en los que el modelo predijo incorrectamente
que un automóvil tenía un motor de 8 cilindros (vs = 1), pero en
realidad tenía un motor de menos de 8 cilindros (vs = 0) en el conjunto
de prueba. Estos se consideran falsos positivos. En este código, se está
calculando la precisión del modelo logístico utilizando la matriz de
confusión. La línea
missing_classerr <- mean(predict_reg != test_reg$vs)
calcula el promedio de los errores de clasificación en el conjunto de
prueba, es decir, la fracción de valores en los que los resultados
predichos por el modelo difieren de los valores reales en el conjunto de
prueba. Luego, la precisión se calcula como
1 - missing_classerr, es decir, se resta
el promedio de los errores de clasificación a 1. La precisión representa
el porcentaje de valores correctamente clasificados por el modelo en el
conjunto de prueba.
El accuracy mide qué porcentaje de clasificaciones realizadas por el modelo fueron correctas en comparación con las etiquetas reales de los datos de prueba. Un accuracy del 100% significa que el modelo clasificó todos los datos de prueba correctamente.
missing_classerr <- mean(predict_reg != test_reg$vs)
print(paste('Accuracy =', 1 - missing_classerr))
## [1] "Accuracy = 0.666666666666667"
valor de 66.67% significa que el modelo logístico predijo correctamente el 66.67% de los casos en el conjunto de datos de prueba. En otras palabras, el modelo clasificó correctamente el 66.67% de los vehículos en el conjunto de datos de prueba como tener un motor de 8 cilindros o tener un motor de menos de 8 cilindros. Este es un valor de precisión comúnmente utilizado para medir el rendimiento de un modelo de clasificación.
# ROC-AUC Curve
ROCPred <- prediction(predict_reg, test_reg$vs)
ROCPer <- performance(ROCPred, measure = "tpr",
x.measure = "fpr")
auc <- performance(ROCPred, measure = "auc")
auc <- auc@y.values[[1]]
auc
## [1] 0.7
El código crea una curva ROC (Receiver Operating Characteristic) y luego calcula el AUC (Área Bajo la Curva) que es una medida de qué tan bien el modelo de clasificación distingue entre dos clases. La curva ROC muestra la relación entre la Tasa Verdadera Positiva (TPR, True Positive Rate) y la Tasa Falsa Positiva (FPR, False Positive Rate). El AUC mide la integración o el área debajo de la curva ROC y puede tomar un valor entre 0 y 1, donde 1 significa un modelo perfectamente preciso y 0 significa un modelo totalmente inútil. Un AUC de 0.7 significa que el modelo es mejor que la moneda al azar pero todavía tiene margen de mejora.