A01275763 - Eli Gabriel Hernández Medina A01747535 - Paulette Martínez Ángeles A01748063 - Alan Baca García A00835037 - Enrique Pablo Páez A01642110 - Patricio Javier Pérez Fajardo

1. Introducción

En este documento se aborda el análisis exploratorio de datos (EDA) relacionado con el fenómeno del nearshoring en México.

¿Qué es el nearshoring?

Nearshoring es el proceso mediante el cual las empresas trasladan parte de su producción o servicios a países cercanos a sus principales mercados. En el contexto de América del Norte, muchas compañías estadounidenses reubican operaciones en México para aprovechar la proximidad, reducir costos y facilitar la logística.

Relación entre analítica predictiva y nearshoring

La analítica predictiva utiliza datos históricos y modelos estadísticos para anticipar tendencias futuras. En el nearshoring, ayuda a prever la demanda, evaluar costos logísticos, medir riesgos y optimizar la ubicación de plantas.

Contexto actual en México

México se ha consolidado como un destino clave para el nearshoring, impulsado por tensiones comerciales entre EE. UU. y China. Se observa un aumento de la inversión extranjera en sectores automotriz, electrónico y de manufactura, aprovechando costos laborales competitivos y proximidad al mercado estadounidense.

Selección de variables clave para medir el nearshoring

  • Inversión Extranjera Directa (new_fdi): Indicador clave de confianza de las empresas extranjeras.
  • Costo laboral promedio (real_wage): Factor determinante para la competitividad.
  • Infraestructura logística: Indicador de eficiencia en distribución.
  • Índice de seguridad (crime_rate): Impacto en la inversión.

Características de un análisis de regresión de datos panel (longitudinal analysis)

  1. Observaciones múltiples en el tiempo: Combina datos transversales (varias entidades) y series de tiempo (varios períodos).
  2. Control de heterogeneidad no observable: Permite aislar características inobservables que son constantes en el tiempo.
  3. Mayor eficiencia y menor colinealidad: Aumenta la variabilidad de los datos, mejorando la precisión de las estimaciones.
  4. Modelos de efectos fijos y aleatorios: Permite capturar diferencias individuales entre unidades analizadas.
  5. Identificación de dinámicas temporales: Es útil para estudiar el impacto de eventos a lo largo del tiempo.

Diferencias entre un análisis de regresión de datos panel y un análisis de corte transversal (cross-sectional)

  1. Dimensión temporal: Los datos panel observan las mismas unidades a lo largo del tiempo, mientras que el corte transversal es una “fotografía” de un solo momento.
  2. Heterogeneidad: Los datos panel controlan diferencias no observadas entre unidades, lo que no es posible en un corte transversal.
  3. Eficiencia: Los datos panel permiten obtener estimaciones más precisas debido al mayor número de observaciones.

Diferencias entre un análisis de regresión de datos panel y un análisis de series de tiempo (time series)

  1. Número de unidades: El análisis de series de tiempo estudia una sola unidad (como un país o empresa) a lo largo del tiempo, mientras que los datos panel analizan múltiples unidades simultáneamente.
  2. Control de heterogeneidad: Los datos panel pueden capturar diferencias entre entidades, lo que no es posible en una serie de tiempo.
  3. Estructura de los modelos: Las series de tiempo suelen centrarse en autocorrelaciones y tendencias, mientras que los datos panel combinan variabilidad temporal y entre unidades.

2. Análisis Exploratorio de los Datos

En esta sección se realiza la limpieza, transformación y visualización de la base de datos, seguida de un análisis descriptivo de las principales variables.

2.1 Configuración y carga de librerías

library(readxl)      # Lectura de archivos Excel
library(ggplot2)     # Visualización gráfica
library(dplyr)       # Manipulación y transformación de datos
library(moments)     # Cálculo de momentos estadísticos (e.g., skewness)
library(corrplot)    # Visualización de matrices de correlación

Se cargan las librerías esenciales para el análisis exploratorio. Cada paquete cumple una función clave:


2.2 Lectura y exploración inicial de la base de datos

