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.
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)
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
## # 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)
# 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)
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")
)
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", "…
## 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…
## [1] "/Users/emilianocolungabarrera/Documents/ITESM/Ciencia de Datos I/INEGI_DENUE_03062025/DENUE"
## [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"
## [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 <- 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()
## [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
# 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
## # 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
# 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)
## [1] "/Users/emilianocolungabarrera/Documents/ITESM"
## 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
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)
)
# 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
)