Economic sanctions have become commonplace in today’s world. According to the Council on Foreign Relations, “For many policymakers, economic sanctions have become the tool of choice to respond to major geopolitical challenges such as terrorism and conflict” (Masters, 2019). Governments impose economic sanctions on countries in an effort to alter those countries’ behaviors, but there are many critics who argue that economic sanctions are ineffective (Gilsinan, 2019). Studying the impact of economic sanctions is difficult, because so many factors go into them and into the economic results they may or may not have caused (Bêlín, Hanousek, 2020, 1-2). Nonetheless, and with full awareness that I will likely be unable to come up with anything approaching a definitive conclusion, I believe it would be interesting to look at economic indicators in the Russian Federation and the approval rating of Russia’s president, Vladimir Putin, in the wake of economic sanctions.
The United States and its European allies have imposed economic sanctions on Russia several times since 2014, when Russia took advantage of political instability in Ukraine to provide covert military support to those in the Crimean Peninsula seeking independence from Ukraine. (Crimea has a Russian-speaking majority population and was a part of Russia from 1783 until 1954, when the Soviet government transferred it from the Russian Soviet republic to the Ukrainian Soviet republic.) (Crimea Profile.).
Initially, these sanctions targeted specific Russian citizens and entities, but from mid-2014 they were expanded to become “sectoral sanctions.” These were broader restrictions designed to curtail trade in military technology and equipment for the oil and natural gas industry. In response to the Western sanctions, in August 2014, the Russian Federation introduced so-called “counter-sanctions,” which restricted imports of foodstuffs from the EU, US, and their allies (Bêlín and Hanousek, 2020, p. 3.)
Using only World Bank, World Development Indicators data and opinion poll data from the Levada Center, it is possible to explore (at a basic level) whether economic indicators or approval ratings were impacted by the imposition of sanctions in 2014. (Or, more accurately, whether there is a correlation between the imposition of economic sanctions and changes in economic indicators and Putin’s approval.)
A useful look at all of the sanctions the United States and European Union (EU) have placed on Russia since 2014: A Timeline Of All Russia-Related Sanctions.
The most obvious question to explore when looking at economic sanctions is whether or not there is a detectable relationship between economic performance and sanctions imposition.
## load the libraries required for this analysis/visualization
library(tidyverse)
library(ggthemes)
library(RColorBrewer)
library(plotly)
setwd("~/Desktop/DATA 110/Final Project")
In order to explore these questions, I have downloaded, translated, and converted from “wide” to “long” format data from the Levada Center (popularity) and the World Bank (russiadata).
# Read the csv files into a dataframe
popularity <- read_csv("PutinApprovalLevada_long.csv")
russiadata <- read_csv("russia_data_long.csv")
# Examine the structure of the data
head(popularity)
## # A tibble: 6 x 3
## X1 date percent
## <chr> <chr> <dbl>
## 1 Approve Aug-99 31
## 2 Disapprove Aug-99 33
## 3 No Answer Aug-99 37
## 4 Approve Sep-99 53
## 5 Disapprove Sep-99 27
## 6 No Answer Sep-99 20
head(russiadata)
## # A tibble: 6 x 5
## `Country Name` `Country Code` `Series Name` year result
## <chr> <chr> <chr> <chr> <chr>
## 1 Russian Federat… RUS Adjusted net national incom… 1999 [… 54921412…
## 2 Russian Federat… RUS Adjusted net national incom… 1999 [… 3730.694…
## 3 Russian Federat… RUS Armed forces personnel (% o… 1999 [… 2.029616…
## 4 Russian Federat… RUS Birth rate, crude (per 1,00… 1999 [… 8.3
## 5 Russian Federat… RUS Central government debt, to… 1999 [… 100.7441…
## 6 Russian Federat… RUS Death rate, crude (per 1,00… 1999 [… 14.6
str(popularity)
## tibble [762 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ X1 : chr [1:762] "Approve" "Disapprove" "No Answer" "Approve" ...
## $ date : chr [1:762] "Aug-99" "Aug-99" "Aug-99" "Sep-99" ...
## $ percent: num [1:762] 31 33 37 53 27 20 65 20 15 80 ...
## - attr(*, "spec")=
## .. cols(
## .. X1 = col_character(),
## .. date = col_character(),
## .. percent = col_double()
## .. )
str(russiadata)
## tibble [616 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Country Name: chr [1:616] "Russian Federation" "Russian Federation" "Russian Federation" "Russian Federation" ...
## $ Country Code: chr [1:616] "RUS" "RUS" "RUS" "RUS" ...
## $ Series Name : chr [1:616] "Adjusted net national income (constant 2010 US$)" "Adjusted net national income per capita (constant 2010 US$)" "Armed forces personnel (% of total labor force)" "Birth rate, crude (per 1,000 people)" ...
## $ year : chr [1:616] "1999 [YR1999]" "1999 [YR1999]" "1999 [YR1999]" "1999 [YR1999]" ...
## $ result : chr [1:616] "549214125033.051" "3730.69437291947" "2.02961637689662" "8.3" ...
## - attr(*, "spec")=
## .. cols(
## .. `Country Name` = col_character(),
## .. `Country Code` = col_character(),
## .. `Series Name` = col_character(),
## .. year = col_character(),
## .. result = col_character()
## .. )
# convert dates in each dataframe from characters
library(zoo)
library(lubridate)
russiadata$year <- as.Date(paste(russiadata$year), '%Y')
rd2 <- russiadata %>%
mutate(year = format(year, "%Y"))
rd2
## # A tibble: 616 x 5
## `Country Name` `Country Code` `Series Name` year result
## <chr> <chr> <chr> <chr> <chr>
## 1 Russian Federat… RUS Adjusted net national income… 1999 54921412…
## 2 Russian Federat… RUS Adjusted net national income… 1999 3730.694…
## 3 Russian Federat… RUS Armed forces personnel (% of… 1999 2.029616…
## 4 Russian Federat… RUS Birth rate, crude (per 1,000… 1999 8.3
## 5 Russian Federat… RUS Central government debt, tot… 1999 100.7441…
## 6 Russian Federat… RUS Death rate, crude (per 1,000… 1999 14.6
## 7 Russian Federat… RUS Electric power consumption (… 1999 4998.825…
## 8 Russian Federat… RUS Employment to population rat… 1999 56.76599…
## 9 Russian Federat… RUS Exports of goods and service… 1999 22566666…
## 10 Russian Federat… RUS Foreign direct investment, n… 1999 -1061410…
## # … with 606 more rows
To understand what we are working with, we should re-examine the structure of the data.
str(rd2)
## tibble [616 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Country Name: chr [1:616] "Russian Federation" "Russian Federation" "Russian Federation" "Russian Federation" ...
## $ Country Code: chr [1:616] "RUS" "RUS" "RUS" "RUS" ...
## $ Series Name : chr [1:616] "Adjusted net national income (constant 2010 US$)" "Adjusted net national income per capita (constant 2010 US$)" "Armed forces personnel (% of total labor force)" "Birth rate, crude (per 1,000 people)" ...
## $ year : chr [1:616] "1999" "1999" "1999" "1999" ...
## $ result : chr [1:616] "549214125033.051" "3730.69437291947" "2.02961637689662" "8.3" ...
## - attr(*, "spec")=
## .. cols(
## .. `Country Name` = col_character(),
## .. `Country Code` = col_character(),
## .. `Series Name` = col_character(),
## .. year = col_character(),
## .. result = col_character()
## .. )
We are working with only one country, so we do not need the country code or name columns. We can remove them to make the data a little more manageable.
rd2$`Country Code`= NULL
rd2$`Country Name`= NULL
rd2 <- rd2 %>% rename("SeriesName" = "Series Name")
rd2$year <- as.numeric(rd2$year)
head(rd2)
## # A tibble: 6 x 3
## SeriesName year result
## <chr> <dbl> <chr>
## 1 Adjusted net national income (constant 2010 US$) 1999 549214125033.0…
## 2 Adjusted net national income per capita (constant 2010 … 1999 3730.694372919…
## 3 Armed forces personnel (% of total labor force) 1999 2.029616376896…
## 4 Birth rate, crude (per 1,000 people) 1999 8.3
## 5 Central government debt, total (% of GDP) 1999 100.7441377242…
## 6 Death rate, crude (per 1,000 people) 1999 14.6
Since we want to examine the impact of economic sanctions on Russia, it would be a good idea to examine several aspects of Russia’s economy. We should pull those out of this data and reorganize it for the data to be easier to work with.
# get names of all categories
unique(rd2$SeriesName)
## [1] "Adjusted net national income (constant 2010 US$)"
## [2] "Adjusted net national income per capita (constant 2010 US$)"
## [3] "Armed forces personnel (% of total labor force)"
## [4] "Birth rate, crude (per 1,000 people)"
## [5] "Central government debt, total (% of GDP)"
## [6] "Death rate, crude (per 1,000 people)"
## [7] "Electric power consumption (kWh per capita)"
## [8] "Employment to population ratio, 15+, total (%) (national estimate)"
## [9] "Exports of goods and services (constant 2010 US$)"
## [10] "Foreign direct investment, net (BoP, current US$)"
## [11] "GDP (constant 2010 US$)"
## [12] "GDP per capita (constant 2010 US$)"
## [13] "Imports of goods and services (constant 2010 US$)"
## [14] "Life expectancy at birth, total (years)"
## [15] "Life expectancy at birth, male (years)"
## [16] "Life expectancy at birth, female (years)"
## [17] "Military expenditure (% of GDP)"
## [18] "Population growth (annual %)"
## [19] "Population, total"
## [20] "Population, male"
## [21] "Population, female"
## [22] "Total alcohol consumption per capita (liters of pure alcohol, projected estimates, 15+ years of age)"
## [23] "Unemployment, total (% of total labor force) (national estimate)"
## [24] NA
# Pull each category into its own dataframe
employment <- rd2 %>% filter(SeriesName == "Employment to population ratio, 15+, total (%) (national estimate)")
electric <- rd2 %>% filter(SeriesName == "Electric power consumption (kWh per capita)")
birthrate <- rd2 %>% filter(SeriesName == "Birth rate, crude (per 1,000 people)")
deathrate <- rd2 %>% filter(SeriesName == "Death rate, crude (per 1,000 people)")
exports <- rd2 %>% filter(SeriesName == "Exports of goods and services (constant 2010 US$)")
fdi <- rd2 %>% filter(SeriesName == "Foreign direct investment, net (BoP, current US$)")
imports <- rd2 %>% filter(SeriesName == "Imports of goods and services (constant 2010 US$)")
lifeexpectancy <- rd2 %>% filter(SeriesName == "Life expectancy at birth, total (years)")
milExpend <- rd2 %>% filter(SeriesName == "Military expenditure (% of GDP)")
popGrowth <- rd2 %>% filter(SeriesName == "Population growth (annual %)")
popTotal <- rd2 %>% filter(SeriesName == "Population, total")
unemployment <- rd2 %>% filter(SeriesName == "Unemployment, total (% of total labor force) (national estimate)")
If this data were simply a year and a column indicating what it was, it would more easily combine with other categories into a single dataframe.
## Ask Camilo to help my figure out a for loop to clean the data and replace my tedious, repetitive code below
## Following two chunks (up to line 136) drafted by Camilo Velez Ramirez
#List of Data Frame names
names <- c('employment', 'electric', 'birthrate', 'deathrate', 'exports', 'fdi', 'imports', 'lifeexpectancy', 'milExpend', 'popGrowth', 'popTotal', 'unemployment')
#Ordered List of Desire Column Names
col_names <- c('employment_rate', 'electricity_use', 'birth_rate', 'death_rate', 'exports', 'FDI', 'imports', 'life_expectancy', 'military_as_percent_GDP', 'population_growth_percent', 'population', 'unemployment_percent')
for (i in 1:12){
#Assigns each element of 'names' as a variable name for the rest of the text after the comma.
# in other words, it does this: names[i] <- get(names[i]) %>% select().....
assign(names[i],get(names[i]) %>% select(year, result) %>% mutate(result=as.numeric(result)))
# Renaming the columns as data frame (tibble) proved to be extremely hard, I had to convert
#from tibble to list, change the name of the variable in the list, and then convert back to
# a tibble. Inefficient, but works.
mylist <- c(get(names[i]))
names(mylist)[2] <- col_names[i]
#Reassigning the list to the tibble names
assign(names[i], as_tibble(mylist))
}
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
# Combine them all in one data set for future analysis
alldata <- employment %>% inner_join(electric, by = "year") %>% inner_join(birthrate, by = "year") %>% inner_join(deathrate, by = "year") %>% inner_join(exports, by = "year") %>% inner_join(fdi, by = "year") %>% inner_join(imports, by = "year") %>% inner_join(lifeexpectancy, by = "year") %>% inner_join(milExpend, by = "year") %>% inner_join(popGrowth, by = "year") %>% inner_join(popTotal, by = "year") %>% inner_join(unemployment, by = "year")
A simple way to examine the economy is to look at Russia’s Gross Domestic Product (GDP). According to the IMF, “GDP is important because it gives information about the size of the economy and how an economy is performing. The growth rate of real GDP is often used as an indicator of the general health of the economy. In broad terms, an increase in real GDP is interpreted as a sign that the economy is doing well.” “Gross Domestic Product: An Economy’s All”, Tim Callen
# Identify series labels
rd2$year <- as.numeric(rd2$year)
rd2$result <- as.numeric(rd2$result)
## Warning: NAs introduced by coercion
By looking at the series labels in our Russia dataset, we see that we have two measurements of GDP (both in constant 2010 USD): GDP and GDP per capita. Plotting these two variables over time should give us an indication of GDP’s growth or lack of growth.
# Extract the GDP data
russiagdp <- rd2%>% filter(SeriesName == "GDP (constant 2010 US$)")
russiagdp$SeriesName = NULL
head(russiagdp)
## # A tibble: 6 x 2
## year result
## <dbl> <dbl>
## 1 1999 8.65e11
## 2 2000 9.52e11
## 3 2001 1.00e12
## 4 2002 1.05e12
## 5 2003 1.12e12
## 6 2004 1.20e12
# convert result to an int from a character
russiagdp$result <- as.numeric(russiagdp$result)
russiagdp <- russiagdp %>% mutate(gdp_billions = result/1000000000)
russiagdp$year <- as.numeric(russiagdp$year)
russiagdp
## # A tibble: 22 x 3
## year result gdp_billions
## <dbl> <dbl> <dbl>
## 1 1999 8.65e11 865.
## 2 2000 9.52e11 952.
## 3 2001 1.00e12 1000.
## 4 2002 1.05e12 1047.
## 5 2003 1.12e12 1124.
## 6 2004 1.20e12 1204.
## 7 2005 1.28e12 1282.
## 8 2006 1.39e12 1387.
## 9 2007 1.50e12 1504.
## 10 2008 1.58e12 1583.
## # … with 12 more rows
alldata <- inner_join(alldata, russiagdp, by = "year")
Now we can plot the GDP data.
ggplot(russiagdp, aes(x = year, y = gdp_billions)) +
geom_line(color = "blue")+
geom_vline(linetype = "dashed", xintercept = 2014)+
theme(axis.text.x = element_text(angle = 90))+
scale_x_continuous(breaks=russiagdp$year)+
labs(x = "Year", y = "GDP in Billions (2010 USD)", title = "Russian Annual GDP", caption = "Source: World Bank, World Development Indicators")+
annotate(geom="text", x = 2016, y = 1500, label = "First Sanctions")
We can see from this plot that Russian GDP increased steadily from 2000 (when Putin became president) to 2009 or so (there was a financial crisis in 2007-2008 and global recession) and then increased steadily again until 2014, when the war with Ukraine and economic sanctions began.
We can do the same thing with GDP per capita to see how that has changed.
russiagdppercap <- rd2%>% filter(SeriesName == "GDP per capita (constant 2010 US$)")
head(russiagdppercap)
## # A tibble: 6 x 3
## SeriesName year result
## <chr> <dbl> <dbl>
## 1 GDP per capita (constant 2010 US$) 1999 5876.
## 2 GDP per capita (constant 2010 US$) 2000 6491.
## 3 GDP per capita (constant 2010 US$) 2001 6851.
## 4 GDP per capita (constant 2010 US$) 2002 7206.
## 5 GDP per capita (constant 2010 US$) 2003 7767.
## 6 GDP per capita (constant 2010 US$) 2004 8360.
russiagdppercap$result <- as.numeric(russiagdppercap$result)
russiagdppercap$year <- as.numeric(russiagdppercap$year)
russiagdppercap
## # A tibble: 22 x 3
## SeriesName year result
## <chr> <dbl> <dbl>
## 1 GDP per capita (constant 2010 US$) 1999 5876.
## 2 GDP per capita (constant 2010 US$) 2000 6491.
## 3 GDP per capita (constant 2010 US$) 2001 6851.
## 4 GDP per capita (constant 2010 US$) 2002 7206.
## 5 GDP per capita (constant 2010 US$) 2003 7767.
## 6 GDP per capita (constant 2010 US$) 2004 8360.
## 7 GDP per capita (constant 2010 US$) 2005 8929.
## 8 GDP per capita (constant 2010 US$) 2006 9693.
## 9 GDP per capita (constant 2010 US$) 2007 10535.
## 10 GDP per capita (constant 2010 US$) 2008 11088.
## # … with 12 more rows
These numbers are smaller and more manageable (in the thousands vice billions), so we do not need to convert them beyond changing them to numeric.
ggplot(russiagdppercap, aes(x = year, y = result)) +
geom_line(color = "dark red")+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=russiagdppercap$year)+
theme(axis.text.x = element_text(angle = 90))+
labs(x = "Year", y = "GDP Per Capita in Thousands (2010 USD)", title = "Russian Annual GDP Per Capita", caption = "Source: World Bank, World Development Indicators")+
annotate(geom="text", x = 2016, y = 10000, label = "First Sanctions")
Not surprisingly, this plot looks very similar to the national GDP plot, though GDP per capita began to decline in 2013, not 2014.
Another measure of economic health is Gross National Income. According to the World Bank: “Adjusted net national income complements gross national income (GNI) in assessing economic progress (Hamilton and Ley 2010) by providing a broader measure of national income that accounts for the depletion of natural resources. Adjusted net national income is calculated by subtracting from GNI a charge for the consumption of fixed capital (a calculation that yields net national income) and for the depletion of natural resources. The deduction for the depletion of natural resources, which covers net forest depletion, energy depletion, and mineral depletion, reflects the decline in asset values associated with the extraction and harvesting of natural resources. This is analogous to depreciation of fixed assets.” World Bank, Data Bank, Metadata Glossary
We can also plot this measure to see how it changed over time in Russia.
# Break out net national income and make numbers more reasonable
russiaNNI <- rd2 %>% filter(SeriesName == "Adjusted net national income (constant 2010 US$)")
russiaNNI <- russiaNNI %>% mutate(NNI_billions = result/1000000000)
# Plot net national income over time
ggplot(russiaNNI, aes(x = year, y = NNI_billions)) +
geom_line(color = "blue")+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=russiaNNI$year)+
theme(axis.text.x = element_text(angle = 90))+
labs(x = "Year", y = "Russia Net National Income (Billions 2010 USD)", title = "Russian Annual Adjusted Net National Income", caption = "Source: World Bank, World Development Indicators")+
annotate(geom="text", x = 2016, y = 1100, label = "First Sanctions")
GDP and adjusted net national income both declined after the introduction of sanctions in 2014/2015. They all began to rebound in 2016 or 2017 however, despite the persistence of sanctions. That suggests either something other than sanctions hurt Russian GDP and income in 2015 or Russia’s economy adapted to sanctions.
Another way to examine the economic impact of sanctions would be by looking at foreign direct investment. Sanctions should have deterred foreign companies from investing in Russia.
# Plot FDI over time
ggplot(fdi, aes(x = year, y = FDI)) +
geom_line(color = "purple")+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=fdi$year)+
theme(axis.text.x = element_text(angle = 90))+
labs(x = "Year", y = "Net Investment in Russia (Billions current USD)", title = "Foreign Direct Investment in Russia", caption = "Source: World Bank, World Development Indicators")+
annotate(geom="text", x = 2016, y = -2e+10, label = "First Sanctions")
Net foreign investment in Russia began to drop in 2014, and fell below zero in mid-2015. It began to rebound, however, in 2016, achieving a positive value again in mid-2016, before dropping again in 2018.
The economic data indicate that something happened to Russia’s economy in 2014. Key economic indicators began to fall off in 2014, coinciding with the imposition of U.S. and EU economic sanctions. Causation is difficult to determine, however, because Russia responded to these sanctions with their own counter-sanctions, which may have had an impact on all of the indicators we examined. Other factors that may have had an impact on Russia’s economy include the ongoing war with Ukraine (a trading partner of Russia) and a change in global oil prices (Russia relies heavily on oil and gas sales for its economic health). (Ermakov, Dmitrieva, and Rubtsova, 2019).
As discussed in the introduction, a country imposes economic sanctions on another country in an attempt to modify that country’s behavior. Economic impact is not an end in itself. So how do we measure that changed behavior? The simplest way is to see what that country does. Russia has not invaded or annexed a neighbor since 2014 (though it has intervened militarily in the Syrian Civil War). In that regard, some observers undoubtedly consider economic sanctions a success. There are other ways to measure success, however, and in the case of Russia, that would include whether or not President Putin remains president or is forced to modify Russian activities. Indeed, the Russian Foreign Minister, Sergei Lavrov, accused the west of imposing sanctions simply to accomplish regime change (Weir, 2014).
If Lavrov’s assertion is true, the best way to judge the sanctions’ effectiveness would be to look at Putin’s popularity ratings. The most accurate source for assessments of Putin’s popularity is the Levada Center—an independent polling organization in Russia. They have taken monthly assessments of Putin’s approval/disapproval ratings since he took office as Prime Minister in 1999. I have downloaded, translated, and converted the data to long format so I can work with it in R. Now I need to ensure the dates are legible.
annualpop <- popularity %>%
mutate(newdate = as.Date(as.yearmon(date, "%b-%y"))) %>%
mutate(year = as.numeric(format(newdate, "%Y")))
After checking the data to make certain I can still use it, I will plot the approval, disapproval, and no-response scores. There are mutiple points in each year because Levada takes monthly polls.
# Check the structure of the annual pop dataset to make sure it is what we want
str(annualpop)
## tibble [762 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ X1 : chr [1:762] "Approve" "Disapprove" "No Answer" "Approve" ...
## $ date : chr [1:762] "Aug-99" "Aug-99" "Aug-99" "Sep-99" ...
## $ percent: num [1:762] 31 33 37 53 27 20 65 20 15 80 ...
## $ newdate: Date[1:762], format: "1999-08-01" "1999-08-01" ...
## $ year : num [1:762] 1999 1999 1999 1999 1999 ...
## - attr(*, "spec")=
## .. cols(
## .. X1 = col_character(),
## .. date = col_character(),
## .. percent = col_double()
## .. )
head(annualpop)
## # A tibble: 6 x 5
## X1 date percent newdate year
## <chr> <chr> <dbl> <date> <dbl>
## 1 Approve Aug-99 31 1999-08-01 1999
## 2 Disapprove Aug-99 33 1999-08-01 1999
## 3 No Answer Aug-99 37 1999-08-01 1999
## 4 Approve Sep-99 53 1999-09-01 1999
## 5 Disapprove Sep-99 27 1999-09-01 1999
## 6 No Answer Sep-99 20 1999-09-01 1999
# Plot the data from the annualpop dataset
ggplot(annualpop)+
geom_point(aes(x = year, y = percent, color = X1))+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=annualpop$year)+
theme(axis.text.x = element_text(angle = 90))+
labs(x = "Year", y = "Percent of Respondents", title = "Putin's Approval/Disapproval Ratings", color = "Response Category", caption = "Source: Levada Center, https://www.levada.ru/indikatory/") +
scale_color_brewer(palette = "Set1")+
annotate(geom="text", x = 2017, y = 50, label = "First Sanctions")
I want to look in more detail at each of these categories. I will break them out into their own dataframes, and then draw line plots for each category.
In addition, for comparison with the World Bank data, it is necessary to modify the Levada data. The dates in these two datasets do not match because the World Bank data is annual, whereas the Levada polling data is monthly. To see how the data coincide, we can filter the data into three groups: approve, disapprove, and no answer. Then we can take the mean of each of those groups’ scores for each year. That will enable us to give a one-to-one comparison between annual popularity scores and economic performance.
# break-out approval and disapproval
approval <- annualpop %>% filter(X1 == "Approve")
disapproval <- annualpop %>% filter(X1 == "Disapprove")
# Create a new dataset with a mean percent for each year
approval <- approval %>% rename(response = X1)
disapproval <- disapproval %>% rename(response = X1)
approval <- approval %>% group_by(year) %>% summarize(avg = mean(percent))
## `summarise()` ungrouping output (override with `.groups` argument)
approval
## # A tibble: 22 x 2
## year avg
## <dbl> <dbl>
## 1 1999 61.6
## 2 2000 70.2
## 3 2001 73.3
## 4 2002 75.9
## 5 2003 76.1
## 6 2004 74.2
## 7 2005 68.8
## 8 2006 75.9
## 9 2007 81.8
## 10 2008 84
## # … with 12 more rows
disapproval <- disapproval %>% group_by(year)%>% summarize(avg = mean(percent))
## `summarise()` ungrouping output (override with `.groups` argument)
disapproval
## # A tibble: 22 x 2
## year avg
## <dbl> <dbl>
## 1 1999 21
## 2 2000 20.6
## 3 2001 20.4
## 4 2002 19.6
## 5 2003 21.4
## 6 2004 23.5
## 7 2005 28.5
## 8 2006 22.4
## 9 2007 16.9
## 10 2008 13.5
## # … with 12 more rows
# Plot the results
plota <- ggplot(approval)+
geom_line(aes(x = year, y = avg), color = "dark green")+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=approval$year)+
theme(axis.text.x = element_text(angle = 90))+
labs(x = "Year", y = "Percent of Respondents", title = "Putin's Approval Rating", caption = "Source: Levada Center, https://www.levada.ru/indikatory/") +
annotate(geom="text", x = 2017, y = 50, label = "First Sanctions")
ggplotly(plota)
plotb <- ggplot(disapproval)+
geom_line(aes(x = year, y = avg), color = "red")+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=disapproval$year)+
theme(axis.text.x = element_text(angle = 90))+
labs(x = "Year", y = "Percent of Respondents", title = "Putin's Disapproval Rating", caption = "Source: Levada Center, https://www.levada.ru/indikatory/")+
annotate(geom="text", x = 2017, y = 50, label = "First Sanctions")
ggplotly(plotb)
Plot them together
# merge the grouped tables
ratings <- inner_join(approval, disapproval, by = "year")
ratings <- ratings %>% rename(approval = avg.x, disapproval = avg.y)
ratings
## # A tibble: 22 x 3
## year approval disapproval
## <dbl> <dbl> <dbl>
## 1 1999 61.6 21
## 2 2000 70.2 20.6
## 3 2001 73.3 20.4
## 4 2002 75.9 19.6
## 5 2003 76.1 21.4
## 6 2004 74.2 23.5
## 7 2005 68.8 28.5
## 8 2006 75.9 22.4
## 9 2007 81.8 16.9
## 10 2008 84 13.5
## # … with 12 more rows
# Plot the result
ratingsplot <- ggplot()+
geom_line(data = ratings, aes(x = year,y = approval, color = "green", text = approval))+
geom_line(data = ratings, aes(x = year,y = disapproval, color = "red", text = disapproval))+
geom_vline(linetype = "dashed", xintercept = 2014)+
scale_x_continuous(breaks=ratings$year)+
theme(axis.text.x = element_text(angle = 90))+
scale_color_identity(name = "Response",
breaks = c("green", "red"),
labels = c("Approve", "Disapprove"),
guide = "legend")+
labs(x = "Year", y = "Percent of Respondents", title = "Putin's Approval/Disapproval Ratings", caption = "Source: Levada Center, https://www.levada.ru/indikatory/")+
annotate(geom="text", x = 2017, y = 50, label = "First Sanctions")
## Warning: Ignoring unknown aesthetics: text
## Warning: Ignoring unknown aesthetics: text
ggplotly(ratingsplot, tooltip = "text")
Putin’s approval rating actually increased after 2014 and remained at or above 2014 levels until 2017. If economic sanctions were intended to destabilize Putin, they were not working. (At least as far as the Russian public was concerned. The general public approved of Putin’s policies. Note, this does not address the possibility that the sanctions targeted at important individuals were not intended to undermine Putin and that they actually did work. Russia is not a democracy (at least in the way the western world defines democracy), and Putin’s power likely does not depend solely on public support, but also on the support of a network of rich, powerful, and influential men around him—the men targetted in the initial sanctions.)
There are many and varied reasons for this, most of which are difficult to tackle with statistical analyses. Many believe the Putin regime succeeded in casting the Ukraine crisis and western sanctions as an assault by foreigners on Russia. In addition, Putin’s regime used immense amounts of propaganda to increase Russian patriotism and nationalism, and successfully cast the Russian operation as an effort to save a Russian-speaking population that was being persecuted by the Ukrainian government. Finally, many Russians may in fact believe “Crimea is ours” (as a popular saying in Russia today asserts). Soviet Premier Nikita Khrushchev “gave” Crimea to Ukraine when Russia and Ukraine were still part of a single country. It was never truly meant to be separate from Russia is a commonplace expression in Russia today. (Tipaldou and Casula, 2019; Ermakov, Romashova, and Dmitrieva, 116.)
Despite Putin’s continued popularity in the immediate wake of the Ukraine sanctions, it is worthwhile to explore a possible overall relationship between approval of Putin and Russian economic indicators. In order to see what impact gross economic factors had on Putin’s popularity, we can add this data to our World Bank GDP data, and plot them together.
# inner_join gdp with ratings
gdp_approval <- inner_join(ratings, russiagdp, key = "year")
## Joining, by = "year"
gdp_approval
## # A tibble: 22 x 5
## year approval disapproval result gdp_billions
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1999 61.6 21 8.65e11 865.
## 2 2000 70.2 20.6 9.52e11 952.
## 3 2001 73.3 20.4 1.00e12 1000.
## 4 2002 75.9 19.6 1.05e12 1047.
## 5 2003 76.1 21.4 1.12e12 1124.
## 6 2004 74.2 23.5 1.20e12 1204.
## 7 2005 68.8 28.5 1.28e12 1282.
## 8 2006 75.9 22.4 1.39e12 1387.
## 9 2007 81.8 16.9 1.50e12 1504.
## 10 2008 84 13.5 1.58e12 1583.
## # … with 12 more rows
# Plot all three lines together
library(latticeExtra)
## Loading required package: lattice
##
## Attaching package: 'latticeExtra'
## The following object is masked from 'package:ggplot2':
##
## layer
# Make separate plots for each series
obj1 <-
xyplot(approval~year, gdp_approval, type = "l" , lwd=2)
obj2 <-
xyplot(gdp_billions~year, gdp_approval, type = "l", lwd=2)
# Make the plot with second y axis:
update(doubleYScale(obj1, obj2, text = c("Approval", "GDP")),
par.settings = simpleTheme(col = c('red','black'), lty = 1:2))
For much of the early 2000s (Putin’s first two terms as president were from 2000-2008), GDP grew. Putin’s approval took a hit in 2005, but then resumed growth until 2009 (the global financial crisis).
I find the 2005 data odd, so will quickly explore the annualpop data (before I took the mean) to see if there are numbers that may have caused an anomalous result.
# narrow the data to the time period I'm curious about
narrowpop <- annualpop %>% filter(year > 2004 & year < 2008)
# find if there are any missing values
sum(is.na(narrowpop))
## [1] 0
#find the minimum value
min(narrowpop$percent)
## [1] 1
# find where that odd minimum is located
filter(narrowpop, narrowpop$percent == 1)
## # A tibble: 16 x 5
## X1 date percent newdate year
## <chr> <chr> <dbl> <date> <dbl>
## 1 No Answer Nov-05 1 2005-11-01 2005
## 2 No Answer Apr-06 1 2006-04-01 2006
## 3 No Answer May-06 1 2006-05-01 2006
## 4 No Answer Aug-06 1 2006-08-01 2006
## 5 No Answer Oct-06 1 2006-10-01 2006
## 6 No Answer Dec-06 1 2006-12-01 2006
## 7 No Answer Jan-07 1 2007-01-01 2007
## 8 No Answer Feb-07 1 2007-02-01 2007
## 9 No Answer Mar-07 1 2007-03-01 2007
## 10 No Answer Apr-07 1 2007-04-01 2007
## 11 No Answer Jun-07 1 2007-06-01 2007
## 12 No Answer Jul-07 1 2007-07-01 2007
## 13 No Answer Aug-07 1 2007-08-01 2007
## 14 No Answer Sep-07 1 2007-09-01 2007
## 15 No Answer Nov-07 1 2007-11-01 2007
## 16 No Answer Dec-07 1 2007-12-01 2007
Those low percentages are not unexpected because they are in the “No Answer” category. Instead of continuing to play with the data, I will do some research to determine if the 68% or so approval rating is a problem with my data.
According to various reports, Putin’s popularity did indeed decline in 2005, after he introduced social spending reforms in January of that year. “Is Putin’s popularity real?”, Timothy Frye, Scott Gehlbach, Kyle L. Marquardt and Ora John Reuter, Post Soviet Affairs, 2017, vol 33. My data reflects this trend.
Returning to the plot of GDP versus popularity, we can see that with the exception of the drop in GDP around the 2008 financial crisis and coincident drop in Putin’s popularity, popularity and GDP do not appear to be correlated. This is especially true after 2015, when GDP took only a slight drop, but recovered. Putin’s popularity has continued to decline.
Is there a correlation between approval and GDP?
cor(gdp_approval$approval, gdp_approval$gdp_billions)
## [1] NA
The NA results indicates that one of our measurements is NA.
sum(is.na(gdp_approval$gdp_billions))
## [1] 1
sum(is.na(gdp_approval$approval))
## [1] 0
is.na(gdp_approval$gdp_billions)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
gdp_approval
## # A tibble: 22 x 5
## year approval disapproval result gdp_billions
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1999 61.6 21 8.65e11 865.
## 2 2000 70.2 20.6 9.52e11 952.
## 3 2001 73.3 20.4 1.00e12 1000.
## 4 2002 75.9 19.6 1.05e12 1047.
## 5 2003 76.1 21.4 1.12e12 1124.
## 6 2004 74.2 23.5 1.20e12 1204.
## 7 2005 68.8 28.5 1.28e12 1282.
## 8 2006 75.9 22.4 1.39e12 1387.
## 9 2007 81.8 16.9 1.50e12 1504.
## 10 2008 84 13.5 1.58e12 1583.
## # … with 12 more rows
There is one NA in the GDP column, for the year 2020. I will remove it to check for an overall correlation.
gdp_approval <- na.omit(gdp_approval)
sum(is.na(gdp_approval$gdp_billions))
## [1] 0
Now I can check for the correlation.
cor(gdp_approval$approval, gdp_approval$gdp_billions)
## [1] 0.2847213
This is a very low correlation, which indicates that there is very little relationship between GDP and approval if we are measuring a linear relationship. To see if this is a linear relationship, I will graph a quick scatterplot of their relationship.
gdp1 <- gdp_approval %>% ggplot(aes( x = gdp_billions, y = approval, color = year))+
ylab("Putin's Approval Rating") +
xlab("Russian GDP in Billions") +
theme_minimal(base_size = 12)+
geom_point()+
geom_smooth(method = "lm")+
labs(title = "Russian GDP vs. Putin's Approval")
ggplotly(gdp1)
## `geom_smooth()` using formula 'y ~ x'
Including a linear regression line allows us to see that there are quite a few points that seem far away from our predicted line (if it were a linear relationship). Plotting the residuals will give us a better idea if a linear regression curve is a good predictor for the relationship between these variables.
First I will fit the linear regression model to the data, then I will plot the resulting residuals.
fit1 <- lm(approval~gdp_billions, data = gdp_approval)
summary(fit1)
##
## Call:
## lm(formula = approval ~ gdp_billions, data = gdp_approval)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.940 -4.900 1.636 4.974 9.456
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 64.756414 7.827397 8.273 1.01e-07 ***
## gdp_billions 0.006940 0.005361 1.295 0.211
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.957 on 19 degrees of freedom
## Multiple R-squared: 0.08107, Adjusted R-squared: 0.0327
## F-statistic: 1.676 on 1 and 19 DF, p-value: 0.211
This model has an extremely low Adjusted R-squared, which indicates the model explains only about 3% of the variation in the observations. (According to the equation produced by this model, Putin’s popularity = .0069*gdp_billions + 64.75. In other words, his popularity increases only 6.9 points for every 1000 billion dollar increase in his country’s GDP.)
That conclusion still assumes the relationship is linear, however. Plotting the residuals will clarify whether this is a valid assumption.
par(mfrow = c(2, 2)) # Split the plotting panel into a 2 x 2 grid
plot(fit1) # Plot the model information
If the model fits the data well, the residual versus fitted plot should show the residuals random scattered around zero. This data seems to be slightly curved, especially in the higher range values of the model. The model is fairly good until it reaches that higher range. The Normal Q-Q plot shows that our data is roughly normally distributed around the center of its range, but it varies more at the upper and lower ends of the distribution. The Scale-Location plot shows that the model works well in the lower range, but again, it skews upward in the higher range, indicating the residuals are becoming less equally-well-spaced. Finally, the Residuals vs Leverage plot appears to show (it’s hard to see in the range between 0.5 and 0.10) that there are no high-leverage points. All points appear to be within the Cook’s distance bounds.
The residual plots indicate that a linear model is appropriate for analyzing the relationship between GDP and approval. However, the model shows there is no significant correlation between the two variables.
While there is no significant correlation between GDP value and Putin’s popularity, it is worthwhile to see if there is a correlation between GDP growth rate and Putin’s popularity. To do this, I have downloaded additional data from the World Bank’s DataBank.
# Import and examine the data
gdprate <- read_csv("russiagdprate.csv")
## Parsed with column specification:
## cols(
## .default = col_double(),
## `Country Name` = col_character(),
## `Country Code` = col_character(),
## `Series Name` = col_character(),
## `Series Code` = col_character(),
## `2020 [YR2020]` = col_character()
## )
## See spec(...) for full column specifications.
head(gdprate)
## # A tibble: 6 x 26
## `Country Name` `Country Code` `Series Name` `Series Code` `1999 [YR1999]`
## <chr> <chr> <chr> <chr> <dbl>
## 1 Russian Feder… RUS GDP growth (… NY.GDP.MKTP.… 6.40
## 2 <NA> <NA> <NA> <NA> NA
## 3 <NA> <NA> <NA> <NA> NA
## 4 <NA> <NA> <NA> <NA> NA
## 5 Data from dat… <NA> <NA> <NA> NA
## 6 Last Updated:… <NA> <NA> <NA> NA
## # … with 21 more variables: `2000 [YR2000]` <dbl>, `2001 [YR2001]` <dbl>, `2002
## # [YR2002]` <dbl>, `2003 [YR2003]` <dbl>, `2004 [YR2004]` <dbl>, `2005
## # [YR2005]` <dbl>, `2006 [YR2006]` <dbl>, `2007 [YR2007]` <dbl>, `2008
## # [YR2008]` <dbl>, `2009 [YR2009]` <dbl>, `2010 [YR2010]` <dbl>, `2011
## # [YR2011]` <dbl>, `2012 [YR2012]` <dbl>, `2013 [YR2013]` <dbl>, `2014
## # [YR2014]` <dbl>, `2015 [YR2015]` <dbl>, `2016 [YR2016]` <dbl>, `2017
## # [YR2017]` <dbl>, `2018 [YR2018]` <dbl>, `2019 [YR2019]` <dbl>, `2020
## # [YR2020]` <chr>
# Remove excess columns
gdprate$`Country Code`=NULL
gdprate$`Series Code`=NULL
gdprate$`Series Name`=NULL
gdprate$`Country Name`=NULL
# Convert data from wide format to long format
gdprate_long <- gather(gdprate, year, rate)
head(gdprate_long, 10)
## # A tibble: 10 x 2
## year rate
## <chr> <chr>
## 1 1999 [YR1999] 6.39991468983681
## 2 1999 [YR1999] <NA>
## 3 1999 [YR1999] <NA>
## 4 1999 [YR1999] <NA>
## 5 1999 [YR1999] <NA>
## 6 1999 [YR1999] <NA>
## 7 2000 [YR2000] 10.0000668157438
## 8 2000 [YR2000] <NA>
## 9 2000 [YR2000] <NA>
## 10 2000 [YR2000] <NA>
# Remove excess entries (the ones with NAs)
gdprate_long <- na.omit(gdprate_long)
head(gdprate_long, 10)
## # A tibble: 10 x 2
## year rate
## <chr> <chr>
## 1 1999 [YR1999] 6.39991468983681
## 2 2000 [YR2000] 10.0000668157438
## 3 2001 [YR2001] 5.10005122514625
## 4 2002 [YR2002] 4.69999190886614
## 5 2003 [YR2003] 7.29995234455738
## 6 2004 [YR2004] 7.19994786981049
## 7 2005 [YR2005] 6.39996544796642
## 8 2006 [YR2006] 8.20006825495364
## 9 2007 [YR2007] 8.4999777684714
## 10 2008 [YR2008] 5.19996926508013
# Clean year column and convert both to numbers
gdprate_long$year <- as.Date(paste(gdprate_long$year), '%Y')
gdprateclean <- gdprate_long %>%
mutate(year = format(year, "%Y"))
gdprateclean
## # A tibble: 22 x 2
## year rate
## <chr> <chr>
## 1 1999 6.39991468983681
## 2 2000 10.0000668157438
## 3 2001 5.10005122514625
## 4 2002 4.69999190886614
## 5 2003 7.29995234455738
## 6 2004 7.19994786981049
## 7 2005 6.39996544796642
## 8 2006 8.20006825495364
## 9 2007 8.4999777684714
## 10 2008 5.19996926508013
## # … with 12 more rows
gdprateclean$year <- as.numeric(gdprateclean$year)
gdprateclean$rate <- as.numeric(gdprateclean$rate)
## Warning: NAs introduced by coercion
gdprateclean
## # A tibble: 22 x 2
## year rate
## <dbl> <dbl>
## 1 1999 6.40
## 2 2000 10.0
## 3 2001 5.10
## 4 2002 4.70
## 5 2003 7.30
## 6 2004 7.20
## 7 2005 6.40
## 8 2006 8.20
## 9 2007 8.50
## 10 2008 5.20
## # … with 12 more rows
# combine the Putin approval table with the gdp rate table
# inner_join gdp rate with ratings
rate_approval <- inner_join(ratings, gdprateclean, key = "year")
## Joining, by = "year"
rate_approval
## # A tibble: 22 x 4
## year approval disapproval rate
## <dbl> <dbl> <dbl> <dbl>
## 1 1999 61.6 21 6.40
## 2 2000 70.2 20.6 10.0
## 3 2001 73.3 20.4 5.10
## 4 2002 75.9 19.6 4.70
## 5 2003 76.1 21.4 7.30
## 6 2004 74.2 23.5 7.20
## 7 2005 68.8 28.5 6.40
## 8 2006 75.9 22.4 8.20
## 9 2007 81.8 16.9 8.50
## 10 2008 84 13.5 5.20
## # … with 12 more rows
# Make seperate plots for each series
obj3 <-
xyplot(approval~year, rate_approval, type = "l" , lwd=2)
obj4 <-
xyplot(rate~year, rate_approval, type = "l", lwd=2)
# Make the plot with second y axis:
update(doubleYScale(obj3, obj4, text = c("Putin's Approval", "GDP Growth Rate")),
par.settings = simpleTheme(col = c('red','black'), lty = 1:2))
This plot suggests greater correlation between GDP growth and shrinkage and Putin’s approval rating than between his approval rating and GDP. The axis on the right shows the growth or shrinkage on a scale of 10 percent to -5 percent. With few exceptions, when GDP shrank (the line is below zero), so did Putin’s approval rating. When GDP growth was positive, Putin’s approval grew. An exception is 2015, right after the United States and Europe announced sanctions against Russia. This suggests that there are other factors that affect Putin’s popularity other than economics.
To test our impression that GDP growth rate correlates more closely with Putin’s popularity, we can run another linear regression model.
cor(rate_approval$approval, rate_approval$rate, "complete.obs")
## [1] -0.2837225
fit2 <- lm(approval~rate, data = rate_approval)
summary(fit2)
##
## Call:
## lm(formula = approval ~ rate, data = rate_approval)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.226 -4.675 1.221 5.270 9.980
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 76.5949 2.1142 36.23 <2e-16 ***
## rate -0.4953 0.3840 -1.29 0.213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.959 on 19 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.0805, Adjusted R-squared: 0.0321
## F-statistic: 1.663 on 1 and 19 DF, p-value: 0.2126
Despite the impression that the plot gives, there is no evidence of a strong correlation between GDP growth rate and Putin’s approval rating. (There is a very weak negative correlation, and the adjusted R-squared indicates this is not a good model. It explains only 3 percent of the variables’ behaviors. In addition, the variable “rate” is not considered “statisically significant” according to its p-score.)
We can also run a regression plot as we did above.
par(mfrow = c(2, 2)) # Split the plotting panel into a 2 x 2 grid
plot(fit2) # Plot the model information
There are no clear patterns to the residuals, so our linear model is probably sufficient for fitting our data. The data is just not strongly correlated with those economic factors.
I downloaded additional demographic data from the World Bank to explore the possibility that other factors are correlated with Putin’s popularity. These factors, of course, only represent the measurable data. They do not include such things as public views of patriotism, foreigners, etc. It is worthwhile just to see if there are other models that could better explain changes in Putin’s popularity.
We can use a correlation plot to explore the pairwise relationship among several variables.
## create a linear model with a number of different variables
approval2 <- approval %>% rename(putin_approval_pct = avg)
alldata <- inner_join(alldata, approval2, by = "year")
fit2 <- lm(putin_approval_pct~employment_rate + birth_rate + death_rate + life_expectancy + FDI + exports + imports + population_growth_percent + unemployment_percent, data = alldata)
summary(fit2)
##
## Call:
## lm(formula = putin_approval_pct ~ employment_rate + birth_rate +
## death_rate + life_expectancy + FDI + exports + imports +
## population_growth_percent + unemployment_percent, data = alldata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.5777 -2.1623 0.6589 2.3648 7.6708
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.573e+02 6.938e+02 1.380 0.1977
## employment_rate -1.516e+00 1.811e+00 -0.837 0.4220
## birth_rate -1.251e+00 5.844e+00 -0.214 0.8348
## death_rate -5.267e+00 9.722e+00 -0.542 0.5999
## life_expectancy -9.832e+00 7.774e+00 -1.265 0.2347
## FDI -8.616e-11 1.472e-10 -0.586 0.5712
## exports 1.385e-10 9.611e-11 1.441 0.1802
## imports -1.392e-10 5.206e-11 -2.673 0.0234 *
## population_growth_percent 8.028e+01 5.465e+01 1.469 0.1726
## unemployment_percent -5.190e+00 2.935e+00 -1.769 0.1074
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.19 on 10 degrees of freedom
## (2 observations deleted due to missingness)
## Multiple R-squared: 0.59, Adjusted R-squared: 0.221
## F-statistic: 1.599 on 9 and 10 DF, p-value: 0.2373
There is only one variable in this model that might be considered statistically significant, and that is imports. Interestingly, imports is the category that was most affected by Russia’s counter-sanctions. This is pure conjecture, but it could show a relationship with Putin’s approval, because it represents the most direct relationship between Putin’s policy (ban certain imports) and the economic results (a decline in those imports).
As one final step, we can model and plot the relationship between imports and Putin’s approval rating.
fit3 <- lm(putin_approval_pct~imports, data = alldata)
summary(fit3)
##
## Call:
## lm(formula = putin_approval_pct ~ imports, data = alldata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.544 -5.412 1.391 5.717 10.800
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.245e+01 4.105e+00 17.649 3.05e-13 ***
## imports 8.153e-12 1.378e-11 0.592 0.561
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.192 on 19 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.01809, Adjusted R-squared: -0.03359
## F-statistic: 0.35 on 1 and 19 DF, p-value: 0.5611
Sadly for our theories, the adjusted R-squared is even lower now. The p-value is also above a statistically significant level. Together these suggest that import behavior does not explain Putin’s approval ratings. Frankly, approval ratings are probably not a good indicator of any sort of objective measure (like economic indicators) in an autocratic regime “Is Putin’s popularity real?”, Timothy Frye, Scott Gehlbach, Kyle L. Marquardt and Ora John Reuter, Post Soviet Affairs, 2017, vol 33..
Our examination of World Bank and Levada Center data can not definitively answer either of the questions we set out to look at: have the sanctions on Russia had an economic impact and have the economic sanctions hurt President Putin’s approval rating. We have established that Russia’s economy took a downturn following the imposition of sanctions, but that it rebounded later. We were not able to determine if the downturn was caused by (or even correlated with) the economic sanctions, or if other factors were more closely correlated with it. In addition, we determined that in the immediate aftermath of the sanctions, Putin’s approval rating increased. It is theoretically possible that the sanctions caused that increase, but we did not have the data to directly test that hypothesis. In the absence of that data, we attempted to establish a relationship between economic performance and Putin’s approval ratings. We failed to do so. There is no clear correlation between economic performance and Putin’s approval, raising questions about the utility of that measure in an autocratic country.
None of this is to say that it is impossible to determine the effectiveness of economic sanctions. Indeed, other authors have analyzed the targetted sanctions at a firm level, and have been able to draw conclusions (Ahn and Ludema, 2020). The World Development Indicators and Levada Center approval ratings are not sufficient to accomplish this.
The difficulty in measuring overall effectiveness, however, does fuel the arguments of many that sanctions have run their course (Crimmino, 2018). Perhaps it is time the United States and others looked for different tools to change the behavior of other countries.
Bibliography
Ahn, D. P., & Ludema, R. D. (2020). The sword and the shield: The economics of targeted sanctions [Article]. European Economic Review, 130. https://doi.org/10.1016/j.euroecorev.2020.103587
Bagheri, S., & Akbarpour, H. R. (2016). Reinvestigation of the West’s Sanctions against Russia in the Crisis of Ukraine and Russia’s Reaction [Article]. Procedia Economics and Finance, 36, 89-95. https://doi.org/10.1016/S2212-5671(16)30019-3
Bělín, M., & Hanousek, J. (2020). Which sanctions matter? analysis of the EU/russian sanctions of 2014 [Article]. Journal of Comparative Economics. https://doi.org/10.1016/j.jce.2020.07.001
Crimmino, R. (2018). PUTIN IN CRIMEA : Have Sanctions Run Their Course? [research-article]. Harvard International Review, 39(2), 16-18.
Eberstadt, N. (2018). A Statistical Glimpse at Russia’s Multiple Demographic and Human Resource Problems [Article]. South Central Review, 35(1), 147-174. https://doi.org/10.1353/scr.2018.0008
Frye, T., Scott Gehlbach, Kyle L. Marquardt and Ora John Reuter. (2017). Is Putin’s popularity real? Post-Soviet Affairs, 33(1), 1-15.
Gilsinan, K. (2019). “A Boom Time for U.S. Sanctions”. The Atlantic. Retrieved December 12, 2020, from https://www.theatlantic.com/politics/archive/2019/05/why-united-states-uses-sanctions-so-much/588625/
Gregory, P. (2018). A Reassessment of Putin’s Russia: The Economy [Article]. South Central Review, 35(1), 175-195. https://doi.org/10.1353/scr.2018.0009
Hufbauer, G. C., & Jung, E. (2020). What’s new in economic sanctions? [Article]. European Economic Review, 130. https://doi.org/10.1016/j.euroecorev.2020.103572
Weir, F. (2014, 11/28/). Ukraine crisis: West’s sanctions target Putin, not policy, Russia insists. http://search.ebscohost.com.montgomerycollege.idm.oclc.org/login.aspx?direct=true&db=edsgit&AN=edsgit.A391900610&site=eds-live&scope=site
Western sanctions are hitting Russia harder than anyone realised; IMF predicts Russia will lose 9pc of its GDP because of sanctions imposed amid the Ukraine crisis. (2015). http://search.ebscohost.com.montgomerycollege.idm.oclc.org/login.aspx?direct=true&db=edsgbc&AN=edsgcl.424216186&site=eds-live&scope=site
Ермаков, А. Р., Дмитриева, Н. Ю., & Рубцова, Е. М. (2019). Последствия деградации российско- украинских отношений для экономики России [Article]. The consequences of the degradation of Russian-Ukrainian relations on the Russian economy., 28(4), 52-61.
Ермаков, А. Р., Ромашова, И. Б., & Дмитриева, Н. Ю. (2019). Влияние «Крымских» санкций на экономику России и борьба за их отмену [Article]. Influence of sanctions on economy of Russia (due to Crimea’s unification with Russia) and struggle for their cancellation.(3), 116-127.