eurasia.png

A Data-Driven Approach to Demonstrating the Application of Rimland Theory Via Cold War Arms Sales

Alex Todorovic


Introduction: History, Data, Geography, Motivation

The twentieth century was the most transformative hundred years in world history. States, empires, and kingdoms popped into and out of existence. The East and West pushed the globe within inches of mutually assured destruction. I could really just copy and paste the lyrics to Billy Joel's We Didn't Start the Fire to get the point across.

After World War II the United States and Soviet Union emerged as the sole superpowers consolidating territory with their own alliances, NATO and the Warsaw pact, respectively. NATO was created out of a necessity to contain Soviet expansion in Europe and other parts of the world. This conflict, more commonly known as the Cold War, saw the United States and the Soviet Union fight for control over dozens of countries in Europe, Asia, Africa, and even in the Americas. Proxy wars became a powerful tool - for example in Vietnam and Korea - where the U.S. and Soviet Union would incite conflict in other countries with the ultimate goal of expanding their influence usually through regime change. Regime change can occur with or without proxy war, but in the case of the Cold War it was typically a process of funding militant, separatist factions with the goal of toppling the government or triggering a coup.

I found an awesome dataset of arms transfers from 1950 all the way to 2014 with over twenty-four thousand observations, each including the buying and selling countries, the type of arms, the quantity, and the value. It's curated by SIPRI which has other very well-maintained datasets. The one I'm using here is the SIPRI Arms Transfer Database which has a really convenient trade register tool you can play around with if you want to explore the data. I was fortunate enough to stumble upon single a curl command that let me download the entire dataset. I've included this file in my github repository right here. My aim is to use this data set to explore, visualize, and showcase perhaps the greatest form of influence that superpowers took advantage of in the struggle between communism and liberal democracy: arms transfers.

The ultimate point of this, as the title suggests, is to evaluate Nicholas Spykman's Rimland Theory. Spykman was one of the father's of geopolitics who, in the early 20th century, challenged his predecessor's Heartland Theory. Heartland Theory, conceived by Halford Mackinder a bit prior to Spykman, argued that "Who controls eastern Europe rules the Heartland; Who controls the Heartland rules the World Island; and Who rules the World Island rules the World". Spykman countered: "Who controls the Rimland rules Eurasia; Who rules Eurasia controls the destinies of the world.” Looking at the image below helps make sense of these theories, and just to clarify, the World Island and Eurasia are are geographic equivalents in this case.

world.png

Why the Rimland?

Taking a quick look at the image above reveals several facts you may already know. The Indo-Pacific, Middle East, a bit of North Africa, and Europe are all in the Rimland. These regions contain the vast majority of the world's people, the major centers of trade, and natural resources such as oil. This last one is the most important. The infographic below illustrates the flow of oil throughout the world, a commodity the global economy is completely dependent on. Notice how the majority of significant oil chokepoints - Strait of Hormuz, Strait of Malacca, Suez Canal - are in the Rimland. Control of the Rimland implies control of the most important resources and geographies in the world.

oil.jpg

Goal

Given Spykman's hypothesis I want to show that the geopolitical stragies of NATO and the Warsaw Pact specifically implemented Rimland Theory in their sale of arms to foreign countries with the ultimate goal of gaining economic, military, and ideological authority over Rimland nations.


Data Preprocessing

In [323]:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pyplot import *
import seaborn as sns
plt.style.use('fivethirtyeight')
import warnings
warnings.filterwarnings('ignore')
In [324]:
!pip install plotly
Requirement already satisfied: plotly in /opt/conda/lib/python3.7/site-packages (4.3.0)
Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from plotly) (1.12.0)
Requirement already satisfied: retrying>=1.3.3 in /opt/conda/lib/python3.7/site-packages (from plotly) (1.3.3)
In [325]:
import plotly.express as px
import plotly.graph_objects as go

Reading in the Data

In [326]:
arms = pd.read_csv("sipri-by-seller-1950-2014.csv")
In [327]:
#let's drop unnecessary stuff
arms = arms.drop(columns=['term','onai','coprod','nrdel','nrdelai','delyears','status','delivery_year','odai'])
In [328]:
arms.head()
Out[328]:
id buyercode sellercode order_year ordered designation category desc buyer seller tivunit tivorder tivdel
0 55238.0 BF ALB 2011.0 12.0 M-43 120mm AR Mortar Burkina Faso Albania 0.020 0.240 0.240
1 3622.0 ANG ALG 1980.0 4.0 N-262 Fregate AC Transport aircraft Angola Algeria 1.500 6.000 6.000
2 11246.0 NIG ALG 1967.0 2.0 Il-28 AC Bomber aircraft Nigeria Algeria 2.880 5.760 5.760
3 3667.0 CON ANG 1979.0 1.0 Noratlas AC Transport aircraft Congo Angola 2.800 2.800 2.800
4 3684.0 GBI ANG 1980.0 1.0 Do-27 AC Light aircraft Guinea-Bissau Angola 0.048 0.048 0.048

