El análisis titulado “Reto Ciencia de Datos” fue elaborado por Nallib Martinez Haddad y tiene como objetivo explorar y visualizar datos provenientes de distintas fuentes oficiales: el DENUE (Directorio Estadístico Nacional de Unidades Económicas), el Censo Económico 2019 del INEGI, y datos de la balanza comercial sectorial (HS85: maquinaria y equipo eléctrico, electrónicos, etc.).

Biblioteca

Se cargan múltiples bibliotecas de R necesarias para limpieza, transformación y visualización de datos, así como para manejo espacial de datos geográficos (como sf, ggplot2, dplyr, etc.). Esto permite integrar datos económicos, espaciales y comerciales en un solo flujo de análisis.

library(janitor)
## 
## Adjuntando el paquete: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(sf)
## Warning: package 'sf' was built under R version 4.4.3
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
library(dplyr)
library(showtext)
## Warning: package 'showtext' was built under R version 4.4.3
## Cargando paquete requerido: sysfonts
## Warning: package 'sysfonts' was built under R version 4.4.3
## Cargando paquete requerido: showtextdb
## Warning: package 'showtextdb' was built under R version 4.4.3
library(dplyr)
library(countrycode)
## Warning: package 'countrycode' was built under R version 4.4.3
library(grid)

Se importan tres conjuntos principales:

DENUE 2024: Contiene información de establecimientos económicos en México.

Censo Económico 2019: Datos agregados sobre sectores industriales (específicamente el sector 3344: componentes electrónicos).

Balanza Comercial 2024: Datos del valor neto del comercio entre México y el resto del mundo, con énfasis en el sector HS85.

También se cargan archivos geoespaciales de México (entidades federativas) y del mundo, necesarios para los mapas.

📊 Análisis exploratorio por entidad federativa Se realiza un gráfico de barras horizontal que muestra cuántos establecimientos del DENUE hay por estado de la República Mexicana. Los estados se reordenan para que los de mayor cantidad aparezcan al final del eje y se utilice una tipografía personalizada (“Montserrat”) para uniformar el diseño visual.

font_add(family = "Montserrat", regular = "C:/Users/nalli/Downloads/Montserrat-Regular.ttf")


showtext_auto()

ggplot(data, aes(x = reorder(entidad_federativa, table(entidad_federativa)[entidad_federativa]))) +
  geom_bar(fill = "#235B4E") +
  coord_flip() +
  labs(
    x = "Entidad federativa",
    y = "Número de registros",
    caption = "Fuente: Elaboración propia (Datos DENUE)"
  ) +
  theme_minimal(base_family = "Montserrat") +
  theme(
    plot.background = element_rect(fill = "antiquewhite", color = NA),
    panel.background = element_rect(fill = "antiquewhite", color = NA),
    panel.grid = element_blank(),
    axis.text = element_text(face = "bold", size = 40),
    axis.title = element_text(size = 40),
    plot.caption = element_text(face = "bold", size = 40),
    plot.title = element_text(size = 40),
    legend.text = element_text(size = 40),
    legend.title = element_text(size = 40)
  )

🗺️ Mapa de registros por estado (DENUE) A partir del número de registros por entidad, se construye un mapa temático de México. Se utiliza una paleta de colores que va de tonos claros a oscuros, donde un tono más oscuro representa mayor cantidad de registros. Esto permite visualizar espacialmente cómo se distribuyen los establecimientos económicos a lo largo del país.

registros_por_entidad <- data %>%
  count(clave_entidad) %>%
  rename(registros = n)

registros_por_entidad <- registros_por_entidad %>%
  mutate(clave_entidad = sprintf("%02d", clave_entidad))


ggplot(
  data = left_join(mexico, registros_por_entidad, by = c("CVEGEO" = "clave_entidad"))
) +
  geom_sf(aes(fill = registros)) +
  scale_fill_gradient(
    high = "#235B4E",
    low = "#DDC9A3",
    na.value = "grey77",
    name = "No. de Registros"
  ) +
  labs(
    caption = "Fuente: Elaboración propia (Datos DENUE)"
  ) +
  theme_minimal(base_family = "Montserrat") +
  theme(
    plot.background = element_rect(fill = "antiquewhite", color = NA),
    panel.background = element_rect(fill = "antiquewhite", color = NA),
    panel.grid = element_blank(),
    
    # Texto en negritas y ajustes de estilo
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(face = "bold", size = 10),
    plot.caption = element_text(face = "bold", size = 9)
  )

👥 Clasificación por número de personas empleadas Se genera otro gráfico de barras en el que se agrupan los establecimientos por el tamaño del personal ocupado. Se destacan los estratos desde “0 a 5 personas” hasta “251 y más personas”. Esta visualización ayuda a comprender la estructura empresarial (micro, pequeñas, medianas, grandes empresas).

# Reordenar niveles del factor
data$descripcion_estrato_personal_ocupado <- factor(
  data$descripcion_estrato_personal_ocupado,
  levels = c(
    "0 a 5 personas",
    "6 a 10 personas",
    "11 a 30 personas",
    "31 a 50 personas",
    "51 a 100 personas",
    "101 a 250 personas",
    "251 y más personas"
  )
)

