UNIVERSIDAD CENTRAL DEL ECUADOR

ESTUDIO ESTADÍSTICO DE LA CONTAMINACIÓN DEL SUELO Y SU IMPACTO EN LA SALUD

FECHA: 19/11/2025

# =========================
# ESTADÍSTICA Inferencial
# Fecha: 10/01/2026
# =========================

# -------------------------
# Cargar datos
# -------------------------

setwd("C:/Users/Alexander/Downloads")

datos <- read.csv("soil_pollution_diseases.csv",
                  sep = ",",
                  stringsAsFactors = FALSE)


#Tipo_Contaminante

Tipo_Contaminante<-datos$Pollutant_Type

# Tabla de distribución de frecuencia

TDF_Tipo_Contaminante<-data.frame(table(Tipo_Contaminante))

ni <- TDF_Tipo_Contaminante$Freq
hi <- round((ni / sum(ni)) * 100, 2)
Tipo_Contaminante <- TDF_Tipo_Contaminante$Tipo_Contaminante
TDF_Tipo_Contaminante <- data.frame(Tipo_Contaminante, ni, hi)
Summary <- data.frame(Tipo_Contaminante = "TOTAL", ni = sum(ni),hi = 100)

TDF_Tipo_Contaminante_Suma<-rbind(TDF_Tipo_Contaminante, Summary)
colnames(TDF_Tipo_Contaminante) <- c("Tipo_Contaminante", "ni", "hi(%)")


# Limpiar espacios en blanco 

TDF_Tipo_Contaminante_Suma$Tipo_Contaminante <- trimws(TDF_Tipo_Contaminante_Suma$Tipo_Contaminante)

#Ordenar la tabla en el orden deseado

#El orden determinado es segun la peligrosidad del contaminante

niveles_ordenados <- c("Mercury", "Arsenic", "Lead",
                       "Cadmium", "Chromium",
                       "Pesticides", "TOTAL")

TDF_Tipo_Contaminante_Suma$Tipo_Contaminante <- factor(
  TDF_Tipo_Contaminante_Suma$Tipo_Contaminante,
  levels = niveles_ordenados
)


TDF_Tipo_Contaminante_Suma <- TDF_Tipo_Contaminante_Suma[
  order(TDF_Tipo_Contaminante_Suma$Tipo_Contaminante),
]


# TABLA 
library(dplyr)
library(gt)

TDF_Tipo_Contaminante_Suma %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nro. 3"),
    subtitle = md("*Distribución de frecuencias de los Tipos de contaminantes según su peligrosidad*")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )
Tabla Nro. 3
Distribución de frecuencias de los Tipos de contaminantes según su peligrosidad
Tipo_Contaminante ni hi
Mercury 458 15.27
Arsenic 489 16.30
Lead 529 17.63
Cadmium 516 17.20
Chromium 509 16.97
Pesticides 499 16.63
TOTAL 3000 100.00
Autor: Grupo 3
#Gráfica

barplot(hi, main = "Gráfica N°6: Distribución de frecuencias porcentual
        de los Tipos de contaminantes según su peligrosidad",
        xlab = "Tipo de Contaminante",
        ylab = "Porcentaje",
        col = "green",
        ylim = c(0,20),
        las = 2,
        cex.names = 0.6,
        names.arg = TDF_Tipo_Contaminante$Tipo_Contaminante)

Tipo_Contaminante <- trimws(datos$Pollutant_Type)

#Orden 
niveles_ordenados <- c("Mercury", "Arsenic", "Lead",
                       "Cadmium", "Chromium", "Pesticides")

#Se realiza la asignacion númerica

Tipo_Contaminante_num <- as.integer(factor(Tipo_Contaminante, levels = niveles_ordenados))

# Tabla de frecuencias
TDF_Tipo_Contaminante <- data.frame(table(Tipo_Contaminante_num))

ni <- TDF_Tipo_Contaminante$Freq
hi <- round((ni / sum(ni)) * 100, 2)

Tipo_Contaminante <- TDF_Tipo_Contaminante$Tipo_Contaminante_num
TDF_Tipo_Contaminante <- data.frame(Tipo_Contaminante, ni, hi)

Summary <- data.frame(Tipo_Contaminante = "TOTAL", ni = sum(ni), hi = 100)
TDF_Tipo_Contaminante_Suma <- rbind(TDF_Tipo_Contaminante, Summary)

colnames(TDF_Tipo_Contaminante_Suma) <- c("Tipo_Contaminante", "ni", "hi")

# Ordenar
TDF_Tipo_Contaminante_Suma$Tipo_Contaminante <- as.character(TDF_Tipo_Contaminante_Suma$Tipo_Contaminante)
TDF_Tipo_Contaminante_Suma <- rbind(
  TDF_Tipo_Contaminante_Suma[TDF_Tipo_Contaminante_Suma$Tipo_Contaminante != "TOTAL", ],
  TDF_Tipo_Contaminante_Suma[TDF_Tipo_Contaminante_Suma$Tipo_Contaminante == "TOTAL", ]
)

