以下の指標の中から、一つを選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。
それぞれについて考察(気づいたこと、疑問など)を記す
2023.1.27. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。
Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]
School enrollment, primary (% gross):SE.PRM.ENRR [Link]
School enrollment, secondary (% gross):SE.SEC.ENRR [Link]
School enrollment, tertiary (% gross):SE.TER.ENRR [Link]
Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]
Incidence of HIV (% of uninfected population ages 15-49):SH.HIV.INCD.ZS [Link]
School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]
Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]
Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]
Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]
Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]
名前と、ID は、ファイル名にもつけるように、指示がありますが、このファイルの一番上にも、ありますね。これが、Note の最初に来るのですから、できれば、表題も含めて、適切に変更することが必要です。
Posit Cloud のときは、まず、Login し、intro2rj のプロジェクトに入り、 ファイルから、ges001 のフォルダーを選択して、移動します。この中に、data フォルダが作成されていることを確認し、このges001 に、新しく作成したファイルを保存します。新しく作成したファイルの入っているフォルダーの中に、data フォルダがあることが大切です。そこに、データを書き込みます。
RStudio の場合には、まずは、あたらしい Project を作成します。File > New Project から作成します。すでに、作成してある場合は、それを、Open Project や、Recent Project から開きます。その中に、新しいファイルを作成します。作成したフォルダーに、data フォルダがあることを確認してください。なければ、作成してください。新しく作成したファイルの入っているフォルダーの中に、data フォルダがあることが大切です。そこに、データを書き込みます。
Preview で確認。
Web Browser で、w5_c123456.nb.html など、R Notebook を見て確認。
もし、問題があれば、Run ボタンの右の三角から、Run All を選択し、エラーがでないか確認。
最初にもどる。
RStudio の場合には、自分の PC に作成したファイルがありますから、問題ないと思いますが、Posit Cloud で作成した場合には、Files Tab の下の、提出したいファイルの左にあるチェックボックスをチェックします。Files Tab の 右端にある、ギアマーク(More と書いてありますがスペースの関係で見えないかもしれません) の三角印押すと、中程に、Export があり、それを選択すると、ダウンロードできます。それを提出してください。末尾が、nb.html となっている R Notebook ファイルを提出していただくのがよいですが、よくわからないときは、nb.html ファイルと、Rmd (R Markdown)ファイルと両方提出してください、
Exploratory Data Analysis 探索的に、データから、情報を得ながら、考え、自分の覚書(ノート)や、他者とコミュニケーションするための、記録を残すことが、主ですから、コピー・ペーストで終わりではありません。
図に名前をつけたり、いくつかの国について調べてみたり、Histogram の幅を変えて見たりしてください。気づいたことや、疑問は、いくつ書いても構いません。特に、疑問に思ったことを書くことは、探索的データ分析の鍵です。
最初から、少しずつ、見ていきましょう。以下では、国の教育に関する支出を例に説明していきます。
データ名:国の教育関連支出(GDP比 %)図の表題のためにも重要です。
データコード:SE.XPD.TOTL.GD.ZS データを読み込む時に、これに、“” をつけて読み込みます。
変数名:ed_exp
データを読み込む時に、コードは長いし、直感的にはわからないので、わかりやすい名前にしておきます。これが、変数名、列名となりますから、これを選択することが多くなります。つまり、これを、書き込むことが多くなる、大切なものです。
概要:教育に対する政府の一般支出(経常、資本、移転)は GDP の割合で表されます。これには、国際資金源から政府への送金によって資金提供された支出が含まれます。一般政府とは通常、地方自治体、地域政府、中央政府を指します。データの意味がわからなければ、分析はできません。数字は、金額なのか、百分率(%)なのか、特別な単位なのか、国全体なのか、政府の予算なのか、一人当たりなのかなど。
いつもするおまじないのようなものですね。パッケージ(R の機能を拡張するもの)をふたつ読み込みます。
library(tidyverse)
library(WDI)
WDI
パッケージを使って、直接データをダウンロードし、変数名を、ed_exp
に指定。
この次のコードがすべての鍵のような部分です。WDI というパッケージで、データを読み込みます。それには、indicator として、変数名と、コードが必要です。c() の c は、combine の略で、情報をまとめています。この場合は、コードと、変数名を = で結びつけています。それを、df_ed_exp という名前のデータとします。わたしは、主たる変数名を、df (data frame の略)につけましたが、わかりやすい方法を使うのがよいでしょう。しかし、日本語や、space や、特殊文字は、使ってはいけません。_ と . は問題ありません。
df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
データフォルダーに、ed_exp.csv と名前をつけて書き込みます。べつに、決まったルールはありませんが、csv (comma separated value)で書き込みますから、最後は、csv とつけます。これを、拡張子と言います。ここで、エラーが出たら、最初に、ファイルのところで書いたように、現在編集している、Rmd ファイルを Files Tab で探し、同じ、フォルダーに、data フォルダがなければ、書き込めません。“data/ed_exp.csv” は、data フォルダの中に、ed_exp.csv というファイルとして書き込めということですから。
write_csv(df_ed_exp, "data/ed_exp.csv")
上のステップで、保存したものを、読み込みます。このステップで、違うファイルを読み込むと、あとは、すべて、読み込んだデータで計算されます。ここが、“data/under_6.85.csv” などとなっていたら、そのデータを読み込むことになります。注意してください。
df_ed_exp <- read_csv("data/ed_exp.csv")
Rows: 16758 Columns: 5── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, ed_exp
ℹ 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.
ここで、どんな列名があるか、また、ed_exp がある列に入っているか確認してください。読み込む時に使った、ed_exp という列があることを確認してください。右の方に隠れていることもあります。その時は、右端の三角印を押すと見ることができます。16,758行x5列あることがわかります。列は変数です。下の数字を書いてあるところ、または、その右のNext を押すと次のページを、100ページ目(1000データ)まで見ることができます。
df_ed_exp
列名の確認ができます。最初の方のデータと、それぞれの変数が数なのか文字なのかもわかります。
str(df_ed_exp)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
$ iso2c : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
$ iso3c : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
$ year : num [1:16758] 2022 2021 2020 2019 2018 ...
$ ed_exp : num [1:16758] 3.91 4.63 4.35 4.54 4.74 ...
- attr(*, "spec")=
.. cols(
.. country = col_character(),
.. iso2c = col_character(),
.. iso3c = col_character(),
.. year = col_double(),
.. ed_exp = col_double()
.. )
- attr(*, "problems")=<externalptr>
データには、地域と国の両方が含まれています。地域の iso2c のリストを、REGION に入れておきます。(ちょっと数を増やしました。WDI のすべてのデータに対応できるように。ここで使うデータの場合には、以前のものでも問題ないと思います。)
REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5",
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6",
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1",
"F6", "M1", "M2", "N6", "OE", "R6", "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", "ZB", "ZF", "ZG", "ZH", "ZI",
"ZJ", "ZQ", "ZT")
このデータに含まれている、地域名のリストです。地域名を選択するときに、使います。filter と、distinct は何度も使っています。iso2c の列の値が、REGION に含まれている行だけ選択しますす。distinct はその中で、country と iso2c だけを取り出しますが、同じものが何回も表示されることをさけるために、distinct を使います。各年ごとに、データがありますから、distinct のところを追加指定おかないと長いものが表示されます。
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
国名を選択する時に使います。地域名の時とは、filter の部分が異なっています。! は否定です。つまり、iso2c が REGION に入っていないもの、つまり、地域ではなく国だけを選択します。
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)
SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")
自分で国を選択してください。ただしい綴が大切ですから、上のリストを使って確認します。ここを変更して、分析をもう一度すれば、違う国についての情報から分析ができます。
CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")
このグラフを見て、各年のデータがどれくらいあるか確認します。drop_na(ed_exp) は、ed_exp の値が、NA のものを削除するという意味です。すなわち、データがある行だけ取り出して、その数を棒グラフで表しています。いろいろなことがわかりますよね。いつまでのデータがあるかとか、とても少ない年があるとか、いつごろからデータがあるかなど。それも、気づいたこととして書いておくことをお勧めします。
df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
ggplot(aes(year)) + geom_bar()
実際の分析の前に、自分がある程度知っている国について見てみることで、知識の確認にもなりますし、データの意味も、確認できます。ed_exp の数が、何なのか、上のデータ情報が必要になります。なんでしたか。本当は、GDP の 3% がいくらぐらいかも知っていると良いですね。日本のGDP 知っていますか。これは、Google でも、教えてくれると思います。
df_ed_exp |> filter(country == "Japan") |>
drop_na(ed_exp) |> arrange(desc(year))
案外、知らないことが多いものです。いろいろと気づくことありますよね。疑問に思うことも。おそらく。折れ線グラフを描く時は aes(year, ed_exp) で、x, y の値を指定し、geom_line() を使います。filter(country == “Japan”) は日本を選択(country 変数が Japan と一致するのもののみ選択。country は、文字変数だったので、引用符(半角)で囲みます。)。== としているところと引用符(半角)をつけていることに注意して下さい。drop_na(ed_exp) をつけないと、1960年からのグラフで最初は値がないものができます。drop_na(ed_exp) |> を、選択して、Control を押しながら、X(Mac では、Command を押しながら X )をすると、Cut でき、消えますから、それで、Run してみると、確認できます。もとに戻す時は、Control を押しながら、V(Mac では、Command を押しながら V)つまりペーストすれば戻ります。(ちょっと試してみると、すこし驚くこともあります。途中で、データがない年もあるのですね。)
df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
ggplot(aes(year, ed_exp)) + geom_line()
ちょっと書いて見ました。みなさんは、どんなことを気づかれましたか。他の人が気づいたことも知りたいですよね。それも、グループや、仲間で勉強するメリットです。
気づいたこと・疑問
1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。
2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。
いよいよ授業と関係した分析です。何がわかりますか。たくさん、気づいたこと、疑問を書いてください。
df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))
参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。
単純に年毎に平均をとると、ギザギザするので、傾向をみるには、滑らかな曲線で近似するのも有効です。
df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
geom_smooth(formula = 'y~x', method = "loess", se = FALSE)
気づいたこと・疑問
ここには、上でみなさんが選択した、CHOSEN_COUNTRIES に入っている国の分析が現れます。このグラフを見て、国を変えてみるのも良いかもしれません。または、CHOSEN_COUNTRIES2 などとして、他のグループについても調べてみるのも一つです。上の、C ボタンから、あたらしい Code Chunk を追加して書いてみるのも良いでしょう。変なことが起こったら、Control を押しながら Z (Mac では、Command を押しながら Z)をすると、ひとつ前に戻ることができます。うまくいかない時もありますが。時々 Save をして、問題が起こったら、Save せずに、閉じて、もう一度 Rmd ファイルを立ち上げるのも一つです。または、Save As で、別名で保存して、Files から前のものを立ち上げると、だいたい残っています。コピー・ペーストで新しいファイルを作る時は、Source Editor に変更して コピー・ペーストしたほうが安全です。
df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))
参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。
df_ed_exp |> filter(country %in% CHOSEN_COUNTRIES) |> drop_na(ed_exp) |>
ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
geom_smooth(formula = 'y~x', method = "loess", se = FALSE)
データの数から、まずは、2020年について見てみる。
例では、2010 になっていました。例の、under_6.85 の指標は NA が多く、特に、日本のも書き込もうとすると、2010 年にしないといけませんでした。日本の値があり、南部アフリカ関税同盟の国の値もあるところを選びたかったからです。そうでなければ、新しいデータといことで、このデータの場合には、2020 でなくても、2021 でも大丈夫そうですね。そのあたりを、決めるのが最初の方の棒グラフで、データの数を見たり、日本の値をみたあたりから、考えています。また、ここでは、binwidth = 1 としましたが、binwidth や、bins の値を変えると、ヒストグラムが変わるのでしたよね。適切な値にする必要があります。「適切」の基準はありませんが、binwidth は、x 軸のメモリを見て、幅を決めますが、bins は、幾つに分けるかの個数です。ヒストグラムは、aes(ed_exp) で、度数分布を作成する変数を指定し、geom_histogram を使います。
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
drop_na(ed_exp) |>
ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)
参考:SACU の5カ国の値を縦線で書き込むには下のようにします。
このデータに関しては、5カ国とも値がありますね。それが、下のグラフの赤線五本になって現れています。
df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE)
参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。
JP の値は、この指標に関する、JP の値です。例(under_6.85)では、0.5 ですが、実際には、この上の方に、ある、日本の部分の値から、2020 年は、3.416981 であることがわかりますから、それを下のように、代入します。ここには、ed_exp を入れるところがたくさんありますね。少し、複雑なグラフです。
JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
drop_na(ed_exp) |>
ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")
ちょっと複雑になっているのは、大きい順に並べ替えなどをしているからです。なにもしないと、この場合は、国名のアルファベッット順になります。棒グラフは、geom_col() を使います。
df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |>
filter(!(iso2c %in% REGION))|>
arrange(desc(ed_exp)) |> head(10) |>
ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() +
coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")
下のように書いてありましたが、コピーのエラーで、最後、closed quatation mark がありませんでした。ただしくは、y = “poverty rate (under $6.85 per day)”) でないといけません。スライドや、テンプレートの上の実行例では正しかったのですが。ごめんなさい。
df_under_6.85 |> filter(year == 2019) |> drop_na(under_6.85) |>
filter(!(iso2c %in% REGION))|>
arrange(under_6.85) |> head(10) |>
ggplot(aes(fct_rev(fct_reorder(country, under_6.85)), under_6.85)) + geom_col() +
coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "poverty rate (under $6.85 per day))
df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |>
filter(!(iso2c %in% REGION))|>
arrange(ed_exp) |> head(10) |>
ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() +
coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")
多くの場合は、変数名やデータ名が適切に変更されていないことが原因になっているようです。
必ず、それぞれの図などで、気づいたこと、疑問点を書いてください。探索的データ分析ですから、これで終わりではなく、始まりです。もう少し、探索の旅を一緒にしていきましょう。