Marco Teórico

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.

Introducción

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.

Objetivo

Determinar si existe un efecto significativo de las variables climáticas , de manejo y edáficas en el nivel de producción de cultivos.

Metodología

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)

Ver estructura y resumen

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

Modelado

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

Interpretación

*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.

Visualización de relaciones entre variables

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)

Interpretación

*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)

Interpretación

*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)

Interpretación

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)")

Interpretación

*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)")

Interpretación

*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)")

Interpretación

*todos los tipos de suelo tienen medianas entre 4 y 5 ton/ha.

Diagnóstico de modelo

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.

Predicción

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.")
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

Interpretación

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

Aplicación rápida para hacer predicciones

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)
Shiny applications not supported in static R Markdown documents