library(tidyverse)
library(readr)
library(ggplot2)
library(plotly)
library(dplyr)
library(summarytools)
library(knitr)
library(rmarkdown)
library(lubridate)
library(modeest)
library(ggcorrplot)Actividad Final
Cargar librerías necesarias
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") | 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()
p1Boxplot 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