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

1) Brevemente responder con tus propias palabras 2 de las siguientes 3 preguntas:

  1. ¿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

  2. ¿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)

2) Desarrollar Análisis Exploratorio de los Datos (EDA) que incluye los siguientes elementos: a. Identificación de NA’s b. Reemplazo de NA’s

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

  1. Medidas descriptivas
  2. Medidas de dispersión
  3. Identificación de patrones y/o tendencias en los datos mediante el uso de gráficos incluyendo bar plots, line plots, pie plots, histogramas, matriz de correlación, box plot, scatter plot, qqplot, etc Mostrar al menos 4 – 6 gráficos.
#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))

3) A partir de los resultados de EDA describir la especificación del modelo de regresión lineal a estimar. Brevemente, describir cómo es el posible impacto de cada una de las variables explicativas sobre la principal variable de estudio.

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, ]

4) Estimación de cada uno de los siguientes modelos de Supervised Machine Learning (SML):

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
  1. XGBoost Regresión
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")

  1. Decision Trees
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)
  1. Random Forest
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)
  1. Neural Networks Regresión
# 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

5) Pruebas de Diagnóstico de los Resultados Obtenidos de la Estmación de Modelos de Regresión

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.

6) Evaluación y Selección de Modelo de Regresión a. Mediante el cálculo de la métrica RMSE para cada uno de los modelos estimados en 4) seleccionar el modelo que muestra los mejores resultados estimados. b. Presentar los valores de la métrica RMSE de cada uno de los modelos estimados en 4) en un gráfico de barras.

# 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.

7) Desarrollar una breve descripción de los 6 – 10 principales hallazgos de:

a. EDA

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.

  1. ¿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.

  2. ¿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