1031演習内容(Part3 個人ワーク用)

初回の演習で「1セル1情報(1 cell = 1 piece of information)」という Tidyデータの原則をお伝えしました。
つまり、1行が1つの観測対象、1列が1つの変数であるように整える、という考え方でした。

しかし、2時点・3時点のデータを結合するようになってくると、ついこの原則を忘れがちです。
たとえば、q1_1_x という変数名を見てみましょう。
Joinするときには意識していなかったと思うのですが、この「_x」という部分に「年度」の情報が埋め込まれています。
つまり、「年」という情報が列名に含まれており、実際には“1セル1情報”の原則を満たしていません。

横長Wideデータの問題

「横長Wide形式」のデータは見た目がきれいで、直感的に理解しやすいです。
しかし、時系列の分析段階になると不便さを感じることがあります。(全く手が止まることがあります)

たとえば――

  • 年度をX軸にして図にしにくい(変化グラフが描きにくい): 2022年・2024年・2026年……と年が増えると…
  • 年度をグループにして、複数の変数の代表値を比較がしにくい:同じ処理を年度ごとにそれぞれ書く必要があり、やや面倒くさい

このように「列が増えるたびに手作業が増える」「できないことが出てくる」構造がワイドデータの限界といえます。

縦長(ロング)形式の方法

Rでは tidyr::pivot_longer() 関数がその変換を行います。
構文は以下の通りです。

panel_long <- panel %>% 
  pivot_longer(cols = c(q1_1_22, q1_1_24),
               names_to = "year",
               values_to = "q1")

横に並んだ2列 q1_1_22, q1_1_24 を、
「どの列から来たか」=year と「その値」=q1 の 2列に分けて保存する(=long化)

(cols = c(q1_1_22, q1_1_24), …)
Long化の対象列を指定する。
この場合は q1_1_22 と q1_1_24 の2列だけをlong化し、それ以外の列(例:id, 性別など)はそのまま残ります。
(行は、対象列の数だけ増える→今回は2倍になります)

names_to = "year"
元の列名(q1_1_22 / q1_1_24)を、文字列として新しい列 year に入れる。
例:year 列には q1_1_x または q1_1_y が入る。あとでMutateやrecodeで値名を2022などに変換すると良い

values_to = "q1"
セルの中身(数値)を新しい列 q1に入れる。
つまり、q1_1_22 = 15 だった値は、year = "q1_1_22", q1 = 15 として保存される。

まとめ(実感のポイント)

  • Longにすると
    • group_by(year)一発集計できる
    • ggplot(aes(x=year, y=value))定型で作図できる
    • lm(value ~ factor)一般形でモデル化
  • Wideのままだと
    • 列ごとに同じ処理を何度も
    • 作図のたびに形を直す/凡例を自作
    • モデルで差分などの迂回が必要になる

なお、ロング化をしておくことで、発展的に以下のような分析も可能となります。
・繰り返し測定モデル(lmer)
・差分の差分法(DID)
・時間トレンドの可視化