We're left with 13 columuns, most of which are self explanatory. The last three starting with 'tiv' are based off of SIPRI's trend indicator value system. The SIPRI methodology explains how they measure this feature: "The TIV is based on the known unit production costs of a core set of weapons and is intended to represent the transfer of military resources rather than the financial value of the transfer. Weapons for which a production cost is not known are compared with core weapons based on: size and performance characteristics (weight, speed, range and payload); type of electronics, loading or unloading arrangements, engine, tracks or wheels, armament and materials." The TIV is in other words a proxy variable for the value of an arms deal. So in this table, the TIV variables mean:

  • tivunit: TIV of one unit of corresponding arm
  • tivorder: TIV of total order
  • tivdel: TIV of deal that was actually delivered
In [329]:
arms.shape
Out[329]:
(24078, 13)

Buyercode and Sellercode transformations to ISO - Alpha 3 standards

I'm using plotly to visualize arms deals on a world map and this library takes a specific standard of country codes to match the data to the territory on the map. The SIPRI dataset's country codes do not exactly match the plotly requirements, so I had to make sure all countries were being included by separating the SIPRI data and another file of these country codes into separate sets to see which countries were missing. In addition to this the SIPRI dataset includes countries that no longer exist, terrorist organizations, and revolutionary factions, so I had to decide how I was going to include these.

In [330]:
#csv of iso codes
codes = pd.read_csv("https://raw.githubusercontent.com/lukes/ISO-3166-Countries-with-Regional-Codes/master/all/all.csv")
codes = codes.drop(codes[codes.name == 'Antarctica'].index)

a = codes['name'].unique()
b = set(arms['seller'].unique()).union(set(arms['buyer'].unique())) #union of buyers and sellers
c = list(set(a)&set(b))
print("Number of unique country names: " + str(len(a)))
print("Number of unique buyers and sellers: " + str(len(b)))
print("Number of matches (intersection) between both sets: " + str(len(c)))
leftover = b.difference(c)
print("Leftover country names that need to be changed: " + str(len(leftover)) + "\n\n")
print(leftover)
Number of unique country names: 248
Number of unique buyers and sellers: 259
Number of matches (intersection) between both sets: 164
Leftover country names that need to be changed: 95


{nan, 'Unknown recipient(s)', 'Katanga', 'MNLF (Philippines)*', 'UAE', 'Taiwan', 'Northern Cyprus', 'ZAPU (Zimbabwe)*', 'MTA (Myanmar)*', 'Indonesia rebels*', 'Khmer Rouge (Cambodia)*', 'NTC (Libya)*', 'Brunei', 'South Yemen', 'FRELIMO (Portugal)*', 'SNA (Somalia)*', 'North Yemen', 'Lebanon Palestinian rebels*', 'South Korea', 'Libya HoR', 'Venezuela', 'Saint Vincent', 'South Vietnam', 'PAIGC (Portugal)*', 'Moldova', 'Yugoslavia', 'FMLN (El Salvador)*', 'NATO**', 'PLO (Israel)*', 'Micronesia', 'Soviet Union', 'LTTE (Sri Lanka)*', 'RPF (Rwanda)*', 'MPLA (Portugal)*', 'LF (Lebanon)*', 'EPLF (Ethiopia)*', 'Amal (Lebanon)*', 'Viet Cong (South Vietnam)*', 'Czechoslovakia', 'Laos', 'ELF (Ethiopia)*', 'OSCE**', 'PRC (Israel/Palestine)*', 'Bosnia-Herzegovina', 'East Germany (GDR)', 'United Kingdom', 'SPLA (Sudan)*', 'UNITA (Angola)*', 'African Union**', 'Hamas (Palestine)*', 'DR Congo', 'UIC (Somalia)*', 'Haiti rebels*', 'PKK (Turkey)*', 'FAN (Chad)*', 'Hezbollah (Lebanon)*', 'Tanzania', 'LRA (Uganda)*', 'Bolivia', 'Viet Minh (France)*', 'Cape Verde', 'NLA (Macedonia)*', 'ANC (South Africa)*', 'United Wa State (Myanmar)*', "Cote d'Ivoire", 'Syria rebels*', 'SLA (Lebanon)*', 'Unknown rebel group*', 'Mujahedin (Afghanistan)*', 'Provisional IRA (UK)*', 'Contras (Nicaragua)*', 'North Korea', 'Northern Alliance (Afghanistan)*', 'PIJ (Israel/Palestine)*', 'Ukraine Rebels*', 'Anti-Castro rebels (Cuba)*', 'Unknown supplier(s)', 'RUF (Sierra Leone)*', 'Russia', 'Armas (Guatemala)*', 'Palestine', 'Pathet Lao (Laos)*', 'Swaziland', 'Iran', 'Biafra', '(multiple sellers)', 'Syria', 'GUNT (Chad)*', 'Southern rebels (Yemen)*', 'Kosovo', 'Regional Security System**', 'FNLA (Angola)*', 'Macedonia', 'United Nations**', 'United States'}

