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))

前の記事

Ma.09. 次元削減

次の記事

1031演習内容(Part2)