統計解析を行うためのデータ形式 - Long Format と Wide Format

初めて統計解析の演習では、**t検定** をやってみることが多いと思います。
その後、**対応のある t検定** に進んだとき、データのフォーマットが違うことに気づきます。

当たり前のことですし、ちゃんと「データには Long Format と Wide Format があってね、...」と教わると解決するのですが、初心者の初つまづきポイントかもしれません。

この記事では、Long Format と Wide Format について説明すると同時に、相互変換の方法をお示ししておきます。

大体の統計ソフトには変換機能がついていますし、当然 R でもできますが、弊社の提供する、ブラウザだけで使える無料統計ソフト **Reactive stat** でも、簡単にわかりやすく変換ができます。
**Reactive stat** であればインストールの手間もありませんし、日本語データにも対応していますので、ぜひご活用ください。

https://www.emuyn.net/stats

## Long Format と Wide Format の違いと用途

### データフォーマットの比較

#### 基本的な違い

| | Wide Format | Long Format |
|---|-------------|-------------|
| **特徴** | - データが横に広がります。<br>- 各行が1つの対象（例：人や製品）を表します。<br>- 各列が異なる変数や測定項目を表します。 | - データが縦長に並んでいます。<br>- 各行が1つの観測や測定を表します。<br>- 変数の種類を示す列と、その値を示す列があります。 |
| **他の表現** | - Unstacked Format<br>- Spreadsheet Format<br>- Horizontal Format<br>- Cast Format<br>- Untidy Format | - Stacked Format<br>- Tall Format<br>- Narrow Format<br>- Melted Format<br>- Vertical Format<br>- Tidy Format |
| **日本語での表現** | - ワイド形式<br>- 横長形式<br>- 横持ち形式<br>- 横型データ<br>- ワイド形式<br>- 非整然データ | - ロング形式<br>- 縦長形式<br>- 縦持ち形式<br>- 縦型データ<br>- ロング形式<br>- 整然データ |

#### 具体例（数学と英語のテスト結果）


<table style="border-collapse: collapse; width: 100%;">
  <tr>
    <th>Wide Format</th>
    <th>Long Format</th>
  </tr>
  <tr>
    <td>
      <table>
        <tr>
          <th>名前</th>
          <th>数学</th>
          <th>英語</th>
        </tr>
        <tr>
          <td>太郎</td>
          <td>80</td>
          <td>75</td>
        </tr>
        <tr>
          <td>花子</td>
          <td>85</td>
          <td>90</td>
        </tr>
        <tr>
          <td>次郎</td>
          <td>70</td>
          <td>80</td>
        </tr>
      </table>
    </td>
    <td>
      <table>
        <tr>
          <th>名前</th>
          <th>科目</th>
          <th>点数</th>
        </tr>
        <tr>
          <td>太郎</td>
          <td>数学</td>
          <td>80</td>
        </tr>
        <tr>
          <td>太郎</td>
          <td>英語</td>
          <td>75</td>
        </tr>
        <tr>
          <td>花子</td>
          <td>数学</td>
          <td>85</td>
        </tr>
        <tr>
          <td>花子</td>
          <td>英語</td>
          <td>90</td>
        </tr>
        <tr>
          <td>次郎</td>
          <td>数学</td>
          <td>70</td>
        </tr>
        <tr>
          <td>次郎</td>
          <td>英語</td>
          <td>80</td>
        </tr>
      </table>
    </td>
  </tr>
</table>

### Wide Format が適切な解析手法の例

- 対応のある群間検定 (対応のあるt検定、Wilcoxon の符号順位検定 など)
  - 例: 同じ生徒の数学の点数を、ある教育方法の実施前と後で比較する。
  - 理由: 各生徒の前後の測定値が同じ行にあり、個人内の変化を直接比較しやすい。
- 多変量解析
  - ANOVA、ロジスティック回帰、ANCOVA、重回帰分析、多変量分析、主成分分析 (PCA)、因子分析 など。
  - 例：
    - ANOVA (多元配置分散分析): 学年、性別、学習方法が試験成績に与える影響を同時に分析する。
    - ロジスティック回帰モデル: 生徒の属性 (年齢、学習時間、出席率) から合格/不合格を予測する。など
  - 理由：
    - 複数の変数間の関係を同時に分析し、交互作用や複雑なパターンを検出できる。

