Données pour reproduire l'estimation de MRW (QJE, 1992)



Je montre ici comment construire une base de données pour reproduire les estimations dans l'article de Mankiw, Romer et Weil (QJE, 1992) en extrayant les données reproduites dans le pdf de l'article.




Dans l'article « A Contribution to the Empirics of Economic Growth », Mankiw, Romer et Weil (1992) proposent plusieurs estimations du modèle de Solow et d'une version augmentée avec du capital humain. Dans cette note, je montre comment récupérer les données utilisées par ces trois auteurs et reproduites dans un tableau à la fin de l'article (pages 434 à 436) à l'aide d'un petit code en Python.

Nous utilisons deux librairies, qu'il faut éventuellement installer avec la commande pip, tabula-py qui permet d'extraire des tables de documents PDF et Pandas. Notez que tabula-py n'est qu'une enveloppe autour d'une librairie Java : il faut donc aussi disposer d'un environnement d'exécution Java (version 8 ou supérieure) accessible depuis le PATH, faute de quoi l'installation par pip réussira mais l'appel à tabula.read_pdf() échouera.

import tabula
import pandas as pd

Pour télécharger la version PDF de l'article nous utilisons le module requests :

import requests

response = requests.get('https://eml.berkeley.edu/~dromer/papers/MRW_QJE1992.pdf')

with open('./mrw-1992.pdf', 'wb') as f:
  f.write(response.content)

Sans même lire la documentation de la librairie tabula-py, on récupère facilement le tableau sur les deux premières pages. Le seul problème est qu'il faut renommer les colonnes (de l'objet DataFrame retourné par la fonction tabula.read_pdf()).

t1 = tabula.read_pdf('./mrw-1992.pdf', pages=28, silent=True)
t1 = t1[0]
t1.rename(columns={'0':'O', '1960':'GDP_1960', '1985':'GDP_1985', 'GDP':'g(GDP)', 'age pop':'g(POP)', 'Unnamed: 0':'I/Y', 'Unnamed: 1':'SCHOOL'}, inplace=True)

t2 = tabula.read_pdf('./mrw-1992.pdf', pages=29, silent=True)
t2 = t2[0]
t2.rename(columns={'0':'O', '1960':'GDP_1960', '1985':'GDP_1985', 'GDP':'g(GDP)', 'age pop':'g(POP)', 'Unnamed: 0':'I/Y', 'Unnamed: 1':'SCHOOL'}, inplace=True)

