Problem Set 4.1.5. How Important Are Resources in Generating Late 20th-Century Global Inequality?¶

Do resources play an important role on a global scale in relative prosperity?¶

These notebook assignments are a required part of the course.

Collaborating on the notebooks is more than okay—it is encouraged! Seek help from a classmate or an instructor or a roommate or a passerby when you get stuck! (Explaining things is beneficial, too—the best way to solidify your knowledge of a subject is to explain it.)

But the work should be your own.

No cutting-&-pasting from others' notebooks, please! We want you to learn this stuff, and your fingers typing every keystroke is an important way of building muscle memory here.

In this notebook, you will attempt to assess whether and how much engrossment of natural resources by the global north since the start of the commercial revolution era in 1500 has played an important role in the rise of global inequality.

Let us get started!

1. Preliminaries¶

A. Computing environment¶

First, we set up the computing environment with the libraries we need:

In [ ]:
# 4.1.5.1.A.1. set up the computing environment: standard library:

import numpy as np
import pandas as pd

In [ ]:
# 4.1.5.1.A.2. set up the computing environment: plotting library...

import matplotlib as mpl
import matplotlib.pyplot as plt

In [ ]:
# 4.1.5.1.A.3. set up the computing environment: plotting library inliine

%matplotlib inline


B. Our Picture of Global Economic History¶

First, set up our conception of global economic history:

In [ ]:
# 4.1.5.1.B.1. year, population, income, ideas
# for the world as a whole:

long_run_growth_list = [
[-68000, 0.1, 1200, 379.47],
[-8000, 2.5, 1200, 1897.37],
[-6000, 7, 900, 2381.18],
[-3000, 15, 900, 3485.68],
[-1000, 50, 900, 6363.96],
[1, 170, 900, 11734.56],
[1500, 500, 900, 20124.61],
[1770, 750, 1100, 30124.74],
[1870, 1300, 1300, 46872.1],
[2020, 7600, 11842, 1032370.8]
]

long_run_growth_df = pd.DataFrame(
data=np.array(long_run_growth_list), columns = ['year', 'population',
'income_level', 'human_ideas']
)

long_run_growth_df['year'] = long_run_growth_df['year'].apply(np.int64)

initial_year = long_run_growth_df['year'][0:10]

span = []
g = []
h = []
n = []

for t in range(9):
span = span + [long_run_growth_df['year'][t+1]-long_run_growth_df['year'][t]]
h = h + [np.log(long_run_growth_df['human_ideas'][t+1]/long_run_growth_df['human_ideas'][t])/span[t]]
g = g + [np.log(long_run_growth_df['income_level'][t+1]/long_run_growth_df['income_level'][t])/span[t]]
n = n + [np.log(long_run_growth_df['population'][t+1]/long_run_growth_df['population'][t])/span[t]]

long_run_growth_df.set_index('year', inplace=True)

# finally, add a note to the end of each observation, reminding
# us of what was going on in human history back in each of the
# eras into which we have divided it

eras = ['at the dawn', 'agriculture & herding', 'proto-agrarian age',
'writing', 'axial age', 'dark & middle age slowdown', 'commercial revolution',
'industrial revolution', 'modern economic growth', 'whatever the 21st century brings']

long_run_growth_df['eras'] = eras

