PROYECTO:ESTUDIO ESTADÍSTICO DE LA CALIDAD DE AIRE EN LA INDIA
options(scipen = 999) # Desactivar notacion cientifica
# =============================================================================
# PASO 0: CARGA DE LIBRERIAS
# =============================================================================
if (!require(dplyr)) install.packages("dplyr")
## Cargando paquete requerido: 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
if (!require(gt)) install.packages("gt")
## Cargando paquete requerido: gt
library(dplyr)
library(gt)
# =============================================================================
# PASO 1: SELECCION DE VARIABLES (CAUSA Y EFECTO)
# =============================================================================
# Analisis previo indico que PM2.5 tiene la mayor correlacion con AQI (r=0.97).
# Definimos la relacion de dependencia:
# Variable Independiente (X) = PM2.5 (La Causa)
# Variable Dependiente (Y) = AQI (El Efecto)
datos <- read.csv("C:\\Users\\JOSELYN\\Desktop\\kangle\\Datos Cambiados.csv", sep = ",")
datos$PM2.5 <- as.numeric(datos$PM2.5)
## Warning: NAs introducidos por coerción
datos$AQI <- as.numeric(datos$AQI)
## Warning: NAs introducidos por coerción
# Limpieza basica de nulos
datos <- datos[!is.na(datos$AQI) & !is.na(datos$PM2.5), ]
# CONDICION MATEMATICA: Para el modelo potencial (log-log), X e Y deben ser > 0
datos <- subset(datos, PM2.5 > 0.1 & AQI > 0.1)
# =============================================================================
# PASO 2: FILTRADO DE OUTLIERS (IQR)
# =============================================================================
# Eliminamos ruido para que la curva represente el comportamiento real.
# Filtro AQI
Q1_AQI <- quantile(datos$AQI, 0.25)
Q3_AQI <- quantile(datos$AQI, 0.75)
IQR_AQI <- Q3_AQI - Q1_AQI
datos <- datos[datos$AQI >= (Q1_AQI - 1.5 * IQR_AQI) & datos$AQI <= (Q3_AQI + 1.5 * IQR_AQI), ]
# Filtro PM2.5
Q1_PM <- quantile(datos$PM2.5, 0.25)
Q3_PM <- quantile(datos$PM2.5, 0.75)
IQR_PM <- Q3_PM - Q1_PM
datos <- datos[datos$PM2.5 >= (Q1_PM - 1.5 * IQR_PM) & datos$PM2.5 <= (Q3_PM + 1.5 * IQR_PM), ]
# =============================================================================
# PASO 3: AGRUPAMIENTO (BINNING)
# =============================================================================
# Dividimos la Causa (X) en 50 tramos para ver como reacciona el Efecto (Y).
datos_bin <- datos %>%
mutate(Rango_X = cut(PM2.5, breaks = 50)) %>%
filter(!is.na(Rango_X))
# Calculamos promedios (Suavizado de la tendencia)
datos_prom <- datos_bin %>%
group_by(Rango_X) %>%
summarise(
X_prom = mean(PM2.5, na.rm = TRUE), # PM2.5 Promedio
Y_prom = mean(AQI, na.rm = TRUE) # AQI Promedio
) %>%
ungroup() %>%
na.omit()
# Asignacion explicita de variables
X <- datos_prom$X_prom # Causa
Y <- datos_prom$Y_prom # Efecto
# =============================================================================
# PASO 4: TABLA DE DATOS (TVP)
# =============================================================================
TVP <- data.frame(PM2.5_Causa = X, AQI_Efecto = Y)
TVP %>%
head(10) %>%
gt() %>%
fmt_number(columns = everything(), decimals = 2) %>%
tab_header(
title = md("**Tabla No. 1: Datos Promediados**"),
subtitle = "Relacion Potencial: PM2.5 (X) -> AQI (Y)"
)
| Tabla No. 1: Datos Promediados |
| Relacion Potencial: PM2.5 (X) -> AQI (Y) |
| PM2.5_Causa |
AQI_Efecto |
| 1.83 |
36.31 |
| 4.79 |
60.36 |
| 7.89 |
53.32 |
| 10.67 |
62.80 |
| 13.56 |
62.44 |
| 16.48 |
67.90 |
| 19.34 |
74.43 |
| 22.38 |
78.78 |
| 25.31 |
83.26 |
| 28.24 |
87.92 |
# =============================================================================
# PASO 5: AJUSTE DEL MODELO POTENCIAL
# =============================================================================
# Modelo Teorico: Y = a * X^b
# Para calcularlo, linealizamos usando logaritmos: ln(Y) = ln(a) + b*ln(X)
modelo_linear <- lm(log(Y) ~ log(X))
# Recuperamos los parametros originales
intercepto_ln <- coef(modelo_linear)[1]
b <- coef(modelo_linear)[2] # Exponente (beta)
a <- exp(intercepto_ln) # Coeficiente (alfa)
cat("\n--- ECUACION MATEMATICA ---\n")
##
## --- ECUACION MATEMATICA ---
print(paste("Coeficiente (a):", round(a, 4)))
## [1] "Coeficiente (a): 15.5919"
print(paste("Exponente (b):", round(b, 4)))
## [1] "Exponente (b): 0.5712"
cat(sprintf("Formula Final: AQI = %.4f * PM2.5 ^ %.4f\n", a, b))
## Formula Final: AQI = 15.5919 * PM2.5 ^ 0.5712
# =============================================================================
# PASO 6: GRAFICA DE DISPERSION (OPTIMIZADA)
# =============================================================================
max_x <- max(X)
max_y <- max(Y)
plot(X, Y,
main = "Grafica No. 2: Modelo Potencial (PM2.5 vs AQI)",
xlab = "Concentracion PM2.5 (ug/m3) [Causa]",
ylab = "Indice AQI [Efecto]",
col = "darkblue", pch = 16, cex = 1.3,
xlim = c(0, max_x * 1.1),
ylim = c(0, max_y * 1.1),
xaxs = "i", yaxs = "i") # Ejes exactos en 0
grid()
# Curva de Ajuste Potencial
curve(a * x^b, from = 0, to = max_x * 1.1,
add = TRUE, col = "red", lwd = 3)

