La producción agrícola es un componente esencial para garantizar la seguridad alimentaria y el desarrollo sostenible. En un contexto de cambio climático, el rendimiento de los cultivos se ve influenciado por variables ambientales (como la lluvia y la temperatura), las condiciones del suelo y las prácticas de manejo aplicadas por los agricultores.
El análisis estadístico y la modelación predictiva permiten comprender cómo interactúan estos factores y en qué medida afectan la producción. A través de la aplicación de técnicas como la regresión lineal múltiple, es posible identificar qué variables tienen un mayor impacto y generar modelos que predigan la producción futura bajo diferentes escenarios climáticos o de manejo.
El uso de herramientas como R facilita el procesamiento de grandes bases de datos agrícolas, el análisis de relaciones entre variables y la generación de modelos estadísticos con alto nivel de precisión. Estas herramientas son clave para orientar políticas de producción sostenible y optimizar la planificación agrícola, contribuyendo a la seguridad alimentaria y la resiliencia de los cultivos frente al cambio climático.
El presente análisis se enfoca en el estudio de los factores que influyen en la producción agrícola, medida como el rendimiento en toneladas por hectárea. La base de datos utilizada incluye información sobre distintas regiones, tipos de suelo y condiciones de manejo (uso de fertilizantes y riego), además de variables climáticas como la precipitación (Rainfall_mm) y la temperatura (Temperature_Celsius).
A partir de estos datos, se busca identificar qué variables presentan un efecto significativo sobre el rendimiento agrícola y desarrollar un modelo predictivo que permita estimar la producción esperada en función de las condiciones ambientales y de manejo.
Este tipo de análisis tiene aplicaciones directas en la planificación agrícola, la gestión de recursos hídricos y la formulación de estrategias de adaptación al cambio climático, contribuyendo a la toma de decisiones orientadas a una agricultura más productiva y sostenible.
Determinar si existe un efecto significativo de las variables climáticas , de manejo y edáficas en el nivel de producción de cultivos.
1.Comprensión del problema
Propósito:Analizar los factores que inciden en el rendimiento agrícola y generar un modelo predictivo confiable.
Importancia:Contribuir a mejorar la eficiencia productiva y la planificación agrícola en un contexto de cambio climático.
2.Comprensión de los datos
##Cargar base de datos
library(readr)
AHORASI <- read_delim("AHORASI.csv", delim = ";",
escape_double = FALSE, locale = locale(decimal_mark = ",",
grouping_mark = "."), trim_ws = TRUE)
## Rows: 1000000 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (4): Region, Soil_Type, Crop, Weather_Condition
## dbl (4): Rainfall_mm, Temperature_Celsius, Days_to_Harvest, Yield_tons_per_h...
## lgl (2): Fertilizer_Used, Irrigation_Used
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(AHORASI)
str(AHORASI)
## spc_tbl_ [1,000,000 × 10] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Region : chr [1:1000000] "West" "South" "North" "North" ...
## $ Soil_Type : chr [1:1000000] "Sandy" "Clay" "Loam" "Sandy" ...
## $ Crop : chr [1:1000000] "Cotton" "Rice" "Barley" "Soybean" ...
## $ Rainfall_mm : num [1:1000000] 897 993 148 987 730 ...
## $ Temperature_Celsius : num [1:1000000] 27.7 18 29.8 16.6 31.6 ...
## $ Fertilizer_Used : logi [1:1000000] FALSE TRUE FALSE FALSE TRUE FALSE ...
## $ Irrigation_Used : logi [1:1000000] TRUE TRUE FALSE TRUE TRUE TRUE ...
## $ Weather_Condition : chr [1:1000000] "Cloudy" "Rainy" "Sunny" "Rainy" ...
## $ Days_to_Harvest : num [1:1000000] 122 140 106 146 110 74 90 61 127 140 ...
## $ Yield_tons_per_hectare: num [1:1000000] 6.56 8.53 1.13 6.52 7.25 ...
## - attr(*, "spec")=
## .. cols(
## .. Region = col_character(),
## .. Soil_Type = col_character(),
## .. Crop = col_character(),
## .. Rainfall_mm = col_double(),
## .. Temperature_Celsius = col_double(),
## .. Fertilizer_Used = col_logical(),
## .. Irrigation_Used = col_logical(),
## .. Weather_Condition = col_character(),
## .. Days_to_Harvest = col_double(),
## .. Yield_tons_per_hectare = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
summary(AHORASI)
## Region Soil_Type Crop Rainfall_mm
## Length:1000000 Length:1000000 Length:1000000 Min. : 100.0
## Class :character Class :character Class :character 1st Qu.: 324.9
## Mode :character Mode :character Mode :character Median : 550.1
## Mean : 550.0
## 3rd Qu.: 774.7
## Max. :1000.0
## Temperature_Celsius Fertilizer_Used Irrigation_Used Weather_Condition
## Min. :15.00 Mode :logical Mode :logical Length:1000000
## 1st Qu.:21.25 FALSE:500060 FALSE:500509 Class :character
## Median :27.51 TRUE :499940 TRUE :499491 Mode :character
## Mean :27.50
## 3rd Qu.:33.75
## Max. :40.00
## Days_to_Harvest Yield_tons_per_hectare
## Min. : 60.0 Min. :-1.148
## 1st Qu.: 82.0 1st Qu.: 3.418
## Median :104.0 Median : 4.652
## Mean :104.5 Mean : 4.649
## 3rd Qu.:127.0 3rd Qu.: 5.879
## Max. :149.0 Max. : 9.963
Variables principales
Rainfall_mm: Precipitación (mm)
Temperature_Celsius: Temperatura (°C)
Fertilizer_Used: Uso de fertilizante (Sí/No)
Irrigation_Used: Uso de riego (Sí/No)
Soil_Type: Tipo de suelo (Chalky, Clay, Loam, Peaty, Sandy, Silt)
Days_to_Harvest: Días al momento de cosecha
Yield_tons_per_hectare: Producción (variable respuesta)
3.Preparación de los datos
##Convertir variables categóricas a factor
AHORASI$Fertilizer_Used <- as.factor(AHORASI$Fertilizer_Used)
AHORASI$Irrigation_Used <- as.factor(AHORASI$Irrigation_Used)
AHORASI$Soil_Type <- as.factor(AHORASI$Soil_Type)
##Verificar NA
sum(is.na(AHORASI))
## [1] 0
modelo <- lm(Yield_tons_per_hectare ~ Rainfall_mm + Temperature_Celsius +
Fertilizer_Used + Irrigation_Used + Soil_Type + Days_to_Harvest,
data = AHORASI)
summary(modelo)
##
## Call:
## lm(formula = Yield_tons_per_hectare ~ Rainfall_mm + Temperature_Celsius +
## Fertilizer_Used + Irrigation_Used + Soil_Type + Days_to_Harvest,
## data = AHORASI)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.35934 -0.33753 -0.00074 0.33790 2.31907
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.087e-04 3.293e-03 0.094 0.925
## Rainfall_mm 4.997e-03 1.926e-06 2594.285 <2e-16 ***
## Temperature_Celsius 1.992e-02 6.931e-05 287.444 <2e-16 ***
## Fertilizer_UsedTRUE 1.500e+00 1.001e-03 1498.966 <2e-16 ***
## Irrigation_UsedTRUE 1.200e+00 1.001e-03 1198.488 <2e-16 ***
## Soil_TypeClay 3.697e-03 1.734e-03 2.132 0.033 *
## Soil_TypeLoam 4.057e-04 1.733e-03 0.234 0.815
## Soil_TypePeaty 8.018e-04 1.734e-03 0.462 0.644
## Soil_TypeSandy 1.738e-03 1.732e-03 1.004 0.316
## Soil_TypeSilt -8.598e-04 1.733e-03 -0.496 0.620
## Days_to_Harvest 2.656e-05 1.928e-05 1.377 0.168
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5005 on 999989 degrees of freedom
## Multiple R-squared: 0.913, Adjusted R-squared: 0.913
## F-statistic: 1.049e+06 on 10 and 999989 DF, p-value: < 2.2e-16
*Las variables lluvia, temperatura, uso de fertilizante y uso de riego presentan efectos significativos (p < 0.05) sobre el rendimiento.
*El valor de R² cercano a 0.91 indica que el modelo explica más del 90% de la variabilidad en la producción.
*Las variables de tipo de suelo muestran efectos menores, pero contribuyen al modelo.
Relación entre lluvia y rendimiento
plot(AHORASI$Rainfall_mm, AHORASI$Yield_tons_per_hectare,
col = "darkblue", pch = 16, cex = 0.5,
main = "Relacion entre lluvia y rendimiento",
xlab = "Lluvia (mm)",
ylab = "Rendimiento (ton/ha)")
abline(lm(Yield_tons_per_hectare ~ Rainfall_mm, data = AHORASI),
col = "red", lwd = 2)
*La pendiente de la linea roja es positiva, esto quiere decir que a mayor cantidad de lluvia, mayor rendimiento agrícola
Esto significa que la lluvia es un predictor con efecto positivo sobre la producción.
Relación entre temperatura y rendimiento
plot(AHORASI$Temperature_Celsius, AHORASI$Yield_tons_per_hectare,
col = "darkgreen", pch = 16, cex = 0.5,
main = "Relacion entre temperatura y rendimiento",
xlab = "Temperatura (C)",
ylab = "Rendimiento (ton/ha)")
abline(lm(Yield_tons_per_hectare ~ Temperature_Celsius, data = AHORASI),
col = "red", lwd = 2)
*Los puntos están completamente dispersos por el eje vertical, sin un patrón claro
*La linea roja de regresión es casi horizontal, con una pendiente muy pequeña
La temperatura no muestra una relación significativa con el rendimiento del cultivo.
Relación entre días de cosecha y rendimiento
plot(AHORASI$Days_to_Harvest, AHORASI$Yield_tons_per_hectare,
col = "purple", pch = 16, cex = 0.5,
main = "Relacion entre dias a cosecha y rendimiento",
xlab = "Dias hasta la cosecha",
ylab = "Rendimiento (ton/ha)")
abline(lm(Yield_tons_per_hectare ~ Days_to_Harvest, data = AHORASI),
col = "red", lwd = 2)
Los días hasta la cosecha tampoco muestran una relación importante con el rendimiento.
Efecto del uso de fertilizante
boxplot(Yield_tons_per_hectare ~ Fertilizer_Used, data = AHORASI,
col = c("orange", "darkseagreen"),
main = "Efecto del uso de fertilizante sobre el rendimiento",
xlab = "Uso de fertilizante",
ylab = "Rendimiento (ton/ha)")
*El grupo TRUE (con fertilizante) tiene una mediana más alta (~5 ton/ha).
*El grupo FALSE (sin fertilizante) tiene una mediana más baja (~4 ton/ha).
*Hay valores manas bajos en el grupo sin fertilizante
*Hay más valores bajos en el grupo sin fertilizante.
Efecto del riego
boxplot(Yield_tons_per_hectare ~ Irrigation_Used, data = AHORASI,
col = c("lightblue", "lightgreen"),
main = "Efecto del riego sobre el rendimiento",
xlab = "Uso de riego",
ylab = "Rendimiento (ton/ha)")
*Igual que con fertilizante: los cultivos con riego (TRUE) tienen mayor mediana (~5 ton/ha).
*Los cultivos sin riego tienen menor rendimiento medio (~4 ton/ha).
*Hay menos rendimientos extremadamente bajos en el grupo con riego
Rendimiento según el tipo de suelo
boxplot(Yield_tons_per_hectare ~ Soil_Type, data = AHORASI,
col = rainbow(6),
main = "Rendimiento por tipo de suelo",
xlab = "Tipo de suelo",
ylab = "Rendimiento (ton/ha)")
*todos los tipos de suelo tienen medianas entre 4 y 5 ton/ha.
la variación es muy parecida entre suelo
No hay un tipo de suelo sobresalga claramente El tipo de suelo no parece influir fuertemente en el rendimiento.
Sirve para verificar si el modelo cumple con los supuestos
par(mfrow = c(2, 2))
plot(modelo)
Residuals vs Fitted: Los residuos se distribuyen de manera aleatoria alrededor de cero, lo cual indica que la relación entre las variables es esencialmente lineal y no hay patrones sistemáticos.
Q-Q Plot: Los puntos siguen la línea diagonal, lo que sugiere que los residuos se aproximan a una distribución normal, cumpliendo el supuesto de normalidad.
Scale-Location: La dispersión constante de los puntos a lo largo del eje X indica que los residuos presentan varianza constante (homocedasticidad).
Residuals vs Leverage: No se observan puntos con alta influencia por lo que no existen observaciones que afecten de forma desproporcionada el modelo.
Creación de dos escenarios:
Escenario 1: 800 mm de lluvia, 22 °C, fertilizante usado, riego usado, suelo franco y 120 días a cosecha.
Escenario 2: 1200 mm, 28 °C, sin fertilizante, con riego, suelo arcilloso y 100 días a cosecha.
# Crear el nuevo conjunto de condiciones
nuevos_datos <- data.frame(
Rainfall_mm = c(800, 1200),
Temperature_Celsius = c(22, 28),
Fertilizer_Used = factor(c("TRUE", "FALSE"), levels = levels(AHORASI$Fertilizer_Used)),
Irrigation_Used = factor(c("TRUE", "TRUE"), levels = levels(AHORASI$Irrigation_Used)),
Soil_Type = factor(c("Loam", "Clay"), levels = levels(AHORASI$Soil_Type)),
Days_to_Harvest = c(120, 100)
)
# Reconvertir los factores y asegurar que los niveles coincidan exactamente
AHORASI$Fertilizer_Used <- factor(AHORASI$Fertilizer_Used, levels = c("FALSE", "TRUE"))
AHORASI$Irrigation_Used <- factor(AHORASI$Irrigation_Used, levels = c("FALSE", "TRUE"))
nuevos_datos <- as.data.frame(nuevos_datos)
nuevos_datos$Fertilizer_Used <- factor(as.character(nuevos_datos$Fertilizer_Used),
levels = c("FALSE", "TRUE"))
nuevos_datos$Irrigation_Used <- factor(as.character(nuevos_datos$Irrigation_Used),
levels = c("FALSE", "TRUE"))
# Volvemos a ajustar el modelo en el mismo entorno para que no haya desincronización
modelo <- lm(Yield_tons_per_hectare ~ Rainfall_mm + Temperature_Celsius +
Fertilizer_Used + Irrigation_Used + Soil_Type + Days_to_Harvest,
data = AHORASI)
# Generar predicciones
predicciones <- predict(modelo, nuevos_datos)
# Mostrar tabla combinada
resultados_pred <- cbind(nuevos_datos, Predicted_Yield = round(predicciones, 3))
knitr::kable(resultados_pred, caption = "Predicciones de rendimiento agricola segun diferentes escenarios.")
| Rainfall_mm | Temperature_Celsius | Fertilizer_Used | Irrigation_Used | Soil_Type | Days_to_Harvest | Predicted_Yield |
|---|---|---|---|---|---|---|
| 800 | 22 | TRUE | TRUE | Loam | 120 | 7.14 |
| 1200 | 28 | FALSE | TRUE | Clay | 100 | 7.76 |
En condiciones de suelo franco (Loam), con uso de fertilizantes y riego, y lluvias moderadas (800 mm), el rendimiento esperado es de aproximadamente 7.14 ton/ha.
En cambio, para un suelo arcilloso (Clay) sin uso de fertilizante, con mayor precipitación (1200 mm) y riego, el rendimiento esperado es de cerca de 7.76 ton/ha.
str(AHORASI[, c("Fertilizer_Used", "Irrigation_Used")])
## tibble [1,000,000 × 2] (S3: tbl_df/tbl/data.frame)
## $ Fertilizer_Used: Factor w/ 2 levels "FALSE","TRUE": 1 2 1 1 2 1 1 2 2 1 ...
## $ Irrigation_Used: Factor w/ 2 levels "FALSE","TRUE": 2 2 1 2 2 2 1 2 1 2 ...
str(nuevos_datos[, c("Fertilizer_Used", "Irrigation_Used")])
## 'data.frame': 2 obs. of 2 variables:
## $ Fertilizer_Used: Factor w/ 2 levels "FALSE","TRUE": 2 1
## $ Irrigation_Used: Factor w/ 2 levels "FALSE","TRUE": 2 2
library(shiny)
# Tu modelo ya existe en el ambiente:
modelo <- lm(Yield_tons_per_hectare ~ Rainfall_mm + Temperature_Celsius +
Fertilizer_Used + Irrigation_Used + Soil_Type + Days_to_Harvest,
data = AHORASI)
# ---------- INTERFAZ ----------
ui <- fluidPage(
titlePanel("Prediccion de rendimiento agricola"),
sidebarLayout(
sidebarPanel(
numericInput("lluvia", "Lluvia (mm):", value = 100, min = 0),
numericInput("fert", "Uso de Fertilizante (kg/ha):", value = 0, min = 0),
selectInput("riego", "Riego aplicado:",
choices = c("No" = 0, "Sí" = 1)),
actionButton("go", "Predecir rendimiento")
),
mainPanel(
h3("Resultado de la prediccion:"),
verbatimTextOutput("resultado")
)
)
)
# ---------- SERVIDOR ----------
server <- function(input, output){
observeEvent(input$go, {
# Crear el nuevo dataframe para predecir
datos_nuevos <- data.frame(
Rainfall_mm = input$lluvia,
Temperature_Celsius = mean(AHORASI$Temperature_Celsius, na.rm = TRUE),
Fertilizer_Used = input$fert,
Irrigation_Used = as.numeric(input$riego),
Soil_Type = names(sort(table(AHORASI$Soil_Type), decreasing = TRUE))[1],
Days_to_Harvest = mean(AHORASI$Days_to_Harvest, na.rm = TRUE)
)
pred <- predict(modelo, newdata = datos_nuevos)
output$resultado <- renderText({
paste("El modelo predice un rendimiento de:", round(pred, 3), "t/ha")
})
})
}
# ---------- EJECUTAR APP ----------
shinyApp(ui = ui, server = server)