format_dict = {'year': '{d}', 'human_ideas': '{0:,.0f}',
'income_level': '${0:,.0f}', 'population': '{0:,.1f}'} print('We now have our standard global economic history\neagle-eye view table in the computer:') print(' ') print('WORLD LEVELS') long_run_growth_df.style.format(format_dict)  And now let's again calculate numbers we have seen many times before—growth rates in the different ages separated by humanity's watershed-crossings: In [ ]: # 4.1.5.1.B.2. data_list = np.array([span, h, g, n]).transpose() long_run_growth_rates_df = pd.DataFrame( data=data_list, columns = ['span', 'n', 'g', 'h']) long_run_growth_rates_df['initial_year'] = initial_year eras2 = eras[0:9] long_run_growth_rates_df['era'] = eras2 format_dict = {'initial_year':'{0:.0f}', 'span': '{0:.0f}', 'h': '{0:,.3%}', 'g': '{0:,.2%}', 'n': '{0:,.2%}'} print('We now have growth rates for each age:') print(' ') print('WORLD GROWTH RATES') long_run_growth_rates_df.style.format(format_dict)  2. Global North & Global South¶ A. Global North¶ Now let me provide you with another set of data analogous to those for the world as a whole. This set will be for the "global north" or "west"—that part of the world that dominated the Americas starting in the 1500s and then became much richer and more powerful than the rest since the start of the 1700s—consisting of northwest Europe, and then by 1770 of that plus the Atlantic seaboard of the Americas, adding on Australia and New Zealand by 1870, and now including those areas plus southwest and some of central Europe, plus Japan, South Korea, and Taiwan. The data are: In [ ]: # 4.1.5.2.A.1. for the "global north" or "west": long_run_growth_list_global_north = [ [-68000, 0.00001, 1200, 379.47, 0.0001], [-8000, 0.1, 1200, 1897.37, 0.0294], [-6000, 0.2, 900, 2012.5, 0.0294], [-3000, 0.5, 900, 3182, 0.0294], [-1000, 2, 900, 6364.1, 0.0294], [1, 5, 900, 10062.5, 0.0294], [1500, 25, 1000, 25000.4, 0.0294], [1770, 75, 1400, 42866.8, 0.0588], [1870, 175, 2800, 106928.6, 0.0882], [2020, 800, 50000, 3580637.4, 0.1147] ]  Note that there is an extra column: it will be "resources"—the share of the world's resources that is occupied/owned/conquered/exploited by the global north. For the world as a whole, it always had 100% of the world's resources. But as the global north expands, and as it engrosses ownership of resources beyond its borders, its share of the world's resources rises. Then, with this list-of-lists, repeat what was done for the world as a whole by stuffing them into a dataframe, and doing the calculations of growth rates by era for the growth-rates dataframe: In [ ]: # 4.1.5.2.A.2. create global-north levels dataframe long_run_growth_global_north_df = pd.DataFrame( data=np.array(long_run_growth_list_global_north), columns = ['year', 'population', 'income_level', 'human_ideas', 'resources'] ) long_run_growth_global_north_df['year'] = long_run_growth_global_north_df['year'].apply(np.int64)  In [ ]: # 4.1.5.2.A.3. do calculations for the global-north growth-rates dataframe initial_year = long_run_growth_global_north_df['year'][0:10] span = [] g = [] h = [] n = [] rho = [] for t in range(9): span = span + [long_run_growth_global_north_df['year'][t+1]-long_run_growth_global_north_df['year'][t]] h = h + [np.log(long_run_growth_global_north_df['human_ideas'][t+1]/long_run_growth_global_north_df['human_ideas'][t])/span[t]] g = g + [np.log(long_run_growth_global_north_df['income_level'][t+1]/long_run_growth_global_north_df['income_level'][t])/span[t]] n = n + [np.log(long_run_growth_global_north_df['population'][t+1]/long_run_growth_global_north_df['population'][t])/span[t]] rho = rho + [np.log(long_run_growth_global_north_df['resources'][t+1]/long_run_growth_global_north_df['resources'][t])/span[t]] long_run_growth_global_north_df.set_index('year', inplace=True)  In [ ]: # 4.1.5.2.A.4. finally, add a note to the end of each observation, reminding # us of what was going on in human history back in each of the # eras into which we have divided it eras = ['at the dawn', 'agriculture & herding', 'proto-agrarian age', 'writing', 'axial age', 'dark & middle age slowdown', 'commercial revolution', 'industrial revolution', 'modern economic growth', 'whatever the 21st century brings'] long_run_growth_global_north_df['eras'] = eras format_dict = {'year': '{d}', 'human_ideas': '{0:,.0f}', 'income_level': '${0:,.0f}', 'population': '{0:,.1f}','resources': '{0:,.3f}'}

print('We now have an analogous dataframe table\nfor the "global north"')
print(' ')
print('GLOBAL NORTH LEVELS')
long_run_growth_global_north_df.style.format(format_dict)


Now construct the global-north growth-rates dataframe:

