Introducción

En el presente documento quiero tratar de analizar como se ve afectada la ecónomica debido a los distintos conflictos que se han producido en el continente africano. Para ello he accedido a un dataset de ACLED (Armed Conflict Location & Event Data Project) en el cual hay información sobre confictos que han sucedido en África desde el año 1997 hasta el 2016. Este dataset provee información sobre el tipo de conflicto, si son protestas, ataques terroristas, si ha habido muertes en el ese conflicto y varios datos más.

Voy a cruzar estos datos con datos del Banco Mundial de esos mismos años, para ver si es clara la posible relación que puede haber entre conflictos y afectación en la economía. Para ello voy a realizar una carga del dataset, limpiar y seleccionar los datos que requiero y cruzarlo con los datos del Banco Mundial para PIB y PIB per capita para los paises seleccionados.

Carga de los dataset

Dataset ACLED

Cargamos los dataset, vamos a cargar el dataset de ACLED desde su web. Vamos a descargar los conflictos desde el año 1997 hasta el año 2016. En vez de read.table he usado read_csv ya que con la read.table este dataset daba error en ciertas líneas y no lo lelgaba a cargar. En con la función read.tabla si indicaba el parámetro fill=TRUE hacía que varias columnas se informarán con datos incorrectos. La función read_csv, no carga las filas problemáticas pero te da un informe de las que no se han cargado, en nuestro caso, han sido 14 líneas sobre un dataset de más de 246K de líneas, por lo que el perderlas no es vital para el tipo de análisis que vamos a realizar. Procedemos a realizar la carga de los datos:

## Parsed with column specification:
## cols(
##   .default = col_character(),
##   GWNO = col_integer(),
##   EVENT_ID_NO_CNTY = col_integer(),
##   YEAR = col_integer(),
##   TIME_PRECISION = col_integer(),
##   INTER1 = col_integer(),
##   INTERACTION = col_integer(),
##   LATITUDE = col_double(),
##   LONGITUDE = col_double(),
##   GEO_PRECISION = col_integer(),
##   FATALITIES = col_integer()
## )
## See spec(...) for full column specifications.
## Warning in rbind(names(probs), probs_f): number of columns of result is not
## a multiple of vector length (arg 1)
## Warning: 14 parsing failures.
## row # A tibble: 5 x 5 col      row       col expected     actual                    file expected    <int>     <chr>    <chr>      <chr>                   <chr> actual 1  91280 LONGITUDE a double   27.56061 './data/acled_2016.zip' file 2  91281 LONGITUDE a double   27.56061 './data/acled_2016.zip' row 3 110350  LATITUDE a double  -15.65777 './data/acled_2016.zip' col 4 110351  LATITUDE a double  -15.65777 './data/acled_2016.zip' expected 5 193642 LONGITUDE a double   31.01736 './data/acled_2016.zip'
## ... ................. ... .............................................................. ........ .............................................................. ...... .............................................................. .... .............................................................. ... .............................................................. ... .............................................................. ........ ..............................................................
## See problems(...) for more details.

Podemos visualizar las líneas donde hemos tenido problemas, que han sido 14:

problems(datos_acled)
## # A tibble: 14 x 5
##       row       col               expected     actual
##     <int>     <chr>                  <chr>      <chr>
##  1  91280 LONGITUDE               a double   27.56061
##  2  91281 LONGITUDE               a double   27.56061
##  3 110350  LATITUDE               a double  -15.65777
##  4 110351  LATITUDE               a double  -15.65777
##  5 193642 LONGITUDE               a double   31.01736
##  6 221856 LONGITUDE no trailing characters           
##  7 221859 LONGITUDE no trailing characters           
##  8 221860 LONGITUDE no trailing characters           
##  9 221861 LONGITUDE no trailing characters           
## 10 221862 LONGITUDE no trailing characters           
## 11 221865 LONGITUDE no trailing characters           
## 12 221866 LONGITUDE no trailing characters           
## 13 221869 LONGITUDE no trailing characters           
## 14 221870 LONGITUDE no trailing characters           
## # ... with 1 more variables: file <chr>

