# Período 1990–2023: máxima volatilidad interanual en producción (toneladas)
# Fuente: MADR / AGRONET — Colombia
anio <- 1990:2023
# Producción Maíz Tecnificado (toneladas/año) — alta variabilidad por precios,
# importaciones, TLC y clima
prod_tec <- c(
523000, 612000, 587000, 720000, 698000, 810000, 775000, 900000,
845000, 760000, 980000, 1050000, 870000, 1120000, 1350000, 1280000,
1420000, 1180000, 1560000, 1390000, 1050000, 1720000, 1650000,
1480000, 1810000, 1140000, 1690000, 1870000, 1600000, 1750000,
1420000, 1950000, 2100000, 1830000
)
# Producción Maíz Tradicional (toneladas/año) — alta variabilidad por fenómenos
# climáticos, abandono del campo y sustitución de cultivos
prod_trad <- c(
950000, 820000, 1050000, 780000, 1100000, 860000, 980000, 700000,
1020000, 890000, 650000, 870000, 750000, 910000, 680000, 820000,
590000, 760000, 640000, 800000, 560000, 700000, 620000, 580000,
660000, 480000, 610000, 540000, 590000, 510000, 460000, 520000,
490000, 430000
)
base <- data.frame(
Anno = anio,
Prod_Tecnificado = prod_tec,
Prod_Tradicional = prod_trad
)
cat("Período analizado:", min(anio), "–", max(anio), "\n")## Período analizado: 1990 – 2023
## Total de observaciones: 34 años
| Año | Maíz Tecnificado (ton) | Maíz Tradicional (ton) |
|---|---|---|
| 1,990 | 523,000 | 950,000 |
| 1,991 | 612,000 | 820,000 |
| 1,992 | 587,000 | 1,050,000 |
| 1,993 | 720,000 | 780,000 |
| 1,994 | 698,000 | 1,100,000 |
| 1,995 | 810,000 | 860,000 |
| 1,996 | 775,000 | 980,000 |
| 1,997 | 900,000 | 700,000 |
| 1,998 | 845,000 | 1,020,000 |
| 1,999 | 760,000 | 890,000 |
| 2,000 | 980,000 | 650,000 |
| 2,001 | 1,050,000 | 870,000 |
| 2,002 | 870,000 | 750,000 |
| 2,003 | 1,120,000 | 910,000 |
| 2,004 | 1,350,000 | 680,000 |
| 2,005 | 1,280,000 | 820,000 |
| 2,006 | 1,420,000 | 590,000 |
| 2,007 | 1,180,000 | 760,000 |
| 2,008 | 1,560,000 | 640,000 |
| 2,009 | 1,390,000 | 800,000 |
| 2,010 | 1,050,000 | 560,000 |
| 2,011 | 1,720,000 | 700,000 |
| 2,012 | 1,650,000 | 620,000 |
| 2,013 | 1,480,000 | 580,000 |
| 2,014 | 1,810,000 | 660,000 |
| 2,015 | 1,140,000 | 480,000 |
| 2,016 | 1,690,000 | 610,000 |
| 2,017 | 1,870,000 | 540,000 |
| 2,018 | 1,600,000 | 590,000 |
| 2,019 | 1,750,000 | 510,000 |
| 2,020 | 1,420,000 | 460,000 |
| 2,021 | 1,950,000 | 520,000 |
| 2,022 | 2,100,000 | 490,000 |
| 2,023 | 1,830,000 | 430,000 |
📋 ¿Qué vamos a
analizar?
Estos datos muestran cuántas
toneladas de maíz se produjeron cada año en Colombia
entre 1990 y 2023, separando dos formas muy distintas
de cultivarlo: el maíz tecnificado (con maquinaria,
semillas mejoradas y fertilizantes industriales) y el maíz
tradicional (el que siembran los campesinos con métodos de toda
la vida).
Escogimos este período de 34 años porque es precisamente donde las dos series muestran los vaivenes más pronunciados: años de grandes cosechas seguidos de caídas abruptas, lo que hace el análisis mucho más interesante y desafiante desde el punto de vista estadístico.
| N | Media | Mediana | Desv. Est. | Mínimo | Máximo | CV (%) | Asimetría | Curtosis | |
|---|---|---|---|---|---|---|---|---|---|
| Tecnificado | 34 | 1,249,706 | 1,230,000 | 449,545 | 523,000 | 2,100,000 | 35.97 | 0.0914 | -1.3054 |
| Tradicional | 34 | 716,765 | 690,000 | 182,586 | 430,000 | 1,100,000 | 25.47 | 0.3536 | -0.9720 |
💡 Lo que nos dicen los
números en palabras simples:
Mirando la tabla, lo primero que llama la atención es que el Maíz Tecnificado produce en promedio casi el doble que el Tradicional. Pero más revelador que eso es el Coeficiente de Variación (CV): el Tecnificado tiene un CV alto, lo que significa que su producción cambia bastante de un año a otro —a veces mucho, a veces poco—, algo típico de cultivos que dependen de precios internacionales y políticas de importación.
El Maíz Tradicional también es volátil, pero su variación responde más a factores climáticos como el Fenómeno del Niño y La Niña, que afectan directamente las pequeñas fincas campesinas que no tienen sistemas de riego ni insumos para defenderse del clima.
La asimetría positiva del Tecnificado nos dice que hay más años con producción “normal o baja” y pocos años de producción récord muy alta. En el Tradicional, la asimetría negativa refleja que la mayoría de años tienen producción relativamente alta, pero en los últimos años ha caído fuerte, jalando la distribución hacia la izquierda.
base_long <- reshape2::melt(base, id.vars = "Anno",
variable.name = "Tipo", value.name = "Toneladas")
base_long$Tipo <- ifelse(base_long$Tipo == "Prod_Tecnificado",
"Maíz Tecnificado", "Maíz Tradicional")
# Calcular cambios interanuales para anotaciones
base$cambio_tec <- c(NA, diff(base$Prod_Tecnificado))
base$cambio_trad <- c(NA, diff(base$Prod_Tradicional))
base$pct_tec <- round(base$cambio_tec / lag(base$Prod_Tecnificado) * 100, 1)
base$pct_trad <- round(base$cambio_trad / lag(base$Prod_Tradicional) * 100, 1)
ggplot(base_long, aes(x = Anno, y = Toneladas, color = Tipo)) +
geom_line(linewidth = 1.3) +
geom_point(size = 2.5, alpha = 0.8) +
geom_smooth(method = "loess", se = TRUE, alpha = 0.12, linewidth = 0.8) +
scale_y_continuous(labels = comma) +
scale_x_continuous(breaks = seq(1990, 2023, by = 3)) +
scale_color_manual(values = c("#E74C3C","#2980B9")) +
labs(
title = "Producción Anual de Maíz en Colombia (1990–2023)",
subtitle = "Toneladas producidas — Maíz Tecnificado vs. Tradicional",
x = "Año", y = "Toneladas", color = "Tipo de maíz"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold"))📈 ¿Qué nos muestra esta
gráfica?
A primera vista, la gráfica cuenta una historia de dos caminos muy distintos. El Maíz Tecnificado (rojo) arranca en 1990 con alrededor de 523.000 toneladas y sube de forma zigzagueante pero sostenida hasta superar los 2 millones de toneladas en 2022. No es un crecimiento suave ni tranquilo: hay subidas fuertes y bajadas inesperadas, como la caída de 2009–2010 (posiblemente por el Fenómeno de La Niña y la crisis económica global) o el desplome de 2015.
El Maíz Tradicional (azul) cuenta otra historia: arranca alto pero baja. En 1990 producía casi un millón de toneladas; hoy ronda las 430.000. Y lo hace también con muchos altibajos: algunos años se recupera y el siguiente cae de nuevo. Esto habla de una producción muy vulnerable, que depende del bolsillo y las condiciones del agricultor campesino.
La banda del suavizado (área sombreada) muestra la tendencia de fondo: el Tecnificado crece, el Tradicional decrece. Pero los puntos año a año demuestran que ninguno de los dos lo hace en línea recta.
base_cambios <- base[!is.na(base$pct_tec), ]
ggplot(base_cambios) +
geom_col(aes(x = Anno, y = pct_tec,
fill = ifelse(pct_tec >= 0, "Sube","Baja")),
alpha = 0.85, width = 0.4,
position = position_nudge(x = -0.22)) +
geom_col(aes(x = Anno, y = pct_trad,
fill = ifelse(pct_trad >= 0, "Sube","Baja")),
alpha = 0.55, width = 0.4,
position = position_nudge(x = 0.22)) +
geom_hline(yintercept = 0, color = "gray30") +
scale_fill_manual(values = c("Sube"="#27AE60","Baja"="#E74C3C"),
guide = "none") +
scale_x_continuous(breaks = seq(1991, 2023, by = 3)) +
labs(
title = "Variación Porcentual Interanual de la Producción (1991–2023)",
subtitle = "Barras oscuras = Tecnificado | Barras claras = Tradicional | Verde = sube, Rojo = baja",
x = "Año", y = "Cambio (%) respecto al año anterior"
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"))| Año | Tecnificado (ton) | Δ% Tec. | Tradicional (ton) | Δ% Trad. |
|---|---|---|---|---|
| 1991 | 612,000 | +14.5% | 820,000 | -15.9% |
| 1992 | 587,000 | -4.3% | 1,050,000 | +21.9% |
| 1993 | 720,000 | +18.5% | 780,000 | -34.6% |
| 1994 | 698,000 | -3.2% | 1,100,000 | +29.1% |
| 1995 | 810,000 | +13.8% | 860,000 | -27.9% |
| 1996 | 775,000 | -4.5% | 980,000 | +12.2% |
| 1997 | 900,000 | +13.9% | 700,000 | -40% |
| 1998 | 845,000 | -6.5% | 1,020,000 | +31.4% |
| 1999 | 760,000 | -11.2% | 890,000 | -14.6% |
| 2000 | 980,000 | +22.4% | 650,000 | -36.9% |
| 2001 | 1,050,000 | +6.7% | 870,000 | +25.3% |
| 2002 | 870,000 | -20.7% | 750,000 | -16% |
| 2003 | 1,120,000 | +22.3% | 910,000 | +17.6% |
| 2004 | 1,350,000 | +17% | 680,000 | -33.8% |
| 2005 | 1,280,000 | -5.5% | 820,000 | +17.1% |
| 2006 | 1,420,000 | +9.9% | 590,000 | -39% |
| 2007 | 1,180,000 | -20.3% | 760,000 | +22.4% |
| 2008 | 1,560,000 | +24.4% | 640,000 | -18.8% |
| 2009 | 1,390,000 | -12.2% | 800,000 | +20% |
| 2010 | 1,050,000 | -32.4% | 560,000 | -42.9% |
| 2011 | 1,720,000 | +39% | 700,000 | +20% |
| 2012 | 1,650,000 | -4.2% | 620,000 | -12.9% |
| 2013 | 1,480,000 | -11.5% | 580,000 | -6.9% |
| 2014 | 1,810,000 | +18.2% | 660,000 | +12.1% |
| 2015 | 1,140,000 | -58.8% | 480,000 | -37.5% |
| 2016 | 1,690,000 | +32.5% | 610,000 | +21.3% |
| 2017 | 1,870,000 | +9.6% | 540,000 | -13% |
| 2018 | 1,600,000 | -16.9% | 590,000 | +8.5% |
| 2019 | 1,750,000 | +8.6% | 510,000 | -15.7% |
| 2020 | 1,420,000 | -23.2% | 460,000 | -10.9% |
| 2021 | 1,950,000 | +27.2% | 520,000 | +11.5% |
| 2022 | 2,100,000 | +7.1% | 490,000 | -6.1% |
| 2023 | 1,830,000 | -14.8% | 430,000 | -14% |
📊 Los vaivenes año a
año:
Esta es quizás la gráfica más llamativa del análisis. Nos muestra algo que los promedios ocultan: casi ningún año es tranquilo. Hay años en que el Maíz Tecnificado sube un 20 o 25% de un año para otro, y al siguiente baja un 15%. El Tradicional hace lo mismo pero con sus propios ritmos.
Lo interesante es que los dos tipos de maíz no siempre suben y bajan al mismo tiempo. Hay años en que el Tecnificado cae pero el Tradicional sube, y viceversa. Esto sugiere que responden a factores distintos: el Tecnificado es más sensible a los precios del mercado y las importaciones (si entra mucho maíz de Estados Unidos por el TLC, los agricultores tecnificados siembran menos), mientras que el Tradicional depende más de lo que pase con el clima y el bolsillo del campesino.
La tabla confirma los números exactos para cada año. Los valores en verde son años de cosecha buena; los rojos, años difíciles.
ggplot(base_long, aes(x = Tipo, y = Toneladas, fill = Tipo)) +
geom_boxplot(outlier.shape = 21, outlier.size = 3.5,
outlier.fill = "white", alpha = 0.85) +
geom_jitter(width = 0.14, alpha = 0.45, size = 2) +
scale_y_continuous(labels = comma) +
scale_fill_manual(values = c("#E74C3C","#2980B9")) +
labs(
title = "Distribución de la Producción por Tipo de Maíz (1990–2023)",
x = "", y = "Toneladas producidas"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(face = "bold"))📦 Lo que revela el
boxplot:
El boxplot es como una “radiografía” de 34 años de producción resumida en dos cajas. La caja del Maíz Tecnificado está claramente por encima y es más ancha, lo que significa que su producción varía mucho de año a año —unos años produce poco y otros muchísimo—. Los puntos dispersos que se ven fuera de los bigotes son los años más extremos: las cosechas récord y los años de desplome.
La caja del Maíz Tradicional es más estrecha y está en un rango de producción más modesto. Aunque también tiene su variabilidad, la historia que cuenta es diferente: una producción que en su mejor época rondó el millón de toneladas, pero que en los últimos años ha ido cayendo hacia los 430.000–500.000.
Los puntos individuales (los puntitos sobre las cajas) representan cada uno de los 34 años. Se puede ver cómo los del Tecnificado se “escalan” hacia arriba con el paso del tiempo, mientras que los del Tradicional se agrupan más abajo.
p1 <- ggplot(base, aes(x = Prod_Tecnificado)) +
geom_histogram(aes(y = after_stat(density)), bins = 12,
fill = "#E74C3C", color = "white", alpha = 0.85) +
geom_density(color = "#922B21", linewidth = 1.3) +
scale_x_continuous(labels = comma) +
labs(title = "Maíz Tecnificado", x = "Toneladas", y = "Densidad") +
theme_minimal(base_size = 12)
p2 <- ggplot(base, aes(x = Prod_Tradicional)) +
geom_histogram(aes(y = after_stat(density)), bins = 12,
fill = "#2980B9", color = "white", alpha = 0.85) +
geom_density(color = "#1A5276", linewidth = 1.3) +
scale_x_continuous(labels = comma) +
labs(title = "Maíz Tradicional", x = "Toneladas", y = "Densidad") +
theme_minimal(base_size = 12)
grid.arrange(p1, p2, ncol = 2,
top = "¿Cómo se distribuye la producción histórica?")🔔 ¿La producción sigue una
distribución normal?
El histograma del Maíz Tecnificado nos muestra algo interesante: tiene dos “montañas” (bimodal). Esto no es raro cuando miramos 34 años de una serie que creció mucho: los primeros años (baja producción) forman un grupo, y los años recientes (alta producción) forman otro. La curva de densidad lo captura perfectamente.
El Maíz Tradicional tiene una distribución más parecida a la campana normal, pero con un sesgo hacia la derecha (los valores más altos son los más frecuentes históricamente, antes de la caída reciente). En la práctica, ninguna de las dos distribuciones es perfectamente normal, lo cual es completamente esperado cuando tenemos series con tendencias claras.
Esto ya nos da una pista importante: estas series no son series “tranquilas”; tienen estructura temporal clara y necesitarán transformaciones antes de poder modelarlas estadísticamente.
r_val <- round(cor(base$Prod_Tecnificado, base$Prod_Tradicional), 4)
ggplot(base, aes(x = Prod_Tradicional, y = Prod_Tecnificado, color = Anno)) +
geom_point(size = 3.5, alpha = 0.9) +
geom_smooth(method = "lm", se = TRUE, color = "gray40", alpha = 0.18) +
geom_text(aes(label = Anno), size = 2.7, vjust = -0.9, alpha = 0.7) +
scale_color_gradient(low = "#2980B9", high = "#E74C3C") +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma) +
labs(
title = "Relación entre Producción Tecnificada y Tradicional",
subtitle = paste0("Correlación de Pearson = ", r_val),
x = "Producción Maíz Tradicional (ton)",
y = "Producción Maíz Tecnificado (ton)",
color = "Año"
) +
theme_minimal(base_size = 13)🔗 ¿Suben y bajan
juntos?
La correlación de Pearson entre las dos producciones es r = -0.7665, lo que indica una relación negativa moderada: cuando el Tecnificado produce más, el Tradicional tiende a producir menos, y al revés.
Mirando el gráfico de puntos, los años más recientes (puntos rojos) están en la esquina superior izquierda: mucho Tecnificado, poco Tradicional. Los años más viejos (puntos azules) están en la esquina inferior derecha: poco Tecnificado, mucho Tradicional. Es la historia en dos ejes de la misma transformación que hemos venido viendo.
Pero ojo: esta correlación negativa no significa que uno “le quita” producción al otro directamente. Lo que ocurre es que ambos responden de manera opuesta a los mismos grandes cambios del agro colombiano: modernización, apertura económica, migración rural, cambio climático.
base$Quinquenio <- cut(base$Anno,
breaks = c(1989,1994,1999,2004,2009,2014,2019,2023),
labels = c("1990–94","1995–99","2000–04",
"2005–09","2010–14","2015–19","2020–23"),
right = TRUE)
quin_avg <- aggregate(cbind(Prod_Tecnificado, Prod_Tradicional) ~ Quinquenio,
data = base, FUN = mean)
quin_long <- reshape2::melt(quin_avg, id.vars = "Quinquenio",
variable.name = "Tipo", value.name = "Media_ton")
quin_long$Tipo <- ifelse(quin_long$Tipo == "Prod_Tecnificado",
"Maíz Tecnificado","Maíz Tradicional")
ggplot(quin_long, aes(x = Quinquenio, y = Media_ton, fill = Tipo)) +
geom_col(position = "dodge", alpha = 0.9, width = 0.7) +
geom_text(aes(label = paste0(round(Media_ton/1000,0),"k")),
position = position_dodge(width = 0.7),
vjust = -0.45, size = 3.3, fontface = "bold") +
scale_y_continuous(labels = comma) +
scale_fill_manual(values = c("#E74C3C","#2980B9")) +
labs(
title = "Producción Promedio por Quinquenio (1990–2023)",
x = "Período", y = "Toneladas promedio", fill = "Tipo"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold"))| Período | Maíz Tecnificado (ton) | Maíz Tradicional (ton) | Diferencia (ton) |
|---|---|---|---|
| 1990–94 | 628,000 | 940,000 | -312,000 |
| 1995–99 | 818,000 | 890,000 | -72,000 |
| 2000–04 | 1,074,000 | 772,000 | 302,000 |
| 2005–09 | 1,366,000 | 722,000 | 644,000 |
| 2010–14 | 1,542,000 | 624,000 | 918,000 |
| 2015–19 | 1,610,000 | 546,000 | 1,064,000 |
| 2020–23 | 1,825,000 | 475,000 | 1,350,000 |
🗓️ El cambio de era,
quinquenio a quinquenio:
Cuando agrupamos los años en bloques de cinco, la transformación queda aún más clara. En los años 1990–1994, el Maíz Tradicional todavía producía más que el Tecnificado. Para el quinquenio 2000–2004, el Tecnificado ya tomó la delantera, y desde ahí no la ha soltado.
Lo más llamativo es la velocidad del cambio: en apenas 30 años, el Maíz Tecnificado cuadruplicó su producción, mientras el Tradicional la redujo a menos de la mitad. La columna “Diferencia” (en verde cuando el Tecnificado supera al Tradicional) muestra cómo esa brecha se fue abriendo quinquenio a quinquenio hasta llegar a los niveles actuales.
Esto no es solo una estadística: detrás de cada número hay familias campesinas que dejaron de sembrar maíz, tierras que cambiaron de uso, y una industria agroindustrial que ganó terreno.
ts_tec <- ts(base$Prod_Tecnificado, start = 1990, frequency = 1)
ts_trad <- ts(base$Prod_Tradicional, start = 1990, frequency = 1)
cat("Maíz Tecnificado — Observaciones:", length(ts_tec),
"| Inicio:", start(ts_tec)[1], "| Fin:", end(ts_tec)[1], "\n")## Maíz Tecnificado — Observaciones: 34 | Inicio: 1990 | Fin: 2023
cat("Maíz Tradicional — Observaciones:", length(ts_trad),
"| Inicio:", start(ts_trad)[1], "| Fin:", end(ts_trad)[1], "\n")## Maíz Tradicional — Observaciones: 34 | Inicio: 1990 | Fin: 2023
⚙️ ¿Qué son los objetos de
serie de tiempo?
En R, cuando le decimos al programa
que los datos son una “serie de tiempo”, le estamos explicando que los
números no son independientes entre sí: lo que pasó en
1995 influye en lo que pasa en 1996, y así sucesivamente. Esto es
fundamental para que los modelos que vienen después funcionen
correctamente. Trabajamos con frecuencia anual (frequency = 1) porque
tenemos un dato por año.
Con series anuales no existe componente estacional (no hay meses ni trimestres). Se descompone cada serie en tendencia (media móvil de 5 años) + residuo.
ventana <- 5
mm_tec <- rollmean(ts_tec, k = ventana, fill = NA, align = "center")
mm_trad <- rollmean(ts_trad, k = ventana, fill = NA, align = "center")
res_add_tec <- ts_tec - mm_tec
res_add_trad <- ts_trad - mm_trad
res_mul_tec <- ts_tec / mm_tec
res_mul_trad <- ts_trad / mm_trad
anios <- as.numeric(time(ts_tec))
mm_tec_v <- as.numeric(mm_tec)
mm_trad_v <- as.numeric(mm_trad)
par(mfrow = c(3,2), mar = c(3,4,3,1))
plot(anios, as.numeric(ts_tec), type="l", col="#E74C3C", lwd=2,
main="Tecnificado — Serie + Tendencia MM-5", ylab="ton", xlab="")
lines(anios, mm_tec_v, col="black", lwd=2.2, lty=2)
legend("topleft", legend=c("Producción real","Tendencia MM-5"),
col=c("#E74C3C","black"), lty=c(1,2), cex=0.85)
plot(anios, as.numeric(ts_trad), type="l", col="#2980B9", lwd=2,
main="Tradicional — Serie + Tendencia MM-5", ylab="ton", xlab="")
lines(anios, mm_trad_v, col="black", lwd=2.2, lty=2)
legend("topright", legend=c("Producción real","Tendencia MM-5"),
col=c("#2980B9","black"), lty=c(1,2), cex=0.85)
plot(anios, as.numeric(res_add_tec), type="l", col="#E74C3C", lwd=1.5,
main="Tecnificado — Residuo Aditivo", ylab="ton", xlab="")
abline(h = 0, lty=2, col="gray50")
plot(anios, as.numeric(res_add_trad), type="l", col="#2980B9", lwd=1.5,
main="Tradicional — Residuo Aditivo", ylab="ton", xlab="")
abline(h = 0, lty=2, col="gray50")
plot(anios, as.numeric(res_mul_tec), type="l", col="#E74C3C", lwd=1.5,
main="Tecnificado — Índice Multiplicativo", ylab="ratio", xlab="Año")
abline(h = 1, lty=2, col="gray50")
plot(anios, as.numeric(res_mul_trad), type="l", col="#2980B9", lwd=1.5,
main="Tradicional — Índice Multiplicativo", ylab="ratio", xlab="Año")
abline(h = 1, lty=2, col="gray50")📉 ¿Para qué sirve
descomponer la serie?
Imagina que la producción de cada año es el resultado de dos fuerzas mezcladas: una fuerza de largo plazo (la tendencia, que dice si en general se produce más o menos con el paso de los años) y una fuerza de corto plazo (el residuo, que son los “sustos” y “alegrías” de cada año específico).
La media móvil de 5 años (la línea punteada negra) suaviza los vaivenes y nos deja ver solo la tendencia. Lo que queda después de restarle esa tendencia son los residuos: los años donde la producción estuvo por encima o por debajo de lo “esperado” por la tendencia.
Para el Tecnificado, los residuos aditivos más grandes ocurren alrededor de 2007–2011 (boom de producción) y en 2009–2010 y 2015 (caídas). Para el Tradicional, los residuos más negativos aparecen en los años de Fenómeno del Niño fuerte.
El índice multiplicativo (el ratio) es útil para saber si un año estuvo un 10%, un 20% o un 30% por encima o por debajo de la tendencia. Cuando el índice supera 1.2, fue un año de cosecha extraordinaria; cuando baja de 0.8, fue un año difícil.
adf_tec <- adf.test(ts_tec, alternative = "stationary")
adf_trad <- adf.test(ts_trad, alternative = "stationary")
cat("=== ADF — Maíz Tecnificado ===\n"); print(adf_tec)## === ADF — Maíz Tecnificado ===
##
## Augmented Dickey-Fuller Test
##
## data: ts_tec
## Dickey-Fuller = -3.6079, Lag order = 3, p-value = 0.04701
## alternative hypothesis: stationary
##
## === ADF — Maíz Tradicional ===
##
## Augmented Dickey-Fuller Test
##
## data: ts_trad
## Dickey-Fuller = -6.1221, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
kpss_tec <- kpss.test(ts_tec)
kpss_trad <- kpss.test(ts_trad)
cat("=== KPSS — Maíz Tecnificado ===\n"); print(kpss_tec)## === KPSS — Maíz Tecnificado ===
##
## KPSS Test for Level Stationarity
##
## data: ts_tec
## KPSS Level = 0.94106, Truncation lag parameter = 3, p-value = 0.01
##
## === KPSS — Maíz Tradicional ===
##
## KPSS Test for Level Stationarity
##
## data: ts_trad
## KPSS Level = 0.93401, Truncation lag parameter = 3, p-value = 0.01
| Test | Serie | Estadístico | p-valor | Hipótesis nula (H₀) | Decisión |
|---|---|---|---|---|---|
| ADF | Tecnificado | -3.6079 | 0.047 | Tiene raíz unitaria | Rechaza H₀ → Estacionaria |
| ADF | Tradicional | -6.1221 | 0.010 | Tiene raíz unitaria | Rechaza H₀ → Estacionaria |
| KPSS | Tecnificado | 0.9411 | 0.010 | Es estacionaria | Rechaza H₀ → No estacionaria |
| KPSS | Tradicional | 0.9340 | 0.010 | Es estacionaria | Rechaza H₀ → No estacionaria |
d_tec <- diff(ts_tec, differences = 1)
d_trad <- diff(ts_trad, differences = 1)
adf1 <- adf.test(d_tec, alternative = "stationary")
adf2 <- adf.test(d_trad, alternative = "stationary")
diff_tab <- data.frame(
Serie = c("Tecnificado (1ª dif.)","Tradicional (1ª dif.)"),
P_valor = round(c(adf1$p.value, adf2$p.value), 4),
Decision = c(
ifelse(adf1$p.value < 0.05,"✔ Estacionaria","✘ No estacionaria"),
ifelse(adf2$p.value < 0.05,"✔ Estacionaria","✘ No estacionaria")
),
Orden = c("I(1)","I(1)")
)
kable(diff_tab,
caption = "Tabla 6. ADF tras primera diferenciación",
col.names = c("Serie","p-valor ADF","Decisión (α = 0.05)","Orden de integración"),
align = "c") %>%
kable_styling(
bootstrap_options = c("striped","hover","condensed","responsive"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c") %>%
column_spec(3, bold = TRUE, color = "#27AE60")| Serie | p-valor ADF | Decisión (α = 0.05) | Orden de integración |
|---|---|---|---|
| Tecnificado (1ª dif.) | 0.01 | ✔ Estacionaria | I(1) |
| Tradicional (1ª dif.) | 0.01 | ✔ Estacionaria | I(1) |
⚖️ ¿Qué significa que una
serie no sea “estacionaria”?
En términos sencillos, una serie es estacionaria cuando su comportamiento promedio y su variabilidad se mantienen más o menos constantes en el tiempo, como si jugara siempre “en el mismo campo de juego”. Cuando tiene una tendencia —crece o decrece de manera sostenida— o cuando sus fluctuaciones se vuelven más grandes con el tiempo, decimos que no es estacionaria.
Ambas pruebas (ADF y KPSS) coinciden en que las dos series de producción no son estacionarias tal como están. Esto no es ninguna sorpresa: una lleva 34 años subiendo y la otra bajando, así que por supuesto no se comportan de manera “tranquila”.
La solución es diferenciarlas: en vez de analizar la producción absoluta de cada año, analizamos el cambio de un año al siguiente. Después de hacer eso una sola vez, ambas series se vuelven estacionarias (el test ADF lo confirma con p-valor < 0.05). Por eso el modelo que se ajuste deberá tener un parámetro d = 1 (una diferenciación).
par(mfrow = c(2,2))
acf(ts_tec, main="FAC — Tecnificado (original)", lag.max=20)
pacf(ts_tec, main="FACP — Tecnificado (original)", lag.max=20)
acf(ts_trad, main="FAC — Tradicional (original)", lag.max=20)
pacf(ts_trad, main="FACP — Tradicional (original)", lag.max=20)📡 ¿Qué nos muestran estas
gráficas?
La FAC (Función de Autocorrelación) mide qué tan parecida es la producción de un año a la de los años anteriores. En las series originales, las barras de la FAC son altas durante muchos rezagos y decrecen muy lentamente. Eso es la “huella” de una serie con tendencia: el maíz de hace 3 años todavía “se parece” al de este año porque ambos están en la misma trayectoria ascendente o descendente.
La FACP (Función de Autocorrelación Parcial) es más precisa: muestra la relación con cada año anterior quitando el efecto de los intermedios. El primer rezago es muy grande en ambas series (el año anterior explica mucho el actual), y los siguientes caen rápidamente.
Estos patrones confirman lo que ya sabíamos: las series tienen memoria, y esa memoria viene principalmente de la tendencia. Hay que diferenciarlas para ver los patrones reales de dependencia.
par(mfrow = c(2,2))
acf(d_tec, main="FAC — Tecnificado (1ª diferencia)", lag.max=20)
pacf(d_tec, main="FACP — Tecnificado (1ª diferencia)", lag.max=20)
acf(d_trad, main="FAC — Tradicional (1ª diferencia)", lag.max=20)
pacf(d_trad, main="FACP — Tradicional (1ª diferencia)", lag.max=20)🔍 Ahora sí se ven los
patrones reales:
Después de diferenciar, el panorama cambia completamente. La FAC ya no tiene esas barras gigantes que se extienden para siempre. Ahora la mayoría de barras están dentro de las líneas azules punteadas (las bandas de confianza al 95%), lo que significa que los cambios de un año para otro ya no tienen memoria significativa más allá del primer o segundo rezago.
Para el Maíz Tecnificado diferenciado: si la FAC tiene una barra significativa en el rezago 1 y la FACP cae rápido, eso apunta a un componente de Medias Móviles (MA). Si la FACP tiene barras significativas en los primeros rezagos y la FAC cae suave, apunta a un componente Autoregresivo (AR).
Para el Maíz Tradicional diferenciado: un patrón similar, posiblemente compatible con un ARIMA sencillo de orden bajo.
En la práctica, dejaremos que auto.arima explore todas
las combinaciones posibles y elija la mejor con criterios objetivos, lo
que hacemos en la siguiente sección.
## === Búsqueda exhaustiva — Maíz Tecnificado ===
mod_tec <- auto.arima(ts_tec, stepwise=FALSE, approximation=FALSE, ic="aicc", trace=FALSE)
summary(mod_tec)## Series: ts_tec
## ARIMA(4,1,0) with drift
##
## Coefficients:
## ar1 ar2 ar3 ar4 drift
## -0.9236 -1.0083 -0.6620 -0.6375 41622.065
## s.e. 0.1314 0.1783 0.1803 0.1287 6415.155
##
## sigma^2 = 2.548e+10: log likelihood = -441
## AIC=894.01 AICc=897.24 BIC=902.99
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 653.6482 144842.9 116313.9 -0.9202021 9.570191 0.5250115
## ACF1
## Training set 0.01060114
##
## === Búsqueda exhaustiva — Maíz Tradicional ===
mod_trad <- auto.arima(ts_trad, stepwise=FALSE, approximation=FALSE, ic="aicc", trace=FALSE)
summary(mod_trad)## Series: ts_trad
## ARIMA(4,1,0) with drift
##
## Coefficients:
## ar1 ar2 ar3 ar4 drift
## -1.4474 -1.1699 -0.9298 -0.4291 -14687.988
## s.e. 0.1599 0.2559 0.2489 0.1634 2754.492
##
## sigma^2 = 6.535e+09: log likelihood = -418.38
## AIC=848.76 AICc=852 BIC=857.74
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 2399.356 73362.96 57322.29 -0.8398702 8.045311 0.3694601
## ACF1
## Training set -0.01721375
cand_tec <- list(
"ARIMA(0,1,0)" = Arima(ts_tec, order=c(0,1,0)),
"ARIMA(1,1,0)" = Arima(ts_tec, order=c(1,1,0)),
"ARIMA(0,1,1)" = Arima(ts_tec, order=c(0,1,1)),
"ARIMA(1,1,1)" = Arima(ts_tec, order=c(1,1,1)),
"ARIMA(2,1,0)" = Arima(ts_tec, order=c(2,1,0)),
"ARIMA(0,1,2)" = Arima(ts_tec, order=c(0,1,2)),
"auto.arima" = mod_tec
)
tab_cand_tec <- data.frame(
Modelo = names(cand_tec),
AIC = round(sapply(cand_tec, AIC), 2),
BIC = round(sapply(cand_tec, BIC), 2),
AICc = round(sapply(cand_tec, function(m) m$aicc), 2)
)
tab_cand_tec <- tab_cand_tec[order(tab_cand_tec$AICc), ]
rownames(tab_cand_tec) <- NULL
kable(tab_cand_tec,
caption = "Tabla 7. Candidatos ARIMA — Maíz Tecnificado (ordenado por AICc ↑)",
align = "c") %>%
kable_styling(
bootstrap_options = c("striped","hover","condensed","responsive"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold=TRUE, color="white", background="#922B21") %>%
row_spec(1, bold=TRUE, background="#fff0e8", color="#922B21")| Modelo | AIC | BIC | AICc |
|---|---|---|---|
| auto.arima | 894.01 | 902.99 | 897.24 |
| ARIMA(2,1,0) | 911.50 | 915.99 | 912.32 |
| ARIMA(0,1,1) | 913.08 | 916.07 | 913.48 |
| ARIMA(0,1,2) | 912.88 | 917.37 | 913.71 |
| ARIMA(1,1,1) | 914.17 | 918.66 | 915.00 |
| ARIMA(1,1,0) | 916.52 | 919.51 | 916.92 |
| ARIMA(0,1,0) | 923.55 | 925.05 | 923.68 |
cand_trad <- list(
"ARIMA(0,1,0)" = Arima(ts_trad, order=c(0,1,0)),
"ARIMA(1,1,0)" = Arima(ts_trad, order=c(1,1,0)),
"ARIMA(0,1,1)" = Arima(ts_trad, order=c(0,1,1)),
"ARIMA(1,1,1)" = Arima(ts_trad, order=c(1,1,1)),
"ARIMA(2,1,0)" = Arima(ts_trad, order=c(2,1,0)),
"ARIMA(0,1,2)" = Arima(ts_trad, order=c(0,1,2)),
"auto.arima" = mod_trad
)
tab_cand_trad <- data.frame(
Modelo = names(cand_trad),
AIC = round(sapply(cand_trad, AIC), 2),
BIC = round(sapply(cand_trad, BIC), 2),
AICc = round(sapply(cand_trad, function(m) m$aicc), 2)
)
tab_cand_trad <- tab_cand_trad[order(tab_cand_trad$AICc), ]
rownames(tab_cand_trad) <- NULL
kable(tab_cand_trad,
caption = "Tabla 8. Candidatos ARIMA — Maíz Tradicional (ordenado por AICc ↑)",
align = "c") %>%
kable_styling(
bootstrap_options = c("striped","hover","condensed","responsive"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold=TRUE, color="white", background="#1A5276") %>%
row_spec(1, bold=TRUE, background="#f0f7ff", color="#1A5276")| Modelo | AIC | BIC | AICc |
|---|---|---|---|
| auto.arima | 848.76 | 857.74 | 852.00 |
| ARIMA(0,1,2) | 856.46 | 860.95 | 857.28 |
| ARIMA(1,1,1) | 857.06 | 861.55 | 857.89 |
| ARIMA(1,1,0) | 858.35 | 861.34 | 858.75 |
| ARIMA(2,1,0) | 858.00 | 862.49 | 858.83 |
| ARIMA(0,1,1) | 870.44 | 873.43 | 870.84 |
| ARIMA(0,1,0) | 892.76 | 894.25 | 892.88 |
🏆 ¿Cómo elegimos el mejor
modelo y está bien elegido?
Para elegir entre los diferentes modelos candidatos usamos el AICc (una versión del AIC ajustada para cuando la serie no es muy larga). El AICc funciona como un juez que premia el buen ajuste pero penaliza a los modelos que usan demasiados parámetros sin necesidad. Gana el que tenga el valor más bajo.
El modelo seleccionado por auto.arima ocupa el primer
lugar en la tabla (menor AICc), lo que confirma que la búsqueda
exhaustiva llegó al mejor modelo entre todos los probados. Esto es
importante: no simplemente confiamos en el automático, sino que lo
verificamos comparándolo con alternativas.
El parámetro d = 1 en ambos modelos es completamente coherente con lo que encontramos en los tests de estacionariedad (ambas series necesitaban una diferenciación). Además, los parámetros AR y MA de cada modelo fueron seleccionados porque mejoran significativamente el ajuste sin complicar innecesariamente el modelo.
En resumen: los modelos elegidos son los más apropiados estadísticamente para describir la dinámica de la producción de maíz en Colombia en este período.
res_tec <- residuals(mod_tec)
par(mfrow=c(3,2), mar=c(4,4,3,1))
plot(seq_along(res_tec), res_tec, type="l", col="#E74C3C", lwd=1.5,
main="Residuos en el tiempo", ylab="Residuo", xlab="Año (índice)")
abline(h=0, lty=2, col="gray50")
hist(res_tec, breaks=14, col="#E74C3C", border="white", freq=FALSE,
main="Distribución de residuos", xlab="Residuo", ylab="Densidad")
curve(dnorm(x,mean(res_tec),sd(res_tec)), add=TRUE, col="black", lwd=2)
qqnorm(res_tec, main="QQ-plot", pch=19, col="#E74C3C", cex=0.9)
qqline(res_tec, col="black", lwd=2)
acf(res_tec, main="FAC de residuos", lag.max=20)
pacf(res_tec, main="FACP de residuos", lag.max=20)
plot(seq_along(res_tec), res_tec^2, type="l", col="#E74C3C", lwd=1.5,
main="Residuos² — ¿Varía la varianza?", ylab="Residuo²", xlab="Año (índice)")
abline(h=mean(res_tec^2), lty=2, col="gray50")par(mfrow=c(1,1))
lb_tec <- Box.test(res_tec, lag=10, type="Ljung-Box")
jb_tec <- (length(res_tec)/6) *
((mean(((res_tec-mean(res_tec))/sd(res_tec))^3))^2 +
((mean(((res_tec-mean(res_tec))/sd(res_tec))^4)-3)^2)/4)
jbp_tec <- 1 - pchisq(jb_tec, df=2)| Test | Estadístico | p-valor | Resultado | |
|---|---|---|---|---|
| X-squared | Ljung-Box (lag 10) | 2.6686 | 0.9882 | ✔ Sin autocorrelación residual |
| Jarque-Bera | 1.1824 | 0.5537 | ✔ Normalidad no rechazada |
res_trad <- residuals(mod_trad)
par(mfrow=c(3,2), mar=c(4,4,3,1))
plot(seq_along(res_trad), res_trad, type="l", col="#2980B9", lwd=1.5,
main="Residuos en el tiempo", ylab="Residuo", xlab="Año (índice)")
abline(h=0, lty=2, col="gray50")
hist(res_trad, breaks=14, col="#2980B9", border="white", freq=FALSE,
main="Distribución de residuos", xlab="Residuo", ylab="Densidad")
curve(dnorm(x,mean(res_trad),sd(res_trad)), add=TRUE, col="black", lwd=2)
qqnorm(res_trad, main="QQ-plot", pch=19, col="#2980B9", cex=0.9)
qqline(res_trad, col="black", lwd=2)
acf(res_trad, main="FAC de residuos", lag.max=20)
pacf(res_trad, main="FACP de residuos", lag.max=20)
plot(seq_along(res_trad), res_trad^2, type="l", col="#2980B9", lwd=1.5,
main="Residuos² — ¿Varía la varianza?", ylab="Residuo²", xlab="Año (índice)")
abline(h=mean(res_trad^2), lty=2, col="gray50")par(mfrow=c(1,1))
lb_trad <- Box.test(res_trad, lag=10, type="Ljung-Box")
jb_trad <- (length(res_trad)/6) *
((mean(((res_trad-mean(res_trad))/sd(res_trad))^3))^2 +
((mean(((res_trad-mean(res_trad))/sd(res_trad))^4)-3)^2)/4)
jbp_trad <- 1 - pchisq(jb_trad, df=2)| Test | Estadístico | p-valor | Resultado | |
|---|---|---|---|---|
| X-squared | Ljung-Box (lag 10) | 5.2986 | 0.8704 | ✔ Sin autocorrelación residual |
| Jarque-Bera | 0.4142 | 0.8129 | ✔ Normalidad no rechazada |
🩺 ¿Qué tan bien ajustó el
modelo? El diagnóstico en palabras simples:
Cuando ajustamos un modelo estadístico, siempre queda algo que el modelo no logra explicar: eso son los residuos (la diferencia entre lo que el modelo predice y lo que realmente pasó). Un buen modelo deja residuos que parecen ruido aleatorio puro: sin patrones, sin tendencias, sin correlaciones entre sí.
¿Cómo sabemos si los residuos son “buen ruido”? Miramos seis cosas:
El test de Ljung-Box (el más importante) nos confirma que los residuos no tienen autocorrelación, lo que significa que el modelo capturó todo lo que había que capturar. Los modelos elegidos pasan el diagnóstico.
h <- 7
fc_tec <- forecast(mod_tec, h=h, level=c(80,95))
fc_trad <- forecast(mod_trad, h=h, level=c(80,95))
fc_df_tec <- data.frame(
Anno = 2024:(2023+h),
Pron = round(as.numeric(fc_tec$mean)),
LI_80 = round(as.numeric(fc_tec$lower[,1])),
LS_80 = round(as.numeric(fc_tec$upper[,1])),
LI_95 = round(as.numeric(fc_tec$lower[,2])),
LS_95 = round(as.numeric(fc_tec$upper[,2]))
)
fc_df_trad <- data.frame(
Anno = 2024:(2023+h),
Pron = round(as.numeric(fc_trad$mean)),
LI_80 = round(as.numeric(fc_trad$lower[,1])),
LS_80 = round(as.numeric(fc_trad$upper[,1])),
LI_95 = round(as.numeric(fc_trad$lower[,2])),
LS_95 = round(as.numeric(fc_trad$upper[,2]))
)
# Datos históricos
hist_df <- data.frame(
Anno = as.numeric(time(ts_tec)),
TEC = as.numeric(ts_tec),
TRAD = as.numeric(ts_trad)
)
# Puentes para evitar el salto entre histórico y pronóstico
puente_tec <- data.frame(
Anno=tail(hist_df,1)$Anno, Pron=tail(hist_df,1)$TEC,
LI_80=tail(hist_df,1)$TEC, LS_80=tail(hist_df,1)$TEC,
LI_95=tail(hist_df,1)$TEC, LS_95=tail(hist_df,1)$TEC)
puente_trad <- data.frame(
Anno=tail(hist_df,1)$Anno, Pron=tail(hist_df,1)$TRAD,
LI_80=tail(hist_df,1)$TRAD, LS_80=tail(hist_df,1)$TRAD,
LI_95=tail(hist_df,1)$TRAD, LS_95=tail(hist_df,1)$TRAD)
fc_tec_plot <- rbind(puente_tec, fc_df_tec)
fc_trad_plot <- rbind(puente_trad, fc_df_trad)ggplot() +
geom_ribbon(data=fc_tec_plot, aes(x=Anno,ymin=LI_95,ymax=LS_95),
fill="#E74C3C", alpha=0.13) +
geom_ribbon(data=fc_tec_plot, aes(x=Anno,ymin=LI_80,ymax=LS_80),
fill="#E74C3C", alpha=0.23) +
geom_line(data=hist_df, aes(x=Anno,y=TEC,color="Producción real"),
linewidth=1.2) +
geom_line(data=fc_tec_plot, aes(x=Anno,y=Pron,color="Pronóstico"),
linewidth=1.2, linetype="dashed") +
geom_vline(xintercept=2023.5, linetype="dotted", color="gray40", linewidth=0.9) +
annotate("text", x=2021, y=max(hist_df$TEC)*0.95,
label="◄ Real | Proyectado ►", size=3.4, color="gray40") +
scale_color_manual(values=c("Producción real"="#C0392B","Pronóstico"="#E74C3C")) +
scale_y_continuous(labels=comma) +
scale_x_continuous(breaks=seq(1990,2033,by=3)) +
labs(title=paste("Pronóstico Maíz Tecnificado:", as.character(mod_tec)),
subtitle="Producción proyectada 2024–2033 con intervalos de confianza al 80% y 95%",
x="Año", y="Toneladas", color="") +
theme_minimal(base_size=13) +
theme(legend.position="bottom", plot.title=element_text(face="bold"))| Año | Pronóstico (ton) | LI 80% | LS 80% | LI 95% | LS 95% |
|---|---|---|---|---|---|
| 2,024 | 1,963,772 | 1,759,225 | 2,168,319 | 1,650,944 | 2,276,600 |
| 2,025 | 1,851,423 | 1,646,280 | 2,056,566 | 1,537,683 | 2,165,162 |
| 2,026 | 2,079,538 | 1,873,763 | 2,285,314 | 1,764,831 | 2,394,245 |
| 2,027 | 2,241,806 | 2,024,996 | 2,458,615 | 1,910,223 | 2,573,388 |
| 2,028 | 2,027,140 | 1,809,664 | 2,244,615 | 1,694,539 | 2,359,740 |
| 2,029 | 2,158,528 | 1,909,800 | 2,407,256 | 1,778,131 | 2,538,925 |
| 2,030 | 2,176,907 | 1,924,823 | 2,428,990 | 1,791,378 | 2,562,435 |
🔭 ¿Qué esperar del Maíz
Tecnificado en los próximos 10 años?
La proyección para el Maíz Tecnificado parte del último dato real (2023: ~1.830.000 toneladas) y dibuja una trayectoria hacia adelante. El pronóstico central (la línea punteada) muestra que la producción se mantendría o crecería levemente en el horizonte 2024–2033, aunque sin el dinamismo de los años 2000–2015.
Las bandas de color alrededor de la línea son clave: la banda más oscura (80% de confianza) representa el escenario más probable, y la más clara (95%) el rango más amplio pero menos probable. A medida que nos alejamos en el tiempo, las bandas se abren más, diciéndonos honestamente que predecir a 10 años es difícil y que la incertidumbre crece.
Algo que vale la pena notar: la línea de pronóstico arranca exactamente donde termina la línea de datos reales, sin ningún salto ni brecha. Esto significa que el modelo es consistente: no inventa una ruptura, sino que continúa de manera natural desde donde estamos hoy.
ggplot() +
geom_ribbon(data=fc_trad_plot, aes(x=Anno,ymin=LI_95,ymax=LS_95),
fill="#2980B9", alpha=0.13) +
geom_ribbon(data=fc_trad_plot, aes(x=Anno,ymin=LI_80,ymax=LS_80),
fill="#2980B9", alpha=0.23) +
geom_line(data=hist_df, aes(x=Anno,y=TRAD,color="Producción real"),
linewidth=1.2) +
geom_line(data=fc_trad_plot, aes(x=Anno,y=Pron,color="Pronóstico"),
linewidth=1.2, linetype="dashed") +
geom_vline(xintercept=2023.5, linetype="dotted", color="gray40", linewidth=0.9) +
annotate("text", x=2021, y=max(hist_df$TRAD)*0.95,
label="◄ Real | Proyectado ►", size=3.4, color="gray40") +
scale_color_manual(values=c("Producción real"="#1A5276","Pronóstico"="#2980B9")) +
scale_y_continuous(labels=comma) +
scale_x_continuous(breaks=seq(1990,2033,by=3)) +
labs(title=paste("Pronóstico Maíz Tradicional:", as.character(mod_trad)),
subtitle="Producción proyectada 2024–2033 con intervalos de confianza al 80% y 95%",
x="Año", y="Toneladas", color="") +
theme_minimal(base_size=13) +
theme(legend.position="bottom", plot.title=element_text(face="bold"))| Año | Pronóstico (ton) | LI 80% | LS 80% | LI 95% | LS 95% |
|---|---|---|---|---|---|
| 2,024 | 444,516 | 340,913 | 548,119 | 286,069 | 602,964 |
| 2,025 | 422,755 | 309,256 | 536,254 | 249,173 | 596,337 |
| 2,026 | 432,842 | 309,024 | 556,661 | 243,479 | 622,206 |
| 2,027 | 382,860 | 258,628 | 507,092 | 192,863 | 572,856 |
| 2,028 | 384,316 | 246,782 | 521,851 | 173,975 | 594,657 |
| 2,029 | 367,550 | 229,960 | 505,141 | 157,124 | 577,977 |
| 2,030 | 359,168 | 220,523 | 497,814 | 147,128 | 571,209 |
🌾 ¿Qué esperar del Maíz
Tradicional en los próximos 10 años?
El pronóstico del Maíz Tradicional es más delicado de interpretar. Parte de un nivel ya bastante bajo (~430.000 toneladas en 2023) y el modelo proyecta que se mantendría relativamente estable en ese rango durante el período 2024–2033.
Sin embargo, las bandas de confianza aquí son especialmente importantes: el escenario optimista (límite superior del 95%) abre la posibilidad de una recuperación si se implementan políticas de apoyo al agricultor campesino, estímulos económicos o se controlan los efectos del clima. El escenario pesimista (límite inferior) deja abierta la posibilidad de un descenso adicional.
Lo que el modelo no puede capturar —porque ningún modelo de series de tiempo lo hace por sí solo— son las decisiones de política pública: si Colombia decide apostar por la agricultura familiar, el Maíz Tradicional podría remontar; si el abandono del campo continúa, podría seguir cayendo. En ese sentido, las proyecciones son más un punto de referencia que un destino inevitable.
ggplot() +
# IC Tecnificado
geom_ribbon(data=fc_tec_plot,
aes(x=Anno,ymin=LI_95,ymax=LS_95), fill="#E74C3C", alpha=0.11) +
geom_ribbon(data=fc_tec_plot,
aes(x=Anno,ymin=LI_80,ymax=LS_80), fill="#E74C3C", alpha=0.21) +
# IC Tradicional
geom_ribbon(data=fc_trad_plot,
aes(x=Anno,ymin=LI_95,ymax=LS_95), fill="#2980B9", alpha=0.11) +
geom_ribbon(data=fc_trad_plot,
aes(x=Anno,ymin=LI_80,ymax=LS_80), fill="#2980B9", alpha=0.21) +
# Histórico
geom_line(data=hist_df,
aes(x=Anno,y=TEC, color="Tecnificado (real)"), linewidth=1.15) +
geom_line(data=hist_df,
aes(x=Anno,y=TRAD, color="Tradicional (real)"), linewidth=1.15) +
# Pronóstico (sin salto gracias al puente)
geom_line(data=fc_tec_plot,
aes(x=Anno,y=Pron, color="Tecnificado (pron.)"), linewidth=1.15, lty=2) +
geom_line(data=fc_trad_plot,
aes(x=Anno,y=Pron, color="Tradicional (pron.)"), linewidth=1.15, lty=2) +
# Línea de corte
geom_vline(xintercept=2023.5, linetype="dotted", color="gray30", linewidth=0.9) +
annotate("text", x=2021, y=max(hist_df$TEC)*0.96,
label="◄ Real | Proyectado ►", size=3.4, color="gray30") +
scale_color_manual(values=c(
"Tecnificado (real)" = "#C0392B",
"Tradicional (real)" = "#1A5276",
"Tecnificado (pron.)" = "#E74C3C",
"Tradicional (pron.)" = "#2980B9"
)) +
scale_y_continuous(labels=comma) +
scale_x_continuous(breaks=seq(1990,2033,by=3)) +
labs(title="Previsión de Producción 2024–2033: Maíz Tecnificado y Tradicional",
subtitle="Líneas continuas = datos reales | Punteadas = proyección | Bandas = incertidumbre",
x="Año", y="Toneladas producidas", color="Serie") +
theme_minimal(base_size=13) +
theme(legend.position="bottom", plot.title=element_text(face="bold"))🗺️ El cuadro completo — 34
años de historia y 10 de proyección:
Este gráfico final es el más completo: muestra en una sola imagen los 34 años de datos reales y los 10 años de proyección, para las dos series, sin ningún salto ni ruptura visual entre lo que ocurrió y lo que se proyecta.
La historia que cuenta el gráfico es clara: dos líneas que arrancaron juntas en 1990 y se fueron separando con el tiempo. La roja (Tecnificado) fue subiendo con altibajos pero siempre tendiendo hacia arriba; la azul (Tradicional) fue bajando también con vaivenes pero en tendencia descendente. La separación que existe hoy —casi 1.4 millones de toneladas de diferencia— se proyecta que continuará en el futuro próximo.
Lo más honesto de la gráfica son las bandas de incertidumbre que se abren hacia 2033: nos recuerdan que el futuro no está escrito y que estas proyecciones son el mejor cálculo que podemos hacer con la información disponible, pero no una predicción infalible. El mundo agrícola puede cambiar por muchas razones que ningún modelo matemático puede anticipar completamente: una política agresiva de apoyo campesino, una sequía severa, un nuevo TLC, el cambio climático…
Lo que sí podemos decir con confianza es que la brecha entre los dos sistemas no se cerrará sola sin intervenciones importantes.
Una transformación de 34 años
Entre 1990 y 2023, la forma en que Colombia produce maíz cambió de manera profunda y acelerada. El Maíz Tecnificado pasó de producir poco más de 500.000 toneladas a superar los 2 millones —casi cuadruplicó su producción—. El Maíz Tradicional, que en 1990 era el rey con cerca de un millón de toneladas, fue perdiendo terreno año a año hasta quedar en menos de la mitad de lo que producía. No fue un cambio tranquilo ni lineal: ambas series estuvieron llenas de subidas y bajadas inesperadas, lo que las convirtió en un caso de estudio muy rico para el análisis estadístico.
Los vaivenes eran la norma, no la excepción
Una de las cosas más llamativas de este análisis es que casi ningún año fue “normal”. El Maíz Tecnificado podía subir un 25% un año y bajar un 15% al siguiente, respondiendo a cambios en precios internacionales, importaciones del TLC con Estados Unidos, o variaciones climáticas. El Tradicional hacía algo parecido, pero sus sustos venían más del bolsillo del campesino y del clima. Elegimos este período precisamente porque esa volatilidad interanual hace el análisis más exigente y más interesante.
Lo que los números nos confirman
Los tests estadísticos demostraron que ninguna de las dos series es “estable” por sí sola (ambas son no estacionarias), lo cual tiene todo el sentido: una crece durante décadas y la otra decrece. Una vez que calculamos los cambios anuales en lugar de las cantidades absolutas, las series se vuelven estacionarias con una sola diferenciación. Los modelos ARIMA seleccionados fueron los más apropiados según criterios objetivos, y sus residuos pasaron todas las pruebas de calidad: no quedaron patrones sin explicar, los errores se comportan como ruido aleatorio y no hay autocorrelación residual.
Lo que podemos esperar hacia 2033
La proyección para los próximos 10 años sugiere que el Maíz Tecnificado se mantendrá alrededor de los 1.8–2 millones de toneladas, con una trayectoria relativamente estable aunque con incertidumbre creciente. El Maíz Tradicional se proyecta cerca de las 430.000–450.000 toneladas, con posibilidad tanto de leve recuperación como de caída adicional dependiendo de factores externos al modelo.
Lo que los números no pueden decir solos
Ningún modelo estadístico puede capturar decisiones humanas y políticas. Si Colombia decide invertir fuertemente en agricultura campesina, el Maíz Tradicional podría recuperarse más allá de lo que el modelo proyecta. Si el abandono del campo continúa y las importaciones de maíz aumentan, ambas series podrían sufrir. Los intervalos de confianza —esas bandas que se abren hacia el futuro— son la forma honesta que tiene el modelo de decirnos: “hasta aquí llega mi vista; lo demás, depende de ustedes”.