In [ ]:
# 4.1.5.2.A.5. create global-north growth-rates dataframe

data_list = np.array([span, h, g, n, rho]).transpose()

long_run_growth_rates_global_north_df = pd.DataFrame(
data=data_list, columns = ['span', 'h', 'g', 'n', 'rho'])

long_run_growth_rates_global_north_df['initial_year'] = initial_year

eras2 = eras[0:9]

long_run_growth_rates_global_north_df['era'] = eras2

format_dict = {'initial_year':'{0:.0f}',  'span': '{0:.0f}', 'h': '{0:,.3%}',
'g': '{0:,.2%}', 'n': '{0:,.2%}', 'n': '{0:,.2%}' , 'rho': '{0:,.3%}'}

print('GLOBAL NORTH GROWTH RATES')
long_run_growth_rates_global_north_df.style.format(format_dict)


B. Global South¶

Now let me provide you with yet a third set of data, this time for the "global south" or "non-west"—that part of the world that was outside the charmed circle. It consists at the start of everything outside northwest Europe. As of 1770 we subtract the Atlantic seaboard of the Americas, we substract Australia and New Zealand by 1870, and by now we have subtraced those areas plus southwest and some of central Europe, plus Japan, South Korea, and Taiwan:

In [ ]:
# 4.1.5.2.B.1. for the "global south" or "not-west":

long_run_growth_list_global_south = [
[-68000, 0.1, 1200, 379.47, 0.9999],
[-8000, 2.4, 1200, 1897.37, 0.971],
[-6000, 6.8, 900, 2395.3, 0.971],
[-3000, 14.5, 900, 3497.9, 0.971],
[-1000, 48, 900, 6364.1, 0.971],
[1, 165, 900, 11799.4, 0.971],
[1500, 475, 900, 20019.9, 0.971],
[1770, 675, 1070, 29386.7, 0.9412],
[1870, 1125, 1000, 36172.8, 0.9118],
[2020, 6800, 7700, 693805.9, 0.8853]
]


Now let's have you write a code cell to duplicate the work done in code cell # 4.1.5.2.A.2 above. Simply wherever you see the character string "north" replace it with "south", and then run the code cell:

In [ ]:
# 4.1.5.2.B.2. WORK FOR YOU TO DO HERE!: create global-south levels dataframe

# this cell should be almost the same as # 4.1.5.2.A.2., with "south"
# replacing "north"

# long_run_growth_global_south_df = ...
# long_run_growth_global_south_df['year'] = ...


The cell you just wrote should then mesh perfectly with the next two cells to create and print the global-south levels dataframe:

In [ ]:
# 4.1.5.2.B.3. do calculations for the global-south growth-rates
# dataframe

initial_year = long_run_growth_global_south_df['year'][0:10]

span = []
g = []
h = []
n = []
rho = []

for t in range(9):
span = span + [long_run_growth_global_south_df['year'][t+1]-long_run_growth_global_south_df['year'][t]]
h = h + [np.log(long_run_growth_global_south_df['human_ideas'][t+1]/long_run_growth_global_south_df['human_ideas'][t])/span[t]]
g = g + [np.log(long_run_growth_global_south_df['income_level'][t+1]/long_run_growth_global_south_df['income_level'][t])/span[t]]
n = n + [np.log(long_run_growth_global_south_df['population'][t+1]/long_run_growth_global_south_df['population'][t])/span[t]]
rho = rho + [np.log(long_run_growth_global_south_df['resources'][t+1]/long_run_growth_global_south_df['resources'][t])/span[t]]

long_run_growth_global_south_df.set_index('year', inplace=True)


In [ ]:
# 4.1.5.2.B.4. add legend notes & print the dataframe
#
# finally, add a note to the end of each observation, reminding
# us of what was going on in human history back in each of the
# eras into which we have divided it

eras = ['at the dawn', 'agriculture & herding', 'proto-agrarian age',
'writing', 'axial age', 'dark & middle age slowdown', 'commercial revolution',
'industrial revolution', 'modern economic growth', 'whatever the 21st century brings']

long_run_growth_global_south_df['eras'] = eras