### Long Format が適切な解析手法の例

- 対応のない群間検定（t検定、Mann-Whitney U検定 など）
  - 例: 異なる2つのクラスの数学の点数を比較する。
  - 理由: 各観測値が独立した行にあり、群 (クラス) 間の比較がしやすい。
- 混合効果モデル
  - 例: 生徒の成績に対する、教師の影響と生徒個人の特性の影響を分離して分析する。
  - 理由: 個人内変動と個人間変動を同時に扱えるため。

## 相互変換方法

### Wide format から Long Format に変換

- 手順
  - 各列名の異なる変数や測定項目を、それぞれ新しい行に分けます。
  - 変数の名前や測定項目を示す新しい列を作成します。
- 注意事項
  - データ量が増えるため、行数が多くなり、データ管理が煩雑になる可能性があります。
  - 変数や測定項目が多い場合、変換後のデータセットが非常に大きくなることがあります。

### Long format から Wide Format に変換

- 手順
  - 各観測の変数や測定項目を、新しい列として分けます。
  - 変数の値を、それぞれ新しい列に配置します。
- 注意事項
  - 変数や測定項目が多い場合、列数が増えてデータ構造が複雑になることがあります。
  - 多くの欠損値がある場合、解釈が困難になることがあります。

## R での変換
[rdrr](https://rdrr.io/snippets/) にコピペして簡単に試せます。

```R:R
# サンプルデータの作成（Wide Format）
wide_data <- data.frame(
  name = c("Taro", "Hanako", "Jiro"),
  math = c(80, 85, 70),
  english = c(75, 90, 80)
)

cat("Wide Format:")
print(knitr::kable(wide_data))

# Wide Format から Long Format への変換
long_data <- tidyr::pivot_longer(wide_data, 
                                 cols = c(math, english),
                                 names_to = "subject",
                                 values_to = "score")

cat("\nLong Format:")
print(knitr::kable(long_data))

# Long Format から Wide Format への変換
wide_data_back <- tidyr::pivot_wider(long_data,
                                     names_from = subject,
                                     values_from = score)

cat("\nWide Format (after conversion):\n")
print(knitr::kable(wide_data_back))
```

結果
```TEXT:TEXT
Wide Format:

|name   | math| english|
|:------|----:|-------:|
|Taro   |   80|      75|
|Hanako |   85|      90|
|Jiro   |   70|      80|

Long Format:

|name   |subject | score|
|:------|:-------|-----:|
|Taro   |math    |    80|
|Taro   |english |    75|
|Hanako |math    |    85|
|Hanako |english |    90|
|Jiro   |math    |    70|
|Jiro   |english |    80|

Wide Format (after conversion):

|name   | math| english|
|:------|----:|-------:|
|Taro   |   80|      75|
|Hanako |   85|      90|
|Jiro   |   70|      80|
```

## Reactive stat での変換

**[Reactive stat](https://www.emuyn.net/stats)** は、ブラウザだけで使える無料統計ソフトです。信頼性の高い R で統計解析を行い、その結果を AI が解説します。PC にソフトウェアをインストールする必要がなく、インターネット接続があればどこでも利用できます。

![Reactive stat バナー](https://www.emuyn.net/_media/stats/reactive_stat_banner_compressed.png)

以下のリンクが、フォーマット変換のページになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781632/84549180-6317-3d24-e351-7496bbb35e6a.png) ボタンを押せば、サンプルデータと設定を呼び出せるように用意してあります。


- [Reactive stat で Wide format から Long Format に変換](https://www.emuyn.net/stats/wide_to_long)
- [Reactive stat で Long format から Wide Format に変換](https://www.emuyn.net/stats/long_to_wide)

## まとめ

- Wide Format は、同じ対象の複数の特性を同時に比較したり、全体的なパターンを見出したりする際に適しています。
- Long Format は、時間経過による変化や、複雑な階層構造を持つデータを分析する際に適しています。