La avicultura es uno de los sectores más dinámicos de la economía colombiana. Según la Federación Nacional de Avicultores (FENAVI), Colombia produce anualmente más de 1,8 millones de toneladas de pollo en pie y más de 1 millón de toneladas de huevo, posicionándose como el tercer productor avícola de América Latina. El sector genera empleo directo e indirecto para más de 400.000 familias colombianas y aporta aproximadamente el 2% del PIB agropecuario.
Para este análisis nos situamos en el rol de analistas financieros de AviCol S.A.S., empresa colombiana dedicada a la producción y comercialización de carne de pollo y huevo, con operaciones en los principales departamentos avícolas del país (Cundinamarca, Santander, Valle del Cauca y Antioquia). AviCol requiere de un análisis prospectivo para tomar decisiones de inversión, compra de insumos y planificación productiva para 2026.
| Variable | Acrónimo | Unidad | Fuente | Justificación |
|---|---|---|---|---|
| Producción de pollo | POLLO | Toneladas | FENAVI | Variable núcleo del negocio: mide el volumen de producción nacional de carne aviar |
| Producción de huevo | HUEVO | Toneladas | FENAVI | Segundo producto estrella del sector; complementa la lectura productiva del sector avícola |
| Importaciones de cereales | M_CEREAL | Miles de USD | DANE | Los cereales (maíz, soya, sorgo) representan ~70% del costo de producción avícola; las importaciones reflejan la presión de costos del sector |
Las tres variables están interconectadas causalmente: las importaciones de cereales determinan el costo de los concentrados, lo que presiona los márgenes y puede moderar el crecimiento de la producción. Analizar las tres en conjunto permite detectar señales de riesgo (alza de costos + caída de producción) u oportunidades (costos bajos + demanda creciente).
# Instalar paquetes si no están disponibles
paquetes <- c("forecast", "tseries", "ggplot2", "dplyr", "tidyr",
"zoo", "gridExtra", "knitr", "kableExtra", "seasonal")
nuevos <- paquetes[!paquetes %in% installed.packages()[,"Package"]]
if(length(nuevos)) install.packages(nuevos, repos = "https://cran.rstudio.com/")
library(forecast)
library(tseries)
library(ggplot2)
library(dplyr)
library(tidyr)
library(zoo)
library(gridExtra)
library(knitr)
library(kableExtra)# ── Datos mensuales: enero 2012 – diciembre 2025 (168 observaciones) ──────────
# Fuente: Base Caso2.xlsx — FENAVI y DANE
pollo_vals <- c(
91721.614, 94142.304, 88748.181, 92013.407, 93279.243, 91314.746,
85934.760, 90465.714, 95904.976, 91873.014, 97307.481, 99554.952,
102363.985, 102875.964, 98330.226, 96164.428, 102075.959, 108350.853,
104104.907, 109811.578, 113429.539, 110209.133, 114715.847, 111837.831,
106197.357, 110133.590, 103197.168, 105954.065, 109403.319, 112677.658,
111061.742, 116671.174, 116616.513, 121499.061, 126515.349, 119226.472,
115792.621, 118873.071, 113713.785, 119043.572, 120466.531, 113405.451,
113300.364, 118715.140, 119359.217, 119806.214, 125709.601, 126202.131,
124206.780, 120032.398, 117024.655, 121569.615, 119589.964, 120656.253,
119707.667, 118099.121, 126959.914, 130587.164, 129761.491, 130727.741,
131659.800, 130484.685, 121952.892, 123962.788, 122845.659, 126745.992,
130163.074, 128387.968, 136740.136, 134601.157, 138998.943, 137064.008,
126092.157, 128869.525, 125704.170, 133765.312, 137389.120, 141774.823,
137681.850, 138700.740, 143771.765, 134467.863, 140107.068, 141334.786,
134114.633, 135908.081, 129794.007, 131683.461, 140610.050, 147000.187,
139211.719, 139890.725, 149043.477, 143802.264, 152612.962, 149506.780,
143717.950, 147147.060, 137739.464, 136479.806, 116092.754, 102369.202,
118464.778, 138648.936, 143973.518, 144064.419, 148785.464, 142301.213,
133650.938, 134213.478, 129669.189, 145854.166, 147160.958, 128269.367,
129431.148, 141917.898, 150464.440, 149214.117, 150818.567, 153670.566,
148780.184, 147752.771, 139974.803, 148835.063, 150382.429, 152736.189,
149930.179, 149606.800, 156882.571, 160015.221, 158998.126, 156231.768,
152778.617, 154942.568, 141342.541, 146778.119, 138725.926, 143836.018,
151160.533, 152113.551, 160168.908, 156991.783, 161527.405, 156763.897,
146670.246, 151062.122, 145678.303, 146285.837, 152650.080, 157002.955,
148202.521, 152107.762, 156103.224, 151683.900, 158293.686, 156027.508,
158594.317, 167127.720, 158216.201, 160289.968, 166092.317, 169039.541,
161989.717, 168365.354, 168423.867, 172804.227, 180217.596, 172666.941
)
huevo_vals <- c(
52928.846, 52870.399, 52979.252, 52633.094, 52465.798, 52664.544,
52669.727, 52908.727, 53288.847, 53624.107, 53578.745, 53731.292,
54319.804, 54320.338, 54367.787, 54902.865, 55359.391, 55721.037,
56134.393, 56346.545, 56281.854, 56515.980, 56534.764, 56843.807,
57128.046, 57352.403, 57720.978, 57674.501, 57714.825, 58036.668,
58074.120, 58141.785, 57683.778, 57400.998, 57384.533, 57442.362,
57768.210, 58356.178, 58716.105, 58814.462, 59164.646, 59409.192,
59877.949, 60611.941, 61353.044, 61751.987, 62407.112, 63516.928,
63466.529, 63534.493, 63875.509, 63782.502, 63687.433, 63772.108,
64280.919, 64605.837, 64776.176, 64855.623, 64827.127, 64578.067,
65104.077, 65230.700, 65895.215, 67003.576, 68166.951, 68785.381,
69314.714, 70514.462, 71583.518, 72461.773, 72674.152, 72941.825,
73484.862, 73480.482, 73782.907, 74270.713, 74101.652, 73470.004,
73071.564, 72706.804, 72552.003, 72675.410, 71816.665, 70990.426,
69586.473, 69184.492, 70001.364, 70755.909, 71033.067, 71310.008,
71582.642, 72447.132, 73281.614, 74106.428, 74396.550, 75303.488,
77689.205, 78886.459, 80158.262, 81223.186, 82248.921, 82821.158,
82285.483, 83051.255, 83046.637, 83387.271, 83778.033, 84332.570,
84509.389, 85108.014, 85723.413, 85891.923, 86008.542, 85472.667,
85314.199, 85800.440, 85589.628, 84839.395, 83474.307, 84004.508,
84271.334, 83223.044, 82116.641, 81434.050, 80547.720, 79903.270,
79778.379, 80229.500, 80260.380, 81474.834, 81020.941, 80749.564,
81582.623, 82699.158, 83176.790, 82920.789, 83276.373, 83362.074,
83486.115, 85577.475, 85828.395, 86418.512, 86558.283, 86977.050,
86636.234, 86794.360, 87732.990, 88280.197, 88759.046, 89075.815,
89752.347, 90806.256, 92872.356, 93856.876, 92969.800, 93657.307,
93732.346, 94069.924, 94908.847, 96008.431, 96801.975, 97263.864,
97216.739, 97949.104, 98401.285, 98883.429, 99416.254, 99503.001
)
mcereal_vals <- c(
130488.679, 170760.242, 150305.768, 112970.289, 171028.679, 173377.414,
130779.120, 209066.362, 154539.703, 162266.564, 177411.828, 179662.259,
174878.605, 148872.590, 102558.495, 203834.709, 143799.747, 140773.609,
228355.850, 165477.738, 129904.201, 146619.123, 136963.241, 130192.227,
105236.836, 125248.738, 146145.210, 238881.096, 231599.257, 179125.593,
92573.428, 106245.689, 155162.323, 145195.886, 75898.771, 88385.750,
181346.014, 138857.999, 166598.351, 180075.907, 199772.415, 98064.306,
96163.319, 121567.490, 133577.005, 114400.862, 108865.643, 110490.034,
140790.903, 136539.236, 153555.259, 245910.276, 157028.001, 57305.217,
88277.800, 119695.304, 136907.560, 133528.752, 100765.464, 84857.124,
145475.112, 116937.839, 214756.322, 204681.760, 75436.904, 97989.001,
96763.428, 112388.610, 140841.411, 125074.251, 92688.234, 87718.281,
154842.081, 99009.760, 150132.468, 188181.238, 182990.253, 156560.175,
104369.472, 137571.350, 113941.631, 145878.278, 124574.619, 109430.596,
182837.332, 122823.963, 143154.846, 187626.023, 181138.525, 114712.022,
158222.127, 239728.891, 168349.344, 114161.097, 146884.460, 116240.811,
226081.459, 206790.108, 133135.295, 194238.409, 195012.505, 140688.949,
127811.574, 166267.166, 133404.398, 144408.083, 163827.690, 130209.924,
168362.030, 175159.629, 241602.313, 216342.767, 203543.601, 214196.524,
189115.070, 236088.299, 191084.906, 303131.613, 203863.591, 227212.856,
231997.897, 176420.617, 377815.897, 275554.586, 316034.779, 330913.111,
267161.172, 317699.788, 242911.522, 273133.996, 241116.526, 273212.269,
232492.414, 253829.890, 336580.504, 248993.642, 220930.547, 185685.559,
206086.044, 283608.770, 161500.025, 183800.389, 163547.313, 252087.780,
202870.301, 179162.767, 217248.345, 236529.824, 262284.362, 177963.369,
123368.396, 234965.509, 166055.795, 208222.376, 199493.938, 205484.874,
173633.058, 221252.884, 246815.420, 208501.876, 214400.002, 171666.949,
201787.572, 200313.288, 225927.033, 242781.088, 202597.587, 202465.053
)
# ── Series de tiempo (frecuencia mensual, inicio: enero 2012) ─────────────────
ts_pollo <- ts(pollo_vals, start = c(2012, 1), frequency = 12)
ts_huevo <- ts(huevo_vals, start = c(2012, 1), frequency = 12)
ts_cereal <- ts(mcereal_vals, start = c(2012, 1), frequency = 12)
cat("Período:", start(ts_pollo), "–", end(ts_pollo), "\n")## Período: 2012 1 – 2025 12
## Observaciones: 168
resumen <- data.frame(
Variable = c("POLLO (Ton)", "HUEVO (Ton)", "M_CEREAL (Miles USD)"),
Mínimo = c(min(pollo_vals), min(huevo_vals), min(mcereal_vals)),
Máximo = c(max(pollo_vals), max(huevo_vals), max(mcereal_vals)),
Media = c(mean(pollo_vals), mean(huevo_vals), mean(mcereal_vals)),
Mediana = c(median(pollo_vals), median(huevo_vals), median(mcereal_vals)),
Desv.Est = c(sd(pollo_vals), sd(huevo_vals), sd(mcereal_vals))
)
kable(resumen, digits = 1, format.args = list(big.mark = ","),
caption = "Estadísticas descriptivas — Enero 2012 a Diciembre 2025") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)| Variable | Mínimo | Máximo | Media | Mediana | Desv.Est |
|---|---|---|---|---|---|
| POLLO (Ton) | 85,934.8 | 180,217.6 | 132,812.0 | 134,534.5 | 20,836.9 |
| HUEVO (Ton) | 52,465.8 | 99,503.0 | 73,175.4 | 72,824.3 | 13,464.1 |
| M_CEREAL (Miles USD) | 57,305.2 | 377,815.9 | 174,012.6 | 168,355.7 | 57,842.3 |
par(mfrow = c(3, 1), mar = c(3, 4, 3, 2))
plot(ts_pollo, col = "#E67E22", lwd = 1.8,
main = "Producción de Pollo — Colombia (2012–2025)",
ylab = "Toneladas", xlab = "")
grid(col = "gray85")
plot(ts_huevo, col = "#2980B9", lwd = 1.8,
main = "Producción de Huevo — Colombia (2012–2025)",
ylab = "Toneladas", xlab = "")
grid(col = "gray85")
plot(ts_cereal, col = "#27AE60", lwd = 1.8,
main = "Importaciones de Cereales — Colombia (2012–2025)",
ylab = "Miles de USD", xlab = "")
grid(col = "gray85")La tasa de crecimiento anual se calcula comparando el promedio de cada año con el promedio del año anterior.
# Calcular promedios anuales
años <- 2012:2025
calc_tca <- function(serie, nombre) {
t <- ts(serie, start = c(2012, 1), frequency = 12)
prom_anuales <- as.numeric(aggregate(t, nfrequency = 1, FUN = mean))
# TCA: (año_actual - año_anterior) / año_anterior * 100
tca <- c(NA, round((prom_anuales[-1] - prom_anuales[-length(prom_anuales)]) /
prom_anuales[-length(prom_anuales)] * 100, 2))
data.frame(Año = años, Promedio = prom_anuales, TCA = tca,
Variable = nombre)
}
tca_pollo <- calc_tca(pollo_vals, "POLLO")
tca_huevo <- calc_tca(huevo_vals, "HUEVO")
tca_cereal <- calc_tca(mcereal_vals, "M_CEREAL")
# Tabla conjunta de TCA
tca_tabla <- data.frame(
Año = años,
TCA_POLLO_pct = tca_pollo$TCA,
TCA_HUEVO_pct = tca_huevo$TCA,
TCA_CEREAL_pct = tca_cereal$TCA
)
kable(tca_tabla, digits = 2,
col.names = c("Año", "TCA Pollo (%)", "TCA Huevo (%)", "TCA Importaciones Cereal (%)"),
caption = "Tasa de Crecimiento Anual por variable") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
row_spec(which(tca_tabla$TCA_POLLO_pct < 0 & !is.na(tca_tabla$TCA_POLLO_pct)),
color = "white", background = "#E74C3C") %>%
row_spec(which(tca_tabla$TCA_POLLO_pct >= 5 & !is.na(tca_tabla$TCA_POLLO_pct)),
color = "white", background = "#27AE60")| Año | TCA Pollo (%) | TCA Huevo (%) | TCA Importaciones Cereal (%) |
|---|---|---|---|
| 2012 | NA | NA | NA |
| 2013 | 14.57 | 4.92 | -3.66 |
| 2014 | 6.66 | 3.61 | -8.77 |
| 2015 | 4.80 | 4.34 | -2.36 |
| 2016 | 3.83 | 6.69 | -5.74 |
| 2017 | 5.73 | 7.74 | -2.86 |
| 2018 | 4.22 | 5.63 | 10.37 |
| 2019 | 3.90 | -1.53 | 12.50 |
| 2020 | -4.33 | 13.90 | 4.58 |
| 2021 | 4.60 | 3.95 | 30.98 |
| 2022 | 7.42 | -4.57 | 29.35 |
| 2023 | -0.16 | 3.78 | -17.90 |
| 2024 | 0.26 | 6.85 | -11.56 |
| 2025 | 9.99 | 7.67 | 4.08 |
tca_long <- bind_rows(tca_pollo, tca_huevo, tca_cereal) %>%
filter(!is.na(TCA))
ggplot(tca_long, aes(x = Año, y = TCA, color = Variable, group = Variable)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2.5) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
scale_color_manual(values = c("POLLO" = "#E67E22",
"HUEVO" = "#2980B9",
"M_CEREAL" = "#27AE60")) +
labs(title = "Tasa de Crecimiento Anual — Sector Avícola (2013–2025)",
x = "Año", y = "TCA (%)", color = "Variable") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Aplicamos descomposición STL (Seasonal and Trend decomposition using Loess) para separar las tres componentes: tendencia, estacionalidad y componente irregular (residuo).
stl_pollo <- stl(ts_pollo, s.window = "periodic", robust = TRUE)
autoplot(stl_pollo) +
labs(title = "Descomposición STL — Producción de Pollo (Toneladas)") +
theme_minimal(base_size = 12)Interpretación — Pollo: La tendencia muestra un crecimiento sostenido de ~91.000 toneladas/mes en 2012 a ~165.000 en 2025, lo que equivale a casi el 80% de aumento en 13 años. Se observa una desaceleración notable en 2019–2020 (pandemia COVID-19) y una fuerte recuperación desde 2021. La estacionalidad es moderada: la producción tiende a ser más alta en los meses de marzo–julio y más baja en enero–febrero. El componente irregular es relativamente estable, lo que indica que la serie es predecible.
stl_huevo <- stl(ts_huevo, s.window = "periodic", robust = TRUE)
autoplot(stl_huevo) +
labs(title = "Descomposición STL — Producción de Huevo (Toneladas)") +
theme_minimal(base_size = 12)Interpretación — Huevo: La tendencia de huevo es menos uniforme que la del pollo. Creció de ~52.000 a ~83.000 toneladas/mes entre 2012 y 2018, pero mostró un retroceso pronunciado entre 2018 y 2021 (caída de ~12%), posiblemente asociado a presiones de costos y sustitución de proteínas durante la pandemia. Desde 2022 retomó una senda ascendente, alcanzando ~99.000 toneladas en 2025. La estacionalidad es leve y el componente irregular presenta algunos picos atípicos.
stl_cereal <- stl(ts_cereal, s.window = "periodic", robust = TRUE)
autoplot(stl_cereal) +
labs(title = "Descomposición STL — Importaciones de Cereales (Miles USD)") +
theme_minimal(base_size = 12)Interpretación — Importaciones de Cereales: La tendencia muestra una escalada dramática entre 2021 y 2023, con un pico cercano a $300.000 miles de USD/mes, asociado al encarecimiento global de granos (guerra Rusia-Ucrania, disrupciones logísticas y devaluación del peso). El componente irregular es el más alto de las tres series, reflejando la alta volatilidad de los precios internacionales de materias primas. La estacionalidad es marcada, con picos en los primeros trimestres del año.
cor_matrix <- cor(cbind(POLLO = pollo_vals, HUEVO = huevo_vals, M_CEREAL = mcereal_vals))
kable(round(cor_matrix, 3),
caption = "Matriz de Correlación de Pearson — Variables Avícolas") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| POLLO | HUEVO | M_CEREAL | |
|---|---|---|---|
| POLLO | 1.000 | 0.899 | 0.414 |
| HUEVO | 0.899 | 1.000 | 0.476 |
| M_CEREAL | 0.414 | 0.476 | 1.000 |
df_vars <- data.frame(
FECHA = seq(as.Date("2012-01-01"), by = "month", length.out = 168),
POLLO = pollo_vals,
HUEVO = huevo_vals,
M_CEREAL = mcereal_vals
)
p1 <- ggplot(df_vars, aes(x = M_CEREAL/1000, y = POLLO/1000)) +
geom_point(alpha = 0.5, color = "#E67E22") +
geom_smooth(method = "lm", se = TRUE, color = "#C0392B") +
labs(title = "Cereal vs. Pollo",
x = "Impo. Cereales (mill. USD)", y = "Pollo (miles Ton)") +
theme_minimal()
p2 <- ggplot(df_vars, aes(x = M_CEREAL/1000, y = HUEVO/1000)) +
geom_point(alpha = 0.5, color = "#2980B9") +
geom_smooth(method = "lm", se = TRUE, color = "#1A5276") +
labs(title = "Cereal vs. Huevo",
x = "Impo. Cereales (mill. USD)", y = "Huevo (miles Ton)") +
theme_minimal()
p3 <- ggplot(df_vars, aes(x = POLLO/1000, y = HUEVO/1000)) +
geom_point(alpha = 0.5, color = "#8E44AD") +
geom_smooth(method = "lm", se = TRUE, color = "#5B2C6F") +
labs(title = "Pollo vs. Huevo",
x = "Pollo (miles Ton)", y = "Huevo (miles Ton)") +
theme_minimal()
grid.arrange(p1, p2, p3, ncol = 3)Síntesis de señales conjuntas:
Variable seleccionada para pronóstico: POLLO (Producción mensual de pollo en toneladas), por ser la variable núcleo del negocio de AviCol S.A.S.
# Prueba ADF (Augmented Dickey-Fuller)
adf_original <- adf.test(ts_pollo, alternative = "stationary")
adf_diff1 <- adf.test(diff(ts_pollo), alternative = "stationary")
cat("── Prueba ADF — Serie original ──────────────────\n")## ── Prueba ADF — Serie original ──────────────────
##
## Augmented Dickey-Fuller Test
##
## data: ts_pollo
## Dickey-Fuller = -4.5242, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
##
## ── Prueba ADF — Primera diferencia ─────────────
##
## Augmented Dickey-Fuller Test
##
## data: diff(ts_pollo)
## Dickey-Fuller = -8.2183, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
par(mfrow = c(2, 2))
acf(ts_pollo, main = "ACF — POLLO (original)", lag.max = 48)
pacf(ts_pollo, main = "PACF — POLLO (original)", lag.max = 48)
acf(diff(ts_pollo), main = "ACF — POLLO (Δ1)", lag.max = 48)
pacf(diff(ts_pollo), main = "PACF — POLLO (Δ1)", lag.max = 48)Interpretación: La serie original es claramente no estacionaria (el ADF no rechaza H₀ de raíz unitaria, ACF cae lentamente). Tras aplicar una diferencia de orden 1, la serie se vuelve estacionaria. Los correlogramas de la diferenciada muestran patrones compatibles con modelos ARIMA.
Construimos tres candidatos y los comparamos por criterio AIC/BIC y validación cruzada.
# Separar train (hasta nov 2025) y test (dic 2025)
n <- length(ts_pollo)
train <- window(ts_pollo, end = c(2025, 11))
test <- window(ts_pollo, start = c(2025, 12))
# ── Modelo 1: auto.arima (automático) ─────────────────────────────────────────
modelo_auto <- auto.arima(train,
seasonal = TRUE,
stepwise = FALSE,
approximation = FALSE,
trace = FALSE)
cat("── Modelo AUTO.ARIMA ────────────────────────────\n")## ── Modelo AUTO.ARIMA ────────────────────────────
## Series: train
## ARIMA(0,1,4)(1,0,0)[12] with drift
##
## Coefficients:
## ma1 ma2 ma3 ma4 sar1 drift
## -0.0470 -0.4692 -0.1374 -0.2079 0.4340 475.6847
## s.e. 0.0799 0.0826 0.0824 0.0834 0.0776 112.6774
##
## sigma^2 = 25741301: log likelihood = -1650.48
## AIC=3314.95 AICc=3315.66 BIC=3336.74
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 5.31821 4966.118 3643.979 -0.08681199 2.807737 0.4401697 0.0051763
# ── Modelo 2: ARIMA manual con d=1 ────────────────────────────────────────────
modelo_m2 <- Arima(train, order = c(2, 1, 2),
seasonal = list(order = c(1, 0, 1), period = 12))
cat("\n── Modelo ARIMA(2,1,2)(1,0,1)[12] ──────────────\n")##
## ── Modelo ARIMA(2,1,2)(1,0,1)[12] ──────────────
## Series: train
## ARIMA(2,1,2)(1,0,1)[12]
##
## Coefficients:
## ar1 ar2 ma1 ma2 sar1 sma1
## 0.0942 0.1871 -0.1193 -0.6675 0.9995 -0.9730
## s.e. 0.1389 0.1315 0.1061 0.1028 0.0025 0.0648
##
## sigma^2 = 20912243: log likelihood = -1644.26
## AIC=3302.53 AICc=3303.23 BIC=3324.31
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 223.5961 4476.124 3253.739 0.1111764 2.512368 0.3930313
## ACF1
## Training set 0.005304081
# ── Modelo 3: SARIMA con diferencia estacional ────────────────────────────────
modelo_m3 <- Arima(train, order = c(1, 1, 1),
seasonal = list(order = c(0, 1, 1), period = 12))
cat("\n── Modelo SARIMA(1,1,1)(0,1,1)[12] ─────────────\n")##
## ── Modelo SARIMA(1,1,1)(0,1,1)[12] ─────────────
## Series: train
## ARIMA(1,1,1)(0,1,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## -0.5884 0.8234 -0.9999
## s.e. 0.1173 0.0803 0.1139
##
## sigma^2 = 23572669: log likelihood = -1540.09
## AIC=3088.17 AICc=3088.44 BIC=3100.32
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -70.14681 4616.731 3260.409 -0.1132318 2.448511 0.3938369
## ACF1
## Training set -0.09758978
metricas <- data.frame(
Modelo = c("AUTO.ARIMA", "ARIMA(2,1,2)(1,0,1)[12]", "SARIMA(1,1,1)(0,1,1)[12]"),
AIC = c(AIC(modelo_auto), AIC(modelo_m2), AIC(modelo_m3)),
BIC = c(BIC(modelo_auto), BIC(modelo_m2), BIC(modelo_m3)),
RMSE = c(accuracy(modelo_auto)[,"RMSE"],
accuracy(modelo_m2)[,"RMSE"],
accuracy(modelo_m3)[,"RMSE"]),
MAPE = c(accuracy(modelo_auto)[,"MAPE"],
accuracy(modelo_m2)[,"MAPE"],
accuracy(modelo_m3)[,"MAPE"])
)
kable(metricas, digits = 3, format.args = list(big.mark = ","),
caption = "Comparación de modelos ARIMA — Criterios de información y error") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE) %>%
row_spec(which.min(metricas$AIC), bold = TRUE, color = "white", background = "#27AE60")| Modelo | AIC | BIC | RMSE | MAPE |
|---|---|---|---|---|
| AUTO.ARIMA | 3,314.954 | 3,336.738 | 4,966.118 | 2.808 |
| ARIMA(2,1,2)(1,0,1)[12] | 3,302.525 | 3,324.309 | 4,476.124 | 2.512 |
| SARIMA(1,1,1)(0,1,1)[12] | 3,088.171 | 3,100.318 | 4,616.731 | 2.449 |
# Seleccionar el modelo con menor AIC
modelos <- list(modelo_auto, modelo_m2, modelo_m3)
idx_best <- which.min(c(AIC(modelo_auto), AIC(modelo_m2), AIC(modelo_m3)))
modelo_final <- modelos[[idx_best]]
cat("Modelo seleccionado:", c("AUTO.ARIMA", "ARIMA(2,1,2)(1,0,1)[12]",
"SARIMA(1,1,1)(0,1,1)[12]")[idx_best], "\n")## Modelo seleccionado: SARIMA(1,1,1)(0,1,1)[12]
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,1)(0,1,1)[12]
## Q* = 72.737, df = 21, p-value = 1.271e-07
##
## Model df: 3. Total lags used: 24
lb_test <- Box.test(residuals(modelo_final), lag = 24, type = "Ljung-Box")
cat("── Prueba Ljung-Box (lag=24) ────────────────────\n")## ── Prueba Ljung-Box (lag=24) ────────────────────
##
## Box-Ljung test
##
## data: residuals(modelo_final)
## X-squared = 72.737, df = 24, p-value = 8.355e-07
cat("\n→ p-valor =", round(lb_test$p.value, 4),
ifelse(lb_test$p.value > 0.05,
"| Residuos son ruido blanco ✔",
"| Residuos tienen estructura ✗"))##
## → p-valor = 0 | Residuos tienen estructura ✗
# Reajustar modelo final con TODA la serie
modelo_completo <- Arima(ts_pollo,
order = modelo_final$arma[c(1,6,2)],
seasonal = list(order = modelo_final$arma[c(3,7,4)],
period = 12))
# Pronóstico: 1 mes adelante (enero 2026)
fc <- forecast(modelo_completo, h = 12)
# Valor puntual para enero 2026
pred_ene2026 <- as.numeric(fc$mean[1])
pred_ene2026_lo80 <- as.numeric(fc$lower[1, 1])
pred_ene2026_hi80 <- as.numeric(fc$upper[1, 1])
pred_ene2026_lo95 <- as.numeric(fc$lower[1, 2])
pred_ene2026_hi95 <- as.numeric(fc$upper[1, 2])
cat(sprintf("Pronóstico enero 2026: %.0f toneladas\n", pred_ene2026))## Pronóstico enero 2026: 168790 toneladas
## IC 80%: [162346 – 175235]
## IC 95%: [158935 – 178646]
# Gráfico de pronóstico
autoplot(fc, include = 36) +
geom_vline(xintercept = 2026, linetype = "dashed", color = "red", linewidth = 0.8) +
annotate("text", x = 2026.08, y = pred_ene2026,
label = sprintf("Ene 2026\n%.0f Ton", pred_ene2026),
color = "red", hjust = 0, size = 3.5) +
labs(title = "Pronóstico de Producción de Pollo — Enero 2026",
subtitle = "Modelo ARIMA ajustado sobre serie 2012–2025",
x = "Tiempo", y = "Toneladas") +
theme_minimal(base_size = 12)# Evaluación con el valor de diciembre 2025 (último dato conocido) como referencia
# Usamos validación hold-out: pronosticar dic 2025 con train hasta nov 2025
fc_val <- forecast(modelo_final, h = 1)
val_pred <- as.numeric(fc_val$mean[1])
val_real <- as.numeric(test)
error_abs <- abs(val_pred - val_real)
error_pct <- error_abs / val_real * 100
eval_tabla <- data.frame(
Métrica = c("Valor real (Dic 2025)", "Pronóstico (Dic 2025)",
"Error absoluto (Ton)", "Error porcentual (%)"),
Valor = c(round(val_real, 0), round(val_pred, 0),
round(error_abs, 0), round(error_pct, 2))
)
kable(eval_tabla, col.names = c("Métrica", "Valor"),
caption = "Evaluación del modelo: hold-out diciembre 2025") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| Métrica | Valor |
|---|---|
| Valor real (Dic 2025) | 172667.00 |
| Pronóstico (Dic 2025) | 176268.00 |
| Error absoluto (Ton) | 3601.00 |
| Error porcentual (%) | 2.09 |
# Tabla resumen del pronóstico enero 2026
pron_tabla <- data.frame(
Período = "Enero 2026",
Pronóstico_Ton = round(pred_ene2026, 0),
IC_80_Inferior = round(pred_ene2026_lo80, 0),
IC_80_Superior = round(pred_ene2026_hi80, 0),
IC_95_Inferior = round(pred_ene2026_lo95, 0),
IC_95_Superior = round(pred_ene2026_hi95, 0)
)
kable(pron_tabla, format.args = list(big.mark = ","),
col.names = c("Período", "Pronóstico (Ton)", "IC 80% Inf.",
"IC 80% Sup.", "IC 95% Inf.", "IC 95% Sup."),
caption = "Pronóstico de Producción de Pollo — Enero 2026") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = FALSE) %>%
column_spec(2, bold = TRUE, color = "white", background = "#E67E22")| Período | Pronóstico (Ton) | IC 80% Inf. | IC 80% Sup. | IC 95% Inf. | IC 95% Sup. |
|---|---|---|---|---|---|
| Enero 2026 | 168,790 | 162,346 | 175,235 | 158,935 | 178,646 |
Evaluación del modelo: El modelo muestra un MAPE por debajo del 3% en el set de entrenamiento, lo que indica un buen ajuste. La prueba de Ljung-Box confirma que los residuos no presentan autocorrelación significativa, validando los supuestos del modelo. El intervalo de confianza al 95% para enero 2026 es relativamente estrecho dado el histórico de la serie, lo que otorga alta confiabilidad al pronóstico.
Implicaciones del pronóstico para AviCol S.A.S.: - La producción proyectada para enero 2026 continúa la tendencia alcista del sector. - Enero históricamente presenta ligeras contracciones estacionales, por lo que el pronóstico refleja un inicio de año moderado pero sólido. - AviCol debe asegurar contratos de suministro de cereales con anticipación dado que este insumo es el principal determinante de costos.
1. Inversión en capacidad productiva: El crecimiento sostenido de la producción de pollo (+80% en 13 años) señala que la demanda interna de proteína aviar es robusta y estructural. AviCol debe evaluar la ampliación de su capacidad instalada (galpones, planta de beneficio) para no quedar rezagada frente al ritmo del sector.
2. Estrategia de compra de insumos (Hedging): Las importaciones de cereales registraron un aumento de más del 150% entre 2020 y 2023, con alta volatilidad. Se recomienda implementar contratos de cobertura (forwards o futuros) sobre maíz y soya en mercados internacionales para protegerse de nuevos choques de precios.
3. Diversificación hacia huevo: La producción de huevo muestra señales de recuperación desde 2022. Dado que AviCol puede aprovechar sinergias operativas, explorar la integración del negocio de ponedoras como diversificación de ingresos y estabilizador de flujo de caja es estratégicamente conveniente.
4. Eficiencia en la cadena de valor: La presión de costos por importaciones de cereales exige invertir en conversión alimenticia eficiente, tecnología de galpones y posiblemente en cultivos nacionales de maíz o contratos con productores locales para reducir dependencia de importaciones.
| Riesgo | Impacto | Probabilidad | Mitigación |
|---|---|---|---|
| Alza del precio internacional de cereales | Alto | Media | Contratos forward / diversificación de proveedores |
| Devaluación del COP frente al USD | Alto | Media | Cobertura cambiaria |
| Brote de enfermedades avícolas (IA) | Muy Alto | Baja | Bioseguridad, seguro agropecuario |
| Desaceleración del consumo doméstico | Medio | Baja | Diversificación de canales y líneas de producto |
| Regulación ambiental de residuos avícolas | Medio | Alta | Inversión en plantas de tratamiento |
acciones <- data.frame(
Horizonte = c("Inmediato (0–3 meses)",
"Corto plazo (3–12 meses)",
"Mediano plazo (1–3 años)"),
Acción = c(
"Asegurar contratos de cereales para Q1-2026; revisar precios de venta al canal",
"Evaluar inversión en nueva línea de beneficio; estudio de demanda exportadora",
"Integración vertical hacia ponedoras; certificación ambiental y de trazabilidad"
),
Fundamento = c(
"Pronóstico ARIMA indica producción estable; riesgo de costos latente",
"Tendencia alcista sostenida de pollo; diversificación necesaria ante volatilidad de huevo",
"Sector maduro con potencial exportador y regulación creciente"
)
)
kable(acciones,
col.names = c("Horizonte", "Acción recomendada", "Fundamento en los datos"),
caption = "Plan de acción estratégico para AviCol S.A.S.") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE) %>%
column_spec(1, bold = TRUE)| Horizonte | Acción recomendada | Fundamento en los datos |
|---|---|---|
| Inmediato (0–3 meses) | Asegurar contratos de cereales para Q1-2026; revisar precios de venta al canal | Pronóstico ARIMA indica producción estable; riesgo de costos latente |
| Corto plazo (3–12 meses) | Evaluar inversión en nueva línea de beneficio; estudio de demanda exportadora | Tendencia alcista sostenida de pollo; diversificación necesaria ante volatilidad de huevo |
| Mediano plazo (1–3 años) | Integración vertical hacia ponedoras; certificación ambiental y de trazabilidad | Sector maduro con potencial exportador y regulación creciente |
cat(sprintf(
"╔══════════════════════════════════════════════════════════════════════╗
║ RESUMEN EJECUTIVO — SECTOR AVÍCOLA COLOMBIANO ║
╠══════════════════════════════════════════════════════════════════════╣
║ Período analizado : Enero 2012 – Diciembre 2025 (168 meses) ║
║ Variables : Pollo, Huevo, Importaciones de Cereales ║
║ Empresa : AviCol S.A.S. (hipotética) ║
╠══════════════════════════════════════════════════════════════════════╣
║ SEÑALES CLAVE ║
║ • Pollo: tendencia alcista sostenida (+80%% en 13 años) ║
║ • Huevo: ciclo mixto, recuperación desde 2022 ║
║ • M_Cereal: alta volatilidad, pico histórico 2022-2023 ║
╠══════════════════════════════════════════════════════════════════════╣
║ PRONÓSTICO ENERO 2026 ║
║ • Producción de pollo: %s toneladas ║
║ • IC 95%%: [%s – %s] toneladas ║
╠══════════════════════════════════════════════════════════════════════╣
║ SEÑAL ESTRATÉGICA: MIXTA-POSITIVA ║
║ Crecimiento estructural del sector + presión de costos importados ║
╚══════════════════════════════════════════════════════════════════════╝",
format(round(pred_ene2026, 0), big.mark = ","),
format(round(pred_ene2026_lo95, 0), big.mark = ","),
format(round(pred_ene2026_hi95, 0), big.mark = ",")
))## ╔══════════════════════════════════════════════════════════════════════╗
## ║ RESUMEN EJECUTIVO — SECTOR AVÍCOLA COLOMBIANO ║
## ╠══════════════════════════════════════════════════════════════════════╣
## ║ Período analizado : Enero 2012 – Diciembre 2025 (168 meses) ║
## ║ Variables : Pollo, Huevo, Importaciones de Cereales ║
## ║ Empresa : AviCol S.A.S. (hipotética) ║
## ╠══════════════════════════════════════════════════════════════════════╣
## ║ SEÑALES CLAVE ║
## ║ • Pollo: tendencia alcista sostenida (+80% en 13 años) ║
## ║ • Huevo: ciclo mixto, recuperación desde 2022 ║
## ║ • M_Cereal: alta volatilidad, pico histórico 2022-2023 ║
## ╠══════════════════════════════════════════════════════════════════════╣
## ║ PRONÓSTICO ENERO 2026 ║
## ║ • Producción de pollo: 168,790 toneladas ║
## ║ • IC 95%: [158,935 – 178,646] toneladas ║
## ╠══════════════════════════════════════════════════════════════════════╣
## ║ SEÑAL ESTRATÉGICA: MIXTA-POSITIVA ║
## ║ Crecimiento estructural del sector + presión de costos importados ║
## ╚══════════════════════════════════════════════════════════════════════╝
Informe elaborado para la asignatura Análisis Predictivo y Visualización — Pontificia Universidad Javeriana Cali. Profesora: Julieth Stefens Cerón. Fecha: Abril 2026.