Ahora revisamos el dataset:

head(datos_acled)
## # A tibble: 6 x 22
##    GWNO EVENT_ID_CNTY EVENT_ID_NO_CNTY EVENT_DATE  YEAR TIME_PRECISION
##   <int>         <chr>            <int>      <chr> <int>          <int>
## 1   615          1ALG                1 04/01/1997  1997              1
## 2   615          1ALG                1 04/01/1997  1997              1
## 3   615          2ALG                2 05/01/1997  1997              1
## 4   615          2ALG                2 05/01/1997  1997              1
## 5   615          3ALG                3 06/01/1997  1997              1
## 6   615          3ALG                3 06/01/1997  1997              1
## # ... with 16 more variables: EVENT_TYPE <chr>, ACTOR1 <chr>,
## #   ALLY_ACTOR_1 <chr>, INTER1 <int>, INTERACTION <int>, COUNTRY <chr>,
## #   ADMIN1 <chr>, ADMIN2 <chr>, ADMIN3 <chr>, LOCATION <chr>,
## #   LATITUDE <dbl>, LONGITUDE <dbl>, GEO_PRECISION <int>, SOURCE <chr>,
## #   NOTES <chr>, FATALITIES <int>

Hacemos un summary:

summary(datos_acled)
##       GWNO       EVENT_ID_CNTY      EVENT_ID_NO_CNTY  EVENT_DATE       
##  Min.   :404.0   Length:246205      Min.   :     1   Length:246205     
##  1st Qu.:490.0   Class :character   1st Qu.: 34452   Class :character  
##  Median :520.0   Mode  :character   Median : 70305   Mode  :character  
##  Mean   :535.8                      Mean   : 70045                     
##  3rd Qu.:580.0                      3rd Qu.:104639                     
##  Max.   :651.0                      Max.   :140747                     
##                                                                        
##       YEAR      TIME_PRECISION   EVENT_TYPE           ACTOR1         
##  Min.   :1997   Min.   :1.000   Length:246205      Length:246205     
##  1st Qu.:2005   1st Qu.:1.000   Class :character   Class :character  
##  Median :2012   Median :1.000   Mode  :character   Mode  :character  
##  Mean   :2010   Mean   :1.146                                        
##  3rd Qu.:2014   3rd Qu.:1.000                                        
##  Max.   :2016   Max.   :3.000                                        
##                                                                      
##  ALLY_ACTOR_1           INTER1       INTERACTION      COUNTRY         
##  Length:246205      Min.   :1.000   Min.   :10.00   Length:246205     
##  Class :character   1st Qu.:2.000   1st Qu.:13.00   Class :character  
##  Mode  :character   Median :3.000   Median :27.00   Mode  :character  
##                     Mean   :3.765   Mean   :28.74                     
##                     3rd Qu.:6.000   3rd Qu.:37.00                     
##                     Max.   :8.000   Max.   :88.00                     
##                                                                       
##     ADMIN1             ADMIN2             ADMIN3         
##  Length:246205      Length:246205      Length:246205     
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##                                                          
##    LOCATION            LATITUDE         LONGITUDE      GEO_PRECISION  
##  Length:246205      Min.   :-34.710   Min.   :-17.46   Min.   :1.000  
##  Class :character   1st Qu.: -1.400   1st Qu.: 15.32   1st Qu.:1.000  
##  Mode  :character   Median :  4.400   Median : 29.38   Median :1.000  
##                     Mean   :  5.163   Mean   : 25.12   Mean   :1.274  
##                     3rd Qu.: 11.523   3rd Qu.: 34.38   3rd Qu.:1.000  
##                     Max.   : 37.274   Max.   : 51.27   Max.   :3.000  
##                     NA's   :2         NA's   :12                      
##     SOURCE             NOTES             FATALITIES       
##  Length:246205      Length:246205      Min.   :    0.000  
##  Class :character   Class :character   1st Qu.:    0.000  
##  Mode  :character   Mode  :character   Median :    0.000  
##                                        Mean   :    5.561  
##                                        3rd Qu.:    1.000  
##                                        Max.   :25000.000  
## 

