#!/usr/bin/env python # coding: utf-8 # # Problem set 3. Why is the 20th-century world so unequal? # # ## Do resources play an important role on a global scale in relative prosperity? # # These problem set assignments are a required part of the course. # # Collaborating on the problem sets 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' problem sets, 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 problem set, 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[1]: # 3.1.A.1. set up the computing environment: ensure that graphs # appear inline in the notebook & not in extra windows: get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: # 3.1.A.2. set up the computing environment: get the ok system library... from client.api.notebook import Notebook # ok = Notebook('ps02.ok') # In[3]: # 3.1.A.3 set up the computing environment: import other libraries import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt #   # # ### B. Reproduce the results of problem set 1 # # Recall our estimates of humanity's economy in the very long run from the last problem set. Let's repeat their construction: # # In[4]: # 3.1.B.1. repeating the work of problem set 1: 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('WORLD LEVELS') long_run_growth_df.style.format(format_dict) # In[5]: # 3.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('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 that I had you examine in problem set 1. 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[6]: # 3.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[7]: # 3.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[8]: # 3.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[9]: # 3.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('GLOBAL NORTH LEVELS') long_run_growth_global_north_df.style.format(format_dict) # Now construct the global-north growth-rates dataframe: # In[10]: # 3.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 analogous to those for the world as a whole that I had you examine in problem set 1. This set will be 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[11]: # 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 #3.2.A.2 above. Simply wherever you see the character string "north" replace it with "south", and then run the code cell: # In[12]: # 3.2.B.2. create global-south levels dataframe long_run_growth_global_south_df = ... # The cell you just wrote should then mesh perfectly with the next two cells to create and print the global-south levels dataframe: # In[13]: # 3.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[14]: # 3.2.B.4. add legend notes and 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('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 #3.2.A.5, once again simply by taking the code and replacing the character string "north" by "south every place that it appears: # In[16]: # 3.2.B.5. create global-south growth-rates dataframe data_list = np.array([span, n, g, h, rho]).transpose() long_run_growth_rates_global_south_df = ... # 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. # Now let us calculate the differences in growth rates in labor productivity, incomes, and living standards between the global north and the global south #   # # ### C. 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[17]: # 3.2.C.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) # Notice that in the table ine g = h + (rho - n)/2 above in each line # #   # # #### 1. Population # # Note that the population of the global north grows for two reasons: (1) the populations of economies already in it expand, 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. # #   # # #### 2. 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. # #   # # #### 3. 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 eras, 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. # #   # # #### 4. 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. #   # # #### 5. Questions: # # Now let me ask you some questions, that you can then do calculations to answer: # **5.a.** 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[ ]: # 3.2.C.5.a. income multiple in 1500 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) # **5.b.** What relative multiple of global-south average income and productivity do we guess global-north average income and productivity is today? # In[ ]: # 3.2.C.5.b. global-north income multiple today income_mult_2020 = ... print("The global north's relative income multiple today =", income_mult_2020) # **5.c.** 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[27]: # 3.2.C.5.c. income growth-rate difference since 1500? income_growth_rate_diff_1500_2020 = ... print("The difference in annual average income growth rates since 1500 =", income_growth_rate_diff_1500_2020) # **5.d.** How much greater has been the growth rate of the resources available to the global north than to the global south since 1500? # In[ ]: # 3.2.C.5.d. resource growth-rate difference since 1500? resource_growth_rate_diff_1500_2020 = ... print("The difference in annual average resource-availability growth rates since 1500 =", resource_growth_rate_diff_1500_2020) # **5.e.** 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.) # # 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 **5.c.**? # In[ ]: # 3.2.C.5.e. 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) # **5.f.** 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 that is the answer to **5.b**—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[ ]: # 3.2.C.5.f. resource-stability counterfactual; current global-north income multiple import numpy as np 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 for question **5.b**—the actual multiple of global north income today relative to global south—and an answer of 3.14 for question **5.f**—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. # # Thus for question 5.g: # # **5.g.** 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 5.g**: [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 problem set 2 assignment page. URL: # ## 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... #   # # 6. **Do** google your error messages: Ms. Google is your best friend here... #   # # 7. **Do not** confuse assignment ("=") and test for equality ("=="). In general, if there is an "if" anywhere nearby, you should be testing for equality. If there is not, you should be assignment a variable in your namespace to a value. **Do** curse the mathematicians 500 years ago who did not realize that in the twenty-first century it would be very convenient if we had different and not confusable symbols for equals-as-assignment and equals-as-test... #   # # ---- # #   # # **Thanks to**: Rachel Grossberg, Christopher Hench, Meghana Krishnakumer, Seth Lloyd, Ronald Walker... # ---- # #   # # ## Resources and Relative Prosperity on a Global Scale # # # # ### Catch Our Breath—Further Notes: # #
# # ---- # # # # # #   # # ----