UNIVERSIDAD CENTRAL DEL ECUADOR, FIGEMPA, INGENIERÍA AMBIENTAL

#ESTADISTICA INFERENCIAL
#Lorien Arcentales
#07/01/2026
#Carga de paquetes
library(gt)
library(dplyr)
# 1.Carga de datos 
datos<-read.csv("city_day.csv", header = TRUE, dec = ".",
                sep = ",")
#Extraer variable y justificación
options(scipen = 999)
habitantes<-datos$Número.de.habitantes
#Justificación: El número de habitantes es una variable cuantitativa discreta porque representa un conteo de individuos y solo admite valores enteros no negativos, sin posibilidad de fraccionamiento; es decir, no puede existir un valor como 3.5 habitantes.

# 2.TDF_habitantes
# Definir los cortes (intervalos), ajusta según tus datos
#Los intervalos fueron definidos mediante cuantiles, dividiendo el conjunto 
#de datos en cinco clases con igual proporción de observaciones.
cortes <- quantile(habitantes, probs = seq(0, 1, length.out = 6))
etiquetas <- paste0(
  "[",
  format(cortes[-length(cortes)], big.mark = ",", scientific = FALSE),
  " – ",
  format(cortes[-1], big.mark = ",", scientific = FALSE),
  ")"
)
habitantes_cut <- cut(
  habitantes,
  breaks = cortes,
  labels = etiquetas,
  include.lowest = TRUE,  # incluye el primer límite inferior
  right = FALSE           # EXCLUYE el límite superior
)


TDF_habitantes<- data.frame(table(habitantes_cut))
ni <- TDF_habitantes$Freq
sum(ni)
## [1] 29531
hi <- (ni/sum(ni))
sum(hi)
## [1] 1
TDF_habitantes <- data.frame(
  as.character(levels(habitantes_cut)),
  ni,
  "hi(%)" = round(hi * 100, 2)
  
)
colnames(TDF_habitantes) <- c("Intervalos de número de habitantes","ni","hi(%)")
                          
totales <- data.frame( TDF_habitantes=" TOTAL ",
                       ni= sum(ni),
                       hi= sum(hi*100)
                       )
colnames(totales) <- c("Intervalos de número de habitantes","ni","hi(%)")
TDF_numerohabitantes<- rbind(TDF_habitantes,totales)




#Creación tabla
library(gt)
library(dplyr)
TDF_numerohabitantes %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 1*"),
    subtitle = md("**Distribucion de frecuencia del número de habitantes por ciudad, estudio calidad del aire en India entre 2015-2020 **")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2\n Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  ) %>%
  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. 1
**Distribucion de frecuencia del número de habitantes por ciudad, estudio calidad del aire en India entre 2015-2020 **
Intervalos de número de habitantes ni hi(%)
[ 8,000 – 870,000) 4406 14.92
[ 870,000 – 2,690,000) 5330 18.05
[ 2,690,000 – 9,060,000) 6930 23.47
[ 9,060,000 – 14,400,000) 6024 20.40
[14,400,000 – 33,800,000) 6841 23.17
TOTAL 29531 100.00
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
# 3. GDF porcentual global
par(mar = c(5, 7, 4, 2))
barplot(TDF_habitantes$`hi(%)`,
        main="Gráfica N°1:Distribución de habitantes por intervalos
        en las ciudades del estudio,calidad del aire en India entre 2015-2020", 
        xlab = "Número de habitantes",
        ylab = "Porcentaje (%)",
        col = "blue",
        ylim = c(0,100),
        names.arg=TDF_habitantes$`Intervalos de número de habitantes`,
        las=2,
        cex.names=0.4,
        cex.axis = 0.9,
        cex.main = 0.9,
        mgp = c(5, 1, 0))

# 3.1 Mapeo
# Definir los cortes (intervalos), igual en cuantiles
cortes <- quantile(habitantes, probs = seq(0, 1, length.out = 6))
etiquetas <- paste0(
  "[",
  format(cortes[-length(cortes)], big.mark = ",", scientific = FALSE),
  " – ",
  format(cortes[-1], big.mark = ",", scientific = FALSE),
  ")"
)
habitantes_cut <- cut(
  habitantes,
  breaks = cortes,
  labels = etiquetas,
  include.lowest = TRUE,  # incluye el primer límite inferior
  right = FALSE           # EXCLUYE el límite superior
)


TDF_habitantes<- data.frame(table(habitantes_cut))
ni <- TDF_habitantes$Freq
sum(ni)
## [1] 29531
hi <- (ni/sum(ni))
sum(hi)
## [1] 1
TDF_habitantes <- data.frame(
  `Mapeo variable` = seq_len(nrow(TDF_habitantes)),
  ni = ni,
  `hi(%)` = round(hi * 100, 2)
)