Datos Banco Mundial

Vamos a cargar los datos que requerimos del Banco Mundial usando el paquete WDI. Queremos obtener el PIB y PIB per capita de los paises de África. Para ello le tendremos que pasar como parámetro en country todos los paises de África que queremos cargar en formato ISO-2. El problema es que el dataset de ACLET no ha seguido esta norma y no disponemos de ese formato. Por tanto primero cargaré un dataset que me he bajado de las Naciones Unidas que está en la carpeta data y que dispone de este dato para los distintos paises que queremos cargar de África.

En la carga de los paises, Namibia su código ISO-2 es NA y me lo convertía a vacio (N/A), he tenido que incluir los parámetros a la función read_table para que se cargara correctamente.

data_countries <- read.table("./data/UNSD-countries.csv",sep=";", stringsAsFactors=FALSE, header=TRUE, na.strings="")

Cargamos la líbrería WDI.

# Nos aseguramos que está instalado el paquete y, sino lo instalamos
if(!is.element("WDI", installed.packages()[, 1]))
      install.packages("WDI")

# Lo cargamos
library(WDI)
## Loading required package: RJSONIO

Seleccionamos los indices que queremos extraer, que son los del PIB en dolares y el PIB per capita en dolares.

# los indices que nos queremos descargar
indices <- c('NY.GDP.MKTP.CD','NY.GDP.PCAP.CD')

paises <- data_countries$ISO.alpha2.code

datos_wdi <- WDI(country=paises, indicator=indices, start=1997, 
                 end=2016, extra=TRUE)

Tratamiento

Vamos a aplicar fitros para quedarnos con los datos que requerimos y uniremos los dataset para poder dibujar la gráfica.

Dataset´s de ACLED

Antes de filtrar por las columnas que queremos Vamos a revisar que columnas de nuestro dataset pueden tener campos que sean de tipo NA.

colSums(is.na(datos_acled))
##             GWNO    EVENT_ID_CNTY EVENT_ID_NO_CNTY       EVENT_DATE 
##                0                0                0                0 
##             YEAR   TIME_PRECISION       EVENT_TYPE           ACTOR1 
##                0                0                0                0 
##     ALLY_ACTOR_1           INTER1      INTERACTION          COUNTRY 
##           207550                0                0                0 
##           ADMIN1           ADMIN2           ADMIN3         LOCATION 
##                0              196           114809                0 
##         LATITUDE        LONGITUDE    GEO_PRECISION           SOURCE 
##                2               12                0              323 
##            NOTES       FATALITIES 
##            17375                0

Parece que tenemos varias columnas vacias. Como podemos ver, no son ninguna de las que nos interesan.

Vamos a cambiar el nombre de las columnas que nos interesan para que sean iguales en los dos dataset

cols <- c('COUNTRY','YEAR','FATALITIES')
cols_low <- c('country','year','fatalities')
# nos quedamos con las columnas que vamos a cambiar el nombre
col_acled <- match(cols, names(datos_acled))

# Cambiamos los nombres para que queden como queremos
names(datos_acled)[col_acled] <- cols_low

Queremos hacer una tabla con los campos “country”, “year”, “fatalities”, y el número de conflictos que tenemos sum_conflics. Lo primero que hacemos es un subset de los datos que nos interesan del dataframe y después agrupamos haciendo un sumatorio.

datos_acled_subset = datos_acled [names(datos_acled) %in% cols_low]

# Agrupo por year y country
gby_year_country <- group_by(datos_acled_subset, year,country)

# Y sobre cada grupo, cuento el número de conflictos y el total de fatalities
datos_agg <- summarize(gby_year_country,
  sum_conllicts = n(),
  sum_fatalities = sum(fatalities))
#visualizamos los datos
datos_agg <- as.data.frame(datos_agg)
head(datos_agg)
##   year      country sum_conllicts sum_fatalities
## 1 1997      Algeria           228           6934
## 2 1997       Angola           481          10524
## 3 1997        Benin             2              0
## 4 1997     Botswana             1              0
## 5 1997 Burkina Faso             8              0
## 6 1997      Burundi           433           8500

