Introduction and Background

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.)

Effectiveness of Economic Sanctions on Putin’s Russia

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.

Economic Impact of 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).

Putin’s Popularity

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.)

Exploring a Relationship between Economic Indicators and Putin’s Popularity

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.

Testing the correlation between approval and GDP

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.

Multiple Variable Linear Regression

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..

Conclusion

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

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.