2023年12月19日`

準備

  • 自分のPCまたは教室のPC

    1. ログイン

    2. ウェッブ・ブラウザー(Google Chrome など)を起動

      • Moodle の GES001 経済と経済学のサイトから、このスライドのページを表示(リンク「Rでデータサイエンス」の第2週)

      • (別のタブまたは ウィンドウで)PositCloud にログイン(アカウントのない人はサイン・アップ)[Posit.cloud]・[共有プロジェクト]

    3. RStudio を起動

      • 自分のPCにR と RStudio をインストールしていないひとは不要。

      • 最後に時間があれば、インストールについて説明します。[リンク]

第2週

12/14(TH) 所得と富の不平等の現状1

       所得と富の不平等の現状2

講義では、第2週、第3週とWorld Inequality report 2022を使って、所得と富の不平等について議論します。

12/19(TU) Rでデータサイエンス2:人口の少子高齢化  [Main]

講義 12月14日(木)所得と富の不平等

World Inequality Report 2022 [Link]

  • Executive Summary [Link]・[みんなのデータサイエンスへのリンク]

  • Introduction [Link]

  • Chapter 1 Global economic inequality: insights: [Link]

  • Chapter 2 Global inequality from 1820 to now: the persistence and mutation of extreme inequality [Link]

  • Chapter 3 Rich countries, poor governments [Link]

  • Chapter 4 Global wealth inequality: the rise of multimillionaires [Link]

演習 12月19日(火)人口と少子高齢化

世界開発指標(World Development Indicators)[Link]

練習1. WDI のサイトで、興味のある指標の、名前と、WDI コードを選んでください。できれば、選択した理由も記録してください。

人々(People)- 人口動態(Population dynamics)

総人口 Population, total:SP.POP.TOTL [Link]

出生率(千人)Birth rate, crude (per 1,000 people):SP.DYN.CBRT.IN [Link]

死亡率(千人)Death rate, crude (per 1,000 people):SP.DYN.CDRT.IN [Link]

若年労働人口率 Age dependency ratio, young (% of working-age population):SP.POP.DPND.YG [Link]

高齢者労働人口率 Age dependency ratio, old (% of working-age population):SP.POP.DPND.OL [Link]

演習の内容

  • パッケージ(Package)インストール(コンピュータに入れておく)

  • パッケージのロード(すぐ使えるようにする):tidyverse, WDI, showtext

  • データの取得:WDI()

  • 特定の条件にあった行を選択:filter()

  • 順番に、変形、視覚化などをするためのパイプ:|> (または、%>%

  • 折れ線グラフ:ggplot(…) + geom_point()

ファイルリンク

パッケージとそのインストール

R のパッケージは、R の機能を拡張するもので、コード(プログラム)や、データなどが収められています。インストール(install: コンピュータに入れて使えるようにすること)と、ロード(load: いつでも使えるようにすること)が必要です。

インストール

  • RStudio (または、Posit Cloud)の、上のメニュー・バーの、Tools の Pull down から、Install Packages を選び、Packages にパッケージ名を入れて、インストール。途中まで、パッケージ名を入れると下に候補がでるので、tab キーを押すと、自動入力になり、スペルミスが防げます。(右下の窓枠(Pane)の、Packages タブの、左上の Install を押しても、同じものが出ます。)

    • install.packages("パッケージ名") でも、インストールできます。

パッケージのロード

  • パッケージに収められている、コード(プログラム、命令)や、データをすぐに使えるようにします。library(パッケージ名) とします。

毎回 tidyverse と WDI を使いますから、R Notebook の最初には、次のコードチャンクを作成し、実行(Run)します。

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(WDI)
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb

日本語表示のために

図のタイトルなどが、日本語で文字化けしないようにおまじないです。

R Notebook の Preview で図のタイトルが小さい場合には、2行目(showtext_auto())を # で、コメントアウト。

showtext_auto(FALSE) 
showtext_auto() # for slides etc remove # 

データの読み込み(1)

データの読み込み方法はデータの種類などにより何種類もありますが、まず、WDI パッケージの、WDI という名前のデータ取得のコード(命令、プログラム)を使って、総人口のデータを読み込みます。それには、WDI コードと呼ばれる、SP.POP.TOTL を使います。

総人口 Population, total:SP.POP.TOTL

取得した、データをそのあとで、呼び出して使うために、<- を使って、名前をつけ(assign)ます。データの形式が、data frame と呼ばれるものなので、わたしは、いつも、最初に df として、簡単な名前をつけます。名前はなんでも良いのですが、覚えやすいように、また、日本語も受け付けますが、扱いが複雑になるので、英数のみ、スペースや、ハイフンは使えないので、区切りには、_ を使っています。

読み込みには、少し時間がかかります。

df_pop <- WDI(indicator = c(pop = "SP.POP.TOTL"))
## Rows: 16758 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): country, iso2c, iso3c
## dbl (2): year, pop
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データを見てみましょう

df_pop

データの読み込み(2)

総人口 Population, total:SP.POP.TOTL

出生率(千人)Birth rate, crude (per 1,000 people):SP.DYN.CBRT.IN

死亡率(千人)Death rate, crude (per 1,000 people):SP.DYN.CDRT.IN

若年労働人口率 Age dependency ratio, young (% of working-age population):SP.POP.DPND.YG

高齢者労働人口率 Age dependency ratio, old (% of working-age population):SP.POP.DPND.OL

df_pop_related <- WDI(indicator = c(pop = "SP.POP.TOTL",
                            birth_rate = "SP.DYN.CBRT.IN",
                            death_rate = "SP.DYN.CDRT.IN",
                            young = "SP.POP.DPND.YG",
                            old = "SP.POP.DPND.OL"))

保存と読み込み

write_csv(df_pop_related, "data/pop_related.csv")
df_pop_related <- read_csv("data/pop_related.csv")
## Rows: 16758 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): country, iso2c, iso3c
## dbl (6): year, pop, birth_rate, death_rate, young, old
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

head(df_pop_related)

データの構造(Structure)

str(df_pop_related[])
## tibble [16,758 × 9] (S3: tbl_df/tbl/data.frame)
##  $ country   : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ iso2c     : chr [1:16758] "AF" "AF" "AF" "AF" ...
##  $ iso3c     : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
##  $ year      : num [1:16758] 1960 1961 1962 1963 1964 ...
##  $ pop       : num [1:16758] 8622466 8790140 8969047 9157465 9355514 ...
##  $ birth_rate: num [1:16758] 50.3 50.4 50.6 50.7 50.8 ...
##  $ death_rate: num [1:16758] 31.9 31.3 30.8 30.4 29.9 ...
##  $ young     : num [1:16758] 75 75.1 75.4 75.7 76.2 ...
##  $ old       : num [1:16758] 5.1 5.08 5.05 5.02 5 ...

{glimpse(df_pop_extra)}

REGION

地域名に対応する iso2c コードの取得

REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")

地域名の確認

df_pop |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名確認

df_pop |> filter(!(iso2c %in% REGION)) |> 
  distinct(country, iso2c) |> arrange(country)

行の選択(filter()

  • filter(条件) :条件にあった行を選択抽出します。

    • filter(変数 ==文字列”) :変数が文字列と一致するものを抽出(= ではなく、== に注意)

    • filter(変数 %in% c(“文字列1”, …, “文字列n”) : 変数が文字列1 から 文字列n のどれかに一致したものを抽出

    • filter(!条件) :条件と一致しないものを抽出。

    • filter(条件1, 条件2):条件1 に一致するもののなかで、条件2 に一致するものを抽出。

    • filter(変数 < 数値):数値のときは、引用符なし。<=, >, >= も同様。

  • distinct(変数):変数の値が異なるもののみ抽出

  • drop_na(変数):変数の値が NA のものは、削除

パイプ・折れ線グラフ

  • |> : パイプ(pipe operator)次々にデータを送って実行させるために使います。

    • data |> filter(条件) は、filter(data, 条件) と同じ

    • data |> filter(iso2c %in% REGION) は、filter(data, iso2c %in% REGION) と同じ。

  • ggplot(aes(year, pop)) + geom_line():折れ線グラフを描画します。

    • aes(year, pop):year が x 軸、pop(総人口)を y 軸に指定します。

      • aes(x = year, y = pop) の省略形。
    • グラフの描画については、次回以降に少しずつ説明。

df_pop |> filter(country == "World") |> 
  ggplot(aes(year, pop)) + geom_line() + 
  labs(title = "世界の総人口")

df_pop |> filter(country == "Japan") |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "日本の総人口")

練習2. Germany と ドイツの部分を他の国名に変えてみてください。

COUNTRY <- "Germany"
df_pop |> filter(country == COUNTRY) |> 
  ggplot(aes(year, pop)) + geom_line() +
  labs(title = "ドイツの総人口")

練習3. COUNTRIES を編集して、イギリスとドイツとフランスと日本を他の国に変えてください。

COUNTRIES <- c("United Kingdom", "Germany", "France", "Japan")
df_pop |> filter(country %in% COUNTRIES) |> 
  ggplot(aes(year, pop, col =  country)) + geom_line() +
  labs(title = "イギリスとドイツとフランスと日本の総人口")

2022年の総人口の多い順

df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop))

2022年の総人口の TOP 11

pop_top11 <- df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop)) |> slice_head(n=11) |> pull(iso2c)
pop_top11
##  [1] "IN" "CN" "US" "ID" "PK" "NG" "BR" "BD" "RU" "MX" "JP"
dput(pop_top11)
## c("IN", "CN", "US", "ID", "PK", "NG", "BR", "BD", "RU", "MX", 
## "JP")

練習4. 1960年の総人口が多い順に五番目までリストしてください。

pop_top5 <- df_pop |> filter(!(iso2c %in% REGION)) |> filter(year == 2022) |> 
  arrange(desc(pop)) |> slice_head(n=5) |> pull(iso2c)
pop_top5
dput(pop_top5)

df_pop |> filter(iso2c %in% pop_top11) |>
  ggplot(aes(year, pop, color = iso2c)) + geom_line() + labs(title = "TOP11の総人口")

中国とインド以外のTOP11 の人口推移

df_pop |> filter(iso2c %in% pop_top11) |> 
  filter(!(iso2c %in% c("CN", "IN"))) |> 
  ggplot(aes(year, pop, color = country)) + geom_line() +
  labs(title = "中国とインド以外のTOP11の総人口")

地域ごとの人口推移

df_pop |> filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |>
  ggplot(aes(year, pop, color = country)) + geom_line() + labs(title = "地域ごとの総人口")

変形

wide データを long データに変形します。いずれ説明します。

df_pop_long <- df_pop_related |> 
  pivot_longer(pop:old, names_to = "name", values_to = "value")

出生率と死亡率

出生率(千人)Birth rate, crude (per 1,000 people):SP.DYN.CBRT.IN [Link]

死亡率(千人)Death rate, crude (per 1,000 people):SP.DYN.CDRT.IN [Link]

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(country == "World") |> drop_na(value) |> # NA value を削除
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "出生率、死亡率(1000人当たり)")

練習5. 国を選択して、出生率、死亡率のグラフを描いてください。

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(country == "World") |> drop_na(value) |> # NA value を削除
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "出生率、死亡率(1000人当たり)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の、出生率、死亡率(1000人当たり)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("Z4", "Z7", "ZJ", "ZQ", "XU", "8S", "ZG")) |> drop_na() |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "地域ごとの出生率・死亡率(1000人あたり)")

練習6. いくつかの国または地域の、出生率、死亡率のグラフを描いてください。

df_pop_long |> filter(name %in% c("birth_rate", "death_rate")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の、出生率、死亡率(1000人当たり)")

扶養家族の労働人口に対する割合

若年労働人口率 Age dependency ratio, young (% of working-age population):SP.POP.DPND.YG [Link]

年齢別扶養比率(若年)は、15歳未満の扶養家族の、15歳から64歳までの生産年齢人口に対する比率である。データは、生産年齢人口100人当たりの扶養家族の割合で示されている。

高齢者労働人口率 Age dependency ratio, old (% of working-age population):SP.POP.DPND.OL [Link to Metadata]

年齢別扶養比率(高齢)は、生産年齢人口(15~64歳)に対する高齢扶養家族(64歳以上)の比率。データは、生産年齢人口100人当たりの扶養家族の割合で示されている。

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country == "World") |> 
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "世界の高齢者・若年者扶養率")

練習7. 国を選択して、高齢者・若年者の扶養率のグラフを描いてください。

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country == "World") |> 
  ggplot(aes(year, value, col = name)) + geom_line() + 
  labs(title = "世界の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(iso2c %in% c("BD", "BR", "CN", "ID", "NG", "JP")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(iso2c %in% c("US", "GB", "CN", "DE", "FR", "JP", "IN")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "地域別の労働人口に対する高齢・若年扶養率(%)", 
       subtitle = "実線:高齢者、点線:若年者", x = "", col = "", linetype = "")

練習8. いくつかの国または地域の、高齢者・若年者の扶養率のグラフを描いてください。

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(iso2c %in% c("US", "GB", "CN", "DE", "FR", "JP", "IN")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + labs(title = "国々の高齢者・若年者扶養率")

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + facet_wrap(~country) + theme(legend.position = "none") +
  labs(title = "地域別の労働人口に対する高齢・若年扶養率(%)", 
       subtitle = "実線:高齢者、点線:若年者", x = "", y = "")

Default is fig. width = 7 and fig. height = 5

df_pop_long |> filter(name %in% c("young", "old")) |>
  filter(country %in% c("South Asia", "Europe & Central Asia", "Middle East & North Africa", 
"East Asia & Pacific", "Sub-Saharan Africa", "Latin America & Caribbean", "North America")) |> 
  ggplot(aes(year, value, col = country, linetype = name)) + 
  geom_line() + facet_wrap(~country, 2,4) + theme(legend.position = "none") +
  labs(title = "地域別の労働人口に対する高齢・若年扶養率(%)", 
       subtitle = "実線:高齢者、点線:若年者", x = "", y = "")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line() +
  labs(title = "日本の出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country == "Germany") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line() +
  labs(title = "ドイツの出生率・死亡率・労働人口に対する高齢・若年扶養率(%)")

df_pop_long |> filter(name %in% c("birth_rate", "death_rate", "young", "old")) |>
  filter(country  %in%  c("Germany", "Japan")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line() +
  labs(title = "ドイツと日本の出生率・死亡率\n労働人口に対する高齢・若年扶養率(%)")

df_pop_long |> filter(name == "pop") |>
  filter(country  %in%  c("Germany", "Japan")) |> drop_na(value) |>
  ggplot(aes(year, value, col = country)) + geom_line() +
  labs(title = "ドイツと日本の人口")

問い:どんなことがわかりますか。

復習

  • パッケージ(Package)の利用:

    • インストール(installation):Tools > Install Packages

    • ロード(load)library(tidyverse); library(WDI); library(showtext)

  • データの取得:WDI(indicator = c(pop = "SP.POP.TOTL"))

  • 特定の行の取得:filter(), drop_na(), distinct()

  • 折れ線グラフ

    • ggplot(aes(x = year, y = pop) + geom_line()

    • ggplot(aes(x = year, y = pop, col = country) + geom_line()

課題

提出はしなくて良いですが、ぜひ実際に手を動かして実行してください。

  1. WDI のサイトで、興味のある指標の、名前と、WDI コードを選んでください。できれば、選択した理由も記録してください。[練習1]

  2. Germany と ドイツの部分を他の国名に変えてみてください。[練習2]

  3. イギリスとドイツとフランスと日本を他の国に変えてください。[練習3]

  4. 1960年の総人口が多い順に五番目までリストしてください。[練習4]

  5. 国を選択して、出生率、死亡率のグラフを描いてください。[練習5]

  6. いくつかの国または地域の、出生率、死亡率のグラフを描いてください。[練習6]

  7. 国を選択して、高齢者・若年者の扶養率のグラフを描いてください。[練習7]

  8. いくつかの国または地域の、高齢者・若年者の扶養率のグラフを描いてください。[練習8]

参考文献