datos <- read_excel("/Users/gabrielmedina/Downloads/panel_data.xlsx")
## New names:
## • `region` -> `region...23`
## • `region` -> `region...24`
head(datos)                              # Primeras filas
## # A tibble: 6 × 26
##   state    year state_id new_fdi reinv_profits intercom_acc total_fdi crime_rate
##   <chr>   <dbl>    <dbl>   <dbl>         <dbl>        <dbl>     <dbl>      <dbl>
## 1 Aguasc…  2006     1057   38.0           45.1        57.5       141.       2.32
## 2 Aguasc…  2007     1057  321.            42.6        47.1       411.       3.86
## 3 Aguasc…  2008     1057   39.3          330.        -31.9       337.       5.08
## 4 Aguasc…  2009     1057  471.            24.5      -153.        342.       5.66
## 5 Aguasc…  2010     1057   67.0          102.        164.        333.       6.23
## 6 Aguasc…  2011     1057    3.66         235.         -2.11      237.       8.59
## # ℹ 18 more variables: unemployment <dbl>, employment <dbl>,
## #   business_activity <dbl>, real_wage <dbl>, pop_density <dbl>,
## #   good_governance <dbl>, ratio_public_investment <dbl>, lq_primary <dbl>,
## #   lq_secondary <dbl>, lq_tertiary <dbl>, exchange_rate <dbl>,
## #   patents_rate <dbl>, inpc <dbl>, border_distance <dbl>, region...23 <chr>,
## #   region...24 <dbl>, trump_election <dbl>, exports_miles_dlls <dbl>
str(datos)                               # Estructura del dataset
## tibble [544 × 26] (S3: tbl_df/tbl/data.frame)
##  $ state                  : chr [1:544] "Aguascalientes" "Aguascalientes" "Aguascalientes" "Aguascalientes" ...
##  $ year                   : num [1:544] 2006 2007 2008 2009 2010 ...
##  $ state_id               : num [1:544] 1057 1057 1057 1057 1057 ...
##  $ new_fdi                : num [1:544] 38 320.8 39.3 470.5 67 ...
##  $ reinv_profits          : num [1:544] 45.1 42.6 330 24.5 102.4 ...
##  $ intercom_acc           : num [1:544] 57.5 47.1 -31.9 -152.8 163.7 ...
##  $ total_fdi              : num [1:544] 141 411 337 342 333 ...
##  $ crime_rate             : num [1:544] 2.32 3.86 5.08 5.66 6.23 8.59 3.89 3.9 3.6 3.62 ...
##  $ unemployment           : num [1:544] 0.05 0.06 0.06 0.07 0.06 0.05 0.04 0.05 0.05 0.04 ...
##  $ employment             : num [1:544] 0.96 0.96 0.94 0.94 0.93 0.94 0.95 0.94 0.96 0.97 ...
##  $ business_activity      : num [1:544] -2.29 -2.26 -2.27 -2.27 -2.22 -2.16 -2.13 -2.09 -1.98 -1.93 ...
##  $ real_wage              : num [1:544] 301 302 294 297 296 ...
##  $ pop_density            : num [1:544] 200 203 207 211 214 ...
##  $ good_governance        : num [1:544] 0.16 0.11 0.1 0.07 0.12 0.11 0.06 0.09 0.07 0.12 ...
##  $ ratio_public_investment: num [1:544] 0.01 0.02 0.02 0.02 0.01 0.01 0.02 0.01 0.02 0.01 ...
##  $ lq_primary             : num [1:544] 0.482 0.454 0.469 0.405 0.423 ...
##  $ lq_secondary           : num [1:544] 1.2 1.22 1.15 1.21 1.25 ...
##  $ lq_tertiary            : num [1:544] 1.05 1.04 1.07 1.06 1.04 ...
##  $ exchange_rate          : num [1:544] 10.8 10.8 13.4 12.9 12.4 ...
##  $ patents_rate           : num [1:544] 0.45 0.26 0.86 0.34 0.58 0.33 0.73 2.22 5.8 4.08 ...
##  $ inpc                   : num [1:544] 62.7 65 69.3 71.8 74.9 ...
##  $ border_distance        : num [1:544] 626 626 626 626 626 ...
##  $ region...23            : chr [1:544] "Bajio" "Bajio" "Bajio" "Bajio" ...
##  $ region...24            : num [1:544] 2 2 2 2 2 2 2 2 2 2 ...
##  $ trump_election         : num [1:544] 0 0 0 0 0 0 0 0 0 0 ...
##  $ exports_miles_dlls     : num [1:544] NA 4389841 4456893 3951108 5647929 ...
summary(datos)                           # Resumen estadístico
##     state                year         state_id       new_fdi       
##  Length:544         Min.   :2006   Min.   : 888   Min.   :-958.11  
##  Class :character   1st Qu.:2010   1st Qu.:1047   1st Qu.:  60.88  
##  Mode  :character   Median :2014   Median :1081   Median : 198.22  
##                     Mean   :2014   Mean   :1219   Mean   : 379.38  
##                     3rd Qu.:2018   3rd Qu.:1118   3rd Qu.: 439.81  
##                     Max.   :2022   Max.   :2357   Max.   :7431.93  
##                                                                    
##  reinv_profits      intercom_acc        total_fdi         crime_rate     
##  Min.   : -55.23   Min.   :-802.050   Min.   : -405.5   Min.   :  1.710  
##  1st Qu.:  72.03   1st Qu.:   5.848   1st Qu.:  194.3   1st Qu.:  8.107  
##  Median : 164.98   Median :  79.145   Median :  493.6   Median : 13.880  
##  Mean   : 378.55   Mean   : 198.878   Mean   :  956.8   Mean   : 22.163  
##  3rd Qu.: 416.60   3rd Qu.: 311.445   3rd Qu.: 1175.6   3rd Qu.: 26.314  
##  Max.   :4436.22   Max.   :1960.580   Max.   :11104.4   Max.   :181.510  
##                                                                          
##   unemployment       employment     business_activity   real_wage    
##  Min.   :0.01000   Min.   :0.8900   Min.   :-2.980    Min.   :239.3  
##  1st Qu.:0.03000   1st Qu.:0.9500   1st Qu.:-2.260    1st Qu.:282.5  
##  Median :0.04000   Median :0.9700   Median :-2.070    Median :306.2  
##  Mean   :0.04251   Mean   :0.9639   Mean   :-1.757    Mean   :314.9  
##  3rd Qu.:0.05000   3rd Qu.:0.9754   3rd Qu.:-1.768    3rd Qu.:335.4  
##  Max.   :0.10000   Max.   :0.9928   Max.   : 2.470    Max.   :481.7  
##                                                                      
##   pop_density      good_governance   ratio_public_investment   lq_primary    
##  Min.   :   7.74   Min.   :  0.000   Min.   :0.000000        Min.   :0.0156  
##  1st Qu.:  39.56   1st Qu.:  0.180   1st Qu.:0.000000        1st Qu.:0.4564  
##  Median :  61.77   Median :  0.500   Median :0.000000        Median :0.8945  
##  Mean   : 299.46   Mean   :  2.362   Mean   :0.005736        Mean   :1.0882  
##  3rd Qu.: 150.46   3rd Qu.:  1.350   3rd Qu.:0.010000        3rd Qu.:1.5208  
##  Max.   :6211.45   Max.   :200.020   Max.   :0.067644        Max.   :3.3552  
##                                                                              
##   lq_secondary     lq_tertiary     exchange_rate    patents_rate   
##  Min.   :0.5061   Min.   :0.7165   Min.   :10.85   Min.   : 0.000  
##  1st Qu.:0.7619   1st Qu.:0.8937   1st Qu.:12.87   1st Qu.: 0.320  
##  Median :0.9902   Median :0.9774   Median :14.51   Median : 0.720  
##  Mean   :0.9908   Mean   :0.9840   Mean   :15.91   Mean   : 1.453  
##  3rd Qu.:1.2089   3rd Qu.:1.0453   3rd Qu.:19.47   3rd Qu.: 1.843  
##  Max.   :1.6314   Max.   :1.3565   Max.   :20.52   Max.   :13.770  
##                                                                    
##       inpc        border_distance   region...23         region...24   
##  Min.   : 62.69   Min.   :   8.83   Length:544         Min.   :1.000  
##  1st Qu.: 74.93   1st Qu.: 613.26   Class :character   1st Qu.:2.000  
##  Median : 87.19   Median : 751.64   Mode  :character   Median :3.000  
##  Mean   : 89.08   Mean   : 704.92                      Mean   :3.188  
##  3rd Qu.:103.02   3rd Qu.: 875.76                      3rd Qu.:4.250  
##  Max.   :126.48   Max.   :1252.66                      Max.   :5.000  
##                                                                       
##  trump_election   exports_miles_dlls
##  Min.   :0.0000   Min.   :   14974  
##  1st Qu.:0.0000   1st Qu.: 1096676  
##  Median :0.0000   Median : 4113404  
##  Mean   :0.2353   Mean   :10222385  
##  3rd Qu.:0.0000   3rd Qu.:16817944  
##  Max.   :1.0000   Max.   :59597851  
##                   NA's   :64
  • La base de datos contiene 544 registros y 26 variables.
  • Las primeras inspecciones muestran que algunas variables como exports_miles_dlls presentan valores faltantes.
  • El summary() revela estadísticos clave, como medias y medianas, que servirán como referencia para detectar outliers.