# Crear el gráfico ordenado
ggplot(data, aes(x = descripcion_estrato_personal_ocupado)) +
  geom_bar(fill = "#235B4E") +
  coord_flip() +
  labs(
    title = "Número de registros por estratos de personal ocupado",
    x = "Estrato de personal ocupado",
    y = "Número de registros",
    caption = "Fuente: Elaboración propia (Datos DENUE)"
  ) +
  theme_minimal(base_family = "Montserrat") +
  theme(
    plot.background = element_rect(fill = "antiquewhite", color = NA),
    panel.background = element_rect(fill = "antiquewhite", color = NA),
    panel.grid = element_line(color = "black"),
    plot.title = element_text(face = "bold", size = 16),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(face = "bold", size = 10),
    plot.caption = element_text(face = "bold", size = 9)
  )

🗺️🔴 Mapa con ubicación de establecimientos En este mapa se superponen dos capas:

El mapa temático anterior con cantidad de registros por estado.

Una capa de puntos que marca la ubicación exacta de los establecimientos (usando coordenadas geográficas).

Esto proporciona una visualización más precisa y detallada sobre la concentración de negocios.

# Si tus datos no están en sf, conviértelos en sf para ggplot2 (opcional)
estab_sf <- st_as_sf(data, coords = c("longitud", "latitud"), crs = 4326, remove = FALSE)


ggplot(
  data = left_join(mexico, registros_por_entidad, by = c("CVEGEO" = "clave_entidad"))
) +
  geom_sf(aes(fill = registros)) +
  scale_fill_gradient(
   high = "#235B4E",
    low = "#DDC9A3",
    na.value = "grey90",
    name = "No. de Registros"
  ) +
  geom_sf(data = estab_sf, alpha = 0.5, color = "#691C32", size = 1) +
  labs(
    caption = "Fuente: Elaboración propia (Datos DENUE)"
  ) +
  theme_minimal(base_family = "Montserrat") +
  theme(
    plot.background = element_rect(fill = "antiquewhite", color = NA),
    panel.background = element_rect(fill = "antiquewhite", color = NA),
    panel.grid = element_blank(),
    plot.title = element_text(face = "bold", size = 40, hjust = 0.5),
    legend.title = element_text(face = "bold", size = 40),
    legend.text = element_text(face = "bold", size = 40),
    plot.caption = element_text(face = "bold", size = 40)
  )

📦 Censo económico – Sector 3344 Se filtra el Censo Económico 2019 para incluir solamente los códigos del sector de componentes electrónicos (3344, 33441, 334410) y se calcula el total de ventas para ese grupo. Este análisis cuantifica la importancia económica del sector en términos monetarios.

nuevo_df <- encuesta_economica%>%
  filter(CODIGO %in% c(3344, 33441, 334410))

total_ventas_codigos <- encuesta_economica %>%
  filter(CODIGO %in% c(3344, 33441, 334410)) %>%
  summarise(total = sum(A111A, na.rm = TRUE))

print(total_ventas_codigos)
## # A tibble: 1 × 1
##     total
##     <dbl>
## 1 548949.

🌍 Visualización de la balanza comercial por país Finalmente, se construye un mapa del mundo donde se representa el valor neto del comercio entre México y otros países para el sector HS85. El gradiente de color representa desde déficit comercial (rojo) hasta superávit (verde), con blanco como punto medio. El mapa usa una transformación logarítmica para representar correctamente grandes variaciones entre países.

# Convertir ISO (2 letras) a ISO-3
mundo_clean <- mundo_clean %>%
  mutate(ISO3 = countrycode(ISO, origin = "iso2c", destination = "iso3c"))

mundo_completo <- mundo_clean %>%
  left_join(datos, by = c("ISO3" = "ISO 3"))


ggplot(mundo_completo) +
  geom_sf(aes(fill = `Trade Value Delta`)) +
  scale_fill_gradient2(
    low = "#691C32", 
    mid = "white", 
    high = "#235B4E", 
    midpoint = 0,
    trans = "pseudo_log",
    breaks = c(-1e7, -1e5, -1e3, 0, 1e3, 1e5, 1e7),
    labels = c("-10M\nDéficit", "-100K", "-1K", "0", "1K", "100K", "10M\nSuperávit"),
    name = NULL,
    guide = guide_colorbar(
      direction = "horizontal",
      barwidth = unit(10, "cm"),
      barheight = unit(0.4, "cm"),
      label.position = "bottom",
      ticks.colour = NA,
      title.position = "top"
    )
  ) +
  theme_void(base_family = "Montserrat") +
  theme(
    legend.position = "bottom",
    legend.justification = "center",
    legend.background = element_rect(fill = "antiquewhite", color = NA),
    legend.text = element_text(size = 20, family = "Montserrat"),
    plot.background = element_rect(fill = "antiquewhite", color = NA),
    panel.background = element_rect(fill = "antiquewhite", color = NA),
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
    plot.caption = element_text(face = "plain", size = 9, hjust = 0.5),
  )

📌 Conclusión Este análisis multidimensional proporciona una visión integral del sector electrónico en México, desde la localización y tamaño de los establecimientos, hasta su impacto en el comercio internacional. Combinar datos espaciales, censales y comerciales permite identificar patrones de concentración económica y relaciones de intercambio que podrían guiar decisiones de política pública, inversión o desarrollo industrial.