Variable Original: NOx total emissions (tons) by state

Nombre Variable: EMIS_NOX

Tipo: Cuantitativa Continua


0.- Carga de Librerías

library(dplyr)
library(gt)
library(e1071)

1.- Carga de Datos

datos <- read.csv("~/Estudio/TERCER SEMESTRE/Estadistica/Dataset.csv",
                   sep = ";", stringsAsFactors = FALSE)

2.- Selección de variable

EMIS_NOX <- as.numeric(gsub(",", ".", gsub("\\.", "", datos$NOx.total.emissions..tons..by.state)))
## Warning: NAs introducidos por coerción
EMIS_NOX <- EMIS_NOX[!is.na(EMIS_NOX)]
n <- length(EMIS_NOX)

3.- Frecuencia

min_nox <- min(EMIS_NOX)
max_nox <- max(EMIS_NOX)
R <- max_nox - min_nox

# Número de intervalos mediante la Regla de Sturges
k_detallado <- ceiling(1 + 3.322 * log10(n))

# Amplitud de clase
A <- R / k_detallado

cat("Número de intervalos (k):", k_detallado, "\n")
## Número de intervalos (k): 13
# Generación de límites de intervalo
Li <- seq(from = min_nox, to = max_nox - A, by = A)
Ls <- c(seq(from = min_nox + A, to = max_nox - A, by = A), max_nox)

# Marcas de clase (MC)
MC <- round((Li + Ls) / 2, 2)

# Frecuencias absolutas (ni)
ni <- numeric(length(Li))
for (i in 1:length(Li)) {
  if (i < length(Li)) {
    # Intervalo abierto por la derecha: [Li, Ls)
    ni[i] <- sum(EMIS_NOX >= Li[i] & EMIS_NOX < Ls[i])
  } else {
    # Último intervalo cerrado: [Li, Ls]
    ni[i] <- sum(EMIS_NOX >= Li[i] & EMIS_NOX <= 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)))

# Formatear la columna Intervalo
Intervalo <- paste0("[", round(Li, 2), " - ", round(Ls, 2), ")")
Intervalo[length(Intervalo)] <- paste0("[", round(Li[length(Li)], 2), " - ",
                                        round(Ls[length(Ls)], 2), "]")

# Vector completo de breaks (incluye el límite superior del último
# intervalo) para usar directamente en hist()
breaks_hist <- c(Li, max_nox)

4.- Tabla de distribución de frecuencia

Tabla con regla de Sturges

TDF_nox <- data.frame(
  Intervalo = Intervalo,
  MC = MC,
  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)
)

totales <- data.frame(
  Intervalo = "Totales", MC = "-", ni = sum(ni), hi = round(sum(hi), 2),
  Ni_ascendente = "-", Ni_descendente = "-",
  Hi_ascendente = "-", Hi_descendente = "-"
)

TDF_nox_completa <- rbind(TDF_nox, totales)

TDF_nox_completa %>%
  gt() %>%
  tab_header(
    title    = md("Tabla Nro. 1"),
    subtitle = md("Distribución de frecuencia de Emisiones de NOx (EMIS_NOX) para el análisis de la actividad minera y emisión de gases en Estados Unidos.")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Intervalo == "Totales")
  ) %>%
  tab_source_note(source_note = md("Autor: Luis Cruz"))
