0. Librerías

# -------------------------
# Cargar librerías
# -------------------------
library(gt)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

1.Leer datos

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

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

2. Selección de variable aleatoria

# ================================
# VARIABLE CUANTITATIVA CONTINUA
# ================================

CYP <- na.omit(datos$composition_yard_garden_green_waste_percent)

3. Tabla de disitribución de frecuencias

# ===================================
# TABLA NB:2 ESTADÍSTICA DESCRIPTIVA
# ===================================

histoP <- hist(
  CYP,
  breaks = 10,
  plot = FALSE
)

# Extraer límites continuos directos del histograma
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites) - 1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histoP$mids
ni <- histoP$counts
hi <- round((ni / sum(ni)) * 100, 2)

# Crear el DataFrame base continuo
TDF_Histo_CYP <- data.frame(
  LimInf,
  LimSup,
  Mc,
  ni,
  hi
)

# Recalcular frecuencias acumuladas
TDF_Histo_CYP$Ni_asc <- cumsum(TDF_Histo_CYP$ni)
TDF_Histo_CYP$Ni_dsc <- rev(cumsum(rev(TDF_Histo_CYP$ni)))
TDF_Histo_CYP$Hi_asc <- round(cumsum(TDF_Histo_CYP$hi), 2)
TDF_Histo_CYP$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_CYP$hi))), 2)

# Crear fila de totales
TDF_Histo_CYP_Completo <- rbind(
  TDF_Histo_CYP,
  data.frame(
    LimInf = "Total",
    LimSup = " ",
    Mc = " ",
    ni = sum(TDF_Histo_CYP$ni),
    hi = 100,
    Ni_asc = " ",
    Ni_dsc = " ",
    Hi_asc = " ",
    Hi_dsc = " "
  )
)

# Generar Tabla Simplificada con 'gt'
tabla_Histo_CYP <- TDF_Histo_CYP_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias simplificada del porcentaje de residuos 
                  verdes en el estudio de la calidad de agua en Europa (1991-2017)**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    column_labels.border.bottom.color = "black",
    row.striping.include_table_body = TRUE
  )

tabla_Histo_CYP
Tabla Nº1
Distribución de frecuencias simplificada del porcentaje de residuos verdes en el estudio de la calidad de agua en Europa (1991-2017)
LimInf LimSup Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
0 5 2.5 18838 94.70 18838 19893 94.7 100
5 10 7.5 324 1.63 19162 1055 96.33 5.3
10 15 12.5 156 0.78 19318 731 97.11 3.67
15 20 17.5 493 2.48 19811 575 99.59 2.89
20 25 22.5 0 0.00 19811 82 99.59 0.41
25 30 27.5 0 0.00 19811 82 99.59 0.41
30 35 32.5 82 0.41 19893 82 100 0.41
Total 19893 100.00
Autor: Grupo 3

4. Gráfica de distribución de frecuencias

# ===========================================
# GRÁFICA Nº4: Distribución porcentual (hi)
# ===========================================

# 1. Definir los límites exactos de tu tabla
cortes <- c(0, 5, 10, 15, 20, 25, 30, 35)

# 2. Crear la estructura del histograma sin dibujarlo para obtener los datos
histo_objetivo <- hist(CYP, breaks = cortes, plot = FALSE)

barplot(
  histo_objetivo$counts / sum(histo_objetivo$counts) * 100,
  space = 0,
  col = "lightblue",
  main = "Gráfica Nº1: Distribución porcentual de porcentajes de residuos 
  verdes en el estudio de la caldad de gua en Europa (1991-2017)",
  xlab = "Porcentaje de residuos verdes (%)",
  ylab = "Porcentaje (%)",
  xaxt = "n", 
  las = 1
)

# 4. Personalizar el eje X para que muestre los límites (5, 10, 15...)
axis(1, at = 0:7, labels = cortes)

# 5. Línea base
abline(h = 0)

5. Conjetura

Se conjetura que el porcentaje de residuos verdes sigue un modelo de probabilidad exponencial, dada la alta concentración de datos en el intervalo inicial. Para optimizar el ajuste del modelo y garantizar una mayor precisión representativa, se ha decidido acotar el análisis al intervalo de 0% a 15%, ya que es en este rango donde la tendencia de decaimiento del fenómeno es más clara y consistente con la naturaleza de la distribución exponencial.

6. Cálculo de parámetros

