1. Introducción

En este código analizamos el sector aeronáutico-aeroespacial a través de 6 secciones donde exploramos la base de datos de UNComTrade, INEGI DENUE y bases auxiliares del INEGI citadas en el proyecto: la primera no cuenta, porque son librerías; la segunda es un análisis preeliminar de los datos, seguida de la tercera que es un análisis profundo del comportamiento de los estados; luego tenemos la quinta parte que es un análisis internacional, seguido de un índice de competitividad aeronático construido de la forma que se explica allí; finalmente, hay un análisis dbscan de clústeres para identificar las regiones más industrializadas en el área.

2. Carga de librerías y datos

library(tidyverse)
library(readxl)
library(lubridate)
library(dplyr)
library(ggplot2)
library(stringr)
library(tidyr)
library(readr)
library(igraph)
library(tidygraph)
library(ggraph)
library(scales)
library(showtext)
library(sysfonts)
library(treemapify)
library(scales)
library(ggraph)
library(tidygraph)
library(igraph)
library(sf)
library(ggplot2)
library(dplyr)
library(rnaturalearth)
library(rnaturalearthdata)
library(rnaturalearth)
library(rnaturalearthhires)
library(sf)
library(janitor)
library(dbscan)
library(leaflet)
library(viridis)
library(stringi)
library(RColorBrewer)
library(FNN)

3. Análisis Nacional Preeliminar

df = read.csv("~/Documents/ITESM/economy_foreign_trade_mun_2025-05-29T23_08_43.825Z.csv")

df <- df %>%
  mutate(Year = as.integer(`Date.Year`)) %>%
  filter(Year > 0) %>%
  mutate(
    `Trade.Value_balanza` = if_else(
      Flow == "Imports", 
      -`Trade.Value`,
      `Trade.Value`
    )
  )

summary(df %>% select(Year, `Trade.Value`))
##       Year       Trade.Value       
##  Min.   :2006   Min.   :        1  
##  1st Qu.:2011   1st Qu.:     4927  
##  Median :2015   Median :    46818  
##  Mean   :2015   Mean   :  3768853  
##  3rd Qu.:2019   3rd Qu.:   541902  
##  Max.   :2024   Max.   :610977147
annual_trade <- df %>%
  group_by(Year) %>%
  summarise(total_trade = sum(`Trade.Value`, na.rm = TRUE))

annual_balanza <- df %>% 
  group_by(Year) %>%
  summarise(balanza = sum(`Trade.Value_balanza`, na.rm = TRUE))

ggplot(annual_trade, aes(x = Year, y = total_trade)) +
  geom_line() +
  labs(title = "Valor anual del comercio exterior",
       x = "Año", y = "Valor de Comercio (MXN)")

top_partidas_by_trade <- df %>%
  group_by(`HS4.4.Digit.ID`, `HS4.4.Digit`) %>%
  summarise(total_trade = sum(`Trade.Value`, na.rm = TRUE)) %>%
  arrange(desc(total_trade)) %>%
  slice_head(n = 10)

top_partidas_by_balanza <- df %>%
  group_by(`HS4.4.Digit.ID`, `HS4.4.Digit`) %>%
  summarise(balanza = sum(`Trade.Value_balanza`, na.rm = TRUE)) %>%
  arrange(desc(balanza)) %>%
  slice_head(n = 10)

print(top_partidas_by_trade)
## # A tibble: 5 × 3
## # Groups:   HS4.4.Digit.ID [5]
##   HS4.4.Digit.ID HS4.4.Digit                                         total_trade
##            <int> <chr>                                                     <dbl>
## 1         178801 Airships and Balloons; Gliders, Hang Gliders and o…      148758
## 2         178802 Other Aircraft (For Example, Helicopters, Airplane…  2509258207
## 3         178803 Parts of Goods of Heading 8801 or 8802               9315957147
## 4         178804 Parachutes, Including Airships, Gliders (Paraglide…     8125486
## 5         178805 Apparatus and Aircraft Launching Gear; for Gadgets…    38395821
print(top_partidas_by_balanza)
## # A tibble: 5 × 3
## # Groups:   HS4.4.Digit.ID [5]
##   HS4.4.Digit.ID HS4.4.Digit                                             balanza
##            <int> <chr>                                                     <dbl>
## 1         178801 Airships and Balloons; Gliders, Hang Gliders and other… -1.49e5
## 2         178802 Other Aircraft (For Example, Helicopters, Airplanes); … -1.49e9
## 3         178803 Parts of Goods of Heading 8801 or 8802                   6.32e9
## 4         178804 Parachutes, Including Airships, Gliders (Paragliders) … -8.13e6
## 5         178805 Apparatus and Aircraft Launching Gear; for Gadgets and… -3.84e7
ggplot(top_partidas_by_trade, aes(x = reorder(as.factor(`HS4.4.Digit.ID`), total_trade),
                                  y = total_trade)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Top 10 Productos HS4",
       x = "Código HS4", y = "Valor de Comercio (MXN)")

ggplot(top_partidas_by_balanza, aes(x = reorder(as.factor(`HS4.4.Digit.ID`), balanza),
                                    y = balanza)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Top 10 Productos HS4",
       x = "Código HS4", y = "Valor de Balanza (MXN)")

HS8803 <- df %>%
  filter(`HS4.4.Digit.ID` == 178803) %>%
  group_by(`State.ID`, `State`) %>%
  summarise(
    Total_Trade_Value = sum(`Trade.Value`, na.rm = TRUE),
    Total_Balanza_Value = sum(`Trade.Value_balanza`, na.rm = TRUE)
  ) %>% 
  arrange(desc(Total_Trade_Value))

HS8802 <- df %>%
  filter(`HS4.4.Digit.ID` == 178802) %>%
  group_by(`State.ID`, `State`) %>%
  summarise(
    Total_Trade_Value = sum(`Trade.Value`, na.rm = TRUE),
    Total_Balanza_Value = sum(`Trade.Value_balanza`, na.rm = TRUE),
    .groups = "drop"
  ) %>% 
  arrange(desc(Total_Trade_Value))
HS8802_clean <- HS8802 %>%
  arrange(desc(Total_Trade_Value)) 

HS8802_clean <- head(HS8802_clean, 4)

HS8802_long_claude <- HS8802_clean %>%
  pivot_longer(cols = c(Total_Trade_Value, Total_Balanza_Value),
               names_to = "Variable",
               values_to = "Valor") %>%
  mutate(
    Variable = case_when(
      Variable == "Total_Trade_Value" ~ "Valor Total de Comercio",
      Variable == "Total_Balanza_Value" ~ "Balanza Comercial"
    ),
    State = factor(State, levels = rev(c("Ciudad de México", "Coahuila de Zaragoza", 
                                         "Nuevo León", "Estado de México")))
  )

p <- ggplot(HS8802_long_claude, aes(x = Valor, y = State, fill = Variable)) +
  geom_col(position = position_dodge(width = 0.8), 
           width = 0.7, 
           alpha = 0.85) +
  
  geom_vline(xintercept = 0, color = "black", linewidth = 0.5, alpha = 0.7) +
  
  scale_fill_manual(values = c("Valor Total de Comercio" = "#2E86AB", 
                               "Balanza Comercial" = "#A23B72")) +
  
  scale_x_continuous(labels = scales::label_number(scale = 1e-9, suffix = "B USD"),
                     breaks = scales::pretty_breaks(n = 6)) +
  
  labs(
    title = "Comercio Internacional por Estado",
    subtitle = "Valor Total de Comercio vs Balanza Comercial (HS 178802)\nTop 4 estados con mayor valor comercial",
    x = "Valor (Miles de Millones USD)",
    y = "",
    fill = "Indicador",
    caption = "Fuente: Datos de comercio exterior • Elaboración propia"
  ) +
  
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(size = 16, face = "bold", 
                              margin = margin(b = 5), color = "#2c3e50"),
    plot.subtitle = element_text(size = 11, color = "#7f8c8d", 
                                 margin = margin(b = 20)),
    plot.caption = element_text(size = 9, color = "#95a5a6", hjust = 0),
    
    axis.title.x = element_text(size = 12, margin = margin(t = 15)),
    axis.text.y = element_text(size = 11, color = "#2c3e50"),
    axis.text.x = element_text(size = 10, color = "#2c3e50"),
    
    legend.title = element_text(size = 11, face = "bold"),
    legend.text = element_text(size = 10),
    legend.position = "bottom",
    legend.box = "horizontal",
    legend.margin = margin(t = 20),
    
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(color = "#ecf0f1", linewidth = 0.5),
    
    plot.margin = margin(20, 20, 20, 20),
    
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA)
  )

print(p)

  HS8803_clean <- HS8803 %>%
    arrange(desc(Total_Trade_Value)) 
  
  
  HS8803_clean <- head(HS8803_clean, 13)
  
  HS8803_long_claude <- HS8803_clean %>%
    pivot_longer(cols = c(Total_Trade_Value, Total_Balanza_Value),
                 names_to = "Variable",
                 values_to = "Valor") %>%
    mutate(
      Variable = case_when(
        Variable == "Total_Trade_Value" ~ "Valor Total de Comercio",
        Variable == "Total_Balanza_Value" ~ "Balanza Comercial",
        TRUE ~ Variable  # <- Esto cubre cualquier otro valor inesperado
      ),
      State = factor(State, levels = rev(c(
        "Baja California", "Coahuila de Zaragoza", "Chihuahua", "Ciudad de México", 
        "Jalisco", "Estado de México", "Nuevo León", "Querétaro",
        "San Luis Potosí", "Sinaloa", "Sonora", "Tamaulipas", "No Informado"
      )))
    )
  
  
  # Crear la gráfica mejorada
  p2 <- ggplot(HS8803_long_claude, aes(x = Valor, y = reorder(State, Valor), fill = Variable)) +
    geom_col(position = position_dodge(width = 0.8), 
             width = 0.7, 
             alpha = 0.85) +
    
    # Línea vertical en x = 0 para referencia
    geom_vline(xintercept = 0, color = "black", linewidth = 0.5, alpha = 0.7) +
    
    # Escalas y colores mejorados
    scale_fill_manual(values = c("Valor Total de Comercio" = "#2E86AB", 
                                 "Balanza Comercial" = "#A23B72")) +
    
    scale_x_continuous(labels = scales::label_number(scale = 1e-9, suffix = "B USD"),
                       breaks = scales::pretty_breaks(n = 6)) +
    
    # Títulos y etiquetas
    labs(
      title = "Comercio Internacional por Estado",
      subtitle = "Valor Total de Comercio vs Balanza Comercial (HS 178803)\nTop 4 estados con mayor valor comercial",
      x = "Valor (Miles de Millones USD)",
      y = "",
      fill = "Indicador",
      caption = "Fuente: Datos de comercio exterior • Elaboración propia"
    ) +
    
    # Tema personalizado
    theme_minimal(base_size = 12) +
    theme(
      # Título principal
      plot.title = element_text(size = 16, face = "bold", 
                                margin = margin(b = 5), color = "#2c3e50"),
      plot.subtitle = element_text(size = 11, color = "#7f8c8d", 
                                   margin = margin(b = 20)),
      plot.caption = element_text(size = 9, color = "#95a5a6", hjust = 0),
      
      # Ejes
      axis.title.x = element_text(size = 12, margin = margin(t = 15)),
      axis.text.y = element_text(size = 11, color = "#2c3e50"),
      axis.text.x = element_text(size = 10, color = "#2c3e50"),
      
      # Leyenda
      legend.title = element_text(size = 11, face = "bold"),
      legend.text = element_text(size = 10),
      legend.position = "bottom",
      legend.box = "horizontal",
      legend.margin = margin(t = 20),
      
      # Panel y grilla
      panel.grid.major.y = element_blank(),
      panel.grid.minor = element_blank(),
      panel.grid.major.x = element_line(color = "#ecf0f1", linewidth = 0.5),
      
      # Márgenes
      plot.margin = margin(20, 20, 20, 20),
      
      # Fondo
      panel.background = element_rect(fill = "white", color = NA),
      plot.background = element_rect(fill = "white", color = NA)
    )
  
  # Mostrar la gráfica
  print(p2)

4. Análisis Nacional Específico

# Cargar datos
df <- read.csv("~/Documents/ITESM/economy_foreign_trade_mun_2025-05-29T23_08_43.825Z.csv")

# Librerías necesarias
# 3. ANALISIS DESCRIPTIVO GENERAL DEL CONJUNTO DE DATOS ----------------------

# Convertir y filtrar año
df <- df %>%
  mutate(Year = as.integer(Date.Year)) %>%
  filter(Year > 0)