Tabla Nro. 1
Distribución de frecuencia de Emisiones de NOx (EMIS_NOX) para el análisis de la actividad minera y emisión de gases en Estados Unidos.
Intervalo MC ni hi Ni_ascendente Ni_descendente Hi_ascendente Hi_descendente
[157303 - 7002906.23) 3580104.62 316 10.56 316 2993 10.56 100
[7002906.23 - 13848509.46) 10425707.85 126 4.21 442 2677 14.77 89.44
[13848509.46 - 20694112.69) 17271311.08 387 12.93 829 2551 27.7 85.23
[20694112.69 - 27539715.92) 24116914.31 259 8.65 1088 2164 36.35 72.3
[27539715.92 - 34385319.15) 30962517.54 155 5.18 1243 1905 41.53 63.65
[34385319.15 - 41230922.38) 37808120.77 618 20.65 1861 1750 62.18 58.47
[41230922.38 - 48076525.62) 44653724 911 30.44 2772 1132 92.62 37.82
[48076525.62 - 54922128.85) 51499327.23 159 5.31 2931 221 97.93 7.38
[54922128.85 - 61767732.08) 58344930.46 0 0.00 2931 62 97.93 2.07
[61767732.08 - 68613335.31) 65190533.69 0 0.00 2931 62 97.93 2.07
[68613335.31 - 75458938.54) 72036136.92 0 0.00 2931 62 97.93 2.07
[75458938.54 - 82304541.77) 78881740.15 0 0.00 2931 62 97.93 2.07
[82304541.77 - 89150145] 85727343.38 62 2.07 2993 62 100 2.07
Totales - 2993 100.00 - - - -
Autor: Luis Cruz

Tabla de intervalos reducidos

brks2 <- pretty(EMIS_NOX, n = 10)
Li2   <- brks2[-length(brks2)]
Ls2   <- brks2[-1]
MC2   <- (Li2 + Ls2) / 2

ni2 <- numeric(length(Li2))
for (i in 1:length(Li2)) {
  if (i < length(Li2)) {
    ni2[i] <- sum(EMIS_NOX >= Li2[i] & EMIS_NOX < Ls2[i])
  } else {
    ni2[i] <- sum(EMIS_NOX >= Li2[i] & EMIS_NOX <= Ls2[i])
  }
}

hi2      <- (ni2 / n) * 100
Ni2_asc  <- cumsum(ni2)
Ni2_desc <- rev(cumsum(rev(ni2)))
Hi2_asc  <- cumsum(hi2)
Hi2_desc <- rev(cumsum(rev(hi2)))

Intervalo2 <- paste0("[", format(round(Li2, 0), big.mark = ","), " - ",
                          format(round(Ls2, 0), big.mark = ","), ")")
Intervalo2[length(Intervalo2)] <- paste0(
  "[", format(round(Li2[length(Li2)], 0), big.mark = ","), " - ",
       format(round(Ls2[length(Ls2)], 0), big.mark = ","), "]")

TDF_nox_10 <- data.frame(
  Intervalo = Intervalo2,
  MC = round(MC2, 0),
  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)
)

totales2 <- data.frame(
  Intervalo = "Totales", MC = "-", ni = sum(ni2), hi = round(sum(hi2), 2),
  Ni_ascendente = "-", Ni_descendente = "-",
  Hi_ascendente = "-", Hi_descendente = "-"
)

TDF_nox_10_completa <- rbind(TDF_nox_10, totales2)

TDF_nox_10_completa %>%
  gt() %>%
  tab_header(
    title    = md("Tabla Nro. 2"),
    subtitle = md("Distribución de frecuencia de Emisiones de NOx (EMIS_NOX), intervalos reducidos.")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Intervalo == "Totales")
  ) %>%
  tab_source_note(source_note = md("Autor: Luis Cruz"))
Tabla Nro. 2
Distribución de frecuencia de Emisiones de NOx (EMIS_NOX), intervalos reducidos.
Intervalo MC ni hi Ni_ascendente Ni_descendente Hi_ascendente Hi_descendente
[0e+00 - 1e+07) 5e+06 387 12.93 387 2993 12.93 100
[1e+07 - 2e+07) 1.5e+07 442 14.77 829 2606 27.7 87.07
[2e+07 - 3e+07) 2.5e+07 330 11.03 1159 2164 38.72 72.3
[3e+07 - 4e+07) 3.5e+07 291 9.72 1450 1834 48.45 61.28
[4e+07 - 5e+07) 4.5e+07 1322 44.17 2772 1543 92.62 51.55
[5e+07 - 6e+07) 5.5e+07 159 5.31 2931 221 97.93 7.38
[6e+07 - 7e+07) 6.5e+07 0 0.00 2931 62 97.93 2.07
[7e+07 - 8e+07) 7.5e+07 0 0.00 2931 62 97.93 2.07
[8e+07 - 9e+07] 8.5e+07 62 2.07 2993 62 100 2.07
Totales - 2993 100.00 - - - -
Autor: Luis Cruz

