UNIVERSIDAD CENTRAL DEL ECUADOR

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

FECHA: 24/01/2026

#Estadística inferencial

#PASO 1: DEFINIR LA VARIABLE DE INTERÉS

#La variable pH del suelo es una variable cuantitativa continua, ya que su dominio está formado por valores reales positivos, es decir:
#D={x|x ∈ R+}
#Esta variable puede tomar infinitos valores dentro de un intervalo, por ejemplo entre 6.0 y 6.1.

#PASO 2: TABLA DE DISTRIBUCIÓN DE FRECUENCIAS 

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

# Extracción Variable Cuantitativa Continua
Suelo_pH <- datos$Soil_pH

# Histograma

k <- 1 + (3.3 * log10(3000))
k <- floor(k)
min <- min(Suelo_pH)
max <- max(Suelo_pH)
R <- max - min
A <- R / k

histoP <- hist(
  Suelo_pH,
  main = "Gráfica Nº1: Distribución del pH del Suelo",
  xlab = "pH",
  ylab = "Cantidad",
  col = "blue"
)

# Tabla simplificada basada en el histograma
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites) - 1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histoP$mids
ni <- histoP$counts
sum(ni)
## [1] 3000
hi <- round(ni / sum(ni) * 100, 2)
sum(hi)
## [1] 100.01
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- round(cumsum(hi), 2)
Hi_dsc <- round(rev(cumsum(rev(hi))), 2)

TDF_Histo_Suelo_pH <- data.frame(LimInf, LimSup, Mc, ni, hi, Ni_asc, Ni_dsc, Hi_asc, Hi_dsc)

totalni <- sum(ni)
totalhi <- 100

TDF_Histo_Suelo_pH_completo <- rbind(
  TDF_Histo_Suelo_pH,
  data.frame(LimInf = "Total",
             LimSup = " ", Mc = " ", ni = totalni,
             hi = totalhi, Ni_asc = " ", Ni_dsc = " ",
             Hi_asc = " ", Hi_dsc = " ")
)

library(dplyr)
library(gt)

tabla_Histo <- TDF_Histo_Suelo_pH_completo %>%
  gt() %>%
  tab_header(
    title = md("Tabla Nº2"),
    subtitle = md("*Tabla simplificada de distribución del pH del Suelo*")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = LimInf == "Total"
    )
  )

tabla_Histo
Tabla Nº2
Tabla simplificada de distribución del pH del Suelo
LimInf LimSup Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
4.5 5 4.75 426 14.20 426 3000 14.2 100.01
5 5.5 5.25 368 12.27 794 2574 26.47 85.81
5.5 6 5.75 371 12.37 1165 2206 38.84 73.54
6 6.5 6.25 377 12.57 1542 1835 51.41 61.17
6.5 7 6.75 380 12.67 1922 1458 64.08 48.6
7 7.5 7.25 339 11.30 2261 1078 75.38 35.93
7.5 8 7.75 379 12.63 2640 739 88.01 24.63
8 8.5 8.25 360 12.00 3000 360 100.01 12
Total 3000 100.00
Autor: Grupo 3
#PASO 3: HISTOGRAMA

hist(
  Suelo_pH,
  breaks = seq(min, max, A),
  main = "Gráfica Nº2: Distribución del pH del Suelo",
  xlab = "pH",
  ylab = "Porcentaje",
  col = "#4A90E2"
)

#PARA FACILITAR EL TRABAJO SE REDUJO LA AMPLITUD DE LOS INTERVALOS DE 8 A 5 PARA APLICAR UN SOLO MODELO PARA LA VARIABLE PH DE SUELO

Suelo_pH <- na.omit(datos$Soil_pH)

n <- length(Suelo_pH)

k <- floor(1 + 3.3 * log10(n))      
minP <- min(Suelo_pH)
maxP <- max(Suelo_pH)
R <- maxP - minP
A <- R / k                           
A2 <- 3 * A

ini <- floor(minP / A2) * A2
fin <- ceiling(maxP / A2) * A2
breaks2 <- seq(ini, fin, by = A2)