Data Cleaning and Tidying

As we can see a lot of these are either countries that no longer exist, or terrorist or paramilitary groupsr. This is good as it gives us fewer observations to correct. Here are the ones just from glancing that we need to modify:

Tanzania, Macedonia, Moldova, Syria, Swaziland, Bosnia-Herzegovina, Iran, DR Congo, Micronesia, Cote d'Ivoire, Northern Cyprus, United Kingdom, North Korea, UAE, Palestine, United States, Bolivia, Cape Verde, Taiwan, South Korea,Russia,Venezuela,Laos .

Great, that's just about 20 countries - pretty manageable to do manually. In addition to this we have another problem. What do we do about countries like East Germany, Yugoslavia, Czechoslovakia, the Soviet Union, etc. that no longer exist? I've decided that for large countries like these I'd split them up into their individual constituents and map the values to all of them. So, for example, Yugoslavia would map to Serbia, Croatia, Bosnia, Macedonia, Montenegro, and Slovenia.

In [332]:
codes.head()
Out[332]:
name alpha-2 alpha-3 country-code iso_3166-2 region sub-region intermediate-region region-code sub-region-code intermediate-region-code
0 Afghanistan AF AFG 4 ISO 3166-2:AF Asia Southern Asia NaN 142.0 34.0 NaN
1 Åland Islands AX ALA 248 ISO 3166-2:AX Europe Northern Europe NaN 150.0 154.0 NaN
2 Albania AL ALB 8 ISO 3166-2:AL Europe Southern Europe NaN 150.0 39.0 NaN
3 Algeria DZ DZA 12 ISO 3166-2:DZ Africa Northern Africa NaN 2.0 15.0 NaN
4 American Samoa AS ASM 16 ISO 3166-2:AS Oceania Polynesia NaN 9.0 61.0 NaN

So what we want to do is change thename column in the codes dataframe so that it can match up with the buyer and seller columns in the arms dataframe.

In [333]:
#transform
codes['country'] = codes['name'] #duplicate name column to make indexing easier
codes = codes.set_index("name") #setting name column as index 
In [334]:
#europe
codes.at['Russian Federation', 'country'] = "Russia"
codes.at['Korea, Republic of','country'] = "South Korea"
codes.at['North Macedonia','country'] = "Macedonia"
codes.at['Bosnia and Herzegovina','country'] = "Bosnia-Herzegovina"
codes.at['United Kingdom of Great Britain and Northern Ireland','country'] = "United Kingdom"
codes.at['Moldova, Republic of','country'] = "Moldova"

#asia
codes.at['Syrian Arab Republic','country'] = "Syria"
codes.at['Korea (Democratic People\'s Republic of)','country'] = "North Korea"
codes.at['Syrian Arab Republic','country'] = "Syria"
codes.at['Taiwan, Province of China','country'] = "Taiwan"
codes.at['United Arab Emirates','country'] = "UAE"
codes.at['Palestine, State of','country'] = "Palestine"
codes.at['Lao People\'s Democratic Republic','country'] = "Laos"
codes.at['Iran (Islamic Republic of)','country'] = "Iran"
codes.at['Micronesia (Federated States of)','country'] = 'Micronesia'
codes.at['Cyprus','country'] = 'Northern Cyprus'

#americas
codes.at['United States of America','country'] = "United States"
codes.at['Venezuela (Bolivarian Republic of)','country'] = "Venezuela"
codes.at['Bolivia (Plurinational State of)','country'] = "Bolivia"

#africa
codes.at['Côte d\'Ivoire','country'] = 'Cote d\'Ivoire'
codes.at['Congo, Democratic Republic of the','country'] = 'DR Congo'
codes.at['Tanzania, United Republic of','country'] = 'Tanzania'
codes.at['Cabo Verde','country'] = 'Cape Verde'

