15 Datos separados
15.1 Introducción
Para responder de manera efectiva a las preguntas que nos interesan sobre el mundo social, a menudo necesitamos acceder a una gran variedad de datos que incluyen aspectos socioeconómicos, políticos, demográficos y otros ámbitos. Estos datos acostumbran a estar dispersos en varias bases de datos. Se plantea así un problema importante, puesto que para analizarlos eficazmente, es necesario ubicar toda esta información en un único conjunto de datos. En esta sección veremos las herramientas que permiten juntar todas las variables que nos interesan en un solo marco de datos. Para ilustrar esta idea, fijémonos en la tabla 15.1, que presenta dos conjuntos de datos que contienen un pequeño número de observaciones.
La tabla a contiene información relativa al PIB per cápita y la población de cuatro países: Francia, Alemania, la República Checa y Austria, mientras que la tabla b proporciona información sobre el idioma principal de los tres primeros países, así como de los Estados Unidos. La unión manual de estas dos tablas en un único conjunto de datos no presenta una gran dificultad con herramientas como Excel, puesto que solo hay que crear una nueva columna en la primera tabla y aparejar el idioma con su país correspondiente. Sin embargo, la complejidad de esta tarea aumenta significativamente cuando disponemos de miles de observaciones, momento en que se requieren procedimientos automatizados para aparejar los datos de manera más eficiente.
country | code | gdpcap | pop |
---|---|---|---|
France | FR | 43518 | 67 |
Germany | DE | 50801 | 83 |
Czechia | CZ | 26378 | 11 |
Austria | AT | NA | 9 |
country | cowc | lang |
---|---|---|
French Republic | FR | French |
Federal Republic of Germany | DE | German |
Czech Republic | CZ | Czech |
United States of America | US | English |
Tabla 15.1: Marcos de datos separados
Con R, la unión de dos o más marcos de datos de miles de observaciones es una tarea relativamente sencilla si estos datos disponen de claves de referencia y sabemos utilizar las funciones join. En este módulo, empezaremos por explorar algunos ejemplos de qué son las claves de referencia, muchas de las cuales ya han aparecido en marcos de datos de capítulos anteriores. Seguidamente, veremos cómo unir marcos de datos con las funciones join del paquete dplyr. En el tercer apartado se introduce el paquete countrycode, que permite unir marcos de datos que no tienen claves de referencia común. Y finalmente, en el último apartado se muestra un ejemplo de cómo unir datos de desarrollo económico con datos de democracia.
15.2 Claves de referencia
Las claves de referencia son valores que sirven para identificar las unidades de observación y establecer conexiones entre datos de diferentes fuentes. Al mismo tiempo, constituyen una herramienta imprescindible para unir conjuntos de datos con R. A lo largo de los módulos anteriores, hemos examinado varias tablas que incluyen estas claves de referencia (como las que se han ilustrado en la tabla 1.4 o en la figura 11.19). Estas claves simplifican la unidad de observación mediante un código numérico o de carácter, hecho que permite identificar cada unidad con un único y reducido conjunto de cifras o letras. A continuación se detallan algunos de los códigos más comunes, ordenados por niveles de análisis:
ctryname | ccown | cwdi |
---|---|---|
Argentina | 160 | ARG |
Armenia | 371 | ARM |
Australia | 900 | AUS |
Austria | 305 | AUT |
Azerbaijan | 373 | AZE |
Bahamas | 31 | BHS |
Bahrain | 692 | BHR |
Bangladesh | 771 | BGD |
Organizaciones Internacionales (OIs): Las principales claves de referencia de las OIs se encuentran en la Intergovernmental Organizations dataset (v3) (Pevehouse et al., 2019; Wallace & Singer, 1970) de Correlates of War, el primer proyecto que codificó las OIs. Anteriormente, en la tabla 1.3 del módulo 1 hemos visto estos códigos en la variable
ioname
.-
Estados: El estado es la unidad con más diversidad de codificaciones1. Esta variedad se debe a que a lo largo de los años ha habido diferentes organizaciones, grupos de investigación y oficinas estadísticas que han creado su propio código por varios motivos, relacionados con el ámbito de estudio o el propósito de la codificación2. En la tabla 15.2, se pueden encontrar dos de los formatos de codificación más frecuentes. La columna
ccown
contiene la codificación numérica de estados según el proyecto Correlates of War (Correlates of War Project, 2017), mientras que la columnacwdi
contiene la codificación de tres caracteres de los Worldwide Development Indicators (WDI) (Kaufmann et al., 2009).Los valores que se muestran son códigos que sirven para identificar de manera única cada país. Así, si cogemos la nomenclatura que está asociada a la columna
ccown
, Argentina se codifica como el 160 y Armenia como el 371. Por otro lado, utilizando la nomenclatura del WDI, Argentina se codifica como ARG y Armenia como ARM. Como veremos más adelante, el paquete de R countrycode (Arel-Bundock, 2022) es una herramienta muy necesaria para cualquier proyecto que tenga como unidad de análisis el estado.
1 En la caja ¿Cómo saber cuál es el código apropiado? se pueden ver 13 sistemas de claves diferentes, pero hay más.
2 Para más información, ver el módulo El Sistema de Estados
nombre | cmun |
---|---|
Abadiño | 48001 |
Abanto y Ciérvana-Abanto Zierbena | 48002 |
Ajangiz | 48911 |
Alonsotegi | 48912 |
Amorebieta-Etxano | 48003 |
Amoroto | 48004 |
Arakaldo | 48005 |
Arantzazu | 48006 |
-
Unidades subestatales: Algunas organizaciones internacionales o regionales tienen sus propias codificaciones de unidades territoriales subestatales como pueden ser las comunidades autónomas españolas o los länders alemanes. Un ejemplo es el sistema NUTS (responde al francés Nomenclature des Unités territoriales statistiques), utilizado por Eurostat para clasificar las unidades territoriales en varios niveles. Anteriormente, en el módulo 10 ya hemos visto estas claves en la columna
geo
del marco de datosnuts
(ver figura 11.19). En el ámbito global, existen otros intentos de clasificar las unidades subestatales, como los del Global Data Lab o el ISO 3166-2, aunque no se utilizan con mucha frecuencia.
country | id | name_short |
---|---|---|
ESP | 2413 | AR |
ESP | 8262 | AUN |
ESP | 4588 | ASR |
ESP | 829 | AIC |
ESP | 841 | ARM |
ESP | 8271 | AlV |
ESP | 7464 | AN |
ESP | 441 | AP/PP |
Unidades locales: En general, cada país desarrolla su propio sistema de clasificación para sus divisiones político-administrativas internas. Como ejemplo, en España, el Instituto Nacional de Estadística (INE) asigna códigos específicos a cada municipio y sección censal del país. En la columna
cmun
de la tabla 15.3, se pueden encontrar los códigos INE asociados a algunos municipios de Euskadi.Partidos políticos: Las organizaciones políticas no gubernamentales que han logrado un nivel más estandarizado de codificación son los partidos políticos. Recientemente, Party facts (Döring & Regel, 2019) ha desarrollado una base de datos que permite enlazar varias fuentes de información relacionadas con los partidos políticos. Entre ellas, por ejemplo, se incluye la Global Party Survey (Norris, 2020), que mide a gran escala el posicionamiento ideológico de más de un millar de partidos políticos. En España, Party facts ha catalogado hasta 113 partidos diferentes. En la tabla 15.4 vemos un pequeño abstracto, con la codificación numérica en la columna
id
y la codificación de carácter en la columnaname_short
.Otros: Existe una gran cantidad de sistemas de clasificación que permiten enlazar bases de datos. A escala internacional, la estandarización y la codificación de estos sistemas son responsabilidad de organizaciones como la International Standard Organization (ISO) o Naciones Unidas. Un ejemplo es la Standard International Trade Classification (SITC) de las Naciones Unidas, que clasifica las mercancías y permite el seguimiento del comercio internacional en varios niveles.
Aparte de estas unidades, otras claves de referencia también nos permiten enlazar conjuntos de datos. Es el caso de los identificadores únicos (números de identificación de usuario, códigos de producto, etc.) o bien las fechas. Como veremos más adelante, es muy frecuente utilizar los años como claves de unión cuando forman parte de la unidad de observación. Por ejemplo, si en varios conjuntos de datos la unidad de observación es estado-año, tanto el código de los estados como el año serán las dos columnas clave que utilizaremos para unir los datos.
15.3 Las funciones join
En esta sección veremos cómo operan cuatro de las funciones join3. Todas estas funciones sirven para juntar conjuntos de datos que tienen una columna en común. Al inicio de esta sección se mostraban dos conjuntos de datos en la tabla 15.1, donde, si nos fijamos, la columna compartida se denomina code
en la primera tabla y cowc
en la segunda. Esta columna, que utilizaremos para la unión de los dos conjuntos de datos, lo denominaremos columna clave. Los valores de la columna clave son compartidos en los dos conjuntos de datos: Francia se llama FR
, Alemania DE
y República Checa CZ
. Austria y los Estados Unidos, en cambio, solo se encuentran en uno de los dos conjuntos.
3 Existen dos funciones join más, que no veremos en este apartado. Son semi_join()
, que devuelve las filas del primer marco de datos que coincidan con la columna o columnas clave del segundo marco de datos, y anti_join()
, que devuelve las filas del primer marco de datos que no coincidan con la columna o columnas clave del segundo marco de datos.
La sintaxis utilizada para juntar los datos es la misma en cualquier función de join. Esta sintaxis consta de tres argumentos. En el primer argumento se indica el nombre del primer marco de datos, en el segundo argumento el nombre del segundo marco de datos y en el tercer argumento el nombre de la columna clave.
xxxx_join(df1, df2, by = "columna")
Si en los dos marcos de datos que formarán la unión el nombre de la columna clave no coincide, se especifica de la siguiente manera:
xxxx_join(df1, df1, by = c("nom_col1" = "nom_col2"))
15.3.1 Left join
La función left_join()
devuelve todas las filas del primer marco de datos y las filas del segundo marco de datos que coincidan con la columna o columnas clave. En el código siguiente se especifica el nombre de la columna clave del primer marco de datos code
y del segundo marco de datos cowc
porque los nombres no coinciden. Si hubieran tenido el mismo nombre (por ejemplo, se hubieran denominado code
en los dos marcos de datos) se habría podido poner únicamente el nombre de la columna en el argumento by
.
left_join(df1, df2, by = c("code" = "cowc"))
## # A tibble: 4 × 6
## country.x code gdpcap pop country.y lang
## <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 France FR 43518 67 French Republic French
## 2 Germany DE 50801 83 Federal Republic of Germany German
## 3 Czechia CZ 26378 11 Czech Republic Czech
## 4 Austria AT NA 9 <NA> <NA>
En el resultado de left_join()
se puede observar que ahora hay dos columnas de país: country.x
y country.y
. En una unión, R pone un sufijo en las columnas que llevan el mismo nombre en los dos marcos de datos pero que no están incluidos en la función join como columna clave. Se puede consultar más información sobre este aspecto consultando el argumento suffix
en la ayuda de cualquier función join.
Como se observa, la unión ha mantenido todas las filas del marco de datos df1
de la izquierda y solo las filas del marco de datos df2
de la derecha que coinciden con el de la izquierda en la columna clave. Esto ha producido el siguiente resultado:
- Las observaciones “FR”, “DE” y “CZ” han quedado aparejadas porque se encuentran en el marco de datos de la izquierda y tienen su pareja en el marco de datos de la derecha.
- La función
left_join()
mantiene todas las observaciones del marco de datos de la izquierda, aunque no tengan pareja en el marco de datos de la derecha. Es el caso de “AT”, que tendrá todos sus valores comoNA
en las columnas provenientes del marco de datos de la derecha. - Las observaciones del marco de datos de la derecha que no tienen pareja en el marco de datos de la izquierda no aparecerán. Es el caso de “OS”.
15.3.2 Right join
La función right_join()
devuelve todas las filas del segundo marco de datos y las filas del primer marco de datos que coincidan con la columna o columnas clave. En este caso, tenemos que pensar que el marco de datos de referencia es el de la derecha, que recibirá los datos del marco de datos de la izquierda, que actúa como secundario.
right_join(df1, df2, by = c("code" = "cowc"))
## # A tibble: 4 × 6
## country.x code gdpcap pop country.y lang
## <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 France FR 43518 67 French Republic French
## 2 Germany DE 50801 83 Federal Republic of Germany German
## 3 Czechia CZ 26378 11 Czech Republic Czech
## 4 <NA> US NA NA United States of America English
Con right_join()
, la unión ha mantenido todas las filas del marco de datos df2
de la derecha y solo las filas del marco de datos df1
de la izquierda que en la columna clave coinciden con el de la derecha. Esto ha producido el siguiente resultado:
- Las observaciones “FR”, “DE” y “CZ” han quedado aparejadas porque están en el marco de datos de la derecha y tienen su pareja en el marco de datos de la izquierda.
- La función
right_join()
mantiene todas las observaciones del marco de datos de la derecha, aunque no tengan pareja en el marco de datos de la izquierda. Es el caso de “OS”, que tendrá todos sus valores comoNA
en las columnas provenientes del marco de datos de la izquierda. - Las observaciones del marco de datos de la izquierda que no tienen pareja en el marco de datos de la derecha no aparecerán. Es el caso de “AT”.
15.3.3 Inner join
La función inner_join()
devuelve solo las filas del primero y el segundo marco de datos que coincidan con la columna o columnas clave. Esta función es la más restrictiva de las cuatro, puesto que eliminará todas las observaciones que no tengan pareja.
inner_join(df1, df2, by = c("code" = "cowc"))
## # A tibble: 3 × 6
## country.x code gdpcap pop country.y lang
## <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 France FR 43518 67 French Republic French
## 2 Germany DE 50801 83 Federal Republic of Germany German
## 3 Czechia CZ 26378 11 Czech Republic Czech
Tal como se puede apreciar, la unión ha preservado solo las observaciones que coinciden en la columna clave de los marcos de datos df1
y df2
. Esto ha producido el siguiente resultado:
- Las observaciones “FR”, “DE” y “CZ” se han conservado y aparejado porque se encuentran en ambos marcos de datos.
- Las observaciones “AT” y “OS” se han eliminado. En el caso de “AT”, esta eliminación se debe a que no tiene una coincidencia en el marco de datos de la derecha. En cuanto a “OS”, se ha eliminado porque no tiene una pareja en el marco de datos de la izquierda.
15.3.4 Full join
La función full_join()
devuelve todas las filas y columnas del primero y el segundo marco de datos. Esta función es la más inclusiva de las cuatro, puesto que conserva todas las observaciones, aunque solo aparezcan en un marco de datos. Lógicamente, esta es la unión que producirá más datos perdidos.
full_join(df1, df2, by = c("code" = "cowc"))
## # A tibble: 5 × 6
## country.x code gdpcap pop country.y lang
## <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 France FR 43518 67 French Republic French
## 2 Germany DE 50801 83 Federal Republic of Germany German
## 3 Czechia CZ 26378 11 Czech Republic Czech
## 4 Austria AT NA 9 <NA> <NA>
## 5 <NA> US NA NA United States of America English
Como se observa, la unión ha mantenido todas las observaciones, tanto del marco de datos df1
de la izquierda como del marco de datos df2
de la derecha. Esto ha producido el siguiente resultado:
- Las observaciones “FR”, “DE” y “CZ” se han conservado y aparejado porque se encuentran en ambos marcos de datos.
- Las observaciones que no tienen su pareja en el otro marco de datos, “AT” y “OS”, también se conservan pero los valores en las columnas del marco de datos contrario aparecerán como datos perdidos.
15.4 El paquete countrycode
Como ya se ha explicado anteriormente, existe una amplia variedad de organizaciones que utilizan sus propias codificaciones de países, hecho que complica sustancialmente la tarea de combinar datos de diferentes fuentes. Supongamos, por ejemplo, que tenemos dos conjuntos de datos como los que están representados en la tabla 15.5, donde aparece información de tres países: Francia, Alemania, República Checa y el Reino Unido. El primer conjunto de datos incluye el PIB per cápita (gdpcap
) y la población (pop
), mientras que el segundo conjunto contiene información sobre la lengua oficial de estos países (lang
). Sin embargo, observamos que las columnas clave —code
en el primer conjunto de datos y cowc
en el segundo— utilizan diferentes códigos de país, hecho que nos dificultaría la unión con las funciones join.
country | code | gdpcap | pop |
---|---|---|---|
France | FR | 43518 | 67 |
Germany | DE | 50801 | 83 |
Czechia | CZ | 26378 | 11 |
United Kingdom | UK | 46510 | 67 |
country | cowc | lang |
---|---|---|
French Republic | FRN | French |
Federal Republic of Germany | GMY | German |
Czech Republic | CZR | Czech |
United Kingdom & Northern Ireland | UKG | English |
Tabla 15.5: Marcos de datos separados
Afortunadamente, existen paquetes específicos de R diseñados para simplificar la tarea de unir conjuntos de datos que comparten unidad de observación pero que tienen columnas clave con códigos o nomenclaturas diferentes. Uno de ellos es el paquete countrycode (Arel-Bundock, 2022), que contiene un largo registro de todas las codificaciones de país que emplean grupos y organizaciones internacionales como Correlates of War (COW) (cowc
y cown
), Eurostat (eurostat
), el Fondo Monetario Internacional (FMI) (imf
), o el Programa de Desarrollo de las Naciones Unidas (undp
). En la figura 15.1 vemos una pequeña muestra de ello.
country | cowc | cown | ecb | eurostat | genc3c | imf | ioc | iso2c | iso3c | iso3n | vdem |
---|---|---|---|---|---|---|---|---|---|---|---|
Austria | AUS | 305 | AT | AT | AUT | 122 | AUT | AT | AUT | 40 | 144 |
Chequia | CZR | 316 | CZ | CZ | CZE | 935 | CZE | CZ | CZE | 203 | 157 |
Francia | FRN | 220 | FR | FR | FRA | 132 | FRA | FR | FRA | 250 | 76 |
Alemania | GMY | 255 | DE | DE | DEU | 134 | GER | DE | DEU | 276 | 77 |
Reino Unido | UKG | 200 | GB | UK | GBR | 112 | GBR | GB | GBR | 826 | 101 |
Estados Unidos | USA | 2 | US | US | USA | 111 | USA | US | USA | 840 | 20 |
Si comparamos los datos que aparecen en la tabla 15.5 con esta tabla de códigos, deducimos que la columna code
del primer marco de datos usa el código Eurostat, puesto que este es el único código de dos caracteres que utiliza “UK” para referirse al Reino Unido. En el caso del segundo marco de datos, no hay duda que la columna cowc
corresponde al código de carácter de Correlates of War. Aparte que lo indica el nombre de la columna, también se puede averiguar porque es el único que utiliza “CZR”, “FRN”, “GMY” y “UKG” para referirse a la República Checa, Francia, Alemania y el Reino Unido, respectivamente. Como veremos enseguida, countrycode utiliza un sistema de conversión que nos permite cambiar un código de país por otro de manera rápida.
La mejor manera de ver la inmensidad de countrycode es cargar el paquete y explorar el objeto codelist
.
View(codelist)
El paquete countrycode contiene la función countrycode()
, que permite convertir fácilmente las codificaciones de país para poder unir diferentes conjuntos de datos. La estructura de la función consta de tres argumentos:
countrycode(sourcevar, origin, destination)
-
sourcevar
: Vector donde se encuentra la columna clave que queremos convertir. -
origin
: Valor de carácter que contiene el nombre de la codificación de la columna clave, como por ejemplo “cowc” o “ecb” 4. -
destination
: Valor de carácter que contiene el nombre de la codificación a la que queremos transformar los datos, como por ejemplo “iso3c” o “eurostat”.
4 Para ver una lista de nombres, teclea ?codelist
.
A continuación vemos cómo se utiliza el paquete countrycode para transformar los datos de df3
y unirlos con df4
en tres pasos.
Dentro del sistema pipe, utilizaremos countrycode()
dentro de mutate()
. Dentro de la función, indicaremos en el primer argumento la columna clave (code
), en el segundo argumento que los datos de la columna clave están en formato "iso3c"
y en el tercer argumento que queremos transformar estos valores en códigos de Correlates of War ("cowc"
).
library(countrycode)
df3 |>
mutate(cowc = countrycode(code, "iso2c", "cowc"))
# A tibble: 4 × 5
country code gdpcap pop cowc
<chr> <chr> <dbl> <dbl> <chr>
1 France FR 43518 67 FRN
2 Germany DE 50801 83 GMY
3 Czechia CZ 26378 11 CZR
4 Austria AT NA 9 AUS
En la siguiente pipe, utilizaremos una función join para unir los datos con el marco de datos df4
. Indicamos que la unión se debe hacer a través de la columna "cowc"
, que coincide en el primero y en el segundo marco de datos.
df3 |>
mutate(cowc = countrycode(code, "iso2c", "cowc")) |>
left_join(df4, by = c("cowc"))
# A tibble: 4 × 7
country.x code gdpcap pop cowc country.y lang
<chr> <chr> <dbl> <dbl> <chr> <chr> <chr>
1 France FR 43518 67 FRN French Republic French
2 Germany DE 50801 83 GMY Federal Republic of Germany German
3 Czechia CZ 26378 11 CZR Czech Republic Czech
4 Austria AT NA 9 AUS <NA> <NA>
El paquete countrycode también nos permite cambiar el idioma de los datos. Dentro de la función mutate()
, hemos usado también la función countrycode()
para crear un nuevo vector pais
con los nombres de países en español5. Finalmente, hemos limpiado las columnas que no nos interesan con select()
.
5 Se pueden poner en catalán (cldr.short.ca
), gallego (cldr.short.gl
), euskera (cldr.short.eu
) y otros idiomas.
df3 |>
mutate(cowc = countrycode(code, "iso2c", "cowc"),
pais = countrycode(code, "iso2c", "cldr.short.es")) |>
left_join(df4, by = c("cowc")) |>
select(pais, code:pop, lang)
# A tibble: 4 × 5
pais code gdpcap pop lang
<chr> <chr> <dbl> <dbl> <chr>
1 Francia FR 43518 67 French
2 Alemania DE 50801 83 German
3 Chequia CZ 26378 11 Czech
4 Austria AT NA 9 <NA>
En el código anterior, hemos detectado que los valores del vector df3$code
estaban codificados según la nomenclatura “iso2c” y que los valores del vector df4$cowc
estaban codificados según la nomenclatura “cowc”. Pero, ¿cómo hemos sabido que eran estas las nomenclaturas correctas? En verdad, no hay ninguna guía que nos permita saberlo directamente. Pero hay algunos elementos que nos pueden ayudar a averiguarlo:
-
Nombre de columna: A menudo, la columna lleva el nombre asociado, de forma que nos encontraremos con variables que tomen el nombre de
iso3c
,cowc
y otros. -
Procedencia: Podemos deducirlo por la procedencia de los datos. Los conjuntos de datos de COW siempre tendrán códigos
cowc
ocown
y los del Banco Mundial acostumbran a tener códigoswb
o alguna de las nomenclaturas ISO. - Libro de códigos: Una opción normalmente infalible es consultar el libro de códigos, donde encontraremos la definición de cada variable y, por lo tanto, nos mostrará cómo se han codificado las columnas clave.
-
Observaciones divergentes: Algunos códigos de país tienen formatos muy particulares. Por ejemplo, si Argelia tiene el código DZA, muy probablemente querrá decir que la columna está codificada en formato ISO (
iso3c
). Así mismo, codificar el Reino Unido como UKG es propio de COW (cowc
). Fijaos en las diferencias en la figura 15.2. -
Inner join: En caso de duda, también se puede probar con diferentes códigos de país y hacer la unión con la función
inner_join()
. Lógicamente, el código correcto será el que produzca la unión con más observaciones.
country | cowc | cown | ecb | eurostat | fips | imf | ioc | iso2c | iso3c | iso3n | vdem |
---|---|---|---|---|---|---|---|---|---|---|---|
Argelia | ALG | 615 | DZ | DZ | AG | 612 | ALG | DZ | DZA | 12 | 103 |
Antigua y Barbuda | AAB | 58 | AG | AG | AC | 311 | ANT | AG | ATG | 28 | NA |
Francia | FRN | 220 | FR | FR | FR | 132 | FRA | FR | FRA | 250 | 76 |
Alemania | GMY | 255 | DE | DE | GM | 134 | GER | DE | DEU | 276 | 77 |
Reino Unido | UKG | 200 | GB | UK | UK | 112 | GBR | GB | GBR | 826 | 101 |
15.5 Ejemplo: Desarrollo y democracia
¿Qué relación existe entre el desarrollo económico y la democracia? Para poder responder a esta pregunta, es evidente que necesitamos datos que provengan de como mínimo dos bases de datos. Por un lado, debemos obtener información sobre el nivel de desarrollo económico de cada país, que deberemos ir a buscar en el Banco Mundial o en algún centro especializado. Y por otro lado, necesitamos datos de democracia, que encontraremos en algún centro de investigación que proporcione datos sobre democracia en varios países. Estas bases de datos tendrán miles de observaciones y, por lo tanto, será muy costoso intentar unirlas manualmente. Será mejor utilizar las funciones join. Además, como veremos a continuación, también usaremos el paquete countrycode, puesto que los dos conjuntos de datos que descargaremos no tienen una columna clave común.
En primer lugar, para obtener los datos sobre desarrollo económico iremos a buscar la información en las Penn World Tables (PWT) (Feenstra et al., 2015), una popular base de datos que contiene información económica sobre los estados. La mayoría de las bases de datos que construyen tienen como unidad de observación el estado-año. Para obtener los datos, tanto se puede ir a su web y bajar el archivo, como también podemos descargar una versión reducida.
La información que nos interesa son los datos de PIB per cápita, que es como entenderemos en esta actividad el desarrollo económico. Si exploramos el objeto pwt_short
, vemos que tenemos 12.810 observaciones, la unidad de observación es el país-año y hay dos columnas clave que nos interesan: el código de país (countrycode
) y el año (year
).
head(pwt_short, 5)
## # A tibble: 5 × 5
## countrycode country year rgdpo pop
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 ABW Aruba 1950 NA NA
## 2 ABW Aruba 1951 NA NA
## 3 ABW Aruba 1952 NA NA
## 4 ABW Aruba 1953 NA NA
## 5 ABW Aruba 1954 NA NA
Las PWT no proveen directamente información del PIB per cápita, y por eso se debe calcular a partir de las variables del PIB real (rgdpo
) y la población (pop
).
pwt_short <- pwt_short |>
mutate(gdpcap = rgdpo * pop)
Finalmente, deberíamos averiguar cuál es el código de país que aparece en la columna countrycode
. Una posibilidad es mirar qué codificación tiene Argelia. Si comparamos el resultado con la información aparecida en la figura 15.2, comprobamos que “DZA” pertenece a la nomenclatura iso3c
.
pwt_short |>
filter(country == "Algeria", year == last(year))
## # A tibble: 1 × 6
## countrycode country year rgdpo pop gdpcap
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 DZA Algeria 2019 507488. 43.1 21848889.
En segundo lugar, podemos descargar los datos de democracia del Varieties of Democracy (V-Dem) Project (Coppedge et al., 2021), una base de datos que crea un índice por varias dimensiones de la democracia y tiene como unidad de observación el estado-año. Para obtener los datos, tanto se puede utilizar el paquete de R vdemdata como descargar una versión reducida de los datos.
De los datos de V-Dem nos interesa el índice de democracia liberal, que está almacenado en la variable v2x_libdem
. Si exploramos el objeto vdem_short
, vemos que tenemos 11.930 observaciones, la unidad de observación es el país-año y hay dos columnas clave que nos interesan: el código de país (country_id
) y el año (year
).
head(vdem_short, 5)
## # A tibble: 5 × 4
## country_name country_id year v2x_libdem
## <chr> <dbl> <dbl> <dbl>
## 1 Mexico 3 1950 0.096
## 2 Mexico 3 1951 0.096
## 3 Mexico 3 1952 0.096
## 4 Mexico 3 1953 0.097
## 5 Mexico 3 1954 0.108
Ya vemos que el código de país en estos datos de V-Dem es numérico, por lo que ya podemos estar seguros de que no será el mismo que el código de país de los datos PWT, que eran de carácter. A continuación exploramos el objeto codelist_panel
, del paquete countrycode, donde filtramos los datos por México, pedimos solo los vectores de carácter y hacemos un glimpse()
. Esperamos encontrar que México tenga en algún código el valor 3.
countrycode::codelist_panel |>
filter(country.name.en %in% c("Mexico")) |>
select_if(is.numeric) |>
glimpse()
## Rows: 233
## Columns: 16
## $ year <dbl> 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1…
## $ cown <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ fao <dbl> 138, 138, 138, 138, 138, 138, 138, 138, 138…
## $ gaul <dbl> 162, 162, 162, 162, 162, 162, 162, 162, 162…
## $ gwn <dbl> 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,…
## $ imf <dbl> 273, 273, 273, 273, 273, 273, 273, 273, 273…
## $ iso3n <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
## $ iso4217n <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
## $ p4n <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ un <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
## $ un.region.code <dbl> 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,…
## $ un.regionintermediate.code <dbl> 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,…
## $ un.regionsub.code <dbl> 419, 419, 419, 419, 419, 419, 419, 419, 419…
## $ unpd <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
## $ vdem <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3…
## $ wvs <dbl> 484, 484, 484, 484, 484, 484, 484, 484, 484…
Observamos que el único código de país donde México tiene el valor 3 es vdem
, por lo tanto, ahora ya tenemos toda la información para unir los dos marcos de datos. En este caso, la unidad de observación de los datos es estado-año, por eso deberemos utilizar dos columnas clave para hacer la unión: la que representa el código del estado y la del año. En este caso, la sintaxis será:
xxxx_join(x, y, by = c("pais", "año")).
Para hacer la unión, en primer lugar utilizaremos la función countrycode()
para transformar el vector pwt_short$countrycode
en nomenclatura numérica vdem
. Guardaremos los datos en el vector country_id
, así conseguimos que la columna clave de país se llame igual que la columna clave del segundo marco de datos. Con inner_join()
, unimos los datos con el marco de datos vdem_short
, indicando el nombre de las columnas clave de año y país.
vdem_pwt_join <- pwt_short |>
mutate(country_id = countrycode(countrycode, "iso3c", "vdem")) |>
inner_join(vdem_short, by = c("year", "country_id"))
glimpse(vdem_pwt_join)
## Rows: 10,573
## Columns: 9
## $ countrycode <chr> "AGO", "AGO", "AGO", "AGO", "AGO", "AGO", "AGO", "AGO", "…
## $ country <chr> "Angola", "Angola", "Angola", "Angola", "Angola", "Angola…
## $ year <dbl> 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 195…
## $ rgdpo <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ pop <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ gdpcap <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ country_id <dbl> 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 10…
## $ country_name <chr> "Angola", "Angola", "Angola", "Angola", "Angola", "Angola…
## $ v2x_libdem <dbl> 0.034, 0.034, 0.034, 0.034, 0.034, 0.034, 0.034, 0.034, 0…