install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("scatterplot3d")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("car")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
# Carga de librerías
# ==============================
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(scatterplot3d)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
# Lectura y vista previa de datos
# ==============================
datos <- read.csv("/cloud/project/Waste_Management_and_Recycling_India.csv xd.csv", sep = ";", header = TRUE)
head(datos)
## City.District Waste.Type Waste.Generated..Tons.Day. Recycling.Rate....
## 1 Mumbai Plastic 6610 68
## 2 Mumbai Organic 1181 56
## 3 Mumbai E-Waste 8162 53
## 4 Mumbai Construction 8929 56
## 5 Mumbai Hazardous 5032 44
## 6 Mumbai Plastic 7456 73
## Population.Density..People.km.. Municipal.Efficiency.Score..1.10.
## 1 11191 9
## 2 11191 5
## 3 11191 8
## 4 11191 5
## 5 11191 7
## 6 11191 9
## Disposal.Method Cost.of.Waste.Management....Ton. Awareness.Campaigns.Count
## 1 Composting 3056 14
## 2 Composting 2778 12
## 3 Incineration 3390 13
## 4 Landfill 1498 14
## 5 Recycling 2221 16
## 6 Landfill 3195 6
## Landfill.Name Landfill.Location..Lat..Long. Landfill.Capacity..Tons. Year
## 1 Mumbai Landfill 22.4265, 77.4931 45575 2019
## 2 Mumbai Landfill 22.4265, 77.4931 45575 2019
## 3 Mumbai Landfill 22.4265, 77.4931 45575 2019
## 4 Mumbai Landfill 22.4265, 77.4931 45575 2019
## 5 Mumbai Landfill 22.4265, 77.4931 45575 2019
## 6 Mumbai Landfill 22.4265, 77.4931 45575 2020
# ==============================
# Extracción de variables clave
# ==============================
# Limpiar nombres de columnas automáticamente
names(datos) <- make.names(names(datos), unique = TRUE)
Reciclaje <- datos$Recycling.Rate....
Residuos <- datos$Waste.Generated..Tons.Day.
Costo <- datos$Cost.of.Waste.Management....Ton.
Eficiencia <- datos$Municipal.Efficiency.Score..1.10.
Campanas <- datos$Awareness.Campaigns.Count
Densidad <- datos$Population.Density..People.km.2.
Ciudad <- datos$City.District
# ==============================
# REGRESIÓN LINEAL: Campañas vs Reciclaje
# ==============================
# Diagrama de dispersión
plot(Campanas, Reciclaje,
xlab = "Campañas de Concientización",
ylab = "Tasa de Reciclaje (%)",
main = "Campañas vs Reciclaje",
col = "darkgreen", pch = 16)
# Modelo de regresión lineal
modelo_lineal <- lm(Reciclaje ~ Campanas)
summary(modelo_lineal)
##
## Call:
## lm(formula = Reciclaje ~ Campanas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -27.5291 -13.6608 -0.7751 13.9622 28.3392
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 57.52908 1.05964 54.291 <2e-16 ***
## Campanas -0.04570 0.09123 -0.501 0.617
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.14 on 848 degrees of freedom
## Multiple R-squared: 0.0002958, Adjusted R-squared: -0.0008831
## F-statistic: 0.2509 on 1 and 848 DF, p-value: 0.6166
# Línea de regresión
abline(modelo_lineal, col = "blue", lwd = 2)

# Coeficiente de correlación
r <- cor(Campanas, Reciclaje)
r2 <- r^2 * 100
cat("R²:", round(r2, 2), "%\n")
## R²: 0.03 %
# ==============================
# REGRESIÓN EXPONENCIAL: Costo vs Reciclaje
# ==============================
x <- Costo
y <- Reciclaje + 0.1
ylog <- log(y)
modelo_exp <- lm(ylog ~ x)
summary(modelo_exp)
##
## Call:
## lm(formula = ylog ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.59955 -0.23949 0.02413 0.26073 0.44100
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.004e+00 2.456e-02 163.041 <2e-16 ***
## x -2.873e-07 8.033e-06 -0.036 0.971
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2987 on 848 degrees of freedom
## Multiple R-squared: 1.509e-06, Adjusted R-squared: -0.001178
## F-statistic: 0.001279 on 1 and 848 DF, p-value: 0.9715
a <- exp(coef(modelo_exp)[1])
b <- coef(modelo_exp)[2]
# Gráfico
plot(Costo, Reciclaje,
xlab = "Costo por Tonelada (₹)",
ylab = "Tasa de Reciclaje (%)",
main = "Costo vs Reciclaje (Exponencial)",
col = "purple", pch = 16)
curve(a * exp(b * x), add = TRUE, col = "red", lwd = 2)