# Estadística descriptiva
summary(df %>% select(Year, Trade.Value))
##       Year       Trade.Value       
##  Min.   :2006   Min.   :        1  
##  1st Qu.:2011   1st Qu.:     4927  
##  Median :2015   Median :    46818  
##  Mean   :2015   Mean   :  3768853  
##  3rd Qu.:2019   3rd Qu.:   541902  
##  Max.   :2024   Max.   :610977147
# Valor anual del comercio
annual <- df %>%
  group_by(Year) %>%
  summarise(total_trade = sum(Trade.Value, na.rm = TRUE))

# Gráfico de línea (tendencia anual)
ggplot(annual, aes(x = Year, y = total_trade)) +
  geom_line() +
  labs(title = "Valor anual del comercio exterior",
       x = "Año", y = "Valor de Comercio (MXN)")

# Top 5 productos HS4
top_products <- df %>%
  group_by(HS4.4.Digit.ID, HS4.4.Digit) %>%
  summarise(total_trade = sum(Trade.Value, na.rm = TRUE)) %>%
  arrange(desc(total_trade)) %>%
  slice_head(n = 5)

print(top_products)
## # A tibble: 5 × 3
## # Groups:   HS4.4.Digit.ID [5]
##   HS4.4.Digit.ID HS4.4.Digit                                         total_trade
##            <int> <chr>                                                     <dbl>
## 1         178801 Airships and Balloons; Gliders, Hang Gliders and o…      148758
## 2         178802 Other Aircraft (For Example, Helicopters, Airplane…  2509258207
## 3         178803 Parts of Goods of Heading 8801 or 8802               9315957147
## 4         178804 Parachutes, Including Airships, Gliders (Paraglide…     8125486
## 5         178805 Apparatus and Aircraft Launching Gear; for Gadgets…    38395821
# Gráfico de barras (top 5 HS4)
ggplot(top_products, aes(x = reorder(as.factor(HS4.4.Digit.ID), total_trade),
                         y = total_trade)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Top 5 Productos HS4 por valor de comercio",
       x = "Código HS4", y = "Valor de Comercio (MXN)")

# 4. ANALISIS ESPECIFICO PARA EL 178802 Y 178803 -----------------------------

codes <- c(178803, 178802)
for (code in codes) {
  sub <- df %>%
    filter(HS4.4.Digit.ID == code)
  
  cat("\n\n=== HS4", code, "===\n")
  print(summary(sub$Trade.Value))
  
  annual <- sub %>%
    group_by(Year) %>%
    summarise(total = sum(Trade.Value, na.rm = TRUE))
  ggplot(annual, aes(Year, total)) +
    geom_line() +
    labs(title = paste("Tendencia HS4", code),
         x = "Año", y = "Valor Comercio (MXN)")
  
  socios <- sub %>%
    group_by(Country) %>%
    summarise(total = sum(Trade.Value, na.rm = TRUE)) %>%
    arrange(desc(total)) %>%
    slice_head(n = 5)
  print(socios)
}
## 
## 
## === HS4 178803 ===
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##         1      4451     38270   3520770    462808 610977147 
## # A tibble: 5 × 2
##   Country             total
##   <chr>               <dbl>
## 1 United States  7184225066
## 2 United Kingdom  514469775
## 3 Germany         391618073
## 4 France          361040886
## 5 Canada          194986959
## 
## 
## === HS4 178802 ===
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##       259     50000    379390   7088300   2660274 356167614 
## # A tibble: 5 × 2
##   Country           total
##   <chr>             <dbl>
## 1 United States 965073876
## 2 France        483883080
## 3 Brazil        361767614
## 4 Italy         265019754
## 5 Canada        206676573
# PAISES QUE CONCENTRAN EL MAYOR VALOR DE COMERCIO PARA LOS HS4 178803 Y 178802

df2 <- df %>%
  filter(HS4.4.Digit.ID %in% c(178803, 178802)) %>%
  select(Year, Country, HS4.4.Digit.ID, Trade.Value) %>%
  rename(HS4 = HS4.4.Digit.ID,
         trade_value = Trade.Value)

top_countries <- df2 %>%
  group_by(HS4, Country) %>%
  summarise(total_trade = sum(trade_value, na.rm = TRUE), .groups = "drop") %>%
  arrange(HS4, desc(total_trade)) %>%
  group_by(HS4) %>%
  slice_head(n = 5)

ggplot(top_countries, aes(x = reorder(Country, total_trade),
                          y = total_trade,
                          fill = as.factor(HS4))) +
  geom_col(position = "dodge") +
  coord_flip() +
  facet_wrap(~ HS4, scales = "free_y") +
  labs(
    title = "Top 5 países por valor de comercio",
    subtitle = "Comparación HS4 178803 vs HS4 178802",
    x = "País",
    y = "Valor de Comercio (MXN)",
    fill = "HS4"
  ) +
  theme_minimal()

# TENDENCIA ANUAL COMPARATIVA
df3 <- df %>%
  mutate(
    HS4 = HS4.4.Digit.ID,
    trade_value = Trade.Value
  ) %>%
  filter(HS4 %in% c(178803, 178802))

annual_trend <- df3 %>%
  group_by(Year, HS4) %>%
  summarise(total_trade = sum(trade_value, na.rm = TRUE), .groups = "drop")

ggplot(annual_trend, aes(x = Year, y = total_trade, colour = factor(HS4))) +
  geom_line(size = 1) +
  labs(
    title    = "Tendencia anual de comercio: HS4 178803 vs 178802",
    x        = "Año",
    y        = "Valor de Comercio (MXN)",
    colour   = "Código HS4"
  ) +
  theme_minimal()

# 5. ANALISIS SEPARANDO IMPORTACIONES Y EXPORTACIONES ------------------------

df4 <- df %>%
  mutate(
    HS4 = HS4.4.Digit.ID,
    trade_val = Trade.Value
  ) %>%
  filter(HS4 %in% c(178803, 178802))

desc_stats <- df4 %>%
  group_by(HS4, Flow) %>%
  summarise(
    n = n(),
    mean_trade = mean(trade_val, na.rm = TRUE),
    sd_trade   = sd(trade_val, na.rm = TRUE),
    min_trade  = min(trade_val, na.rm = TRUE),
    p25        = quantile(trade_val, .25, na.rm = TRUE),
    median     = median(trade_val, na.rm = TRUE),
    p75        = quantile(trade_val, .75, na.rm = TRUE),
    max_trade  = max(trade_val, na.rm = TRUE),
    .groups    = "drop"
  )
print(desc_stats)
## # A tibble: 4 × 10
##      HS4 Flow        n mean_trade  sd_trade min_trade    p25  median      p75
##    <int> <chr>   <int>      <dbl>     <dbl>     <dbl>  <dbl>   <dbl>    <dbl>
## 1 178802 Exports    21  24357823. 36659813.      1600 604422 3291000 32587885
## 2 178802 Imports   333   5999231. 25392700.       259  45000  333645  1962514
## 3 178803 Exports  1079   7247657. 31307168.         1   8864  106307  1691937
## 4 178803 Imports  1567    954522.  3839885.         1   2791   19500   191495
## # ℹ 1 more variable: max_trade <dbl>
annual_trend <- df4 %>%
  group_by(Year, HS4, Flow) %>%
  summarise(total = sum(trade_val, na.rm = TRUE), .groups = "drop")

ggplot(annual_trend, aes(x = Year, y = total, colour = Flow)) +
  geom_line(size = 1) +
  facet_wrap(~ HS4, scales = "free_y",
             labeller = labeller(HS4 = c(`178803` = "Parts (178803)",
                                         `178802` = "Aircraft (178802)"))) +
  labs(
    title  = "Tendencia anual por Flow (Imports vs Exports)",
    x      = "Año",
    y      = "Valor Comercio (MXN)",
    colour = ""
  ) +
  theme_minimal()

top_countries_flow <- df4 %>%
  group_by(HS4, Flow, Country) %>%
  summarise(total = sum(trade_val, na.rm = TRUE), .groups = "drop") %>%
  arrange(HS4, Flow, desc(total)) %>%
  group_by(HS4, Flow) %>%
  slice_head(n = 5)

ggplot(top_countries_flow, aes(
  x = reorder(Country, total),
  y = total,
  fill = Flow
)) +
  geom_col(position = "dodge") +
  facet_wrap(~ HS4, scales = "free_y",
             labeller = labeller(HS4 = c(`178803` = "Parts (178803)",
                                         `178802` = "Aircraft (178802)"))) +
  coord_flip() +
  labs(
    title = "Top 5 países por HS4 y Flow",
    x = "País",
    y = "Valor Comercio (MXN)",
    fill = ""
  ) +
  theme_minimal()

# 6. ANALISIS POR ESTADO Y PRINCIPALES SOCIOS COMERCIALES -------------------

df5 <- df %>%
  mutate(trade_val = Trade.Value) %>%
  filter(Year > 0)

principal_destino <- df5 %>%
  group_by(State, Flow, Country) %>%
  summarise(
    total_trade = sum(trade_val, na.rm = TRUE),
    .groups = "drop_last"
  ) %>%
  slice_max(order_by = total_trade, n = 1, with_ties = FALSE) %>%
  ungroup() %>%
  arrange(State, Flow)

print(principal_destino)
## # A tibble: 37 × 4
##    State                Flow    Country       total_trade
##    <chr>                <chr>   <chr>               <dbl>
##  1 Aguascalientes       Imports Canada            1962514
##  2 Baja California      Exports United States  2569563736
##  3 Baja California      Imports United States   287307175
##  4 Baja California Sur  Imports China               28480
##  5 Chiapas              Imports United States      194701
##  6 Chihuahua            Exports United States   168610940
##  7 Chihuahua            Imports United States    66715435
##  8 Ciudad de México     Exports United States   814903734
##  9 Ciudad de México     Imports United States   668217393
## 10 Coahuila de Zaragoza Exports United States   245075818
## # ℹ 27 more rows
ggplot(principal_destino, aes(
  x = total_trade,
  y = reorder(State, total_trade),
  fill = Country
)) +
  geom_col(show.legend = TRUE) +
  facet_wrap(~ Flow, ncol = 1, scales = "free_x") +
  labs(
    title = "Principal socio comercial por Estado",
    subtitle = "Importaciones vs Exportaciones (valor mayor)",
    x = "Valor de Comercio (MXN)",
    y = "Estado",
    fill = "País"
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(face = "bold"),
    axis.text.y = element_text(size = 6)
  )

# Sin Estados Unidos
df6 <- df %>%
  mutate(trade_val = Trade.Value) %>%
  filter(Year > 0, Country != "United States")

principal_destinoeu <- df6 %>%
  group_by(State, Flow, Country) %>%
  summarise(total_trade = sum(trade_val, na.rm = TRUE), .groups = "drop") %>%
  group_by(State, Flow) %>%
  slice_max(order_by = total_trade, n = 1, with_ties = FALSE) %>%
  ungroup()

ggplot(principal_destinoeu, aes(
  x = total_trade,
  y = reorder(State, total_trade),
  fill = Country
)) +
  geom_col() +
  facet_wrap(~ Flow, ncol = 1, scales = "free_x") +
  labs(
    title = "Principal socio comercial por Estado (sin EE.UU.)",
    subtitle = "Importaciones vs Exportaciones",
    x = "Valor de Comercio (MXN)",
    y = "Estado",
    fill = "País"
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(face = "bold"),
    axis.text.y = element_text(size = 6)
  )

# Red Estado ↔ País (Imports/Exports)

df7 <- df %>%
  mutate(Year = as.integer(Date.Year),
         trade_val = Trade.Value) %>%
  filter(Year > 0)

plot_flow_network <- function(flow_type, top_n = 3) {
  sub <- df7 %>%
    filter(Flow == flow_type)
  
  edges <- sub %>%
    group_by(State, Country) %>%
    summarise(weight = sum(trade_val, na.rm = TRUE), .groups = "drop") %>%
    group_by(State) %>%
    slice_max(order_by = weight, n = top_n, with_ties = FALSE) %>%
    ungroup()
  
  nodes <- tibble(
    name = unique(c(edges$State, edges$Country))
  ) %>%
    mutate(
      type = if_else(name %in% edges$Country, "Country", "State")
    )
  
  g <- graph_from_data_frame(
    d = select(edges, from = State, to = Country, weight),
    vertices = nodes,
    directed = FALSE
  )
  
  V(g)$type <- ifelse(V(g)$name %in% edges$Country, TRUE, FALSE)
  
  g_tbl <- as_tbl_graph(g)
  p <- ggraph(g_tbl, layout = "bipartite") +
    geom_edge_link(aes(width = weight), alpha = 0.6, color = "gray50") +
    geom_node_point(aes(color = type), size = 3) +
    geom_node_text(aes(label = name),
                   repel = TRUE,
                   size = 3,
                   nudge_y = 0.1) +
    scale_color_manual(values = c("State" = "steelblue", "Country" = "tomato")) +
    labs(
      title = paste(flow_type, "- Red Estado ↔ País (top", top_n, "destinos)"),
      edge_width = "Valor (MXN)",
      color = ""
    ) +
    theme_void()
  
  print(p)
}