Dataset WDI

Vamos a cambiar el nombre a los datos y filtraremos para quedarnos sólo con las columnas que nos interesan:

indices_ing <- c("GDP.Current.USD","GDP.per.capita.Current.USD")
indices_ingl2 <- c("year","country","GDP.per.capita.Current.USD",'GDP.Current.USD',"iso2c","region")
col_wdi <- match(indices, names(datos_wdi))

# Cambiamos los nombres para que queden como queremos
names(datos_wdi)[col_wdi] <- indices_ing
subset_wdi <- datos_wdi[indices_ingl2]
head(subset_wdi)
##   year country GDP.per.capita.Current.USD GDP.Current.USD iso2c
## 1 1997  Angola                   506.8850      7648377413    AO
## 2 1998  Angola                   415.6933      6445041825    AO
## 3 1999  Angola                   385.7689      6152922943    AO
## 4 2000  Angola                   555.2969      9129594819    AO
## 5 2001  Angola                   526.1687      8936063723    AO
## 6 2002  Angola                   711.1817     12497346670    AO
##                                   region
## 1 Sub-Saharan Africa (all income levels)
## 2 Sub-Saharan Africa (all income levels)
## 3 Sub-Saharan Africa (all income levels)
## 4 Sub-Saharan Africa (all income levels)
## 5 Sub-Saharan Africa (all income levels)
## 6 Sub-Saharan Africa (all income levels)

Como vamos a unir por país y año vamos a revisar los nombres de los paises para ver si coinciden:

#los asignamos a variables para que emjorar el rendimiento y podamos ordenarlos alfabeticamente
countries_wdi <- unique(subset_wdi$country)
countries_agg <- unique(datos_agg$country)

countries_wdi<-sort(countries_wdi, decreasing =FALSE)
countries_agg<-sort(countries_agg, decreasing =FALSE)

country_index_1<- match(countries_wdi, countries_agg)
country_index_2<- match(countries_agg,countries_wdi)

no_countries_wdi<-countries_wdi[!countries_wdi %in% countries_wdi[!is.na(country_index_1)]]

no_countries_agg<-countries_agg[!countries_agg %in% countries_agg[!is.na(country_index_2)]]

no_countries_wdi
## [1] "Congo, Dem. Rep." "Congo, Rep."      "Cote d'Ivoire"   
## [4] "Egypt, Arab Rep." "Gambia, The"
no_countries_agg 
## [1] "Democratic Republic of Congo" "Egypt"                       
## [3] "Gambia"                       "Ivory Coast"                 
## [5] "Republic of Congo"

Podemos ver cuales son los paises que no coinciden por nombre, vamos a unificar estos nombres con los valores que tenemos en el dataset de ACLED. No son muchos nombres por lo que hacemos el cambio de forma sencilla:

#Como no son muchos vamos a cambiar lso nombres de forma sencilla
subset_wdi$country[subset_wdi$country==no_countries_wdi[1]]<-no_countries_agg[1]
subset_wdi$country[subset_wdi$country==no_countries_wdi[2]]<-no_countries_agg[5]
subset_wdi$country[subset_wdi$country==no_countries_wdi[3]]<-no_countries_agg[4]
subset_wdi$country[subset_wdi$country==no_countries_wdi[4]]<-no_countries_agg[2]
subset_wdi$country[subset_wdi$country==no_countries_wdi[5]]<-no_countries_agg[3]

#Comprobamos que ya casan todos los nombres
match(unique(subset_wdi$country), unique(datos_agg$country))
##  [1]  2  5  6  3  4 10  8 35 21  7 11  1 12 14 15 16 18 17 19 13 20 22 24
## [24] 23 25 30 26 28 29 27 31 32 33 34 36 41 38 37 39 49 42  9 44 45 43 46
## [47] 40 47 48

Como podemos ver no hay ningún indice de tipo NA.

Procedemos a unir los dos dataset por año y país:_