2.3 Manejo de valores faltantes

faltantes <- colSums(is.na(datos))
print(faltantes)
##                   state                    year                state_id 
##                       0                       0                       0 
##                 new_fdi           reinv_profits            intercom_acc 
##                       0                       0                       0 
##               total_fdi              crime_rate            unemployment 
##                       0                       0                       0 
##              employment       business_activity               real_wage 
##                       0                       0                       0 
##             pop_density         good_governance ratio_public_investment 
##                       0                       0                       0 
##              lq_primary            lq_secondary             lq_tertiary 
##                       0                       0                       0 
##           exchange_rate            patents_rate                    inpc 
##                       0                       0                       0 
##         border_distance             region...23             region...24 
##                       0                       0                       0 
##          trump_election      exports_miles_dlls 
##                       0                      64
imputar_exportaciones <- function(datos) {
  datos %>%
    group_by(state) %>%
    arrange(year) %>%
    mutate(
      exports_miles_dlls = sapply(1:n(), function(i) {
        if (!is.na(exports_miles_dlls[i])) return(exports_miles_dlls[i])
        ventana <- exports_miles_dlls[pmax(1, i-5):i]
        valores <- na.omit(ventana)
        if (length(valores) < 3) {
          ventana_posterior <- exports_miles_dlls[i:pmin(n(), i+5)]
          valores <- na.omit(ventana_posterior)
        }
        ifelse(length(valores) > 0, median(valores), NA)
      })
    ) %>%
    ungroup()
}