Pour la dernière page, c'est un peu plus compliqué. La fonction tabula.read_pdf() a besoin d'aide pour identifier les colonnes (elle ne parvient pas à séparer les colonnes O et 1960). On peut lui donner les coordonnées des séparateurs de colonnes (identifiées en éditant le fichier PDF sous Gimp et en configurant les règles, en haut à gauche, avec des points comme unité de mesure). Même avec cette information supplémentaire, la fonction retourne des données incohérentes sur les premières et dernières lignes (à cause du format particulier de l'en-tête du tableau et des notes au bas du tableau). On élimine donc ces lignes.

t3 = tabula.read_pdf('./mrw-1992.pdf',pages=30,silent=True, columns=[68, 150, 160, 170, 178, 205, 233, 251, 285, 306], guess=False)
t3 = t3[0][6:43]
t3.rename(columns={'436':'Number', 'QUARTERL':'Country', 'Y':'N', 'JO':'I', 'U':'O', 'RNAL':'GDP_1960', 'OF ECO':'GDP_1985', 'NOM':'g(GDP)', 'ICS':'g(POP)','Unnamed: 0':'I/Y', 'Unnamed: 1':'SCHOOL'}, inplace=True)

Enfin, il ne reste plus qu'à concaténer les trois objets DataFrame t1, t2 et t3 à l'aide de la fonction concat de Pandas, puis à enregistrer le résultat dans un fichier csv :

mrwdata = pd.concat([t1,t2,t3], ignore_index=True)
mrwdata.to_csv('./mrw-1992.csv', index=False)
  Number Country N I O GDP_1960 GDP_1985 g(GDP) g(POP) I/Y SCHOOL
0 1 Algeria 1 1 0 2485 4371 4.8 2.6 24.1 4.5
1 2 Angola 1 0 0 1588 1171 0.8 2.1 5.8 1.8
2 3 Benin 1 0 0 1116 1071 2.2 2.4 10.8 1.8
3 4 Botswana 1 1 0 959 3671 8.6 3.2 28.3 2.9
4 5 Burkina Faso 1 0 0 529 857 2.9 0.9 12.7 0.4
5 6 Burundi 1 0 0 755 663 1.2 1.7 5.1 0.4
6 7 Cameroon 1 1 0 889 2190 5.7 2.1 12.8 3.4
7 8 CentralAfr. Rep. 1 0 0 838 789 1.5 1.7 10.5 1.4
8 9 Chad 1 0 0 908 462 -0.9 1.9 6.9 0.4
9 10 Congo, Peop. Rep. 1 0 0 1009 2624 6.2 2.4 28.8 3.8
10 11 Egypt 1 0 0 907 2160 6 2.5 16.3 7
11 12 Ethiopia 1 1 0 533 608 2.8 2.3 5.4 1.1
12 13 Gabon 0 0 0 1307 5350 7 1.4 22.1 2.6
13 14 Gambia, The 0 0 0 799 nan 3.6 nan 18.1 1.5
14 15 Ghana 1 0 0 1009 727 1 2.3 9.1 4.7
15 16 Guinea 0 0 0 746 869 2.2 1.6 10.9 nan
16 17 Ivory Coast 1 1 0 1386 1704 5.1 4.3 12.4 2.3
17 18 Kenya 1 1 0 944 1329 4.8 3.4 17.4 2.4
18 19 Lesotho 0 0 0 431 1483 6.8 1.9 12.6 2
19 20 Liberia 1 0 0 863 944 3.3 3 21.5 2.5
20 21 Madagascar 1 1 0 1194 975 1.4 2.2 7.1 2.6
21 22 Malawi 1 1 0 455 823 4.8 2.4 13.2 0.6
22 23 Mali 1 1 0 737 710 2.1 2.2 7.3 1
23 24 Mauritania 1 0 0 777 1038 3.3 2.2 25.6 1
24 25 Mauritius 1 0 0 1973 2967 4.2 2.6 17.1 7.3
25 26 Morocco 1 1 0 1030 2348 5.8 2.5 8.3 3.6
26 27 Mozambique 1 0 0 1420 1035 1.4 2.7 6.1 0.7
27 28 Niger 1 0 0 539 841 4.4 2.6 10.3 0.5
28 29 Nigeria 1 1 0 1055 1186 2.8 2.4 12 2.3
29 30 Rwanda 1 0 0 460 696 4.5 2.8 7.9 0.4
30 31 Senegal 1 1 0 1392 1450 2.5 2.3 9.6 1.7
31 32 Sierra Leone 1 0 0 511 805 3.4 1.6 10.9 1.7
32 33 Somalia 1 0 0 901 657 1.8 3.1 13.8 1.1
33 34 S. Africa 1 1 0 4768 7064 3.9 2.3 21.6 3
34 35 Sudan 1 0 0 1254 1038 1.8 2.6 13.2 2
35 36 Swaziland 0 0 0 817 nan 7.2 nan 17.7 3.7
36 37 Tanzania 1 1 0 383 710 5.3 2.9 18 0.5
37 38 Togo 1 0 0 777 978 3.4 2.5 15.5 2.9
38 39 Tunisia 1 1 0 1623 3661 5.6 2.4 13.8 4.3
39 40 Uganda 1 0 0 601 667 3.5 3.1 4.1 1.1
40 41 Zaire 1 0 0 594 412 0.9 2.4 6.5 3.6
41 42 Zambia 1 1 0 1410 1217 2.1 2.7 31.7 2.4
42 43 Zimbabwe 1 1 0 1187 2107 5.1 2.8 21.1 4.4
43 44 Afghanistan 0 0 0 1224 nan 1.6 nan 6.9 0.9
44 45 Bahrain 0 0 0 nan nan nan nan 30 12.1
45 46 Bangladesh 1 1 0 846 1221 4 2.6 6.8 3.2
46 47 Burma 1 1 0 517 1031 4.5 1.7 11.4 3.5
47 48 Hong Kong 1 1 0 3085 13372 8.9 3 19.9 7.2
48 49 India 1 1 0 978 1339 3.6 2.4 16.8 5.1
49 50 Iran 0 0 0 3606 7400 6.3 3.4 18.4 6.5
50 51 Iraq 0 0 0 4916 5626 3.8 3.2 16.2 7.4
51 52 Israel 1 1 0 4802 10450 5.9 2.8 28.5 9.5
52 53 Japan 1 1 1 3493 13893 6.8 1.2 36 10.9
53 54 Jordan 1 1 0 2183 4312 5.4 2.7 17.6 10.8
54 55 Korea, Rep. of 1 1 0 1285 4775 7.9 2.7 22.3 10.2
55 56 Kuwait 0 0 0 77881 25635 2.4 6.8 9.5 9.6
56 57 Malaysia 1 1 0 2154 5788 7.1 3.2 23.2 7.3
57 58 Nepal 1 0 0 833 974 2.6 2 5.9 2.3
58 59 Oman 0 0 0 nan 15584 nan 3.3 15.6 2.7
59 60 Pakistan 1 1 0 1077 2175 5.8 3 12.2 3
60 61 Philippines 1 1 0 1668 2430 4.5 3 14.9 10.6
61 62 Saudi Arabia 0 0 0 6731 11057 6.1 4.1 12.8 3.1
62 63 Singapore 1 1 0 2793 14678 9.2 2.6 32.2 9
63 64 Sri Lanka 1 1 0 1794 2482 3.7 2.4 14.8 8.3
64 65 Syrian Arab Rep. 1 1 0 2382 6042 6.7 3 15.9 8.8
65 66 Taiwan 0 0 0 nan nan 8 nan 20.7 nan
66 67 Thailand 1 1 0 1308 3220 6.7 3.1 18 4.4
67 68 U. Arab Emirates 0 0 0 nan 18513 nan nan 26.5 nan
68 69 Yemen 0 0 0 nan 1918 nan 2.5 17.2 0.6
69 70 Austria 1 1 1 5939 13327 3.6 0.4 23.4 8
70 71 Belgium 1 1 1 6789 14290 3.5 0.5 23.4 9.3
71 72 Cyprus 0 0 0 2948 nan 5.2 nan 31.2 8.2
72 73 Denmark 1 1 1 8551 16491 3.2 0.6 26.6 10.7
73 74 Finland 1 1 1 6527 13779 3.7 0.7 36.9 11.5
74 75 France 1 1 1 7215 15027 3.9 1 26.2 8.9
75 76 Germany, Fed. Rep. 1 1 1 7695 15297 3.3 0.5 28.5 8.4
76 77 Greece 1 1 1 2257 6868 5.1 0.7 29.3 7.9
77 78 Iceland 0 0 0 8091 nan 3.9 nan 29 10.2
78 79 Ireland 1 1 1 4411 8675 3.8 1.1 25.9 11.4
79 80 Italy 1 1 1 4913 11082 3.8 0.6 24.9 7.1
80 81 Luxembourg 0 0 0 9015 nan 2.8 nan 26.9 5
81 82 Malta 0 0 0 2293 nan 6 nan 30.9 7.1
82 83 Netherlands 1 1 1 7689 13177 3.6 1.4 25.8 10.7
83 84 Norway 1 1 1 7938 19723 4.3 0.7 29.1 10
84 85 Portugal 1 1 1 2272 5827 4.4 0.6 22.5 5.8
85 86 Spain 1 1 1 3766 9903 4.9 1 17.7 8
86 87 Sweden 1 1 1 7802 15237 3.1 0.4 24.5 7.9
87 88 Switzerland 1 1 1 10308 15881 2.5 0.8 29.7 4.8
88 89 Turkey 1 1 1 2274 4444 5.2 2.5 20.2 5.5
89 90 United Kingdom 1 1 1 7634 13331 2.5 0.3 18.4 8.9
90 91 Barbados 0 0 0 3165 nan 4.8 nan 19.5 12.1
91 92 Canada 1 1 1 10286 17935 4.2 2 23.3 10.6
92 93 Costa Rica 1 1 0 3360 4492 4.7 3.5 14.7 7
93 94 Dominican Rep. 1 1 0 1939 3308 5.1 2.9 17.1 5.8
94 95 El Salvador 1 1 0 2042 1997 3.3 3.3 8 3.9
95 96 Guatemala 1 1 0 2481 3034 3.9 3.1 8.8 2.4
96 97 Haiti 1 1 0 1096 1237 1.8 1.3 7.1 1.9
97 98 Honduras 1 1 0 1430 1822 4 3.1 13.8 3.7
98 99 Jamaica 1 1 0 2726 3080 2.1 1.6 20.6 11.2
99 100 Mexico 1 1 0 4229 7380 5.5 3.3 19.5 6.6
100 101 Nicaragua 1 1 0 3195 3978 4.1 3.3 14.5 5.8
101 102 Panama 1 1 0 2423 5021 5.9 3 26.1 11.6
102 103 Trinidad & Tobago 1 1 0 9253 11285 2.7 1.9 20.4 8.8
103 104 United States 1 1 1 12362 18988 3.2 1.5 21.1 11.9
104 105 Argentina 1 1 0 4852 5533 2.1 1.5 25.3 5
105 106 Bolivia 1 1 0 1618 2055 3.3 2.4 13.3 4.9
106 107 Brazil 1 1 0 1842 5563 7.3 2.9 23.2 4.7
107 108 Chile 1 1 0 5189 5533 2.6 2.3 29.7 7.7
108 109 Colombia 1 1 0 2672 4405 5 3 18 6.1
109 110 Ecuador 1 1 0 2198 4504 5.7 2.8 24.4 7.2
110 111 Guyana 0 0 0 2761 nan 1.1 nan 32.4 11.7
111 112 Paraguay 1 1 0 1951 3914 5.5 2.7 11.7 4.4
112 113 Peru 1 1 0 3310 3775 3.5 2.9 12 8
113 114 Surinam 0 0 0 3226 nan 4.5 nan 19.4 8.1
114 115 Uruguay 1 1 0 5119 5495 0.9 0.6 11.8 7
115 116 Venezuela 1 1 0 10367 6336 1.9 3.8 11.4 7
116 117 Australia 1 1 1 8440 13409 3.8 2 31.5 9.8
117 118 Fiji 0 0 0 3634 nan 4.2 nan 20.6 8.1
118 119 Indonesia 1 1 0 879 2159 5.5 1.9 13.9 4.1
119 120 New Zealand 1 1 1 9523 12308 2.7 1.7 22.5 11.9
120 121 Papua New Guinea 1 0 0 1781 2544 3.5 2.1 16.2 1.5