datos_join <- merge(datos_agg,subset_wdi,by=c("year","country"))

head(datos_join)
##   year      country sum_conllicts sum_fatalities
## 1 1997      Algeria           228           6934
## 2 1997       Angola           481          10524
## 3 1997        Benin             2              0
## 4 1997     Botswana             1              0
## 5 1997 Burkina Faso             8              0
## 6 1997      Burundi           433           8500
##   GDP.per.capita.Current.USD GDP.Current.USD iso2c
## 1                  1612.0093     48177862502    DZ
## 2                   506.8850      7648377413    AO
## 3                   361.1003      2268301538    BJ
## 4                  3065.5273      5020214747    BW
## 5                   229.4931      2447669404    BF
## 6                   159.1755       972896268    BI
##                                           region
## 1 Middle East & North Africa (all income levels)
## 2         Sub-Saharan Africa (all income levels)
## 3         Sub-Saharan Africa (all income levels)
## 4         Sub-Saharan Africa (all income levels)
## 5         Sub-Saharan Africa (all income levels)
## 6         Sub-Saharan Africa (all income levels)

Gráfica

Vamos a utilizar la librería googlevis para realizar un gráfico de tipo Motion Chart:

# Cargamos la librería
library(googleVis)
## 
## Welcome to googleVis version 0.6.2
## 
## Please read Google's Terms of Use
## before you start using the package:
## https://developers.google.com/terms/
## 
## Note, the plot method of googleVis will by default use
## the standard browser to display its output.
## 
## See the googleVis package vignettes for more details,
## or visit http://github.com/mages/googleVis.
## 
## To suppress this message use:
## suppressPackageStartupMessages(library(googleVis))
M <- gvisMotionChart(datos_join,
                     idvar="country", timevar="year",
                     xvar="sum_conllicts", yvar="GDP.Current.USD",
                     colorvar="region", sizevar="sum_fatalities",
                     options=list(width=700, height=600),
                     chartid="pib_vs_confictos_africa")

# Generamos la página web 
#print(M, 'chart')
plot(M)
## starting httpd help server ...
##  done

No he conseguido incluir el gráfico en el documento rmd para que se visualice al cargar el HTML. He dado permisos a las carpetas como se indica en la guia de Googlevis. Lo he desplegado en RPUBS (anexo el link al ejercicio desplegado) ya que se supone que desde servidor no debería haber ningún problema, pero no se visualiza. Se ha de ejecutar el código en RStudio para poder visualizarlo y verlo de forma dinámica.

Análisis

El gráfico que se presenta corresponde al PIB respecto a la suma de conflictos agrupadas por país y año, el tamaño de las burbujas representa los muertos habidos en esos conflictos para ese año. Por conflicto se entiende desde protestas, hasta ataques terroristas.

Año 1997

En la imagen a continuación podemos ver la situación en el año 1997. Paises como Líbia, Argelia, tienen poca conflictividad. Pero hay que tener en cuenta que en esos paises en esas fechas había dictaduras bastante duras. Túnez en esas fechas erá uno de los paises más tranquilos y pácificos de la zona, junto a Egipto dos democrias. Se puede ver que Sierra Leona tenía en ese momento una alta conflictivdad pero no hubo muertes en ese año. Angola por esa época pasaba por una larga guerra civil que duró hasta el año 2002. Ver además la diferencia de PIB de Sur Africa con respecto al resto de los paises de su área.

Situación en 1997

Situación en 1997

Año 2000

Se puede visuliazar como los conflictos de Eritrea, Angola y Etiopia, que se recrudecierón en el año 1999, parece que mejoran en este año. En Angola el número de conflictos y fallecidos disminuye considerablemnente frente al año 1999 donde había alcanzado su máximo. La variación en el PIB de estos paises no se ha notado de forma considerable ya que de partida es muy baja.

Situación en 2000

Situación en 2000

Año 2005

Ya hace tres años que la guerra civil en Angola ha finalizado y se ve una aumento considerable del PIB, y una grán disminución de los conflictos y muertes. En esá empoca Angola recibe aportaciones de ayuda internacional para estabilizar el país.

