1.-Cargar la base de datos y mostrar la estructura de las variables.

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.

2.-Convertir a lo mucho el 5% de valores de las variables Radio y TV a datos perdidos (NA). Guardar la nueva base de datos en un nueva data frame con el nombre publicidad.

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

3.-Mostrar la proporción de datos perdidos por variable y por registro. Interpretar estos valores.

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

4.-Analizar y visualizar el patrón de datos perdidos.

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.

5.-Realizar imputación simple usando la media y guardar la información en una nueva columna del dataset publicidad: imp_mean.

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

6.-Realizar imputación por vecinos más cercanos empleando una cantidad adecuada de vecinos y guardar la información en publicidad (imp_knn).

#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

7.-Comparar los datos imputados por la media y por vecinos más cercanos.

7.1.-¿Qué tan diferentes son? Graficar para visualizar las observaciones imputadas por ambos métodos.

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.

8.-Se desean predecir las ventas en base a los valores invertidos en publicidad. Realizar una regresión lineal con los datos imputados (es su criterio elegir publicidad imp_mean o publicidad imp_knn).

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.

9.-Realizar imputación múltiple con el paquete mice y visualizar los datos imputados para cada variable y en cada muestra generada por la imputación. Comentar al respecto.

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)

10.-Elaborar una regresión lineal, similar a la del item 8, usando lo obtenido por imputación múltiple. Comparar los resultados con la regresión lineal anterior.

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