#Estadística inferencial
#Variable cuantitativa continua:Longitud
#Autor: Llumitasig Daniela
#Fecha: 15/06/2026
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
datos <- read.csv("~/Estadistica/Proyecto 2026/Datos utilizados/city_day (1).csv",
header = TRUE,
dec = ".",
sep = ",")
longitud<-datos$Longitud
# FRECUENCIAS PARA longitud
# Tamaño de muestra
n <- length(longitud)
# Valor mínimo y máximo
min_longitud <- min(longitud, na.rm = TRUE)
max_longitud <- max(longitud, na.rm = TRUE)
# Rango
R <- max_longitud - min_longitud
# Número de intervalos (Regla de Sturges)
k_detallado <- ceiling(1 + 3.322 * log10(n))
# Amplitud de clase
A <- R / k_detallado
# Mostrar resultados
cat("Número de intervalos (k):", k_detallado, "\n")
## Número de intervalos (k): 16
# Generación de límites de intervalos
Li <- seq(from = min_longitud, to = max_longitud - A, by = A)
Ls <- c(seq(from = min_longitud + A, to = max_longitud - A, by = A), max_longitud)
# Redondeo
longitud <- round(longitud, 3)
Li <- round(Li, 3)
Ls <- round(Ls, 3)
# Marcas de clase
MC <- (Li + Ls) / 2
# Frecuencias absolutas
ni <- numeric(length(Li))
for(i in 1:length(Li)){
if(i < length(Li)){
ni[i] <- sum(longitud >= Li[i] & longitud < Ls[i])
} else {
ni[i] <- sum(longitud >= Li[i] & longitud <= Ls[i])
}
}
# Frecuencias relativas y acumuladas
hi <- (ni / n) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
# Intervalos
Intervalo <- paste0("[", round(Li, 2), " - ", round(Ls, 2), ")")
# Último intervalo cerrado
Intervalo[length(Intervalo)] <- paste0(
"[",
round(Li[length(Li)], 2),
" - ",
round(Ls[length(Ls)], 2),
"]"
)
# Tabla de distribución de frecuencias
TDF_longitud <- data.frame(
Intervalo = Intervalo,
MC = round(MC, 2),
ni = ni,
hi = round(hi, 2),
Ni_ascendente = Ni_asc,
Ni_descendente = Ni_desc,
Hi_ascendente = round(Hi_asc, 2),
Hi_descendente = round(Hi_desc, 2)
)
# Fila de totales
totales <- data.frame(
Intervalo = "Totales",
MC = "-",
ni = sum(ni),
hi = round(sum(hi), 2),
Ni_ascendente = "-",
Ni_descendente = "-",
Hi_ascendente = "-",
Hi_descendente = "-"
)
# Tabla completa
TDF_longitud_completa <- rbind(TDF_longitud, totales)
# Por una gran cantidad de intervalos se realizara una reducción de filas en la
# tabla Nro. 2 creando solo 10 intervalos
# TABLA 2
k_tabla2 <- 9
# Nueva amplitud
A2 <- R / k_tabla2
# Nuevos límites
Li2 <- seq(from = min_longitud, to = max_longitud - A2, by = A2)
Ls2 <- c(seq(from = min_longitud + A2, to = max_longitud - A2, by = A2), max_longitud)
# Redondeo
Li2 <- round(Li2, 3)
Ls2 <- round(Ls2, 3)
# Marcas de clase
MC2 <- (Li2 + Ls2) / 2
# Frecuencias absolutas
ni2 <- numeric(length(Li2))
for(i in 1:length(Li2)){
if(i < length(Li2)){
ni2[i] <- sum(longitud >= Li2[i] & longitud < Ls2[i])
} else {
ni2[i] <- sum(longitud >= Li2[i] & longitud <= Ls2[i])
}
}
# Frecuencias relativas y acumuladas
hi2 <- (ni2 / n) * 100
Ni2_asc <- cumsum(ni2)
Ni2_desc <- rev(cumsum(rev(ni2)))
Hi2_asc <- cumsum(hi2)
Hi2_desc <- rev(cumsum(rev(hi2)))
# Intervalos
Intervalo2 <- paste0("[", round(Li2,2), " - ", round(Ls2,2), ")")
Intervalo2[length(Intervalo2)] <- paste0(
"[",
round(Li2[length(Li2)],2),
" - ",
round(Ls2[length(Ls2)],2),
"]"
)
# Tabla 2
TDF_longitud_10 <- data.frame(
Intervalo = Intervalo2,
MC = round(MC2,2),
ni = ni2,
hi = round(hi2,2),
Ni_ascendente = Ni2_asc,
Ni_descendente = Ni2_desc,
Hi_ascendente = round(Hi2_asc,2),
Hi_descendente = round(Hi2_desc,2)
)
# Totales
totales2 <- data.frame(
Intervalo = "Totales",
MC = "-",
ni = sum(ni2),
hi = sum(hi2),
Ni_ascendente = "-",
Ni_descendente = "-",
Hi_ascendente = "-",
Hi_descendente = "-"
)
TDF_longitud_10_completa <- rbind(TDF_longitud_10, totales2)
# TABLA 2: Distribución de frecuencias de longitud con 10 intervalos
TDF_longitud_10_completa %>%
gt() %>%
tab_header(
title = "Tabla Nro. 1",
subtitle = "Distribución de frecuencias de la variable Longitud para el análisis
estadístico de la calidad del aire en la India."
) %>%
tab_source_note(
source_note = md("Grupo: 1 <br> Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india ")
) %>%
tab_style(
style = cell_borders(sides = "left", color = "black", weight = px(2)),
locations = cells_body()
) %>%
tab_style(
style = cell_borders(sides = "right", color = "black", weight = px(2)),
locations = cells_body()
) %>%
tab_style(
style = cell_borders(sides = "left", color = "black", weight = px(2)),
locations = cells_column_labels()
) %>%
tab_style(
style = cell_borders(sides = "right", color = "black", weight = px(2)),
locations = cells_column_labels()
) %>%
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 | |||||||
| Distribución de frecuencias de la variable Longitud para el análisis estadístico de la calidad del aire en la India. | |||||||
| Intervalo | MC | ni | hi | Ni_ascendente | Ni_descendente | Hi_ascendente | Hi_descendente |
|---|---|---|---|---|---|---|---|
| [72.58 - 74.82) | 73.7 | 4018 | 13.61 | 4018 | 29531 | 13.61 | 100 |
| [74.82 - 77.06) | 75.94 | 4177 | 14.14 | 8195 | 25513 | 27.75 | 86.39 |
| [77.06 - 79.3) | 78.18 | 12024 | 40.72 | 20219 | 21336 | 68.47 | 72.25 |
| [79.3 - 81.53) | 80.41 | 2960 | 10.02 | 23179 | 9312 | 78.49 | 31.53 |
| [81.53 - 83.77) | 82.65 | 1964 | 6.65 | 25143 | 6352 | 85.14 | 21.51 |
| [83.77 - 86.01) | 84.89 | 2909 | 9.85 | 28052 | 4388 | 94.99 | 14.86 |
| [86.01 - 88.24) | 87.12 | 1169 | 3.96 | 29221 | 1479 | 98.95 | 5.01 |
| [88.24 - 90.48) | 89.36 | 0 | 0.00 | 29221 | 310 | 98.95 | 1.05 |
| [90.48 - 92.72] | 91.6 | 310 | 1.05 | 29531 | 310 | 100 | 1.05 |
| Totales | - | 29531 | 100.00 | - | - | - | - |
| Grupo: 1 Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india |
|||||||
# Histograma porcentual de Longitud
bp <- barplot(hi2,
space = 0,
names.arg = FALSE,
xaxt = "n",
yaxt = "n",
main = "Grafica Nro.1 Distribución de la Longitud\nen el estudio de la calidad de aire en
la India 2015-2020",
xlab = "Longitud (°)",
ylab = "Porcentaje",
col = "darkseagreen3",
border = "black",
ylim = c(0, 45),
cex.main = 0.8)
# Eje X
# Etiquetas con intervalos reales redondeados a enteros
Etiquetas <- paste0(
"[",
round(Li2,0),
"-",
round(Ls2,0),
")"
)
# Último intervalo cerrado
Etiquetas[length(Etiquetas)] <- paste0(
"[",
round(Li2[length(Li2)],0),
"-",
round(Ls2[length(Ls2)],0),
"]"
)
# Eje X
axis(1,
at = bp,
labels = Etiquetas,
las = 2,
cex.axis = 0.8)
# Eje Y
axis(2,
at = seq(0, 45, by = 10),
labels = seq(0, 45, by = 10),
las = 1)
grid()
#CONJETURA DEL MODELO: Se observa que la distribución de la variable longitud sigue
#aproximadamente un modelo de distribución normal. Esto se basa en la observación
#del histograma,tras la primera barra, se aprecia que las frecuencias de las tres
#barras siguientes consecutivas muestran una forma simétrica y centralizada, característica de
#la distribución normal.
#Agrupación 1
#Extraemos el intervalo de 75 a 82
longitud1<-longitud[longitud >=75 & longitud<82 ]
# CÁLCULO DE LOS PARÁMETROS DISTRIBUCIÓN NORMAL
# Media (mu)
mu <- mean(longitud1)
mu
## [1] 77.84931
# Desviación estándar (sigma)
sigma <- sd(longitud1)
sigma
## [1] 1.405916
# HISTOGRAMA densidad de probabilidad
cortes_limpios <- seq(75, 82, length.out = 4)
Histogramalongitud1 <- hist(longitud1,
breaks = cortes_limpios,
freq = FALSE,
main = "Gráfica Nº2:Comparación de la realidad con el modelo normal de Longitud \nen el estudio de 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,
labels = round(cortes_limpios, 0))
# 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")
#Test de Pearson
#Frecuencia observada
Fo<-as.numeric(table(cut(longitud1, breaks = cortes_limpios, include.lowest = TRUE)))
Fo
## [1] 5719 8336 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] 5707.847 9275.312 1641.758
Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 99.97481
#Test Chi-cuadrado
# Fo y Fe en fracción
Fo_fracción<- Fo/n
Fo_fracción
## [1] 0.3361152 0.4899207 0.1739641
Fe_fracción<- p
Fe_fracción
## [1] 0.33545969 0.54512560 0.09648887
x2 <- sum((Fo_fracción - Fe_fracción)^2 / Fe_fracción)
x2
## [1] 0.0678003
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
#¿Cuál es la probabilidad de encontrar una observación con una longitud comprendida entre 75° y 77°
#en el estudio de calidad del aire en India durante el período 2015–2020?
(pnorm(85, mu, sigma) - pnorm(80, mu, sigma))*100
## [1] 6.303985
# DEMOSTRACIÓN GRÁFICA PARA LONGITUD
# GRÁFICA DE PROBABILIDAD Y CANTIDAD ESPERADA
# Probabilidad
Probabilidad <- (pnorm(85, mu, sigma) -
pnorm(80, mu, sigma)) * 100
# Rango para la curva
x <- seq(min(longitud),
max(longitud),
0.01)
plot(x, dnorm(x, mu, sigma),
col = "skyblue3",
lwd = 1,
main = "Gráfica N°2: Cálculo de probabilidades",
ylab = "Densidad de probabilidad",
xlab = "Longitud (°)")
# Definir el rango de la sección que quieres pintar
x_section <- seq(80, 85, 0.001)
y_section <- dnorm(x_section, mu, sigma)
# Pintar la sección de la curva
lines(x_section,
y_section,
col = "red",
lwd = 2)
# Pintar el área debajo de la línea roja
polygon(c(x_section, rev(x_section)),
c(y_section, rep(0, length(y_section))),
col = rgb(1, 0, 0, 0.6))
# Leyenda
legend("topright",
legend = c("Modelo Normal",
"Área de Probabilidad"),
col = c("skyblue3",
"red"),
lwd = 2,
cex = 0.7)
# Texto
text(x = 88,
y = 0.07,
labels = paste0("Probabilidad = ",
round(Probabilidad,2),
"%"),
cex = 0.8,
font = 2)
#¿Cuántas observaciones del estudio de calidad del aire en India (2015–2020)
#presentan una longitud comprendida entre 77° y 79°?
Cantidad <- (pnorm(79, mu, sigma) - pnorm(77, mu, sigma)) * n
Cantidad
## [1] 8857.397
# 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("Intervalos de confianza de la longitud,en el estudio de la calidad del aire en la India 2015-2020")
) %>%
tab_source_note(
source_note = md("Autor: Grupo 1\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 |
| Intervalos de confianza de la longitud,en el estudio de la calidad del aire en la India 2015-2020 |
| Intervalo |
|---|
| P [78.51< µ <78.61] = 95% |
| Autor: Grupo 1 Fuente:https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india |
En conclusión:
La variable aleatoria longitud se explica con un modelo normal, con parámetros μ = 77.84 y σ = 1.40, y podemos afirmar con un 95% de confianza que la media aritmética poblacional se encuentra entre 78.51° y 78.61°, con una desviación estándar de 1.40.
#Agrupación 2
longitud2<-longitud[longitud >=82 & longitud<=88]
#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,tras la cuarta barra, se aprecia que las frecuencias de las tres
#barras consecutivas muestran una forma simétrica y centralizada, característica de
#la distribución normal.
# CÁLCULO DE LOS PARÁMETROS DISTRIBUCIÓN NORMAL
# Media (mu)
mu2 <- mean(longitud2)
mu2
## [1] 84.71188
# Desviación estándar (sigma)
sigma2 <- sd(longitud2)
sigma2
## [1] 1.123825
# HISTOGRAMA densidad de probabilidad
cortes_limpios2 <- seq(82, 88, length.out = 4)
Histogramalongitud2 <- hist(longitud2,
breaks = cortes_limpios2,
freq = FALSE,
main = "Gráfica Nº3: Comparación de la realidad con el modelo normal de
\nLongitud en el estudio de la calidad de aire en la India 2015-2020",
xlab = "Longitud (°)",
ylab = "Densidad probabilidad ",
col = "grey", ylim = c(0,0.5),xaxt = "n"
)
axis(1,
at = cortes_limpios2,
labels = round(cortes_limpios2, 0))
# Secuencia para la curva normal
x <- seq(min(longitud2), max(longitud2), by=0.01)
# Curva normal
curve(dnorm(x, mu2, sigma2),type="l",add = T,lwd=4, col = "steelblue")
#Test de Pearson
#Frecuencia observada
Fo2<-as.numeric(table(cut(longitud2, breaks = cortes_limpios2, include.lowest = TRUE)))
Fo
## [1] 5719 8336 2960
n2 <- length(longitud2)
# Probabilidad = P(X <= Ls) - P(X <= Li)
p2 <- diff(pnorm(cortes_limpios2, mean = mu2, sd = sigma2))
# Fe = Probabilidad * n
Fe2 <- p2 * n2
Fe2
## [1] 1542.6060 3691.1787 750.0495
Correlación<-cor(Fo2,Fe2)*100
Correlación
## [1] 94.69704
#Test Chi-cuadrado
# Fo y Fe en fracción
Fo_fracción2<- Fo2/n2
Fo_fracción2
## [1] 0.3437603 0.4627607 0.1934790
Fe_fracción2<- p2
Fe_fracción2
## [1] 0.2553138 0.6109200 0.1241393
x2_2 <- sum((Fo_fracción2 - Fe_fracción2)^2 / Fe_fracción2)
x2_2
## [1] 0.1053019
k <- length(Fo2)
grados_libertad2 <- k - 1
grados_libertad2
## [1] 2
umbral_aceptacion2 <- qchisq(0.95, df = grados_libertad2)
umbral_aceptacion2
## [1] 5.991465
x2_2<umbral_aceptacion2
## [1] TRUE
#¿Cuál es la probabilidad de encontrar una observación con una longitud comprendida entre 82° y 84°
#en el estudio de calidad del aire en India durante el período 2015–2020?
(pnorm(84, mu2, sigma2) - pnorm(82, mu2, sigma2))*100
## [1] 25.53138
# DEMOSTRACIÓN GRÁFICA PARA LONGITUD
# GRÁFICA DE PROBABILIDAD Y CANTIDAD ESPERADA
# Probabilidad
Probabilidad2 <- (pnorm(84, mu2, sigma2) -
pnorm(82, mu2, sigma2)) * 100
# Rango para la curva
x <- seq(min(longitud),
max(longitud),
0.01)
plot(x, dnorm(x, mu2, sigma2),
col = "skyblue3",
lwd = 1,
main = "Gráfica N°2: Cálculo de probabilidades",
ylab = "Densidad de probabilidad",
xlab = "Longitud (°)")
# Definir el rango de la sección que quieres pintar
x_section2 <- seq(82, 84, 0.001)
y_section2 <- dnorm(x_section2, mu2, sigma2)
# Pintar la sección de la curva
lines(x_section2,
y_section2,
col = "red",
lwd = 2)
# Pintar el área debajo de la línea roja
polygon(c(x_section2, rev(x_section2)),
c(y_section2, rep(0, length(y_section2))),
col = rgb(1, 0, 0, 0.6))
# Leyenda
legend("topleft",
legend = c("Modelo Normal",
"Área de Probabilidad"),
col = c("skyblue3",
"red"),
lwd = 2,
cex = 0.7)
# Texto
text(x = 78,
y = 0.10,
labels = paste0("Probabilidad = ",
round(Probabilidad2,2),
"%"),
cex = 0.6,
font = 2)
#¿Cuántas observaciones del estudio de calidad del aire en India (2015–2020)
#presentan una longitud comprendida entre 90° y 80°?
Cantidad2 <- (pnorm(90, mu2, sigma2) - pnorm(80, mu2, sigma2)) * n2
Cantidad2
## [1] 6041.909