r <- cor(x, ylog)
r2 <- r^2 * 100
cat("R² exponencial:", round(r2, 2), "%\n")
## R² exponencial: 0 %
# ==============================
# REGRESIÓN POTENCIAL: Residuos vs Reciclaje
# ==============================
x <- Residuos + 0.01
y <- Reciclaje
modelo_pot <- lm(log(y) ~ log(x))
summary(modelo_pot)
##
## Call:
## lm(formula = log(y) ~ log(x))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.62165 -0.23170 0.02986 0.26435 0.45103
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.09939 0.11687 35.076 <2e-16 ***
## log(x) -0.01171 0.01393 -0.841 0.401
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2992 on 848 degrees of freedom
## Multiple R-squared: 0.0008328, Adjusted R-squared: -0.0003454
## F-statistic: 0.7068 on 1 and 848 DF, p-value: 0.4007
a <- exp(coef(modelo_pot)[1])
b <- coef(modelo_pot)[2]
plot(x, y, col = "orange", pch = 16,
main = "Residuos vs Reciclaje (Potencial)",
xlab = "Residuos Generados (Tons/día)",
ylab = "Tasa de Reciclaje (%)")
curve(a * x^b, add = TRUE, col = "blue", lwd = 2)

r <- cor(log(x), log(y))
r2 <- r^2 * 100
cat("R² potencial:", round(r2, 2), "%\n")
## R² potencial: 0.08 %
# ==============================
# REGRESIÓN LOGARÍTMICA: Eficiencia vs Reciclaje
# ==============================
x <- log(Eficiencia)
y <- Reciclaje
modelo_log <- lm(y ~ x)
summary(modelo_log)
##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -27.9399 -13.9399 -0.8248 13.4927 28.7046
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 61.758 4.590 13.456 <2e-16 ***
## x -2.372 2.309 -1.028 0.304
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.13 on 848 degrees of freedom
## Multiple R-squared: 0.001244, Adjusted R-squared: 6.589e-05
## F-statistic: 1.056 on 1 and 848 DF, p-value: 0.3044
a <- coef(modelo_log)[1]
b <- coef(modelo_log)[2]
plot(Eficiencia, Reciclaje, col = "dodgerblue3", pch = 16,
main = "Eficiencia vs Reciclaje (Logarítmica)",
xlab = "Puntaje de Eficiencia Municipal",
ylab = "Tasa de Reciclaje (%)")
curve(a + b * log(x), add = TRUE, col = "red", lwd = 2)

r <- cor(x, y)
r2 <- r^2 * 100
cat("R² logarítmico:", round(r2, 2), "%\n")
## R² logarítmico: 0.12 %
# REGRESIÓN POLINÓMICA: Densidad poblacional vs Tasa de reciclaje
# ==============================
# Definir variables
x4 <- datos$Population.Density..People.km..
y4 <- datos$Recycling.Rate....
# Crear términos polinómicos
x4_2 <- x4^2
x4_3 <- x4^3
# Ajustar el modelo de regresión polinómica de tercer grado
modelo_poly <- lm(y4 ~ x4 + x4_2 + x4_3)
summary(modelo_poly)
##
## Call:
## lm(formula = y4 ~ x4 + x4_2 + x4_3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.7338 -13.9866 -0.6589 13.9728 28.9919
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.876e+01 3.810e+00 15.424 <2e-16 ***
## x4 7.570e-05 1.141e-03 0.066 0.947
## x4_2 -3.186e-08 9.682e-08 -0.329 0.742
## x4_3 1.067e-12 2.426e-12 0.440 0.660
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.13 on 846 degrees of freedom
## Multiple R-squared: 0.003411, Adjusted R-squared: -0.000123
## F-statistic: 0.9652 on 3 and 846 DF, p-value: 0.4085
# Extraer coeficientes
a <- coef(modelo_poly)[1]
b <- coef(modelo_poly)[2]
c <- coef(modelo_poly)[3]
d <- coef(modelo_poly)[4]
# Graficar con curva polinómica ajustada
plot(x4, y4,
xlab = "Densidad Poblacional (hab/km²)",
ylab = "Tasa de Reciclaje (%)",
main = "Regresión Polinómica",
col = "tomato", pch = 16)
curve(a + b*x + c*x^2 + d*x^3,
from = min(x4), to = max(x4),
add = TRUE, col = "blue", lwd = 2)