TDF_Tipo_Contaminante_Suma %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nro. 4"),
    subtitle = md("*Distribución de frecuencias de los 
                  Tipos de contaminantes según su peligrosidad*")
  ) %>%
  tab_source_note(source_note = md("Autor: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )
Tabla Nro. 4
Distribución de frecuencias de los Tipos de contaminantes según su peligrosidad
Tipo_Contaminante ni hi
1 458 15.27
2 489 16.30
3 529 17.63
4 516 17.20
5 509 16.97
6 499 16.63
TOTAL 3000 100.00
Autor: Grupo 3
TDF_Tipo_Contaminante_Suma <- TDF_Tipo_Contaminante_Suma[
  order(as.numeric(TDF_Tipo_Contaminante_Suma$Tipo_Contaminante)),
]

barplot(
  TDF_Tipo_Contaminante_Suma$hi[1:6],
  names.arg = TDF_Tipo_Contaminante_Suma$Tipo_Contaminante[1:6],
  main = "Gráfica N°7: Distribución de frecuencias porcentual de los Tipos de contaminantes según su peligrosidad",
  xlab = "Tipo de Contaminante",
  ylab = "Porcentaje (%)",
  col = "green",
  ylim = c(0, 20),
  las = 1
)

#Modelo Uniforme

#Asumiendo que todas las categorías de la variable tienen la misma probabilidad de ocurrencia,
#lo que permite comparar esta suposición con la distribución observada de los datos.

#Probabilidades observadas
Fo <- TDF_Tipo_Contaminante_Suma$hi[1:6] / 100
names(Fo) <- TDF_Tipo_Contaminante_Suma$Tipo_Contaminante[1:6]  # 1,2,3,4,5,6

#Misma probabilidad para cada categoria

k <- length(Fo)
Fe <- rep(1/k, k)
names(Fe) <- names(Fo)

#Matriz para comparar en gráfica 
grafica_matrix <- rbind(
  Observado = Fo,
  Uniforme  = Fe
)

grafica_matrix
##                   1         2         3         4         5         6
## Observado 0.1527000 0.1630000 0.1763000 0.1720000 0.1697000 0.1663000
## Uniforme  0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
barplot(
  grafica_matrix * 100,
  beside = TRUE,
  main = "Gráfica N°8: Distribución observada vs modelo Uniforme",
  xlab = "Tipo de Contaminante",
  ylab = "Porcentaje",
  ylim = c(0, 20),
  las = 1,
  cex.names = 0.9,
  col = c("purple", "green")
)

legend(
  "topright",
  legend = rownames(grafica_matrix),
  fill = c("purple", "green"),
  bty = "n"
)

#TESTS
#Test de Pearson
#Mide el grado de correlación entre la frecuencia observada y la frecuencia esperada
#El coeficiente de correlación de Pearson no pudo ser calculado debido a que el modelo Bernoulli 
#asigna probabilidades constantes a las categorías, lo que produce desviación estándar nula en las 
#frecuencias esperadas. Por esta razón, el análisis de ajuste se realizó mediante el test de Chi-cuadrado.



#Test Chi-cuadrado
#En el estudio de enfermedad agrupado, el test de Chi-cuadrado se utiliza considerando los grados 
#de libertad k-1 y un nivel de significancia previamente fijado. El valor de Chi-cuadrado 
#calculado a partir de las frecuencias observadas y esperadas se compara con el valor crítico
#correspondiente.


Fo <- TDF_Tipo_Contaminante_Suma$hi[1:6] / 100
Fo
## [1] 0.1527 0.1630 0.1763 0.1720 0.1697 0.1663
sum(Fo)  
## [1] 1
Fe <- rep(1/6, 6)
Fe
## [1] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
sum(Fe)  
## [1] 1
x2 <- sum(((Fo - Fe)^2) / Fe)
x2
## [1] 0.00203456
vc <- qchisq(0.95, df = 5)
vc
## [1] 11.0705
# Decisión
x2 < vc
## [1] TRUE
##============##
## CONCLUSION ##
##============##
## La variable Tipo de Contaminante se ajusta satisfactoriamente a un modelo uniforme, asumiendo que cada categoría tiene igual probabilidad de ocurrencia (p = 1/6). El test de chi-cuadrado mostró que no hay diferencias significativas entre las frecuencias observadas y las esperadas (χ² = 0.00203456 < χ² crítico = 11.07), lo que confirma que el modelo representa adecuadamente la distribución de los contaminantes en el estudio. Por lo tanto, se puede usar el modelo uniforme para generar predicciones probabilísticas de la presencia de cada tipo de contaminante.