# =============================================================================
# PASO 7: VALIDACION ESTADISTICA
# =============================================================================
# Calculamos la correlacion en el espacio logaritmico (linealizado)
r <- cor(log(X), log(Y))
R2 <- r^2
cat("\n--- BONDAD DE AJUSTE ---\n")
##
## --- BONDAD DE AJUSTE ---
print(paste("Coeficiente de Correlacion (r):", round(r, 4)))
## [1] "Coeficiente de Correlacion (r): 0.9569"
if(r > 0.90) {
cat("INTERPRETACION: La relacion Causa-Efecto es MUY FUERTE (r > 0.90).\n")
}
## INTERPRETACION: La relacion Causa-Efecto es MUY FUERTE (r > 0.90).
# =============================================================================
# PASO 8: COEFICIENTE DE DETERMINACION (R2)
# =============================================================================
print(paste("Coeficiente de Determinacion (R2):", round(R2 * 100, 2), "%"))
## [1] "Coeficiente de Determinacion (R2): 91.57 %"
# =============================================================================
# PASO 9: DOMINIO Y RESTRICCIONES
# =============================================================================
cat("\n--- ANALISIS DE DOMINIO ---\n")
##
## --- ANALISIS DE DOMINIO ---
if(b > 0) {
cat("El exponente es positivo, lo que indica que el AQI crece siempre que aumenta el PM2.5.\n")
cat("El modelo es valido fisicamente para PM2.5 >= 0.\n")
} else {
cat("Exponente negativo (Decreciente). Verificar datos.\n")
}
## El exponente es positivo, lo que indica que el AQI crece siempre que aumenta el PM2.5.
## El modelo es valido fisicamente para PM2.5 >= 0.
# =============================================================================
# PASO 10: APLICACION DEL MODELO (PREDICCION)
# =============================================================================
# Probamos con un valor de PM2.5 = 60
Valor_X <- 60
Prediccion_Y <- a * (Valor_X ^ b)
cat("\n--- PREDICCION ---\n")
##
## --- PREDICCION ---
print(paste("Si la Causa (PM2.5) es", Valor_X, ", el Efecto esperado (AQI) es:", round(Prediccion_Y, 2)))
## [1] "Si la Causa (PM2.5) es 60 , el Efecto esperado (AQI) es: 161.65"
# =============================================================================
# CONCLUSION FINAL
# =============================================================================
cat("\n--- CONCLUSION ---\n")
##
## --- CONCLUSION ---
cat(paste("El analisis confirma que el AQI depende fuertemente del PM2.5.\n"))
## El analisis confirma que el AQI depende fuertemente del PM2.5.
cat(paste("El modelo potencial explica el", round(R2*100, 2), "% de la variabilidad del AQI,\n"))
## El modelo potencial explica el 91.57 % de la variabilidad del AQI,
cat("demostrando que el PM2.5 es el principal determinante (Causa) de la calidad del aire.\n")
## demostrando que el PM2.5 es el principal determinante (Causa) de la calidad del aire.