Migración interna en México entre regiones económicas

En este ejercicio se realizará una gráfica de cuerdas que muestre la cantidad de personas nacidas en una región económica distinta a la que vivían en el momento del Censo de Población y Vivienda 2020 en México.

Los datos provienen del Instituto Nacional de Geografía e Informática (INEGI) en donde se pueden realizar la búsqueda de personas por entidad federativa según el lugar de nacimiento. Por su parte, las regiones provienen de la propuesta realizada por el geógrafo Ángel Bassols Batalla. Se trabajará con la cantidad total de las personas y no con porcentajes.

Primero se llaman a las librerías necesarias. Tidyverse es una colección de paquetes orientados a la manipulación, importación, exploración y visualización de datos, mientras que Circlize es una librería útil para realizar gráficas circulares como las de cuerdas.

library(tidyverse)
library(circlize)

Después se lee el archivo con la información. Es un archivo de texto separado por comas (csv) llamado “MigracionInternaxRegiones”

datos <- read.csv("MigraciónInternaxRegiones.csv", stringsAsFactors = TRUE, encoding = "UTF-8")

Procedemos a visualizar los datos mediante la función head

head(datos)
##   X.U.FEFF.Region Noroeste Norte Noreste Occidente Centro Golfo   Sur Península
## 1        Noroeste    20.97 11.53    3.47     17.75  22.46  5.45 18.02      0.35
## 2           Norte     1.86  2.99    1.60      9.36  33.67 20.46 17.17     12.88
## 3         Noreste     7.87  4.41    1.98     31.58  12.06 13.73 22.79      5.58
## 4       Occidente     5.44  9.94    3.29     11.29  46.53 10.08 11.46      1.97
## 5          Centro     7.07 16.17    3.14     15.40  26.83 19.20 11.54      0.65
## 6           Golfo    32.20 10.55    1.01      9.61  32.45  5.46  8.39      0.34

Se aprecia que se trata de una tabla donde se identifica la cantidad de personas nacidas en cada una de las regiones económicas de México.

Cada una de las columnas de este dataframe se transformará en una lista.

Región <- datos$X.U.FEFF.Region
Noroeste <- datos$Noroeste
Norte <- datos$Norte
Noreste<- datos$Noreste
Occidente <- datos$Occidente
Centro <- datos$Centro
Golfo <- datos$Golfo
Sur <- datos$Sur
Peninsula <- datos$Península

Y ahora se conformará una matriz uniendo las listas anteriores con la función rbind() e indicando el nombre de las columnas y las filas con cada una de las regiones del país (por eso se tiene una matriz de 8 por 8)

matriz = matrix(rbind(Noroeste, Norte, Noreste, Occidente, Centro, Golfo, Sur, Peninsula), nrow = 8, ncol = 8)
rownames(matriz) <- (Región)
colnames(matriz) <- (Región)
matriz
##           Noroeste Norte Noreste Occidente Centro Golfo   Sur Yucatán 
## Noroeste     20.97  1.86    7.87      5.44   7.07 32.20  2.86     6.15
## Norte        11.53  2.99    4.41      9.94  16.17 10.55 29.71     5.31
## Noreste       3.47  1.60    1.98      3.29   3.14  1.01 11.04     8.11
## Occidente    17.75  9.36   31.58     11.29  15.40  9.61 15.48    11.79
## Centro       22.46 33.67   12.06     46.53  26.83 32.45 22.30    43.14
## Golfo         5.45 20.46   13.73     10.08  19.20  5.46 12.14     6.12
## Sur          18.02 17.17   22.79     11.46  11.54  8.39  6.05    18.03
## Yucatán       0.35 12.88    5.58      1.97   0.65  0.34  0.43     1.34

Antes de generar la gráfica de cuerdas indicaremos un color distinto para cada una de las regiones con la función grid.col.

grid.col = c("Noroeste" = "#68c2c8", "Norte" ="#955dca", "Noreste" = "#cc7d28", "Occidente" = "#36893b", "Centro" ="#c84678", "Golfo"="#85462b", "Sur" ="#d9b663", "Península" ="#7e9f19")

Finalmente se crea la grpafica de cuerdas

chordDiagram(
  x = matriz, #datos
  grid.col = grid.col, #colores
  transparency = 0.25, #transparencia 
  directional = 1, #dirección
  direction.type = c("arrows", "diffHeight"), #Tipo de dirección y ancho 
  diffHeight  = 0, # Elimina un espacio innecesario
  annotationTrack =  "grid", #nombre de sectores
  annotationTrackHeight = c(0.07, 0.07), #altura del espacio para nombres
  link.arr.type = "big.arrow", 
  link.largest.ontop = TRUE,
  link.lwd = 0.8, link.lty = 1, #Ancho y tipo de líneas
  link.border = "gray50") #Color de linea
for(si in get.all.sector.index()) {
  xlim = get.cell.meta.data("xlim", sector.index = si, track.index = 1)
  ylim = get.cell.meta.data("ylim", sector.index = si, track.index = 1)
  circos.text(mean(xlim), mean(ylim), si, sector.index = si, track.index = 1,
              facing = "bending", cex= 0.6,  col = "gray90")
}