# ==============================
# REGRESIÓN MÚLTIPLE
# ==============================
modelo_multi <- lm(Reciclaje ~ Residuos + Costo + Eficiencia + Campanas)
summary(modelo_multi)
##
## Call:
## lm(formula = Reciclaje ~ Residuos + Costo + Eficiencia + Campanas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.439 -13.806 -0.819 13.954 29.390
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.083e+01 3.080e+00 19.747 <2e-16 ***
## Residuos -1.902e-04 1.991e-04 -0.955 0.340
## Costo -5.265e-05 4.358e-04 -0.121 0.904
## Eficiencia -2.944e-01 3.229e-01 -0.912 0.362
## Campanas -4.313e-02 9.137e-02 -0.472 0.637
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.15 on 845 degrees of freedom
## Multiple R-squared: 0.002406, Adjusted R-squared: -0.002316
## F-statistic: 0.5096 on 4 and 845 DF, p-value: 0.7287
# VIF para verificar multicolinealidad
vif(modelo_multi)
## Residuos Costo Eficiencia Campanas
## 1.002226 1.007294 1.006724 1.001628
# Gráfico 3D
scatterplot3d(Eficiencia, Campanas, Reciclaje,
main = "Reciclaje vs Eficiencia y Campañas",
xlab = "Eficiencia",
ylab = "Campañas",
zlab = "Reciclaje (%)",
color = "darkblue", pch = 16, angle = 35)

# ==============================
# CONCLUSIONES
# ==============================
# - Las ciudades con mayor tasa de reciclaje tienden a tener más campañas y mejor eficiencia.
# - El costo tiene una relación exponencial: a mayor costo, menor reciclaje.
# - El modelo múltiple permite estimar la tasa de reciclaje con base en residuos, eficiencia, costo y campañas.
# - El modelo presenta un buen ajuste (ver R² ajustado) y no hay alta colinealidad entre predictores.
# ============================================================
# Alternativas al modelo clásico: enfoque logístico y clustering
# Justificación:
# Dado que los modelos lineales, exponenciales, polinómicos y múltiples
# no arrojaron resultados estadísticamente significativos (R² < 1% y p-valores > 0.05),
# se plantea un nuevo enfoque para identificar patrones y perfiles más útiles
# en torno al reciclaje urbano.
# 1. MODELO LOGÍSTICO: Clasificación binaria del reciclaje
# Creamos una variable binaria: 1 = alta tasa de reciclaje (≥ 60%), 0 = baja
datos$AltaReciclaje <- ifelse(datos$Recycling.Rate.... >= 60, 1, 0)
# Modelo logístico usando predictores relevantes
modelo_logistico <- glm(AltaReciclaje ~ Waste.Generated..Tons.Day. +
Cost.of.Waste.Management....Ton. +
Municipal.Efficiency.Score..1.10. +
Awareness.Campaigns.Count,
data = datos,
family = "binomial")
summary(modelo_logistico)
##
## Call:
## glm(formula = AltaReciclaje ~ Waste.Generated..Tons.Day. + Cost.of.Waste.Management....Ton. +
## Municipal.Efficiency.Score..1.10. + Awareness.Campaigns.Count,
## family = "binomial", data = datos)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.204e-01 3.835e-01 0.314 0.754
## Waste.Generated..Tons.Day. -3.118e-06 2.480e-05 -0.126 0.900
## Cost.of.Waste.Management....Ton. 1.404e-05 5.429e-05 0.259 0.796
## Municipal.Efficiency.Score..1.10. -3.364e-02 4.024e-02 -0.836 0.403
## Awareness.Campaigns.Count -9.361e-03 1.139e-02 -0.822 0.411
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1170.0 on 849 degrees of freedom
## Residual deviance: 1168.5 on 845 degrees of freedom
## AIC: 1178.5
##
## Number of Fisher Scoring iterations: 3
# Interpretación esperada:
# - Si algún coeficiente tiene p-valor < 0.05, indica que influye significativamente
# en la probabilidad de que una ciudad tenga alta tasa de reciclaje.
# - La regresión logística no requiere que la relación sea lineal, lo que la hace ideal
# en este contexto.
# ============================================================
# 2. AGRUPAMIENTO (CLUSTERING): Identificación de perfiles de ciudad
# ============================================================
# Seleccionar solo variables numéricas relevantes
variables_cluster <- datos %>%
select(Waste.Generated..Tons.Day., Cost.of.Waste.Management....Ton.,
Municipal.Efficiency.Score..1.10., Awareness.Campaigns.Count,
Recycling.Rate....)
# Escalar variables (muy importante para clustering)
variables_cluster_scaled <- scale(variables_cluster)
# Aplicamos K-means con 3 grupos como propuesta inicial
set.seed(123)
kmeans_result <- kmeans(variables_cluster_scaled, centers = 3)
# Agregamos la clasificación al dataset
datos$GrupoResiduo <- kmeans_result$cluster
# Visualización de perfiles por grupo
library(ggplot2)
ggplot(datos, aes(x = as.factor(GrupoResiduo), y = Recycling.Rate....)) +
geom_boxplot(fill = "skyblue") +
labs(title = "Tasa de Reciclaje por Grupo de Manejo de Residuos",
x = "Grupo Identificado",
y = "Tasa de Reciclaje (%)")

# Interpretación:
# Los grupos representan perfiles de ciudad con manejo de residuos similar.
# Podemos identificar si existe un grupo que se asocie consistentemente
# con tasas más altas o más bajas de reciclaje.