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"
)