データの整然化

R の ggplot2 などのパッケージで有名な Hadley Wickham は,2014年に Tidy Data という論文を書き,tidy data(整然データ)という概念を提唱する。

世の中の「データ」は,Excel で紙に印刷して人間が眺めるために作られたものが多く,データとして扱うには整形が必要なことが多い。そういう雑然データ(messy data)を整然データに変えよう,という話である。

この論文によれば,tidy data とは,データベースの第3正規形と同様の概念で,次のように定義できるという:

  1. 一つの変数は一つの列をなす(Each variable forms a column.)
  2. 一つの観測は一つの行をなす(Each observation forms a row.)
  3. 一つのタイプの観測群は一つの表をなす(Each type of observational unit forms a table.)

彼の2017年の著書 R for Data ScienceTidy data の章には,よりわかりやすくまとめてある:

  1. 一つの変数は一つの列に(Each variable must have its own column.)
  2. 一つの観測は一つの行に(Each observation must have its own row.)
  3. 一つの値は一つのセルに(Each value must have its own cell.)

難しいのが「一つの変数は一つの列に」である。例えば,次のように,列名が変数になってしまっていることがよくある:

都道府県1月2月
東京都4036710997
大阪府137213365

これは次のようにするほうがよい:

都道府県年月感染者数
東京都2021-0140367
東京都2021-0210997
東京都
大阪府2021-0113721
大阪府2021-023365
大阪府

年と月は別の列に分けてもよい。月だけだと,そのうち困る。

概して,横長の表は要注意である。

R や Python には,横長の表を縦長の表にする関数が用意されている。

R では,Wickham の R パッケージ reshape に deshape() という関数があったが,のちに melt() と改名された。これについては2007年の彼の論文 Reshaping Data with the reshape Package に詳しい。このパッケージはその後 reshape2 となった。その後 Wickham は tidyr というパッケージを作り,melt() に相当する gather() という関数を実装する。tidyr 1.0.0 からは gather() は pivot_longer() で置き換えられる。

Python の pandas パッケージにはバージョン 0.6.0(2011-11-25)から melt() が導入される。なお,その逆は pivot_table() である。

参考:

[2021-12-12追記] 厚労省オープンデータからリンクされている新規陽性者数の推移(日別)というCSVファイルは,先月までは次のような3列の整然データであった:

Date,Prefecture,Newly confirmed cases
2020/1/16,ALL,1
2020/1/16,Hokkaido,0
2020/1/16,Aomori,0
2020/1/16,Iwate,0
2020/1/16,Miyagi,0
2020/1/16,Akita,0
(後略)

ところが今月頭に次のような49列の形式に変わった:

Date,ALL,Hokkaido,Aomori,Iwate,Miyagi,Akita,(略),Okinawa
2020/1/16,1,0,0,0,0,0,(略),0
2020/1/17,0,0,0,0,0,0,(略),0
2020/1/18,0,0,0,0,0,0,(略),0
2020/1/19,0,0,0,0,0,0,(略),0
(後略)

同様な形式の別のファイルも変わった。これによりファイルサイズは大幅に小さくなった。整然データが整然でないデータに変わった稀な例である。全国のデータだけをプロットするPythonコードは,元の整然データのほうが1行長いくらいで,どうということはないのだが,何の前触れもなく形式が変わると自動処理が失敗する。