UNIVERSIDAD CENTRAL DEL ECUADOR

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

FECHA: 10/1/2025

# ESTADÍSTICA INFERENCIAL

#10/1/2026

#Cargar los Datos

datos<-read.csv("soil_pollution_diseases.csv",header = TRUE,dec = ".",
                sep = ",")

#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