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(stringr)
library(gt)

datos <- read.csv("D:/provincias_estados_unidos_2500.csv")


df_provincia <- data.frame(provincia = toupper(trimws(datos$PROVINCIA)))


df_provincia$provincia <- case_when(
  # --- ESTADOS DEL NORTE ---
  df_provincia$provincia %in% c("WASHINGTON", "OREGON", "IDAHO", "MONTANA", "NORTH DAKOTA", 
                                "SOUTH DAKOTA", "MINNESOTA", "WISCONSIN", "MICHIGAN", "WYOMING",
                                "MAINE", "NEW HAMPSHIRE", "VERMONT", "MASSACHUSETTS", 
                                "RHODE ISLAND", "CONNECTICUT", "NEW YORK") ~ "Norte",
  
  # --- ESTADOS DEL CENTRO ---
  df_provincia$provincia %in% c("NEVADA", "UTAH", "COLORADO", "NEBRASKA", "IOWA", 
                                "ILLINOIS", "INDIANA", "OHIO", "CALIFORNIA", "SUR DE CALIFORNIA",
                                "NORTE DE CALIFORNIA", "KANSAS", "MISSOURI", "KENTUCKY", 
                                "WEST VIRGINIA", "VIRGINIA", "MARYLAND", "DELAWARE", 
                                "PENNSYLVANIA", "NEW JERSEY") ~ "Centro",
  
  # --- ESTADOS DEL SUR ---
  df_provincia$provincia %in% c("ARIZONA", "NEW MEXICO", "TEXAS", "OKLAHOMA", "ARKANSAS", 
                                "LOUISIANA", "MISSISSIPPI", "ALABAMA", "TENNESSEE", 
                                "NORTH CAROLINA", "SOUTH CAROLINA", "GEORGIA", "FLORIDA") ~ "Sur",
  
  TRUE ~ NA_character_
)

orden_provincia <- c(
  "Norte",
  "Centro",
  "Sur"
)

df_provincia$provincia <- factor(
  df_provincia$provincia,
  levels = orden_provincia,
  ordered = TRUE
)


TDF_provincia <- df_provincia %>%
  count(provincia, name = "ni") %>%
  arrange(provincia)

# Cálculo inicial de porcentajes
TDF_provincia <- TDF_provincia %>%
  mutate(hi = round(ni / sum(ni) * 100, 0))

# Ajuste matemático para forzar que la suma de 'hi' sea exactamente 100%
diferencia <- 100 - sum(TDF_provincia$hi, na.rm = TRUE)
if (diferencia != 0 & nrow(TDF_provincia) > 0) {
  pos_max <- which.max(TDF_provincia$ni)
  TDF_provincia$hi[pos_max] <- TDF_provincia$hi[pos_max] + diferencia
}


tabla_provincia <- TDF_provincia %>%
  gt() %>%
  tab_header(
    title = "Tabla N° X",
    subtitle = "Distribución por Región de la Provincia"
  ) %>%
  grand_summary_rows(
    columns = c(ni, hi),
    fns = list(Total = ~sum(., na.rm = TRUE)),
    fmt = list(~fmt_number(., decimals = 0))
  )

tabla_provincia
Tabla N° X
Distribución por Región de la Provincia
provincia ni hi
Norte 914 37
Centro 874 35
Sur 608 24
NA 104 4
Total 2,500 100
# Gráfica Nº1: Frecuencia absoluta
barplot(TDF_provincia$ni,
        main = "Gráfica Nº1: Frecuencia por Región",
        xlab = "Región",
        ylab = "Cantidad (ni)",
        col = "steelblue",
        names.arg = TDF_provincia$provincia,
        cex.names = 0.8,
        las = 1)

# Gráfica Nº2: Frecuencia absoluta ajustada
barplot(TDF_provincia$ni,
        main = "Gráfica Nº2: Frecuencia por Región (Escala Ajustada)",
        xlab = "Región",
        ylab = "Cantidad (ni)",
        col = "steelblue",
        names.arg = TDF_provincia$provincia,
        cex.names = 0.8,
        las = 1,
        ylim = c(0, max(TDF_provincia$ni) * 1.2))

# Gráfica Nº3: Frecuencia relativa
barplot(TDF_provincia$hi,
        main = "Gráfica Nº3: Porcentaje por Región",
        xlab = "Región",
        ylab = "Porcentaje (%)",
        col = "steelblue",
        names.arg = TDF_provincia$provincia,
        cex.names = 0.8,
        las = 1)

# Gráfica Nº4: Frecuencia relativa escala completa
barplot(TDF_provincia$hi,
        main = "Gráfica Nº4: Porcentaje por Región (Escala Completa)",
        xlab = "Región",
        ylab = "Porcentaje (%)",
        col = "steelblue",
        names.arg = TDF_provincia$provincia,
        cex.names = 0.8,
        las = 1,
        ylim = c(0, 100))

# Gráfico circular
par(mar = c(4, 4, 4, 8))

colores <- rainbow(length(TDF_provincia$hi))

pie(TDF_provincia$hi,
    col = colores,
    main = "Distribución por Región de la Provincia",
    labels = NA)

legend("right",
       legend = paste(TDF_provincia$provincia, TDF_provincia$hi, "%"),
       fill = colores,
       title = "REGIONES",
       bty = "o",
       xpd = TRUE,
       inset = c(-0.25, 0))

# Moda
moda_provincia <- TDF_provincia[TDF_provincia$ni == max(TDF_provincia$ni), ]
moda_provincia
##   provincia  ni hi
## 1     Norte 914 37
# Mediana
TDF_provincia <- TDF_provincia %>%
  mutate(Ni = cumsum(ni))

N <- sum(TDF_provincia$ni)

mediana_provincia <- TDF_provincia %>%
  filter(Ni >= N/2) %>%
  slice(1)

mediana_provincia
##   provincia  ni hi   Ni
## 1    Centro 874 35 1788