5.- Gráficos de distribución de frecuencia

Histogramas de cantidad

Histograma general

par(mar = c(5, 5, 4, 2))
hist(EMIS_NOX, breaks = breaks_hist,
     main = "Gráfica Nro. 1\nDistribución de EMIS_NOX en instalaciones\nmineras de Estados Unidos",
     xlab = "Emisiones de NOx (toneladas)", ylab = "Cantidad",
     col = "#ED7D31", border = "white",
     cex.main = 0.9)

Histograma con relación al todo

par(mar = c(5, 5, 4, 2))
hist(EMIS_NOX, breaks = breaks_hist,
     main = "Gráfica Nro. 2\nDistribución de EMIS_NOX en instalaciones\nmineras de Estados Unidos",
     xlab = "Emisiones de NOx (toneladas)", ylab = "Cantidad",
     col = "#ED7D31", border = "white",
     ylim = c(0, n),
     cex.main = 0.9)

Histogramas Porcentuales

Histograma porcentual general

par(mar = c(5, 5, 4, 2))
barplot(hi2,
        names.arg = round(MC2, 0),
        main = "Gráfica Nro. 3\nDistribución porcentual de EMIS_NOX en instalaciones\nmineras de Estados Unidos",
        xlab = "Emisiones de NOx (toneladas)", ylab = "Porcentaje (%)",
        col = "#F9C49A", border = "black",
        las = 2, cex.names = 0.7,
        ylim = c(0, max(hi2) + 5))

Histograma porcentual con relación al todo

par(mar = c(5, 5, 4, 2))
barplot(hi2,
        names.arg = round(MC2, 0),
        main = "Gráfica Nro. 4\nDistribución porcentual de EMIS_NOX en instalaciones\nmineras de Estados Unidos",
        xlab = "Emisiones de NOx (toneladas)", ylab = "Porcentaje (%)",
        col = "#F9C49A", border = "black",
        las = 2, cex.names = 0.7,
        ylim = c(0, 100))

Diagrama de caja y bigotes

options(scipen = 999)
boxplot(EMIS_NOX,
        horizontal = TRUE,
        main = "Gráfica Nro. 5\nDistribución de EMIS_NOX en instalaciones\nmineras de Estados Unidos",
        xlab = "Emisiones de NOx (toneladas)",
        col = "#F9C49A",
        border = "#843D0A",
        pch = 1)

Diagrama de Ojivas

par(mar = c(5, 5, 4, 2))
plot(MC2, Ni2_asc,
     type = "b", pch = 16, lwd = 2, col = "#ED7D31",
     main = "Gráfica Nro. 6\nOjiva ascendente y descendente de\nEMIS_NOX",
     xlab = "Emisiones de NOx (toneladas)", ylab = "Cantidad",
     ylim = c(0, n))
lines(MC2, Ni2_desc, type = "b", pch = 16, lwd = 1, col = "black")
legend("right", legend = c("Ascendente","Descendente"),
       col = c("#ED7D31","black"), lwd = 2, pch = 16, bty = "n", cex = 0.8)
grid()
box()

par(mar = c(5, 5, 4, 2))
plot(MC2, Hi2_asc,
     type = "b", pch = 16, lwd = 2, col = "#ED7D31",
     main = "Gráfica Nro. 7\nOjiva porcentual ascendente y descendente de\nEMIS_NOX",
     xlab = "Emisiones de NOx (toneladas)", ylab = "Porcentaje (%)",
     ylim = c(0, 100))
