Este informe presenta un análisis de los ingresos trimestrales de Walmart desde el primer trimestre de 2009 hasta el cuarto trimestre de 2024. El propósito es examinar la evolución de estos ingresos a lo largo del tiempo, identificando tendencias, patrones estacionales y fluctuaciones que puedan haber influído en el desempeño financiero de la compañía en este tiempo. Para ello, se aplicarán técnicas de análisis de series temporales, incluyendo la descomposición de señales y la modelización mediante ARIMA. Estas herramientas permitirán extraer información clave sobre la dinámica de los ingresos y realizar proyecciones futuras que pueden ser útiles para la toma de decisiones estratégicas. A lo largo del documento, se presentarán estadísticas descriptivas, gráficos ilustrativos y modelos de pronóstico con el fin de proporcionar una visión clara del comportamiento financiero de Walmart en los últimos 15 años.
Antes de ajustar un modelo ARIMA, es necesario entender la estructura de la serie de tiempo.
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
Empezaremos visualizando la serie de datos original.
## Qtr1 Qtr2 Qtr3 Qtr4
## 2009 108627 94242 100876 99373
## 2010 113594 99811 103726 101952
## 2011 116360 104189 109366 110226
## 2012 122728 113010 114282 113800
## 2013 127559 114070 116830 115688
## 2014 129706 114960 120125 119001
## 2015 131565 114826 120229 117408
## 2016 129667 115904 120854 118179
## 2017 130936 117542 123355 123179
## 2018 136267 122690 128028 124894
## 2019 138793 123925 130377 127991
## 2020 141671 134622 137742 134708
## 2021 152079 138310 141048 140525
## 2022 152871 141569 152859 152813
## 2023 164048 152301 161632 160804
## 2024 173388 161508 169335 169588
## Min Max Media Mediana DesviacionEstandar CoefVar
## 1 94242 173388 128345.8 123640 19242.99 0.1499308
En la tabla siguiente se observa lo siguiente:
En promedio, cada trimestre ha tenido ingresos de alrededor de 128.345 millones de USD. Este es un valor de referencia para entender el comportamiento típico.
La mediana indica que la mitad de los trimestres tuvieron ingresos menores a 123.640 millones de USD y la otra mitad tuvo más. Como está un poco por debajo de la media, sugiere que hay algunos valores altos que están elevando el promedio.
Existe una variabilidad moderada en los ingresos trimestrales de Walmart. Un valor de 19242 indica que los datos fluctúan de forma moderada alrededor del promedio.
El coeficiente de variación de la serie de datos es moderado. Un 15% implica que, aunque hay oscilaciones, los datos no son extremadamente dispersos respecto al promedio.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
La Figura 1 muestra la evolución de los ingresos trimestrales de Walmart a lo largo del tiempo. En general, se observa una tendencia creciente, con fluctuaciones periódicas que sugieren la presencia de patrones estacionales. Aunque los ingresos han aumentado de manera sostenida, también se presentan periodos con tasas de crecimiento menores, como lo vemos desde 2013 hasta 2018, lo que indica que existen factores como el crecimiento del e-commerce, tasas de inflación altas, reestructuraciones internas, aumento en la competencia, y bajas tasas de crecimiento económico en algunos países. Este análisis visual permite identificar tendencias generales y posibles patrones que serán explorados con mayor detalle en las siguientes secciones.
Muchas series de tiempo son una combinación de varias influencias. Por eso, separar la tendencia, la estacionalidad y los componentes aleatorios permite entender mejor qué impulsa los cambios en los ingresos de Walmart. Si analizamos el comportamiento de los ingresos trimestrales, es importante determinar si el crecimiento se debe a una tendencia real o a fluctuaciones estacionales. Los modelos de pronóstico funcionan mejor cuando las señales subyacentes están bien definidas. Por ejemplo, si eliminamos la estacionalidad de la serie, los modelos predictivos pueden enfocarse en la tendencia real y reducir errores. Además, detectar cambios inesperados en la serie es más fácil cuando se eliminan componentes predecibles. Por ejemplo, si hay una caída abrupta en los ingresos de un trimestre en particular, podemos evaluar si se trata de una anomalía puntual o de un cambio estructural en el mercado. En conclusión, la descomposición de series de tiempo permite comprender mejor los datos, mejorar predicciones y tomar decisiones más estratégicas. Es una herramienta clave en la analítica financiera, especialmente en entornos donde las fluctuaciones en los ingresos pueden afectar la planificación, las inversiones y la estrategia comercial de la empresa.
Interpretación Figura A.Descomposición temporal
Componente Estacional La serie muestra patrones recurrentes a lo largo del tiempo, con variaciones cíclicas bien definidas. Se observa que las caídas o incrementos en el componente estacional ocurren en intervalos similares cada año, especialmente en el primer y cuarto trimestre. Esto sugiere que Walmart experimenta aumentos de ingresos en ciertos trimestres, probablemente debido a eventos comerciales como Navidad, Halloween, Thanksgiving, y Black Friday.
Tendencia Se evidencia un crecimiento progresivo en los ingresos a lo largo del tiempo, lo que indica una expansión sostenida de la empresa. A partir de 2020, los ingresos muestran un fuerte incremento, posiblemente debido al auge del comercio minorista impulsado por la pandemia y al e-commerce.
Residuo Se observan fluctuaciones que no siguen ni la tendencia ni la estacionalidad, lo que indica la presencia de eventos inesperados. Esto podría deberse a factores externos como cambios en la economía global, inflación, alteraciones en la demanda de los consumidores, o pandemia.
Graficamos serie original VS ajustada por estacionalidad
## Warning in geom_line(aes(x = fechas, y = ingresos_ts), color = "grey", size =
## 0.5, : Ignoring unknown parameters: `name`
## Warning in geom_line(aes(x = fechas, y = ingresos_sa), color = "black", :
## Ignoring unknown parameters: `name`
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
La serie original de ingresos contiene variaciones estacionales y aleatorias que pueden dificultar la identificación de patrones reales. La extracción de la tendencia permite centrarse en los cambios estructurales de la serie. Analizar la tendencia ayuda a prever escenarios futuros y anticipar posibles crisis o oportunidades en el sector de consumo.
Graficamos la serie original VS tendencia
## Warning in geom_line(aes(x = fechas, y = ingresos_ts), color = "grey", size =
## 0.7, : Ignoring unknown parameters: `name`
## Warning in geom_line(aes(x = fechas, y = tendencia), color = "black", size =
## 0.8, : Ignoring unknown parameters: `name`
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
Graficamos la tasa de crecimiento de la serie original VS tendencia
## [1] 60
## [1] 60
## [1] 60
Interpretación Figura 3. Tendencia VS original: crecimiento anual%
Mientras que la serie original muestra mucha variabilidad, la tendencia permite identificar patrones más claros y estructurales en el crecimiento y decrecimiento de los ingresos.
Analizar la tasa de crecimiento anual ayuda a detectar cambios en el entorno económico que afectan el sector. Se pueden prever crisis o períodos de auge y prepararse para ellos.
Permite evaluar si el sector de consumo sigue una dinámica similar a la nacional o global.
*A lo largo del tiempo, la tasa de crecimiento de los ingresos de Walmart ha sido constante, que ha pesar de tener momentos con una menor tasa de crecimiento y otros con una grandes tasas de crecimiento, siempre se ha mantenido positiva.
*Se identifican picos de crecimiento en 2011 y 2022, relacionados con Walmart convirtiéndose en la casa matriz de Massmart, expandiendo su alcance por continente africano, y en 2022 por el auge del e-commerce y la actualización tecnológica de Walmart..
*La caída en la tasa de crecimiento en 2015 es seguida por una recuperación rápida, lo que indica la resiliencia del sector y un eficiente progreso hacia la tecnología y el e-commerce por parte de Walmart para ganar participación de mercado a grandes compañías como Amazon.
*La tendencia reciente sugiere una alta tasa de crecimiento en los ingresos de Walmart..
Un modelo ARIMA (Autoregressive Integrated Moving Average) es una herramienta estadística utilizada para analizar y predecir series de tiempo. En términos simples, es como una “bola de cristal matemática” que usa datos pasados para estimar valores futuros, especialmente útil en finanzas para preveer precios, ventas o ingresos.
Desglose del nombre ARIMA
Autoregressive o autorregresivo (AR) → Usa valores pasados para predecir el futuro Integrated (I) → Ajusta tendencias en los datos para hacerlos estacionarios (sin patrones cambiantes en el tiempo). 3.MAving Average o media móvil (MA)- → Suaviza fluctuaciones aleatorias a partir de errores pasados.
ARIMA combina estos tres elementos para crear una predicción más precisa.
train_size <- length(ingresos_ts) - 2
train_ts <- window(ingresos_ts, end = c(2024, 1))
test_ts <- window(ingresos_ts, start = c(2024, 2))
La metodología Box-Jenkins es un enfoque sistemático para construir modelos ARIMA con el objetivo de analizar y pronosticar series de tiempo. Fue desarrollada por George Box y Gwilym Jenkins y se basa en cuatro etapas clave:
1️⃣ Identificación 2️⃣ Estimación 3️⃣ Validación 4️⃣ Pronóstico
Se usa especialmente cuando se quiere encontrar el modelo ARIMA más adecuado para una serie de tiempo.
Antes de empezar a aplicar la metodlogía BOX-JENKINS, debemos dividir el conjunto de datos de prueba y entrenamiento
✅ Para entrenar el modelo con datos históricos sin usar información futura. ✅ Para evaluar la precisión del modelo comparando sus predicciones con los datos reales de prueba.
💡 Esta división es clave en modelos predictivos para evitar sobreajuste y evaluar el rendimiento en datos no vistos.
En el análisis de series de tiempo, una serie es estacionaria si su comportamiento es constante a lo largo del tiempo, es decir:
✅ Su promedio no cambia con el tiempo. ✅ Su variabilidad (qué tanto fluctúa) se mantiene estable. ✅ Su relación con valores pasados es siempre la misma.
¿Cómo saber si una serie es estacionaria?
1️⃣ Observando un gráfico Si el gráfico de la serie muestra una tendencia creciente o decreciente, o si las variaciones se hacen más grandes con el tiempo, la serie probablemente no es estacionaria. 2️⃣ Usando la prueba de Dickey-Fuller Aumentada (ADF) Es una prueba estadística que nos dice si la serie tiene una tendencia fuerte. Si el p-valor de la prueba es mayor a 0.05, significa que la serie no es estacionaria.
¿Cómo hacer una serie estacionaria?
Si encontramos que la serie no es estacionaria, podemos transformarla para que lo sea:
✅ Diferenciación: Restamos cada valor con su valor anterior. Esto elimina tendencias crecientes o decrecientes. ✅ Tomar el logaritmo: Si la variabilidad crece con el tiempo, aplicar un logaritmo estabiliza la varianza. ✅ Eliminar tendencias o ajustar estacionalidad: Si hay patrones repetitivos, podemos restarlos o modelarlos por separado.
Test de Dickey-Fuller
El test de Dickey-Fuller aumentado (ADF) se usa para verificar si una serie temporal es estacionaria, es decir, si sus propiedades estadísticas (media y varianza) permanecen constantes en el tiempo.
HO: Serie no estacionaria HI: Serie estacionaria
¿Qué significa el p-valor?
Si el p-valor es bajo (< 0.05) → Rechazamos la hipótesis nula y concluimos que la serie es estacionaria. Si el p-valor es alto (> 0.05) → No podemos rechazar la hipótesis nula, lo que indica que la serie no es estacionaria.
adf_test <- adf.test(train_ts)
## Warning in adf.test(train_ts): p-value greater than printed p-value
print(adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: train_ts
## Dickey-Fuller = 2.094, Lag order = 3, p-value = 0.99
## alternative hypothesis: stationary
if (adf_test$p.value > 0.05 && length(train_ts) > 1) {
train_diff <- diff(train_ts, differences = 1)
}
Diferenciación en niveles
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
Diferenciación en logaritmo
Cuando una serie de tiempo tiene una creciente varianza (lo que significa que la amplitud de las fluctuaciones aumenta con el tiempo), aplicar un logaritmo puede ayudar a estabilizar esta varianza. Muchas series económicas o financieras, como el precio de acciones o el Producto Interno Bruto (PIB), tienden a mostrar crecimiento exponencial o crecimiento en porcentaje (por ejemplo, tasas de crecimiento de doble dígito).
En conclusión, la aplicación de logaritmos en series de tiempo se realiza principalmente para lograr que la serie sea más estable, lineal y estacionaria. Esta transformación es relevante porque permite modelar mejor las series que siguen un crecimiento exponencial y facilita la aplicación de técnicas estadísticas que requieren estacionariedad.
Prueba de estacionariedad con Augmented Dickey-Fuller (ADF)
adf_test <- adf.test(train_ts)
## Warning in adf.test(train_ts): p-value greater than printed p-value
print(adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: train_ts
## Dickey-Fuller = 2.094, Lag order = 3, p-value = 0.99
## alternative hypothesis: stationary
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
Ahora probamos estacionariedad en la serie diferenciada (nivel y logaritmo) Segunda prueba de estacionariedad sobre la serie diferenciada
adf_test_diff <- adf.test(train_diff)
print(adf_test_diff)
##
## Augmented Dickey-Fuller Test
##
## data: train_diff
## Dickey-Fuller = -3.0552, Lag order = 3, p-value = 0.1483
## alternative hypothesis: stationary
Segunda prueba de estacionariedad sobre la serie diferenciada en logaritmo
adf_test_diff_log <- adf.test(train_diff_log)
print(adf_test_diff_log)
##
## Augmented Dickey-Fuller Test
##
## data: train_diff_log
## Dickey-Fuller = -3.153, Lag order = 3, p-value = 0.1087
## alternative hypothesis: stationary
En el test ADF se muestra que el valor que puede tomar d=1:
El valor-p ya es menor a 0.05 con una primera diferencia en niveles o con logaritmo natural.
Identificación manual de p y q
¿Qué hacen estos gráficos?
ACF (Autocorrelation Function)
Muestra la correlación de la serie con sus rezagos.
Ayuda a determinar el parámetro q en un modelo ARIMA(p, d, q).
PACF (Partial Autocorrelation Function)
Muestra la correlación parcial entre la serie y un rezago específico, eliminando el efecto de rezagos intermedios.
Ayuda a determinar el parámetro p en un modelo ARIMA(p, d, q).
Recordemos El eje X representa los rezagos (lags). El eje Y muestra la autocorrelación parcial en cada rezago. Las líneas azules punteadas son los intervalos de confianza (aproximadamente 95%). Si una barra sobrepasa estos límites, indica una autocorrelación significativa. Si las barras caen dentro de los límites, no son significativamente diferentes de cero
Cálculo manual del modelo ARIMA
manual_arima_model <- Arima(train_ts, order = c(3,1,4))
summary(manual_arima_model)
## Series: train_ts
## ARIMA(3,1,4)
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2 ma3 ma4
## -0.9998 -0.9980 -0.9982 1.1218 1.0233 1.0910 0.2104
## s.e. 0.0172 0.0215 0.0060 0.1367 0.1998 0.1784 0.1973
##
## sigma^2 = 5840544: log likelihood = -555.42
## AIC=1126.84 AICc=1129.66 BIC=1143.59
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 883.7611 2252.681 1665.467 0.6464111 1.311935 0.3763289 -0.1429449
El modelo manual siguiente refleja:
Coeficientes AR (ar1, ar2, ar3): Todos son negativos y cercanos a -1, lo que indica una fuerte dependencia de los valores pasados.
AIC (1126.84) y BIC (1143.59): Se usan para comparar modelos; cuanto más bajos, mejor.
Métricas de evaluación
Mean Absolute Error (MAE) = 1665.467
Representa el error absoluto promedio entre las predicciones del modelo y los valores reales. Interpretación: En promedio, el modelo se equivoca en $1665 al predecir la cantidad de Ingresos de Walmart.
Root Mean Squared Error (RMSE) = 2252.681
Similar al MAE, pero da más peso a los errores grandes, porque eleva las diferencias al cuadrado antes de promediarlas. Interpretación: Un error típico en la predicción es de aproximadamente $2252.
Comparación con MAE: Como el RMSE es mayor que el MAE, es posible que haya algunos errores grandes que estén influyendo más en el RMSE.
Mean Absolute Percentage Error (MAPE) = 1.31%
Expresa el error en términos relativos, como porcentaje del valor real.
Interpretación: En promedio, el modelo se equivoca en un 1.31% al predecir el monto de ingresos.
Regla general: MAPE < 10% → Muy buen modelo ✅ 10%-20% → Modelo aceptable 👍 20%-50% → Modelo pobre ⚠️ 50% → Modelo muy malo ❌
En este caso, un MAPE de 1.31% sugiere un modelo muy bueno.
Significancia de coefcientes
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
coeftest(manual_arima_model)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.9997810 0.0171825 -58.1860 < 2.2e-16 ***
## ar2 -0.9979611 0.0214751 -46.4707 < 2.2e-16 ***
## ar3 -0.9981715 0.0059683 -167.2452 < 2.2e-16 ***
## ma1 1.1218039 0.1366772 8.2077 2.255e-16 ***
## ma2 1.0232817 0.1998205 5.1210 3.039e-07 ***
## ma3 1.0910177 0.1784132 6.1151 9.649e-10 ***
## ma4 0.2104115 0.1972784 1.0666 0.2862
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ar1, ar2 y ar3 → Son altamente significativos (***), lo que significa que estos coeficientes tienen un impacto importante en el modelo.
La validación de residuos es crucial para determinar si el modelo ARIMA es adecuado o si necesita mejoras. El objetivo es verificar que los residuos (errores de predicción) se comporten como ruido blanco, es decir, sin patrones detectables.
1. Serie de residuos (gráfico superior)
Muestra cómo se comportan los errores a lo largo del tiempo. Idealmente, deberían oscilar alrededor de cero sin tendencias evidentes ni grandes acumulaciones de error. Problema posible: Se observan picos alrededor de 2009, 2012, 2020 y 2022, lo que podría indicar cambios estructurales en los datos.
2. Función de Autocorrelación (gráfico inferior izquierdo, ACF de residuos)
Si el modelo es adecuado, los residuos no deben mostrar correlaciones significativas en el tiempo.
Interpretación: Todas las barras están dentro de las líneas azules (intervalos de confianza), lo que sugiere toda la estructura está capturada en los datos.Esto indica que el modelo es muy bueno.
3. Histograma de residuos con ajuste normal (gráfico inferior derecho)
Sirve para verificar si los errores siguen una distribución normal, lo cual es un supuesto clave en ARIMA. Interpretación: La curva naranja representa la distribución normal teórica. Los residuos se acercan a la normalidad, pero hay algunos valores extremos (colas más gruesas de lo esperado). Esto indica que puede haber eventos atípicos o datos no bien explicados por el modelo.
##
## Ljung-Box test
##
## data: Residuals from ARIMA(3,1,4)
## Q* = 7.0597, df = 3, p-value = 0.07002
##
## Model df: 7. Total lags used: 10
El modelo sigue la tendencia general, pero tiene un sesgo de sobreestimación.
Si la serie tiene patrones estacionales fuertes y no están bien capturados, el modelo puede fallar en prever las fluctuaciones.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## MAE Manual: 4207.626
## RMSE Manual: 5068.358
MAE (Mean Absolute Error)
Indica el error promedio en unidades de la variable, es decir, los ingresos. En promedio, el modelo se equivoca en $4207 al hacer su predicción.
RMSE (Root Mean Squared Error)
Penaliza más los errores grandes debido a la elevación al cuadrado antes de calcular la raíz. Su valor de $5068 sugiere que hay errores muy pequeños que no afectan significativamente la precisión del modelo.
Tabla de pronóstico modelo manual
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Tiempo Observado Pronosticado
## 1 2024.25 161508 160608.4
## 2 2024.50 169335 165414.8
## 3 2024.75 169588 161785.0
Ahora pronosticamos fuera del periodo de análisis
Es decir, le sumamos al periodo de prueba una observación más. Es decir, se estan pronosticando 4 observaciones o trimestres.
## Tiempo Pronostico
## 1 2024.25 160608.4
## 2 2024.50 165414.8
## 3 2024.75 161785.0
## 4 2025.00 173480.3
## [1] "Pronóstico para el primer trimestre 2025: 2025 = 173480.322026323"