codes = codes.set_index("country") #setting country column as index now with updates

Functions to make my life easier

Feel free to just scroll past these for now. I've defined them all in one contiguous bunch of cells to make the analysis that comes after a bit cleaner and easier to read. You can always scroll up to refer back as I make use of them in the analysis.

In [335]:
"""
Given two years and a list of two countries, produces stacked bar charts of those two countries arms sales by category
relative to the rest of the world.
"""
def seller_bars(year1,year2,countries):
    #countries = ["United States","Soviet Union","other"]
    fig, ax = subplots(figsize=(20,10))
    categories = ["AR", "AC", "AV", "MI", "EN", "SH", "OT", "AD", "GR", "NW", "SA"]
    N = 11
    ind = np.arange(N)    # the x locations for the groups
    width = 0.35       # the width of the bars: can also be len(x) sequence

    sales = []
    for i,country in enumerate(countries):
        add = []
        for i,c in enumerate(categories):
            if country != "other":
                add.append(arms.loc[(arms['category']==c) & (arms['order_year']>year1) & (arms['order_year']<year2) & (arms['seller']==country)].shape[0])
            else:
                add.append(arms.loc[(arms['category']==c) & (arms['order_year']>year1) & (arms['order_year']<year2) & (arms['seller']!=countries[0]) & (arms['seller']!=countries[2])].shape[0])

        sales.append(add)

    sales = np.array(sales)
    
    p1 = plt.bar(ind, np.array(sales[0]),width, bottom=sales[1]+sales[2])
    p2 = plt.bar(ind, np.array(sales[1]), width, bottom=sales[2])
    p3 = plt.bar(ind, np.array(sales[2]), width)

    plt.bar(ind, sales[0], width=0.6, label=countries[0],  bottom=sales[1]+sales[2],color='blue')
    plt.bar(ind, sales[1], width=0.6, label=countries[1],bottom=sales[2],color='red')
    plt.bar(ind, sales[2], width=0.6, label='Other Countries',color='orange')
    
    plt.ylabel('Scores')
    plt.title('Arms sales by category ' + str(year1) + "  -  " + str(year2))
    plt.xticks(ind, ('AR', 'AC', 'AV', 'MI', 'EN', 'SH', 'OT', 'AD', 'GR', 'NW', 'SA'))
    
    plt.legend([p1[0], p2[0],p3[0]], (countries[0], countries[1],'Other Countries'))

    plt.show()
In [336]:
"""
Given a dictionary where keys are country names, returns a dictionary of corresponding 3 letter country codes as keys.
"""
def encode(d):
    coded = {}
    for item in d.items():
        try:
            country = codes.loc[item[0],'alpha-3']
            coded[country] = item[1]
        except:
            if item[0] == 'Yugoslavia':
                coded[codes.loc["Serbia",'alpha-3']] = item[1]
                coded[codes.loc["Croatia",'alpha-3']] = item[1]
                coded[codes.loc["Macedonia",'alpha-3']] = item[1]
                coded[codes.loc["Slovenia",'alpha-3']] = item[1]
                coded[codes.loc["Montenegro",'alpha-3']] = item[1]
                coded[codes.loc["Bosnia-Herzegovina",'alpha-3']] = item[1]
            elif item[0] == 'Soviet Union':
                coded[codes.loc["Russia",'alpha-3']] = item[1]
            elif item[0] == 'Czechoslovakia':
                coded[codes.loc["Czechia",'alpha-3']] = item[1]
                coded[codes.loc["Slovakia",'alpha-3']] = item[1]
            elif item[0] == "East Germany (GDR)":
                coded[codes.loc["Germany",'alpha-3']] = item[1]
            elif item[0] == "South Vietnam" or item[0] == "Viet Cong (South Vietnam)*":
                coded[codes.loc["Viet Nam",'alpha-3']] = item[1]
            else:
                pass
    return coded

Functions to Explore Bloc Power

