1031演習内容(Part1)
1031演習内容&目標
1.2時点データを分析可能な形に構築できる。
(データ結合、変数整合、パネル/反復横断の決定)
2.2時点間の「変化」を適切に記述・検定できる。
(t検定、クロス集計、マクネマー検定など)
3.「変化の要因」を特定する統計モデルを選択・実行・解釈できる。
(変化量モデル、ANCOVAモデル)
4.多時点のデータ操作に備えて、データ構造を操作できる。
(ワイド形式からロング形式への変換)
1.2時点データを分析可能な形に構築できる。
想像の通り、2022年データを処理し、2024年データに結合する準備には、工夫を要します。
結合時の準備として以下3点を考えます。
- 結合するための前提を整える(Keyをつくる)
- 測定の整合化(変数名、尺度、符号)の整合性
- 結合の方針を決める(パネル化 or 反復横断 かを決定する )
結合するための前提を整える(Keyをつくるまで)
テクニック1: read_excel での読み込みと不要行の削除
2022年データは、2024年のファイルよりも更に読み込みにくいExcelファイルです。
よく見ると、変数名になっているのがX行目、さらにその下にも、不要な行がありませんでしょうか?
skipオプションの活用:read_xl::read_excel()関数にはskip = nというオプションをつかう。- 読み込み後の
slice処理:skipで処理しきれない中途半端な行が残る場合、
slice()を使って不要な行番号(例:slice(-c(1:3))で1〜3行目)をごっそり削除するのが良い。
n2022c<-n2022 %>%
dplyr::slice(-c(1:3)) %>%
clean_names()
テクニック2: janitor::clean_names() による変数名の自動整形
2024年データと同様に、janitor::clean_names() 関数を用いて、変数名を使える形にします。
- 全ての文字を小文字に変換
- 空白や特殊文字をアンダースコア
_に置換 - Rで扱いやすいスネークケース(snake_case)形式に一括変換してくれます。
テクニック3: dplyr::select と「変数名ヘルパー」による列の削除・選択 (任意にて)
調査データには320の変数が含まれることもあり、うんざりします。
さらに、お気づきのことと思いますが、「q2」は邪魔以外の何物でもありません。
例えばq2がまるまるなくなると、その後の確認もスムーズになります。
(グループ発表で使用する可能性もあるため、2024年は残していますが…学部生では使っているグループがありました)
select():マイナスをつけると、それ以外の変数を選択できます。
例select(-starts_with("q2s"))のようにすることで、q2s以外の変数だけを選択することができます(q2sを一括で削除)
参考:
starts_with():"q2s1","q2s2","q2s3"… のように、共通の接頭辞(プレフィックス)を持つ変数群ends_with(): 共通の接尾辞(サフィックス)を持つ変数群(例:_t1,_t2)contains(): 変数名に特定の文字列を含む変数群(例:"age"を含む)
これらを select() と組み合わせることで、数十の変数を効率的に選択・削除できます。
n2022c1 <- n2022c %>%
select(-starts_with("q2s"))
テクニック4: across() によるデータ型の一括変換
2024年データも、数値であるべき列が「文字型(character)」と認識されていることがありました。
これは、データ内に入力された(または最初の読み込み時の不要な行たち)
に文字列や全角数字が混入している場合などに起こります。
dplyr::mutate() と across() を組み合わせることで、この問題を効率的に解決できます。
上手く変換できないときには、居住市区町村q41(だったと思います)のように欠損値になります。
Everythingで変換するときには、DF名を変更し、必ず全変数のデータチェックをしましょう。
mutate(across(everything(), as.numeric)):everything()は「すべての変数」を対象とする。
これにより、DF全列に対してas.numericを一度に適用できる。- 特定の変数群への適用:
across(starts_with("q"), as.numeric)
「”q”で始まる全ての変数」だけを数値型に変換する。
テクニック5(最重要): 2時点データ結合(Join)のための下準備
2時点のデータを結合(Join)する際、最も重要なのが「キー(Key)変数」です。
両方のデータ(2022年、2024年)に共通する個人の識別IDは存在するでしょうか?
探してみてください。それらは同じ変数名でしょうか?
dplyr::rename()による変数名の統一: 結合の前提、キー変数の「変数名」が両方のデータ(変数名・データ型)で完全に一致している必要があります。
2022年データで"samplenumber"、2024年データで"ID"となっている場合(変数名だけが違う場合)、どちらかに合わせる必要があります。
※rename(id = "samplenumber")のように、分析しやすい(または他方と共通の)変数名に変更しておくことは大切な準備作業となります。- なお2024年データは全てLabelledの変数型になっているので、こちらもIDの列をas.numericでMutateしておく必要があるでしょう。
測定の整合化(変数名、尺度、符号)の整合性
ここは皆さん、2024年で苦労した変数の処理です。
今回は変数名までは揃えませんが(質問紙を見ればわかるので)、尺度と符号は合わせておかないと、分析になりません。
というか誤った分析に走る可能性があるため、2024年度同じように処理をすることが求められます。
末尾に、僕が使ったコードを置いておきますが、ご自身でも取んでみようと(復習してみようと)思っていもらえますと嬉しいです。
Q1,3.q26(環境)は本来0-10であるが、1-11になっているので修正(accross(starts_with))
Q4,q38(最後の心理尺度系)は逆転項目なので修正(逆転処理の基本は、最大値+1 -.x なんだけど…)
尺度計算Kessler6とq3作成(rowSums(across())
ここまでできたら、一旦、RDSとして吐き出しておくことをオススメしたいです。
write_rds(n2022c4, "n2022.rds")
# -------------------------------------------------------------------------
rm(list = ls())
df24<-read_rds("naiman_c13.rds")
df22<-read_rds("n2022.rds")
結合の方針を決める(パネル化 or 反復横断 かを決定する )
2時点(T1とT2:Time1とTime2)の調査データをどう結合するかは、「分析目的」によって決まります。
「個人の変化」を見たいのか、「集団の傾向」を比較したいのかで、アプローチが異なります。
1. パネルデータ (Panel Data)
- 視点: 個人の変化を追う。
- 目的: 「同じ人」がT1(第1時点)からT2(第2時点)にかけてどう変化したかを分析する。
- 問い: 「Aさんの幸福度は上がったか?」
- 作り方: 共通ID(キー)を使い、2つのデータをInner_Joinする
2. 反復横断データ (Repeated Cross-Sectional Data)
- 視点: 集団の傾向を比べる。
- 目的: T1時点の集団とT2時点の集団を比較し、回答者全体の傾向の違いを分析する。
- 問い: 「日本人の平均的な幸福度はT1とT2で異なるか?」
- 作り方: 調査年(
year)変数をそれぞれに追加し、2つのデータを「縦」に結合 (Bind) する
今回は、変化を見る演習ですので、パネルデータでInner_joinをしていきます。
rm(list = ls())
df24<-read_rds("naiman_c13.rds")
df22<-read_rds("n2022.rds")
#2024の方もKey変数をMutateする。結合Keyの4回IDをニューメリック。q2をDrop。
df24 <- df24 %>% mutate(2022年と同じ変数名 = as.numeric(hq0_4))
df24 <- df24 %>% select(-starts_with("q2s"))
#InnerJoin
njoin <- inner_join(df22, df24, by = "2022年と同じ変数名",
suffix = c("_22", "_24"))
# write_rds(njoin, "njoin.rds")
カンペ
Q1,3.q26(環境)は本来0-10であるが、1-11になっているので修正
n2022c2 <- n2022c1 %>%
mutate(
q1_1 = q1_1 – 1,
across(starts_with(“q3s”), ~ .x-1 ),
across(starts_with(“q26_”), ~ .x-1 ),
q27_1 = q27_1 – 1
)Q4,q38(最後の心理尺度系)は逆転項目なので修正
n2022c3 <- n2022c2 %>%
mutate(
across(starts_with(“q38_”), ~ 5 – .x),
across(starts_with(“q4s”), ~ 11 – .x)
)尺度計算Kessler6とq3
n2022c4 <- n2022c3 %>%
mutate(kessler6 = q38_8 + q38_9 + q38_10 + q38_11+ q38_12 + q38_13)n2022c4<-n2022c4 %>%
mutate(q3 = rowSums(across(starts_with(“q3s”)), na.rm = TRUE))