histoP2 <- hist(Suelo_pH, breaks = breaks2, plot = FALSE)

#TABLA CON INTERVALOS REDUCIDOS

Limites <- histoP2$breaks
LimInf  <- Limites[1:(length(Limites) - 1)]
LimSup  <- Limites[2:length(Limites)]
Mc      <- histoP2$mids
ni      <- histoP2$counts

hi    <- round(ni / sum(ni) * 100, 2)
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- round(cumsum(hi), 2)
Hi_dsc <- round(rev(cumsum(rev(hi))), 2)

LimInf <- round(LimInf, 2)
LimSup <- round(LimSup, 2)
Mc     <- round(Mc, 2)

TDF_Histo_Suelo_pH2 <- data.frame(LimInf, LimSup, Mc, ni, hi, Ni_asc, Ni_dsc, Hi_asc, Hi_dsc)

TDF_Histo_Suelo_pH2_completo <- rbind(
  TDF_Histo_Suelo_pH2,
  data.frame(LimInf="Total", LimSup=" ", Mc=" ",
             ni=sum(ni), hi=100,
             Ni_asc=" ", Ni_dsc=" ",
             Hi_asc=" ", Hi_dsc=" ")
)

tabla_Histo2 <- TDF_Histo_Suelo_pH2_completo %>%
  gt() %>%
  tab_header(
    title = md("Tabla NºX"),
    subtitle = md("*Tabla simplificada del pH del Suelo (intervalos amplios)*")
  ) %>%
  tab_source_note(source_note = md("Autor: Grupo 3")) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.bottom.style = "solid",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = LimInf == "Total")
  )
tabla_Histo2
Tabla NºX
Tabla simplificada del pH del Suelo (intervalos amplios)
LimInf LimSup Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
4 5 4.5 426 14.20 426 3000 14.2 99.99
5 6 5.5 739 24.63 1165 2574 38.83 85.79
6 7 6.5 757 25.23 1922 1835 64.06 61.16
7 8 7.5 718 23.93 2640 1078 87.99 35.93
8 9 8.5 360 12.00 3000 360 99.99 12
Total 3000 100.00
Autor: Grupo 3
histoP2 <- hist(
  Suelo_pH,
  breaks = breaks2,
  plot = FALSE
)

hi <- round(histoP2$counts / sum(histoP2$counts) * 100, 2)

plot(
  NA,
  xlim = range(histoP2$breaks),
  ylim = c(0, max(hi) * 1.10),
  main = "Gráfica N°3: Distribución del pH del Suelo",
  xlab = "pH",
  ylab = "Porcentaje"
)

rect(
  xleft   = histoP2$breaks[-length(histoP2$breaks)],
  ybottom = 0,
  xright  = histoP2$breaks[-1],
  ytop    = hi,
  col     = "#4A90E2",
)


text(
  x = histoP2$mids,
  y = hi,
  labels = paste0(hi, "%"),
  pos = 3,
  cex = 0.8
)

histoP2 <- hist(Suelo_pH, breaks = breaks2, plot = FALSE)
hi <- round(histoP2$counts / sum(histoP2$counts) * 100, 2)

#PASO 4: CONJETURA DE MODELO

#DESPUES DE REDUCIR LOS INTERVALOS MI VARIABLE Y SUS BARRAS SE COMPORTAN COMO UN MODELO DE DISTRIBUCIÓN NORMAL


#PASO 5: CÁLCULO DE PARAMETROS

mu    <- mean(Suelo_pH, na.rm = TRUE)
sigma <- sd(Suelo_pH, na.rm = TRUE)

plot(
  NA,
  xlim = range(histoP2$breaks),
  ylim = c(0, max(hi) * 1.15),
  main = "Modelo normal del pH del Suelo (hi %)",
  xlab = "pH",
  ylab = "hi (%)"
)

rect(
  xleft   = histoP2$breaks[-length(histoP2$breaks)],
  ybottom = 0,
  xright  = histoP2$breaks[-1],
  ytop    = hi,
  col     = "grey",
  border  = "white"
)

x <- seq(min(histoP2$breaks), max(histoP2$breaks), by = 0.001)
y <- dnorm(x, mean = mu, sd = sigma) * 100 * A2