# ================================================
# CÁLCULO DE PARÁMETROS DISTRIBUCIÓN EXPONENCIAL
# ================================================

# Media de la variable original (CYP)
media <- mean(CYP)
print(paste("Media:", round(media, 4)))
## [1] "Media: 1.3025"
# Parámetro Lambda (Tasa de fallos / decaimiento)
lambda <- 1 / media
print(paste("Lambda:", round(lambda, 4)))
## [1] "Lambda: 0.7678"

7. Sobreposición de la realidad con el modelo

CYP_filtrado <- CYP[CYP <= 15]

hist(
  CYP_filtrado, 
  breaks = seq(0, 15, by = 5), 
  probability = TRUE,
  col = "lightblue",
  border = "black",
  xlim = c(0, 15),
  main = "Gráfica Nº2: Comparación de la Realidad y el Modelo Exponencial 
  del porcentaje de residuos verdes en el estudio de la calidad de
  agua en Europa (1991-2017)",
  xlab = "Residuos verdes (%)",
  ylab = "Densidad de probabilidad",
  las = 1
)

curve(
  dexp(x, rate = lambda),
  from = 0,
  to = 15,
  add = TRUE,
  col = "red",
  lwd = 3
)

8. Test de bondad

8.1 Test de pearson

# ==========================================
# TEST DE BONDAD (Ajustado a los 3 intervalos)
# ==========================================

# Definimos el dataframe con los datos reales de tu tabla
TDF_Acotada <- data.frame(
  LimInf = c(0, 5, 10),
  LimSup = c(5, 10, 15),
  ni     = c(18838, 324, 156)
)

fo <- TDF_Acotada$ni
n  <- sum(fo)

# Estimación de lambda basada en los datos observados en estos intervalos
# Para una distribución exponencial, lambda = 1 / media
# Usamos el punto medio (Mc) ponderado por las frecuencias
Mc <- c(2.5, 7.5, 12.5)
lambda <- 1 / sum(Mc * (fo / n))

# Cálculo de frecuencias esperadas (fe)
fe <- numeric(length(fo))
for(i in 1:length(fo)){
  fe[i] <- n * (pexp(TDF_Acotada$LimSup[i], rate = lambda) - 
                pexp(TDF_Acotada$LimInf[i], rate = lambda))
}

# ===========================
# CORRELACIÓN DE PEARSON
# ===========================
# Correlación lineal entre observados y esperados
Correlacion <- cor(fo, fe) * 100
print(paste("Correlación de Pearson:", round(Correlacion, 2), "%"))
## [1] "Correlación de Pearson: 99.34 %"

8.2 Test Chi-cuadrado

# ==========================================
# TEST DE CHI-CUADRADO (Formato final)
# ==========================================

# 1. Cálculo de frecuencias relativas (proporciones)
fe_frac <- fe / n
fo_frac <- fo / n

# 2. Cálculo del estadístico X2 
# Nota: La suma de (fo_frac - fe_frac)^2 / fe_frac es el método solicitado
x2 <- sum((fo_frac - fe_frac)^2 / fe_frac)

# 3. Grados de libertad
gl <- length(fo_frac) - 2 

# 4. Obtención del valor crítico (Estándar para gl=1 y alpha=0.05)
umbral_aceptacion <- qchisq(0.95, df = gl)

# 5. Evaluación del modelo
acepta_modelo <- x2 < umbral_aceptacion

# Impresión de resultados detallada
print(paste("Estadístico X2 calculado:", round(x2, 6)))
## [1] "Estadístico X2 calculado: 0.124734"
print(paste("Grados de libertad (gl):", gl))
## [1] "Grados de libertad (gl): 1"
print(paste("Valor crítico (Umbral):", round(umbral_aceptacion, 4)))
## [1] "Valor crítico (Umbral): 3.8415"
print(paste("¿El modelo exponencial es aceptado?:", acepta_modelo))
## [1] "¿El modelo exponencial es aceptado?: TRUE"

9. Cálculo de Probabilidades

  1. ¿Cuál es la probabilidad de que el porcentaje de residuos verdes en un cuerpo de agua en Europa se encuentre entre el 5% y el 10%?
# Probabilidad de estar entre 5% y 10%
prob_rango <- pexp(10, rate = lambda) - pexp(5, rate = lambda)
print(paste("La probabilidad es:", round(prob_rango * 100, 2), "%"))
## [1] "La probabilidad es: 12.97 %"
  1. Si se analizan 250 muestras de cuerpos de agua, ¿cuántas se espera estadísticamente que tengan una composición de residuos verdes superior al 5%?
