-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathfeed.r.xml
More file actions
2068 lines (1630 loc) · 745 KB
/
feed.r.xml
File metadata and controls
2068 lines (1630 loc) · 745 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>free range statistics - R</title>
<description>Posts categorised as 'R'</description>
<link>https://freerangestats.info</link>
<atom:link href="https://freerangestats.info/feed.R.xml" rel="self" type="application/rss+xml" />
<item>
<title>Pacific island population pyramids (again) by @ellis2013nz</title>
<description><p>This post is the fifth of a series of seven on population issues in the Pacific, re-generating the charts I used in a keynote speech before the November 2025 meeting of the Pacific Heads of Planning and Statistics in Wellington, New Zealand. The seven pieces of the puzzle are:</p>
<ul>
<li><a href="/blog/2025/11/30/pacific-population">Visual summaries of population size and growth</a></li>
<li><a href="/blog/2025/12/04/pacific-net-migration">Net migration</a></li>
<li><a href="/blog/2026/02/16/pacific-cities">World cities with the most Pacific Islanders</a></li>
<li><a href="/blog/2026/02/18/pacific-diaspora">Pacific diaspora</a></li>
<li>Population pyramids (this post, today)</li>
<li>Remittances (to come)</li>
<li>Tying it all together (to come)</li>
</ul>
<p>Today’s post is about population pyramids, and is familiar territory for regular readers of the blog, if any. The code is basically an adaptation of that used to create <a href="/blog/2025/05/17/animated-population-pyramids">these animated population pyramids</a>, tweaked to create still images that I needed to make the point in my talk.</p>
<h2 id="kiribati-and-marshall-islands">Kiribati and Marshall Islands</h2>
<p>In the first instance that meant this image, which contrasts the demographic shape and growth of two coral atoll nations, Kiribati and Marshall Islands:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0314-kiribati-marshalls.svg" width="100%"><img src="https://freerangestats.info/img/0314-kiribati-marshalls.png" width="100%" /></object>
<p>Kiribati today has about four times the population of Marshall Islands but in 1980 was only about double. The significant thing here is the wasp waist of the Marshall Islands pyramid in 2025—while it had a similar shape to Kiribati in 1980. People at peak working and reproductive age are literally absent from today’s Marshall Islands—in this case, primarily in the USA, which gives automatic residence rights to the Compact of Free Association Countries (Marshall Islands, Palau and Federated States of Micronesia).</p>
<p>The result of this is that Marshall Islands not only benefits from its individuals having more freedom of movement and opportunity, and sending back remittances; but also having a pressure valve for what would otherwise be a rapidly (too fast?) growing population. To put it bluntly, Kiribati has a problem of too many people (particularly on crowded southern Tarawa); Marshall Islands, if it has a population problem, is one of too few. The contrast of crowded, relatively poor Tarawa and less-crowded, relatively well-off Majuro is an obvious and stark one to anyone travelling to them both in quick succession.</p>
<p>That first chart tries to show both the absolute size and shape at the same time. An alternative presentation lets the x axis be free, giving up comparability of size but making changes in shape more visible. There are pros and cons of each but the free axis version certainly dramatically shows the change in shape of Marshall Islands in particular:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0314-kiribati-marshalls-freex.svg" width="100%"><img src="https://freerangestats.info/img/0314-kiribati-marshalls-freex.png" width="100%" /></object>
<p>Here’s the code to download the data from the Pacific Data Hub and draw those charts:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># this script draws population pyramids for 1980 and 2025, firstly</span><span class="w">
</span><span class="c1"># for Marshall Islands and Kiribati together for comparison </span><span class="w">
</span><span class="c1"># purposes, and then for each of the 21 PICTs (exlcuding Pitcairn)</span><span class="w">
</span><span class="c1"># so we can pick and choose which ones</span><span class="w">
</span><span class="c1">#</span><span class="w">
</span><span class="c1"># Peter Ellis November 2025</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">janitor</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rsdmx</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ISOcodes</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">glue</span><span class="p">)</span><span class="w">
</span><span class="c1"># see https://blog.datawrapper.de/gendercolor/</span><span class="w">
</span><span class="n">pal</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"#D4855A"</span><span class="p">,</span><span class="w"> </span><span class="s2">"#C5CB81"</span><span class="p">)</span><span class="w">
</span><span class="nf">names</span><span class="p">(</span><span class="n">pal</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Female"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">)</span><span class="w">
</span><span class="c1"># Download all population data needed</span><span class="w">
</span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">exists</span><span class="p">(</span><span class="s2">"pop2picts"</span><span class="p">)){</span><span class="w">
</span><span class="n">pop2picts</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">readSDMX</span><span class="p">(</span><span class="s2">"https://stats-sdmx-disseminate.pacificdata.org/rest/data/SPC,DF_POP_PROJ,3.0/A.AS+CK+FJ+PF+GU+KI+MH+FM+NR+NC+NU+MP+PW+PG+WS+SB+TK+TO+TV+VU+WF.MIDYEARPOPEST.F+M.Y00T04+Y05T09+Y10T14+Y15T19+Y20T24+Y25T29+Y30T34+Y35T39+Y40T44+Y45T49+Y50T54+Y55T59+Y60T64+Y65T69+Y70T999?startPeriod=1980&amp;endPeriod=2025&amp;dimensionAtObservation=AllDimensions"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">as_tibble</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">clean_names</span><span class="p">()</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># sort out the from and to ages, rename sex, and add country labels</span><span class="w">
</span><span class="n">d</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pop2picts</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gsub</span><span class="p">(</span><span class="s2">"^Y"</span><span class="p">,</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">age</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">separate</span><span class="p">(</span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="n">into</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"from"</span><span class="p">,</span><span class="w"> </span><span class="s2">"to"</span><span class="p">),</span><span class="w"> </span><span class="n">sep</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"T"</span><span class="p">,</span><span class="w"> </span><span class="n">remove</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gsub</span><span class="p">(</span><span class="s2">"T"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-"</span><span class="p">,</span><span class="w"> </span><span class="n">age</span><span class="p">),</span><span class="w">
</span><span class="n">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gsub</span><span class="p">(</span><span class="s2">"-999"</span><span class="p">,</span><span class="w"> </span><span class="s2">"+"</span><span class="p">,</span><span class="w"> </span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="n">fixed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">),</span><span class="w">
</span><span class="n">sex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">case_when</span><span class="p">(</span><span class="w">
</span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"M"</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">,</span><span class="w">
</span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"F"</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="s2">"Female"</span><span class="w">
</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">age</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">ISO_3166_1</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"geo_pict"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Alpha_2"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rename</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Name</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">time_period</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1980</span><span class="p">,</span><span class="w"> </span><span class="m">2025</span><span class="p">))</span><span class="w">
</span><span class="c1">#----------Marshalls and Kiribati-------------</span><span class="w">
</span><span class="c1"># subset data to these two countries:</span><span class="w">
</span><span class="n">d1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Kiribati"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Marshall Islands"</span><span class="p">))</span><span class="w">
</span><span class="c1"># breaks in axis for Marshall and Kiribati chart:</span><span class="w">
</span><span class="n">x_breaks</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">-6000</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">4000</span><span class="p">,</span><span class="w"> </span><span class="m">-2000</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">2000</span><span class="p">,</span><span class="w"> </span><span class="m">4000</span><span class="p">,</span><span class="w"> </span><span class="m">6000</span><span class="p">)</span><span class="w">
</span><span class="c1"># draw chart:</span><span class="w">
</span><span class="n">pyramid_km</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">d1</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># according to Wikipedia males are usually on the left and females on the right</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Female"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">age</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">facet_grid</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">time_period</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">obs_value</span><span class="p">),</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">[</span><span class="s1">'Female'</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span><span class="w"> </span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">),</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">obs_value</span><span class="p">),</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">[</span><span class="s1">'Male'</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Age group"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x_breaks</span><span class="p">,</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"6,000"</span><span class="p">,</span><span class="w"> </span><span class="s2">"4,000"</span><span class="p">,</span><span class="w"> </span><span class="s2">"2,000\n(male)"</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="p">,</span><span class="w">
</span><span class="s2">"2,000\n(female)"</span><span class="p">,</span><span class="w"> </span><span class="s2">"4,000"</span><span class="p">,</span><span class="w"> </span><span class="s2">"6,000"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.minor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">strip.text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">))</span><span class="w">
</span><span class="n">print</span><span class="p">(</span><span class="n">pyramid_km</span><span class="p">)</span><span class="w">
</span><span class="n">pyramid_km_fr</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pyramid_km</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">facet_wrap</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">time_period</span><span class="p">,</span><span class="w"> </span><span class="n">scales</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"free_x"</span><span class="p">)</span><span class="w">
</span><span class="n">print</span><span class="p">(</span><span class="n">pyramid_km_fr</span><span class="p">)</span></code></pre></figure>
<h2 id="all-pacific-island-countries-one-at-a-time">All Pacific island countries, one at a time</h2>
<p>I used the same chart to generate a PNG image of each Pacific island country, one at a time. In the actual talk I pulled a few of these in to the PowerPoint to engage the audience and contrast different shapes. These plots are all sized to fit in to one frame in the PowerPoint template I was using.</p>
<p>For example, here is Tuvalu:</p>
<p><img src="https://freerangestats.info/img/pyramid-Tuvalu.png" width="100%" /></p>
<p>Until very recently, it has been relatively difficult to migrate out from Tuvalu. As a result we see a more or less regular population pyramid for a country in the late stage of demographic transition.</p>
<p>In contrast, here is French territory Wallis and Futuna:</p>
<p><img src="https://freerangestats.info/img/pyramid-Wallis and Futuna.png" width="100%" /></p>
<p>Wallis and Futuna’s inhabitants can move freely to other French territories such as New Caledonia, and have done so in considerable numbers. Hence we see a shortage in the 25-39 year age bracket.</p>
<p>Here’s the code to produce those pyramids for individual countries, saving them neatly in a folder for future use. Yes, I always use loops for this sort of thing, finding them both easy to write and to read (and saying loops are never any good in R is just outmoded prejudice):</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#--------------population pyramid individual image for each pict-----------</span><span class="w">
</span><span class="c1"># This section draws one chart and saves as an image for each PICT</span><span class="w">
</span><span class="n">dir.create</span><span class="p">(</span><span class="s2">"pic-pyramids"</span><span class="p">,</span><span class="w"> </span><span class="n">showWarnings</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">)</span><span class="w">
</span><span class="n">all_picts</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">unique</span><span class="p">(</span><span class="n">d</span><span class="o">$</span><span class="n">pict</span><span class="p">)</span><span class="w">
</span><span class="k">for</span><span class="p">(</span><span class="n">this_pict</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">all_picts</span><span class="p">){</span><span class="w">
</span><span class="n">this_d</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">this_pict</span><span class="p">)</span><span class="w">
</span><span class="n">this_pyramid</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">this_d</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Female"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">age</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">facet_grid</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">time_period</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">obs_value</span><span class="p">),</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">[</span><span class="s1">'Female'</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">this_d</span><span class="p">,</span><span class="w"> </span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">),</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">obs_value</span><span class="p">),</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">[</span><span class="s1">'Male'</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Age group"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.minor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">strip.text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">))</span><span class="w">
</span><span class="n">png</span><span class="p">(</span><span class="n">glue</span><span class="p">(</span><span class="s2">"pic-pyramids/pyramid-{this_pict}.png"</span><span class="p">),</span><span class="w"> </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5000</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2800</span><span class="p">,</span><span class="w">
</span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">600</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"cairo-png"</span><span class="p">)</span><span class="w">
</span><span class="n">print</span><span class="p">(</span><span class="n">this_pyramid</span><span class="p">)</span><span class="w">
</span><span class="n">dev.off</span><span class="p">()</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<p>That’s all for today. The final post in the series will say more about the implications of all this in the context of the other bits of analysis.</p>
</description>
<pubDate>Sun, 01 Mar 2026 00:00:00 +1100</pubDate>
<link>https://freerangestats.info/blog/2026/03/01/pacific-pyramids</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2026/03/01/pacific-pyramids</guid>
</item>
<item>
<title>Pacific diaspora by @ellis2013nz</title>
<description><p>This post is the fourth of a series of (probably) seven on population issues in the Pacific, re-generating the charts I used in a keynote speech before the November 2025 meeting of the Pacific Heads of Planning and Statistics in Wellington, New Zealand. The seven pieces of the puzzle are:</p>
<ul>
<li><a href="/blog/2025/11/30/pacific-population">Visual summaries of population size and growth</a></li>
<li><a href="/blog/2025/12/04/pacific-net-migration">Net migration</a></li>
<li><a href="/blog/2026/02/16/pacific-cities">World cities with the most Pacific Islanders</a></li>
<li>Pacific diaspora (this post, today)</li>
<li>Population pyramids (to come)</li>
<li>Remittances (to come)</li>
<li>Tying it all together (to come)</li>
</ul>
<p>Today’s post is all about creating this one eye-catching chart, comparing the number of people in a country with its diaspora—people who ethnically or otherwise identify with the country but are living overseas:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0313-diaspora-bar.svg" width="100%"><img src="https://freerangestats.info/img/0313-diaspora-bar.png" width="100%" /></object>
<p>As the chart notes, the diaspora numbers are an underestimate because I’ve only drawn on the New Zealand, Australian and USA censuses, and only partly for that. For example, I decided the number of Papua New Guineans living in New Zealand and USA wasn’t material and they haven’t been included. I’m confident this doesn’t change the look of the chart, but obviously if I were trying to create the best possible comprehensive estimates I should include these.</p>
<p>It’s a pretty dramatic story. We can see seven countries with more people living overseas than in the country itself: Niue, Pitcairn Islands, Cook Islands, Tokelau, Samoa, Tonga and Marshall Islands. Apart from Marshall Islands, these are all Polynesian. In fact, Tuvalu is the only Polynesian country in this collection that has more people living in-country than overseas (for now—this is likely to change now that Australia has agreed with Tuvalu for a regular annual intake of people via lottery).</p>
<p>Note that the three French territories (New Caledonia, Wallis and Futuna, and French Polynesia), and three American territories (American Samoa, Northern Mariana Islands and Guam) have been excluded from the plot.</p>
<p>For the four small countries along the bottom row of the chart, the difference is particularly important—a big majority of their people are living overseas. From my last post we know that a lot of these are in Auckland. Pitcairn is the only one of these four that has more of its diaspora in Australia than New Zealand (there are Pitcairn-identifying people in the UK too, but not enough to make me systematically add in the UK to my data in what was essentially a pragmatic and visual exercise—see comments above).</p>
<blockquote>
<p>96% of Niueans, 90% of Cook Islanders and 59% of Marshall Islanders live overseas.</p>
</blockquote>
<p>And for the four countries at the top of the chart—somewhat larger and distinctly poorer than many of the others, and three of them Melanesian—we see no significant diaspora, relative to the home population.</p>
<p>Here’s the code that creates this bar chart. Note that the data here are typed in by hand (!!) from various sources—not something I’d normally do, and would never recommend except for these really “small data” situations. I’ve checked it as thoroughly as I reasonably can, and the version I used in my talk that I’m adapting here was also peer reviewed by a work colleague.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># This script draws some charts of the diaspora of Pacific island countries and territories.</span><span class="w">
</span><span class="c1"># It's pretty rough and certainly incomplete. The approach was to use the census figures</span><span class="w">
</span><span class="c1"># for resident population of Pacific islander ancestry currently living in USA, Australia</span><span class="w">
</span><span class="c1"># and New Zealand; and compare that to populations resideing in the countries themselves.</span><span class="w">
</span><span class="c1">#</span><span class="w">
</span><span class="c1"># All sorts of known limitations which we are prepared to live with for these crude comparisons:</span><span class="w">
</span><span class="c1"># - different reference years (2025 for populations, and census years are 2018, 2020 and 2021)</span><span class="w">
</span><span class="c1"># - populations residing in the Pacific islands themselves are all ethnicities (e.g. will include</span><span class="w">
</span><span class="c1"># Australian-descent people rsideing in those countries), haven't bothered to limit to just "true" Tongans, Samoans, etc</span><span class="w">
</span><span class="c1"># - not comprehensive e.g. I know there are some Pitcairn-descended people in UK but haven't included them. And of course</span><span class="w">
</span><span class="c1"># there must be many others of these people in countries other than Australia, NZ and USA</span><span class="w">
</span><span class="c1"># - France not included at all. No ancestry data in French censuses so this would be tricky.</span><span class="w">
</span><span class="c1">#</span><span class="w">
</span><span class="c1"># Peter Ellis 2025-11</span><span class="w">
</span><span class="c1">#---------------------Data prep-------------------------</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rsdmx</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ISOcodes</span><span class="p">)</span><span class="w">
</span><span class="c1"># Current populations of PICTs:</span><span class="w">
</span><span class="n">pops</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rsdmx</span><span class="o">::</span><span class="n">readSDMX</span><span class="p">(</span><span class="s2">"https://stats-sdmx-disseminate.pacificdata.org/rest/data/SPC,DF_POP_PROJ,3.0/A..MIDYEARPOPEST._T._T?startPeriod=2025&amp;endPeriod=2025&amp;dimensionAtObservation=AllDimensions"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">as_tibble</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">select</span><span class="p">(</span><span class="n">ISOcodes</span><span class="o">::</span><span class="n">ISO_3166_1</span><span class="p">,</span><span class="w"> </span><span class="n">Alpha_2</span><span class="p">,</span><span class="w"> </span><span class="n">pict</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Name</span><span class="p">),</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"GEO_PICT"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Alpha_2"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">pict</span><span class="p">,</span><span class="w"> </span><span class="n">pop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">obsValue</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w">
</span><span class="c1"># out of interest what is the total population of all PICTs, Austrlaia and NZ together? (about 47m):</span><span class="w">
</span><span class="n">picts_and_anz</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">pops</span><span class="o">$</span><span class="n">pop</span><span class="p">),</span><span class="w"> </span><span class="m">28.1e6</span><span class="p">,</span><span class="w"> </span><span class="m">5.3e6</span><span class="p">)</span><span class="w">
</span><span class="nf">sum</span><span class="p">(</span><span class="n">picts_and_anz</span><span class="p">)</span><span class="w">
</span><span class="c1"># https://tools.summaries.stats.govt.nz/ethnic-group/tongan and similar for 2023 NZ figure</span><span class="w">
</span><span class="c1"># table builder for Australian 2021 figures - see `https://raw.githubusercontent.com/ellisp/blog-source/refs/heads/master/data/total%20by%20pacific.csv`</span><span class="w">
</span><span class="c1"># Wikipedia for US figures, from 2020 census. Search for e.g. "Palauans in USA wikipedia"</span><span class="w">
</span><span class="n">diaspora</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tribble</span><span class="p">(</span><span class="o">~</span><span class="n">pict</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">dest</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">people</span><span class="p">,</span><span class="w">
</span><span class="s2">"Tonga"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">97824</span><span class="p">,</span><span class="w">
</span><span class="s2">"Niue"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">34944</span><span class="p">,</span><span class="w">
</span><span class="s2">"Tokelau"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">9822</span><span class="p">,</span><span class="w">
</span><span class="s2">"Cook Islands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">94176</span><span class="p">,</span><span class="w">
</span><span class="s2">"Samoa"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">213069</span><span class="p">,</span><span class="w">
</span><span class="s2">"Tuvalu"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">6585</span><span class="p">,</span><span class="w">
</span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="m">25038</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">23808</span><span class="p">,</span><span class="w"> </span><span class="c1"># includes Fijian Indian</span><span class="w">
</span><span class="s2">"Papua New Guinea"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">22668</span><span class="p">,</span><span class="w">
</span><span class="s2">"Vanuatu"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">2380</span><span class="p">,</span><span class="w">
</span><span class="s2">"Solomon Islands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">2704</span><span class="p">,</span><span class="w">
</span><span class="s2">"Kiribati"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">1263</span><span class="p">,</span><span class="w">
</span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">48354</span><span class="p">,</span><span class="w">
</span><span class="s2">"Nauru"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">571</span><span class="p">,</span><span class="w">
</span><span class="s2">"Cook Islands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">27494</span><span class="p">,</span><span class="w">
</span><span class="s2">"Tokelau"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">2544</span><span class="p">,</span><span class="w">
</span><span class="s2">"Tonga"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">43469</span><span class="p">,</span><span class="w">
</span><span class="s2">"Niue"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">6225</span><span class="p">,</span><span class="w">
</span><span class="s2">"Samoa"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">98022</span><span class="p">,</span><span class="w">
</span><span class="s2">"Tuvalu"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">995</span><span class="p">,</span><span class="w">
</span><span class="s2">"Pitcairn"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="m">1123</span><span class="p">,</span><span class="w">
</span><span class="s2">"Marshall Islands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"USA"</span><span class="p">,</span><span class="w"> </span><span class="m">52624</span><span class="p">,</span><span class="w"> </span><span class="c1"># 47300 if just 'alone' </span><span class="w">
</span><span class="s2">"Palau"</span><span class="p">,</span><span class="w"> </span><span class="s2">"USA"</span><span class="p">,</span><span class="w"> </span><span class="m">12202</span><span class="p">,</span><span class="w">
</span><span class="s2">"Micronesia, Federated States of"</span><span class="p">,</span><span class="w"> </span><span class="s2">"USA"</span><span class="p">,</span><span class="w"> </span><span class="m">21596</span><span class="p">)</span><span class="w">
</span><span class="c1"># Australia checked</span><span class="w">
</span><span class="c1"># New Zealand checked</span><span class="w">
</span><span class="c1"># USA checked</span><span class="w">
</span><span class="c1">#--------------------------Bar chart------------------------</span><span class="w">
</span><span class="c1"># data frame to inspect to get percentages.</span><span class="w">
</span><span class="n">pops_with_prop</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pops</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">inner_join</span><span class="p">(</span><span class="n">diaspora</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gsub</span><span class="p">(</span><span class="s2">"Federated States of"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Fed. St."</span><span class="p">,</span><span class="w"> </span><span class="n">pict</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">pict</span><span class="p">,</span><span class="w"> </span><span class="n">pop</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">summarise</span><span class="p">(</span><span class="n">Overseas</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">people</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ungroup</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">prop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Overseas</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="n">pop</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">Overseas</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">pict</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fct_reorder</span><span class="p">(</span><span class="n">pict</span><span class="p">,</span><span class="w"> </span><span class="n">prop</span><span class="p">))</span><span class="w">
</span><span class="n">pops_with_prop</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="o">-</span><span class="n">prop</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rename</span><span class="p">(</span><span class="n">`Origin country`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">variable</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">pict</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.8</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">facet_wrap</span><span class="p">(</span><span class="o">~</span><span class="n">pict</span><span class="p">,</span><span class="w"> </span><span class="n">scales</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"free_y"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_fill_manual</span><span class="p">(</span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w"> </span><span class="s2">"brown"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">legend.position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"none"</span><span class="p">,</span><span class="w">
</span><span class="n">panel.spacing</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">unit</span><span class="p">(</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="s2">"lines"</span><span class="p">),</span><span class="w">
</span><span class="n">plot.caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey50"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="s2">"Number of people"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Pacific Islander diaspora, arranged from lowest proportion overseas to highest"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Diaspora is a lower bound of full figure as it is based on just Australia, USA and New Zealand censuses."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Source: PDH.Stat for populations; Australian, USA and New Zealand Censuses for diaspora."</span><span class="p">)</span></code></pre></figure>
<h2 id="an-alternative-not-so-good-visualisation">An alternative (not so good) visualisation</h2>
<p>I used the same data to also make this scatter plot:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0313-diaspora-scatter.svg" width="100%"><img src="https://freerangestats.info/img/0313-diaspora-scatter.png" width="100%" /></object>
<p>But I don’t much like it. It’s difficult to interpret, and while it has a bit of extra information (which country the diaspora is in) this doesn’t outweigh the interpretation problems. it probably shouldn’t have a log scale as we really want to add up the numbers; but using a non-transformed scale makes it even more of a visual mess. I’m including it here really just for the record and to illustrate that the first try at visualising something isn’t always the best (and sometimes, a humble bar chart ends up being what you want). Here’s the code for the scatter plot:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">pops</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">inner_join</span><span class="p">(</span><span class="n">diaspora</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">people</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pict</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dest</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_abline</span><span class="p">(</span><span class="n">slope</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">intercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.5</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_log10</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_log10</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_colour_manual</span><span class="p">(</span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"blue"</span><span class="p">,</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w"> </span><span class="s2">"darkred"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"People living in origin country in 2025"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Diaspora in another country, recent census"</span><span class="p">,</span><span class="w">
</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Disapora country"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Pacific Island home population and diaspora in various countries"</span><span class="p">)</span></code></pre></figure>
</description>
<pubDate>Wed, 18 Feb 2026 00:00:00 +1100</pubDate>
<link>https://freerangestats.info/blog/2026/02/18/pacific-diaspora</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2026/02/18/pacific-diaspora</guid>
</item>
<item>
<title>The world's biggest 'Pacific' cities by @ellis2013nz</title>
<description><p>This post is the third in a (somewhat interrupted) series on population issues in the Pacific, re-generating the charts I used in a keynote speech before the November 2025 meeting of the Pacific Heads of Planning and Statistics in Wellington, New Zealand. So far we have:</p>
<ul>
<li><a href="/blog/2025/11/30/pacific-population">Visual summaries of population size and growth</a></li>
<li><a href="/blog/2025/12/04/pacific-net-migration">Net migration</a></li>
<li>World cities with the most Pacific Islanders (this post, today)</li>
</ul>
<p>We often hear that Auckland is the world’s largest Polynesian city, or even the world’s largest Pacific Islander city; but which is the second or third largest?</p>
<p>This will be a short post. The end point is this single chart:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0312-pacific-cities.svg" width="100%"><img src="https://freerangestats.info/img/0312-pacific-cities.png" width="100%" /></object>
<p>Port Moresby (the capital of Papua New Guinea) is the second biggest urban collection of Pacific Islanders, and in fact it isn’t far behind Auckland. Next come the largest cities of Indonesian Western New Guinea. I’m not well familiar with that part of the world and I might have missed some further cities of similar size, but am confident I got the first two. Coming in at numbers 5 and 6 we have Suva in Fiji, and Papeete in French Polynesia (on the island of Tahiti). Then we see that Sydney and Brisbane in Australia probably have more Pacific Islanders than do many of the famous cities of the Pacific, such as Lae, Honiara, Noumea and Port Vila. Samoa’s Apia doesn’t even make it on to the chart.</p>
<p>I couldn’t get data on French cities in the mainland ‘hexagon’, for which ethnicity information is difficult to obtain for deliberate decisions on the part of the statistical authorities. There are good reasons for this founded in history. But the number is probably too small to make it to the chart. Los Angeles could maybe be there if a broad enough geography is included, but the city definitions were a bit tough for me to deal with and in the end I opted to leave it out.</p>
<p>I’m sure there’s some omissions or errors here so would welcome corrections and comments, as usual. But the main point was illustrative, and aimed at pointing out the importance of some cities perhaps not often thought of as Pacific Islander urban concentrations, and I’m happy that it does that reasonably accurately.</p>
<p>There were a few choices here, such as whether to include West Papuans, Māori (who are pretty numerous in Australian cities as well as in New Zealand) and Hawaiians (and less materially as there are less of them, Torres Strait Islanders) as Pacific Islanders. I’m pretty happy that the answer is “yes” to include all of them, for our purposes. Note that if we excluded Māori from the Auckland count, it would no longer be the world’s biggest Pacific Islander city.</p>
<p>The real difficulty, and one I’m confident my solution for which could be improved, was in getting consistent definitions of “city” and good estimates of what proportion of that city are Pacific Islanders. The latter can come from census data, but I didn’t have time to go to each country’s latest census and ensure a comparable number, so had to resort to Wikipedia in some cases.</p>
<p>For example of the problem of a definition of ‘city’, Honolulu itself has a population of around 350,000, but the <a href="https://en.wikipedia.org/wiki/Honolulu">Urban Honolulu metropolitan area</a> is around 1 million (only a small proportion of whom are Pacific Islanders). Suva’s population is around 100,000; its metropolitan area brings this up to 185,000; and if you include Lami, Nasinu and Nausori (where the airport is) <a href="https://en.wikipedia.org/wiki/Suva">this becomes 330,000</a>. In both these cases I used the greater metropolitan area, but not Nausori, etc. for Suva.</p>
<p>For Australia and New Zealand I used the “Greater Capital City Statistical Areas” and “Territorial Authorities” respectively. This means I miss out on non-capital cities, like Gold Coast (population around 600,000 and around 1 per cent Pacific Islander) but I think that is ok. It means we are under-counting Wellington by the standard I used for Suva and Honolulu (Lower Hutt and Upper Hutt should probably be included, but they are their own TAs). Again, I think that is probably ok.</p>
<p>There’s at least one other more controversial problem I’ve skimmed over and won’t mention.</p>
<p>For cities outside Australia and New Zealand I didn’t have time to get definitive estimates directly from each census and relied on Wikipedia and other secondary sources. This bit is highly error-prone, and could do with a more careful approach! Overall I’ve got a somewhat dim view of the tossed-together code below, which was a real compromise between time and thoroughness. But hopefully the results are good enough for our illustrative purposes! Anywhere, here’s the code:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># this is a crude exploration of the question:</span><span class="w">
</span><span class="c1"># "What are the largest Pacific islander cities in the world?"</span><span class="w">
</span><span class="c1"># It is doubtless incomplete and there are a bunch of more detailed</span><span class="w">
</span><span class="c1"># issues to go into if we wanted to do this definitively.</span><span class="w">
</span><span class="c1">#</span><span class="w">
</span><span class="c1"># Peter Ellis 2025-11</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">
</span><span class="c1">#--------------------New Zealand census data----------</span><span class="w">
</span><span class="c1"># Large file of Stats NZ census data to download. apparently the Census 2023</span><span class="w">
</span><span class="c1"># equivalent is not yet availalbe, so we just use the 2018 version:</span><span class="w">
</span><span class="n">dir.create</span><span class="p">(</span><span class="s2">"raw-data"</span><span class="p">)</span><span class="w">
</span><span class="n">fn</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"raw-data/nz_census_2018.zip"</span><span class="w">
</span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">file.exists</span><span class="p">(</span><span class="n">fn</span><span class="p">)){</span><span class="w">
</span><span class="n">download.file</span><span class="p">(</span><span class="s2">"https://www3.stats.govt.nz/2018census/8317_Age%20and%20sex%20by%20ethnic%20group%20(grouped%20total%20responses),%20for%20census%20night%20population%20counts,%202006,%202013,%20and%202018%20Censuses%20(RC,%20TA,%20SA2,%20DHB).zip"</span><span class="p">,</span><span class="w">
</span><span class="n">destfile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fn</span><span class="p">,</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"wb"</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># the file is a zipped collection of long thin coded data table and </span><span class="w">
</span><span class="c1"># dimension lookup tables explaining what each of the codes mean:</span><span class="w">
</span><span class="n">unzip</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span><span class="w"> </span><span class="n">exdir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"raw-data"</span><span class="p">)</span><span class="w">
</span><span class="n">ethnic</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"raw-data/DimenLookupEthnic8317.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">area</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"raw-data/DimenLookupArea8317.csv"</span><span class="p">)</span><span class="w">
</span><span class="c1"># we are going to use the Territorial Authority level so we can pick up</span><span class="w">
</span><span class="c1"># Christchurch, Wellington which are TAs. Note this means we are </span><span class="w">
</span><span class="c1"># not counting eg Lower Hutt as part of Wellington. An interpretation of 'greater Wellington'</span><span class="w">
</span><span class="c1"># probably would include this. But this is an ok compromise for our purposes, I think?</span><span class="w">
</span><span class="c1"># Takes a while because there is a mass of very detailed data here</span><span class="w">
</span><span class="c1"># but we are only using a tiny bit of it - second biggest regional groups</span><span class="w">
</span><span class="c1"># and just a small subset of the ethnic groups</span><span class="w">
</span><span class="n">nz2018</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"raw-data/Data8317.csv"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Year</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">2018</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">ethnic</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Ethnic"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Code"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rename</span><span class="p">(</span><span class="n">ethnic_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Description</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">area</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Area"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Code"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rename</span><span class="p">(</span><span class="n">area_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Description</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">ethnic_name</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Maori"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Pacific Peoples"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># only Territorial Authority level:</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">str_length</span><span class="p">(</span><span class="n">Area</span><span class="p">)</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="o">!</span><span class="n">area_name</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Total - Territorial Authority areas"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># total all people:</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Age</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"999999"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># total all sexes:</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">9</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># just cities (not districts) |&gt; </span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">grepl</span><span class="p">(</span><span class="s2">"City"</span><span class="p">,</span><span class="w"> </span><span class="n">area_name</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">area_name</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Auckland"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">count</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">ethnic_name</span><span class="p">,</span><span class="w"> </span><span class="n">area_name</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">country</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">)</span><span class="w">
</span><span class="c1"># quick reality check - print to console the biggest TAs with Pacific peoples:</span><span class="w">
</span><span class="n">nz2018</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">area_name</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">summarise</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">value</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">desc</span><span class="p">(</span><span class="n">value</span><span class="p">))</span><span class="w">
</span><span class="n">nz2018</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">ethnic_name</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">area_name</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">spread</span><span class="p">(</span><span class="n">ethnic_name</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">desc</span><span class="p">(</span><span class="n">`Pacific Peoples`</span><span class="p">))</span><span class="w">
</span><span class="c1">#--------------Australian census data--------------</span><span class="w">
</span><span class="c1"># Originally downloaded from australian tablebuilder,</span><span class="w">
</span><span class="c1"># file is small so is committed to this repo:</span><span class="w">
</span><span class="c1"># `/raw-data/ancestry pacific by greater city 2021 australia census.csv`</span><span class="w">
</span><span class="n">aus2021</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"https://raw.githubusercontent.com/ellisp/blog-source/refs/heads/master/data/ancestry%20pacific%20by%20greater%20city%202021%20australia%20census.csv"</span><span class="p">,</span><span class="w">
</span><span class="n">skip</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">9</span><span class="p">,</span><span class="w"> </span><span class="n">n_max</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">26</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="o">-</span><span class="n">Total</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">...11</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rename</span><span class="p">(</span><span class="n">ethnic_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">`GCCSA (UR)`</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="o">!</span><span class="nf">is.na</span><span class="p">(</span><span class="n">`Greater Sydney`</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">area_name</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">ethnic_name</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="o">!</span><span class="n">grepl</span><span class="p">(</span><span class="s2">"Total"</span><span class="p">,</span><span class="w"> </span><span class="n">ethnic_name</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">value</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">ethnic_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">if_else</span><span class="p">(</span><span class="w">
</span><span class="n">ethnic_name</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Maori"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Maori"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Pacific Peoples"</span><span class="w">
</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">ethnic_name</span><span class="p">,</span><span class="w"> </span><span class="n">area_name</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">summarise</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">value</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">country</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Australia"</span><span class="p">)</span><span class="w">
</span><span class="c1">#--------------Other--------------</span><span class="w">
</span><span class="c1"># these estimates from various ad hoc sources, mostly</span><span class="w">
</span><span class="c1"># Wikipedia. Remembering we want number of pacific islanders,</span><span class="w">
</span><span class="c1"># not total ppulation. Which means we have two difficult numbers</span><span class="w">
</span><span class="c1"># to get hold of. So this bit is certainly wrong! - just the</span><span class="w">
</span><span class="c1"># best estimate I could do in a hurry.</span><span class="w">
</span><span class="n">other</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tribble</span><span class="p">(</span><span class="o">~</span><span class="n">area_name</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">country</span><span class="p">,</span><span class="w">
</span><span class="s2">"Port Moresby"</span><span class="p">,</span><span class="w"> </span><span class="m">400000</span><span class="p">,</span><span class="w"> </span><span class="s2">"PNG"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Lae"</span><span class="p">,</span><span class="w"> </span><span class="m">100000</span><span class="p">,</span><span class="w"> </span><span class="s2">"PNG"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Mount Hagen"</span><span class="p">,</span><span class="w"> </span><span class="m">50000</span><span class="p">,</span><span class="w"> </span><span class="s2">"PNG"</span><span class="p">,</span><span class="w">
</span><span class="c1"># pop is 400k+ but what proportion is pacific? - generally west papua about 75% papuans:</span><span class="w">
</span><span class="s2">"Jayapura"</span><span class="p">,</span><span class="w"> </span><span class="m">320000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Indonesia"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Sorong"</span><span class="p">,</span><span class="w"> </span><span class="m">.75</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">300000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Indonesia"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Greater Suva"</span><span class="p">,</span><span class="w"> </span><span class="m">185000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w"> </span><span class="c1"># not counting nausori</span><span class="w">
</span><span class="s2">"Lautoka"</span><span class="p">,</span><span class="w"> </span><span class="m">75000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Nasinu"</span><span class="p">,</span><span class="w"> </span><span class="m">74000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w">
</span><span class="c1"># Only about 9% of greater honolulu identify as pacific islander:</span><span class="w">
</span><span class="s2">"Honolulu urban area"</span><span class="p">,</span><span class="w"> </span><span class="m">0.09</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">1e6</span><span class="p">,</span><span class="w"> </span><span class="s2">"USA"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Greater Noumea"</span><span class="p">,</span><span class="w"> </span><span class="m">0.26</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">200000</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Caledonia"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Papeete"</span><span class="p">,</span><span class="w"> </span><span class="m">137000</span><span class="p">,</span><span class="w"> </span><span class="s2">"French Polynesia"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Honiara"</span><span class="p">,</span><span class="w"> </span><span class="m">80000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Solomon Islands"</span><span class="p">,</span><span class="w">
</span><span class="s2">"South Tarawa"</span><span class="p">,</span><span class="w"> </span><span class="m">70000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Kiribati"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Majuro"</span><span class="p">,</span><span class="w"> </span><span class="m">20000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Marshall Islands"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Apia"</span><span class="p">,</span><span class="w"> </span><span class="m">30000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Samoa"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Port Vila"</span><span class="p">,</span><span class="w"> </span><span class="m">50000</span><span class="p">,</span><span class="w"> </span><span class="s2">"Vanuatu"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">ethnic_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Pacific Peoples"</span><span class="p">)</span><span class="w">
</span><span class="c1">#----------------draw bar chart--------------</span><span class="w">
</span><span class="n">nz2018</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rbind</span><span class="p">(</span><span class="n">aus2021</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rbind</span><span class="p">(</span><span class="n">other</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">area_name</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">total</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">value</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ungroup</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">desc</span><span class="p">(</span><span class="n">total</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">slice</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">24</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">area_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fct_reorder</span><span class="p">(</span><span class="n">area_name</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">.fun</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sum</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">country_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">case_when</span><span class="p">(</span><span class="w">
</span><span class="n">country</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Australia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Zealand"</span><span class="p">,</span><span class="w"> </span><span class="s2">"France"</span><span class="p">,</span><span class="w"> </span><span class="s2">"USA"</span><span class="p">)</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="s2">"Metropolitan SPC member"</span><span class="p">,</span><span class="w">
</span><span class="n">country</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Indonesia"</span><span class="p">)</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="s2">"Non-SPC member"</span><span class="w"> </span><span class="p">,</span><span class="w">
</span><span class="kc">TRUE</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="s2">"Pacific island SPC member"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">area_name</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">country_type</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"stack"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_fill_manual</span><span class="p">(</span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"darkgreen"</span><span class="p">,</span><span class="w"> </span><span class="s2">"brown"</span><span class="p">,</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Number of Pacific Islanders
(including Māori, Papuans and Hawaiians)"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"The world's largest Pacific Islander cities"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Treat these estimates with some caution... corrections are welcomed!"</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Source: Australia Census 2021, New Zealand Census 2018, Wikipedia and author estimates "</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">angle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">45</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">legend.position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0.8</span><span class="p">,</span><span class="w"> </span><span class="m">0.7</span><span class="p">),</span><span class="w">
</span><span class="n">plot.caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey50"</span><span class="p">))</span></code></pre></figure>
<p>That’s all for now. Coming up we have a look at how much of Pacific Islander populations are in the “home” country and how much elsewhere (e.g. New Zealand); some more on population profiles; remittances data; and a summary post where I’ll tie things together with the messaging I used in the actual talk.</p>
</description>
<pubDate>Mon, 16 Feb 2026 00:00:00 +1100</pubDate>
<link>https://freerangestats.info/blog/2026/02/16/pacific-cities</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2026/02/16/pacific-cities</guid>
</item>
<item>
<title>Visualising income inequality social tables by @ellis2013nz</title>
<description><p>I recently read Branko Milanovic’s 2023 book, <a href="https://www.goodreads.com/book/show/194208539-visions-of-inequality"><em>Visions of Inequality: from the French Revolution to the Cold War</em></a> and gave it five stars. The bulk of the book is an excellent critical look at the views of six major economic thinkers—Quesnay, Smith, Ricardo, Marx, Pareto and Kuznets—on economic inequality. Even though the first four of these (yes, even Marx) wrote little directly on inequality narrowly defined, their class-based approach to understanding the economy has critical implications for the subject.</p>
<p>One of the things Milanovic does well is place each thinker in the context of economic inequality in the time they were writing—both as it was known to themselves, and as per our best modern estimates. There’s a <em>lot</em> of data and tools available to us that were not there for contemporary commentators, but each of these thinkers did exceptionally well with the information they had, and has been chosen because they combine narrative, theory, and empirical work in a way that earns our respect and is still fruitful.</p>
<p>After a chapter on the barren world of cold war economic inequality analysis, in his final chapter Milanovic identifies three factors that have made 21st century inequality studies take off. These are Piketty’s new, insightful and influential analysis on the implications of a rate of profit that is persistantly greater than economic growth; new data, tools and concepts relating to ‘global inequality’; and new historical empirical work including the increasing volume and quality of ‘social tables’ setting out income and population by class.</p>
<p>I’m using this blog post to explore an alternative visualisation for these social tables.</p>
<h2 id="france-in-the-time-of-quesnay">France in the time of Quesnay</h2>
<p>Milanovic makes good use of charts like (but not exactly like) this one, and anyone wondering what a social table is can think about them as just the tabular version of the data on income and population by class shown here:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0311-quesnay-bar.svg" width="100%"><img src="https://freerangestats.info/img/0311-quesnay-bar.png" width="100%" /></object>
<p>I’ve added the colour for the two different axes—I think this is super-helpful for dual axes plots to work, as <a href="/blog/2016/08/18/dualaxes">I’ve written about in 2016</a>, but obviously impossible in a grayscale publication—and used data-specific vertical axis labels rather than regular gridlines, in a nod to the sort of style Tufte might like. But otherwise this is pretty much the plot format used by Milanovic.</p>
<p>The estimates here are actually those of Quesnay himself, in Mirabeau’s <em>La philosphie rurale</em>, the physiocrat masterwork which really set out to be the definitive book of the French economy. Quesnay himself has a fair claim to being the world’s first modern economist. Some of his categories look a little odd to us, such as the very French category just for self-employed viticulturalists; the non-existence of capitalists other than tenant farmers; or perhaps most importantly, wrapping all the first and second “estates” (clergy and aristocrats) into one category along with their administrative support. This last has the effect of hiding some pretty material income disparities.</p>
<p>This plot type is ok but I definitely found a bit difficult to absorb. I found myself looking class by class at the numbers and effectively converting them to a table in my head, usually a sign that we’re not using the power of data visualisation to its best.</p>
<p>I thought the obvious alternative is a scatter plot so I drew this one:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0311-quesnay-scatter.svg" width="100%"><img src="https://freerangestats.info/img/0311-quesnay-scatter.png" width="100%" /></object>
<p>Again, I’ve used data-specific labels on the axes—this only works when you’ve only got a small number of data points. I’ve reduced a lot of clutter (gridlines, etc.) and made the points’ labels a bit of a background colour relative to the points themselves. But it’s a pretty straightforward plot altogether. I think it will work for many audiences, and I like it.</p>
<p>Here’s the code to create the data (such a small number of points it’s ok to just hard-key it into an R script) and draw that first bar and line plot. It’s a bit complex because of the micro control I’m taking over things like where the breaks and labels go on the axes and the colours of the axes. But it’s all well within a regular approach to <code class="language-plaintext highlighter-rouge">ggplot2</code> graphics, helped out just with <code class="language-plaintext highlighter-rouge">ggtext</code> to get italics for the references in the subtitle and caption.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#==================setup==================</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggtext</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggrepel</span><span class="p">)</span><span class="w">
</span><span class="c1"># some general graphics parameters:</span><span class="w">
</span><span class="n">inc_col</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"red"</span><span class="w">
</span><span class="n">pop_col</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"blue"</span><span class="w">
</span><span class="n">theme_set</span><span class="p">(</span><span class="w">
</span><span class="n">theme_minimal</span><span class="p">(</span><span class="n">base_family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Roboto"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="w">
</span><span class="n">panel.grid.minor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">plot.subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_markdown</span><span class="p">(),</span><span class="w">
</span><span class="n">plot.caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_markdown</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey50"</span><span class="p">),</span><span class="w">
</span><span class="n">plot.title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_markdown</span><span class="p">(</span><span class="n">family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Sarala"</span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1">#==============Quesnay France 1763=====================</span><span class="w">
</span><span class="n">d1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tribble</span><span class="p">(</span><span class="o">~</span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">class</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">class_detail</span><span class="p">,</span><span class="w">
</span><span class="m">48</span><span class="p">,</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="s2">"Workers"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Agricultural labourers"</span><span class="p">,</span><span class="w">
</span><span class="m">22</span><span class="p">,</span><span class="w"> </span><span class="m">0.6</span><span class="p">,</span><span class="w"> </span><span class="s2">"Workers"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Manufacturing low-skill workers"</span><span class="p">,</span><span class="w">
</span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">0.8</span><span class="p">,</span><span class="w"> </span><span class="s2">"Self-employed"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Self-employed in viticulture"</span><span class="p">,</span><span class="w">
</span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">2.3</span><span class="p">,</span><span class="w"> </span><span class="s2">"Self-empoyed"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Artisans and crafsmen in manufacturing"</span><span class="p">,</span><span class="w">
</span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">2.7</span><span class="p">,</span><span class="w"> </span><span class="s2">"Capitalists"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tenant farmers"</span><span class="p">,</span><span class="w">
</span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="m">2.3</span><span class="p">,</span><span class="w"> </span><span class="s2">"The Elite"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Landlords, clergy, government administrators"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">country</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"France"</span><span class="p">,</span><span class="w">
</span><span class="n">period</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"1763"</span><span class="p">,</span><span class="w">
</span><span class="n">class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">class</span><span class="p">,</span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">unique</span><span class="p">(</span><span class="n">class</span><span class="p">)),</span><span class="w">
</span><span class="n">class_detail</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">str_wrap</span><span class="p">(</span><span class="n">class_detail</span><span class="p">,</span><span class="w"> </span><span class="m">25</span><span class="p">),</span><span class="w">
</span><span class="n">class_detail</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">class_detail</span><span class="p">,</span><span class="w"> </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class_detail</span><span class="p">),</span><span class="w">
</span><span class="n">pop_prop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">population</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">population</span><span class="p">),</span><span class="w">
</span><span class="n">inc_prop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">income</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">income</span><span class="p">),</span><span class="w">
</span><span class="n">pop_ratio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">population</span><span class="p">),</span><span class="w">
</span><span class="n">inc_ratio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">income</span><span class="p">))</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">d1</span><span class="o">$</span><span class="n">population</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">100</span><span class="p">)</span><span class="w">
</span><span class="c1">#-------------dual axis bar and line chart-----------------</span><span class="w">
</span><span class="c1"># as per Milanovic's style</span><span class="w">
</span><span class="n">d1</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class_detail</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="c1"># we want the 'gridlines' to be coloured, match the values, and behind the columns:</span><span class="w">
</span><span class="n">geom_hline</span><span class="p">(</span><span class="n">yintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="o">/</span><span class="m">2.7</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">inc_prop</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.1</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_hline</span><span class="p">(</span><span class="n">yintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">pop_prop</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_col</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.1</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="c1"># columns for population:</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_prop</span><span class="p">),</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_col</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.7</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="c1"># lines and points for income:</span><span class="w">
</span><span class="n">geom_line</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">class_detail</span><span class="p">),</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_prop</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">class_detail</span><span class="p">),</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_prop</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="c1"># annotated labels, also colour coded:</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4.2</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.8</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Relative income (right axis)"</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.6</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.6</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Population share (left axis)"</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_col</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="c1"># two different sets of labels for the different variables:</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">),</span><span class="w">
</span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1.1</span><span class="p">),</span><span class="w">
</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">pop_prop</span><span class="p">),</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">population</span><span class="p">),</span><span class="w">
</span><span class="n">sec.axis</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dup_axis</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="o">/</span><span class="m">2.7</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">inc_prop</span><span class="p">),</span><span class="w">
</span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="s2">"1.0"</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">income</span><span class="p">),</span><span class="w">
</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Income relative to the mean (1.0)"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Percentage of poulation"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Contemporary understanding of income inequality in France in the time of Louis XV"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Class-based income distribution in *La philosophie rurale* by Mirabeau and Quesnay, 1763. Gini estimated to be between 49 and 55."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Quesnay's original estimates, reproduced in Table 1.1 of Milanovic's *Visions of Inequality*, and plot style adapted from Milanovic's."</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">angle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">45</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line.y.right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">),</span><span class="w">
</span><span class="n">axis.line.y.left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_col</span><span class="p">),</span><span class="w">
</span><span class="n">axis.title.y.left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_col</span><span class="p">),</span><span class="w">
</span><span class="n">axis.title.y.right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">),</span><span class="w">
</span><span class="n">axis.text.y.left</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pop_col</span><span class="p">),</span><span class="w">
</span><span class="n">axis.text.y.right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">inc_col</span><span class="p">))</span></code></pre></figure>
<p>As an aside, relating to why I don’t use a large language model to help me write code for my blog: this sort of code is exactly the situation where I like writing code, not trying to explain in natural language to a computer what I want doing. I feel the <code class="language-plaintext highlighter-rouge">ggplot2</code> syntax is exactly the right combination of precision, concision and legibility. Anything I said in English that was as precise about what I wanted to do would take longer to write (and definitely to polish) than the R code.</p>
<p>Next up is the code for the scatter plot version. This is a bit shorter, mostly because we are using the same data and setup as the last chart, but partly because there’s less fiddly customisation needed as I’m not having to specify the dual axis complications of the bar/line chart.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#---------------scatter plot--------------</span><span class="w">
</span><span class="n">d1</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class_detail</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_hline</span><span class="p">(</span><span class="n">yintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">linetype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">123</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">30</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.1</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Average income"</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">population</span><span class="p">),</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">50</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="w"> </span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">d1</span><span class="o">$</span><span class="n">income</span><span class="p">),</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="w"> </span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Income relative to the mean"</span><span class="p">,</span><span class="w">
</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Percentage of population"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Contemporary understanding of income inequality in France in the time of Louis XV"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Class-based income distribution in *La philosophie rurale* by Mirabeau and Quesnay, 1763. Gini estimated to be between 49 and 55."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Quesnay's original estimates, reproduced in Table 1.1 of Milanovic's *Visions of Inequality*."</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">))</span></code></pre></figure>
<h2 id="england-and-wales-in-the-time-of-adam-smith">England and Wales in the time of Adam Smith</h2>
<p>The second economist Milanovic considers in his book in chronological order is of course Adam Smith himself. Here we move to our contemporary (21st century) understanding of income inequality and make use of social tables reconstructed by Robert Allen from contemporary sources. Here’s my scatter plot version of some of the data used by Milanovic:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0311-smith-scatter.svg" width="100%"><img src="https://freerangestats.info/img/0311-smith-scatter.png" width="100%" /></object>
<p>There’s white space at the top as a result of giving the vertical axis the same scale as the plot from the time of Ricardo (see a bit later in this post).</p>
<p>A thing that leaps out of course is the high income of England and Wales’ aristocratic landowners at the time relative to other groups, and the way the other groups are compressed vertically as a result. Sometimes we would use a logarithmic transform of the income variable to show the variation. This would give us a plot like this one:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0311-smith-scatter-log.svg" width="100%"><img src="https://freerangestats.info/img/0311-smith-scatter-log.png" width="100%" /></object>
<p>But I don’t much like this for our purpose. After all we are reading a book about inequality. I think the original scale is better, and the way the landed aristocracy sit up at the top by themselves is the point!</p>
<p>Here’s the code for those two charts (and a full reference to Allen’s publication with the original social table in it):</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#==============Adam Smith's time 1759==========</span><span class="w">
</span><span class="c1"># Allen, Robert C. “Class Structure and Inequality during the Industrial</span><span class="w">
</span><span class="c1"># Revolution: Lessons from England’s Social Tables, 1688-1867.” The Economic</span><span class="w">
</span><span class="c1"># History Review 72, no. 1 (2019): 88–125.</span><span class="w">
</span><span class="c1">#page 105 of Allen for % ofpopulation but I am using Milanovic's labels from his Figure 2.1</span><span class="w">
</span><span class="c1"># page 106 for income in pounds</span><span class="w">
</span><span class="n">d2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tribble</span><span class="p">(</span><span class="o">~</span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">class</span><span class="p">,</span><span class="w">
</span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="m">452.78</span><span class="p">,</span><span class="w"> </span><span class="s2">"Landed aristocracy"</span><span class="p">,</span><span class="w">
</span><span class="m">4.2</span><span class="p">,</span><span class="w"> </span><span class="m">145.37</span><span class="p">,</span><span class="w"> </span><span class="s2">"Capitalists"</span><span class="p">,</span><span class="w">
</span><span class="m">9.4</span><span class="p">,</span><span class="w"> </span><span class="m">27.17</span><span class="p">,</span><span class="w"> </span><span class="s2">"Shop owners"</span><span class="p">,</span><span class="w">
</span><span class="m">18.9</span><span class="p">,</span><span class="w"> </span><span class="m">21.57</span><span class="p">,</span><span class="w"> </span><span class="s2">"Peasants"</span><span class="p">,</span><span class="w">
</span><span class="m">56.4</span><span class="p">,</span><span class="w"> </span><span class="m">13.58</span><span class="p">,</span><span class="w"> </span><span class="s2">"Workers"</span><span class="p">,</span><span class="w">
</span><span class="m">9.6</span><span class="p">,</span><span class="w"> </span><span class="m">3.62</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="s2">"Paupers"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1759</span><span class="p">)</span><span class="w">
</span><span class="n">bry</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">d2</span><span class="o">$</span><span class="n">income</span><span class="p">)[</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">)]</span><span class="w">
</span><span class="n">brx</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">d2</span><span class="o">$</span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">))[</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">6</span><span class="p">)]</span><span class="w">
</span><span class="c1"># original scale:</span><span class="w">
</span><span class="n">d2</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">123</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">brx</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">65</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bry</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">800</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Income in pounds"</span><span class="p">,</span><span class="w">
</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Percentage of population"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Modern understanding of income inequality in England and Wales in 1759"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Average income by earner in pounds per year, as estimated in 2019. Gini index between 45 and 51."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Robert Allen, “Class Structure and Inequality during the Industrial
Revolution: Lessons from England’s Social Tables, 1688-1867.”&lt;br&gt;*The Economic
History Review 72*, no. 1 (2019): 88–125, reproduced in Figure 2.1 of Milanovic's *Visions of Inequality*."</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">))</span><span class="w">
</span><span class="c1"># log scale:</span><span class="w">
</span><span class="n">d2</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">123</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">brx</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">65</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_log10</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">d2</span><span class="o">$</span><span class="n">income</span><span class="p">),</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">800</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Income in pounds (log scale)"</span><span class="p">,</span><span class="w">
</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Percentage of population"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Modern understanding of income inequality in England and Wales in 1759"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Average income by earner in pounds per year, as estimated in 2019. Gini index between 45 and 51."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Robert Allen, “Class Structure and Inequality during the Industrial
Revolution: Lessons from England’s Social Tables, 1688-1867.”&lt;br&gt;*The Economic
History Review 72*, no. 1 (2019): 88–125, reproduced in Figure 2.1 of Milanovic's *Visions of Inequality*."</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">))</span></code></pre></figure>
<h2 id="england-and-wales-in-the-time-of-david-ricardo">England and Wales in the time of David Ricardo</h2>
<p>We’re on a familiar routine now. Of course, the next economist is David Ricardo. By the time he was at his peak, incomes had (for some) risen with the beginnings of the industrial revolution, and England was going through the existential traumas of the revolutionary and Napoleonic wars. Inequality, in the form of modern estimates of the Gini index, had grown.</p>
<p>Here’s my plot of the social table from 1801. Note that we have the same vertical axis scale (although different labels, of course) as the preceding chart from 1759 (not the log scale one, but the first 1759 chart shown above):</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0311-ricardo-scatter.svg" width="100%"><img src="https://freerangestats.info/img/0311-ricardo-scatter.png" width="100%" /></object>
<p>Shop-owners and capitalists had made significant income gains in England by this point, doubtless to Napoleon’s chagrin.</p>
<h1 id="france-in-the-time-of-marx">France in the time of Marx</h1>
<p>The final plot I’ll show is of the social table for France in 1831, early in the productive life of Karl Marx. Income is back to relative terms, and the class categories are becoming another step more ‘modern’.</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0311-marx-scatter.svg" width="100%"><img src="https://freerangestats.info/img/0311-marx-scatter.png" width="100%" /></object>
<p>Here’s the code for the last two charts, from the time of Ricardo and Marx:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#--------------------time of ricardo-------------</span><span class="w">
</span><span class="n">d3</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tribble</span><span class="p">(</span><span class="o">~</span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">class</span><span class="p">,</span><span class="w">
</span><span class="m">1.3</span><span class="p">,</span><span class="w"> </span><span class="m">756</span><span class="p">,</span><span class="w"> </span><span class="s2">"Landed aristocracy"</span><span class="p">,</span><span class="w">
</span><span class="m">3.2</span><span class="p">,</span><span class="w"> </span><span class="m">525</span><span class="p">,</span><span class="w"> </span><span class="s2">"Capitalists"</span><span class="p">,</span><span class="w">
</span><span class="m">8.6</span><span class="p">,</span><span class="w"> </span><span class="m">65</span><span class="p">,</span><span class="w"> </span><span class="s2">"Shop owners"</span><span class="p">,</span><span class="w">
</span><span class="m">10.8</span><span class="p">,</span><span class="w"> </span><span class="m">49</span><span class="p">,</span><span class="w"> </span><span class="s2">"Peasants"</span><span class="p">,</span><span class="w">
</span><span class="m">61.1</span><span class="p">,</span><span class="w"> </span><span class="m">23</span><span class="p">,</span><span class="w"> </span><span class="s2">"Workers"</span><span class="p">,</span><span class="w">
</span><span class="m">14.9</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="s2">"Paupers"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1801</span><span class="p">)</span><span class="w">
</span><span class="n">bry</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">d3</span><span class="o">$</span><span class="n">income</span><span class="p">)[</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">6</span><span class="p">)]</span><span class="w">
</span><span class="n">brx</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">d3</span><span class="o">$</span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">))[</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">7</span><span class="p">)]</span><span class="w">
</span><span class="n">d3</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">population</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">123</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">brx</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">65</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bry</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">800</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Income in pounds"</span><span class="p">,</span><span class="w">
</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Percentage of population"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Modern understanding of income inequality in England and Wales in 1801"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Average income by earner in pounds per year, as estimated in 2019. Gini index of around 52."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Robert Allen, *Revising England’s Social Tables Once Again* 2016, reproduced in Table 3.1 of Milanovic's *Visions of Inequality*."</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">))</span><span class="w">
</span><span class="n">svg_png</span><span class="p">(</span><span class="n">p5</span><span class="p">,</span><span class="w"> </span><span class="s2">"..https://freerangestats.info/img/0311-ricardo-scatter"</span><span class="p">,</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">6</span><span class="p">)</span><span class="w">
</span><span class="c1">#-----------------------1831 France--------------</span><span class="w">
</span><span class="c1"># From Milanovic's Marx chapter</span><span class="w">
</span><span class="n">d4</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tribble</span><span class="p">(</span><span class="o">~</span><span class="n">employment</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="o">~</span><span class="n">class</span><span class="p">,</span><span class="w">
</span><span class="m">3.4</span><span class="p">,</span><span class="w"> </span><span class="m">8.6</span><span class="p">,</span><span class="w"> </span><span class="s2">"Employers"</span><span class="p">,</span><span class="w">
</span><span class="m">5.1</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="s2">"Large farmers"</span><span class="p">,</span><span class="w">
</span><span class="m">1.1</span><span class="p">,</span><span class="w"> </span><span class="m">1.8</span><span class="p">,</span><span class="w"> </span><span class="s2">"High-level civil servants"</span><span class="p">,</span><span class="w">
</span><span class="m">13.9</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="s2">"Blue-collar employees"</span><span class="p">,</span><span class="w">
</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</span><span class="p">,</span><span class="w"> </span><span class="s2">"White collar employees"</span><span class="p">,</span><span class="w">
</span><span class="m">13.4</span><span class="p">,</span><span class="w"> </span><span class="m">0.7</span><span class="p">,</span><span class="w"> </span><span class="s2">"Self-employed"</span><span class="p">,</span><span class="w">
</span><span class="m">1.1</span><span class="p">,</span><span class="w"> </span><span class="m">0.6</span><span class="p">,</span><span class="w"> </span><span class="s2">"Low-level civil servants"</span><span class="p">,</span><span class="w">
</span><span class="m">31.4</span><span class="p">,</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="s2">"Small farmers"</span><span class="p">,</span><span class="w">
</span><span class="m">28.5</span><span class="p">,</span><span class="w"> </span><span class="m">0.45</span><span class="p">,</span><span class="w"> </span><span class="s2">"Agricultural workers and servants"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1831</span><span class="p">)</span><span class="w">
</span><span class="n">bry</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sort</span><span class="p">(</span><span class="nf">round</span><span class="p">(</span><span class="n">d4</span><span class="o">$</span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">))[</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">3</span><span class="p">,</span><span class="m">6</span><span class="o">:</span><span class="m">9</span><span class="p">)]</span><span class="w">
</span><span class="n">brx</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sort</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">d4</span><span class="o">$</span><span class="n">employment</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">)))[</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="m">4</span><span class="p">,</span><span class="m">5</span><span class="p">,</span><span class="m">6</span><span class="p">,</span><span class="m">8</span><span class="p">,</span><span class="m">9</span><span class="p">,</span><span class="w"> </span><span class="m">10</span><span class="p">)]</span><span class="w">
</span><span class="n">d4</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">employment</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">income</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">class</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_hline</span><span class="p">(</span><span class="n">yintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">linetype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">123</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">brx</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">35</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bry</span><span class="p">,</span><span class="w"> </span><span class="n">limits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">10</span><span class="p">),</span><span class="w"> </span><span class="n">expand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Relative income (average = 1.0)"</span><span class="p">,</span><span class="w">
</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Percentage of employed persons"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Modern understanding of income inequality in France in 1831"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Average income by earner relative to overall mean."</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Christian Morrison, and Wayne Snyder. “The Income Inequality of France in Historical Perspective.”
&lt;br&gt;*European Review of Economic History* 4, no. 1 (2000): 59–83.
, reproduced in Table 4.4 of Milanovic's *Visions of Inequality*."</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid.major</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey80"</span><span class="p">))</span></code></pre></figure>
<p>That’s all for today. Really, this was just a blog post about scatter plots!</p>
</description>
<pubDate>Sun, 08 Feb 2026 00:00:00 +1100</pubDate>
<link>https://freerangestats.info/blog/2026/02/08/social-table-visualisations</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2026/02/08/social-table-visualisations</guid>
</item>
<item>
<title>New Caledonia's nickel exports by @ellis2013nz</title>
<description><p>Just a brief blog post that effectively is jotting down some thoughts and sources on New Caledonian nickel exports.</p>
<p>This post was motivated by my (still incomplete) reading of this 2017 book on <a href="https://press.anu.edu.au/publications/series/asia-pacific-environment-monographs/large-scale-mines-and-local-level-politics">Large scale mines and local level politics—between New Caledonia and Papua New Guinea</a>, edited by Colin Filer and Pierre-Yves Le Meur. It’s fascinating, although obviously a bit dated now.</p>
<p>At the time of writing of that book, the depiction of nickel mining in New Caledonia was more optimistic, both in pure economic terms and as an instrument of reconciliation and Kanak independence, than would be the case today in 2025. Without going into all the details, several mines have been mothballed or shut down in recent years. An already shaky economic trend was exacerbated by the 2024 New Caledonia civil unrest. I wanted to do a quick check “is any nickel being exported at all? how much is it worth?”—and hence had a quick look at the data.</p>
<h2 id="exports-by-value">Exports by value</h2>
<p>My main data source for this is New Caledonia’s ISEE (Institute de la statistique et des études économiques Nouvelle-Calédonie), which maintains <a href="https://www.isee.nc/economie-entreprises/entreprises-secteurs-d-activites/secteur-du-nickel">a page on nickel in the economy</a>. This looks like a 2019 page, but the data downloads in Excel format at the bottom are being updated monthly and are current right up to October 2025.</p>
<p>New Caledonia exports both ore and processed metal—there’s quite a story behind this—and the export markets differ somewhat. For example Australia used to import ore but the processing plant in Queensland that was taking it was closed down. Here is the data on ore exports, by value and disaggregating by destination:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0310-ore.svg" width="100%"><img src="https://freerangestats.info/img/0310-ore.png" width="100%" /></object>
<p>… and here is the comparable data on processed metal:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0310-metals.svg" width="100%"><img src="https://freerangestats.info/img/0310-metals.png" width="100%" /></object>
<p>The next chart shows them both, now paying no attention to destination:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0310-both.svg" width="100%"><img src="https://freerangestats.info/img/0310-both.png" width="100%" /></object>
<p>None of these charts are adjusted for inflation. Putting that aside, what we see in recent years from all of these of course is pretty obvious—a big increase in exports by value in 2021 and 2022, decline in 2023 and collapse in 2024 and 2025.</p>
<p>Here’s the code to download this data from the ISEE website and draw those charts:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">readxl</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">fredr</span><span class="p">)</span><span class="w">
</span><span class="c1"># Nickel sector info from ISEE available at</span><span class="w">
</span><span class="c1"># https://www.isee.nc/economie-entreprises/entreprises-secteurs-d-activites/secteur-du-nickel</span><span class="w">
</span><span class="n">download.file</span><span class="p">(</span><span class="s2">"https://www.isee.nc/component/phocadownload/category/147-consultez-les-donnees-historiques?download=676:les-exportations-de-nickel"</span><span class="p">,</span><span class="w">
</span><span class="n">destfile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"nc-nickel-exports.xls"</span><span class="p">,</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"wb"</span><span class="p">)</span><span class="w">
</span><span class="c1">#--------------------minerai---------------------</span><span class="w">
</span><span class="n">ore</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_excel</span><span class="p">(</span><span class="s2">"nc-nickel-exports.xls"</span><span class="p">,</span><span class="w"> </span><span class="n">sheet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Minerai mensuel"</span><span class="p">,</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"A29:HG32"</span><span class="p">,</span><span class="w">
</span><span class="n">col_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"destination"</span><span class="p">,</span><span class="w">
</span><span class="nf">as.character</span><span class="p">(</span><span class="n">seq.Date</span><span class="p">(</span><span class="n">from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"2008-01-15"</span><span class="p">,</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"2025-10-20"</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"month"</span><span class="p">))))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">date</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">destination</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">value</span><span class="p">),</span><span class="w">
</span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">as.Date</span><span class="p">(</span><span class="n">date</span><span class="p">),</span><span class="w">
</span><span class="n">datem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">format</span><span class="p">(</span><span class="n">date</span><span class="p">,</span><span class="w"> </span><span class="s2">"%b %Y"</span><span class="p">),</span><span class="w">
</span><span class="n">datem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fct_reorder</span><span class="p">(</span><span class="n">datem</span><span class="p">,</span><span class="w"> </span><span class="n">date</span><span class="p">),</span><span class="w">
</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Ore"</span><span class="p">)</span><span class="w">
</span><span class="n">labs</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">levels</span><span class="p">(</span><span class="n">ore</span><span class="o">$</span><span class="n">datem</span><span class="p">)</span><span class="w">
</span><span class="n">labs</span><span class="p">[</span><span class="o">!</span><span class="n">grepl</span><span class="p">(</span><span class="s2">"Oct"</span><span class="p">,</span><span class="w"> </span><span class="n">labs</span><span class="p">)]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">""</span><span class="w">
</span><span class="n">ore</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">datem</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">destination</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">angle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">45</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">panel.grid.minor.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">panel.grid.major.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">())</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_discrete</span><span class="p">(</span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">labs</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"XPF (m)"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Destination:"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Nickel ore exports from New Caledonia, 2008-2025"</span><span class="p">)</span><span class="w">
</span><span class="c1">#--------------------metallurgie------------------</span><span class="w">
</span><span class="n">metal</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_excel</span><span class="p">(</span><span class="s2">"nc-nickel-exports.xls"</span><span class="p">,</span><span class="w"> </span><span class="n">sheet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Métallurgie mensuel"</span><span class="p">,</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"A134:HG138"</span><span class="p">,</span><span class="w">
</span><span class="n">col_names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"destination"</span><span class="p">,</span><span class="w">
</span><span class="nf">as.character</span><span class="p">(</span><span class="n">seq.Date</span><span class="p">(</span><span class="n">from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"2008-01-15"</span><span class="p">,</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"2025-10-20"</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"month"</span><span class="p">))))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">date</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">destination</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">value</span><span class="p">),</span><span class="w">
</span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">as.Date</span><span class="p">(</span><span class="n">date</span><span class="p">),</span><span class="w">
</span><span class="n">datem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">format</span><span class="p">(</span><span class="n">date</span><span class="p">,</span><span class="w"> </span><span class="s2">"%b %Y"</span><span class="p">),</span><span class="w">
</span><span class="n">datem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fct_reorder</span><span class="p">(</span><span class="n">datem</span><span class="p">,</span><span class="w"> </span><span class="n">date</span><span class="p">),</span><span class="w">
</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Processed metal"</span><span class="p">)</span><span class="w">
</span><span class="n">metal</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">datem</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">destination</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">angle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">45</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">panel.grid.minor.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">panel.grid.major.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">())</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_discrete</span><span class="p">(</span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">labs</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"XPF (m)"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Destination:"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Nickel metal exports from New Caledonia, 2008-2025"</span><span class="p">)</span><span class="w">
</span><span class="c1">#----------------------combined------------------</span><span class="w">
</span><span class="n">both</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">metal</span><span class="p">,</span><span class="w"> </span><span class="n">ore</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">datem</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">summarise</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">))</span><span class="w">
</span><span class="n">both</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">datem</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">angle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">45</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">panel.grid.minor.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">panel.grid.major.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">())</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_discrete</span><span class="p">(</span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">labs</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"XPF (m)"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Type of export:"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Nickel exports from New Caledonia 2008-2025"</span><span class="p">)</span></code></pre></figure>
<h2 id="seasonality">Seasonality</h2>
<p>I was interested in some of the variability in these patterns, and turned the total value of these exports into a single time series. I decomposed this into trend, seasonal and random components and was interested to see that there is in fact a noticeable seasonal component:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0310-decomposed.svg" width="100%"><img src="https://freerangestats.info/img/0310-decomposed.png" width="100%" /></object>
<p>The low months in the seasonal pattern tend to be January, February, and sometimes April. This is plausibly related to the heavier rain in those months making production and transport a bit more difficult. But this is just me guessing, I am open to information on what else might be driving this seasonality.</p>
<p>Here’s the code for that time series decomposition:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">nickel_ts</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">both</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">datem</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">summarise</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">value</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">pull</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ts</span><span class="p">(</span><span class="n">frequency</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">2008</span><span class="p">,</span><span class="w"> </span><span class="m">10</span><span class="p">))</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="n">bty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"l"</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="n">stl</span><span class="p">(</span><span class="n">nickel_ts</span><span class="p">,</span><span class="w"> </span><span class="n">s.window</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">7</span><span class="p">),</span><span class="w"> </span><span class="n">col</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">,</span><span class="w">
</span><span class="n">main</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Nickel exports (ore + metals, in millions of XPF) from New Caledonia"</span><span class="p">)</span></code></pre></figure>
<h2 id="causes">Causes</h2>
<p>Why have New Caledonia nickel exports collapsed so much? I’m not an expert on this but think that it’s largely driven by global nickel prices; with a secondary factor being difficulties specific to New Caledonia (local area politics such as those that are the subject of the book I started this post with a link to; security particularly since the 2024 civil unrest but actually dating earlier; and high labour costs).</p>
<p>I won’t go into those New Caledonia-specific reasons here. But here’s the world prices, showing an obvious rise from 2016 to a spike in 2022 and a quick collapse from 2023 to 2025:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0310-nickel-prices.svg" width="100%"><img src="https://freerangestats.info/img/0310-nickel-prices.png" width="100%" /></object>
<p>The structural increase in price was associated with the demand for nickel in batteries, including in electric vehicles. The 2022 spike came about from a genuine squeeze in supply when Russia invaded Ukraine, and fear about Russian nickel going off the market. Prices then fell because of Indonesian supply coming on line, and the rise of nickel-free electric vehicle batteries.</p>
<p>When prices go down, of course the value of exports goes down even if volumes stay the same. But when the price is going down because of more competititon, volume goes down as well. And the impact can be strong enough to lead whole mines to close (as has been the case in New Caledonia).</p>
<p>Code for the world nickel prices data, which comes from the USA Federal Reserve data system (FRED):</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#------------------nickel prices---</span><span class="w">
</span><span class="n">fredr_set_key</span><span class="p">(</span><span class="n">Sys.getenv</span><span class="p">(</span><span class="s2">"FRED_API_KEY"</span><span class="p">))</span><span class="w"> </span><span class="c1"># assumes was previously set with Sys.setenv(FRED_API_KEY = "XXXXXX")</span><span class="w">
</span><span class="n">nickel_prices</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">fredr</span><span class="p">(</span><span class="w">
</span><span class="n">series_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"PNICKUSDM"</span><span class="p">,</span><span class="w">
</span><span class="n">observation_start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">as.Date</span><span class="p">(</span><span class="s2">"2008-01-01"</span><span class="p">),</span><span class="w">
</span><span class="n">observation_end</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Sys.Date</span><span class="p">()</span><span class="w"> </span><span class="c1"># or a chosen end date</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">nickel_prices</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">date</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">(</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"brown"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dollar</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"US dollars (m)"</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"World nickel prices"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"(Not adjusted for inflation)"</span><span class="p">)</span></code></pre></figure>
<p>That’s all for today. There’s a lot more to this nickel story and how critical it is for New Caledonia, but I don’t have time to go into it today and probably I’m not the right person to do it anyway.</p>
<p>Happy new year!</p>
</description>
<pubDate>Thu, 01 Jan 2026 00:00:00 +1100</pubDate>
<link>https://freerangestats.info/blog/2026/01/01/new-caledonia-nickel</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2026/01/01/new-caledonia-nickel</guid>
</item>
<item>
<title>Net migration in Pacific island countries by @ellis2013nz</title>
<description><p>This is the second in my series of posts about population, migration, diaspora and related issues in the Pacific. See the <a href="/blog/2025/11/30/pacific-population">first post in the series</a> for more background. Today I’m looking at two charts relating to net migration and its role in Pacific islands’ population growth. These were used early in the presentation that these blog posts refer to, as part of building the story of the importance of people movements in understanding the Pacific.</p>
<p>These two plots are pretty straightforward. The data comes from the UN’s 2024 population prospects, a data source I’ve used in several blog posts before. The particular dataset we want is the “standard indicators”—these include net migration, natural change (ie births minus deaths), and total population for each year from 1950 to 2050; which is what we’re looking for for the charts today.</p>
<p>First downloading and wrangling the data. Pretty simple:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># draws charts of migration and natural change impact on growth</span><span class="w">
</span><span class="c1"># The source for this is UN population projections. Some details</span><span class="w">
</span><span class="c1"># on net migration aren't in the PDH.stat so we get them from</span><span class="w">
</span><span class="c1"># the UN website.</span><span class="w">
</span><span class="c1">#</span><span class="w">
</span><span class="c1"># Peter Ellis November 2025</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">readxl</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">
</span><span class="c1">#-------------Download and get ready the data---------------</span><span class="w">
</span><span class="n">df2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"pp24_standard.xlsx"</span><span class="w">
</span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">file.exists</span><span class="p">(</span><span class="n">df2</span><span class="p">)){</span><span class="w">
</span><span class="n">unlink</span><span class="p">(</span><span class="n">df2</span><span class="p">)</span><span class="w">
</span><span class="n">download.file</span><span class="p">(</span><span class="s2">"https://population.un.org/wpp/assets/Excel%20Files/1_Indicator%20(Standard)/EXCEL_FILES/1_General/WPP2024_GEN_F01_DEMOGRAPHIC_INDICATORS_COMPACT.xlsx"</span><span class="p">,</span><span class="w">
</span><span class="n">destfile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df2</span><span class="p">,</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"wb"</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="n">un_indicators</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_excel</span><span class="p">(</span><span class="n">df2</span><span class="p">,</span><span class="w"> </span><span class="n">skip</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">16</span><span class="p">)</span><span class="w">
</span><span class="n">picts</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w">
</span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w"> </span><span class="s2">"New Caledonia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Papua New Guinea"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Solomon Islands"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Guam"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Kiribati"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Marshall Islands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Micronesia (Fed. States of)"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Nauru"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Vanuatu"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Northern Mariana Islands"</span><span class="p">,</span><span class="s2">"Palau"</span><span class="p">,</span><span class="w"> </span><span class="s2">"American Samoa"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Cook Islands"</span><span class="p">,</span><span class="w">
</span><span class="s2">"French Polynesia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Niue"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Samoa"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tokelau"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tonga"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tuvalu"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Wallis and Futuna Islands"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># check all PICTs spelled correctly and in data</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">all</span><span class="p">(</span><span class="n">picts</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">un_indicators</span><span class="o">$</span><span class="n">`Region, subregion, country or area *`</span><span class="p">))</span><span class="w">
</span><span class="n">pict_indicators</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">un_indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">