教科書(今井 2018)第3章のRコードを整理する。

準備

tidyversepatchworkを使うので、(インストール済みでない場合はまずインストールして)パッケージを読み込む。

Macでggplot2を使うときに日本語の文字化けを避けるため、以下を実行する(Windowsユーザは実行しなくてよい)。

3.1 戦時における民間人の被害を測定する

アフガニスタンに関するサーベイデータ (afghan.csv) をダウンロードし、プロジェクト内のdataディレクトリに保存する。

データを読み込み、afghanという名前のデータフレームを作る。

## Parsed with column specification:
## cols(
##   province = col_character(),
##   district = col_character(),
##   village.id = col_integer(),
##   age = col_integer(),
##   educ.years = col_integer(),
##   employed = col_integer(),
##   income = col_character(),
##   violent.exp.ISAF = col_integer(),
##   violent.exp.taliban = col_integer(),
##   list.group = col_character(),
##   list.response = col_integer()
## )

データの中身を確認する。

## Observations: 2,754
## Variables: 11
## $ province            <chr> "Logar", "Logar", "Logar", "Logar", "Logar...
## $ district            <chr> "Baraki Barak", "Baraki Barak", "Baraki Ba...
## $ village.id          <int> 80, 80, 80, 80, 80, 80, 80, 80, 80, 35, 35...
## $ age                 <int> 26, 49, 60, 34, 21, 18, 42, 39, 20, 18, 33...
## $ educ.years          <int> 10, 3, 0, 14, 12, 10, 6, 12, 5, 10, 11, 0,...
## $ employed            <int> 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, ...
## $ income              <chr> "2,001-10,000", "2,001-10,000", "2,001-10,...
## $ violent.exp.ISAF    <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
## $ violent.exp.taliban <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ...
## $ list.group          <chr> "control", "control", "control", "ISAF", "...
## $ list.response       <int> 0, 1, 1, 3, 3, 2, 1, 3, 1, 2, 2, 3, 1, 1, ...
##       age          educ.years        employed         income         
##  Min.   :15.00   Min.   : 0.000   Min.   :0.0000   Length:2754       
##  1st Qu.:22.00   1st Qu.: 0.000   1st Qu.:0.0000   Class :character  
##  Median :30.00   Median : 1.000   Median :1.0000   Mode  :character  
##  Mean   :32.39   Mean   : 4.002   Mean   :0.5828                     
##  3rd Qu.:40.00   3rd Qu.: 8.000   3rd Qu.:1.0000                     
##  Max.   :80.00   Max.   :18.000   Max.   :1.0000

ISAFとタリバンから被害を受けたかどうかに関するクロス集計表。

##     Taliban
## ISAF         0         1
##    0 0.4953445 0.1318436
##    1 0.1769088 0.1959032

3.2 Rで欠損(欠測)データを扱う

ISAFから被害を受けたことを示す変数 violent.exp.ISAFの中身を確認する。

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  0.0000  0.0000  0.0000  0.3749  1.0000  1.0000      25

欠測が25個あることがわかる。 欠測を含めて分析するため、「被害なし」「被害あり」「無回答」という三つの異なる値をもつカテゴリ変数を新たに作り、isaf という名前をつけよう。そのために、ifelse() 関数を使う。この関数は、ifelse(条件式, 条件式の評価がTRUEのときの値・処理, FALSEのときの値・処理) という使い方をする。 以下のコマンドでは、まず is.na()で値が欠測 NA のときには999という値を、それ以外のときには元の値を入れるという処理をした後、factor()で因子型の変数を作る。 因子のラベルは、0なら「被害なし」、1なら「被害あり」、999なら「無回答」とする。 NA かどうかを判定するとき、変数 == NAという書き方はできないので注意が必要である。代わりに、is.na(変数) とする。

新しく作った変数を確認する。

##                 isaf
## violent.exp.ISAF 被害なし 被害あり 無回答
##             0        1706        0      0
##             1           0     1023      0
##             <NA>        0        0     25

同様に、タリバンからの被害も無回答も含めて検討するため、taliban という新たな変数を作る。

新しく作った変数を確認する。

##                    taliban
## violent.exp.taliban 被害なし 被害あり 無回答
##                0        1812        0      0
##                1           0      888      0
##                <NA>        0        0     54

これらの新しい変数を使ってクロス表を作り直す。

##           Taliban
## ISAF          被害なし    被害あり      無回答
##   被害なし 0.482933914 0.128540305 0.007988381
##   被害あり 0.172476398 0.190994916 0.007988381
##   無回答   0.002541757 0.002904866 0.003631082

3.3 1変量の分布をビジュアル化する