format_dict = {'year': '{d}', 'human_ideas': '{0:,.0f}',
'income_level': '${0:,.0f}', 'population': '{0:,.1f}', 'resources': '{0:,.3f}'} print('And if everything went well you now have an\nanalogous "global south" table:') print(' ') print('GLOBAL SOUTH LEVELS') long_run_growth_global_south_df.style.format(format_dict)  Did it work? Everything should have run, and should have produced something like: If not, recheck your work. And if you are still stuck, call someone for help... Now construct the global-south growth-rates dataframe, duplicating what was in the above code cell # 4.1.5.2.A.5, once again simply by taking the code and replacing the character string "north" by "south" every place that it appears: In [ ]: # 4.1.5.2.B.5. WORK FOR YOU TO DO HERE!: create global-south growth-rates dataframe # this cell is analogous to # 4.1.5.2.A.5., with "south" # replacing "north" # ... print('GLOBAL SOUTH GROWTH RATES') long_run_growth_rates_global_south_df.style.format(format_dict)  And, once again, if things did not work and did not produce a table analogous to the "GLOBAL NORTH GROWTH RATES" table above, go back, try to figure out what went wrong. And correct your work. 3. North-South Comparisons¶ Now let us calculate the differences in growth rates in labor productivity, incomes, and living standards between the global north and the global south: In [ ]: # 4.1.5.3.1. "differences" dataframe g_north_south_diff = pd.DataFrame(long_run_growth_rates_global_north_df[['g', 'n', 'h', 'rho']] - long_run_growth_rates_global_south_df[['g', 'n', 'h', 'rho']]) g_north_south_diff['era'] = ['-68000 to -8000', '-8000 to -6000', '-8000 to -3000', '-3000 to -1000', '-1000 to 1', '1-1500', '1500-1770', '1770-1870', '1870-2020'] g_north_south_diff['span'] = long_run_growth_rates_global_north_df['span'] g_north_south_diff['initial_year'] = long_run_growth_rates_global_north_df['initial_year'] format_dict = {'initial_year':'{0:.0f}', 'span': '{0:.0f}', 'h': '{0:,.3%}', 'g': '{0:,.2%}', 'n': '{0:,.2%}', 'n': '{0:,.2%}' , 'rho': '{0:,.3%}'} print('GROWTH RATE NORTH-SOUTH DIFFERENCES') g_north_south_diff.style.format(format_dict)  A. Population¶ Note that the population of the global north grows for two reasons: (1) the populations of economies already in it expand in its own territories and then in other territories it conquers, occupies, and settles; and (2) new economies join it. In 1500 the civilization we now call the "global north" was pretty much restricted to the countries that touched or were just across the sea from what is now Belgium and Holland—and of what are now France and Germany, only northern France and nortwestern Germany counted. Now it encompasses all of western and most of central Europe, North America, and Asia's Pacific Rim plus Australia and New Zealand. B. Resources¶ Note that the natural resources controlled by the global north grew both because the global north expanded in area and becomes its citizens acquired—well, largely stole—resources outside of the global north, many of which global north citizens control to this day. C. Productivity¶ We first see the global north acquiring a (very small) edge in productivity, income per capita, and living standard growth over the period 1 to 1500. Northwest Europe in 1500 is an an up-phase of the Malthusian cycle: it lost 1/4 of its population to the Black Plague of 1346-8, and subsequent plagues kept its population from recovering, leaving it with a favorable land-labor ratio and a high level of labor productivity. It also had a small edge in technology: sails and guns and clocks, mostly. Then, after 1500, in the three subsequent Commercial Revolution, Industrial Revolution, and 20th-century Modern Economic Growth Ages, the global north's productivity and income edge surges: useful ideas are invented and deployed in the global north faster than they diffuse across the global south, resources are engrossed by the global north through settlement, expansion, conquest, theft, purchase, and investment. And, until the demographic transition to something close to zero population growth in the global north becomes well established, its population share of the world grows as well. D. Not in the Model¶ The numbers in the "differences" table above understate the magnitude of the true historical differences between the global north and south for three reasons not in the model that seem to me to be obvious, and perhaps for other non-obvious reasons as well. First, the global north did not just gain growth advantage from the workings of the global economy and its imperialism after 1500. It gained a current consumption advantage as well, for a component of production and income earned in the global south was transferred to the global north. Second, the model above has no place in it for the people killed, enslaved, and enserfed. Third, the model has no place in it for differences and changes in the terms-of-trade between global north and global south. Put broadly, The terms of trade of market exchange favored the global north from 1500 to 1770, then favored the global south from 1770 to 1860, then favored the global south as far as manufactured and the global north as far as resource products were concerned from 1860 to 1950, and, last, have favored the global north—with a very important exception of oil—since 1950. Plus imperialism and exploitation were profoundly uneven. They share of global south resources in Asia conquered by the global north was small. But if you happen to live on an island in the East Indies and the Portuguese or Dutch arrived, the likelihood was that they took everything that was not nailed down—and then exploited and diverted the income from a lot that was. E. Questions:¶ Now let me ask you some questions that you can then do calculations to answer: 1. Productivity Multiple—a Worked Example¶ What relative multiple of global-south average income and productivity do we guess global-north average income and productivity was in 1500? (To answer this question, reach back into your dataframes and do a calculation to pull out and then print the answer, like this: In [ ]: # 4.1.5.3.E.1. global-north income multiple in 1500: worked example # worked example: simply divide the income levels income_mult_1500 = (long_run_growth_global_north_df['income_level'][1500] / long_run_growth_global_south_df['income_level'][1500]) print("The global north's relative income multiple in 1500 =", income_mult_1500)  2. Income Multiple¶ What relative multiple of global-south average income and productivity do we estimate global-north average income and productivity is today? In [ ]: ## 4.1.5.3.E.2. WORK FOR YOU TO DO HERE!: global-north income multiple today # notice that this is simply # 3.2.C.5.a. but # with "2020" replacing "1500"; simply divide # the income levels # income_mult_2020 = ... print("The global north's relative income multiple today =", income_mult_2020)  3. Income Growth Multiple¶ How much greater has been the average annual growth rate in income and productivity in the global north than the global south since 1500? In [ ]: # 4.1.5.3.E.3. income growth-rate difference since 1500? # simply take a weighted average of growth rates over the # three periods 1500-1770, 1770-1870, 1870-2020 # income_growth_rate_diff_1500_2020 = ... print("The difference in annual average income growth rates since 1500 =", income_growth_rate_diff_1500_2020)  4. Growth Rate Differentials¶ How much greater has been the growth rate of the resources available to the global north than to the global south since 1500? And what have been the differences in population growth rates? And in ideas-stock growth rates? In [ ]: # 4.1.5.3.E.4. resource growth-rate difference since 1500? # notice that this is simply simply # 4.1.5.3.E.3. with # "rho" replacing "g"; simply take a weighted average # resource_growth_rate_diff_1500_2020 = ... print("The difference in annual average resource-availability growth rates since 1500 =", resource_growth_rate_diff_1500_2020)  In [ ]: # 4.1.5.3.E.4.a. n growth-rate difference since 1500? population_growth_rate_diff_1500_2020 = ... print("The difference in annual average population growth rates since 1500 =", population_growth_rate_diff_1500_2020)  In [ ]: # 4.1.5.3.E.4.b. h growth-rate difference since 1500? ideas_growth_rate_diff_1500_2020 = ... print("The difference in annual average ideas growth rates since 1500 =", ideas_growth_rate_diff_1500_2020)  5. Counterfactuals...¶ And now we get to the point of the whole exercise. Recall that our very crude growth framework assumes that ideas are twice as salient in boosting productivity and income than resources per capita are at retarding it—that while a 1% increase in the value of the ideas stock boosts income and productivity by 1%, other things being equal—ceteris paribus, if we drop into Latin, and cet. par. if we drop into Latin and abbreviate, as John Maynard Keynes's teachers back around 1900 were wont to do—an increase in resources per capita by 1% increased income and productivity by only 0.5%. (And, of course, this runs in reverse as well for resource scarcity per capita or for ideas lack depressing income and productivity.) In equations, the relationship between the rates of labor-efficiency growth g, ideas growth h, resource-stock growth ⍴, and population and labor-force growth n is:$ g = h + \frac{\rho - n}{2} \$