En Etiopía aumentan los conflictos pero disminuye el número de fallecidos. Sur Africa, Argelia y Nigueria tienen una conflictivad similar siendo Argelia la que tiene un número de fallecidos muy alto, del orden de 500, respecto a Sur África que tiene 12 para ese año. Este último duplica el PIB de los otros dos paises.

Situación en 2005

Situación en 2005

Años 2010 - 2013

Primavera Árabe. Se puede ver en este caso como los paises del norte del Magreb se ven afectados por la Primavera Árabe y aumenta de forma considerable. Hay que indicar además que en este periodo los antentados en Egypto contra el turismo se recrudecen. Pero esto no parece afectar directamente a su PIB.

En Libía este es un periodo en el que comienza una guerra civil, muere Gadafi en el año 2011 y todavía hoy sigue habíendo un estado de guerra con el país divido en dos facciones. En este caso el PIB se desploma, como es lógico al no haber ningún tipo de gobierno. Comentar el caso de Nigueria, un país de alta conflictividad que sin embargo su PIB es de los más altos del continente. Se debe principalmente a ayudas y la grán cantidad de recursos naturales de los que dispone.

Situación en 2010 Situación en 2011 Situación en 2013

Año 2016

Los paises del Magreb siguen siendo paises con alto nivel de conflictivad y fallecimientos. Sobre todo hay que destacar Egypto y Túnez para los cuales el número de muertes es muy elevado frente al resto de paises. A pesar de ello Egypto es uno de los paises un alto PIB. Nigeria en este año tiene un desplome considerable de su PIB pero no parece debido a un aumento de la confictividad ya que hay más fallecidos en años previos y el PIB crecía.

Situación en 2016

Situación en 2016

Conclusiones

Las siguientes gráficas resumen la situación de conflictos, PIB y fallecidos durante el periodo en los paises de África. Sinceramente esperaba una mayor incidencia en la economía del país (reflejado en el PIB) teniendo en cuenta conflictos y muertes en esos conflictos. Pero viendo paises como Nigeria, Egipto que tienen una alta conflictividad pero están muy por encima del resto del paises en cuestión de PIB.

Esto se ha de deber a factores externos, que no se ven aquí representandos, como son ayudas internacionales, para que estos paises no se desestabilicen, recursos naturales abundantes, como es el caso de Nigeria. Hay que indicar que lo que parece ser clave es conservar un gobierno político, se puede ver en paises como Líbia que se desploman debido al desmenbramiento del país y a Somalia, que empieza a crecer.

Variación conflictos anual

Variación conflictos anual

Variación PIB anual

Variación PIB anual

Fallecidos en conflictos

Fallecidos en conflictos

# Terminamos la sesión
sessionInfo()
## R version 3.4.1 (2017-06-30)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 15063)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Spanish_Spain.1252  LC_CTYPE=Spanish_Spain.1252   
## [3] LC_MONETARY=Spanish_Spain.1252 LC_NUMERIC=C                  
## [5] LC_TIME=Spanish_Spain.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] googleVis_0.6.2 WDI_2.4         RJSONIO_1.3-0   dplyr_0.7.2    
## [5] ggplot2_2.2.1   readr_1.1.1    
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.12     bindr_0.1        knitr_1.17       magrittr_1.5    
##  [5] hms_0.3          munsell_0.4.3    colorspace_1.3-2 R6_2.2.2        
##  [9] rlang_0.1.2      stringr_1.2.0    plyr_1.8.4       tools_3.4.1     
## [13] grid_3.4.1       gtable_0.2.0     htmltools_0.3.6  assertthat_0.2.0
## [17] yaml_2.1.14      lazyeval_0.2.0   rprojroot_1.2    digest_0.6.12   
## [21] tibble_1.3.4     bindrcpp_0.2     glue_1.1.1       evaluate_0.10.1 
## [25] rmarkdown_1.6    stringi_1.1.5    compiler_3.4.1   scales_0.5.0    
## [29] backports_1.1.0  jsonlite_1.5     pkgconfig_2.0.1