教科書で紹介されている図を、ggplot2パッケージを使って再現する。ggplot2の基本的な使い方については、図表の作成 を参照。

3.3.1 棒グラフ

棒グラフは geom_bar() を使って作る。yに何も指定しないと縦軸が度数(count)になるので、割合にするため、countをcountの合計で割ったものをyに指定する。

ISAFの被害を棒グラフにする。

タリバンの被害を棒グラフにする。

教科書のレイアウトのように二つの図を並べて表示する方法は色々あるが、最も簡単なのは、patchworkパッケージを使う方法である。パッケージを読み込んだら(このページの冒頭で読み込み済みのはず)、ggplot2で作った複数の図を + で繋げば、並べて表示してくれる。

3.3.2 ヒストグラム

ヒストグラムは geom_histogram() を使って作る。デフォルトの縦軸は度数 (count, frequency) である。縦軸を確率密度 (probability density) に変えたいときは、y = ..density.. とする。ビンの幅は binwidthで指定できる。また、ビンの縁の色はcolorで、ビンを塗りつぶす色は fill で指定できる。

回答者の年齢のヒストグラムを作る。

教育年数のヒストグラムを作る。

3.3.3 箱ひげ図

箱ひげ図は、geom_boxplot()を使って作る。

年齢の箱ひげ図を作る。

州ごとの教育年数の分布を箱ひげ図で確認する。

州別の被害報告割合を調べる。dplyr::group_by() を使えば簡単にできる。

## # A tibble: 5 x 3
##   province Taliban  ISAF
##   <chr>      <dbl> <dbl>
## 1 Helmand   0.504  0.541
## 2 Khost     0.233  0.242
## 3 Kunar     0.303  0.399
## 4 Logar     0.0802 0.144
## 5 Uruzgan   0.455  0.496

3.3.4 グラフの印刷と保存

ggplot2で作った図の保存については図表の作成 を参照。

3.4 標本調査

3.4.1 ランダム化の役割

村に関するデータ (afghan-village.csv) をダウンロードし、プロジェクト内のdataディレクトリに保存する。

データを読み込み、afghan_village という名前のデータフレームを作る。

## Parsed with column specification:
## cols(
##   altitude = col_double(),
##   population = col_integer(),
##   village.surveyed = col_integer()
## )

中身を確認する。

## Observations: 1,864
## Variables: 3
## $ altitude         <dbl> 1959.08, 2425.88, 2236.60, 1691.76, 1928.04, ...
## $ population       <int> 197, 744, 179, 225, 379, 617, 940, 1817, 213,...
## $ village.surveyed <int> 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...

このサーベイで抽出された村かどうかを示す village.surveyed 変数を因子型に変えた village_s という変数を新たに作ろう。

新たに作った変数を確認しておく。

##                 village_s
## village.surveyed 非抽出 抽出
##                0   1660    0
##                1      0  204

標高の箱ひげ図を作る。

対数人口の箱ひげ図を作る。

二つの箱ひげ図を並べて表示する。

3.4.2 無回答とその他のバイアスの発生要因

被害の有無に関する無回答の割合を州別に確認する。

## # A tibble: 5 x 3
##   province Taliban無回答 ISAF無回答
##   <chr>            <dbl>      <dbl>
## 1 Helmand        0.0304     0.0164 
## 2 Khost          0.00635    0.00476
## 3 Kunar          0          0      
## 4 Logar          0          0      
## 5 Uruzgan        0.0620     0.0207

アイテムカウント法(リスト実験)で、ISAFの支持率の推定する。

## # A tibble: 1 x 1
##   support
##     <dbl>
## 1  0.0490

床面効果と天井効果の確認。

##     グループ
## 回答 control ISAF taliban
##    0     188  174       0
##    1     265  278     433
##    2     265  260     287
##    3     200  182     198
##    4       0   24       0

3.5 政治的分極化を測定する

コードがないので省略。

3.6 2変量関係の要約

合衆国下院議員の理想点 (ideal point) に関するデータ (congress.csv) をダウンロードし、プロジェクト内のdataディレクトリに保存する。

データを読み込み、congress という名前のデータフレームを作る。

## Parsed with column specification:
## cols(
##   congress = col_integer(),
##   district = col_integer(),
##   state = col_character(),
##   party = col_character(),
##   name = col_character(),
##   dwnom1 = col_double(),
##   dwnom2 = col_double()
## )

中身を確認する。

