En los sistemas agrícolas, las condiciones de riego pueden estar relacionadas con el estado hídrico y el comportamiento del cultivo. Por esta razón, las tablas de contingencia y las probabilidades condicionales permiten analizar si existe una relación entre diferentes categorías de manejo agrícola.
En este trabajo se analiza una base de datos agrícola para estudiar la posible relación entre el sistema de riego y el estado del cultivo.
Primero se realiza un cálculo manual de una probabilidad condicional. Posteriormente, este resultado se reproduce utilizando R mediante las funciones estadísticas trabajadas en clase. Finalmente, se aplica una prueba de chi-cuadrado para analizar la independencia entre las dos variables.
El archivo utilizado para el análisis es:
riego_estres_hidrico_agricola (1).csv
La base contiene información relacionada con lotes agrícolas, sectores, sistemas de riego, textura del suelo, horas de riego, precipitación, humedad del suelo, fallas de bomba, estado del cultivo y rendimiento.
Para este análisis se seleccionaron dos variables categóricas:
La variable sistema_riego identifica el sistema de riego
utilizado en cada lote.
La variable estado_cultivo identifica el estado en el
que se encuentra el cultivo.
Las categorías utilizadas en el análisis son:
La relación entre el sistema de riego y el estado del cultivo es de interés para la Ingeniería Agrícola porque permite analizar si la distribución de cultivos en condición de estrés cambia según el sistema de riego utilizado.
La pregunta que orienta este análisis es:
¿Existe una relación estadística entre el sistema de riego utilizado y el estado del cultivo?
list.files()
## [1] "Actividad_Final_Primer_50%.Rmd"
## [2] "calculo_manual_riego.jpeg"
## [3] "project.Rproj"
## [4] "riego_estres_hidrico_agricola (1).csv"
archivo <- "riego_estres_hidrico_agricola (1).csv"
if (!file.exists(archivo)) {
stop(
paste(
"No se encontró el archivo:",
archivo,
"\nVerifique que el CSV esté en la misma carpeta que el archivo RMarkdown."
)
)
}
riego <- read.csv(
archivo,
stringsAsFactors = FALSE,
check.names = FALSE
)
cat("Archivo cargado correctamente.\n")
## Archivo cargado correctamente.
cat("Número de filas:", nrow(riego), "\n")
## Número de filas: 180
cat("Número de columnas:", ncol(riego), "\n")
## Número de columnas: 10
names(riego)
## [1] "id_lote" "sector"
## [3] "sistema_riego" "textura_suelo"
## [5] "horas_riego_semana" "precipitacion_semana_mm"
## [7] "humedad_suelo_pct" "falla_bomba"
## [9] "estado_cultivo" "rendimiento_kg_ha"
unique(riego$sistema_riego)
## [1] "Aspersion" "Goteo" "Gravedad"
unique(riego$estado_cultivo)
## [1] "Estres" "Normal"
Para construir la tabla de contingencia se utilizan solamente los registros que tienen información disponible tanto para el sistema de riego como para el estado del cultivo.
datos <- riego[
!is.na(riego$sistema_riego) &
!is.na(riego$estado_cultivo),
]
cat(
"Registros utilizados en el análisis:",
nrow(datos),
"\n"
)
## Registros utilizados en el análisis: 180
La función table() permite contar las observaciones
correspondientes a cada combinación de sistema de riego y estado del
cultivo.
tabla <- table(
datos$sistema_riego,
datos$estado_cultivo
)
tabla
##
## Estres Normal
## Aspersion 21 35
## Goteo 6 70
## Gravedad 27 21
knitr::kable(
tabla,
caption = "Tabla 1. Sistema de riego y estado del cultivo"
)
| Estres | Normal | |
|---|---|---|
| Aspersion | 21 | 35 |
| Goteo | 6 | 70 |
| Gravedad | 27 | 21 |
La tabla permite observar cuántos registros presentan estrés y cuántos presentan un estado normal dentro de cada sistema de riego.
La función margin.table() permite obtener el total de
observaciones correspondiente a cada sistema de riego.
totales_riego <- margin.table(
tabla,
1
)
knitr::kable(
data.frame(
Sistema_Riego = names(totales_riego),
Total = as.numeric(totales_riego)
),
caption = "Tabla 2. Total de observaciones por sistema de riego"
)
| Sistema_Riego | Total |
|---|---|
| Aspersion | 56 |
| Goteo | 76 |
| Gravedad | 48 |
totales_estado <- margin.table(
tabla,
2
)
knitr::kable(
data.frame(
Estado_Cultivo = names(totales_estado),
Total = as.numeric(totales_estado)
),
caption = "Tabla 3. Total de observaciones por estado del cultivo"
)
| Estado_Cultivo | Total |
|---|---|
| Estres | 54 |
| Normal | 126 |
La función addmargins() permite agregar los totales de
las filas y columnas de la tabla de contingencia.
tabla_completa <- addmargins(tabla)
knitr::kable(
tabla_completa,
caption = "Tabla 4. Tabla de contingencia con totales marginales"
)
| Estres | Normal | Sum | |
|---|---|---|---|
| Aspersion | 21 | 35 | 56 |
| Goteo | 6 | 70 | 76 |
| Gravedad | 27 | 21 | 48 |
| Sum | 54 | 126 | 180 |
Para cumplir con la actividad, primero se realiza el cálculo manualmente.
La probabilidad que se analizará es:
\[ P(Estres|Goteo) \]
La fórmula de probabilidad condicional es:
\[ P(A|B)=\frac{P(A\cap B)}{P(B)} \]
De la tabla de contingencia:
Por lo tanto:
\[ P(Estres|Goteo) = \frac{6}{75} \]
Realizando la división:
\[ P(Estres|Goteo)=0.08 \]
Convertimos a porcentaje:
\[ 0.08\times100=8\% \]
Por lo tanto:
\[ \boxed{P(Estres|Goteo)=8\%} \]
El cálculo anterior debe realizarse primero a mano en el cuaderno.
El procedimiento que debe aparecer es:
\[ P(Estres|Goteo) = \frac{6}{75} \]
\[ P(Estres|Goteo) = 0.08 \]
\[ P(Estres|Goteo) = 8\% \]
La fotografía del procedimiento manual se encuentra en el archivo:
calculo_manual_riego.jpeg
La función prop.table() permite calcular las
probabilidades condicionales.
probabilidades_condicionales <- prop.table(
tabla,
margin = 1
)
knitr::kable(
probabilidades_condicionales,
digits = 4,
caption = "Tabla 5. Probabilidades condicionales del estado del cultivo según el sistema de riego"
)
| Estres | Normal | |
|---|---|---|
| Aspersion | 0.3750 | 0.6250 |
| Goteo | 0.0789 | 0.9211 |
| Gravedad | 0.5625 | 0.4375 |
Se obtiene específicamente la probabilidad de estrés dentro del grupo que utiliza riego por goteo.
p_estres_goteo <- prop.table(
tabla,
margin = 1
)["Goteo", "Estres"]
p_estres_goteo
## [1] 0.07894737
El resultado obtenido mediante R es:
\[ 0.08 \]
Para expresarlo como porcentaje:
p_estres_goteo * 100
## [1] 7.894737
El resultado es:
\[ 8\% \]
comparacion <- data.frame(
Metodo = c(
"Cálculo manual",
"R"
),
Probabilidad = c(
6 / 75,
p_estres_goteo
),
Porcentaje = c(
(6 / 75) * 100,
p_estres_goteo * 100
)
)
knitr::kable(
comparacion,
digits = 4,
caption = "Tabla 6. Comparación del cálculo manual con el cálculo realizado en R"
)
| Metodo | Probabilidad | Porcentaje |
|---|---|---|
| Cálculo manual | 0.0800 | 8.0000 |
| R | 0.0789 | 7.8947 |
La función prop.table() sin especificar un margen
permite obtener las probabilidades conjuntas de las combinaciones de las
variables.
probabilidades_conjuntas <- prop.table(tabla)
knitr::kable(
probabilidades_conjuntas,
digits = 4,
caption = "Tabla 7. Probabilidades conjuntas"
)
| Estres | Normal | |
|---|---|---|
| Aspersion | 0.1167 | 0.1944 |
| Goteo | 0.0333 | 0.3889 |
| Gravedad | 0.1500 | 0.1167 |
p_conjunta <- prop.table(tabla)[
"Goteo",
"Estres"
]
p_conjunta
## [1] 0.03333333
La probabilidad conjunta de Goteo y Estrés es:
\[ P(Goteo\cap Estres) = \frac{6}{179} \]
\[ P(Goteo\cap Estres) \approx0.0335 \]
En porcentaje:
\[ 3.35\% \]
Para evaluar estadísticamente la relación entre las variables se plantean las siguientes hipótesis:
H₀: El sistema de riego y el estado del cultivo son independientes.
H₁: El sistema de riego y el estado del cultivo no son independientes.
Se utiliza un nivel de significancia de:
\[ \alpha=0.05 \]
La función chisq.test() permite realizar la prueba de
independencia chi-cuadrado.
prueba_chi <- chisq.test(
tabla,
correct = FALSE
)
prueba_chi
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 34.934, df = 2, p-value = 2.595e-08
resultado_chi <- data.frame(
Chi_cuadrado = as.numeric(
prueba_chi$statistic
),
Grados_libertad = as.numeric(
prueba_chi$parameter
),
Valor_p = as.numeric(
prueba_chi$p.value
)
)
knitr::kable(
resultado_chi,
digits = 8,
caption = "Tabla 8. Resultado de la prueba de chi-cuadrado"
)
| Chi_cuadrado | Grados_libertad | Valor_p |
|---|---|---|
| 34.93421 | 2 | 3e-08 |
frecuencias_esperadas <- prueba_chi$expected
knitr::kable(
round(frecuencias_esperadas, 4),
caption = "Tabla 9. Frecuencias esperadas bajo la hipótesis de independencia"
)
| Estres | Normal | |
|---|---|---|
| Aspersion | 16.8 | 39.2 |
| Goteo | 22.8 | 53.2 |
| Gravedad | 14.4 | 33.6 |
La regla de decisión utilizada es:
alpha <- 0.05
if (prueba_chi$p.value < alpha) {
decision <- "Se rechaza H0"
} else {
decision <- "No se rechaza H0"
}
decision_final <- data.frame(
Nivel_significancia = alpha,
Valor_p = prueba_chi$p.value,
Decision = decision
)
knitr::kable(
decision_final,
digits = 8,
caption = "Tabla 10. Decisión de la prueba de independencia"
)
| Nivel_significancia | Valor_p | Decision |
|---|---|---|
| 0.05 | 3e-08 | Se rechaza H0 |
El valor p obtenido mediante la prueba de chi-cuadrado se compara con el nivel de significancia de 0.05.
De acuerdo con el resultado obtenido:
En este conjunto de datos, el resultado obtenido permite evaluar estadísticamente la relación entre el sistema de riego y el estado del cultivo.
comparacion_sistemas <- data.frame(
Sistema_Riego = rownames(
probabilidades_condicionales
),
Estres = probabilidades_condicionales[, "Estres"],
Normal = probabilidades_condicionales[, "Normal"]
)
knitr::kable(
comparacion_sistemas,
digits = 4,
caption = "Tabla 11. Distribución del estado del cultivo dentro de cada sistema de riego"
)
| Sistema_Riego | Estres | Normal | |
|---|---|---|---|
| Aspersion | Aspersion | 0.3750 | 0.6250 |
| Goteo | Goteo | 0.0789 | 0.9211 |
| Gravedad | Gravedad | 0.5625 | 0.4375 |
Desde el punto de vista de la Ingeniería Agrícola, este análisis permite comparar la distribución del estado del cultivo dentro de los diferentes sistemas de riego.
La información puede servir como punto de partida para revisar las condiciones de manejo del agua, la humedad del suelo, las horas de riego y otras variables agrícolas presentes en la base de datos.
Es importante señalar que una asociación estadística entre dos variables no demuestra por sí sola una relación causal. Para determinar las causas del estrés del cultivo sería necesario analizar otras variables y realizar estudios adicionales.
Se analizaron las variables categóricas sistema de riego y estado del cultivo.
La función table() permitió construir la tabla de
contingencia entre las dos variables.
Las funciones margin.table() y
addmargins() permitieron obtener y presentar los totales
marginales.
La probabilidad condicional calculada manualmente fue:
\[ P(Estres|Goteo) = \frac{6}{75} = 0.08 = 8\% \]
El resultado obtenido manualmente fue comprobado mediante
prop.table() en R.
La prueba chisq.test() permitió evaluar formalmente
la independencia entre el sistema de riego y el estado del
cultivo.
Los resultados permiten analizar si existe evidencia estadística de asociación entre las variables seleccionadas.
Desde la Ingeniería Agrícola, este análisis puede servir como punto de partida para estudiar el manejo del riego y su relación con el estado de los cultivos.
Se utilizó ChatGPT como herramienta de apoyo para organizar la estructura del documento RMarkdown, revisar la utilización de las funciones estadísticas y facilitar la presentación de las tablas.
“Ayúdame a realizar un análisis en RMarkdown utilizando una base de datos agrícola sobre sistemas de riego y estrés hídrico. Necesito seleccionar dos variables categóricas, construir una tabla de contingencia, calcular una probabilidad condicional manualmente y comprobarla en R utilizando table(), margin.table(), prop.table(), addmargins() y chisq.test(). También necesito interpretación estadística, aplicación a Ingeniería Agrícola, conclusiones y referencias.”
El cálculo de la probabilidad condicional fue realizado manualmente
antes de utilizar R. Posteriormente se comparó el resultado manual con
el resultado obtenido mediante prop.table().
Illowsky, B., & Dean, S. (2023). Introductory Statistics 2e. OpenStax.
National Institute of Standards and Technology. Engineering Statistics Handbook. U.S. Department of Commerce.
OpenStax. Introducción a la estadística.