R の ggplot2 などのパッケージで有名な Hadley Wickham は,2014年に Tidy Data という論文を書き,tidy data(整然データ)という概念を提唱する。
世の中の「データ」は,Excel で紙に印刷して人間が眺めるために作られたものが多く,データとして扱うには整形が必要なことが多い。そういう雑然データ(messy data)を整然データに変えよう,という話である。
この論文によれば,tidy data とは,データベースの第3正規形と同様の概念で,次のように定義できるという:
彼の2017年の著書 R for Data Science の Tidy data の章には,よりわかりやすくまとめてある:
難しいのが「一つの変数は一つの列に」である。例えば,次のように,列名が変数になってしまっていることがよくある:
都道府県 | 1月 | 2月 | … |
---|---|---|---|
東京都 | 40367 | 10997 | … |
大阪府 | 13721 | 3365 | … |
これは次のようにするほうがよい:
都道府県 | 年月 | 感染者数 |
---|---|---|
東京都 | 2021-01 | 40367 |
東京都 | 2021-02 | 10997 |
東京都 | … | … |
大阪府 | 2021-01 | 13721 |
大阪府 | 2021-02 | 3365 |
大阪府 | … | … |
年と月は別の列に分けてもよい。月だけだと,そのうち困る。
概して,横長の表は要注意である。
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行長いくらいで,どうということはないのだが,何の前触れもなく形式が変わると自動処理が失敗する。