# Definimos el tamaño de la muestra
n_muestra <- 250

# Calculamos la probabilidad de ser mayor al 5% (1 - P(X <= 5))
prob_mayor_5 <- 1 - pexp(5, rate = lambda)

# Calculamos la cantidad esperada
esperadas <- prob_mayor_5 * n_muestra

print(paste("Se espera que", round(esperadas, 0), "muestras tengan más del 5% de residuos."))
## [1] "Se espera que 38 muestras tengan más del 5% de residuos."
# =============================
# GRÁFICA DE PROBABILIDADES 
# =============================

# 1. Definir rango y curva base
x <- seq(0, 15, length.out = 1000)
y <- dexp(x, rate = lambda)

# 2. Inicializar el gráfico
plot(x, y, type="l", col="orange", lwd=3, xlim=c(0, 15), ylim=c(0, max(y)*1.1),
     main="Gráfica N°3: Cálculo de Probabilidad",
     ylab="Densidad de probabilidad", xlab="Residuos verdes (%)", xaxt="n")

# 3. Sombreado 1: Área > 5% (Muestreo) - Primero el área grande
x_cant <- seq(5, 15, length.out = 100)
y_cant <- dexp(x_cant, rate = lambda)
polygon(c(x_cant, rev(x_cant)), c(y_cant, rep(0, length(y_cant))),
        col=rgb(0.9, 0.2, 0.2, 0.3), border="red4")

# 4. Sombreado 2: Área 5% a 10% (Probabilidad) - Segundo el área pequeña (encima)
x_prob <- seq(5, 10, length.out = 100)
y_prob <- dexp(x_prob, rate = lambda)
polygon(c(x_prob, rev(x_prob)), c(y_prob, rep(0, length(y_prob))),
        col=rgb(0.2, 0.6, 0.8, 0.5), border="steelblue4")

# 5. Elementos visuales (Ejes, líneas y leyenda)
abline(v = 5, col = "black", lty = 2, lwd = 2) # Línea del 5%
abline(v = 10, col = "steelblue4", lty = 3, lwd = 2) # Línea del 10%
axis(1, at=seq(0, 15, by=2)) # Marcas del eje X

legend("topright", 
       legend=c("Modelo Exponencial", "Prob. (5% a 10%)", "Área > 5% (Muestras)"), 
       col=c("orange", "steelblue4", "red4"), 
       fill=c(NA, rgb(0.2, 0.6, 0.8, 0.5), rgb(0.9, 0.2, 0.2, 0.3)), 
       border=c(NA, "steelblue4", "red4"),
       lty=c(1, NA, NA), lwd=c(3, NA, NA),
       bg="white", box.col="grey40")

10. Intervalo de Confianza

# ==============================
# #INTERVALO DE CONFIANZA
# ==============================
library(gt)
library(dplyr)

# Parámetros de tu variable real (Residuos Verdes - CYP)
media <- mean(CYP)
sigma <- sd(CYP)
n     <- length(CYP)

# Cálculo del error estándar 

error <- 2 * (sigma / sqrt(n))

# Límites del intervalo de confianza
limite_inferior <- round(media - error, 2)
limite_superior <- round(media + error, 2)

# Crear el texto del intervalo 
texto_intervalo <- paste0("P [", limite_inferior, " < \u00b5 < ", limite_superior, "] = 95%")

# Construcción de la tabla formal con gt
tabla_intervalo <- data.frame(Intervalo = texto_intervalo)

tabla_intervalo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 2*"), 
    subtitle = md("**Intervalo de confianza del porcentaje de residuos verdes 
                  en el estudio de la calidad de agau en Europa (1991-2017)**")
  ) %>%
  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
Intervalo de confianza del porcentaje de residuos verdes en el estudio de la calidad de agau en Europa (1991-2017)
Intervalo
P [1.25 < µ < 1.35] = 95%
Autor: Grupo 3

11. Conclusión

La variable de porcentaje de residuos verdes (%) se explica con un modelo exponencial con parámetro λ = 0.7678, y podemos afirmar con un 95% de confianza que la media aritmética poblacional de esta variable se encuentra entre 1.25% y 1.35%, con una desviaciòn estandar de 3.66%.