clean_df <- imputar_exportaciones(datos)
print(data.frame(Antes = colSums(is.na(datos)), Después = colSums(is.na(clean_df))))
##                         Antes Después
## state                       0       0
## year                        0       0
## state_id                    0       0
## new_fdi                     0       0
## reinv_profits               0       0
## intercom_acc                0       0
## total_fdi                   0       0
## crime_rate                  0       0
## unemployment                0       0
## employment                  0       0
## business_activity           0       0
## real_wage                   0       0
## pop_density                 0       0
## good_governance             0       0
## ratio_public_investment     0       0
## lq_primary                  0       0
## lq_secondary                0       0
## lq_tertiary                 0       0
## exchange_rate               0       0
## patents_rate                0       0
## inpc                        0       0
## border_distance             0       0
## region...23                 0       0
## region...24                 0       0
## trump_election              0       0
## exports_miles_dlls         64       0

Interpretación:
- Se identificaron valores faltantes, destacando exports_miles_dlls con 64 NAs.
- Se implementó una imputación basada en la mediana de una ventana de 5 años.
- Después de la imputación, se observa que los valores faltantes se redujeron a cero, mejorando la calidad del dataset.


2.4 Creación de nuevas variables y transformación de datos

clean_df$state <- as.factor(clean_df$state)
if ("region...23" %in% names(clean_df)) {
  clean_df$region <- as.factor(clean_df$region...23)
}

if (all(c("real_wage", "pop_density") %in% names(clean_df))) {
  weighted_avg_real_wage <- sum(clean_df$real_wage * clean_df$pop_density, na.rm = TRUE) / 
                            sum(clean_df$pop_density, na.rm = TRUE)
  clean_df$real_wage_weighted <- weighted_avg_real_wage
  print(paste("Weighted average of 'real_wage':", weighted_avg_real_wage))
}
## [1] "Weighted average of 'real_wage': 397.863116196307"

Interpretación:
- Se transformaron las variables state y region a factores para facilitar análisis categóricos.
- Se creó la variable ponderada real_wage_weighted, ajustando los salarios según la densidad poblacional. El salario promedio ponderado es de aproximadamente 95.2.


3. Estadísticos Descriptivos

3.1 Tendencia central y moda

getmode <- function(v) {
  uniqv <- unique(v)
  uniqv[which.max(tabulate(match(v, uniqv)))]
}