Suppose that the global north had not engrossed more of the world's resources since 1500—that the 850 million people in today's global north were still drawing on the 2.71% of the global resource base that northwest European civilization drew on back in 1500.

What does our model then say would be the difference in income and productivity growth rates between the global north and south since 1500—the number that you calculated (or should have calculated) as 0.00339 (that is, 0.34%/year)?

In [ ]:
# 4.1.5.3.E.5.  counterfactual stable-resources income differential growth rate since 1500

# resource_stability_counterfactual_income_growth_rate_diff_1500_2020 = ...

print("RESOURCE STABILITY COUNTERFACTUAL")
print("The difference in annual average income growth rates since 1500 would have been =",
resource_stability_counterfactual_income_growth_rate_diff_1500_2020)


6. Relative Productivity in the Counterfactual¶

Under that resource-stability counterfactual, what relative multiple of global-south average income and productivity do we guess about the analogue to the answer to the 6.49—what global-north average income and productivity as a multiple of global south would have been today, holding all variable in our model other than resource access and availability constant?

In [ ]:
# 4.1.5.3.E.6.  resource-stability counterfactual; current global-north income multiple

# resource_stability_counterfactual_income_diff_2020 = ...

print("RESOURCE STABILITY COUNTERFACTUAL")
print("Global north average income today as a multiple of global south would have been =",
resource_stability_counterfactual_income_diff_2020)


