#Estadística inferencial 
#Variable cuantitativa continua:Longitud
#Autor: Llumitasig Daniela 
#Fecha: 15/06/2026

0.- Carga de librerías

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

1.- Carga de datos

datos <- read.csv("~/Estadistica/Proyecto 2026/Datos utilizados/city_day (1).csv",
                  header = TRUE,
                  dec = ".",
                  sep = ",")

2.- Selección de la variable aleatoria

longitud<-datos$Longitud

3.- TDF de la variable 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

4.- Histograma de la variable

# 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()

5.- Conjetura

#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.

6.- Cálculo de parámetros

#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

7.- Superposición de la realiadad con el modelo

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

8.- Tests de bondad

#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

9 Cálculo de propabilidades

#¿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

10.- Intervalos de confianza

# 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

11.- Conclusión

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.

12.- Agrupación 2

#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