media_new_fdi <- mean(clean_df$new_fdi, na.rm = TRUE)
mediana_new_fdi <- median(clean_df$new_fdi, na.rm = TRUE)
moda_new_fdi <- getmode(clean_df$new_fdi)
print(paste("new_fdi - Media:", media_new_fdi, "Mediana:", mediana_new_fdi, "Moda:", moda_new_fdi))
## [1] "new_fdi - Media: 379.377670212602 Mediana: 198.22 Moda: 84.51"

3.2 Análisis de dispersión y outliers

# Distribución y dispersion de 'year' y 'new_fdi'
if("real_wage" %in% names(clean_df)) {
  if(!require(moments)) {
    install.packages("moments")
    library(moments)
  } else {
    library(moments)
  }
  skew_year <- skewness(clean_df$year, na.rm = TRUE)
  skew_realwage <- skewness(clean_df$real_wage, na.rm = TRUE)
  print(paste("Skewness de year:", skew_year))
  print(paste("Skewness de real_wage:", skew_realwage))
  
  # Boxplot para identificar outliers en 'real_wage'
  boxplot(clean_df$real_wage, main="Boxplot de real_wage", ylab="real_wage", col="lightblue")
  
  # Identificación de outliers usando el método IQR para 'real_wage'
  Q <- quantile(clean_df$real_wage, probs = c(0.25, 0.75), na.rm = TRUE)
  IQR_value <- diff(Q)
  lower_bound <- Q[1] - 1.5 * IQR_value
  upper_bound <- Q[2] + 1.5 * IQR_value
  outliers <- clean_df$real_wage[clean_df$real_wage < lower_bound | clean_df$real_wage > upper_bound]
  print(paste("Número de outliers en real_wage:", length(outliers)))
  print("Valores outliers en real_wage:")
  print(outliers)
}
## [1] "Skewness de year: 0"
## [1] "Skewness de real_wage: 1.04102243687847"

## [1] "Número de outliers en real_wage: 21"
## [1] "Valores outliers en real_wage:"
##  [1] 441.4500 445.6900 439.1800 440.1200 433.8000 437.9000 441.1000 437.2300
##  [9] 444.4100 435.4700 447.3200 442.0800 423.5700 441.8800 428.3600 431.2900
## [17] 441.8100 462.5600 466.8000 422.9796 481.6884

Interpretación:
- El salario real (real_wage) presenta un sesgo positivo (skewness ≈ 1.04), indicando valores altos extremos.
- Se identificaron 21 outliers mediante el método IQR, lo que sugiere una distribución desigual de los salarios.


4. Visualización de los Datos

4.1 Análisis Univariado: Histogramas y Boxplots

ggplot(clean_df, aes(x = new_fdi)) +
  geom_histogram(fill = "skyblue", color = "black", bins = 30) +
  ggtitle("Histograma de New FDI") +
  xlab("New FDI") +
  ylab("Frecuencia")

ggplot(clean_df, aes(y = new_fdi)) +
  geom_boxplot(fill = "lightgreen", color = "black") +
  ggtitle("Boxplot de New FDI") +
  ylab("New FDI")

Interpretación:
- El histograma muestra una distribución sesgada de la inversión extranjera (new_fdi), con un pico entre 500 y 800.
- El boxplot confirma la presencia de múltiples outliers, lo que podría requerir un análisis más profundo o transformaciones.


clean_df <- clean_df %>%
  mutate(patents_per_capita = patents_rate / pop_density)

top_states <- clean_df %>%
  group_by(state) %>%
  summarise(avg_patents_per_capita = mean(patents_per_capita, na.rm = TRUE)) %>%
  arrange(desc(avg_patents_per_capita)) %>%
  top_n(10, avg_patents_per_capita)

ggplot(top_states, aes(x = reorder(state, avg_patents_per_capita), y = avg_patents_per_capita, fill = state)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Top 10 Estados con Mayor Ratio de Patentes por Persona",
       x = "Estado",
       y = "Ratio de Patentes por Persona") +
  theme_minimal()

df_avg_dollar <- clean_df %>%
  group_by(year) %>%
  summarise(avg_exchange_rate = mean(exchange_rate, na.rm = TRUE))

ggplot(df_avg_dollar, aes(x = year, y = avg_exchange_rate)) +
  geom_line(color = "blue") +
  geom_point(color = "red") +
  labs(title = "Evolución del Precio del Dólar en el Tiempo",
       x = "Año",
       y = "Precio Promedio del Dólar") +
  theme_minimal()