plot_flow_network("Imports", top_n = 3)

plot_flow_network("Exports", top_n = 3)

5. Análisis Internacional

setwd("~/Documents/ITESM/Ciencia de Datos I/Data Trade")

comercio_todo <- read_excel("TradeData (1).xlsx")

library(extrafont)
loadfonts()

comercio_todo %>% 
  group_by(flowDesc) %>%
  summarise(valor_total = sum(fobvalue, na.rm = TRUE)) %>%
  ggplot(aes(x = reorder(flowDesc, valor_total), y = valor_total)) +
  geom_col() +
  coord_flip() +
  labs(title = "Valor total del comercio por tipo de flujo",
       x = "Tipo de flujo", y = "Valor FOB total")

## POR PAIS

# Agrupar por país y sumar exportaciones + importaciones
comercio_resumen_1 <- comercio_todo %>%
  group_by(country = reporterDesc) %>%
  filter(partnerDesc != "World") %>% 
  filter(reporterDesc != "World") %>% 
  summarise(valor_total = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(valor_total))

print(n=30,comercio_resumen_1)
## # A tibble: 84 × 2
##    country                valor_total
##    <chr>                        <dbl>
##  1 USA                  303898352709 
##  2 Canada                44480454497.
##  3 Germany               36267897405.
##  4 United Kingdom        31972751847.
##  5 Spain                 12937258316.
##  6 Italy                 11205118711.
##  7 Brazil                 8752680881 
##  8 Ireland                7170732719.
##  9 India                  7067502895.
## 10 Türkiye                6675684243.
## 11 Australia              4963064533.
## 12 Switzerland            4320157426.
## 13 China, Hong Kong SAR   2725609029.
## 14 Thailand               2397547782.
## 15 Poland                 2309855068 
## 16 Netherlands            2306000225.
## 17 Philippines            2192657677 
## 18 Israel                 2174587000 
## 19 Japan                  2034444614.
## 20 Rep. of Korea          1934565516 
## 21 South Africa           1662976663.
## 22 New Zealand            1591371987.
## 23 Czechia                1413152542 
## 24 Romania                1409662756.
## 25 Malaysia               1252380938.
## 26 Luxembourg             1183916304.
## 27 Mexico                 1082775073 
## 28 Belgium                1029281617.
## 29 Sweden                  806856312.
## 30 Portugal                537324792.
## # ℹ 54 more rows
# Graficar treemap
ggplot(comercio_resumen_1, aes(area = valor_total, fill = valor_total,
                             label = country)) +
  geom_treemap() +
  geom_treemap_text(colour = "white", place = "centre", grow = TRUE) +
  scale_fill_viridis_c() +
  labs(title = "Valor total del comercio (Exportaciones + Importaciones) por país",
       fill = "Valor total") +
  theme_minimal()

# MEXICO TOTAL TRADE VALUE

mexico_df <- comercio_todo %>%
  filter(reporterDesc == "Mexico", partnerDesc != "World") 

partner_values <- mexico_df %>%
  group_by(partnerDesc) %>%
  summarise(total_fob = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(total_fob))

