UNIVERSIDAD CENTRAL DEL ECUADOR-FIGEMPA-Ingeniería Ambiental
#Estadística inferencial
#10/01/2026
#Lorien Arcentales
# Carga de paquetes
library(gt)
library(dplyr)
#1. CARGA DE DATOS
datos<-read.csv("city_day.csv", header = TRUE, dec = ".",
sep = ",")
#Extracción variable
longitud<-datos$Longitud
length(longitud)
## [1] 29531
#Justificación por qué la variable Longitud es continua: La longitud geográfica es una variable cuantitativa continua porque se mide como una magnitud y puede tomar infinitos valores reales dentro del intervalo [−180, 180],donde los valores negativos indican longitudes occidentales y los positivos longitudes orientales, sin existir saltos naturales entre valores consecutivos.
#2. TDF
breaks <- seq(70, 94, length.out = 7)
round(breaks)
## [1] 70 74 78 82 86 90 94
longitud_cut <- cut(
longitud,
breaks = breaks,
include.lowest = TRUE,
right = FALSE
)
table(longitud_cut)
## longitud_cut
## [70,74) [74,78) [78,82) [82,86) [86,90) [90,94]
## 4018 16201 2960 4873 1169 310
tabla <- table(longitud_cut)
ni <- as.numeric(table(longitud_cut))
hi <- round(ni / sum(ni) * 100, 2)
Li <- breaks[-length(breaks)]
Ls <- breaks[-1]
Intervalos <- paste0("[", Li, " – ", Ls, ")")
Intervalos[length(Intervalos)] <- paste0("[", Li[length(Li)], " – ", Ls[length(Ls)], "]")
TDF_longitud <- data.frame(
Intervalo = Intervalos,
ni = ni,
`hi(%)` = hi
)
totales <- data.frame(
Intervalo = "Totales",
ni = sum(ni),
`hi(%)` = round(sum(hi), 2)
)
TDF_longitud <- rbind(TDF_longitud, totales)
colnames(TDF_longitud) <- c(
"Intervalo",
"ni",
"hi(%)"
)
#Tabla 2
TDF_longitud %>%
gt() %>%
tab_header(
title = md("*Tabla Nro. 1*"),
subtitle = md("**Distribucion de frecuencia simplificado de Latitud ,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 simplificado de Latitud ,estudio calidad del aire en India entre 2015-2020 ** |
| Intervalo |
ni |
hi(%) |
| [70 – 74) |
4018 |
13.61 |
| [74 – 78) |
16201 |
54.86 |
| [78 – 82) |
2960 |
10.02 |
| [82 – 86) |
4873 |
16.50 |
| [86 – 90) |
1169 |
3.96 |
| [90 – 94] |
310 |
1.05 |
| Totales |
29531 |
100.00 |
| Autor: Grupo 2
Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india |
#3.GDF-Histograma
TDF_longitud$`hi (%)` <- as.numeric(TDF_longitud$`hi(%)`)
TDF_longitud_graf <- TDF_longitud[TDF_longitud$Intervalo != "Totales", ]
par(mar = c(9, 5, 4, 2)) # margen inferior más grande
post <- barplot(
TDF_longitud_graf$`hi(%)`,
space = 0,
col = "steelblue",
ylim = c(0, 100),
xaxt = "n",
ylab = "Porcentaje (%)",
main = "Gráfica N°1:Distribució de la Longitud en el estudio
calidad del aire en India, 2015-2020"
)
axis(
side = 1,
at = post,
labels = TDF_longitud_graf$Intervalo,
las = 2,
cex.axis = 0.8
)
mtext(
"Longitud (°)",
side = 1,
line = 7
)

#3.1 Agrupación 1
#Extraemos el intervalo de 70 a 82
longitud1<-longitud[longitud >=70 & longitud<82 ]
#4.CONJETURA DEL MODELO: Se observa la distribución de la variable longitud sigue aproximadamente un modelo de distribución normal. Esto se basa en la observación del histograma, en el que las frecuencias de las tres primeras barras analizadas muestran una forma simétrica y centralizada, característica de la distribución normal.
#5.CÁLCULO DE LOS PARÁMETROS DISTRIBUCIÓN NORMAL
# Media (mu)
mu <- mean(longitud1)
mu
## [1] 76.76874
# Desviación estándar (sigma)
sigma <- sd(longitud1)
sigma
## [1] 2.217821
#6. HISTOGRAMA densidad de probabilidad
cortes_limpios <- seq(70, 82, length.out = 5)
Histogramalongitud1 <- hist(longitud1,
breaks = cortes_limpios,
freq = FALSE,
main = "Gráfica Nº2: Comparación modelo normal con la realidad de Longitud\nestudio calidad de aire India 2015-2020",
xlab = "Longitud (°)",
ylab = "Densidad probabilidad ",
col = "grey", ylim = c(0,0.5),xaxt = "n"
)
axis(1, at = cortes_limpios)
# Secuencia para la curva normal
x <- seq(min(longitud1), max(longitud1), 0.01)
# Curva normal
curve(dnorm(x, mu, sigma),type="l",add = T,lwd=4, col = "steelblue")

#7.TEST DE BONDAD
#Test de Pearson
#Frecuencia observada
Fo<-as.numeric(table(cut(longitud1, breaks = cortes_limpios, include.lowest = TRUE)))
Fo
## [1] 2009 4444 13766 2960
n <- length(longitud1)
# Probabilidad = P(X <= Ls) - P(X <= Li)
p <- diff(pnorm(cortes_limpios, mean = mu, sd = sigma))
# Fe = Probabilidad * n
Fe <- p * n
Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 90.0165
plot(Fo,Fe,main="Gráfica Nº3: Correlación de frecuencias en el modelo normal
de la Longitud, estudio calidad del aire en la India",xlab="Frecuencia Observada",ylab="Frecuencia esperada",col="blue3")
abline(lm(Fe ~ Fo), col="red",lwd=2)

#Test Chi-cuadrado
#Chi-cuadrado
x2 <- sum((Fo - Fe)^2 / Fe)
x2
## [1] 2893.978
k <- length(Fo)
grados_libertad <- k - 1 - 2
grados_libertad
## [1] 1
umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
umbral_aceptacion
## [1] 3.841459
x2<umbral_aceptacion
## [1] FALSE
# 8. Omision de valores atipicos para mejor acoplamiento del modelo
boxplot(
longitud1,
horizontal = TRUE,
main = "Distribución de la longitud estudio calidad del aire en India",
xlab = "Longitud (°)",
col = "lightgray"
)

#Omisison valores atípicos
Q1 <- quantile(longitud1, 0.25, na.rm = TRUE)
Q3 <- quantile(longitud1, 0.75, na.rm = TRUE)
IQR_long <- IQR(longitud1, na.rm = TRUE)
lim_inf <- Q1 - 1.5 * IQR_long
lim_sup <- Q3 + 1.5 * IQR_long
# Subconjunto sin atípicos
longitud_comunes1 <- subset(
longitud1,
longitud1 >= lim_inf & longitud1 <= lim_sup
)
# Límites de la variablest
lim_inf <- floor(min(longitud_comunes1))
lim_sup <- ceiling(max(longitud_comunes1))
# Usaremos 7 intervalos para asegurar que haya más de 5 barras y buena densidad
breaks_nuevo <- seq(lim_inf, lim_sup, length.out = 6)
cortes <- cut(longitud_comunes1, breaks = breaks_nuevo, include.lowest = TRUE, right = FALSE)
ni <- as.numeric(table(cortes))
hi <- round(ni / sum(ni) * 100, 3)
Li <- breaks_nuevo[-length(breaks_nuevo)]
Ls <- breaks_nuevo[-1]
Intervalos <- paste0("[", round(Li, 2), " – ", round(Ls, 2), ")")
Intervalos[length(Intervalos)] <- paste0("[", round(Li[length(Li)], 2), " – ", round(Ls[length(Ls)], 2), "]")
TDF_longitudcomun1 <- data.frame(
Intervalo = Intervalos,
ni = ni,
`hi (%)` = hi
)
totales <- data.frame(
Intervalo = "Totales",
ni = sum(ni),
`hi (%)` = round(sum(hi), 2)
)
TDF_longitudcomun1 <- rbind(TDF_longitudcomun1, totales)
colnames(TDF_longitudcomun1) <- c(
"Intervalo",
"ni",
"hi(%)"
)
TDF_longitudcomun1 %>%
gt() %>%
tab_header(
title = md("*Tabla Nro. 2*"),
subtitle = md("**Distribucion sin valores atípicos de la Longitud, 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 sin valores atípicos de la Longitud, estudio calidad del aire en India entre 2015-2020 ** |
| Intervalo |
ni |
hi(%) |
| [72 – 73.8) |
4018 |
17.335 |
| [73.8 – 75.6) |
2435 |
10.505 |
| [75.6 – 77.4) |
8548 |
36.878 |
| [77.4 – 79.2) |
5218 |
22.512 |
| [79.2 – 81] |
2960 |
12.770 |
| Totales |
23179 |
100.000 |
| Autor: Grupo 2
Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india |
#GDF - Histograma
TDF_longitudcomun1$`hi (%)` <- as.numeric(TDF_longitudcomun1$`hi(%)`)
TDF_longitud1_graf2 <- TDF_longitudcomun1[TDF_longitudcomun1$Intervalo != "Totales", ]
par(mar = c(9, 5, 4, 2)) # margen inferior más grande
post <- barplot(
TDF_longitud1_graf2$`hi(%)`,
space = 0,
col = "steelblue",
ylim = c(0, 100),
xaxt = "n",
ylab = "Porcentaje (%)",
main = "Gráfica N°4:Distribució de la Longitud sin valores atípicos
en el estudio calidad del aire en India, 2015-2020"
)
axis(
side = 1,
at = post,
labels = TDF_longitud1_graf2$Intervalo,
las = 2,
cex.axis = 0.8
)
mtext(
"Longitud (°)",
side = 1,
line = 7
)

#CONJETURA2 valores comunes: Se puede conjeturar que es una distribución normal porque el gráfico tiene forma de campana, con una barra central muy alta que concentra la mayoría de los datos y barras que van bajando de altura de manera equilibrada hacia los lados.
#Cálculo parametro distribución normal
mu2 <- mean(longitud_comunes1) # Media aritmética
sigma2 <- sd(longitud_comunes1) # Desviación estándar
# HISTOGRAMA densidad de probabilidad
par(mar = c(5, 5, 4, 2))
histograma_longitudcomun1 <- hist(longitud_comunes1,
breaks = breaks_nuevo,
freq = FALSE,
main = "Gráfica N°5: Comparaación de la realidad y modelo normal,
estudio calidad aire en India ",
xlab = "Longitud (°)",
ylab = "Densidad de probabilidad",
col = "lightgray",
ylim = c(0, 0.4), # Ajustamos el límite para que quepa la curva
xaxt = "n")
axis(1, at = breaks_nuevo)
x<-seq(min(longitud_comunes1),max(longitud_comunes1),0.01)
curve(dnorm(x,mu2,sigma2),type="l",add=TRUE,lwd=4,col="blue3")
legend("topright",
legend = c("Realidad", "Modelo"),
col = c("lightgray", "blue"),
lwd = c(10, 3),
bty = "n")

#Test de bondad
#Test Pearson
Fo <- as.numeric(table(cut(longitud_comunes1, breaks = breaks_nuevo, include.lowest = TRUE)))
n <- length(longitud_comunes1)
p <- diff(pnorm(breaks_nuevo, mean = mu, sd = sigma))
p <- p / sum(p)
Fe <- p * n
Correlación2 <- cor(Fo, Fe) * 100
Correlación2
## [1] 70.93514
#Gráfica correlación
plot(Fo, Fe,
main = "Gráfica Nº6: Correlación de frecuencias en el modelo normal\nde la Longitud, estudio calidad del aire en la India",
xlab = "Frecuencia Observada",
ylab = "Frecuencia esperada",
col = "blue3", pch = 19)
abline(lm(Fe ~ Fo), col = "red", lwd = 2)

#Test Chi-cuadrado
x2 <- sum((Fo - Fe)^2 / Fe)
k <- length(Fo)
grados_libertad <- k - 1 - 2
umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
x2<umbral_aceptacion
## [1] FALSE