If all has gone well you got an answer of 6.49—the actual multiple of global north income today relative to global south—and an answer of 3.14 for question—what that multiple would have been had the 850 million people today in the global north not owned and controlled immense proportions of the world's resources outside global-north civilization's original northwest European homelands clustered around what are now Belgium and Holland.

Tell us, in the markdown cell immediately below, your thoughts as to the relevance or non-relevance of these two numbers—6.49 and 3.14—for what would be the "right" global political-economy order of resource ownership and control going forward into the 21st century. 500-1000 words, please. We are looking for you to set out what you think the best definition of "right" is here, why it is the best definition, whether these two numbers do or do not have a significant role to play in answering that question of the "right" order, and then how these two numbers play that role:

**ANSWER TO 7**: [500-1000 words of answer replace this text and go here...]

4. Done!¶

print your finished notebook to pdf, and upload it as an answer on the assignment page. URL: https://bcourses.berkeley.edu/courses/1500754/assignments/8251494

But, first, run this last summary code cell below, unchanged:

In [ ]:
# calculations summary

print("The global north's relative income multiple in 1500 =", income_mult_1500)
print("The global north's relative income multiple today =", income_mult_2020)
print("The difference in annual average income growth rates since 1500 =",
income_growth_rate_diff_1500_2020)
print("The difference in annual average resource-availability growth rates since 1500 =",
resource_growth_rate_diff_1500_2020)
print("The difference in annual average population growth rates since 1500 =",
population_growth_rate_diff_1500_2020)
print("The difference in annual average ideas growth rates since 1500 =",
ideas_growth_rate_diff_1500_2020)

print("The difference in annual average income growth rates since 1500 would have been =",
resource_stability_counterfactual_income_growth_rate_diff_1500_2020)
print("Global north average income today as a multiple of global south would have been =",
resource_stability_counterfactual_income_diff_2020)


5. Appendix Programming Dos and Don'ts...¶

A Running List...¶

1. Do restart your kernel and run cells up to your current working point every fifteen minutes or so. Yes, it takes a little time. But if you don't, sooner or later the machine's namespace will get confused, and then you will get confused about the state of the machine's namespace, and by assuming things about it that are false you will lose hours and hours...

2. Do reload the page when restarting the kernel does not seem to do the job...

3. Do edit code cells by copying them below your current version and then working on the copy: when you break everything in the current cell (as you will), you can then go back to the old cell and start fresh...

4. Do exercise agile development practices: if there is a line of code that you have not tested, test it. The best way to test is to ask the machine to echo back to you the thing you have just created in its namespace to make sure that it is what you want it to be. Only after you are certain that your namespace contains what you think it does should you write the next line of code. And then you should immediately test it...

5. Do take screenshots of your error messages...