Actividad Final

Cargar librerías necesarias

library(tidyverse) 
library(readr) 
library(ggplot2) 
library(plotly) 
library(dplyr) 
library(summarytools) 
library(knitr) 
library(rmarkdown) 
library(lubridate) 
library(modeest) 
library(ggcorrplot)

Carga y exploración de datos

setwd("C:/Users/jm702/OneDrive/Documentos/data en r")
datos <- read_csv("archive/Walmart Data Analysis and Forcasting.csv")
dplyr::glimpse(datos)
Rows: 6,435
Columns: 8
$ Store        <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ Date         <chr> "05-02-2010", "12-02-2010", "19-02-2010", "26-02-2010", "…
$ Weekly_Sales <dbl> 1643691, 1641957, 1611968, 1409728, 1554807, 1439542, 147…
$ Holiday_Flag <dbl> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ Temperature  <dbl> 42.31, 38.51, 39.93, 46.63, 46.50, 57.79, 54.58, 51.45, 6…
$ Fuel_Price   <dbl> 2.572, 2.548, 2.514, 2.561, 2.625, 2.667, 2.720, 2.732, 2…
$ CPI          <dbl> 211.0964, 211.2422, 211.2891, 211.3196, 211.3501, 211.380…
$ Unemployment <dbl> 8.106, 8.106, 8.106, 8.106, 8.106, 8.106, 8.106, 8.106, 7…
datos %>% 
  slice_head(n = 10) %>% 
  knitr::kable(caption = "Tabla 1: Primeras 10 filas del conjunto de datos", align = "c") 
Tabla 1: Primeras 10 filas del conjunto de datos
Store Date Weekly_Sales Holiday_Flag Temperature Fuel_Price CPI Unemployment
1 05-02-2010 1643691 0 42.31 2.572 211.0964 8.106
1 12-02-2010 1641957 1 38.51 2.548 211.2422 8.106
1 19-02-2010 1611968 0 39.93 2.514 211.2891 8.106
1 26-02-2010 1409728 0 46.63 2.561 211.3196 8.106
1 05-03-2010 1554807 0 46.50 2.625 211.3501 8.106
1 12-03-2010 1439542 0 57.79 2.667 211.3806 8.106
1 19-03-2010 1472516 0 54.58 2.720 211.2156 8.106
1 26-03-2010 1404430 0 51.45 2.732 211.0180 8.106
1 02-04-2010 1594968 0 62.27 2.719 210.8204 7.808
1 09-04-2010 1545419 0 65.86 2.770 210.6229 7.808
dfSummary(datos)
Data Frame Summary  
datos  
Dimensions: 6435 x 8  
Duplicates: 0  

-----------------------------------------------------------------------------------------------------------------------
No   Variable       Stats / Values                   Freqs (% of Valid)     Graph                  Valid      Missing  
---- -------------- -------------------------------- ---------------------- ---------------------- ---------- ---------
1    Store          Mean (sd) : 23 (13)              45 distinct values     : : : : : : : : :      6435       0        
     [numeric]      min < med < max:                                        : : : : : : : : :      (100.0%)   (0.0%)   
                    1 < 23 < 45                                             : : : : : : : : :                          
                    IQR (CV) : 22 (0.6)                                     : : : : : : : : :                          
                                                                            : : : : : : : : :                          

2    Date           1. 01-04-2011                      45 ( 0.7%)                                  6435       0        
     [character]    2. 01-06-2012                      45 ( 0.7%)                                  (100.0%)   (0.0%)   
                    3. 01-07-2011                      45 ( 0.7%)                                                      
                    4. 01-10-2010                      45 ( 0.7%)                                                      
                    5. 02-03-2012                      45 ( 0.7%)                                                      
                    6. 02-04-2010                      45 ( 0.7%)                                                      
                    7. 02-07-2010                      45 ( 0.7%)                                                      
                    8. 02-09-2011                      45 ( 0.7%)                                                      
                    9. 02-12-2011                      45 ( 0.7%)                                                      
                    10. 03-02-2012                     45 ( 0.7%)                                                      
                    [ 133 others ]                   5985 (93.0%)           IIIIIIIIIIIIIIIIII                         

3    Weekly_Sales   Mean (sd) : 1046965 (564366.6)   6435 distinct values   :                      6435       0        
     [numeric]      min < med < max:                                        : : .                  (100.0%)   (0.0%)   
                    209986.2 < 960746 < 3818687                             : : : :                                    
                    IQR (CV) : 866808.6 (0.5)                               : : : : :                                  
                                                                            : : : : : :                                

4    Holiday_Flag   Min  : 0                         0 : 5985 (93.0%)       IIIIIIIIIIIIIIIIII     6435       0        
     [numeric]      Mean : 0.1                       1 :  450 ( 7.0%)       I                      (100.0%)   (0.0%)   
                    Max  : 1                                                                                           

5    Temperature    Mean (sd) : 60.7 (18.4)          3528 distinct values               : :        6435       0        
     [numeric]      min < med < max:                                                . : : : .      (100.0%)   (0.0%)   
                    -2.1 < 62.7 < 100.1                                             : : : : :                          
                    IQR (CV) : 27.5 (0.3)                                         : : : : : :                          
                                                                                : : : : : : : .                        

6    Fuel_Price     Mean (sd) : 3.4 (0.5)            892 distinct values              : .          6435       0        
     [numeric]      min < med < max:                                          :       : :          (100.0%)   (0.0%)   
                    2.5 < 3.4 < 4.5                                           : : . . : : .                            
                    IQR (CV) : 0.8 (0.1)                                    : : : : : : : :                            
                                                                            : : : : : : : : :                          