plot(
  NA,
  xlim = range(histoP2$breaks),
  ylim = c(0, max(c(hi, y)) * 1.10), 
  main = "Gráfica N°4:Diagrama de Realidad en comparación con el modelo normal del ph en el suelo",
  xlab = "pH",
  ylab = "Densidad de probabilidad"
)

rect(
  xleft   = histoP2$breaks[-length(histoP2$breaks)],
  ybottom = 0,
  xright  = histoP2$breaks[-1],
  ytop    = hi,
  col     = "grey",
  border  = "white"
)

lines(x, y, lwd = 4, col = "blue3")

#PASO 6: APLICACIÓN DE TESTS

#PASO 6.1: #TEST DE PEARSON
# Frecuencia simple observada
Fo <- histoP2$counts
Fo
## [1] 426 739 757 718 360
# Número de intervalos
h <- length(Fo)

# Probabilidades teóricas por intervalo
P <- c(0)
for (i in 1:h) {
  P[i] <- (pnorm(histoP2$breaks[i + 1], mu, sigma) -
             pnorm(histoP2$breaks[i],     mu, sigma))
}

# Frecuencia esperada
Fe <- P * length(Suelo_pH)

# Correlación de Pearson (%)
Correlación <- cor(Fo, Fe) * 100
Correlación
## [1] 94.74349
#PASO 6.2 TEST CHI CUADRADO

grados_libertad <- length(histoP2)-1
grados_libertad
## [1] 5
nivel_significancia <- 0.05

n  <- length(Suelo_pH)
Fo <- (histoP2$counts / n) * 100
Fo
## [1] 14.20000 24.63333 25.23333 23.93333 12.00000
Fe <- P * 100
Fe
## [1]  8.740961 24.072092 33.171095 22.894781  7.905644
x2 <- sum((Fe - Fo)^2 / Fe)
x2
## [1] 7.489525
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
umbral_aceptacion
## [1] 11.0705
x2 < umbral_aceptacion
## [1] TRUE
#PASO 7: CÁLCULO DE PROBABILIDADES

#¿Qué porcentaje de nuevas muestras de suelo tendrá pH entre 6.0 y 7.0?”

prob1 <- pnorm(7.0, mu, sigma) - pnorm(6.0, mu, sigma)
prob1 * 100
## [1] 33.1711
#¿Qué porcentaje de nuevas muestras tendrá pH mayor a 7.5?”

prob2 <- 1 - pnorm(7.5, mu, sigma)
prob2 * 100
## [1] 18.71379
#Si se toman 50 muestras, ¿Cuántas se espera que tengan pH entre 5.5 y 6.5?”

n_muestra <- 50
prob3 <- pnorm(6.5, mu, sigma) - pnorm(5.5, mu, sigma)

esperadas <- prob3 * n_muestra
esperadas
## [1] 15.40444
#PASO 8: INTERVALO DE CONFIANZA

ph <- datos$Soil_pH
media <-mean(ph)
sigma<-sd(ph)
n<-length(ph)
error<- 2*(sigma/sqrt(n))
#Límites intevalo de cofianza
lim_infer<- round(media-2*error,2)
lim_super<- round(media+2*error,2)
tabla_intervalo <- data.frame(Intervalo = "P [6.38< µ < 6.55] = 95%")
library(gt)
library(dplyr)
tabla_intervalo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 2.1*"),
    subtitle = md("**Intervlo de confianza del ph del suelo en el estudio de la contaminación del suelo y su impacto en la salud **")
  ) %>%
  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. 2.1
**Intervlo de confianza del ph del suelo en el estudio de la contaminación del suelo y su impacto en la salud **
Intervalo
P [6.38< µ < 6.55] = 95%
Autor: GRUPO 3
#PASO 9:CONCLUSIÓN

#La variable nivel de ph en el suelo se explica con un modelo normal, con parametro 
#µ= 6.46 y σ= 1.16 y podemos afirmar con un 95% de confianza que la media aritmetica se
#encuentra  entre 6.38 y 6.55 con una desviación estandar de 1.16.