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)
・時間トレンドの可視化