In [337]:
"""
Given two years, produces choropleth of arms sales TIV with NATO countries as sellers throughout this period
"""
def nato_tiv(year1,year2):
    nato = ["United States","Canada","France","Germany","United Kingdom","Italy","Netherlands","Denmark","Greece",
            "Iceland","Norway","Sweden", "Portugal","Turkey"]
    
    #appending observations where seller is a nato country
    cw = pd.DataFrame()
    for x in nato:
        cw = cw.append(arms.loc[(arms.seller==x) & (arms.order_year > year1) & (arms.order_year < year2)])
    
    #encoding country codes
    buyers = dict()
    for buyer in cw.buyer.unique():
        tiv = cw.loc[cw.buyer==buyer]['tivdel'].sum()
        buyers[buyer] = tiv
    buyers_coded = encode(buyers)
    type(buyers_coded)

    #plotly visualization
    fig = go.Figure(
        data=go.Choropleth(
            locations = list(buyers_coded.keys()),
            z = list(buyers_coded.values()),
            colorscale = 'matter',
            autocolorscale=False,
            reversescale=False,
            marker_line_color='darkgray',
            marker_line_width=0.5,
            colorbar_title = 'TIV of Arms Transfers (MM)'
    ))


    fig.update_layout(
        title_text='Trend Indicator Value of NATO Biggest Arms Clients ' +str(year1+1) + " - " + str(year2-1),
        geo=dict(
            showframe=False,
            showcoastlines=True,
            projection_type='equirectangular'
        )
    )

    fig.show()
In [338]:
"""
Given two years, produces choropleth of arms sales TIV with Warsaw countries as sellers throughout this period
"""
def warsaw_tiv(year1,year2):
    warsaw = ["Soviet Union","Albania","Bulgaria","Romania","Hungary","Czechoslovakia","Poland","East Germany (GDR)"]
    
    #appending observations where seller is a warsaw pact country
    cw = pd.DataFrame()
    for x in warsaw:
        cw = cw.append(arms.loc[(arms.seller==x) & (arms.order_year > year1) & (arms.order_year < year2)])
    
    #encoding country codes
    buyers = dict()
    for buyer in cw.buyer.unique():
        tiv = cw.loc[cw.buyer==buyer]['tivdel'].sum()
        buyers[buyer] = tiv
    buyers_coded = encode(buyers)
    type(buyers_coded)

    #plotly visualization
    fig = go.Figure(
        data=go.Choropleth(
            locations = list(buyers_coded.keys()),
            z = list(buyers_coded.values()),
            colorscale = 'matter',
            autocolorscale=False,
            reversescale=False,
            marker_line_color='darkgray',
            marker_line_width=0.5,
            colorbar_title = 'TIV of Arms Transfers (MM)'
    ))


    fig.update_layout(
        title_text='Trend Indicator Value of Warsaw Pact Biggest Arms Clients ' +str(year1+1) + " - " + str(year2-1),
        geo=dict(
            showframe=False,
            showcoastlines=True,
            projection_type='equirectangular'
        )
    )

    fig.show()
In [339]:
def map_deals(seller,every):
    buyers_map = {}
    if every:
        buyers = arms.loc[(arms.order_year > 1949) & (arms.order_year < 1992)]
        buyers_unique = buyers.buyer.unique()
        for x in buyers_unique:
            buyers_map[x] = buyers.loc[buyers.buyer==x].shape[0]
        title = 'Arms Clients 1950-1991'
    else:
        buyers = arms.loc[(arms.seller==seller) & (arms.order_year > 1949) & (arms.order_year < 1992)]
        buyers_unique = buyers.buyer.unique()
        for x in buyers_unique:
            buyers_map[x] = buyers.loc[buyers.buyer==x].shape[0]
        title = seller + ' Arms Clients 1950-1991'
    buyers_coded = encode(buyers_map)
    
    fig = go.Figure(
    data=go.Choropleth(
        locations = list(buyers_coded.keys()),
        z = list(buyers_coded.values()),
        colorscale = 'matter',
        autocolorscale=False,
        reversescale=False,
        marker_line_color='darkgray',
        marker_line_width=0.5,
        colorbar_title = 'Number of Deals '
    ))
    fig.update_layout(
        title_text=title,
        geo=dict(
            showframe=False,
            showcoastlines=True,
            projection_type='equirectangular'
        )
    )

    fig.show()
In [340]:
def map_tiv(seller,every):
    buyers_map = {}
    if every:
        buyers = arms.loc[(arms.order_year > 1949) & (arms.order_year < 1992)]
        buyers_unique = buyers.buyer.unique()
        for x in buyers_unique:
            buyers_map[x] = buyers.loc[buyers.buyer==x].tivdel.sum()
        title = 'Arms Clients 1950-1991'
    else:
        buyers = arms.loc[(arms.seller==seller) & (arms.order_year > 1949) & (arms.order_year < 1992)]
        buyers_unique = buyers.buyer.unique()
        for x in buyers_unique:
            buyers_map[x] = buyers.loc[buyers.buyer==x].tivdel.sum()
        title = seller + ' Arms Clients 1950-1991'
    buyers_coded = encode(buyers_map)
    
    fig = go.Figure(
    data=go.Choropleth(
        locations = list(buyers_coded.keys()),
        z = list(buyers_coded.values()),
        colorscale = 'matter',
        autocolorscale=False,
        reversescale=False,
        marker_line_color='darkgray',
        marker_line_width=0.5,
        colorbar_title = 'Trend Indicator Value (MM)'
    ))
    fig.update_layout(
        title_text=title,
        geo=dict(
            showframe=False,
            showcoastlines=True,
            projection_type='equirectangular'
        )
    )

    fig.show()