## Observations: 14,552
## Variables: 7
## $ congress <int> 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 8...
## $ district <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 98, 98, 1, 2, 3, 4, 5, ...
## $ state    <chr> "USA", "ALABAMA", "ALABAMA", "ALABAMA", "ALABAMA", "A...
## $ party    <chr> "Democrat", "Democrat", "Democrat", "Democrat", "Demo...
## $ name     <chr> "TRUMAN", "BOYKIN  F.", "GRANT  G.", "ANDREWS  G.", "...
## $ dwnom1   <dbl> -0.276, -0.026, -0.042, -0.008, -0.082, -0.170, -0.12...
## $ dwnom2   <dbl> 0.016, 0.796, 0.999, 1.005, 1.066, 0.870, 0.990, 0.89...

政党を表す party の中身を確認してみる。

## party
##   Democrat      Other Republican 
##       8132         19       6401

民主党 (Democrat)、共和党 (Republican)、その他 (Other) の三つのカテゴリがあることがわかる。 作図するときに民主党と共和党だけをプロットするため、その他をNAにした新たな変数 party2 を作ろう。その際、民主党の値を blue、共和党の値を red にする。これは、これらの色をggpplot2で使うための工夫である。

作った変数の中身を確認してみよう。

##             party2
## party        blue  red <NA>
##   Democrat   8132    0    0
##   Other         0    0   19
##   Republican    0 6401    0

望み通りの変数ができた。

3.6.1 散布図

第80議会の散布図を作る。

第112議会の散布図を作る。

二つの図を並べて表示。

経済的リベラル/保守に関して、政党別、各議会別に、議員の理想点の中央値を計算する。

## # A tibble: 6 x 4
## # Groups:   party [1]
##   party    congress median party_color
##   <chr>       <int>  <dbl> <chr>      
## 1 Democrat       80 -0.126 blue       
## 2 Democrat       81 -0.207 blue       
## 3 Democrat       82 -0.179 blue       
## 4 Democrat       83 -0.174 blue       
## 5 Democrat       84 -0.223 blue       
## 6 Democrat       85 -0.231 blue

各党の中央値の時系列プロットを作る。

3.6.2 相関

合衆国のジニ係数に関するデータ (USgini.csv) をダウンロードし、プロジェクト内のdataディレクトリに保存する。

データを読み込み、gini という名前のデータフレームを作る。

## Parsed with column specification:
## cols(
##   X1 = col_integer(),
##   year = col_integer(),
##   gini = col_double()
## )

中身を確認する。

## Observations: 67
## Variables: 3
## $ X1   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17...
## $ year <int> 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 195...
## $ gini <dbl> 0.376, 0.371, 0.378, 0.379, 0.363, 0.368, 0.359, 0.371, 0...

各政党の理想点中央値を記録したdwnom1_med を変形して、分極化の程度(共和党と民主党の距離)を計算する変数distanceを作る。また、各議会に対応する年を表す変数yearを作る。

## # A tibble: 6 x 5
##   congress Democrat Republican distance  year
##      <int>    <dbl>      <dbl>    <dbl> <dbl>
## 1       80   -0.126      0.266    0.392  1948
## 2       81   -0.207      0.262    0.469  1950
## 3       82   -0.179      0.261    0.440  1952
## 4       83   -0.174      0.257    0.431  1954
## 5       84   -0.223      0.251    0.474  1956
## 6       85   -0.231      0.245    0.476  1958

党派性の違いの時系列グラフを作る。

ジニ係数の時系列グラフを作る。

並べて表示してみる。

相関係数を計算する。

## [1] 0.9418128

3.7 クラスター化

3.7.1 Rにおける行列

データフレームの作成はdata.frame()でできるが、この授業では、tibble::data_frame() を代わりに使う。tibble パッケージはtidyverseに含まれるので、tidyverseさえ読み込めば使える。 違いを確認しよう。

## [1] "data.frame"
## [1] "tbl_df"     "tbl"        "data.frame"

3.7.2 Rにおけるリスト

特に追加すべき情報はないので省略する。

3.7.3 k平均法

2クラスターの\(k\)平均法を、第80議会と第112議会で実行する。

2クラスターモデルの最終中心点を確認する。

##        dwnom1     dwnom2
## 1 -0.04843704  0.7827259
## 2  0.14681029 -0.3389293
##       dwnom1     dwnom2
## 1 -0.3912687 0.03260696
## 2  0.6776736 0.09061157

政党とクラスターのクロス集計表。

##             クラスター
## 政党         1   2
##   Democrat   132  62
##   Other        0   2
##   Republican   3 247
##             クラスター
## 政党         1   2
##   Democrat   200   0
##   Republican   1 242

4クラスターの\(k\)平均法を、第80議会と第112議会で実行する。

結果を図示する。



授業の内容に戻る