# Tema: Estadística Descriptiva
# Variable cualitativa nominal: Condado (County)
# Variable original: County
# Autor: Grupo 5
# Fecha: 12/11/2026

1. Librerías

La carga de librerías es necesaria para leer los datos, armar las tablas y hacer las gráficas.

# Solo la primera vez (quitar el # y correr):
# install.packages(c("readxl", "dplyr", "knitr", "kableExtra"))
library(readxl)
library(dplyr)
library(knitr)
library(kableExtra)

2. Leer Datos

Se importa el archivo Condados_filtrados_derrame_petroleo.csv, que contiene los registros de derrames de petróleo del proyecto. El archivo debe estar en la misma carpeta que este documento.

datos <- read.csv("Condados_filtrados_derrame_petroleo.csv",
                  fileEncoding = "UTF-8-BOM", stringsAsFactors = FALSE)

3. Selección de Variable

La variable original es County: el condado (o región) donde se registró el derrame de petróleo. Es una variable cualitativa nominal, porque sus categorías son nombres sin un orden natural.

Depuración. Se eliminan los espacios sobrantes y las celdas vacías se marcan como dato faltante (NA), para excluirlas de la tabla.

variable <- trimws(as.character(datos$County))
variable[variable == ""] <- NA                       # celdas vacías = dato faltante

n_registros    <- length(variable)                   # registros del archivo
n_faltantes    <- sum(is.na(variable))               # registros sin dato
n_cat_original <- length(unique(na.omit(variable)))  # categorías antes de agrupar

Agrupación en regiones. La variable original tiene 88 categorías (los 62 condados de Nueva York, más registros de otros estados, de Canadá y de reservas indígenas). Una tabla con tantas filas es muy larga, y el profesor indicó que no debe pasar de 12 categorías. Por eso, igual que se agrupan las 24 provincias del Ecuador en regiones, los condados se agrupan en las 9 regiones del Departamento de Conservación Ambiental (DEC) de Nueva York, y todo lo que no es un condado de Nueva York va en una categoría Otros. Así quedan 10 categorías.

r1 <- c("Nassau", "Suffolk")
r2 <- c("Bronx", "Kings", "New York", "Queens", "Richmond")
r3 <- c("Dutchess", "Orange", "Putnam", "Rockland", "Sullivan", "Ulster", "Westchester")
r4 <- c("Albany", "Columbia", "Delaware", "Greene", "Montgomery", "Otsego", "Rensselaer", "Schenectady", "Schoharie")
r5 <- c("Clinton", "Essex", "Franklin", "Fulton", "Hamilton", "Saratoga", "Warren", "Washington")
r6 <- c("Herkimer", "Jefferson", "Lewis", "Oneida", "St Lawrence")
r7 <- c("Broome", "Cayuga", "Chenango", "Cortland", "Madison", "Onondaga", "Oswego", "Tioga", "Tompkins")
r8 <- c("Chemung", "Genesee", "Livingston", "Monroe", "Ontario", "Orleans", "Schuyler", "Seneca", "Steuben", "Wayne", "Yates")
r9 <- c("Allegany", "Cattaraugus", "Chautauqua", "Erie", "Niagara", "Wyoming")

variable <- case_when(
  is.na(variable)    ~ NA_character_,
  variable %in% r1   ~ "Región 1 - Long Island",
  variable %in% r2   ~ "Región 2 - Ciudad de Nueva York",
  variable %in% r3   ~ "Región 3 - Valle del Hudson",
  variable %in% r4   ~ "Región 4 - Región Capital",
  variable %in% r5   ~ "Región 5 - Adirondack",
  variable %in% r6   ~ "Región 6 - Norte-oeste",
  variable %in% r7   ~ "Región 7 - Centro de Nueva York",
  variable %in% r8   ~ "Región 8 - Finger Lakes",
  variable %in% r9   ~ "Región 9 - Oeste de Nueva York",
  TRUE               ~ "Otros (otros estados, Canadá y reservas)"
)
resumen <- data.frame(Registros = n_registros, Faltantes = n_faltantes,
                      Válidos = n_registros - n_faltantes, Categorías = length(unique(na.omit(variable))))
kable(resumen, align = "c", format.args = list(big.mark = ","), caption = "Resumen de depuración") %>%
  kable_styling(full_width = FALSE, position = "center") %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50")
Resumen de depuración
Registros Faltantes Válidos Categorías
540,579 0 540,579 10

4. Tabla de distribución de frecuencia

Se calcula la frecuencia absoluta ni (cantidad de registros de cada categoría) y la frecuencia relativa hi = ni / n, donde n es el tamaño muestral (registros válidos). Las categorías se ordenan de mayor a menor frecuencia.

variable   <- variable[!is.na(variable)]             # solo datos válidos
Tabla_frec <- sort(table(variable), decreasing = TRUE)