Exploratory Analysis

Let's see what were the most popular weapons categories

In [341]:
colors = ['blue','red','black','magenta','yellow','green','orange','purple','teal','grey','brown']

fig, ax = subplots(figsize=(20,10))
for i,x in enumerate(categories):
    arms.loc[(arms['order_year']>1949) & (arms.category==x)]['order_year'].groupby(arms.order_year).agg('count').plot(kind='line',ax=ax,c=colors[i])
plt.suptitle('Arms Deals by Category', x=0.5, y=0.95, ha='center', fontsize='xx-large')
#fig.text(0.5, 0.04, ha='center')
fig.text(0.04, 0.5, 'Arms Deals', va='center', rotation='vertical')
ax.legend(["Artillery", "Aircraft", "Armoured Vehicles", "Missiles", "Engines", "Ships", "Other",
           "Air Defence Systems", "Sensors/Radar", "Naval Weapons", "Satellites"])
Out[341]:
<matplotlib.legend.Legend at 0x7f0db0db9438>

Looking at this chart we see that aircraft were by far the most bought/sold military product in the second half of the twentieth century. However, since there are eleven categories, we don't really get a sense of proportion, so let's visualize each decade with a bar chart of these categories.

In [342]:
seller_bars(1950,1991,["United States","Soviet Union","other"])

Visualizing the deals by categories conveys the enormous extent of the United States' and Soviet Union's domination of the international arms trade

Which Buyers Had the Most Deals?

In [343]:
map_deals("",True)

This map simply shows arms transfer deals by country regardless of seller. We can clearly see that Rimland countries are the darkest shade in this map followed by South American and European countries.

Who Bought the Most by Value?

In [344]:
map_tiv("",True)

It's a very similar story in this map as the previous, except that the Rimaland is even more distinct from the rest of the world. This map shades countries based on the TIV of arms deals rather than just the deals, so this one is even more representative of trade volumes.

We again see that the darkest shades are in Rimland countries, namely Japan, China, India, Iran, Iraq, Egypt, Turkey, and Poland.

Breaking Down Arms Sales By Decade

Here I'm going to produce 8 maps to visualize and contextualize arms transfers from NATO and Warsaw Pact countries throughout the Cold War by decade to showcase where arms were flowing and why. I also include a brief summary of the decade after the maps to add context and showcase my point.

In [347]:
nato_tiv(1949,1960)
warsaw_tiv(1949,1960)

The 1950s

The 50s for the US and USSR, apart from the conflicts brieflty outlined below, were heavily focused on rebuilding from the devastation of WW2.

  • Marshall Plan and Germany: American assistance to rebuild, modernize, and enrich Western Europe, and primarily prevent the spread of Communism. Germany is the perfect example of this as American and Soviet money was pouring in to rebuild the ruins of the Third Reich and also compete against the opposing bloc through arms sales. Germany, until its reunification in 1989 was split into East and West Germany, creating one of the most violent and close-to-home geopolitical conflicts in the world. Germany, one of the most industrially powerful countries in the world was at the crux of the European containment effort.

  • Korean War: First proxy war between US and USSR where the Soviets backed China and North Korea and the US backed South Korea and started backing Japan and Taiwan. This was a critical conflict for both sides as it had the potential to either expand or shrink the influence of communism in one of the most critical regions of the Rimland, east Asia.

  • Suez Crisis: Israel, France, and the UK invade Egypt with goal of retaking the Suez Canal. The Suez, located in one of the most volatile regions of the Rimland, is the most important oil chokepoints linking the Mediterranean Sea to the Red Sea, Europe to the Middle East.

  • Coup in Iran: U.S. and U.K. backed coup which deposed the democratically elected prime minister of Iran and installed the Western friendly Shah as the primary source of political power. Iran's relations with the U.S. would of course become warmer after this.

In [348]:
nato_tiv(1959,1970)
warsaw_tiv(1959,1970)

The 1960s