print(partner_values)
## # A tibble: 22 × 2
##    partnerDesc    total_fob
##    <chr>              <dbl>
##  1 USA            712259296
##  2 China           91908450
##  3 United Kingdom  63105187
##  4 Canada          55988757
##  5 Germany         52581714
##  6 France          51630431
##  7 Areas, nes      35972951
##  8 Brazil           6142647
##  9 Italy            3426795
## 10 Netherlands      1886675
## # ℹ 12 more rows
partner_values %>%
  top_n(10, total_fob) %>%
  ggplot(aes(x = reorder(partnerDesc, total_fob), y = total_fob / 1e6)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  labs(title = "Principales socios comerciales de México",
       subtitle = "Por valor total (en billones USD)",
       x = "País socio",
       y = "Valor FOB (millones USD)") +
  theme_minimal()

## MEXICO IMPORTS 

imports_to_mexico <- comercio_todo %>%
  filter(partnerDesc == "Mexico", grepl("Export", flowDesc)) %>%
  filter(reporterDesc != "World") %>% 
  group_by(reporterDesc) %>%
  summarise(total_fob = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(total_fob))

imports_to_mexico_2 <- comercio_todo %>%
  filter(reporterDesc == "Mexico", grepl("Import", flowDesc)) %>%
  group_by(partnerDesc) %>%
  filter(partnerDesc != "World") %>% 
  summarise(total_fob = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(total_fob))

imports_to_mexico %>%
  top_n(15, total_fob) %>%
  ggplot(aes(x = reorder(reporterDesc, total_fob), y = total_fob / 1e6)) +
  geom_col(fill = "tomato") +
  coord_flip() +
  labs(title = "Importaciones hacia México",
       subtitle = "Por país reportante (en millones USD)",
       x = "País reportante",
       y = "Valor FOB (millones USD)") +
  theme_minimal()

imports_to_mexico_2 %>%
  top_n(15, total_fob) %>%
  ggplot(aes(x = reorder(partnerDesc, total_fob), y = total_fob / 1e6)) +
  geom_col(fill = "tomato") +
  coord_flip() +
  labs(title = "Importaciones hacia México",
       subtitle = "Por país reportante (en millones USD)",
       x = "País reportante",
       y = "Valor FOB (millones USD)") +
  theme_minimal()

## EXPORTS MEXICO 

exports_from_mexico <- comercio_todo %>%
  filter(reporterDesc == "Mexico", grepl("Export", flowDesc)) %>%
  filter(partnerDesc != "World") %>% 
  group_by(partnerDesc) %>% 
  summarise(total_fob = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(total_fob))

exports_from_mexico_2 <- comercio_todo %>%
  filter(partnerDesc == "Mexico", grepl("Import", flowDesc)) %>%
  filter(reporterDesc != "World") %>% 
  group_by(reporterDesc) %>% 
  summarise(total_fob = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(total_fob))

exports_from_mexico %>%
  top_n(15, total_fob) %>%
  ggplot(aes(x = reorder(partnerDesc, total_fob), y = total_fob / 1e6)) +
  geom_col(fill = "tomato") +
  coord_flip() +
  labs(title = "Exportaciones desde México",
       subtitle = "Por país reportante (en millones USD)",
       x = "País reportante",
       y = "Valor FOB (millones USD)") +
  theme_minimal()

exports_from_mexico_2 %>%
  top_n(15, total_fob) %>%
  ggplot(aes(x = reorder(reporterDesc, total_fob), y = total_fob / 1e6)) +
  geom_col(fill = "tomato") +
  coord_flip() +
  labs(title = "Exportaciones desde México",
       subtitle = "Por país reportante (en millones USD)",
       x = "País reportante",
       y = "Valor FOB (millones USD)") +
  theme_minimal()

## IMPORTACIONES gráfico cuadrado



comercio_importaciones <- comercio_todo %>%
  filter(grepl("Import", flowDesc), partnerDesc != "World") %>%
  group_by(country = partnerDesc) %>%
  summarise(valor_total = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(valor_total)) %>%
  mutate(valor_miles_millones = valor_total / 1e9)  # Convertir a billion USD

ggplot(comercio_importaciones, aes(area = valor_total, fill = valor_total)) +
  geom_treemap() +
  
  # Título del país (arriba)
  geom_treemap_text(
    aes(label = country),
    colour = "white",
    place = "top",
    grow = TRUE,
    size = 4,
    fontface = "bold",
    family = "Arial",
    min.size = 4
  ) +
  
  # Subtítulo con el valor (centro)
  geom_treemap_text(
    aes(label = paste0(round(valor_miles_millones, 1), " B USD")),
    colour = "white",
    place = "bottom",
    grow = TRUE,
    size = 3,
    alpha = 0.9,
    min.size = 2
  ) +
  
  scale_fill_viridis_c(
    labels = scales::label_number(scale = 1e-9, suffix = " B", accuracy = 0.1)
  ) +
  
  scale_fill_gradient(
    low = "#BC955C",
    high = "#9F2241",
    labels = scales::label_number(scale = 1e-9, suffix = " B", accuracy = 0.1)
  ) +
  
  labs(
    title = "Importadores a nivel mundial",
    fill = "Valor total (Billion USD)"
  ) +
  
  
  
  theme_minimal()

## exportaciones gráfico cuadrado 

comercio_exportaciones <- comercio_todo %>%
  filter(grepl("Export", flowDesc), partnerDesc != "World") %>%
  group_by(country = partnerDesc) %>%
  summarise(valor_total = sum(fobvalue, na.rm = TRUE)) %>%
  arrange(desc(valor_total)) %>%
  mutate(valor_miles_millones = valor_total / 1e9)


library(ggraph)

ggplot(comercio_exportaciones, aes(area = valor_total, fill = valor_total)) +
  geom_treemap() +
  
  # Título del país (arriba)
  geom_treemap_text(
    aes(label = country),
    colour = "white",
    place = "top",
    grow = TRUE,
    size = 3,
    fontface = "bold",
    family = "Arial"
  ) +
  
  # Subtítulo con el valor (centro)
  geom_treemap_text(
    aes(label = paste0(round(valor_miles_millones, 1), " B USD")),
    colour = "white",
    place = "bottom",
    grow = TRUE,
    size = 3,
    alpha = 0.8
  ) +
  
  scale_fill_gradient(
    low = "#9F2241",
    high = "#BC955C",
    labels = scales::label_number(scale = 1e-9, suffix = " B", accuracy = 0.1)
  ) +
  
  labs(
    title = "Exportaciones a nivel mundial",
    fill = "Valor total (Billones de USD)"
  ) +
  
  theme_minimal()

## BALANZA COMERCIAL 

# Exportaciones por país
exportaciones <- comercio_todo %>%
  filter(grepl("Export", flowDesc), partnerDesc != "World") %>%
  group_by(country = partnerDesc) %>%
  summarise(exportaciones = sum(fobvalue, na.rm = TRUE))
# Importaciones por país
importaciones <- comercio_todo %>%
  filter(grepl("Import", flowDesc), partnerDesc != "World") %>%
  group_by(country = partnerDesc) %>%
  summarise(importaciones = sum(fobvalue, na.rm = TRUE))

# Unir ambos dataframes
balanza_comercial <- full_join(exportaciones, importaciones, by = "country") %>%
  mutate(
    exportaciones = replace_na(exportaciones, 0),
    importaciones = replace_na(importaciones, 0),
    balanza = exportaciones - importaciones,
    total = exportaciones + importaciones
  ) %>%
  arrange(desc(balanza))

# Gráfico de barras
ggplot(balanza_comercial %>% 
         slice_max(order_by = abs(balanza), n = 15),
       aes(x = reorder(country, balanza), y = balanza, fill = balanza > 0)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  scale_fill_manual(values = c("TRUE" = "darkgreen", "FALSE" = "firebrick")) +
  labs(
    title = "Balanza comercial por país (Exportaciones - Importaciones)",
    x = "País",
    y = "Saldo comercial (USD)"
  ) +
  theme_minimal()

###Balanza comercial gráfico de cuadros

balanza_comercial_final <- balanza_comercial %>%
  select(country, `Comercio total` = total, `Balanza comercial` = balanza) %>%
  pivot_longer(cols = c(`Comercio total`, `Balanza comercial`), 
               names_to = "tipo", values_to = "valor")

ggplot(balanza_comercial, aes(area = balanza, fill = total)) +
  geom_treemap() +
  
  # Título del país (arriba)
  geom_treemap_text(
    aes(label = country),
    colour = "white",
    place = "top",
    grow = TRUE,
    size = 4,
    fontface = "bold",
    family = "Arial"
  ) +
  
  # Subtítulo con el valor (centro)
  geom_treemap_text(
    aes(label = paste0(round(total / 1e9, 1), " B USD")),
    colour = "white",
    place = "bottom",
    grow = TRUE,
    size = 3,
    alpha = 0.9
  ) +
  
  scale_fill_gradient(
    low = "#BC955C", 
    high = "#9F2241",
    labels = scales::label_number(scale = 1e-9, suffix = " B", accuracy = 0.1)
  ) +
  
  labs(
    title = "Valor del comercio por país",
    fill = "Valor total (Billones de USD)"
  ) +
  
  theme_minimal()

# Combinar ambos datasets
comercio_comparado <- inner_join(comercio_resumen_1, balanza_comercial, by = "country")

# Filtrar los 15 países con mayor comercio total
comercio_top15 <- balanza_comercial %>%
  slice_max(order_by = total, n = 15)


# Reordenar países por valor total para que salgan bien en el eje X
comercio_top15 <- comercio_top15 %>%
  mutate(country = fct_reorder(country, total))

# Pivotar a formato largo para ggplot
comercio_largo <- comercio_top15 %>%
  select(country, 
         `Exportaciones` = exportaciones, `Importaciones` = importaciones) %>%
  pivot_longer(cols = c(`Exportaciones`,`Importaciones` ), 
               names_to = "tipo", values_to = "valor")



# Graficar
ggplot(comercio_largo, aes(x = country, y = valor, fill = tipo)) +
  geom_col(position = "dodge") +
  coord_flip() +
  scale_fill_manual(values = c("Exportaciones" = "#9F2241", "Importaciones"= "#BC955C")) +
  scale_y_continuous(
    labels = scales::label_number(scale = 1e-9, suffix = " B", accuracy = 0.1)
  ) +
  labs(
    title = "Comparación de Comercio Total vs. Balanza Comercial por país",
    x = "País",
    y = "Valor (Billones de USD)",
    fill = "Tipo"
  ) +
  theme_minimal(base_family = "Arial") +
  theme(
    plot.title = element_text(face = "bold")
  )

6. Índice de Competitividad Aeronáutica

Contrucción de Valor de Industria

setwd("~/Documents/ITESM/Ciencia de Datos I/INEGI_DENUE_03062025/DENUE")

comercios <- read_csv("~/Documents/ITESM/Ciencia de Datos I/INEGI_DENUE_03062025/DENUE/INEGI_DENUE_03062025.csv", 
                      locale = locale(encoding = "latin1"))

glimpse(comercios)
## Rows: 117
## Columns: 42
## $ ID                                                        <dbl> 6284621, 945…
## $ Clee                                                      <chr> "02001336410…
## $ `Nombre de la Unidad Económica`                           <chr> "AEARO TECHN…
## $ `Razón social`                                            <chr> "AEARO TECHN…
## $ `Código de la clase de actividad SCIAN`                   <dbl> 336410, 3364…
## $ `Nombre de clase de la actividad`                         <chr> "Fabricación…
## $ `Descripcion estrato personal ocupado`                    <chr> "251 y más p…
## $ `Tipo de vialidad`                                        <chr> "CARRETERA",…
## $ `Nombre de la vialidad`                                   <chr> "TRANSPENINS…
## $ `Tipo de entre vialidad 1`                                <chr> "CALLE", "CA…
## $ `Nombre de entre vialidad 1`                              <chr> "DELANTE (GE…
## $ `Tipo de entre vialidad 2`                                <chr> "CALLE", "CA…
## $ `Nombre de entre vialidad 2`                              <chr> "NINGUNO", "…
## $ `Tipo de entre vialidad 3`                                <chr> "AVENIDA", "…
## $ `Nombre de entre vialidad 3`                              <chr> "PEDRO LOYOL…
## $ `Número exterior o kilómetro`                             <dbl> 394, NA, 0, …
## $ `Letra exterior`                                          <chr> NA, "DOMICIL…
## $ Edificio                                                  <chr> NA, NA, NA, …
## $ `Edificio Piso`                                           <chr> NA, NA, NA, …
## $ `Número interior`                                         <dbl> NA, NA, 0, N…
## $ `Letra interior`                                          <chr> NA, NA, "SN"…
## $ `Tipo de asentamiento humano`                             <chr> "COLONIA", "…
## $ `Nombre de asentamiento humano`                           <chr> "CARLOS PACH…
## $ `Tipo centro comercial`                                   <chr> NA, NA, NA, …
## $ `Corredor industrial, centro comercial o mercado público` <chr> NA, NA, "TEC…
## $ `Número de local`                                         <chr> NA, NA, "SN"…
## $ `Código Postal`                                           <dbl> NA, 22785, N…
## $ `Clave entidad`                                           <dbl> 2, 2, 2, 2, …
## $ `Entidad federativa`                                      <chr> "BAJA CALIFO…
## $ `Clave municipio`                                         <dbl> 1, 1, 3, 4, …
## $ Municipio                                                 <chr> "Ensenada", …
## $ `Clave localidad`                                         <dbl> 1, 1, 1, 1, …
## $ Localidad                                                 <chr> "Ensenada", …
## $ `Área geoestadística básica`                              <chr> "083A", "614…
## $ Manzana                                                   <dbl> 4, 17, 38, 1…
## $ `Número de teléfono`                                      <dbl> 6462262278, …
## $ `Correo electrónico`                                      <chr> "GVERDUZCOVE…
## $ `Sitio en Internet`                                       <chr> NA, NA, NA, …
## $ `Tipo de establecimiento`                                 <chr> "Fijo", "Fij…
## $ Latitud                                                   <dbl> 31.84974, 31…
## $ Longitud                                                  <dbl> -116.6047, -…
## $ `Fecha de incorporación al DENUE`                         <chr> "2010-07", "…
summary(comercios)
##        ID               Clee           Nombre de la Unidad Económica
##  Min.   :   82735   Length:117         Length:117                   
##  1st Qu.: 6294688   Class :character   Class :character             
##  Median : 6397643   Mode  :character   Mode  :character             
##  Mean   : 6783585                                                   
##  3rd Qu.: 6884395                                                   
##  Max.   :11826816                                                   
##                                                                     
##  Razón social       Código de la clase de actividad SCIAN
##  Length:117         Min.   :336410                       
##  Class :character   1st Qu.:336410                       
##  Mode  :character   Median :336410                       
##                     Mean   :336410                       
##                     3rd Qu.:336410                       
##                     Max.   :336410                       
##                                                          
##  Nombre de clase de la actividad Descripcion estrato personal ocupado
##  Length:117                      Length:117                          
##  Class :character                Class :character                    
##  Mode  :character                Mode  :character                    
##                                                                      
##                                                                      
##                                                                      
##                                                                      
##  Tipo de vialidad   Nombre de la vialidad Tipo de entre vialidad 1
##  Length:117         Length:117            Length:117              
##  Class :character   Class :character      Class :character        
##  Mode  :character   Mode  :character      Mode  :character        
##                                                                   
##                                                                   
##                                                                   
##                                                                   
##  Nombre de entre vialidad 1 Tipo de entre vialidad 2 Nombre de entre vialidad 2
##  Length:117                 Length:117               Length:117                
##  Class :character           Class :character         Class :character          
##  Mode  :character           Mode  :character         Mode  :character          
##                                                                                
##                                                                                
##                                                                                
##                                                                                
##  Tipo de entre vialidad 3 Nombre de entre vialidad 3
##  Length:117               Length:117                
##  Class :character         Class :character          
##  Mode  :character         Mode  :character          
##                                                     
##                                                     
##                                                     
##                                                     
##  Número exterior o kilómetro Letra exterior       Edificio        
##  Min.   :    0.0             Length:117         Length:117        
##  1st Qu.:    3.5             Class :character   Class :character  
##  Median :  211.5             Mode  :character   Mode  :character  
##  Mean   : 3351.0                                                  
##  3rd Qu.: 3701.0                                                  
##  Max.   :20901.0                                                  
##  NA's   :5                                                        
##  Edificio Piso      Número interior  Letra interior    
##  Length:117         Min.   :  0.00   Length:117        
##  Class :character   1st Qu.:  0.00   Class :character  
##  Mode  :character   Median :  0.00   Mode  :character  
##                     Mean   : 11.41                     
##                     3rd Qu.:  8.25                     
##                     Max.   :103.00                     
##                     NA's   :95                         
##  Tipo de asentamiento humano Nombre de asentamiento humano
##  Length:117                  Length:117                   
##  Class :character            Class :character             
##  Mode  :character            Mode  :character             
##                                                           
##                                                           
##                                                           
##                                                           
##  Tipo centro comercial Corredor industrial, centro comercial o mercado público
##  Length:117            Length:117                                             
##  Class :character      Class :character                                       
##  Mode  :character      Mode  :character                                       
##                                                                               
##                                                                               
##                                                                               
##                                                                               
##  Número de local    Código Postal   Clave entidad   Entidad federativa
##  Length:117         Min.   : 9310   Min.   : 2.00   Length:117        
##  Class :character   1st Qu.:31078   1st Qu.: 8.00   Class :character  
##  Mode  :character   Median :31183   Median : 9.00   Mode  :character  
##                     Mean   :46239   Mean   :14.08                     
##                     3rd Qu.:75757   3rd Qu.:26.00                     
##                     Max.   :97288   Max.   :32.00                     
##                     NA's   :59                                        
##  Clave municipio   Municipio         Clave localidad   Localidad        
##  Min.   :  1.00   Length:117         Min.   :   1.0   Length:117        
##  1st Qu.:  5.00   Class :character   1st Qu.:   1.0   Class :character  
##  Median : 19.00   Mode  :character   Median :   1.0   Mode  :character  
##  Mean   : 28.12                      Mean   : 160.7                     
##  3rd Qu.: 29.00                      3rd Qu.:   1.0                     
##  Max.   :553.00                      Max.   :7007.0                     
##                                                                         
##  Área geoestadística básica    Manzana       Número de teléfono 
##  Length:117                 Min.   :  1.00   Min.   :4.423e+09  
##  Class :character           1st Qu.:  4.00   1st Qu.:6.311e+09  
##  Mode  :character           Median : 14.00   Median :6.311e+09  
##                             Mean   : 25.45   Mean   :6.165e+09  
##                             3rd Qu.: 29.00   3rd Qu.:6.462e+09  
##                             Max.   :800.00   Max.   :8.307e+09  
##                                              NA's   :108        
##  Correo electrónico Sitio en Internet  Tipo de establecimiento    Latitud     
##  Length:117         Length:117         Length:117              Min.   :17.05  
##  Class :character   Class :character   Class :character        1st Qu.:25.64  
##  Mode  :character   Mode  :character   Mode  :character        Median :28.71  
##                                                                Mean   :27.67  
##                                                                3rd Qu.:31.29  
##                                                                Max.   :32.67  
##                                                                               
##     Longitud       Fecha de incorporación al DENUE
##  Min.   :-116.99   Length:117                     
##  1st Qu.:-111.07   Class :character               
##  Median :-106.15   Mode  :character               
##  Mean   :-107.83                                  
##  3rd Qu.:-102.67                                  
##  Max.   : -89.69                                  
## 
comercios_estados <- comercios %>%
  select(
    ID,
    `Descripcion estrato personal ocupado`,
    `Tipo de asentamiento humano`,
    `Entidad federativa`,
    Municipio
  )

glimpse(comercios_estados)
## Rows: 117
## Columns: 5
## $ ID                                     <dbl> 6284621, 9458143, 6718092, 6284…
## $ `Descripcion estrato personal ocupado` <chr> "251 y más personas", "6 a 10 p…
## $ `Tipo de asentamiento humano`          <chr> "COLONIA", "COLONIA", "PARQUE I…
## $ `Entidad federativa`                   <chr> "BAJA CALIFORNIA", "BAJA CALIFO…
## $ Municipio                              <chr> "Ensenada", "Ensenada", "Tecate…
library(writexl)

getwd()
## [1] "/Users/emilianocolungabarrera/Documents/ITESM/Ciencia de Datos I/INEGI_DENUE_03062025/DENUE"
unique(comercios_estados$`Descripcion estrato personal ocupado`)
## [1] "251 y más personas" "6 a 10 personas"    "101 a 250 personas"
## [4] "51 a 100 personas"  "11 a 30 personas"   "31 a 50 personas"  
## [7] "0 a 5 personas"
unique(comercios_estados$`Tipo de asentamiento humano`)
## [1] "COLONIA"           "PARQUE INDUSTRIAL" "EJIDO"            
## [4] "ZONA INDUSTRIAL"   "CIUDAD INDUSTRIAL" "FRACCIONAMIENTO"  
## [7] "PUEBLO"            "LOCALIDAD"
library(dplyr)

comercios_estados <- comercios_estados %>%
  mutate(
    `Descripcion estrato personal ocupado` = case_when(
      `Descripcion estrato personal ocupado` == "0 a 5 personas" ~ "1",
      `Descripcion estrato personal ocupado` == "6 a 10 personas" ~ "2",
      `Descripcion estrato personal ocupado` == "11 a 30 personas" ~ "3",
      `Descripcion estrato personal ocupado` == "31 a 50 personas" ~ "4",
      `Descripcion estrato personal ocupado` == "51 a 100 personas" ~ "5",
      `Descripcion estrato personal ocupado` == "101 a 250 personas" ~ "6",
      `Descripcion estrato personal ocupado` == "251 y más personas" ~ "7",
      TRUE ~ `Descripcion estrato personal ocupado`
    ),
    
    `Tipo de asentamiento humano` = case_when(
      `Tipo de asentamiento humano` %in% c("COLONIA", "FRACCIONAMIENTO") ~ "0",
      `Tipo de asentamiento humano` %in% c("PARQUE INDUSTRIAL", "ZONA INDUSTRIAL", "CIUDAD INDUSTRIAL") ~ "1",
      `Tipo de asentamiento humano` == "EJIDO" ~ "0",
      `Tipo de asentamiento humano` == "PUEBLO" ~ "0",
      `Tipo de asentamiento humano` == "LOCALIDAD" ~ "0",
      TRUE ~ `Tipo de asentamiento humano`
    )
  )

# Cargar librerías necesarias
library(tidyverse)
library(FactoMineR)
library(factoextra)
library(ggrepel)  # Para etiquetas que no se sobrepongan

comercios_resumen <- comercios_estados %>%
  group_by(`Entidad federativa`,
           `Descripcion estrato personal ocupado`,
           `Tipo de asentamiento humano`) %>%
  summarise(
    Total_comercios = n(),
    .groups = "drop"
  )

comercios_pca <- comercios_resumen %>%
  mutate(tipo = paste0(`Descripcion estrato personal ocupado`, "-", `Tipo de asentamiento humano`)) %>%
  select(`Entidad federativa`, tipo, Total_comercios)

comercios_matrix <- comercios_pca %>%
  pivot_wider(names_from = tipo, values_from = Total_comercios, values_fill = 0)

estados <- comercios_matrix$`Entidad federativa`

comercios_numeric <- comercios_matrix %>%
  select(-`Entidad federativa`) %>%
  as.data.frame()
rownames(comercios_numeric) <- estados

pca_result <- PCA(comercios_numeric, scale.unit = TRUE, graph = FALSE)

fviz_pca_ind(pca_result,
             label = "none",
             repel = TRUE,
             col.ind = "steelblue") +
  geom_text_repel(aes(label = rownames(comercios_numeric)), size = 4) +
  ggtitle("PCA de comercios por estrato y asentamiento (por estado)") +
  theme_minimal()

comercios_resumen <- comercios_estados %>%
  group_by(`Entidad federativa`,
           `Descripcion estrato personal ocupado`,
           `Tipo de asentamiento humano`) %>%
  summarise(
    Total_comercios = n(),
    .groups = "drop"
  )

print(n=50,comercios_resumen)
## # A tibble: 49 × 4
##    `Entidad federativa` Descripcion estrato personal oc…¹ Tipo de asentamiento…²
##    <chr>                <chr>                             <chr>                 
##  1 BAJA CALIFORNIA      2                                 0                     
##  2 BAJA CALIFORNIA      3                                 0                     
##  3 BAJA CALIFORNIA      4                                 0                     
##  4 BAJA CALIFORNIA      4                                 1                     
##  5 BAJA CALIFORNIA      5                                 0                     
##  6 BAJA CALIFORNIA      5                                 1                     
##  7 BAJA CALIFORNIA      6                                 0                     
##  8 BAJA CALIFORNIA      6                                 1                     
##  9 BAJA CALIFORNIA      7                                 0                     
## 10 BAJA CALIFORNIA      7                                 1                     
## 11 CHIHUAHUA            1                                 1                     
## 12 CHIHUAHUA            3                                 1                     
## 13 CHIHUAHUA            4                                 1                     
## 14 CHIHUAHUA            5                                 1                     
## 15 CHIHUAHUA            6                                 0                     
## 16 CHIHUAHUA            6                                 1                     
## 17 CHIHUAHUA            7                                 0                     
## 18 CHIHUAHUA            7                                 1                     
## 19 CIUDAD DE MÉXICO     1                                 0                     
## 20 CIUDAD DE MÉXICO     5                                 0                     
## 21 COAHUILA DE ZARAGOZA 7                                 1                     
## 22 DURANGO              4                                 0                     
## 23 GUANAJUATO           6                                 1                     
## 24 JALISCO              3                                 0                     
## 25 JALISCO              3                                 1                     
## 26 MÉXICO               5                                 0                     
## 27 NUEVO LEÓN           2                                 0                     
## 28 NUEVO LEÓN           6                                 0                     
## 29 NUEVO LEÓN           6                                 1                     
## 30 OAXACA               3                                 0                     
## 31 OAXACA               4                                 0                     
## 32 PUEBLA               4                                 0                     
## 33 QUERÉTARO            1                                 1                     
## 34 QUERÉTARO            3                                 1                     
## 35 QUERÉTARO            4                                 1                     
## 36 QUERÉTARO            6                                 1                     
## 37 QUERÉTARO            7                                 1                     
## 38 SAN LUIS POTOSÍ      7                                 1                     
## 39 SONORA               1                                 0                     
## 40 SONORA               2                                 0                     
## 41 SONORA               3                                 0                     
## 42 SONORA               5                                 0                     
## 43 SONORA               5                                 1                     
## 44 SONORA               6                                 0                     
## 45 SONORA               6                                 1                     
## 46 SONORA               7                                 0                     
## 47 SONORA               7                                 1                     
## 48 YUCATÁN              7                                 0                     
## 49 ZACATECAS            6                                 1                     
## # ℹ abbreviated names: ¹​`Descripcion estrato personal ocupado`,
## #   ²​`Tipo de asentamiento humano`
## # ℹ 1 more variable: Total_comercios <int>
write_xlsx(comercios_resumen, path = "comercios_resumen_1")

library(dplyr)
library(writexl)

comercios_tipo_final <- comercios_estados %>%
  mutate(
    Tipo = paste0(`Descripcion estrato personal ocupado`, "-", `Tipo de asentamiento humano`)
  ) %>%
  group_by(`Entidad federativa`, Tipo) %>%
  summarise(Total_comercios = n(), .groups = "drop")

unique(comercios_tipo_final$`Tipo`)
##  [1] "2-0" "3-0" "4-0" "4-1" "5-0" "5-1" "6-0" "6-1" "7-0" "7-1" "1-1" "3-1"
## [13] "1-0"
comercios_tipo_final <- comercios_tipo_final %>%
  mutate(
    Tipo_codificado = recode(
      Tipo,
      "1-0" = "1", "1-1" = "2",
      "2-0" = "3", "2-1" = "4",
      "3-0" = "5", "3-1" = "6",
      "4-0" = "7", "4-1" = "8",
      "5-0" = "9", "5-1" = "10",
      "6-0" = "11", "6-1" = "12",
      "7-0" = "13", "7-1" = "14"
    )
  )

print(n=60,comercios_tipo_final)
## # A tibble: 49 × 4
##    `Entidad federativa` Tipo  Total_comercios Tipo_codificado
##    <chr>                <chr>           <int> <chr>          
##  1 BAJA CALIFORNIA      2-0                 2 3              
##  2 BAJA CALIFORNIA      3-0                 1 5              
##  3 BAJA CALIFORNIA      4-0                 1 7              
##  4 BAJA CALIFORNIA      4-1                 1 8              
##  5 BAJA CALIFORNIA      5-0                 2 9              
##  6 BAJA CALIFORNIA      5-1                 1 10             
##  7 BAJA CALIFORNIA      6-0                 2 11             
##  8 BAJA CALIFORNIA      6-1                 5 12             
##  9 BAJA CALIFORNIA      7-0                 4 13             
## 10 BAJA CALIFORNIA      7-1                 7 14             
## 11 CHIHUAHUA            1-1                 1 2              
## 12 CHIHUAHUA            3-1                 2 6              
## 13 CHIHUAHUA            4-1                 1 8              
## 14 CHIHUAHUA            5-1                 1 10             
## 15 CHIHUAHUA            6-0                 3 11             
## 16 CHIHUAHUA            6-1                 6 12             
## 17 CHIHUAHUA            7-0                 3 13             
## 18 CHIHUAHUA            7-1                13 14             
## 19 CIUDAD DE MÉXICO     1-0                 1 1              
## 20 CIUDAD DE MÉXICO     5-0                 1 9              
## 21 COAHUILA DE ZARAGOZA 7-1                 2 14             
## 22 DURANGO              4-0                 1 7              
## 23 GUANAJUATO           6-1                 1 12             
## 24 JALISCO              3-0                 1 5              
## 25 JALISCO              3-1                 1 6              
## 26 MÉXICO               5-0                 1 9              
## 27 NUEVO LEÓN           2-0                 1 3              
## 28 NUEVO LEÓN           6-0                 1 11             
## 29 NUEVO LEÓN           6-1                 1 12             
## 30 OAXACA               3-0                 1 5              
## 31 OAXACA               4-0                 1 7              
## 32 PUEBLA               4-0                 1 7              
## 33 QUERÉTARO            1-1                 1 2              
## 34 QUERÉTARO            3-1                 2 6              
## 35 QUERÉTARO            4-1                 1 8              
## 36 QUERÉTARO            6-1                 6 12             
## 37 QUERÉTARO            7-1                 5 14             
## 38 SAN LUIS POTOSÍ      7-1                 1 14             
## 39 SONORA               1-0                 2 1              
## 40 SONORA               2-0                 1 3              
## 41 SONORA               3-0                 2 5              
## 42 SONORA               5-0                 1 9              
## 43 SONORA               5-1                 8 10             
## 44 SONORA               6-0                 2 11             
## 45 SONORA               6-1                 7 12             
## 46 SONORA               7-0                 2 13             
## 47 SONORA               7-1                 3 14             
## 48 YUCATÁN              7-0                 1 13             
## 49 ZACATECAS            6-1                 1 12
comercios_valor_industria <- comercios_tipo_final %>%
  mutate(
    Tipo_codificado = as.numeric(Tipo_codificado),  # Asegura que sea numérico
    Valor_industria = Total_comercios * Tipo_codificado
  ) %>%
  group_by(`Entidad federativa`) %>%
  summarise(
    Valor_industria = sum(Valor_industria),
    Total_comercios = sum(Total_comercios),
    .groups = "drop"
  ) %>%
  arrange(desc(Valor_industria))  # Opcional: ordenar por valor

print(comercios_valor_industria, n = 32)
## # A tibble: 16 × 3
##    `Entidad federativa` Valor_industria Total_comercios
##    <chr>                          <dbl>           <int>
##  1 CHIHUAHUA                        358              30
##  2 BAJA CALIFORNIA                  286              26
##  3 SONORA                           278              28
##  4 QUERÉTARO                        164              15
##  5 COAHUILA DE ZARAGOZA              28               2
##  6 NUEVO LEÓN                        26               3
##  7 SAN LUIS POTOSÍ                   14               1
##  8 YUCATÁN                           13               1
##  9 GUANAJUATO                        12               1
## 10 OAXACA                            12               2
## 11 ZACATECAS                         12               1
## 12 JALISCO                           11               2
## 13 CIUDAD DE MÉXICO                  10               2
## 14 MÉXICO                             9               1
## 15 DURANGO                            7               1
## 16 PUEBLA                             7               1
# Leer el archivo de nuevo saltando las primeras 6 filas
escolaridad_limpia <- read_excel("/Users/emilianocolungabarrera/Documents/ITESM/Educacion_05.xlsx", skip = 6)

# Renombrar columnas
colnames(escolaridad_limpia) <- c("Entidad federativa", "Escolaridad promedio")

# Eliminar filas con NA o vacías
escolaridad_limpia <- escolaridad_limpia %>%
  filter(!is.na(`Escolaridad promedio`)) %>%
  filter(`Entidad federativa` != "Estados Unidos Mexicanos")  # Si no quieres incluir el total nacional

# Convertir columna de escolaridad a numérica
escolaridad_limpia <- escolaridad_limpia %>%
  mutate(`Escolaridad promedio` = as.numeric(`Escolaridad promedio`))


# Convertimos los nombres de entidades a mayúsculas en ambos dataframes
comercios_valor_industria <- comercios_valor_industria %>%
  mutate(`Entidad federativa` = toupper(`Entidad federativa`))

escolaridad_limpia <- escolaridad_limpia %>%
  mutate(`Entidad federativa` = toupper(`Entidad federativa`))

# Hacemos el join con nombres en mayúsculas
comercios_educacion <- comercios_valor_industria %>%
  left_join(escolaridad_limpia, by = "Entidad federativa")

write_xlsx(comercios_educacion, path = "comercios_estados_2.xlsx")


# pca ---------------------------------------------------------------------

# Cargar librerías necesarias
library(tidyverse)  # Para manejo de datos
library(FactoMineR) # Para PCA
library(factoextra) # Para visualización del PCA

# Ejemplo de data frame
# df <- data.frame(
#   estados = c("Aguascalientes", "Baja California", "Campeche"),
#   var1 = c(10, 20, 30),
#   var2 = c(5, 3, 8),
#   var3 = c(100, 150, 200)
# )

# Supongamos que ya tienes tu data frame llamado `df`
comercios_resumen$Trabajadores <- as.numeric(comercios_resumen$"Descripcion estrato personal ocupado")
comercios_resumen$Asentamiento <- as.numeric(comercios_resumen$"Tipo de asentamiento humano")
comercios_resumen$`Descripcion estrato personal ocupado` <- NULL
comercios_resumen$`Tipo de asentamiento humano` <- NULL


# Eliminar la columna de identificación para el PCA
df_pca <- comercios_resumen %>%
  select(-`Entidad federativa`)

# Estandarizar las variables (media 0, varianza 1) y hacer PCA
res.pca <- PCA(df_pca, scale.unit = TRUE, graph = FALSE)

# Visualizar la varianza explicada por componente
fviz_eig(res.pca, addlabels = TRUE)

# Visualizar los individuos (estados)
# Ya tienes esto:
comercios_matrix <- comercios_pca %>%
  pivot_wider(names_from = tipo, values_from = Total_comercios, values_fill = 0)

# Lo correcto es usar esta matriz para el PCA:
comercios_numeric <- comercios_matrix %>%
  select(-`Entidad federativa`) %>%
  as.data.frame()
rownames(comercios_numeric) <- comercios_matrix$`Entidad federativa`

# Y ahora haces el PCA:
res.pca <- PCA(comercios_numeric, scale.unit = TRUE, graph = FALSE)

# Puedes visualizar con habillage:
grupo <- as.factor(comercios_matrix$`Entidad federativa`)

fviz_pca_ind(res.pca,
             label = "none",
             habillage = grupo,
             repel = TRUE,
             addEllipses = FALSE)

# Visualizar las variables
fviz_pca_var(res.pca,
             col.var = "contrib", # Color por contribución
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)

# Si deseas guardar los resultados en un data frame:
pca_coords <- as.data.frame(res.pca$ind$coord)
pca_coords$estado <- rownames(pca_coords)


# Mostrar resultados
print(pca_coords)
##                           Dim.1      Dim.2       Dim.3       Dim.4      Dim.5
## BAJA CALIFORNIA       4.8478756  1.8428214  3.72066600 -0.56340362  0.4650872
## CHIHUAHUA             4.9231835 -3.9715220 -0.41182354 -0.04087072 -1.2623485
## CIUDAD DE MÉXICO     -0.9909228  0.9928247 -0.67971151 -1.08735143  1.0636766
## COAHUILA DE ZARAGOZA -1.4609387 -0.2856727 -0.21776769 -0.47261802 -0.4054188
## DURANGO              -1.6505400  0.1169203  0.99935043  1.20035489 -0.1407018
## GUANAJUATO           -1.5114796 -0.1707291 -0.31448556 -0.42175336 -0.2190411
## JALISCO              -1.0147436 -0.1664828 -0.75967786  0.56509966  0.1920513
## MÉXICO               -1.2901617  0.3508055  0.17271181 -1.11139756  0.6890272
## NUEVO LEÓN           -0.6436154  0.3382007  0.26498890 -0.88568597 -0.7872491
## OAXACA               -1.2934262  0.7153340  0.77395157  1.95153594  0.0176847
## PUEBLA               -1.6505400  0.1169203  0.99935043  1.20035489 -0.1407018
## QUERÉTARO             1.8581413 -3.8131073 -1.00576991  0.51390798  1.7306103
## SAN LUIS POTOSÍ      -1.5630823 -0.2190725 -0.23604409 -0.46225681 -0.3422177
## SONORA                4.3136479  4.4247118 -2.92546308  0.58445719 -0.1284394
## YUCATÁN              -1.3619184 -0.1012232 -0.06579035 -0.54861970 -0.5129780
## ZACATECAS            -1.5114796 -0.1707291 -0.31448556 -0.42175336 -0.2190411
##                                    estado
## BAJA CALIFORNIA           BAJA CALIFORNIA
## CHIHUAHUA                       CHIHUAHUA
## CIUDAD DE MÉXICO         CIUDAD DE MÉXICO
## COAHUILA DE ZARAGOZA COAHUILA DE ZARAGOZA
## DURANGO                           DURANGO
## GUANAJUATO                     GUANAJUATO
## JALISCO                           JALISCO
## MÉXICO                             MÉXICO
## NUEVO LEÓN                     NUEVO LEÓN
## OAXACA                             OAXACA
## PUEBLA                             PUEBLA
## QUERÉTARO                       QUERÉTARO
## SAN LUIS POTOSÍ           SAN LUIS POTOSÍ
## SONORA                             SONORA
## YUCATÁN                           YUCATÁN
## ZACATECAS                       ZACATECAS

Datos de universidades

datos <- read.csv("0_universidad_directorio 2.csv")

universidades_por_estado <- datos %>%
  group_by(nom_ent) %>%
  summarise(total = n())

library(sf)
library(ggplot2)
library(dplyr)
library(rnaturalearth)
library(rnaturalearthdata)
library(rnaturalearth)
library(rnaturalearthhires)
library(sf)

mexico_estados <- ne_states(country = "Mexico", returnclass = "sf")


mexico_estados <- ne_states(country = "Mexico", returnclass = "sf")

datos_mapa <- datos %>%
  filter(!is.na(gmaps_latitud), !is.na(gmaps_longitud)) %>%
  filter(gmaps_latitud >= 14, gmaps_latitud <= 33) %>%
  filter(gmaps_longitud >= -118, gmaps_longitud <= -86) %>%
  filter(nom_ent != "Total nacional")

ggplot() +
  geom_sf(data = mexico_estados, fill = "gray95", color = "black", size = 0.3) +
  geom_point(data = datos_mapa,
             aes(x = gmaps_longitud, y = gmaps_latitud, color = nom_ent),
             alpha = 0.7, size = 2) +
  labs(title = "Ubicación de universidades en México con división estatal",
       x = "Longitud", y = "Latitud", color = "Estado") +
  theme_minimal() +
  coord_sf()

df_ordenado <- universidades_por_estado %>% arrange(nom_ent)

print(df_ordenado$total[1:40])
##  [1]  47  93  26  48 135  96 349  91  23  56 113  66  72 203 112  82 299  36 100
## [20] 104 239  74  35  81  90 119  57 136  42   2 236  79  47  NA  NA  NA  NA  NA
## [39]  NA  NA

Datos de HHI

# HHI por estados exportadores --------------------------------------------------------------------
  
  # Calcular HHI por estado
  hhi_export_178802 <- df %>%
    filter(Flow == "Exports", HS4.4.Digit.ID == 178802) %>%
    group_by(State, Country) %>%
    summarise(export_value = sum(Trade.Value, na.rm = TRUE), .groups = "drop") %>%
    group_by(State) %>%
    mutate(
      total_exports = sum(export_value),
      share = export_value / total_exports,
      share_sq = share^2
    ) %>%
    summarise(HHI = sum(share_sq), .groups = "drop")
  
  # Ver los resultados
  print(hhi_export_178802)
## # A tibble: 3 × 2
##   State              HHI
##   <chr>            <dbl>
## 1 Ciudad de México 0.719
## 2 Estado de México 1    
## 3 Nuevo León       0.959
  hhi_export_178803 <- df %>%
    filter(Flow == "Exports", HS4.4.Digit.ID == 178803) %>%
    group_by(State, Country) %>%
    summarise(export_value = sum(Trade.Value, na.rm = TRUE), .groups = "drop") %>%
    group_by(State) %>%
    mutate(
      total_exports = sum(export_value),
      share = export_value / total_exports,
      share_sq = share^2
    ) %>%
    summarise(HHI = sum(share_sq), .groups = "drop")
  
  # Ver los resultados
  print(hhi_export_178803)
## # A tibble: 13 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Baja California      0.994
##  2 Chihuahua            0.973
##  3 Ciudad de México     0.725
##  4 Coahuila de Zaragoza 0.961
##  5 Estado de México     0.867
##  6 Jalisco              0.735
##  7 No Informado         0.958
##  8 Nuevo León           0.903
##  9 Querétaro            0.261
## 10 San Luis Potosí      0.559
## 11 Sinaloa              1    
## 12 Sonora               0.902
## 13 Tamaulipas           0.529
  # HHI_total trade value ---------------------------------------------------
  
  # Calcular HHI por estado
  hhi_total_178802 <- df %>%
    filter(HS4.4.Digit.ID == 178802) %>%
    group_by(State, Country) %>%
    summarise(trade_value = sum(Trade.Value, na.rm = TRUE), .groups = "drop") %>%
    group_by(State) %>%
    mutate(
      total_value = sum(trade_value),
      share = trade_value / total_value,
      share_sq = share^2
    ) %>%
    summarise(HHI = sum(share_sq), .groups = "drop")
  
  # Ver los resultados
  print(hhi_total_178802)
## # A tibble: 17 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Aguascalientes       0.718
##  2 Baja California      0.508
##  3 Chihuahua            0.499
##  4 Ciudad de México     0.226
##  5 Coahuila de Zaragoza 0.590
##  6 Estado de México     0.449
##  7 Jalisco              0.613
##  8 Michoacán de Ocampo  0.609
##  9 No Informado         0.996
## 10 Nuevo León           0.889
## 11 Puebla               0.790
## 12 Querétaro            0.730
## 13 Quintana Roo         0.372
## 14 Sinaloa              0.474
## 15 Sonora               0.903
## 16 Tamaulipas           0.969
## 17 Yucatán              0.785
  hhi_total_178803 <- df %>%
    filter(HS4.4.Digit.ID == 178803) %>%
    group_by(State, Country) %>%
    summarise(trade_value = sum(Trade.Value, na.rm = TRUE), .groups = "drop") %>%
    group_by(State) %>%
    mutate(
      total_value = sum(trade_value),
      share = trade_value / total_value,
      share_sq = share^2
    ) %>%
    summarise(HHI = sum(share_sq), .groups = "drop")
  
  # Ver los resultados
  print(hhi_total_178803)
## # A tibble: 22 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Baja California      0.988
##  2 Baja California Sur  0.613
##  3 Chiapas              1    
##  4 Chihuahua            0.948
##  5 Ciudad de México     0.633
##  6 Coahuila de Zaragoza 0.968
##  7 Colima               0.944
##  8 Durango              0.916
##  9 Estado de México     0.670
## 10 Guanajuato           0.333
## # ℹ 12 more rows
  # Ver los resultados
  print(hhi_total_178803)
## # A tibble: 22 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Baja California      0.988
##  2 Baja California Sur  0.613
##  3 Chiapas              1    
##  4 Chihuahua            0.948
##  5 Ciudad de México     0.633
##  6 Coahuila de Zaragoza 0.968
##  7 Colima               0.944
##  8 Durango              0.916
##  9 Estado de México     0.670
## 10 Guanajuato           0.333
## # ℹ 12 more rows
  # HHI Internacional -------------------------------------------------------

world_data = readxl::read_excel("~/Documents/ITESM/Ciencia de Datos I/Data Trade/TradeData (1).xlsx")

Matriz de Estados

  # Matriz  -----------------------------------------------------------------
dfA = read.csv("~/Documents/ITESM/economy_foreign_trade_mun_2025-05-29T23_08_43.825Z.csv")
  
  matriz_8802 = dfA %>% filter(`HS4.4.Digit.ID` == 178802) %>%
    group_by(`State.ID`, `State`, `Flow`) %>%
    summarise(
      `Total_Trade_Value` = sum(`Trade.Value`, na.rm = TRUE), .groups = "drop") %>% 
    pivot_wider(
      names_from = Flow,
      values_from = `Total_Trade_Value`,
      values_fill = 0
    ) %>%
    
    mutate(
      `Total comercio` = Exports + Imports
    )
  
  df_unido_8802 <- left_join(matriz_8802, hhi_total_178802, by = "State")
  
  matriz_8803 = dfA %>% filter(`HS4.4.Digit.ID` == 178803) %>%
    group_by(`State.ID`, `State`, `Flow`) %>%
    summarise(
      `Total_Trade_Value` = sum(`Trade.Value`, na.rm = TRUE), .groups = "drop") %>% 
    pivot_wider(
      names_from = Flow,
      values_from = `Total_Trade_Value`,
      values_fill = 0
    ) %>%
    mutate(
      `Total comercio` = Exports + Imports
    )
  
  df_unido_8803 <- left_join(matriz_8803, hhi_total_178803, by = "State")
  
  print(hhi_export_178803)
## # A tibble: 13 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Baja California      0.994
##  2 Chihuahua            0.973
##  3 Ciudad de México     0.725
##  4 Coahuila de Zaragoza 0.961
##  5 Estado de México     0.867
##  6 Jalisco              0.735
##  7 No Informado         0.958
##  8 Nuevo León           0.903
##  9 Querétaro            0.261
## 10 San Luis Potosí      0.559
## 11 Sinaloa              1    
## 12 Sonora               0.902
## 13 Tamaulipas           0.529
  hhi_total_178802 <- df %>%
  filter(HS4.4.Digit.ID == 178802) %>%
  group_by(State, Country) %>%
  summarise(trade_value = sum(Trade.Value, na.rm = TRUE), .groups = "drop") %>%
  group_by(State) %>%
  mutate(
    total_value = sum(trade_value),
    share = trade_value / total_value,
    share_sq = share^2
  ) %>%
  summarise(HHI = sum(share_sq), .groups = "drop")

# Ver los resultados
print(hhi_total_178802)
## # A tibble: 17 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Aguascalientes       0.718
##  2 Baja California      0.508
##  3 Chihuahua            0.499
##  4 Ciudad de México     0.226
##  5 Coahuila de Zaragoza 0.590
##  6 Estado de México     0.449
##  7 Jalisco              0.613
##  8 Michoacán de Ocampo  0.609
##  9 No Informado         0.996
## 10 Nuevo León           0.889
## 11 Puebla               0.790
## 12 Querétaro            0.730
## 13 Quintana Roo         0.372
## 14 Sinaloa              0.474
## 15 Sonora               0.903
## 16 Tamaulipas           0.969
## 17 Yucatán              0.785
hhi_total_178803 <- df %>%
  filter(HS4.4.Digit.ID == 178803) %>%
  group_by(State, Country) %>%
  summarise(trade_value = sum(Trade.Value, na.rm = TRUE), .groups = "drop") %>%
  group_by(State) %>%
  mutate(
    total_value = sum(trade_value),
    share = trade_value / total_value,
    share_sq = share^2
  ) %>%
  summarise(HHI = sum(share_sq), .groups = "drop") 
  

# Ver los resultados
print(hhi_total_178803)
## # A tibble: 22 × 2
##    State                  HHI
##    <chr>                <dbl>
##  1 Baja California      0.988
##  2 Baja California Sur  0.613
##  3 Chiapas              1    
##  4 Chihuahua            0.948
##  5 Ciudad de México     0.633
##  6 Coahuila de Zaragoza 0.968
##  7 Colima               0.944
##  8 Durango              0.916
##  9 Estado de México     0.670
## 10 Guanajuato           0.333
## # ℹ 12 more rows
# HHI Internacional -------------------------------------------------------

setwd("/Users/emilianocolungabarrera/Documents/ITESM/")
list.files()
##  [1] "0_universidad_directorio 2.csv"                        
##  [2] "Analisis.R"                                            
##  [3] "carreteras.xlsx"                                       
##  [4] "Ciencia de Datos I"                                    
##  [5] "comercios_estados.xlsx"                                
##  [6] "economy_foreign_trade_mun_2025-05-29T23_08_43.825Z.csv"
##  [7] "Educacion_05.xlsx"                                     
##  [8] "educacion.xlsx"                                        
##  [9] "Emprendimiento"                                        
## [10] "Estadística"                                           
## [11] "Evidencia .Rmd"                                        
## [12] "Evidencia-_files"                                      
## [13] "Evidencia-.html"                                       
## [14] "Evidencia-.Rmd"                                        
## [15] "Exploratorio.R"                                        
## [16] "identificacion_responsable_pago.pdf"                   
## [17] "ied.xlsx"                                              
## [18] "INEGI_DENUE_03062025.csv"                              
## [19] "Instituciones"                                         
## [20] "Opinión"                                               
## [21] "Panel"                                                 
## [22] "rsconnect"                                             
## [23] "Segundo Semestre"                                      
## [24] "Standard Report - Imports.csv"                         
## [25] "styles.css"                                            
## [26] "Tercer Semestre"                                       
## [27] "TradeData (1).xlsx"                                    
## [28] "Universidad_Graduados.xlsx"                            
## [29] "Universidad-Graduados.xlsx"
world_data = read_excel("TradeData (1).xlsx")
usa_data <- read.csv("Standard Report - Imports.csv", header = FALSE)
head(usa_data)

Matriz de estados y Construcción de Distancia P2

getwd()
## [1] "/Users/emilianocolungabarrera/Documents/ITESM"
list
## function (...)  .Primitive("list")
dfA = read.csv("economy_foreign_trade_mun_2025-05-29T23_08_43.825Z.csv")

matriz_8802 = dfA %>% filter(`HS4.4.Digit.ID` == 178802) %>%
  group_by(`State.ID`, `State`, `Flow`) %>%
  summarise(
    `Total_Trade_Value` = sum(`Trade.Value`, na.rm = TRUE), .groups = "drop") %>% 
  pivot_wider(
    names_from = Flow,
    values_from = `Total_Trade_Value`,
    values_fill = 0
  ) %>%
 
  mutate(
    `Total comercio` = Exports + Imports
  )

df_unido_8802 <- left_join(matriz_8802, hhi_total_178802, by = "State")

matriz_8803 = dfA %>% filter(`HS4.4.Digit.ID` == 178803) %>%
  group_by(`State.ID`, `State`, `Flow`) %>%
  summarise(
    `Total_Trade_Value` = sum(`Trade.Value`, na.rm = TRUE), .groups = "drop") %>% 
  pivot_wider(
    names_from = Flow,
    values_from = `Total_Trade_Value`,
    values_fill = 0
  ) %>%
  mutate(
    `Total comercio` = Exports + Imports
  )

df_unido_8803 <- left_join(matriz_8803, hhi_total_178803, by = "State")

list.files()
##  [1] "0_universidad_directorio 2.csv"                        
##  [2] "Analisis.R"                                            
##  [3] "carreteras.xlsx"                                       
##  [4] "Ciencia de Datos I"                                    
##  [5] "comercios_estados.xlsx"                                
##  [6] "economy_foreign_trade_mun_2025-05-29T23_08_43.825Z.csv"
##  [7] "Educacion_05.xlsx"                                     
##  [8] "educacion.xlsx"                                        
##  [9] "Emprendimiento"                                        
## [10] "Estadística"                                           
## [11] "Evidencia .Rmd"                                        
## [12] "Evidencia-_files"                                      
## [13] "Evidencia-.html"                                       
## [14] "Evidencia-.Rmd"                                        
## [15] "Exploratorio.R"                                        
## [16] "identificacion_responsable_pago.pdf"                   
## [17] "ied.xlsx"                                              
## [18] "INEGI_DENUE_03062025.csv"                              
## [19] "Instituciones"                                         
## [20] "Opinión"                                               
## [21] "Panel"                                                 
## [22] "rsconnect"                                             
## [23] "Segundo Semestre"                                      
## [24] "Standard Report - Imports.csv"                         
## [25] "styles.css"                                            
## [26] "Tercer Semestre"                                       
## [27] "TradeData (1).xlsx"                                    
## [28] "Universidad_Graduados.xlsx"                            
## [29] "Universidad-Graduados.xlsx"
dnue88 <- read_excel("comercios_estados.xlsx")

dnue88 <- dnue88 %>% rename(State = `Entidad federativa`) %>% 
  mutate(State = tolower(State))

dnue88 = dnue88 %>% 
  mutate(State = recode(State,
                        "méxico" = "estado de méxico",))

df_unido_8802 <- df_unido_8802%>% 
  mutate(State = tolower(State))

df_unido_8803 <- df_unido_8803%>% 
  mutate(State = tolower(State))

df_unido_8802_A <- left_join(df_unido_8802, dnue88, by = "State")
df_unido_8803_A <- left_join(df_unido_8803, dnue88, by = "State")

df_unido_8802_A <- df_unido_8802_A %>%
  mutate(
    across(where(is.numeric), ~replace_na(., 0)),
    across(where(is.character), ~replace_na(., ""))
  )

df_unido_8803_A <- df_unido_8803_A %>%
  mutate(
    across(where(is.numeric), ~replace_na(., 0)),
    across(where(is.character), ~replace_na(., ""))
  )

df_escolaridad <- read_excel("Universidad_Graduados.xlsx")

names(df_escolaridad)
## [1] "Entidad federativa" "...2"               "Graduados 2023-24" 
## [4] "Población 20-24"    "Tasa"               "Universidades"
df_escolaridad <- df_escolaridad %>%
  rename(borrar = ...2,
         State = `Entidad federativa`)

df_escolaridad <- df_escolaridad %>% select(-borrar, -`Graduados 2023-24`, -`Población 20-24`)

df_escolaridad <- df_escolaridad%>% 
  mutate(State = tolower(State))

df_escolaridad <- df_escolaridad %>%
  mutate(State = recode(State,
                        "méxico" = "estado de méxico",))

df_unido_8802_A <- left_join(df_unido_8802_A, df_escolaridad, by = "State")
df_unido_8803_A <- left_join(df_unido_8803_A, df_escolaridad, by = "State" )


df_carreteras <- read_excel("carreteras.xlsx")
df_carreteras <- df_carreteras %>% filter(tipo == "Pavimentadas")

df_carreteras <- df_carreteras %>% select(-tipo) %>%
  mutate(State = tolower(State))

df_carreteras <- df_carreteras %>%
  mutate(State = recode(State,
                        "coahuila" = "coahuila de zaragoza",
                        "veracruz" = "veracruz de ignacio de la llave",
                        "méxico" = "estado de méxico",
                        "michocán" = "michoacán de ocampo",
                        ))
         

df_unido_8802_A <- left_join(df_unido_8802_A, df_carreteras, by = "State")
df_unido_8803_A <- left_join(df_unido_8803_A, df_carreteras, by = "State")

df_ied <- read_excel("ied.xlsx")
df_ied <- df_ied%>% 
  mutate(State = tolower(State))

df_unido_8802_A <- left_join(df_unido_8802_A, df_ied, by = "State")
df_unido_8803_A <- left_join(df_unido_8803_A, df_ied, by = "State")

df_años_edu <- read_excel("educacion.xlsx")
df_años_edu <- df_años_edu %>% 
  mutate(State = tolower(State))

df_unido_8802_A <- left_join(df_unido_8802_A, df_años_edu, by = "State")
df_unido_8803_A <- left_join(df_unido_8803_A, df_años_edu, by = "State")

df_unido_8802_A <- df_unido_8802_A[df_unido_8802_A$State != "no informado", ]
df_unido_8803_A <- df_unido_8803_A[df_unido_8803_A$State != "no informado", ]

comercios_educacion <- comercios_educacion %>%
  rename(State = `Entidad federativa`)

comercios_educacion <- comercios_educacion %>%
  mutate(State = tolower(State)) %>%
  mutate(State = recode(State,
                        "méxico" = "estado de méxico",
                        "michoacán" = "michoacán de ocampo",
                        "veracruz" = "veracruz de ignacio de la llave"))

df_unido_8802_A <- left_join(df_unido_8802_A, comercios_educacion %>%
                               select(State, Valor_industria, Total_comercios),
                             by = "State")


df_unido_8803_A <- left_join(df_unido_8803_A, comercios_educacion %>%
                               select(State, Valor_industria, Total_comercios),
                             by = "State")


# Selección de variables para el análisis
vars <- c("Exports", "Imports", "Total comercio", "HHI", 
          "Valor_industria", "Total comercio", "años_edu", "Tasa", "Universidades", "km", "IED")

# Normalización entre 0 y 1
df_norm_8802_A <- df_unido_8802_A %>%
  mutate(across(all_of(vars), ~ rescale(.x, to = c(0,1), na.rm = TRUE)))

# Matriz de correlación
mat_cor_8802 <- cor(df_norm_8802_A[, vars], use = "pairwise.complete.obs")

# Penalización: promedio de correlaciones por fila
penalizacion <- rowMeans(abs(mat_cor_8802))

# Índice P2: promedio de variables - penalización
df_norm_8802_A$P2 <- rowMeans(df_norm_8802_A[, vars], na.rm = TRUE) - penalizacion

df_resultados_8802 <- df_unido_8802_A %>%
  mutate(P2 = df_norm_8802_A$P2) %>%
  arrange(desc(P2))  # Ordenar de mayor a menor potencial

ggplot(df_resultados_8802, aes(x = reorder(State, P2), y = P2)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  labs(title = "Índice P2 de Potencial Aeroespacial por Estado",
       x = "Estado", y = "Índice P2 (normalizado)") +
  theme_minimal()

# Gráfica mejorada del Índice P2 de Potencial Aeroespacial
ggplot(df_resultados_8802, aes(x = reorder(State, P2), y = P2)) +
  
  # Barras con gradiente de colores basado en el valor
  geom_col(aes(fill = P2), 
           width = 0.8, 
           alpha = 0.9,
           color = "white", 
           linewidth = 0.3) +
  
  # Añadir etiquetas de valores en las barras
  geom_text(aes(label = round(P2, 3)), 
            hjust = -0.1, 
            size = 3.5, 
            color = "#2c3e50",
            fontface = "bold") +
  
  # Voltear coordenadas para barras horizontales
  coord_flip() +
  
  # Escala de colores moderna (gradiente azul-verde)
  scale_fill_gradient2(
    low = "#55585a",      # Azul claro para valores bajos
    mid = "#BC955C",      # Verde para valores medios
    high = "#9F2241",     # Rojo para valores altos
    midpoint = median(df_resultados_8802$P2, na.rm = TRUE),
    name = "Índice P2",
    guide = guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barwidth = 15,
      barheight = 0.8
    )
  ) +
  
  # Escala del eje Y con formato mejorado
  scale_y_continuous(
    labels = number_format(accuracy = 0.001, decimal.mark = "."),
    expand = expansion(mult = c(0, 0.15))  # Espacio extra a la derecha para etiquetas
  ) +
  
  # Títulos y etiquetas mejorados
  labs(
    title = "Índice P2 de Competitividad Aeronautica y Aeroespacial por Estado. Fabricación de aeronaves",
    subtitle = "Ranking de estados mexicanos según su capacidad en el sector aeroespacial",
    x = "",  # Removemos etiqueta del eje x (estados)
    y = "Índice P2 (normalizado)",
    caption = "Elaboración propia con datos de INEGI, Secretaria de Economía y SEMARNAT"
  ) +
  
  # Tema personalizado y profesional
  theme_minimal(base_size = 12, base_family = "Arial") +
  theme(
    # Configuración del título principal
    plot.title = element_text(
      size = 18, 
      face = "bold", 
      color = "#2c3e50",
      margin = margin(b = 5),
      hjust = 0,
      family = "Arial"
    ),
    
    # Configuración del subtítulo
    plot.subtitle = element_text(
      size = 13, 
      color = "#7f8c8d",
      margin = margin(b = 25),
      hjust = 0
    ),
    
    # Configuración del caption
    plot.caption = element_text(
      size = 10, 
      color = "#95a5a6",
      hjust = 0,
      margin = margin(t = 15)
    ),
    
    # Configuración de los ejes
    axis.title.x = element_text(
      size = 12, 
      color = "#2c3e50",
      margin = margin(t = 15)
    ),
    
    axis.text.y = element_text(
      size = 11, 
      color = "#2c3e50",
      margin = margin(r = 10)
    ),
    
    axis.text.x = element_text(
      size = 10, 
      color = "#2c3e50"
    ),
    
    # Configuración de la leyenda
    legend.position = "bottom",
    legend.title = element_text(size = 11, face = "bold"),
    legend.text = element_text(size = 10),
    legend.margin = margin(t = 20),
    legend.box = "horizontal",
    
    # Configuración de la grilla
    panel.grid.major.x = element_line(
      color = "#ecf0f1", 
      linewidth = 0.5,
      linetype = "solid"
    ),
    panel.grid.minor.x = element_line(
      color = "#f8f9fa", 
      linewidth = 0.3
    ),
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_blank(),
    
    # Configuración del fondo
    plot.background = element_rect(fill = "white", color = NA),
    panel.background = element_rect(fill = "white", color = NA),
    
    # Márgenes del plot
    plot.margin = margin(25, 25, 25, 25),
    
    # Configuración del panel
    panel.border = element_blank(),
    axis.line.x = element_line(color = "#bdc3c7", linewidth = 0.5)
  )

# matriz 8803 ------------------------------------------------------------- 

# Normalización entre 0 y 1
df_norm_8803_A <- df_unido_8803_A %>%
  mutate(across(all_of(vars), ~ rescale(.x, to = c(0,1), na.rm = TRUE)))

# Matriz de correlación
mat_cor_8803 <- cor(df_norm_8803_A[, vars], use = "pairwise.complete.obs")

# Penalización: promedio de correlaciones por fila
penalizacion <- rowMeans(abs(mat_cor_8803))

# Índice P2: promedio de variables - penalización
df_norm_8803_A$P2 <- rowMeans(df_norm_8803_A[, vars], na.rm = TRUE) - penalizacion

df_resultados_8803 <- df_unido_8803_A %>%
  mutate(P2 = df_norm_8803_A$P2) %>%
  arrange(desc(P2))  # Ordenar de mayor a menor potencial

Gráfico de Índice de Competitividad Aeronáutica

library(ggplot2)

ggplot(df_resultados_8803, aes(x = reorder(State, P2), y = P2)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  labs(title = "Índice P2 de Competitividad Aeronautica y Aeroespacial por Estado. Fabricación de partes",
       x = "Estado", y = "Índice P2 (normalizado)") +
  theme_minimal()

library(ggplot2)
library(scales)

# Gráfica mejorada del Índice P2 de Potencial Aeroespacial (HS 8803)
ggplot(df_resultados_8803, aes(x = reorder(State, P2), y = P2)) +
  
  # Barras con gradiente de colores basado en el valor
  geom_col(aes(fill = P2), 
           width = 0.8, 
           alpha = 0.9,
           color = "white", 
           linewidth = 0.3) +
  
  # Añadir etiquetas de valores en las barras
  geom_text(aes(label = round(P2, 3)), 
            hjust = -0.1, 
            size = 3.5, 
            color = "#2c3e50",
            fontface = "bold") +
  
  # Voltear coordenadas para barras horizontales
  coord_flip() +
  
  # Escala de colores moderna (gradiente azul-verde)
  scale_fill_gradient2(
    low = "#55585a",      # Azul claro para valores bajos
    mid = "#BC955C",      # Verde para valores medios
    high = "#9F2241",     # Rojo para valores altos
    midpoint = median(df_resultados_8803$P2, na.rm = TRUE),
    name = "Índice P2",
    guide = guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barwidth = 15,
      barheight = 0.8
    )
  ) +
  
  # Escala del eje Y con formato mejorado
  scale_y_continuous(
    labels = number_format(accuracy = 0.001, decimal.mark = "."),
    expand = expansion(mult = c(0, 0.15))  # Espacio extra a la derecha para etiquetas
  ) +
  
  # Títulos y etiquetas mejorados
  labs(
    title = "Índice P2 de Competitividad Aeronautica y Aeroespacial por Estado. Fabricación de partes ",
    subtitle = "Ranking de estados mexicanos según su capacidad en componentes aeroespaciales",
    x = "",  # Removemos etiqueta del eje x (estados)
    y = "Índice P2 (normalizado)",
    caption = "Elaboración propia con datos de INEGI, Secretaria de Economía y SEMARNAT"
  ) +
  
  # Tema personalizado y profesional
  theme_minimal(base_size = 12, base_family = "Arial") +
  theme(
    # Configuración del título principal
    plot.title = element_text(
      size = 18, 
      face = "bold", 
      color = "#2c3e50",
      margin = margin(b = 5),
      hjust = 0
    ),
    
    # Configuración del subtítulo
    plot.subtitle = element_text(
      size = 13, 
      color = "#7f8c8d",
      margin = margin(b = 25),
      hjust = 0
    ),
    
    # Configuración del caption
    plot.caption = element_text(
      size = 10, 
      color = "#95a5a6",
      hjust = 0,
      margin = margin(t = 15)
    ),
    
    # Configuración de los ejes
    axis.title.x = element_text(
      size = 12, 
      color = "#2c3e50",
      margin = margin(t = 15)
    ),
    
    axis.text.y = element_text(
      size = 11, 
      color = "#2c3e50",
      margin = margin(r = 10)
    ),
    
    axis.text.x = element_text(
      size = 10, 
      color = "#2c3e50"
    ),
    
    # Configuración de la leyenda
    legend.position = "bottom",
    legend.title = element_text(size = 11, face = "bold"),
    legend.text = element_text(size = 10),
    legend.margin = margin(t = 20),
    legend.box = "horizontal",
    
    # Configuración de la grilla
    panel.grid.major.x = element_line(
      color = "#ecf0f1", 
      linewidth = 0.5,
      linetype = "solid"
    ),
    panel.grid.minor.x = element_line(
      color = "#f8f9fa", 
      linewidth = 0.3
    ),
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_blank(),
    
    # Configuración del fondo
    plot.background = element_rect(fill = "white", color = NA),
    panel.background = element_rect(fill = "white", color = NA),
    
    # Márgenes del plot
    plot.margin = margin(25, 25, 25, 25),
    
    # Configuración del panel
    panel.border = element_blank(),
    axis.line.x = element_line(color = "#bdc3c7", linewidth = 0.5)
  )

7. Clústeres por región

# 8. ANALISIS DENUE ----------------------------------------------------------

#IMPORTACIÓN DE BASE DE DATOS
denue_df <- read.csv("INEGI_DENUE_03062025.csv",
  encoding = "latin1",
  na.strings = c("", "NA")
) |>
  clean_names()

#LIMPIEZA DE BASE DE DATOS
denue_sf <- st_as_sf(
  denue_df, 
  coords = c("longitud", "latitud"), 
  crs = 4326,
  remove = FALSE
)

#Mapa interactivo con Leaflet
leaflet(denue_sf) |>
  addProviderTiles("CartoDB.Positron") |>
  addCircleMarkers(
    radius = 4, stroke = FALSE, fillOpacity = 0.7,
    popup = ~paste0(
      "<strong>", nombre_de_la_unidad_economica, "</strong><br>",
      "Razón social: ", razon_social, "<br>",
      municipio, ", ", entidad_federativa
    )
  )
#Mapa Coroplético por estado
#Contar establecimientos por entidad
est_by_state <- denue_sf |>
  st_drop_geometry() |>
  count(entidad_federativa, name = "n_estab")


#Polígonos de estados (Natural Earth)
mx_states <- ne_states(country = "Mexico", returnclass = "sf") |>
  select(name_es, geometry) |>
  mutate(
    join_key = stri_trans_general(tolower(name_es), "Latin-ASCII")
  )
est_by_state <- est_by_state |>
  mutate(
    join_key = stri_trans_general(tolower(entidad_federativa), "Latin-ASCII")
  )

#Unión y gráfico estático
mx_states <- left_join(mx_states, est_by_state, by = "join_key")

#Grafico del mapa
ggplot(mx_states) +
  geom_sf(aes(fill = n_estab), color = "white", linewidth = 0.3) +
  scale_fill_viridis_c(option = "C", na.value = "grey90") +
  labs(title = "Establecimientos aeroespaciales (SCIAN 336410) por estado",
       fill  = "Nº de plantas") +
  theme_minimal()

# 9. ANALISIS DE CLUSTERS POR DBSCAN -----------------------------------------
#Elegir un sistema de proyección métrico

#Ahora en metros
denue_proj <- st_transform(denue_sf, 6372)

#Matriz X-Y para dbscan
coords      <- st_coordinates(denue_proj)

# Volver a generar el gráfico base correctamente
library(dbscan)

# Recalcula las distancias de los 4 vecinos más cercanos y guárdalas
kNN_distances <- kNNdist(coords, k = 4)

# Ahora crea el data frame para graficarlo
df_k <- data.frame(
  id = seq_along(kNN_distances),
  distancia = sort(kNN_distances)
)



df_k <- data.frame(
  id = seq_along(kNN_distances),
  distancia = sort(kNN_distances)
)

ggplot(df_k, aes(x = id, y = distancia)) +
  geom_line() +
  geom_hline(yintercept = 50000, linetype = "dashed", color = "red") +
  labs(
    title = "Distancias al 4º vecino más cercano",
    x = "Observaciones ordenadas",
    y = "Distancia"
  ) +
  theme_minimal()

#Ejecutar DBSCAN
#Reproducible
set.seed(123)
db <- dbscan(coords, eps = 50000, minPts = 4)

# 0 = ruido (sin clúster)
denue_sf$cluster <- factor(db$cluster)

#Revisar sumario rápido
table(denue_sf$cluster)
## 
##  0  1  2  3  4  5  6  7  8 
## 20  5  9 12 28 16 12  9  6
#Mapa estático rápido
ggplot(denue_sf) +
  geom_sf(aes(color = cluster), size = 2) +
  scale_color_brewer(palette = "Set1", na.value = "grey70") +
  labs(title = "Clústeres DBSCAN de la industria aeroespacial (eps = 50 km)",
       color = "Clúster") +
  theme_minimal()

#Mapa interactivo Leaflet
pal <- colorFactor(
  palette = c("grey80", RColorBrewer::brewer.pal(8, "Set1")[1:length(unique(denue_sf$cluster)) - 1]),
  domain = denue_sf$cluster
)

leaflet(denue_sf) %>%
  addProviderTiles("CartoDB.PositronNoLabels") %>%
  addCircleMarkers(
    radius = 10, stroke = FALSE, fillOpacity = 0.8,
    color = ~pal(cluster),
    popup = ~paste0(
      "<strong>", nombre_de_la_unidad_economica, "</strong><br>",
      "Razón social: ", razon_social, "<br>",
      "Entidad: ", entidad_federativa, "<br>",
      "Municipio: ", municipio, "<br>",
      "Clúster: ", ifelse(cluster == 0, "Ruido", cluster)
    )
  ) %>%
  addLegend(
    "bottomright",
    pal = pal, values = ~cluster,
    title = "Clúster DBSCAN",
    labFormat = function(type, cuts, p) {
      cuts <- as.character(cuts)
      cuts <- ifelse(cuts == "0", "Ruido", paste("Clúster", cuts))
      cuts
    },
    opacity = 1
  )