categorias <- names(Tabla_frec)                      # x_i
ni         <- as.vector(Tabla_frec)                  # frecuencia absoluta
n          <- sum(ni)                                # tamaño muestral
hi         <- ni / n                                 # frecuencia relativa (fracción)
hp         <- hi * 100                               # frecuencia relativa (%)

Resume cuántos registros hay en cada categoría de la variable. Las columnas son: i (número de orden), xi (categoría), ni (frecuencia absoluta), hi (frecuencia relativa, con 4 decimales) y hi (%) (porcentaje, con 2 decimales). La fila Total coincide con el tamaño muestral y hi suma 1.0000 (100.00 %).

TDF <- data.frame(
  i   = c(seq_along(ni), ""),
  xi  = c(htmltools::htmlEscape(categorias), "Total"),
  ni  = c(formatC(ni, format = "d", big.mark = ","), formatC(n, format = "d", big.mark = ",")),
  hi  = c(formatC(hi, format = "f", digits = 4), formatC(sum(hi), format = "f", digits = 4)),
  pct = c(formatC(hp, format = "f", digits = 2), formatC(sum(hp), format = "f", digits = 2))
)

kable(TDF, align = "c", row.names = FALSE, escape = FALSE,
      col.names = c("i", "x<sub>i</sub>", "n<sub>i</sub>", "h<sub>i</sub>", "h<sub>i</sub> (%)"),
      caption = "Tabla Nro. 1: Distribución de frecuencia de la variable Condado (County)") %>%
  kable_styling(full_width = TRUE, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  row_spec(nrow(TDF), bold = TRUE, background = "#EAEDED") %>%
  footnote(general = "Fuente: Datasets_Completo_Derrame_de_petroleo_Grupo_5.xlsx (registros con dato válido)",
           general_title = "Grupo 5: ", footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla Nro. 1: Distribución de frecuencia de la variable Condado (County)
i xi ni hi hi (%)
1 Región 3 - Valle del Hudson 115,142 0.2130 21.30
2 Región 2 - Ciudad de Nueva York 95,633 0.1769 17.69
3 Región 1 - Long Island 94,026 0.1739 17.39
4 Región 4 - Región Capital 45,696 0.0845 8.45
5 Región 8 - Finger Lakes 45,313 0.0838 8.38
6 Región 9 - Oeste de Nueva York 43,269 0.0800 8.00
7 Región 7 - Centro de Nueva York 38,983 0.0721 7.21
8 Región 5 - Adirondack 35,241 0.0652 6.52
9 Región 6 - Norte-oeste 26,762 0.0495 4.95
10 Otros (otros estados, Canadá y reservas) 514 0.0010 0.10
Total 540,579 1.0000 100.00
Grupo 5: Fuente: Datasets_Completo_Derrame_de_petroleo_Grupo_5.xlsx (registros con dato válido)

5. Gráficas

Las gráficas siguen el formato del ejemplo de la clase. En cada diagrama de barras hay una versión local (la escala se ajusta a los datos) y una global (la escala llega hasta el tamaño muestral o hasta el 100 %). Cada categoría tiene su propio color pastel, el mismo en todas las gráficas; el máximo se marca con borde grueso y el mínimo con borde punteado. El eje vertical usa múltiplos de 5 y de 10.

# Datos comunes a las gráficas
colores    <- hcl.colors(12, "Pastel 1")[seq_along(ni)]            # un color pastel por categoría
margen_inf <- min(14, 0.5 + max(nchar(categorias)) * 0.38) + 4    # espacio para los nombres

# Marcas del eje Y en múltiplos de 5 y de 10
pasos   <- c(5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000)
paso_ni <- pasos[which(max(ni) / pasos <= 10)[1]]    # cantidad, escala local
paso_n  <- pasos[which(n / pasos <= 10)[1]]          # cantidad, escala global
paso_hp <- pasos[which(max(hp) / pasos <= 10)[1]]    # porcentaje, escala local

5.1 Diagrama de barras de cantidad

Gráfica local. Muestra cuántos registros hay en cada categoría. El máximo es Región 3 - Valle del Hudson, con 115,142 registros (21.30 %), y el mínimo es Otros (otros estados, Canadá y reservas), con 514 registros (0.10 %).

par(mar = c(margen_inf, 6.5, 6, 2))
tope <- ceiling(max(ni) * 1.3 / paso_ni) * paso_ni
b <- barplot(ni, names.arg = categorias, col = colores, border = "black",
             main = "Gráfica N°1: Distribución de la frecuencia absoluta\nde la variable Condado (County)",
             xlab = "", ylab = "", ylim = c(0, tope), yaxt = "n",
             las = 2, cex.names = 0.8, cex.main = 0.95)
axis(2, at = seq(0, tope, by = paso_ni), las = 1,
     labels = formatC(seq(0, tope, by = paso_ni), format = "d", big.mark = ","))
mtext(expression("Cantidad (" * n[i] * ")"), side = 2, line = 5)
mtext("Categoría", side = 1, line = margen_inf - 1.8)
rect(b[which.max(ni)] - 0.5, 0, b[which.max(ni)] + 0.5, max(ni), lwd = 3)            # máximo
rect(b[which.min(ni)] - 0.5, 0, b[which.min(ni)] + 0.5, min(ni), lwd = 3, lty = 2)   # mínimo
text(b, ni, labels = formatC(ni, format = "d", big.mark = ","), pos = 3, cex = 0.8, font = 2, xpd = NA)
legend("topright", legend = c("Máximo (borde grueso)", "Mínimo (borde punteado)"),
       lwd = 3, lty = c(1, 2), bty = "n", cex = 0.8, seg.len = 1.5)

Gráfica global. Muestra los mismos datos con la escala llegando hasta el tamaño muestral (540,579 registros), para comparar cada barra con el total: el máximo (Región 3 - Valle del Hudson) alcanza 21.30 % del total y el mínimo (Otros (otros estados, Canadá y reservas)), 0.10 %.

par(mar = c(margen_inf, 6.5, 6, 2))
b <- barplot(ni, names.arg = categorias, col = colores, border = "black",
             main = "Gráfica N°2: Distribución general de la frecuencia absoluta\nde la variable Condado (County) (con relación al total)",
             xlab = "", ylab = "", ylim = c(0, n), yaxt = "n",
             las = 2, cex.names = 0.8, cex.main = 0.95)
axis(2, at = seq(0, n, by = paso_n), las = 1,
     labels = formatC(seq(0, n, by = paso_n), format = "d", big.mark = ","))
mtext(expression("Cantidad (" * n[i] * ")"), side = 2, line = 5)
mtext("Categoría", side = 1, line = margen_inf - 1.8)
rect(b[which.max(ni)] - 0.5, 0, b[which.max(ni)] + 0.5, max(ni), lwd = 3)
rect(b[which.min(ni)] - 0.5, 0, b[which.min(ni)] + 0.5, min(ni), lwd = 3, lty = 2)
text(b, ni, labels = formatC(ni, format = "d", big.mark = ","), pos = 3, cex = 0.8, font = 2, xpd = NA)
legend("topright", legend = c("Máximo (borde grueso)", "Mínimo (borde punteado)"),
       lwd = 3, lty = c(1, 2), bty = "n", cex = 0.8, seg.len = 1.5)

5.2 Diagrama de barras porcentuales

Gráfica local. Muestra el porcentaje de cada categoría con la escala ajustada a los datos. El máximo es Región 3 - Valle del Hudson (21.30 %) y el mínimo es Otros (otros estados, Canadá y reservas) (0.10 %).

par(mar = c(margen_inf, 6.5, 6, 2))
tope <- ceiling(max(hp) * 1.3 / paso_hp) * paso_hp
b <- barplot(hp, names.arg = categorias, col = colores, border = "black",
             main = "Gráfica N°3: Distribución de la frecuencia relativa (porcentaje)\nde la variable Condado (County)",
             xlab = "", ylab = "", ylim = c(0, tope), yaxt = "n",
             las = 2, cex.names = 0.8, cex.main = 0.95)
axis(2, at = seq(0, tope, by = paso_hp), labels = paste0(seq(0, tope, by = paso_hp), "%"), las = 1)
mtext(expression("Porcentaje (" * h[i] * " %)"), side = 2, line = 4)
mtext("Categoría", side = 1, line = margen_inf - 1.8)
rect(b[which.max(hp)] - 0.5, 0, b[which.max(hp)] + 0.5, max(hp), lwd = 3)
rect(b[which.min(hp)] - 0.5, 0, b[which.min(hp)] + 0.5, min(hp), lwd = 3, lty = 2)
text(b, hp, labels = paste0(formatC(hp, format = "f", digits = 2), "%"), pos = 3, cex = 0.8, font = 2, xpd = NA)
legend("topright", legend = c("Máximo (borde grueso)", "Mínimo (borde punteado)"),
       lwd = 3, lty = c(1, 2), bty = "n", cex = 0.8, seg.len = 1.5)

Gráfica global. Muestra el porcentaje con la escala completa, de 0 % a 100 %, para comparar cada categoría con el total. Se ve que el máximo (Región 3 - Valle del Hudson) ocupa 21.30 % del total.

par(mar = c(margen_inf, 6.5, 6, 2))
b <- barplot(hp, names.arg = categorias, col = colores, border = "black",
             main = "Gráfica N°4: Distribución general de la frecuencia relativa (porcentaje)\nde la variable Condado (County) (con relación al 100 %)",
             xlab = "", ylab = "", ylim = c(0, 100), yaxt = "n",
             las = 2, cex.names = 0.8, cex.main = 0.95)
axis(2, at = seq(0, 100, by = 10), labels = paste0(seq(0, 100, by = 10), "%"), las = 1)
mtext(expression("Porcentaje (" * h[i] * " %)"), side = 2, line = 4)
mtext("Categoría", side = 1, line = margen_inf - 1.8)
rect(b[which.max(hp)] - 0.5, 0, b[which.max(hp)] + 0.5, max(hp), lwd = 3)
rect(b[which.min(hp)] - 0.5, 0, b[which.min(hp)] + 0.5, min(hp), lwd = 3, lty = 2)
text(b, hp, labels = paste0(formatC(hp, format = "f", digits = 2), "%"), pos = 3, cex = 0.8, font = 2, xpd = NA)
legend("topright", legend = c("Máximo (borde grueso)", "Mínimo (borde punteado)"),
       lwd = 3, lty = c(1, 2), bty = "n", cex = 0.8, seg.len = 1.5)

5.3 Diagrama Circular

Muestra la participación porcentual de cada categoría dentro del total. La porción más grande corresponde a Región 3 - Valle del Hudson (21.30 %). Los porcentajes se escriben fuera del círculo, unidos a su porción por una línea y separados para que no se encimen; la leyenda de la derecha indica qué categoría corresponde a cada color.

# Ángulo del centro de cada porción (desde las 12 en punto, en sentido horario)
ang <- 2 * pi * (cumsum(hi) - hi / 2)
centro <- ang

# Se separan las etiquetas que quedarían muy juntas (porciones pequeñas)
for (k in 1:300) {
  movido <- FALSE
  for (i in seq_along(ang)) {
    j     <- if (i == length(ang)) 1 else i + 1
    hueco <- ang[j] - ang[i] + if (i == length(ang)) 2 * pi else 0
    if (hueco < 0.30) {
      ang[i] <- ang[i] - (0.30 - hueco) / 2
      ang[j] <- ang[j] + (0.30 - hueco) / 2
      movido <- TRUE
    }
  }
  if (!movido) break
}

layout(matrix(1:2, nrow = 1), widths = c(1.6, 1))
par(mar = c(2, 4, 5, 4), xpd = NA)
pie(hi, labels = NA, col = colores, border = "black", lwd = 1.5, radius = 0.8, clockwise = TRUE,
    main = "Gráfica N°5\nParticipación porcentual de la variable\nCondado (County)", cex.main = 1)
segments(0.8 * sin(centro), 0.8 * cos(centro), 0.86 * sin(ang), 0.86 * cos(ang))   # líneas guía
text(0.93 * sin(ang), 0.93 * cos(ang), labels = paste0(formatC(hp, format = "f", digits = 2), " %"),
     adj = ifelse(sin(ang) < 0, 1, 0), cex = 0.9)                                    # porcentajes afuera
par(mar = c(2, 0, 5, 1))
plot.new()
legend("center", legend = categorias, fill = colores, title = "Leyenda", border = "black", bty = "o", cex = 0.85)

layout(1)

6. Indicadores Estadísticos

Como la variable es cualitativa nominal, el único indicador que se puede calcular es la moda (Mo): la categoría con mayor frecuencia. La media, la mediana, la varianza y los demás indicadores numéricos no aplican, por eso se marcan con “-”.

Mo <- categorias[which(ni == max(ni))]               # moda

tabla_indicadores <- data.frame(
  Variable = "Condado (County)", Rango = "-", X = "-", Me = "-",
  Mo = paste(Mo, collapse = " - "),
  V = "-", Sd = "-", Cv = "-", As = "-", K = "-", "Valores atípicos" = "-",
  check.names = FALSE
)

kable(tabla_indicadores, align = "c", row.names = FALSE,
      caption = "Tabla Nro. 2: Indicadores estadísticos de la variable Condado (County)") %>%
  kable_styling(full_width = TRUE, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  footnote(general = "Fuente: Datasets_Completo_Derrame_de_petroleo_Grupo_5.xlsx",
           general_title = "Grupo 5: ", footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla Nro. 2: Indicadores estadísticos de la variable Condado (County)
Variable Rango X Me Mo V Sd Cv As K Valores atípicos
Condado (County)
Región 3 - Valle del Hudson
Grupo 5: Fuente: Datasets_Completo_Derrame_de_petroleo_Grupo_5.xlsx

7. Conclusión

El valor más frecuente de la variable Condado (County) es Región 3 - Valle del Hudson, con 115,142 registros (21.30 %). El menos frecuente es Otros (otros estados, Canadá y reservas), con 514 registros (0.10 %).