教科書(今井 2018)第2章のRコードを整理する。
データ resume.csv をプロジェクト内のdataディレクトリにダウンロードし、保存する。
download.file(url = "http://qss.princeton.press/student-files/CAUSALITY/resume.csv",
destfile = "data/resume.csv")
このファイルをread::read_csv()
で読み込み(readrパッケージはtidyverseに含まれている)、resumeという名前のオブジェクトを作る。
## Parsed with column specification:
## cols(
## firstname = col_character(),
## sex = col_character(),
## race = col_character(),
## call = col_integer()
## )
データの中身を確認する。
## Observations: 4,870
## Variables: 4
## $ firstname <chr> "Allison", "Kristen", "Lakisha", "Latonya", "Carrie"...
## $ sex <chr> "female", "female", "female", "female", "female", "m...
## $ race <chr> "white", "white", "black", "black", "white", "white"...
## $ call <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## firstname sex race
## Length:4870 Length:4870 Length:4870
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## call
## Min. :0.00000
## 1st Qu.:0.00000
## Median :0.00000
## Mean :0.08049
## 3rd Qu.:0.00000
## Max. :1.00000
人種 (race) と連絡がきたかどうか (call) のクロス表を作る。
## call
## race 0 1
## black 2278 157
## white 2200 235
周辺度数(各行、各列の合計)を加える。
## call
## race 0 1 Sum
## black 2278 157 2435
## white 2200 235 2435
## Sum 4478 392 4870
審査通過率を計算する。
## [1] 0.08049281
人種ごとの審査通過率を計算する。
## # A tibble: 2 x 2
## race passage
## <chr> <dbl>
## 1 black 0.0645
## 2 white 0.0965
黒人らしい名前の審査通過率を計算する。そのために、dplyr::filter()
を使って、データフレーム一部を切り取る(dplyrパッケージはtidyverseに含まれている)。
## [1] 0.06447639
黒人のみのデータフレームを作る。
このデータフレームを使って審査通過率を計算する。
## [1] 0.06447639
黒人女性らしい名前の観測対象を残し、変数は call と firstname のみ残す。
resumeBf <- resume %>%
filter(race == "black", sex == "female") %>%
select(call, firstname)
head(resumeBf)
## # A tibble: 6 x 2
## call firstname
## <int> <chr>
## 1 0 Lakisha
## 2 0 Latonya
## 3 0 Kenya
## 4 0 Latonya
## 5 0 Aisha
## 6 0 Aisha
黒人男性のデータフレームを作る。
白人女性のデータフレームを作る。
白人男性のデータフレームを作る。
元のデータフレームの観測の数と比べる。
## [1] 4870
## [1] 4870
女性同士の人種格差を計算する。
## [1] 0.03264689
男性同士の人種格差を計算する。
## [1] 0.03040786
黒人女性であることを示すBlackFemaleという変数を作る。
人種と性別の組み合わせで4つのタイプに分類する type という変数を作る。
resume <- resume %>%
mutate(type = ifelse(BlackFemale == 1, "BlackFemale", NA)) %>%
mutate(type = ifelse(race == "black" & sex == "male",
"BlackMale", type),
type = ifelse(race == "white" & sex == "female",
"WhiteFemale", type),
type = ifelse(race == "white" & sex == "male",
"WhiteMale", type))
変数typeのクラスを確認する。
## [1] "character"
typeを因子に変える。
##
## BlackFemale BlackMale WhiteFemale WhiteMale
## 1886 549 1860 575
名前 (firstname) を因子型に変え、それぞれの名前の審査通過率を計算し、それを昇順に並べ替える。
resume %>%
mutate(firstname = factor(firstname)) %>%
group_by(firstname) %>%
summarize(passage = mean(call)) %>%
arrange(passage)
## # A tibble: 36 x 2
## firstname passage
## <fct> <dbl>
## 1 Aisha 0.0222
## 2 Rasheed 0.0299
## 3 Keisha 0.0383
## 4 Tremayne 0.0435
## 5 Kareem 0.0469
## 6 Darnell 0.0476
## 7 Tyrone 0.0533
## 8 Hakim 0.0545
## 9 Tamika 0.0547
## 10 Lakisha 0.055
## # ... with 26 more rows
データファイル (social.csv)[http://qss.princeton.press/student-files/CAUSALITY/social.csv] をダウンロードしてdataディレクトリに保存する。
download.file(url = "http://qss.princeton.press/student-files/CAUSALITY/social.csv",
destfile = "data/social.csv")
データを読み込み、中身を確認する。
## Parsed with column specification:
## cols(
## sex = col_character(),
## yearofbirth = col_integer(),
## primary2004 = col_integer(),
## messages = col_character(),
## primary2006 = col_integer(),
## hhsize = col_integer()
## )
## Observations: 305,866
## Variables: 6
## $ sex <chr> "male", "female", "male", "female", "female", "mal...
## $ yearofbirth <int> 1941, 1947, 1951, 1950, 1982, 1981, 1959, 1956, 19...
## $ primary2004 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0,...
## $ messages <chr> "Civic Duty", "Civic Duty", "Hawthorne", "Hawthorn...
## $ primary2006 <int> 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1,...
## $ hhsize <int> 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 1, 2, 2, 1, 2, 2, 1,...
異なるメッセージ (messages) を受け取ったグループの投票率を調べよう。
## # A tibble: 4 x 2
## messages mean
## <chr> <dbl>
## 1 Civic Duty 0.315
## 2 Control 0.297
## 3 Hawthorne 0.322
## 4 Neighbors 0.378
コントロールグループの投票率。
各グループの投票率からコントロールグループの投票率を引く
## # A tibble: 4 x 2
## messages dif
## <chr> <dbl>
## 1 Civic Duty 0.0179
## 2 Control 0
## 3 Hawthorne 0.0257
## 4 Neighbors 0.0813
年齢変数を作成する。
メッセージ別の年齢の平均値を確かめる。
## # A tibble: 4 x 2
## messages age
## <chr> <dbl>
## 1 Civic Duty 49.7
## 2 Control 49.8
## 3 Hawthorne 49.7
## 4 Neighbors 49.9
メッセージ別のprimy2004の平均値を確かめる。
## # A tibble: 4 x 2
## messages primary2004
## <chr> <dbl>
## 1 Civic Duty 0.399
## 2 Control 0.400
## 3 Hawthorne 0.403
## 4 Neighbors 0.407
メッセージ別のhhsize(世帯人数)の平均値を確かめる。
## # A tibble: 4 x 2
## messages hhsize
## <chr> <dbl>
## 1 Civic Duty 2.19
## 2 Control 2.18
## 3 Hawthorne 2.18
## 4 Neighbors 2.19
データファイル (minwage.csv)[http://qss.princeton.press/student-files/CAUSALITY/minwage.csv] をダウンロードしてdataディレクトリに保存する。
download.file(url = "http://qss.princeton.press/student-files/CAUSALITY/minwage.csv",
destfile = "data/minwage.csv")
データを読み込み、中身を確認する。
## Parsed with column specification:
## cols(
## chain = col_character(),
## location = col_character(),
## wageBefore = col_double(),
## wageAfter = col_double(),
## fullBefore = col_double(),
## fullAfter = col_double(),
## partBefore = col_double(),
## partAfter = col_double()
## )
## Observations: 358
## Variables: 8
## $ chain <chr> "wendys", "wendys", "burgerking", "burgerking", "kf...
## $ location <chr> "PA", "PA", "PA", "PA", "PA", "PA", "PA", "PA", "PA...
## $ wageBefore <dbl> 5.00, 5.50, 5.00, 5.00, 5.25, 5.00, 5.00, 5.00, 5.0...
## $ wageAfter <dbl> 5.25, 4.75, 4.75, 5.00, 5.00, 5.00, 4.75, 5.00, 4.5...
## $ fullBefore <dbl> 20.0, 6.0, 50.0, 10.0, 2.0, 2.0, 2.5, 40.0, 8.0, 10...
## $ fullAfter <dbl> 0.0, 28.0, 15.0, 26.0, 3.0, 2.0, 1.0, 9.0, 7.0, 18....
## $ partBefore <dbl> 20.0, 26.0, 35.0, 17.0, 8.0, 10.0, 20.0, 30.0, 27.0...
## $ partAfter <dbl> 36, 3, 18, 9, 12, 9, 25, 32, 39, 10, 20, 4, 13, 20,...
## chain location wageBefore wageAfter
## Length:358 Length:358 Min. :4.250 Min. :4.250
## Class :character Class :character 1st Qu.:4.250 1st Qu.:5.050
## Mode :character Mode :character Median :4.500 Median :5.050
## Mean :4.618 Mean :4.994
## 3rd Qu.:4.987 3rd Qu.:5.050
## Max. :5.750 Max. :6.250
## fullBefore fullAfter partBefore partAfter
## Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.00
## 1st Qu.: 2.125 1st Qu.: 2.000 1st Qu.:11.00 1st Qu.:11.00
## Median : 6.000 Median : 6.000 Median :16.25 Median :17.00
## Mean : 8.475 Mean : 8.362 Mean :18.75 Mean :18.69
## 3rd Qu.:12.000 3rd Qu.:12.000 3rd Qu.:25.00 3rd Qu.:25.00
## Max. :60.000 Max. :40.000 Max. :60.00 Max. :60.00
PAとNJのデータフレームを分ける。
賃金が5.05ドル以下のファーストフード店の割合。
## [1] 0.9106529
## [1] 0.003436426
## [1] 0.05970149
## [1] 0.9402985
常勤労働者の割合を表す変数を作る。
minwageNJ <- minwageNJ %>%
mutate(fullPropAfter = fullAfter / (fullAfter + partAfter))
minwagePA <- minwagePA %>%
mutate(fullPropAfter = fullAfter / (fullAfter + partAfter))
平均の差を計算する。
## [1] 0.04811886
ファーストフード店の割合を確認する。
## .
## burgerking kfc roys wendys
## 0.4054983 0.2233677 0.2508591 0.1202749
## .
## burgerking kfc roys wendys
## 0.4626866 0.1492537 0.2238806 0.1641791
バーガーキングのみ切り出す。
minwageNJ.bk <- minwageNJ %>% filter(chain == "burgerking")
minwagePA.bk <- minwagePA %>% filter(chain == "burgerking")
常勤雇用の割合を比較する。
## [1] 0.03643934