lines(MC2, Hi2_desc, type = "b", pch = 16, lwd = 1, col = "black")
legend("right", legend = c("Ascendente","Descendente"),
       col = c("#ED7D31","black"), lwd = 2, pch = 16, bty = "n", cex = 0.8)
grid()
box()

6.- Indicadores Estadísticos

X  <- mean(EMIS_NOX)
Me <- median(EMIS_NOX)

# Moda: marca de clase del intervalo con mayor ni (tabla reducida)
moda_idx <- which.max(ni2)
Mo <- round(MC2[moda_idx], 2)

desv <- sd(EMIS_NOX)
V    <- var(EMIS_NOX)
CV   <- round((desv / X) * 100, 2)

As <- skewness(EMIS_NOX, type = 2)
K  <- kurtosis(EMIS_NOX, type = 2)

# Outliers (regla de Tukey, 1.5*IQR) — se usan en la conclusión
q1 <- quantile(EMIS_NOX, 0.25)
q3 <- quantile(EMIS_NOX, 0.75)
iqr_val <- q3 - q1
lim_inf <- q1 - 1.5 * iqr_val
lim_sup <- q3 + 1.5 * iqr_val
outliers <- EMIS_NOX[EMIS_NOX < lim_inf | EMIS_NOX > lim_sup]
n_outliers <- length(outliers)
porc_outliers <- round(n_outliers / n * 100, 2)

Tabla_indicadores <- data.frame(
  Variable = "EMIS_NOX",
  Rango    = paste0("[", round(min_nox, 2), " - ", round(max_nox, 2), "]"),
  Media    = round(X, 2),
  Mediana  = round(Me, 2),
  Moda     = Mo,
  DesvEst  = round(desv, 2),
  CV       = CV,
  Asimetria = round(As, 4),
  Curtosis  = round(K, 4)
)

Tabla_indicadores %>%
  gt() %>%
  cols_label(
    Variable = "Variable", Rango = "Rango",
    Media = "Media (X)", Mediana = "Mediana (Me)", Moda = "Moda (Mo)",
    DesvEst = "Desv. Est. (sd)", CV = "CV (%)",
    Asimetria = "Asimetría (As)", Curtosis = "Curtosis (K)"
  ) %>%
  tab_header(
    title    = md("Tabla Nro. 3"),
    subtitle = md("Indicadores Estadísticos de EMIS_NOX para el análisis de la actividad minera y emisión de gases.")
  ) %>%
  tab_spanner(label = "Tendencia Central", columns = c(Media, Mediana, Moda)) %>%
  tab_spanner(label = "Dispersión", columns = c(DesvEst, CV)) %>%
  tab_spanner(label = "Forma", columns = c(Asimetria, Curtosis)) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_source_note(source_note = md("Autor: Luis Cruz"))
Tabla Nro. 3
Indicadores Estadísticos de EMIS_NOX para el análisis de la actividad minera y emisión de gases.
Variable Rango
Tendencia Central
Dispersión
Forma
Media (X) Mediana (Me) Moda (Mo) Desv. Est. (sd) CV (%) Asimetría (As) Curtosis (K)
EMIS_NOX [157303 - 89150145] 33245382 40103865 45000000 18082415 54.39 0.0438 0.2982
Autor: Luis Cruz

7.- Conclusión

En conclusión:

La variable EMIS_NOX fluctúa entre un mínimo de 157303 y un máximo de 89150145 toneladas, con una media de 33245381.97 y una desviación estándar de 18082415.22. Debido a un coeficiente de variación del 54.39%, se concluye que es un conjunto de valores heterogéneo entre estados, con una distribución de asimetría positiva (0.0438). Se han detectado 62 valores atípicos (2.07% del total), correspondientes a los estados con mayor concentración de actividad minera.