This is the decade the Soviet Union truly became a world power rather than a regional one.

  • Vietnam War: Perhaps the greatest proxy war between the US and USSR where the Soviets funded communist insurgents in the North and America funded and notoriously fought alongside South Vietnam. Vietnam is a country of the South China Sea, basically the Carribean of the Indo-Pacific. Its massive coastline is a defining feature of its geography makes its stability critical in linking the Indian and Pacific oceans.

  • Six-Day War: War between Israel against Jordan, Syria, and Egypt. Zooming into the region you can see significant American arms sales to Israel and heavy Soviet sales to Egypt and Syria. Again, as mentioned, the Arab-Israeli conflict always had a great deal of geopolitical significance, but in some cases was more ideologically motivated.

  • Cuban Missile Crisis: Strategic sale of arms, primarily missiles, to Cuba with the goal of demoralizing/scaring the American administration and public. One of the most intense conflicts of the Cold War, where Soviet nukes were 90 miles away from U.S. mainland. Served as a great tactic to distract the U.S. from other internation conflicts.

  • Africa: 32 countries gain independence.

In [349]:
nato_tiv(1969,1980)
warsaw_tiv(1969,1980)

The 1970s

Following the end of the economic booms that came after WW2 many countries and regions experienced radical shocks to their economies with 1973 oil crisis causing stagflation in numerous developed countries.

  • Vietnam War: Continued until 1975.

  • Soviet-Afghan War: Another proxy war. Soviet Union invaded Afghanistan in 1979 to stage a coup. The US backed the Mujahideen (which Bin Laden was a part of at the time)

  • Libya: Gaddafi's socialist Libya, enriched by its recent independence and oil boom, bought massive amounts of arms from both NATO countries and the Soviet Union during the 70s. Libya was always a critical part of North Africa given its access to the Mediterranean, Sahara, and borders with Egypt, Tunisia, and Algeria.

  • Iranian Revolution: Iran was NATO's biggest client in this period, but that would change with the 1979 Iranian Revolution which transformed the country into a Muslim fundamentalist state, thus ending its almost thirty year relationship with the West. This would start the process of making Saudi Arabia America's greatest ally in the Middle East.

In [350]:
nato_tiv(1979,1992)
warsaw_tiv(1979,1992)

The 1980s and the Fall of the Soviet Union

Reagan's hawkish foreign policy increased aggression on America's part in funding NATO members and other Soviet enemies as well as demanding changes from the Soviet Union. The Middle East was a particularly volatile region throughout the 80s as Islam's regional and global influence grew significantly and wars over oil rich regions proliferated. In Europe, the reunification of Germany, the fall of the Soviet Union, and the dissolution of Yugoslavia were cataclysmic geopolitical shifts that ultimately saw the West expand its influence through institutions such as NATO and the EU. Some former Warsaw Pact countries would in fact later become NATO members.

  • Iran-Iraq War: 8 year war between Iran and Iraq fought over a critical, oil rich Iranian region. One of the most significant contributors to the oil that passes through the Strait of Hormuz.

  • Soviet-Afghan War: Continued from previous decade and ended in 1989.

  • Fall of Soviet Union: The economic decay and eventual collapse of the Soviet Union in the early 90s can be seen in the second map as arms sales significantly drop off relative to the previous two decades. Funding to India and Iraq, however continues with strong figures. This was by far the most significant event of the decade and forever changed the face of geopolitics for both NATO and Russia. Former Soviet states and Warsaw Pact members such as Estonia, Latvia, Estonia, Romania, Bulgaria, Poland, Hungary, Czechia, and Slovakia eventually joined the EU and/or NATO, all but fulfilling the function of NATO.

  • Fall of Yugoslavia: The dissolution of Yugoslavia was another geopolitical crisis that gave the West a huge advantage over the Soviet Union and Russia. Croatia, Slovenia, and Montenegro joined soon after and plans are in place to accept Macedonia and Bosnia.

  • Fall of the Berlin Wall: The reunification of Germany was a lethal blow to the already crumbling Warsaw Pact as Europe was finally able to complete the accession of its soon to be economic powerhouse.

In [352]:
fig, ax = subplots(figsize=(20,10))
arms.loc[arms.seller=="United States"].groupby(arms.order_year).tivdel.sum().plot(kind='line',ax=ax)
arms.loc[arms.seller=="Soviet Union"].groupby(arms.order_year).tivdel.sum().plot(kind='line',ax=ax)
plt.suptitle('TIV of Arms Deals Throughout Cold War', x=0.5, y=0.95, ha='center', fontsize='xx-large')
#fig.text(0.5, 0.04, ha='center')
fig.text(0.03, 0.5, 'TIV (MM)', va='center', rotation='vertical')
ax.legend(["United States", "Soviet Union"])
Out[352]:
<matplotlib.legend.Legend at 0x7f0db0727a20>

