Carga de paquetes:
library(data.table)
library(factoextra)
library(dbscan)
library(ggplot2)
library(rpart.plot)
library(rpart)
library(caret)
library(jtools)
library(scales)
library(corrplot)
library(plotly)
library(tidyverse)
library(lubridate)
library(texreg)
library(corrgram)
library(knitr)
library(moderndive)
Carga de bases:
path <- 'C:/Users/matir/OneDrive/Escritorio/Mati/Universidad/2021/Segundo Semestre/Data Science/control 3/'
cancer <- fread(paste0(path,'Cancer_de_mama.csv'))
prima <- fread(paste0(path,'Prima_de_seguros.csv'))
Realice dos modelos de regresión lineal multiple para predecir la variable charges (prima de seguros) ¿Cuál predice mejor dentro de muestra?. (8 puntos)
Regresion lineal multiple para predecir charges con variables: bmi y age
prima <- data.table(prima)
f1 <- formula(charges ~ bmi + age)
reg1 <- lm(formula = f1, data = prima)
sum1 <- summary(reg1)
sum <- summary(reg1)
sum
##
## Call:
## lm(formula = f1, data = prima)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14457 -7045 -5136 7211 48022
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6424.80 1744.09 -3.684 0.000239 ***
## bmi 332.97 51.37 6.481 1.28e-10 ***
## age 241.93 22.30 10.850 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11390 on 1335 degrees of freedom
## Multiple R-squared: 0.1172, Adjusted R-squared: 0.1159
## F-statistic: 88.6 on 2 and 1335 DF, p-value: < 2.2e-16
get_regression_table(reg1) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | -6424.805 | 1744.091 | -3.684 | 0 | -9846.262 | -3003.347 |
| bmi | 332.965 | 51.374 | 6.481 | 0 | 232.182 | 433.748 |
| age | 241.931 | 22.298 | 10.850 | 0 | 198.187 | 285.674 |
screenreg(reg1)
##
## =========================
## Model 1
## -------------------------
## (Intercept) -6424.80 ***
## (1744.09)
## bmi 332.97 ***
## (51.37)
## age 241.93 ***
## (22.30)
## -------------------------
## R^2 0.12
## Adj. R^2 0.12
## Num. obs. 1338
## =========================
## *** p < 0.001; ** p < 0.01; * p < 0.05
prediccion.todas1 <- predict(reg1, newdata = prima)
prima[,predicciont1:= prediccion.todas1]
gg2 <- ggplot(prima, aes(charges, predicciont1)) +
geom_point() + geom_abline(colour="red") +
labs(title = "Regresión lineal múltiple de la Prima", subtitle = "Variables: bmi y age", x = "Variables",
y = "Predicción de la prima") +
theme(plot.title = element_text(family = "Helvetica", face = "bold", size = (15)),
axis.title = element_text(family = "Helvetica", size = (10)))
gg2
Regresion lineal multiple para predecir charges con variables: age, children, smoker,bmi ,region y sex
prima <- data.table(prima)
f2 <- formula(charges ~ age + children + smoker + bmi + region + sex)
reg2 <- lm(formula = f2, data = prima)
sum2 <- summary(reg2)
sum2 <- summary(reg2)
sum2
##
## Call:
## lm(formula = f2, data = prima)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11304.9 -2848.1 -982.1 1393.9 29992.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11938.5 987.8 -12.086 < 2e-16 ***
## age 256.9 11.9 21.587 < 2e-16 ***
## children 475.5 137.8 3.451 0.000577 ***
## smokeryes 23848.5 413.1 57.723 < 2e-16 ***
## bmi 339.2 28.6 11.860 < 2e-16 ***
## regionnorthwest -353.0 476.3 -0.741 0.458769
## regionsoutheast -1035.0 478.7 -2.162 0.030782 *
## regionsouthwest -960.0 477.9 -2.009 0.044765 *
## sexmale -131.3 332.9 -0.394 0.693348
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6062 on 1329 degrees of freedom
## Multiple R-squared: 0.7509, Adjusted R-squared: 0.7494
## F-statistic: 500.8 on 8 and 1329 DF, p-value: < 2.2e-16
get_regression_table(reg2) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | -11938.539 | 987.819 | -12.086 | 0.000 | -13876.393 | -10000.684 |
| age | 256.856 | 11.899 | 21.587 | 0.000 | 233.514 | 280.199 |
| children | 475.501 | 137.804 | 3.451 | 0.001 | 205.163 | 745.838 |
| smoker: yes | 23848.535 | 413.153 | 57.723 | 0.000 | 23038.031 | 24659.038 |
| bmi | 339.193 | 28.599 | 11.860 | 0.000 | 283.088 | 395.298 |
| region: northwest | -352.964 | 476.276 | -0.741 | 0.459 | -1287.298 | 581.370 |
| region: southeast | -1035.022 | 478.692 | -2.162 | 0.031 | -1974.097 | -95.947 |
| region: southwest | -960.051 | 477.933 | -2.009 | 0.045 | -1897.636 | -22.466 |
| sex: male | -131.314 | 332.945 | -0.394 | 0.693 | -784.470 | 521.842 |
screenreg(reg2)
##
## ==============================
## Model 1
## ------------------------------
## (Intercept) -11938.54 ***
## (987.82)
## age 256.86 ***
## (11.90)
## children 475.50 ***
## (137.80)
## smokeryes 23848.53 ***
## (413.15)
## bmi 339.19 ***
## (28.60)
## regionnorthwest -352.96
## (476.28)
## regionsoutheast -1035.02 *
## (478.69)
## regionsouthwest -960.05 *
## (477.93)
## sexmale -131.31
## (332.95)
## ------------------------------
## R^2 0.75
## Adj. R^2 0.75
## Num. obs. 1338
## ==============================
## *** p < 0.001; ** p < 0.01; * p < 0.05
prediccion.todas2 <- predict(reg2, newdata = prima)
prima[,predicciont2:= prediccion.todas2]
gg2 <- ggplot(prima, aes(charges, predicciont2)) +
geom_point() + geom_abline(colour="red") +
labs(title = "Regresión lineal múltiple de la Prima", subtitle = "Variables: age, children, smoker,bmi ,region y sex", x = "Variables",
y = "Predicción de la prima") +
theme(plot.title = element_text(family = "Helvetica", face = "bold", size = (15)),
axis.title = element_text(family = "Helvetica", size = (10)))
gg2
Realice validación cruzada (CV) a los modelos de la pregunta anterior por el método K-folds con 5 folds. ¿Se mantienen las conclusiones anteriores?. (8 putos) Pista1: Recuerde setear la semilla set.seed(12345).
Pista2: Si existen variables con NA recuerde que puede excluirlas esas observaciones del análisis, pero no las elimine.
set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 5)
Para modelo 1:
predkfolds1<-train(f1,data=prima,method="lm",trControl= setupKCV)
print(predkfolds1)
## Linear Regression
##
## 1338 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 1070, 1072, 1070, 1070, 1070
## Resampling results:
##
## RMSE Rsquared MAE
## 11378.53 0.1176962 9045.051
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Para modelo 2:
predkfolds2<-train(f2,data=prima,method="lm",trControl= setupKCV)
print(predkfolds2)
## Linear Regression
##
## 1338 samples
## 6 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 1070, 1071, 1071, 1070, 1070
## Resampling results:
##
## RMSE Rsquared MAE
## 6072.407 0.7484253 4192.455
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Proponga dos variables sobre las cuales segmentar la muestra, en orden de hacer análisis de clusters con el método de kmeans. Muestre sus resultados gráficamente. (8 puntos)
Creo que se podría hacer la comparacion entre prima y años, dado que siempre se ha dicho que a medida que
ggplot(data = prima,aes(x=age,y=charges))+
geom_point()
samp <- prima[,.(age,charges)]
Entonces, al graficar y encontrar cierto patron en el orden de los datos, procedemos a realizar un grafico de codo:
fviz_nbclust(x = samp, FUNcluster = kmeans, method = "wss", k.max = 25,
diss = get_dist(samp, method = "euclidean"), nstart = 50)
Vemos en el grafico de codo, que el numero optimo de clusters es el 5 dado que reduce sustancialmente el total de N por cluster. Por lo tanto, dividiremos en k=5.
k1<-kmeans(x=samp,centers=5,nstart=25)
fviz_cluster(k1,data=samp,geom = "point")
Realice dos modelos de árboles de clasificación de la variable diagnosis. Pruebe cuál modelo clasifica mejor con validación cruzada. Entrene el modelo con un 80% de la muestra y testee con el 20% restante. Explicite qué modelo es mejor y porqué. (12 puntos)
Modelo 1:
arbol_1 <- rpart(diagnosis~texture_mean +radius_mean, data=cancer, method = "class")
rpart.plot(arbol_1, main = "Árbol de Clasificación: Cancer de Mamas (Modelo 1)",extra = 104,
box.palette = "GnBu",
branch.lty = 3,
shadow.col = "gray",
nn = TRUE,)
rpart.rules(arbol_1, style = "tall")
## diagnosis is 0.05 when
## radius_mean < 15
## texture_mean < 20
##
## diagnosis is 0.12 when
## radius_mean < 13
## texture_mean >= 20
##
## diagnosis is 0.25 when
## radius_mean is 13 to 15
## texture_mean >= 25
##
## diagnosis is 0.66 when
## radius_mean is 13 to 15
## texture_mean is 20 to 25
##
## diagnosis is 0.94 when
## radius_mean >= 15
Leyenda: - B = benigno - M = maligno
Entrenamos modelo 1:
set.seed(12345)
div <- createDataPartition(cancer$diagnosis, times = 1, p = 0.8, list = F)
train <- cancer[div,]
test <- cancer[-div,]
arbol_3 <- rpart(diagnosis~texture_mean +radius_mean, data = train, method = "class")
rpart.plot(arbol_3)
prediccion_1 <- predict(arbol_3, newdata = test, type = "class")
matriz <- table(test$diagnosis, prediccion_1)
matriz
## prediccion_1
## B M
## B 65 6
## M 8 34
precision <- sum(diag(matriz))/sum(matriz)
precision
## [1] 0.8761062
Modelo 2
arbol_2 <- rpart(diagnosis~perimeter_mean + smoothness_mean, data=cancer, method = "class")
rpart.plot(arbol_2, main = "Árbol de Clasificación: Cancer de Mamas (Modelo 2)",extra = 104,
box.palette = "GnBu",
branch.lty = 3,
shadow.col = "gray",
nn = TRUE,)
rpart.rules(arbol_2, style = "tall")
## diagnosis is 0.07 when
## perimeter_mean < 90
##
## diagnosis is 0.07 when
## perimeter_mean is 90 to 99
## smoothness_mean < 0.09
##
## diagnosis is 0.67 when
## perimeter_mean is 90 to 99
## smoothness_mean >= 0.09
##
## diagnosis is 0.95 when
## perimeter_mean >= 99
Entrenamos modelo 2:
set.seed(12345)
div <- createDataPartition(cancer$diagnosis, times = 1, p = 0.8, list = F)
train <- cancer[div,]
test <- cancer[-div,]
arbol_4 <- rpart(diagnosis~perimeter_mean + smoothness_mean, data = train, method = "class")
rpart.plot(arbol_4)
prediccion_2 <- predict(arbol_4, newdata = test, type = "class")
matriz <- table(test$diagnosis, prediccion_2)
matriz
## prediccion_2
## B M
## B 69 2
## M 8 34
precision <- sum(diag(matriz))/sum(matriz)
precision
## [1] 0.9115044
PD. Si se quiere ver la interpretacion de cada arbol de decsion queda registrada con el comando: “rpart.rules”.
¿Para qué se utiliza validación cruzada (Cross Validation)?
La validacion cruzada es una forma de corroborar que el metodo de prediccion que hemos armado funcione precisamente. Para esto, se divide nuestra poblacion en una proporcion “x” e “y” donde uno serán los datos de entrenamiento y otros serán los de prueba. De esta manera, podremos verificar si el modelo puede ser efectivo al predecir comportamientos o resultados.
En palabras simples, es una manera de ver si el modelo que creamos es preciso o no. Para evaluar la efectividad del modelo, se divide la muestra en entrenamiento y purbeas, luego se testean estos datos de prueba y se evalua la precision del modelo.
¿Cual es la diferencia entre regresión y clasificación?
La regresion es un modelo que permite predecir comportamientos/resultados en base a variables que nosotros creamos que serán influyentes en (valga la redundancia) este comportamiento/resultado. Las regresiones podrán ser forumladas a traves de los datos y variables que tengamos de una muestra. Mientras mas explicativos las variables, mejor será nuestra regresion para predecir.
La clasificacion es la agrupacion de datos en (valga la redundancia) un numero determinado de grupos. Esto tiene como fin poder predecir entre que limites (de las variables analizadas) se mueve un grupo determinado. De esta manera, se podran estimar patrones y segmentar por un target determinado.
Claramente, la diferencia entre regresion y clustering radicara en que la regresion en su modelo predicirá un resultado exacto en base a los datos que le entregemos. En cambio, el clustering predice el comportamiento de una agrupacion de datos (se mueven en un rango). Este ultimo metodo es sumamente util en el MKT dado que no se puede saber la caractersitica de cada cliente, por lo mismo, es mas eficiente crear grupos de clientes que compartan ciertos patrones comunes. Un ejemplo para el metodo de regresion podría ser la estimacion de precios de un objeto considerando “x” variables.