colnames(TDF_habitantes) <- c("Mapeo variable","ni","hi(%)")

totales <- data.frame(
  `Mapeo variable` = "TOTAL",
  ni = sum(ni),
  `hi(%)` = 100
)

colnames(totales) <- c("Mapeo variable","ni","hi(%)")
TDF_numerohabitantes<- rbind(TDF_habitantes,totales)

#Creación tabla
library(gt)
library(dplyr)
TDF_numerohabitantes %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 2*"),
    subtitle = md("**Distribucion de frecuencia del número de habitantes por ciudad con mapeo, estudio calidad del aire en India entre 2015-2020 **")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2\n Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  ) %>%
  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
**Distribucion de frecuencia del número de habitantes por ciudad con mapeo, estudio calidad del aire en India entre 2015-2020 **
Mapeo variable ni hi(%)
1 4406 14.92
2 5330 18.05
3 6930 23.47
4 6024 20.40
5 6841 23.17
TOTAL 29531 100.00
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india
#Gráfica
par(mar = c(7, 7, 4, 2))
barplot(TDF_habitantes$`hi(%)`,
        main="Gráfica N°2:Distribución de habitantes por ciudadad con mapeo,
        del estudio,calidad del aire en India entre 2015-2020", 
        xlab = "Mapeo número de habitantes",
        ylab = "Porcentaje (%)",
        col = "blue",
        ylim = c(0,100),
        names.arg = 1:nrow(TDF_habitantes),
        las=2,
        cex.names=1.0,
        cex.axis = 0.9,
        cex.main = 0.9,
        mgp = c(5, 1, 0))

#4. Conjetura, escoger un modelo de probabilidad
# Modelo Uniforme porque como podemos observar la gráfica se aproxima a un modelo uniforme, ya que las barras presentan alturas similares entre las distintas clases, sin concentraciones marcadas en un intervalo específico
#5.Cálculo de los parametros 

#Soporte ( NO es parametro, es conjunto de valores posibles (mapeo))
x <- 1:nrow(TDF_habitantes)
#Parametros, en el modelo uniforme discreto los parámetros no se estiman a partir de los datos, sino que se determinan directamente del soporte de la variable, definido por el mapeo.
#Aplicación de la formula
P <- rep(100/length(x), length(x))
P
## [1] 20 20 20 20 20
#Frecuencias obsevadas  
freq_obs <- TDF_habitantes$`hi(%)` 
freq_obs
## [1] 14.92 18.05 23.47 20.40 23.17
#Frecuencia teorica
freq_teo <- rep(100 / length(freq_obs), length(P))
#6. Gráfica modelo vs realidad
par(mar = c(4, 5, 4, 2))
barplot(
  rbind(freq_obs,freq_teo ),
  beside = TRUE,
  col = c("blue", "red"),
  ylim = c(0, 100),
  names.arg = x,
  xlab = "Mapeo número de habitantes",
  ylab = "Probabilidad (%)",
  main = "Gráfica No 3: Comparación modelo vs la realidad,
  número de habitantes, estudio cálidad del aire en la India"
)

legend(
  "top",
  inset = 0.02,
  legend = c("Realidad", "Modelo uniforme"),
  fill = c("blue", "red"),
  horiz = TRUE,
  bty = "n"
)

 #7. Tests de bondad
#7.1 Test de Pearson:La correlación de Pearson no puede calcularse debido a que el modelo uniforme presenta varianza nula, ya que asigna la misma frecuencia esperada a todos los intervalos, lo que invalida su uso como medida de ajuste en este contexto.
# 7.2 Test Chi-Cuadrado : 
Fo <- TDF_habitantes$`hi(%)`      # Observada en %
Fe <- freq_teo          # Esperada en %
#Chi-Cuadrado
x2<-sum(((Fo-Fe)^2)/Fe)
x2
## [1] 2.592935
#Valor crítico
alpha <- 0.05   # Nivel de significancia del 5%
gl <- length(x) - 1   # porque p = 0
vc <- qchisq(1 - alpha, df = gl)
vc
## [1] 9.487729
x2<vc # el error no supera al umbral, aprueba
## [1] TRUE
#8. Resumen Test de bondad
Variable<-("Número de habitantes")
tabla_resumen<-data.frame(Variable,round(x2,2),round(vc,2))
colnames(tabla_resumen) <- c("Variable", "Chi-cuadrado", "Umbral de aceptación")

tabla_resumen %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nro. 3*"),
    subtitle = md("**Resumen test de bondad para el modelo de probabilidad asigando **")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2\n Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  ) %>%
  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
**Resumen test de bondad para el modelo de probabilidad asigando **
Variable Chi-cuadrado Umbral de aceptación
Número de habitantes 2.59 9.49
Autor: Grupo 2 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india