The United States and Soviet Union, for the most part, were on equal par in terms of TIV of arms sales throughout the Cold War. So we can't really say that the U.S. just outspent the Russians. Rather, it was a matter of how they spent it.

In [353]:
usa_buy = {}
usa = arms.loc[(arms.seller=="United States")&(arms.order_year<1992)]
for buyer in usa.buyer.unique():
    usa_buy[buyer] = usa.loc[arms.buyer==buyer].tivdel.sum()
usa_sorted = sorted(usa_buy.items(), key=lambda x: x[1], reverse=True)


ussr_buy = {}
ussr = arms.loc[(arms.seller=="Soviet Union")&(arms.order_year<1992)]
for buyer in ussr.buyer.unique():
    ussr_buy[buyer] = ussr.loc[arms.buyer==buyer].tivdel.sum()
ussr_sorted = sorted(ussr_buy.items(), key=lambda x: x[1], reverse=True)
In [354]:
usa = pd.DataFrame(usa_sorted,columns=['country','tiv'])
usa.tiv.sum()
Out[354]:
482686.34979999997
In [355]:
ussr = pd.DataFrame(ussr_sorted,columns=['country','tiv'])
ussr.tiv.sum()
Out[355]:
453352.014

We can see here the U.S. only spent about $3 billion more than the Soviet Union, certainly not enough to win a Cold War. However, if we look at who they really spent the money on, the picture becomes clearer.

In [356]:
usa.head(20)
Out[356]:
country tiv
0 Japan 54034.2360
1 Germany 40007.7400
2 South Korea 28350.5240
3 Israel 26047.8120
4 Iran 25177.2300
5 Turkey 23204.5158
6 Canada 21544.4940
7 Taiwan 21344.9610
8 United Kingdom 21102.6480
9 Saudi Arabia 18855.7800
10 Italy 18480.8620
11 Netherlands 16433.1360
12 Egypt 14680.8180
13 Greece 13444.1524
14 Spain 13393.6418
15 France 13244.1460
16 Australia 11888.8200
17 Belgium 10036.9300
18 South Vietnam 6717.4720
19 Norway 6419.4300

Who, in 1945, would have thought that Japan and Germany would be our two biggest arms clients of the remainder of the century? We see that those two, in addition to South Korea, Israel, Iran, Turkey, Taiwan, Saudi Arabia, Egypt, Greece, Vietnam, and other Western allies were the United State's biggest clients over the Cold War. These are all countries located in geopolitically critical territories that have and will continue to hold massive influence over the flow of trade, money, and information.

In [358]:
ussr.head(20)
Out[358]:
country tiv
0 India 41956.180
1 Poland 37251.120
2 Syria 34464.734
3 China 32811.486
4 Iraq 31576.020
5 East Germany (GDR) 30194.940
6 Czechoslovakia 29344.120
7 Libya 23290.060
8 Egypt 22754.000
9 Bulgaria 18971.060
10 North Korea 18302.598
11 Viet Nam 16419.250
12 Romania 13768.930
13 Algeria 13698.386
14 Yugoslavia 12798.170
15 Afghanistan 12274.660
16 Cuba 11691.470
17 Hungary 11591.570
18 Angola 6000.056
19 Ethiopia 4883.872

The only geopolitically consequential countries in this list are India, Iraq, Syria, China, East Germany, Egypt, North Korea, Viet Nam, Yugoslavia, and Cuba. Out of all of these countries, Egypt, Libya, and Iraq are the only countries with significant oil reserves. Other than that, Egypt is the only country with a critical oil chokepoint (Suez Canal) and the rest were either in the Soviet's regional sphere of influence or Africa.

Conclusion

The Rimland is still the most geopolitically volatile (and important) region in the world, very much for the same reasons as it was in the previous century - resources. Arms transfers are one of the most powerful tools used by states to advance their foreign policy interests and this is evidenced by the countless proxy wars, coups, revolutions, terrorist factions, and paramilitary groups supported by the U.S. and Soviet military industrial complexes.

We see from the decade maps that NATO countries invested significantly more aggresively in Rimland countries relative to their Soviet counterparts. This was especially true for Middle Eastern countries such as Egypt, Iraq, and Iran as well as Indo-Pacific ones such as India, Japan, and South Korea. Campaigns in Africa and the Americas were useful to both Blocs in distracting or diverting the other from the Rimland. However, it was NATO’s powerful influence in the Middle East and the Indo-Pacific that not only maintained and increased the economic advantage that eventually triggered the dissolution of the Soviet Union, but gave the West a head-start in 21st century Asia versus the rest of the world.

Alex Todorovic, December 8, 2019