Analyzing Mexican votes in the U.N.

[This article was first published on En El Margen - R-English, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Last week I discovered the unvotes package on github so I thought i’d do some number-crunching to see if I find anything interesting.

The package provides the voting history of countries in the United Nations General Assembly, along with information such as date, description, and topics for each vote.

The author makes it clear to reference the original publication of the data:

Erik Voeten “Data and Analyses of Voting in the UN General Assembly” Routledge Handbook of International Organization, edited by Bob Reinalda (published May 27, 2013)

I installed from CRAN and created a small function that counts the amount of times two countries “agree”, that is they vote the same way in a given resolution.

library(dplyr)
library(magrittr)
library(unvotes)

# the database of all votes 
votes <- un_votes %>%
  left_join(., un_roll_calls) %>%
  left_join(., un_roll_call_issues)

# a function to count the amount of times any given countries "agree"
un_agree <- function(db, # the database
                     country1, 
                     country2,
                     abstain = TRUE # if FALSE, do not count abstains
                     ){
  c1 <- db %>% 
    filter(country == country1) %>%
    mutate("vote2" = vote)
  c2 <- db %>% 
    filter(country == country2)
  j <- c1 %>% select(vote2, rcid) %>%
    left_join(., c2 %>% select(rcid, vote), by = "rcid") %>%
    filter(!is.na(vote))
  if(!abstain){
  j <- j %>% 
    filter(vote != "abstain") %>%
    filter(vote2 != "abstain")
  }
  j <- j %>% 
    mutate("agree" = ifelse(vote2 == as.character(vote), 1, 0))
  sum(j$agree)/length(j$agree)*100
}

Now, it would be interesting to see how much my home country and its rowdy neighbour to the north see eye-to-eye…

un_agree(votes, "Mexico", "United States")
# [1] 23.32385

So about one-fourth of every vote. This goes up slightly when eliminating abstentions (29.7%).

However, this might be interesting to see by “sexenio”, or Mexican presidential term. Small caveat, the last vote in the dataset is september 9th, 2014.

# some of the newest presidential terms...
votes %<>% mutate("mxterm" = ifelse(date >= '1988-12-01' & 
                                   date <= '1994-11-30', "salinas", 
                            ifelse(date >= '1994-12-01' & 
                                   date <= '2000-11-30', "zedillo",
                            ifelse(date >= '2000-12-01' & 
                                   date <= '2006-11-30', "fox",
                            ifelse(date >= '2006-12-01' & 
                                   date <= '2012-11-30', "calderon",
                            ifelse(date >= '2012-12-01' & 
                                   date <= '2018-11-30', "penanieto", "others"))
                                   ))))
un_agree(votes %>% filter(mxterm =="salinas"), 
        "Mexico", "United States")
# [1] 10.77586
un_agree(votes %>% filter(mxterm =="zedillo"), 
        "Mexico", "United States")
# [1] 20.76167
un_agree(votes %>% filter(mxterm =="fox"), 
        "Mexico", "United States")
# [1] 9.129213
un_agree(votes %>% filter(mxterm =="calderon"), 
        "Mexico", "United States")
# [1] 8.935743
un_agree(votes %>% filter(mxterm =="penanieto"), 
        "Mexico", "United States")
# [1] 12.92517

This is unexpected. It’s usually folk tale that the PAN-ista governments (Fox and especially Calderon) cooperated much more with their American counterparts than the rest. Maybe we could visualize this side by side in a graph:

agree_by_year <- votes %>% 
  filter(country %in% c("Mexico", "United States")) %>% 
  group_by(year = year(date), rcid) %>% 
  summarise("DifVote" = n_distinct(vote)) %>% 
  mutate("Agree" = ifelse(DifVote == 1, 1, 0)) %>% 
  summarise("PercentageAgree" = sum(Agree)/n_distinct(rcid), 
            "VoteCount" = n_distinct(rcid))
  
g <- ggplot(agree_by_year, 
        aes(x = year, 
            y = PercentageAgree*100))+
  geom_line(colour = eem_colors[1])+
  theme_eem()+
  labs(title = "Do Mexico and U.S. agree in U.N. votes?",
       x = "Year", y = "(%)")
g

Mexico and the US agree less on UN votes

So the tendency has been to disagree more under these presidents. Off course, this could be due to a number of quirky data issues. Among them, the amount of different votes taken to the General Assembly (in orange)…

g +
  geom_line(aes(x = year, y = VoteCount), colour = eem_colors[2])

Votes by year where Mexico and USA voted in UN

Now, it might seem strange so much disagreement, so let’s see if this rate is small or large in the context of everyone else. I’m going to loop through every country, to see Mexico’s (historic) agreement with each one…

# I found making a function to be easier for the rest
# of the post... 
agree_world_with <- function(db, 
                             country_pivot){
v <- NULL
for(i in 1:length(unique(db$country))){
country <- unique(db$country)[i]
p <- un_agree(db = votes, 
         country1 = country_pivot, 
         country2 = unique(db$country)[i])
d <- data.frame("country" = country, "p" = p)
v <- rbind.data.frame(v, d)}
  return(v)
}

# Now for the fun part... 
# which countries agree most with Mexico?
agree_world_with(votes, "Mexico") %>% 
  arrange(desc(p)) %>%
  filter(country != "Mexico") %>% # obviously p=100
  head()
#                country        p
#1           Timor-Leste 95.82192
#2            Seychelles 94.46378
#3 Sao Tome and Principe 93.73695
#4         Guinea-Bissau 92.48287
#5              Zimbabwe 92.37548
#6              Suriname 92.37288

# which countries agree less with Mexico?
agree_world_with(votes, "Mexico") %>% 
  arrange(desc(p)) %>%
  filter(country != "Mexico") %>%
  tail()
#                            country        p
#194                Marshall Islands 35.27607
#195 Micronesia, Federated States of 27.76163
#196                          Israel 25.96885
#197                   United States 23.32385
#198                           Palau 20.79327
#199                        Zanzibar  0.00000

For the record, I tried doing the same exercise for each “sexenio” and basically came up with the same number of countries on top, maybe we’re not so close to the U.S. after all?

What about abstentions? You would think Mexico’s historical no-intervention foreign policy would make it a cronical abstainer, but actually even the United States and France use this trick more often…

# count abstentions by country
abstentions <- votes %>% 
  mutate("abstain" = ifelse(as.character(vote) == "abstain", 1, 0)) %>%
  group_by(country) %>% 
  summarise("prct_abstentions" = sum(abstain)/n_distinct(rcid)) %>%
  arrange(desc(prct_abstentions))
abstentions[1:30, ] %>% as.data.frame
#                           country prct_abstentions
#1                         Zanzibar        1.0000000
#2      Federal Republic of Germany        0.5183636
#3                           France        0.4210017
#4                            Tonga        0.4038710
#5                      South Sudan        0.3958333
#6                            Japan        0.3929402
#7                          Georgia        0.3845050
#8                            Italy        0.3822297
#9  Micronesia, Federated States of        0.3818046
#10                         Austria        0.3641872
#11                  United Kingdom        0.3614412
#12              Korea, Republic of        0.3612663
#13                         Belgium        0.3587247
#14                      Luxembourg        0.3495841
#15                        Portugal        0.3486631
#16                          Canada        0.3462857
#17                Marshall Islands        0.3426431
#18                     Netherlands        0.3395579
#19                         Ireland        0.3381340
#20                         Finland        0.3379368
#21                       Australia        0.3326978
#22            Moldova, Republic of        0.3320053
#23                          Sweden        0.3277905
#24                          Israel        0.3275574
#25                         Denmark        0.3267912
#26                          Norway        0.3253862
#27                         Iceland        0.3208144
#28                         Estonia        0.3169192
#29                          Latvia        0.3159236
#30                           Spain        0.3145144

# Mexico is actually at spot 122 with only 10% of its total votes!! 
abstentions[122, ]
#  1  Mexico        0.1094109

This dataset is actually really nice, we can make a small comparison of some foreign policy. For example NAFTA partners and their agreement on some issues related to Israel…

# only the Palestinian conflict
israelset <- votes %>% filter(issue == "Palestinian conflict")
nafta <- c("Mexico", "United States", "Canada")
agree_with_israel <- data.frame("country" = nafta, 
                                "agree" = c(
                                un_agree(israelset, nafta[1], "Israel"),
                                un_agree(israelset, nafta[2], "Israel"),
                                un_agree(israelset, nafta[3], "Israel")
                                ))
agree_with_israel
#        country     agree
#1        Mexico  5.156724
#2 United States 77.620968
#3        Canada 25.226131

I’m sure the kind readers at r-bloggers will come up with another useful analysis from this package. Maybe a map? Tweet me up!

To leave a comment for the author, please follow the link and comment on their blog: En El Margen - R-English.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)