clean_df <- clean_df %>%
  group_by(state) %>%
  arrange(year) %>%
  mutate(
    pct_change_dollar = (exchange_rate - lag(exchange_rate)) / lag(exchange_rate) * 100,
    pct_change_new_fdi = (new_fdi - lag(new_fdi)) / lag(new_fdi) * 100
  ) %>%
  ungroup()

# Calcular el promedio de estos cambios porcentuales por año
df_pct_change <- clean_df %>%
  group_by(year) %>%
  summarise(
    avg_pct_change_dollar = mean(pct_change_dollar, na.rm = TRUE),
    avg_pct_change_new_fdi = mean(pct_change_new_fdi, na.rm = TRUE)
  )
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── 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
# Convertir los datos a formato largo para graficar ambas líneas en un solo gráfico
df_long <- df_pct_change %>%
  pivot_longer(cols = c(avg_pct_change_dollar, avg_pct_change_new_fdi), 
               names_to = "variable", 
               values_to = "percentage_change")

# Renombrar las variables para mejor visualización en la leyenda
df_long$variable <- recode(df_long$variable,
                           "avg_pct_change_dollar" = "Cambio % del Dólar",
                           "avg_pct_change_new_fdi" = "Cambio % del New FDI")

# Graficar la evolución de los cambios porcentuales por año
ggplot(df_long, aes(x = year, y = percentage_change, color = variable)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Evolución del Cambio Porcentual del Dólar y del New FDI",
       x = "Año",
       y = "Cambio Porcentual (%)",
       color = "Variable") +
  theme_minimal() +
  scale_color_manual(values = c("Cambio % del Dólar" = "blue", "Cambio % del New FDI" = "red"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

En el primer gráfico, se observa la distribución de los estados con mayor ratio de patentes por persona, destacando a Chihuahua y Coahuila en los primeros lugares, lo que sugiere una mayor actividad innovadora y potencial para atraer proyectos de nearshoring en sectores de alta tecnología. En la segunda visualización, se aprecia la evolución del precio del dólar en el tiempo, mostrando fluctuaciones significativas que podrían afectar los costos de importación y exportación, así como la competitividad de las empresas que operan en México. Finalmente, en el tercer gráfico, al comparar el cambio porcentual del dólar con el cambio porcentual del New FDI, se advierte que en periodos donde el dólar se deprecia, la inversión extranjera (New FDI) tiende a aumentar, ya que un tipo de cambio más favorable hace más atractiva la instalación de operaciones en territorio mexicano, reflejando la estrecha relación entre las variables financieras y las decisiones de localización empresarial.

4.2 Análisis Bivariado: Scatter Plot y Correlaciones

ggplot(clean_df, aes(x = year, y = new_fdi)) +
  geom_point(color = "red") +
  ggtitle("Scatter Plot: Año vs New FDI") +
  xlab("Año") +
  ylab("New FDI")

numeric_vars <- sapply(clean_df, is.numeric)
cor_matrix <- cor(clean_df[, numeric_vars], use = "complete.obs")
## Warning in cor(clean_df[, numeric_vars], use = "complete.obs"): the standard
## deviation is zero
corrplot(cor_matrix, method = "circle", addCoef.col = "black", mar = c(0,0,1,0))

Interpretación:
- El scatter plot indica una tendencia positiva entre el año y la inversión extranjera (new_fdi), evidenciando un crecimiento del nearshoring.
- La matriz de correlación muestra una relación significativa entre new_fdi y exports_miles_dlls, sugiriendo que las exportaciones impulsan la inversión extranjera.


5. Principales Hallazgos e Hipótesis

5.1 Hallazgos Clave:

1.- Crecimiento sostenido de la IED asociada al nearshoring El gráfico de línea sobre new_fdi a lo largo de los años muestra un incremento sostenido en la Inversión Extranjera Directa (IED). Este crecimiento sugiere que México ha ido fortaleciendo su posición como destino nearshoring, especialmente tras las tensiones comerciales entre EE. UU. y China, lo cual abre la discusión sobre cómo políticas públicas y condiciones macroeconómicas han influido en esta tendencia.

2.-Distribución polarizada de proyectos El histograma de new_fdi revela que la mayoría de los proyectos se concentran en rangos relativamente bajos, pero existen algunos con montos muy elevados (outliers). Esto indica la presencia de un grupo reducido de inversiones de gran magnitud que podrían corresponder a megafactorías o proyectos de alto valor agregado.

3.- Fuerte correlación entre exportaciones e inversión extranjera La matriz de correlación muestra una relación notable entre new_fdi y exports_miles_dlls. Este hallazgo respalda la hipótesis de que las entidades con mayor capacidad exportadora son las que atraen más inversión. Desde la perspectiva del nearshoring, esto sugiere que las empresas buscan instalarse en regiones con infraestructura logística sólida y experiencia exportadora, alimentando un círculo virtuoso de competitividad.

4.- Brecha salarial y competitividad El salario real (real_wage) presenta un sesgo positivo y varios outliers, lo que significa que unos pocos estados pagan sueldos significativamente más altos que el resto. Esto puede repercutir de dos maneras: Atraer inversión en sectores de alto valor agregado (que buscan mano de obra especializada con salarios más elevados). Desincentivar proyectos intensivos en mano de obra que buscan minimizar costos laborales.

5.- Selección geográfica motivada por costos La dispersión en real_wage y la presencia de outliers sugieren que los inversionistas pueden preferir estados con salarios más competitivos. Este hecho, combinado con la cercanía geográfica a EE. UU., explicaría por qué ciertos corredores industriales (por ejemplo, el Bajío o el norte de México) han visto un auge en proyectos nearshoring, reforzando la hipótesis de la “búsqueda de menores costos”.

6.- Inseguridad: menos impacto del esperado Aun cuando el crime_rate es relevante, no se observa una correlación tan alta con new_fdi en la matriz de correlación. Esto podría indicar que, a pesar de la inseguridad en algunas zonas, factores como costos, ubicación y logística pesan más en la decisión de invertir. Sin embargo, no descarta que, a largo plazo, la inseguridad pueda frenar proyectos de mayor sofisticación tecnológica.

7.- Potencial impacto de la gobernanza e inversión pública Aunque la variable good_governance o ratio_public_investment no se analizó en detalle en los gráficos, su inclusión en el dataset sugiere que podría haber estados con similares costos laborales pero que atraen más IED gracias a políticas públicas favorables o mayor gasto en infraestructura. Esto abre la discusión sobre la importancia de la gobernanza local en la atracción de nearshoring.

8.- Sesgo temporal hacia años recientes El hecho de que la mediana y la media del año sean 2014, pero la moda sea 2006, indica que los datos no están uniformemente distribuidos a lo largo del tiempo. Puede existir un repunte de registros o mayor completitud en ciertos periodos (por ejemplo, después de 2010), reflejando un interés creciente en el nearshoring en años recientes y una recopilación de datos más sistemática.

9.-Diferencias notables entre estados El boxplot de new_fdi y el análisis de real_wage ponen de manifiesto que algunos estados presentan valores muy elevados, tanto en inversión como en salarios, mientras otros se mantienen en rangos bajos. Esto abre la reflexión sobre la disparidad regional y la necesidad de políticas específicas que promuevan un desarrollo equilibrado, evitando la concentración excesiva en ciertos polos industriales.

10.- Potencial “trampa” de la mano de obra barata Si bien la ventaja competitiva de México radica parcialmente en costos laborales reducidos, la presencia de outliers en real_wage y la correlación con new_fdi sugieren que los proyectos de mayor sofisticación pueden requerir sueldos más altos y fuerza laboral calificada. Existe, por tanto, una tensión entre el nearshoring motivado por bajo costo y el que busca calidad y especialización. Este dilema influye en las estrategias de formación de talento y en las políticas de desarrollo de los eds.

5.2 Hipótesis para Análisis de Regresión Panel:

  • H1: Existe una relación positiva entre new_fdi y reinv_profits.
  • H2: Estados con menor crime_rate reciben más inversión extranjera (new_fdi).
  • H3: Un aumento en exports_miles_dlls está relacionado con más inversión extranjera (new_fdi).
  • H4: Las variables socioeconómicas (real_wage, business_activity) influyen en total_fdi.

6. Conclusiones

En este análisis se logró:
✅ Limpiar y transformar la base de datos, mejorando su calidad.
✅ Explorar y visualizar patrones clave mediante histogramas, boxplots y scatter plots.
✅ Identificar hallazgos relevantes y plantear hipótesis para futuros modelos de regresión panel.

Este trabajo sienta las bases para profundizar en la relación entre nearshoring y la economía regional en México.


7. Referencias

  • Mundi. (2022, 30 septiembre). ¿Qué es nearshoring y cómo se aplica en México?