Actividad 1 – Modelos de Regresión Instrucciones: Seleccionar
una de las dos opciones de bases de datos i) automobile_insurance_claims
o ii) health_insurance. A partir de dicha selección realizar las
instrucciones 1 – 5. En el desarrollo del archivo de R-Markdown, por
favor incluir datastorytelling de los resultados del análisis
exploratorio de los datos (EDA) así como la interpretación de los
resultados estimados.
library(ggplot2)
library(GGally)
library(car)
library(naniar)
library(rpart.plot)
library(car)
library(Metrics)
library(caret)
library(foreign)
library(ggplot2)
library(dplyr)
library(mapview)
library(naniar)
library(tmap)
library(RColorBrewer)
library(dlookr)
library(regclass)
library(mctest)
library(lmtest)
library(spdep)
library(sf)
library(spData)
library(spatialreg)
library(caret)
library(e1071)
library(SparseM)
library(Metrics)
library(randomForest)
library(jtools)
library(xgboost)
library(DiagrammeR)
library(effects)
library(shinyjs)
library(sp)
library(geoR)
library(gstat)
library(caret)
library(neuralnet)
library(knitr)
Lectura Sugeridas: Supervised Machine Learning: Classification and Regression https://medium.com/@nimrashahzadisa064/supervised-machine-learning-classification-andregression-c145129225f8 What is Supervised Learning? https://www.ibm.com/topics/supervised-learning A Beginner’s Guide to Supervised Machine Learning Algorithms https://towardsdatascience.com/a-beginners-guide-to-supervised-machine-learning-algorithms6e7cd9f177d5
¿Qué es Supervised Machine Learning y cuáles son algunas de sus aplicaciones en Inteligencia de Negocios? El supervised Machine Learning es una categoria dentro del aprendizaje automatica, una de las principales caracteristicas de esta categoria es que permite trabahr y aprender gracias al uso de datos, estos datos deben ser etiquetados. Estos datos etiquetados ayudaran a entrenar al modelo, con este entranamiento nosotros podremos realizar predicciones y clasificaciones con mayor efectividad, el modelo aprendera a relacionar los datos etiquetados de entrada y sus salidas. Algunas de las aplicaciones en Inteligencia de negocios son las que más hemos isto en clase como puede ser la predicción de ventas, usando datos hstoricos de las ventas o datos importntes asociados o que afectan a las ventas podremos predecir futuras ventas, con esto las empresas pueden tener una mejor planificación y un mejor escenario de los pronosticos de ventas para estar preparados ante cualquier circustancia. Otro ejemplo visto en clase puede ser la clasificación de clientes, con ayuda de datos historicos sobre caracteristicas o historial de los clientes se pueden realizar segementos de cliente y personalizar productos, estrategias de marketing para cada tipo de cliente
¿Qué es la R2 Ajustada? ¿Qué es la métrica RMSE? ¿Cuál es la diferencia entre la R2 Ajustada y la métrica RMSE? La R2 Ajustada esta relacionada con la R2, esta metrica nos ayuda a explicar ccuanta de la variabilidad de la variable dependiente puede ser explicada por el modelo creado, una ventaja de la R2 ajustada es que ademas toma en cuenta en número de predictores del modelo por lo que es de suma ayuda para la comparación de modelos. En cuanto a la metrica RMSE, esta es una metrica que nos indica el error de predicción gracias a que toma en cuenta los valores que se predicen y los valores reales, en conclusión R2 Ajustada nos brinda el porcetaje de variabilidad explicada por el modelo y el RMSE nos ayuda a dimensionar el porcentaje de error de la predicción.
#file.choose()
insurance <- read.csv("C:\\Users\\rodri\\Desktop\\modulo 3\\ACTIVIDAD 1\\health_insurance.csv")
#Convertir a factor las variables para mejorar el manejo de datos
insurance$sex<- as.factor(insurance$sex)
insurance$smoker<- as.factor(insurance$smoker)
insurance$region<- as.factor(insurance$region)
str(data)
## function (..., list = character(), package = NULL, lib.loc = NULL, verbose = getOption("verbose"),
## envir = .GlobalEnv, overwrite = TRUE)
summary(insurance) #No identificamos NA'S por lo que no remplazamos ningun valor
## age sex bmi children smoker
## Min. :18.00 female:662 Min. :16.00 Min. :0.000 no :1064
## 1st Qu.:27.00 male :676 1st Qu.:26.30 1st Qu.:0.000 yes: 274
## Median :39.00 Median :30.40 Median :1.000
## Mean :39.21 Mean :30.67 Mean :1.095
## 3rd Qu.:51.00 3rd Qu.:34.70 3rd Qu.:2.000
## Max. :64.00 Max. :53.10 Max. :5.000
## region expenses
## northeast:324 Min. : 1122
## northwest:325 1st Qu.: 4740
## southeast:364 Median : 9382
## southwest:325 Mean :13270
## 3rd Qu.:16640
## Max. :63770
vis_miss(insurance) #Reafirmamos que no existen NA'S
#Visualización de medidas descriptivas, medidas de dispersión e identificacción de tendencias.
# Media de gastos fumadores y no fumadores
boxplot(expenses ~ smoker, data = insurance, main = "Gastos por Estado de Fumador", ylab = "Gastos", xlab = "Fumador")
#Media de edad fumadores y no fumadores
ggplot(insurance, aes(x = smoker, y = age, fill = smoker)) +
geom_boxplot() +
labs(title = "Distribución de la Edad por Estado de Fumador",
x = "Fumador",
y = "Edad") +
theme_minimal() +
scale_fill_brewer(palette = "Set1")
plot(insurance$age, insurance$expenses, main = "Scatterplot of Age vs Expenses",
xlab = "Age", ylab = "Expenses", pch = 19)
# BMI fumadores y no fumadores
ggplot(insurance, aes(x = smoker, y = bmi, fill = smoker)) +
geom_boxplot() +
labs(title = "Boxplot of BMI by Smoking Status", x = "Smoker", y = "BMI") +
theme_minimal() +
scale_fill_brewer(palette = "Set1")
# Calcular la desviación estándar de las variables numéricas
desviaciones <- sapply(insurance[, sapply(insurance, is.numeric)], sd)
df_desviaciones <- data.frame(variable = names(desviaciones), desviacion = desviaciones)
ggplot(df_desviaciones, aes(x = variable, y = desviacion, fill = variable)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Desviación Estándar de Variables Numéricas",
x = "Variable",
y = "Desviación Estándar") +
scale_fill_brewer(palette = "Set3") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(insurance, aes(x = sex, y = expenses, fill = sex)) +
geom_boxplot() +
labs(title = "Distribución de Gastos por Sexo",
x = "Sexo",
y = "Gastos") +
scale_fill_brewer(palette = "Pastel1", name = "Sexo") +
theme_minimal()
ggplot(insurance, aes(x = region, y = expenses, fill = region)) +
geom_boxplot() +
labs(title = "Distribución de Gastos por Región",
x = "Región",
y = "Gastos") +
scale_fill_brewer(palette = "Set3", name = "Región") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Como variable dependiente decidí utilizar la varibale de expenses, la variable de expenses nos indica el costo médico y utilizaremos las variables restantes para ver que variable es la que afecta más al costo médico, como podemos observar existen variables como sex y region que tienen la misma media, es decir tienen los mismos gastos medicos sin importar si son hombres o mujeres o sin importar de que region sean por lo que si nos basamos en los graficos estas no tendran tanto impacto en nuestra variable de estudio, por otra parte existen variables como smoker donde la media cambia bastante, es decir la media de gastos medicos es mucho mayor en personas que si fuman a diferencia de los que no fuman por lo que en base a las graficas puede tener un mayor impacto en nuestra variable de estudio.
Como conclusión decidi no poner las variables region y sex ya que basado en los graficos creados no creo que sean de gran impacto en nuestra variable de estudio.
set.seed(123)
partition <- createDataPartition(y = insurance$bmi, p=0.7, list=F)
train = insurance[partition, ]
test = insurance[-partition, ]
a. OLS Regresión
ols_model <- lm(expenses ~ age + bmi + children + smoker, data = insurance)
summary(ols_model)
##
## Call:
## lm(formula = expenses ~ age + bmi + children + smoker, data = insurance)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11895 -2921 -985 1382 29499
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -12105.48 941.95 -12.851 < 2e-16 ***
## age 257.83 11.90 21.674 < 2e-16 ***
## bmi 321.94 27.38 11.760 < 2e-16 ***
## children 473.69 137.79 3.438 0.000604 ***
## smokeryes 23810.32 411.21 57.903 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6068 on 1333 degrees of freedom
## Multiple R-squared: 0.7497, Adjusted R-squared: 0.749
## F-statistic: 998.2 on 4 and 1333 DF, p-value: < 2.2e-16
log_ols_model <- lm(log(expenses) ~ (age) + log(bmi) + children + smoker, data = insurance)
summary(log_ols_model)
##
## Call:
## lm(formula = log(expenses) ~ (age) + log(bmi) + children + smoker,
## data = insurance)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.06829 -0.19751 -0.05003 0.07189 2.07349
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.1623083 0.2070866 29.757 < 2e-16 ***
## age 0.0347212 0.0008802 39.447 < 2e-16 ***
## log(bmi) 0.3373858 0.0610121 5.530 3.85e-08 ***
## children 0.1011783 0.0101870 9.932 < 2e-16 ***
## smokeryes 1.5436978 0.0304014 50.777 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4486 on 1333 degrees of freedom
## Multiple R-squared: 0.7627, Adjusted R-squared: 0.762
## F-statistic: 1071 on 4 and 1333 DF, p-value: < 2.2e-16
#Arreglar heteroelasticidad
weights <- insurance$weights_col
log_ols_wls_model <- lm(log(expenses) ~ (age) + log(bmi) + children + smoker, data = insurance, weights = weights)
AIC(ols_model)
## [1] 27113.95
AIC(log_ols_model)
## [1] 1658.905
RMSE_log_ols_model <- sqrt(mean((train$expenses -
exp(log_ols_model$fitted.values))^2))
RMSE_log_ols_model
## [1] 18328.94
insurance_alt <- insurance %>% dplyr::select(expenses, age, bmi, children, smoker)
insurance_alt$expenses <- log(insurance_alt$expenses)
insurance_alt$bmi <- log(insurance_alt$bmi)
summary(insurance_alt)
## expenses age bmi children smoker
## Min. : 7.023 Min. :18.00 Min. :2.773 Min. :0.000 no :1064
## 1st Qu.: 8.464 1st Qu.:27.00 1st Qu.:3.270 1st Qu.:0.000 yes: 274
## Median : 9.147 Median :39.00 Median :3.414 Median :1.000
## Mean : 9.099 Mean :39.21 Mean :3.403 Mean :1.095
## 3rd Qu.: 9.720 3rd Qu.:51.00 3rd Qu.:3.547 3rd Qu.:2.000
## Max. :11.063 Max. :64.00 Max. :3.972 Max. :5.000
set.seed(123) # What is set.seed()? We want to make sure that we get the same results for randomization each time you run the script.
cv_data <- createDataPartition(y = insurance_alt$bmi, p=0.7, list=F)
cv_train = insurance_alt[cv_data, ]
cv_test = insurance_alt[-cv_data, ]
# define explanatory variables (X's) and dependent variable (Y) in training set
train_x = data.matrix(cv_train[, -1])
train_y = cv_train[,1]
# define explanatory variables (X's) and dependent variable (Y) in testing set
test_x = data.matrix(cv_test[, -1])
test_y = cv_test[, 1]
# define final training and testing sets
xgb_train = xgb.DMatrix(data = train_x, label = train_y)
xgb_test = xgb.DMatrix(data = test_x, label = test_y)
# Lets fit XGBoost regression model and display RMSE for both training and testing data at each round
watchlist = list(train=xgb_train, test=xgb_test)
model_xgb = xgb.train(data=xgb_train, max.depth=3, watchlist=watchlist, nrounds=70) # the more the number of rounds selected, the longer the time to display the results.
## [1] train-rmse:6.092876 test-rmse:6.008697
## [2] train-rmse:4.284358 test-rmse:4.216129
## [3] train-rmse:3.020123 test-rmse:2.966900
## [4] train-rmse:2.137825 test-rmse:2.094349
## [5] train-rmse:1.525419 test-rmse:1.487202
## [6] train-rmse:1.105006 test-rmse:1.074336
## [7] train-rmse:0.821033 test-rmse:0.793693
## [8] train-rmse:0.635312 test-rmse:0.611167
## [9] train-rmse:0.518955 test-rmse:0.497657
## [10] train-rmse:0.449013 test-rmse:0.432918
## [11] train-rmse:0.410237 test-rmse:0.395863
## [12] train-rmse:0.387223 test-rmse:0.378208
## [13] train-rmse:0.375627 test-rmse:0.368601
## [14] train-rmse:0.368730 test-rmse:0.362309
## [15] train-rmse:0.363839 test-rmse:0.359946
## [16] train-rmse:0.359268 test-rmse:0.358741
## [17] train-rmse:0.357782 test-rmse:0.357273
## [18] train-rmse:0.355921 test-rmse:0.356563
## [19] train-rmse:0.354220 test-rmse:0.357034
## [20] train-rmse:0.352416 test-rmse:0.356908
## [21] train-rmse:0.350262 test-rmse:0.357588
## [22] train-rmse:0.348618 test-rmse:0.358051
## [23] train-rmse:0.347817 test-rmse:0.358218
## [24] train-rmse:0.346519 test-rmse:0.358222
## [25] train-rmse:0.344096 test-rmse:0.361468
## [26] train-rmse:0.342365 test-rmse:0.361703
## [27] train-rmse:0.338154 test-rmse:0.365202
## [28] train-rmse:0.337143 test-rmse:0.365398
## [29] train-rmse:0.335309 test-rmse:0.365839
## [30] train-rmse:0.334374 test-rmse:0.365624
## [31] train-rmse:0.333597 test-rmse:0.365520
## [32] train-rmse:0.332108 test-rmse:0.366490
## [33] train-rmse:0.331155 test-rmse:0.367372
## [34] train-rmse:0.330605 test-rmse:0.367277
## [35] train-rmse:0.330276 test-rmse:0.367218
## [36] train-rmse:0.329140 test-rmse:0.368796
## [37] train-rmse:0.328505 test-rmse:0.369350
## [38] train-rmse:0.327053 test-rmse:0.370233
## [39] train-rmse:0.325174 test-rmse:0.370644
## [40] train-rmse:0.324729 test-rmse:0.370679
## [41] train-rmse:0.322630 test-rmse:0.371201
## [42] train-rmse:0.320298 test-rmse:0.371897
## [43] train-rmse:0.318419 test-rmse:0.371717
## [44] train-rmse:0.315916 test-rmse:0.373297
## [45] train-rmse:0.314634 test-rmse:0.374078
## [46] train-rmse:0.313637 test-rmse:0.375429
## [47] train-rmse:0.312933 test-rmse:0.375417
## [48] train-rmse:0.311329 test-rmse:0.376451
## [49] train-rmse:0.311064 test-rmse:0.376727
## [50] train-rmse:0.310739 test-rmse:0.376876
## [51] train-rmse:0.309458 test-rmse:0.378624
## [52] train-rmse:0.309106 test-rmse:0.378720
## [53] train-rmse:0.307955 test-rmse:0.378414
## [54] train-rmse:0.307236 test-rmse:0.378633
## [55] train-rmse:0.306939 test-rmse:0.378708
## [56] train-rmse:0.306699 test-rmse:0.378998
## [57] train-rmse:0.305144 test-rmse:0.380504
## [58] train-rmse:0.303798 test-rmse:0.382267
## [59] train-rmse:0.301916 test-rmse:0.381765
## [60] train-rmse:0.299950 test-rmse:0.381784
## [61] train-rmse:0.299739 test-rmse:0.381775
## [62] train-rmse:0.299083 test-rmse:0.382725
## [63] train-rmse:0.296792 test-rmse:0.384339
## [64] train-rmse:0.296588 test-rmse:0.384353
## [65] train-rmse:0.295986 test-rmse:0.385416
## [66] train-rmse:0.295814 test-rmse:0.385380
## [67] train-rmse:0.295163 test-rmse:0.385637
## [68] train-rmse:0.294610 test-rmse:0.386696
## [69] train-rmse:0.294117 test-rmse:0.386989
## [70] train-rmse:0.292840 test-rmse:0.387447
# Looks like the lowest RMSE for both training and test dataset is achieved at 59 round.
# Lets estimate our final regression model
reg_xgb = xgboost(data = xgb_train, max.depth = 3, nrounds = 59, verbose = 0) # setting verbose = 0 avoids to display the training and testing error for each round.
prediction_xgb_test<-predict(reg_xgb, xgb_test)
RMSE_XGBoost <- RMSE(exp(prediction_xgb_test), cv_test$expenses)
RMSE_XGBoost
## [1] 16168.38
# Lets do some diagnostic check of regression residuals
xgb_reg_residuals<-cv_test$expenses - prediction_xgb_test
plot(xgb_reg_residuals, xlab= "Dependent Variable", ylab = "Residuals", main = 'XGBoost Regression Residuals')
abline(0,0)
# Plot first 3 trees of model
xgb.plot.tree(model=reg_xgb, trees=0:2)
importance_matrix <- xgb.importance(model = reg_xgb)
xgb.plot.importance(importance_matrix, xlab = "Explanatory Variables X's Importance")
decision_tree_model <- rpart(log(expenses) ~ age + log(bmi) + children + smoker, data = train)
# summary(decision_tree_regression)
plot(decision_tree_model, compress = TRUE)
text(decision_tree_model, use.n = TRUE)
rpart.plot(decision_tree_model)
### RMSE of DECISION TREE REGRESSION
decision_tree_prediction <- predict(decision_tree_model,test)
RMSE_decision_tree <- RMSE(decision_tree_prediction, test$expenses)
rf_model <- randomForest(expenses ~ age + bmi + children + smoker, data= cv_train, proximity=TRUE)
# random_forest<-randomForest(MEDV~.,data=train_alt,importance=TRUE, proximity=TRUE)
print(rf_model) ### the train data set model accuracy is around 85%.
##
## Call:
## randomForest(formula = expenses ~ age + bmi + children + smoker, data = cv_train, proximity = TRUE)
## Type of random forest: regression
## Number of trees: 500
## No. of variables tried at each split: 1
##
## Mean of squared residuals: 0.2252795
## % Var explained: 73.25
# Prediction & Confusion Matrix – test data
rf_prediction <- predict(rf_model,cv_test)
# confusionMatrix(rf_prediction_train_data, train$MEDV) # a confusion matrix is essentially a table that categorizes predictions against actual values.
RMSE_rf <- RMSE(rf_prediction, cv_test$expenses)
RMSE_rf <- RMSE(exp(rf_prediction), cv_test$expenses)
RMSE_rf
## [1] 12898.11
# Evalute Variables' Importance
# How to interpret varImpPlot()? The higher the value of mean decrease accuracy, the higher the importance of the variable in the model.
# In other words, mean decrease accuracy represents how much removing each variable reduces the accuracy of the model.
varImpPlot(rf_model, n.var = 5, main = "Top 10 - Variable") # It displays a variable importance plot from the random forest model.
importance(rf_model)
## IncNodePurity
## age 162.91654
## bmi 46.23755
## children 24.44342
## smoker 288.65698
Agregar columnas númericas para realizar el Neural Networks
insurance$smoker_numeric <- as.numeric(insurance$smoker == "yes")
View(insurance)
# Lets estimate a Neural Network Regression
nn_model <- neuralnet(expenses ~ age + bmi + children + smoker_numeric, data = insurance, hidden = c(5, 3), linear.output = TRUE)
# Plot the neural network
plot(nn_model)
# RMSE
predicted_values <- predict(nn_model, newdata = insurance)
residuals <- insurance$expenses - predicted_values
rmse_neural <- sqrt(mean(residuals^2))
rmse_neural
## [1] 12105.48
Como se muestran en los resultados a continuación el modelo con mejor AIC fue el log ols model, el AIC nos ayuda a comparar modelos, en este caso el log ols model tuvo un valor más bajo por lo que nos indica un mayor equilibrio a la hora de ajustar los datos.
En cuanto a mas pruebas realizadas nos encontramos con el vif, en cuanto el vif los dos modelos presentan resultados similares, ninguno de los resultados supero un vif de 5 por lo que en ambos modelos no contamos con problemas de multicolinealidad.
Se realizo el bptest en ambos modelos, los dos modelos presentaron problemas de heteroelasticidad, un pvalue menor 0.05 presenta este tipo de problemas por lo que se tiene que disminuir o eliminar.
Para resolver la heteroelasticidad primero use log y siguio presentando heteroelasticiad, como ultima opcion use Weighted Least Squares (WLS) sin embargo aun haciendo los dos pasos anteriores continuamos con heteroelasticidad.
Tomando en cuenta que tanto en vptest, vif y normalidad de los residuales tenemos los mismos valores tomaremos el AIC para elegir el modelo del cual nos basaremos para realizar los demas, el que presento menor valor fue el log ols modelo por lo que sera nuestra base para los demas modelos.
#a. Multicolinealidad (vif)
# Para el modelo lineal ordinario
vif_ols_model <- vif(ols_model)
print(vif_ols_model)
## age bmi children smoker
## 1.014515 1.012211 1.001948 1.000747
# Para el modelo lineal con transformación logarítmica
vif_log_ols_model <- vif(log_ols_model)
print(vif_log_ols_model)
## age log(bmi) children smoker
## 1.016081 1.013765 1.001948 1.000715
#b. Heterocedasticidad (bptest)
# Prueba de Breusch-Pagan para el modelo lineal ordinario
bptest_ols_model <- bptest(ols_model)
print(bptest_ols_model)
##
## studentized Breusch-Pagan test
##
## data: ols_model
## BP = 117.01, df = 4, p-value < 2.2e-16
# Prueba de Breusch-Pagan para el modelo lineal con transformación logarítmica
bptest_log_ols_model <- bptest(log_ols_model)
print(bptest_log_ols_model)
##
## studentized Breusch-Pagan test
##
## data: log_ols_model
## BP = 80.872, df = 4, p-value < 2.2e-16
bptest_log_ols_model_wls <-bptest(log_ols_wls_model)
print(bptest_log_ols_model_wls)
##
## studentized Breusch-Pagan test
##
## data: log_ols_wls_model
## BP = 80.872, df = 4, p-value < 2.2e-16
#e. Normalidad de los Residuales
# Prueba de Shapiro-Wilk para ols_model*
shapiro.test(ols_model$residuals)
##
## Shapiro-Wilk normality test
##
## data: ols_model$residuals
## W = 0.89957, p-value < 2.2e-16
# Prueba de Shapiro-Wilk para log_ols_model
shapiro.test(log_ols_model$residuals)
##
## Shapiro-Wilk normality test
##
## data: log_ols_model$residuals
## W = 0.84596, p-value < 2.2e-16
#Nota: En caso de que las pruebas de diagnóstico identifiquen cualquiera de los anteriores a) –
#e) plantear una solución para mejorar la estimación de la especificiación del modelo.
# df de los nombres de los modelos realizados
nombres_modelos <- c("Log OLS Regresión", "XGBoost Regresión" , "Decision Trees" , "Random Forest" , "Neural Networks Regresión")
# df de los valores obtenidos de RMSE
rmse_modelos <- c(RMSE_log_ols_model, RMSE_XGBoost, RMSE_decision_tree, RMSE_rf, rmse_neural )
# df de los nombres de los modelos y rmse
tabla_modelos <- data.frame(Modelo = nombres_modelos, RMSE = rmse_modelos)
tabla_modelos$RMSE <- sprintf("%.2f", tabla_modelos$RMSE)
#Mostrar los resultados de RMSE por modelo
print(kable(tabla_modelos, format = "markdown", align =c("l","c")),
quote = FALSE)
##
##
## |Modelo | RMSE |
## |:-------------------------|:--------:|
## |Log OLS Regresión | 18328.94 |
## |XGBoost Regresión | 16168.38 |
## |Decision Trees | 17071.61 |
## |Random Forest | 12898.11 |
## |Neural Networks Regresión | 12105.48 |
Como se pudo observar en la tabla de los RMSE de cada uno de los modelos podemos observar que el modelo Neural Networks Regresion cuenta con el RMSE mas bajo sin embargo en rstudio presentamos algunas fallas, seria mas preciso utilizar python, en esta situacion en Neural los valores predichos y los valores reales son los mismos es por eso que utilizaremos nuestro segundo modelo con RMSE mas bajo que es el random forest ya que es el modelo que mejor se ajusta y tiene un mejor rendimiento.
a. EDA
1. La base de datos no cuenta con NA´s
2. La variable numerica con mayor desviacion estandar es la de
expenses, por lo que es una variable con mucho peso sobre las
demas.
4. El sexo no afecta en los gastos medicos, tanto hombres como mujeres tienen un promedio igual en esta variable.
5. La region no afecta en los gastos medicos de las personas, las 4 regiones presentan el mismo promedio de expenses.
6. Sorprendentemente el indice de masa corporal es igual en fumadores y no fumadores
7. La desviación estandar de expenses es mucho mas significativa sobre las demas por lo que podemos decir una variabilidad significativa en los gastos medicos.
8. Cuando la edad aumenta el gasto medico tambien aumenta.
b. Modelo seleccionado:Random Forest
i. ¿Cuáles son las variables que contribuyen a explicar los cambios de la principal variable de estudio?
Como podemos observar las dos variables que mas contribuyen a explicar es smoker y age lo cual es muy logico ya que cuando fumas presentas más problemas de salud y los gastos medicos suben al igual que la edad, mientras más edad tengas empiezas a a presentar más problemas de salud, por lo tanto estas 2 variables son las que mas contribuyen a explicar los cambios, si quitamos 1 de estas 2 variables afectara mucho en el calculo de nuestro modelo.
¿Cómo es el impacto de dichas variables explicativas sobre la variable dependiente?
Como se menciona las variables con más impacto es smoker y age(age 160.99365 y smoker 292.00933 ), las dos restantes (bmi 43.19275 y children 23.35968) no tienen un impacto tan significativo como las anteriores, por otro lado tenemos como resultado % Var explained: 73.53, esto nos indica que el 73.53% del modelo puede explicar la variabilidad de nuestra variable dependeinte.
¿Los resultados estimados del modelo seleccionado son similares a los otros modelos estimados? ¿Cuáles son las diferencias?
Todos los modelos me indican que las variables smoker y age son de suma importancia por lo que si, todos los modelos muestran resultados similares, yo en esta actividad no use las variables region y sex, para mayor seguridad podria indicar estas variables y ver si las resultados de los modelos cambien aunque en mi opinion no lo creo ya que desde las graficas odiamos intuir que variables serian de suma importancia como smoker.
Referencias Nimra Shahzadi(2023). Medium. “Supervised Machine Learning: Classification and Regression”, fecha de consulta: 04 de marzo 2024. link de consulta: https://medium.com/@nimrashahzadisa064/supervised-machine-learning-classification-and-regression-c145129225f8