UNIVERSIDAD CENTRAL DEL ECUADOR-FIGEMPA-Ingeniería Ambiental
#Estadística inferencial
#10/01/2026
#Daniela Llumitasig
# 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(%)"
)
TDF_longitud %>%
gt() %>%
tab_header(
title = md("*Tabla Nro. 1*"),
subtitle = md("**Distribucion de frecuencia simplificado de 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. 1 |
| **Distribucion de frecuencia simplificado de Longitud ,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 = 4)
Histogramalongitud1 <- hist(longitud1,
breaks = cortes_limpios,
freq = FALSE,
main = "Gráfica Nº2: Comparación modelo normal con la realidad, 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), by=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] 4018 16201 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
Fe
## [1] 2429.271 14015.614 6495.250
Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 91.10017
#Test Chi-cuadrado
# Fo y Fe en fracción
Fo_fracción<- Fo/n
Fo_fracción
## [1] 0.1733466 0.6989516 0.1277018
Fe_fracción<- p
Fe_fracción
## [1] 0.1048048 0.6046686 0.2802213
x2 <- sum((Fo_fracción - Fe_fracción)^2 / Fe_fracción)
x2
## [1] 0.1425406
k <- length(Fo)
grados_libertad <- k - 1
grados_libertad
## [1] 2
umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
umbral_aceptacion
## [1] 5.991465
x2<umbral_aceptacion
## [1] TRUE
# 8. CÁLCULO DE PROBABILDAD
#¿Cuál es la probabilidad de que una estación de monitoreo proyectada para 2028 se encuentre en el intervalo de longitud 70°–74°?
pnorm(74,mu,sigma)-pnorm(70,mu,sigma)
## [1] 0.1048048
#¿Cuál es la probabilidad de que una estación de monitoreo para 2029 tenga longitud mayor o igual a 78°?
1-pnorm(78,mu,sigma)
## [1] 0.2893899
# Demostración:
# Secuencia para densidad
x <- seq(69, 83, by=0.01)
plot(x, dnorm(x, mu, sigma), type="l", col="skyblue3", lwd=2,
main="Gráfica N°3: Cálculo de probabilidad",
ylab="Densidad de probabilidad", xlab="Longitud (°)", xaxt="n", xlim=c(70, 82))
# Área roja: 72 a 74
x_section1 <- seq(72, 74, by=0.01)
y_section1 <- dnorm(x_section1, mu, sigma)
polygon(c(x_section1, rev(x_section1)), c(y_section1, rep(0, length(y_section1))),
col=rgb(1,0,0,0.5))
# Área verde: 78 a 82
x_section2 <- seq(78, 82, by=0.01)
y_section2 <- dnorm(x_section2, mu, sigma)
polygon(c(x_section2, rev(x_section2)), c(y_section2, rep(0, length(y_section2))),
col=rgb(0,1,0,0.5))
# Leyenda
legend("topright", legend=c("Modelo","Área roja","Área verde"),
col=c("skyblue3","red","green"), lwd=2, fill=c(NA,"red","green"),cex = 0.8 )
# Eje X
axis(1, at=seq(70, 82, by=4), labels=seq(70, 82, by=4))

# 3.2 Agrupación 2
#Extraemos el intervalo de 70 a 82
longitud2<-longitud[longitud >=82 & longitud<=94 ]
#4.CONJETURA DEL MODELO: "En el rango de longitudes de 82 a 94, la distribución de frecuencias muestra un decrecimiento continuo desde los valores más bajos hacia los más altos, lo que sugiere que podría aproximarse a un modelo exponencial decreciente."
#5.CÁLCULO DE LOS PARÁMETROS DISTRIBUCIÓN EXPONENCIAL
# Desplazamiento para aplicar exponencial
base <- 82
longitud2_exponencial <- longitud2 - base
# Media
media <- mean(longitud2_exponencial)
media
## [1] 3.102811
# Lambda
lambda<-1/media
lambda
## [1] 0.3222884
#6. HISTOGRAMA densidad de probabilidad
cortes_limpios <- seq(82, 94, length.out = 4)
Histogramalongitud2 <- hist(longitud2,
breaks = cortes_limpios,
freq = FALSE,
main = "Gráfica Nº4: Comparación modelo exponencial con la realidad,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)
# Curva exponencial
curve(dexp(x-base,rate = lambda),
from = 82, to = 94,
col = "blue", lwd = 2, add = TRUE)

#7.TEST DE BONDAD
#Test de Pearson
#Frecuencia observada
# Frecuencias observadas por intervalo
fo <- hist(longitud2, breaks=cortes_limpios, plot=FALSE)$counts
fo
## [1] 4873 1169 310
n <- length(longitud2)
intervalos_exponencial <- cortes_limpios - base
p <- diff(pexp(intervalos_exponencial, rate=lambda))
# Fe = Probabilidad * n
fe <- p * n
fe
## [1] 4601.9996 1267.8686 349.3027
Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 91.10017
#Test Chi-cuadrado
# Fo y Fe en porcentual
Fo_porcentual<- fo/n*100
Fo_porcentual
## [1] 76.715995 18.403652 4.880353
Fe_porcentual<- p*100
Fe_porcentual
## [1] 72.449616 19.960147 5.499097
x2 <- sum((Fo_porcentual - Fe_porcentual)^2 / Fe_porcentual)
x2
## [1] 0.4422318
k <- length(Fo_porcentual)
grados_libertad <- k - 1
grados_libertad
## [1] 2
umbral_aceptacion <- qchisq(0.95, df = grados_libertad)
umbral_aceptacion
## [1] 5.991465
x2<umbral_aceptacion
## [1] TRUE
# 8.CÁLCULO DE PROBABILIDAD
#¿Cuál es la probabilidad de que una estación de monitoreo para 2030 tenga longitud menor o igual a 90°?
pexp(90 - base, rate = lambda)
## [1] 0.9240976
#Demostración:
x <- seq(82, 94, by=0.001)
y <- dexp(x - base, rate = lambda)
plot(x, y,col = "skyblue3", lwd = 1, xlim = c(82,94), ylim=c(0,0.40),
main="Gráfica N°5: Cálculo de probabilidad",
ylab="Densidad de probabilidad",xlab="Longitud (°)", xaxt="n")
# Área a sombrear (por ejemplo, hasta 90°)
x_section <- seq(82, 90, by=0.001)
y_section <- dexp(x_section - base, rate = lambda)
# Sombrear el área
polygon(c(x_section, rev(x_section)), c(y_section, rep(0, length(y_section))),
col=rgb(1,0,0,0.6))
# Dibujar línea roja sobre la sección
lines(x_section, y_section, col="red", lwd=2)
# Leyenda
legend("topright", legend=c("Modelo", "Área de Probabilidad"),
col=c("skyblue3","red"), lwd=2, lty=c(1,1))
# Ajustar eje X
axis(1, at=seq(82, 94, by=2))

# 9. INTERVALO DE CONFIANZA
media <-mean(longitud)
sigma<-sd(longitud)
n<-length(longitud)
error<- 2*(sigma/sqrt(n))
#Límites intevalo de cofianza
limite_inferior<- round(media-error,2)
limite_superior<- round(media+error,2)
tabla_intervalo <- data.frame(Intervalo = "P [78.51< µ <78.61] = 95%")
tabla_intervalo %>%
gt() %>%
tab_header(
title = md("*Tabla Nro. 2*"),
subtitle = md("**Intervalo de confianza 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"
)
# 10. CONCLUSIÓN LONGITUD
# La variable longitud en (°) sigue o se explica con dos modelos exponencial con parametro λ= 0.322 y normal con parametros µ= 76.76 σ= 2.217 y podemos afirmar con el 95% de confianza que la media aritmética de está variable se encuentra entre 78.51 y 78.61 (°) con una desviación estándar de 4.060 (°).