publicidad <- read.csv("Advertising.csv", sep=",",header = TRUE)
attach(publicidad)
head(publicidad)
## X TV Radio Newspaper Sales
## 1 1 230.1 37.8 69.2 22.1
## 2 2 44.5 39.3 45.1 10.4
## 3 3 17.2 45.9 69.3 9.3
## 4 4 151.5 41.3 58.5 18.5
## 5 5 180.8 10.8 58.4 12.9
## 6 6 8.7 48.9 75.0 7.2
library(dplyr)
# estructura de los datos
tibble(publicidad)
## # A tibble: 200 x 5
## X TV Radio Newspaper Sales
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 230. 37.8 69.2 22.1
## 2 2 44.5 39.3 45.1 10.4
## 3 3 17.2 45.9 69.3 9.3
## 4 4 152. 41.3 58.5 18.5
## 5 5 181. 10.8 58.4 12.9
## 6 6 8.7 48.9 75 7.2
## 7 7 57.5 32.8 23.5 11.8
## 8 8 120. 19.6 11.6 13.2
## 9 9 8.6 2.1 1 4.8
## 10 10 200. 2.6 21.2 10.6
## # ... with 190 more rows
library(funModeling)
df_status(publicidad)
## variable q_zeros p_zeros q_na p_na q_inf p_inf type unique
## 1 X 0 0.0 0 0 0 0 integer 200
## 2 TV 0 0.0 0 0 0 0 numeric 190
## 3 Radio 1 0.5 0 0 0 0 numeric 167
## 4 Newspaper 0 0.0 0 0 0 0 numeric 172
## 5 Sales 0 0.0 0 0 0 0 numeric 121
summary(publicidad)
## X TV Radio Newspaper
## Min. : 1.00 Min. : 0.70 Min. : 0.000 Min. : 0.30
## 1st Qu.: 50.75 1st Qu.: 74.38 1st Qu.: 9.975 1st Qu.: 12.75
## Median :100.50 Median :149.75 Median :22.900 Median : 25.75
## Mean :100.50 Mean :147.04 Mean :23.264 Mean : 30.55
## 3rd Qu.:150.25 3rd Qu.:218.82 3rd Qu.:36.525 3rd Qu.: 45.10
## Max. :200.00 Max. :296.40 Max. :49.600 Max. :114.00
## Sales
## Min. : 1.60
## 1st Qu.:10.38
## Median :12.90
## Mean :14.02
## 3rd Qu.:17.40
## Max. :27.00
dim(publicidad)
## [1] 200 5
Luego de cargar la base de datos onservamos que la primera columna(X) es un identificador nos dice que existen 200 observaciones las variables son 4, Tv, Radio, Newspaper y Sales. No observamos valores perdidos.
#NA's a la variable TV:
indice1<-sample(1:200, 200*0.05)
indice1
## [1] 17 81 196 173 40 123 138 135 160 119
publicidad$TV[indice1]
## [1] 67.8 76.4 38.2 19.6 228.0 224.0 273.7 36.9 131.7 125.7
publicidad$TV[indice1]<-NA
publicidad$TV[indice1]
## [1] NA NA NA NA NA NA NA NA NA NA
# NA's a la variable Radio:
indice2 <- sample(1:200, 200*0.05)
indice2
## [1] 66 82 24 163 159 183 47 125 105 167
publicidad$Radio[indice2]
## [1] 9.3 4.1 16.9 18.1 36.9 5.7 9.9 32.3 34.3 37.6
publicidad$Radio[indice2] <- NA
publicidad$Radio[indice2]
## [1] NA NA NA NA NA NA NA NA NA NA
summary(publicidad)
## X TV Radio Newspaper
## Min. : 1.00 Min. : 0.70 Min. : 0.00 Min. : 0.30
## 1st Qu.: 50.75 1st Qu.: 75.15 1st Qu.:10.22 1st Qu.: 12.75
## Median :100.50 Median :154.05 Median :23.45 Median : 25.75
## Mean :100.50 Mean :148.35 Mean :23.41 Mean : 30.55
## 3rd Qu.:150.25 3rd Qu.:218.47 3rd Qu.:36.58 3rd Qu.: 45.10
## Max. :200.00 Max. :296.40 Max. :49.60 Max. :114.00
## NA's :10 NA's :10
## Sales
## Min. : 1.60
## 1st Qu.:10.38
## Median :12.90
## Mean :14.02
## 3rd Qu.:17.40
## Max. :27.00
##
Al no contar en la base de datos con valores perdidos agregamos tanto a la varible TV como Radio una cantidad igual al 5% de la cantidad de observaciones(10 observaciones) como datos perdidos.
Exploramos el número de valores perdidos por variable
apply(publicidad, 2, function(x){sum(is.na(x))})
## X TV Radio Newspaper Sales
## 0 10 10 0 0
Corroborando que se han creado los valores faltantes deseados en ambas variables.
sleep_aggr <- VIM::aggr(publicidad[2:5], col = mice::mdc(1:2), numbers = TRUE,
sortVars = TRUE, labels = names(publicidad[2:5]),
cex.axis= 0.7, gap = 3,
ylab = c("Proporción de Pérdida",
"Patrón de Pérdida"))
##
## Variables sorted by number of missings:
## Variable Count
## TV 0.05
## Radio 0.05
## Newspaper 0.00
## Sales 0.00
Observamos visualmente en la proporción de valores perdidos que efectivamente el 5% de estos pertenecen a las variables TV y Radio según lo habiamos creado y en el gráfico de patron de perdida que el 90.5% da los datos estan completos
mice::md.pattern(publicidad[2:5], rotate.names=TRUE)
## Newspaper Sales TV Radio
## 180 1 1 1 1 0
## 10 1 1 1 0 1
## 10 1 1 0 1 1
## 0 0 10 10 20
mice::md.pairs(publicidad[2:5])
## $rr
## TV Radio Newspaper Sales
## TV 190 180 190 190
## Radio 180 190 190 190
## Newspaper 190 190 200 200
## Sales 190 190 200 200
##
## $rm
## TV Radio Newspaper Sales
## TV 0 10 0 0
## Radio 10 0 0 0
## Newspaper 10 10 0 0
## Sales 10 10 0 0
##
## $mr
## TV Radio Newspaper Sales
## TV 0 10 10 10
## Radio 10 0 10 10
## Newspaper 0 0 0 0
## Sales 0 0 0 0
##
## $mm
## TV Radio Newspaper Sales
## TV 10 0 0 0
## Radio 0 10 0 0
## Newspaper 0 0 0 0
## Sales 0 0 0 0
Observamos que hay 181 registros que estan completos 9 registros faltantes tanto en TV como en Radio y un solo registro faltante en TV y Radio al mismo tiempo.
library(Hmisc)
publicidad$TV_imp_mean <- with(publicidad, impute(TV, mean))
publicidad$Radio_imp_mean <- with(publicidad, impute(Radio, mean))
publicidad_imp_mean <- publicidad
apply(publicidad_imp_mean, 2, function(x){sum(is.na(x))})
## X TV Radio Newspaper Sales
## 0 10 10 0 0
## TV_imp_mean Radio_imp_mean
## 0 0
Realizamos las imputaciones simples de las variables TV y Radio reemplazandolas por sus respectivas medias(TV=147.04 y Radio=23.264) guardandolo en el objeto: publicidad_imp_mean
#library(DMwR2)
publicidad_imp_knn <- DMwR2::knnImputation(publicidad[2:5],k=10,scale = TRUE, meth = "median",
distData = NULL)
summary(publicidad_imp_knn)
## TV Radio Newspaper Sales
## Min. : 0.7 Min. : 0.00 Min. : 0.30 Min. : 1.60
## 1st Qu.: 75.0 1st Qu.:10.18 1st Qu.: 12.75 1st Qu.:10.38
## Median :150.7 Median :22.00 Median : 25.75 Median :12.90
## Mean :147.5 Mean :23.09 Mean : 30.55 Mean :14.02
## 3rd Qu.:218.1 3rd Qu.:36.04 3rd Qu.: 45.10 3rd Qu.:17.40
## Max. :296.4 Max. :49.60 Max. :114.00 Max. :27.00
procedemos a realizar la imputación de los datos , esta vez por el método de vecinos mas cercanos(knn) y lo guardamos en el objetjo: publicidad_imp_knn
Observemos la variable TV
par(mfrow=c(1,2))
hist(publicidad_imp_knn$TV,col=2:7)
hist(publicidad_imp_mean$TV_imp_mean,col=2:7)
Realizamos un histograma de frecuencias para la variable TV por ambos métodos observando diferencias entre ambos gráficos.
par(mfrow=c(1,2))
plot(publicidad_imp_knn$TV)
plot(publicidad_imp_mean$TV_imp_mean)
Cuando ploteamos las observaciones es mas dificil darnos cuenta de estas diferencias.
##TV
plot(publicidad_imp_knn$TV,publicidad_imp_mean$TV_imp_mean, type="overplotted",
pch=2, col="red", xlab="vecinos",
ylab="media",
main="vecinos mas cercanos vs media"
)
Cuando sobre ponemos ambos gráficos observamos claramente los valores imputados por la media y como estos cuando los imputamos por knn se ajustan mejor al resto de valores.
Observemos la variable Radio
par(mfrow=c(1,2))
hist(publicidad_imp_knn$Radio,col=2:7)
hist(publicidad_imp_mean$Radio_imp_mean,col=2:7)
Realizamos un histograma de frecuencias para la variable Radio por ambos métodos observando diferencias entre ambos gráficos.
par(mfrow=c(1,2))
plot(publicidad_imp_knn$Radio)
plot(publicidad_imp_mean$Radio_imp_mean)
Cuando ploteamos las observaciones es mas dificil darnos cuenta de estas diferencias.
##Radio
plot(publicidad_imp_knn$Radio,publicidad_imp_mean$Radio_imp_mean, type="overplotted",
pch=2, col="blue", xlab="vecinos",
ylab="media",
main="vecinos mas cercanos vs media"
)
Cuando sobre ponemos ambos gráficos observamos claramente los valores imputados por la media y como estos cuando los imputamos por knn se ajustan mejor al resto de valores.
ajuste_cc_knn <- lm(Sales ~ TV + Radio + Newspaper, data = publicidad_imp_knn)
summary(ajuste_cc_knn)
##
## Call:
## lm(formula = Sales ~ TV + Radio + Newspaper, data = publicidad_imp_knn)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.9860 -0.9093 0.2120 1.2223 2.8400
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.000974 0.309905 9.684 <2e-16 ***
## TV 0.045572 0.001411 32.296 <2e-16 ***
## Radio 0.191614 0.008669 22.102 <2e-16 ***
## Newspaper -0.003993 0.005871 -0.680 0.497
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.681 on 196 degrees of freedom
## Multiple R-squared: 0.8977, Adjusted R-squared: 0.8962
## F-statistic: 573.6 on 3 and 196 DF, p-value: < 2.2e-16
Luego de realizar la regresión sobre la variable Sales, observamos que la variable independiente Newspaper no es significativa p_valor=0.623. Además el R-squared: 0.8979 nos indica que es un buen modelo.es decir el 89.79% de la varianza total de la variable Sales es explicada por la regresión.
ajuste_cc_mean <- lm(Sales ~ TV_imp_mean + Radio_imp_mean + Newspaper, data = publicidad_imp_mean)
summary(ajuste_cc_mean)
##
## Call:
## lm(formula = Sales ~ TV_imp_mean + Radio_imp_mean + Newspaper,
## data = publicidad_imp_mean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.8363 -0.9037 0.2831 1.3083 5.8197
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.838768 0.362372 7.834 2.93e-13 ***
## TV_imp_mean 0.045801 0.001641 27.906 < 2e-16 ***
## Radio_imp_mean 0.191764 0.010035 19.110 < 2e-16 ***
## Newspaper -0.003266 0.006710 -0.487 0.627
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.925 on 196 degrees of freedom
## Multiple R-squared: 0.8659, Adjusted R-squared: 0.8638
## F-statistic: 421.7 on 3 and 196 DF, p-value: < 2.2e-16
Luego de realizar la regresión sobre la variable Sales, observamos que la variable independiente Newspaper no es significativa p_valor=0.882. Además el R-squared: 0.8577 nos indica que es un buen modelo.es decir el 85.77% de la varianza total de la variable Sales es explicada por la regresión.
En conclusión podemos decir que el modelo de regresión ajustado para las variables implutadas por el método de vecinos más cercanos es mejor que el realizado por las variables imputadas por el método de la media.
library(mice)
imp1 <- mice(publicidad[2:5], m = 5, seed = 2)
##
## iter imp variable
## 1 1 TV Radio
## 1 2 TV Radio
## 1 3 TV Radio
## 1 4 TV Radio
## 1 5 TV Radio
## 2 1 TV Radio
## 2 2 TV Radio
## 2 3 TV Radio
## 2 4 TV Radio
## 2 5 TV Radio
## 3 1 TV Radio
## 3 2 TV Radio
## 3 3 TV Radio
## 3 4 TV Radio
## 3 5 TV Radio
## 4 1 TV Radio
## 4 2 TV Radio
## 4 3 TV Radio
## 4 4 TV Radio
## 4 5 TV Radio
## 5 1 TV Radio
## 5 2 TV Radio
## 5 3 TV Radio
## 5 4 TV Radio
## 5 5 TV Radio
imp1
## Class: mids
## Number of multiple imputations: 5
## Imputation methods:
## TV Radio Newspaper Sales
## "pmm" "pmm" "" ""
## PredictorMatrix:
## TV Radio Newspaper Sales
## TV 0 1 1 1
## Radio 1 0 1 1
## Newspaper 1 1 0 1
## Sales 1 1 1 0
Verificamos el métodos de imputación utilizado:
imp1$method
## TV Radio Newspaper Sales
## "pmm" "pmm" "" ""
Estos gráficos nos servirán para revisar si las imputaciones realizadas son muy variables entre diferentes datasets.
library(lattice)
xyplot(imp1, TV ~ Radio | .imp, pch = 20, cex = 1.4)
densityplot(imp1)
stripplot(imp1, pch = 20)
#Resultados del modelo:
ajuste_imp <- with(imp1, lm( Sales ~ TV + Radio + Newspaper))
summary(ajuste_imp)
## # A tibble: 20 x 6
## term estimate std.error statistic p.value nobs
## <chr> <dbl> <dbl> <dbl> <dbl> <int>
## 1 (Intercept) 3.02 0.306 9.86 7.14e-19 200
## 2 TV 0.0455 0.00138 32.9 7.42e-82 200
## 3 Radio 0.192 0.00859 22.3 1.03e-55 200
## 4 Newspaper -0.00244 0.00582 -0.419 6.75e- 1 200
## 5 (Intercept) 2.88 0.314 9.19 5.60e-17 200
## 6 TV 0.0457 0.00140 32.7 2.31e-81 200
## 7 Radio 0.192 0.00875 22.0 8.60e-55 200
## 8 Newspaper -0.000131 0.00589 -0.0223 9.82e- 1 200
## 9 (Intercept) 3.03 0.312 9.70 1.99e-18 200
## 10 TV 0.0449 0.00140 32.0 9.66e-80 200
## 11 Radio 0.192 0.00866 22.1 3.22e-55 200
## 12 Newspaper -0.000233 0.00590 -0.0395 9.69e- 1 200
## 13 (Intercept) 2.98 0.312 9.58 4.59e-18 200
## 14 TV 0.0456 0.00140 32.6 3.55e-81 200
## 15 Radio 0.188 0.00866 21.8 3.61e-54 200
## 16 Newspaper -0.000433 0.00589 -0.0735 9.41e- 1 200
## 17 (Intercept) 2.98 0.308 9.67 2.47e-18 200
## 18 TV 0.0455 0.00139 32.8 1.27e-81 200
## 19 Radio 0.188 0.00850 22.2 2.88e-55 200
## 20 Newspaper 0.00108 0.00582 0.185 8.53e- 1 200
Analisis de resultados: Se juntan los coeficientes y errores estándares de los 5 modelos de regresión
ajuste_comb <- pool(ajuste_imp)
summary(ajuste_comb)
## term estimate std.error statistic df p.value
## 1 (Intercept) 2.9801845846 0.316808539 9.40689477 173.6858 0.0000000
## 2 TV 0.0454564206 0.001432776 31.72612037 161.4607 0.0000000
## 3 Radio 0.1904443399 0.008886755 21.43013346 159.4035 0.0000000
## 4 Newspaper -0.0004321704 0.006029325 -0.07167807 162.5162 0.9429462
pool.r.squared(ajuste_imp)
## est lo 95 hi 95 fmi
## R^2 0.8976401 0.8666498 0.9217481 NaN
Luego de realizar la regresión sobre la variable Sales, observamos que la variable independiente Newspaper no es significativa p_valor= 9.829234e-01. Además el R-squared: 0.8955467 nos indica que es un buen modelo.es decir el 89.55% de la varianza total de la variable Sales es explicada por la regresión.