本章で使用する東大社研・若年パネル調査(JLPS-Y)wave1のオープンデータ(u001)は以下のURLで公開されていますので、取得してください。
https://csrda.iss.u-tokyo.ac.jp/infrastructure/urd/
分析結果の解釈については、書籍をご参照ください。以下はWindows10、R version 4.2.1で実行しています。
データを読み込むにあたって、作業場所の指定とそこにデータが置いてあることが前提になります。 R本体を操作している場合は、「ファイル」→「ディレクトリの変更」でデータの置いてある場所を指定するのが簡単です。 RStudioを操作している場合は、例えばデスクトップの「R」という名前のフォルダにデータがあるとすると
setwd("C:/Users/ユーザー名/Desktop/R")
を最初に実行するのがよいでしょう。ユーザー名は各自異なるので注意です。
使用するデータを読み込み、表示します。なお、R version 4.1以前で読み込む際には
data1 <- read.csv("ファイル名.csv", fileEncoding = "UTF-8-BOM")
のように、エンコードのオプションを指定する必要があります。version 4.2以降では必要ありませんので、以下ではオプションを指定していません。
data1 <- read.csv("u001.csv")
本章で使用するパッケージを読み込みますが、パッケージはインストールしておく必要があります。 以下のようにコマンドでインストールするか、RやRStudioからクリックでインストールすることもできます。
install.packages(“stargazer”, dependencies = TRUE)
パッケージの機能が使えるように読み込みます。
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6 ✔ purrr 0.3.4
## ✔ tibble 3.1.8 ✔ dplyr 1.0.10
## ✔ tidyr 1.2.0 ✔ stringr 1.4.1
## ✔ readr 2.1.2 ✔ forcats 0.5.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(car)
## 要求されたパッケージ carData をロード中です
##
## 次のパッケージを付け加えます: 'car'
##
## 以下のオブジェクトは 'package:dplyr' からマスクされています:
##
## recode
##
## 以下のオブジェクトは 'package:purrr' からマスクされています:
##
## some
library(psych)
##
## 次のパッケージを付け加えます: 'psych'
##
## 以下のオブジェクトは 'package:car' からマスクされています:
##
## logit
##
## 以下のオブジェクトは 'package:ggplot2' からマスクされています:
##
## %+%, alpha
library(e1071)
個人年収(ZQ47A)のデータを確認します。
table(data1$ZQ47A)
##
## 1 2 3 4 5 6 7 8 9 10 11 12 14 99
## 113 61 60 133 163 176 118 76 16 7 1 1 42 33
無回答(99)がいます。
配偶状態(ZQ50)と配偶者の生年-元号(ZQ52A)のクロス表を作成します。
table(data1$ZQ50,data1$ZQ52A)
##
## 1 2 8 9
## 1 0 0 637 0
## 2 83 255 0 7
## 4 4 10 0 4
未婚の回答者では配偶者の生年が非該当(8)になっています。
現在の働き方(JC_1)のデータを確認します。
table(data1$JC_1)
##
## 1 2 3 4 5 6 7 8 10 11 12 99
## 7 489 150 31 5 18 24 6 126 48 92 4
調査票の選択肢にはないデータ(10~12)があります。
最終学歴(ZQ23A)と最終学校の卒業(ZQ24)のクロス表を作成します。
table(data1$ZQ23A,data1$ZQ24)
##
## 1 2 3 9
## 1 12 0 0 2
## 2 208 26 2 5
## 3 159 12 16 4
## 4 119 3 8 1
## 5 246 18 103 1
## 6 25 4 15 0
## 7 2 0 0 0
## 9 1 0 0 8
それぞれの最終学歴に対して中退(2)、在学中(3)がいることがわかります。
表10-3 生活満足度(ZQ30D)の度数分布表
table(data1$ZQ30D)
##
## 1 2 3 4 5 9
## 163 431 257 103 37 9
無回答(9)がいます。
生活満足度をリコードします。
無回答をNAにリコードして、クロス表で確認します。
表10-5 クロス表でリコードの確認
data1$lsat=recode(data1$ZQ30D,'9=NA')
table(data1$ZQ30D,data1$lsat,useNA='ifany')
##
## 1 2 3 4 5 <NA>
## 1 163 0 0 0 0 0
## 2 0 431 0 0 0 0
## 3 0 0 257 0 0 0
## 4 0 0 0 103 0 0
## 5 0 0 0 0 37 0
## 9 0 0 0 0 0 9
個人年収をリコードします。
階級値をあてはめて、クロス表で確認します。
data1$resinc=recode(data1$ZQ47A, '1=0;2=12.5;3=50;4=100;5=200;6=300;7=400;8=500;9=700;10=1000;11=1500;12=2000;14:99=NA')
table(data1$ZQ47A, data1$resinc, useNA = "ifany")
##
## 0 12.5 50 100 200 300 400 500 700 1000 1500 2000 <NA>
## 1 113 0 0 0 0 0 0 0 0 0 0 0 0
## 2 0 61 0 0 0 0 0 0 0 0 0 0 0
## 3 0 0 60 0 0 0 0 0 0 0 0 0 0
## 4 0 0 0 133 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 163 0 0 0 0 0 0 0 0
## 6 0 0 0 0 0 176 0 0 0 0 0 0 0
## 7 0 0 0 0 0 0 118 0 0 0 0 0 0
## 8 0 0 0 0 0 0 0 76 0 0 0 0 0
## 9 0 0 0 0 0 0 0 0 16 0 0 0 0
## 10 0 0 0 0 0 0 0 0 0 7 0 0 0
## 11 0 0 0 0 0 0 0 0 0 0 1 0 0
## 12 0 0 0 0 0 0 0 0 0 0 0 1 0
## 14 0 0 0 0 0 0 0 0 0 0 0 0 42
## 99 0 0 0 0 0 0 0 0 0 0 0 0 33
精神的健康(ZA26A~ZQ26E)をリコードします。
リコードして、それぞれについてクロス表で確認します。ここではmutateを使っていますが、上で行ったように1つ1つリコードしてデータフレームに加えても問題ありません。
data1 <- data1 %>% mutate(
ZQ26Ar=recode(ZQ26A,'9=NA'),
ZQ26Br=recode(ZQ26B,'9=NA'),
ZQ26Cr=recode(ZQ26C,'1=5;2=4;3=3;4=2;5=1;9=NA'),
ZQ26Dr=recode(ZQ26D,'9=NA'),
ZQ26Er=recode(ZQ26E,'1=5;2=4;3=3;4=2;5=1;9=NA'))
table(data1$ZQ26A, data1$ZQ26Ar, useNA="ifany")
##
## 1 2 3 4 5 <NA>
## 1 30 0 0 0 0 0
## 2 0 114 0 0 0 0
## 3 0 0 333 0 0 0
## 4 0 0 0 264 0 0
## 5 0 0 0 0 247 0
## 9 0 0 0 0 0 12
table(data1$ZQ26B, data1$ZQ26Br, useNA="ifany")
##
## 1 2 3 4 5 <NA>
## 1 29 0 0 0 0 0
## 2 0 63 0 0 0 0
## 3 0 0 266 0 0 0
## 4 0 0 0 291 0 0
## 5 0 0 0 0 340 0
## 9 0 0 0 0 0 11
table(data1$ZQ26C, data1$ZQ26Cr, useNA="ifany")
##
## 1 2 3 4 5 <NA>
## 1 0 0 0 0 47 0
## 2 0 0 0 407 0 0
## 3 0 0 345 0 0 0
## 4 0 144 0 0 0 0
## 5 46 0 0 0 0 0
## 9 0 0 0 0 0 11
table(data1$ZQ26D, data1$ZQ26Dr, useNA="ifany")
##
## 1 2 3 4 5 <NA>
## 1 27 0 0 0 0 0
## 2 0 74 0 0 0 0
## 3 0 0 318 0 0 0
## 4 0 0 0 359 0 0
## 5 0 0 0 0 210 0
## 9 0 0 0 0 0 12
table(data1$ZQ26E, data1$ZQ26Er, useNA="ifany")
##
## 1 2 3 4 5 <NA>
## 1 0 0 0 0 78 0
## 2 0 0 0 321 0 0
## 3 0 0 453 0 0 0
## 4 0 106 0 0 0 0
## 5 30 0 0 0 0 0
## 9 0 0 0 0 0 12
5つの指標を合計して新しい変数(mhi_5)をつくるには、以下の①と②のどちらでもできます。
①基本的なコマンドを使う場合
data1$mhi_5 <- data1$ZQ26Ar+data1$ZQ26Br+data1$ZQ26Cr+data1$ZQ26Dr+data1$ZQ26Er
②mutateを使う場合
data1 <- data1 %>% mutate(mhi_5=ZQ26Ar+ZQ26Br+ZQ26Cr+ZQ26Dr+ZQ26Er)
5つの指標の合計点(mhi_5)を100点満点に換算して新しい変数(mhi5)を作成します。
data1 <- data1 %>% mutate(mhi5=(mhi_5-5)/20*100)
記述統計を見てデータがうまくできていそうか確認します。
summary(data1$mhi_5)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 6.0 15.0 18.0 17.7 20.0 25.0 18
summary(data1$mhi5)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 5.00 50.00 65.00 63.49 75.00 100.00 18
MHI-5のクロンバックのα係数を計算します。
attach(data1)
data2 <- data.frame(ZQ26Ar,ZQ26Br,ZQ26Cr,ZQ26Dr,ZQ26Er)
alpha(data2)
##
## Reliability analysis
## Call: alpha(x = data2)
##
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
## 0.79 0.79 0.8 0.42 3.7 0.011 3.5 0.73 0.34
##
## 95% confidence boundaries
## lower alpha upper
## Feldt 0.76 0.79 0.81
## Duhachek 0.77 0.79 0.81
##
## Reliability if an item is dropped:
## raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
## ZQ26Ar 0.76 0.76 0.78 0.45 3.2 0.013 0.034 0.34
## ZQ26Br 0.70 0.71 0.69 0.38 2.4 0.016 0.022 0.32
## ZQ26Cr 0.77 0.76 0.74 0.44 3.2 0.012 0.033 0.39
## ZQ26Dr 0.73 0.73 0.72 0.40 2.7 0.014 0.026 0.34
## ZQ26Er 0.77 0.77 0.75 0.45 3.3 0.012 0.030 0.41
##
## Item statistics
## n raw.r std.r r.cor r.drop mean sd
## ZQ26Ar 988 0.72 0.70 0.58 0.52 3.6 1.08
## ZQ26Br 989 0.83 0.81 0.79 0.69 3.9 1.05
## ZQ26Cr 989 0.68 0.70 0.61 0.50 3.3 0.93
## ZQ26Dr 988 0.78 0.77 0.72 0.63 3.7 0.98
## ZQ26Er 988 0.66 0.69 0.59 0.49 3.3 0.88
##
## Non missing response frequency for each item
## 1 2 3 4 5 miss
## ZQ26Ar 0.03 0.12 0.34 0.27 0.25 0.01
## ZQ26Br 0.03 0.06 0.27 0.29 0.34 0.01
## ZQ26Cr 0.05 0.15 0.35 0.41 0.05 0.01
## ZQ26Dr 0.03 0.07 0.32 0.36 0.21 0.01
## ZQ26Er 0.03 0.11 0.46 0.32 0.08 0.01
図10-3 生活満足度のヒストグラム
ggplot(data1, aes(x=lsat))+geom_bar(fill="black", colour="white")+xlab("生活満足度")+ylab("回答者数(人)")+theme_classic()
## Warning: Removed 9 rows containing non-finite values (stat_count).
表10-6 生活満足度の分布
table1 <- table(data1$lsat)
table1
##
## 1 2 3 4 5
## 163 431 257 103 37
prop.table(table1)
##
## 1 2 3 4 5
## 0.16448032 0.43491423 0.25933401 0.10393542 0.03733602
表10-7 性別と生活満足度のクロス表
table2 <- table(data1$lsat,data1$sex)
table2
##
## 1 2
## 1 69 94
## 2 202 229
## 3 138 119
## 4 64 39
## 5 19 18
prop.table(table2, margin=2)
##
## 1 2
## 1 0.14024390 0.18837675
## 2 0.41056911 0.45891784
## 3 0.28048780 0.23847695
## 4 0.13008130 0.07815631
## 5 0.03861789 0.03607214
独立性の検定を行います。
chisq.test(table2, correct=FALSE)
##
## Pearson's Chi-squared test
##
## data: table2
## X-squared = 12.977, df = 4, p-value = 0.01139
表10-8 MHI-5の記述統計
summary(data1$mhi5)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 5.00 50.00 65.00 63.49 75.00 100.00 18
var(data1$mhi5, na.rm=TRUE)
## [1] 326.2686
sd(data1$mhi5, na.rm=TRUE)
## [1] 18.06291
パッケージpsychのdescribe関数を利用する場合は以下のとおりです。fastオプションを使用しなければ次に計算する歪度も表示されます。
describe(data1$mhi5, fast=TRUE)
## vars n mean sd min max range se
## X1 1 982 63.49 18.06 5 100 95 0.58
歪度
skewness(data1$mhi5,na.rm=TRUE)
## [1] -0.5237318
図10-4 精神的健康度の分布
ggplot(data1, aes(x=mhi5))+geom_bar(fill="black", colour="white")+xlab("MHI-5")+ylab("回答者数(人)")+theme_classic()
## Warning: Removed 18 rows containing non-finite values (stat_count).
精神的健康度の男女(sex)の平均値の差について検定します。
等分散性の検定を行います。
var.test(mhi5~sex, data=data1)
##
## F test to compare two variances
##
## data: mhi5 by sex
## F = 0.82136, num df = 487, denom df = 493, p-value = 0.02966
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.6879528 0.9807405
## sample estimates:
## ratio of variances
## 0.8213632
分散が等しくない場合の、平均値の差の検定を行います。
t.test(mhi5~sex, data=data1, var.equal=FALSE)
##
## Welch Two Sample t-test
##
## data: mhi5 by sex
## t = 1.9312, df = 972.82, p-value = 0.05374
## alternative hypothesis: true difference in means between group 1 and group 2 is not equal to 0
## 95 percent confidence interval:
## -0.03586198 4.47984552
## sample estimates:
## mean in group 1 mean in group 2
## 64.61066 62.38866