7    CPI            Mean (sd) : 171.6 (39.4)         2145 distinct values   :                      6435       0        
     [numeric]      min < med < max:                                        :                      (100.0%)   (0.0%)   
                    126.1 < 182.6 < 227.2                                   :               :                          
                    IQR (CV) : 81 (0.2)                                     : :             : :                        
                                                                            : :       . : . : :                        

8    Unemployment   Mean (sd) : 8 (1.9)              349 distinct values          . :              6435       0        
     [numeric]      min < med < max:                                              : :              (100.0%)   (0.0%)   
                    3.9 < 7.9 < 14.3                                            : : :                                  
                    IQR (CV) : 1.7 (0.2)                                        : : :                                  
                                                                            . : : : : : .     .                        
-----------------------------------------------------------------------------------------------------------------------

Limpieza y transformación de datos

datos <- datos %>% distinct()
cat("Número de filas después de eliminar duplicados: ", nrow(datos), "\n")
Número de filas después de eliminar duplicados:  6435 
datos <- datos %>% drop_na()
cat("Número de filas después de eliminar valores faltantes: ", nrow(datos), "\n")
Número de filas después de eliminar valores faltantes:  6435 

Crear nuevas variables a partir de las existentes

datos <- datos %>%
  mutate(Date = dmy(Date),
         Day = day(Date),
         Month = month(Date),
         Year = year(Date))

Análisis estadístico

summary(datos %>% select_if(is.numeric))
     Store     Weekly_Sales      Holiday_Flag      Temperature    
 Min.   : 1   Min.   : 209986   Min.   :0.00000   Min.   : -2.06  
 1st Qu.:12   1st Qu.: 553350   1st Qu.:0.00000   1st Qu.: 47.46  
 Median :23   Median : 960746   Median :0.00000   Median : 62.67  
 Mean   :23   Mean   :1046965   Mean   :0.06993   Mean   : 60.66  
 3rd Qu.:34   3rd Qu.:1420159   3rd Qu.:0.00000   3rd Qu.: 74.94  
 Max.   :45   Max.   :3818686   Max.   :1.00000   Max.   :100.14  
   Fuel_Price         CPI         Unemployment         Day       
 Min.   :2.472   Min.   :126.1   Min.   : 3.879   Min.   : 1.00  
 1st Qu.:2.933   1st Qu.:131.7   1st Qu.: 6.891   1st Qu.: 8.00  
 Median :3.445   Median :182.6   Median : 7.874   Median :16.00  
 Mean   :3.359   Mean   :171.6   Mean   : 7.999   Mean   :15.68  
 3rd Qu.:3.735   3rd Qu.:212.7   3rd Qu.: 8.622   3rd Qu.:23.00  
 Max.   :4.468   Max.   :227.2   Max.   :14.313   Max.   :31.00  
     Month             Year     
 Min.   : 1.000   Min.   :2010  
 1st Qu.: 4.000   1st Qu.:2010  
 Median : 6.000   Median :2011  
 Mean   : 6.448   Mean   :2011  
 3rd Qu.: 9.000   3rd Qu.:2012  
 Max.   :12.000   Max.   :2012  

Matriz de correlaciones

correlaciones <- datos %>% select_if(is.numeric) %>% cor(use = "complete.obs")
ggcorrplot(correlaciones, lab = TRUE, outline.col = "white", colors = c("blue", "white", "red"))

Si el coeficiente de correlación es positivo, significa que el precio del combustible ha aumentado con los años, como se observa entre Year y Fuel_Price.

Regresión lineal múltiple

modelo <- lm(Weekly_Sales ~ Temperature + Fuel_Price + CPI + Unemployment, data = datos)
sumario_modelo <- summary(modelo)
kable(sumario_modelo$coefficients)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1743607.6200 79553.0738 21.9175393 0.0000000
Temperature -885.6699 396.1955 -2.2354367 0.0254229
Fuel_Price -12248.4245 15751.8311 -0.7775873 0.4368409
CPI -1585.8180 195.1636 -8.1255844 0.0000000
Unemployment -41214.9873 3972.6666 -10.3746403 0.0000000

Variables significativas: Temperatura, CPI y Desempleo tienen un efecto claro en las ventas.

Variable no significativa: El precio del combustible no parece afectar significativamente las ventas.

La relación negativa con CPI y Desempleo indica que factores macroeconómicos como el costo de vida y la falta de empleo tienen un impacto fuerte en el comportamiento del consumidor.

Prueba de hipótesis (t-test)

t_test_result <- t.test(Weekly_Sales ~ Holiday_Flag, data = datos)
print(t_test_result)

    Welch Two Sample t-test

data:  Weekly_Sales by Holiday_Flag
t = -2.6801, df = 504, p-value = 0.007602
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -141473.17  -21789.85
sample estimates:
mean in group 0 mean in group 1 
        1041256         1122888 

La prueba t de Welch muestra que las ventas en días festivos son significativamente mayores en comparación con los días normales (p < 0.05).

Esto es respaldado visualmente por el boxplot, donde se observa una diferencia clara entre los grupos.

Visualización de datos

Histograma con etiquetas y mejoras visuales

p1 <- ggplot(datos, aes(x = Weekly_Sales)) +
  geom_histogram(binwidth = 50000, fill = "blue", alpha = 0.5, color = "black") +
  labs(title = "Distribución de Ventas Semanales", x = "Ventas Semanales", y = "Frecuencia") +
  theme_minimal()
p1

Boxplot con etiquetas

p2 <- ggplot(datos, aes(x = as.factor(Holiday_Flag), y = Weekly_Sales)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(title = "Comparación de Ventas en Días Festivos", x = "Día Festivo", y = "Ventas Semanales") +
  theme_minimal()
p2