「Tidy」を共通言語にして、データサイエンス上のやり取りを簡素にしたい
こんにちは、今回はデータ構造のフレームワークである「Tidy data = 整然データ」を紹介していきたいと思います。
私は、この「Tidy」はデータ分析をプログラミング言語で行いたい人がまず知るべきものであると考えています。この概念を知っていることでAI構築やBIエンジニアリングを行うまでの前処理の道筋を簡単に立てることができます。しかし、このフレームワークはデータサイエンス系の教本で見かけることはあまりありませんし、知らないままに自然と扱っている方も多くいると思います。
という訳でどのようなフレームワークなのか、書いていきます。
Tidy data
Tidy dataは、2014年にHadley Wickham氏が提唱した、分析および可視化を容易にするためのフレームワークです。データ構造をこの整然データのルールに沿って作っていくことで、プログラミング言語によるデータの操作を容易にし、プログラミングによるデータ処理・可視化・統計モデリングを決まった手順で行うことができます。
Tidy dataはリレーショナルデータベース(RDB)の原理に密接に関わっています。いわゆるRDBのトランザクションデータとTidy dataと互換性がありますが、Tidy dataはより統計家が慣れ親しんだ言葉で解釈されます。
※ちなみに、「Tidy」という単語を聞いてRの有名なライブラリであるtidyverseを思い浮かべる方が多いと思いますが、tidyverseの開発者がHadley Wickham氏なのです。
Tidy dataの条件
Tidy dataの条件として、以下の四つがあります。
個々の変数が一つの列をなす
個々の観測が一つの行をなす
個々の観測の構成単位の類型が一つの表をなす
個々の値が一つのセルをなす
$$
\begin{array}{|c|c|c|} \hline
名前 & 学期 & 点数 \\ \hline
佐藤 & 一学期 & 320 \\ \hline
佐藤 & 二学期 & 300 \\ \hline
佐藤 & 三学期 & 350 \\ \hline
田中 & 一学期 & 410 \\ \hline
田中 & 二学期 & 420 \\ \hline
田中 & 三学期 & 390 \\ \hline
鈴木 & 一学期 & 290 \\ \hline
鈴木 & 二学期 & 290 \\ \hline
鈴木 & 三学期 & 300 \\ \hline
\end{array}
$$
上の表は整然データの条件を満たしています。
一つの列に同じ意味を持つデータが格納されている
一つの行が一回のテストの結果を表している
テストの結果以外の観測は入っていません
一つのセルに一つの値のみが入っています
上の表は一度TableauやPython, Rなどでデータを扱ったことがある人は見たことがある構造だと思います。このような構造であれば特別な前処理が必要なくすぐにデータ解析や可視化を行うことができます。
※余談ですが、総務省が機械判読可能なデータ作成方法についてとても分かりやすい資料を公開してくれています(Tidy dataは出てきませんが)。データ作成に悩む全ての人が一読すべき資料です。
https://www.soumu.go.jp/main_content/000723697.pdf
Messy data
Tidy dataの条件を満たさないデータ構造をMessy data(雑然データ)と呼びます。我々人がエクセルで見やすいように作られた表構造はほとんどがこのMessy dataに該当します。
$$
\begin{array}{|c|c|c|c|} \hline
名前 & 一学期 & 二学期 & 三学期 \\ \hline
佐藤 & 320 & 300 & 350 \\ \hline
田中 & 410 & 420 & 390 \\ \hline
鈴木 & 290 & 290 & 290 \\ \hline
\end{array}
$$
上の表はTidy dataではなく、Messy dataです。
プログラミング言語は基本的にデータを1次元のベクトルとして扱うため、このように同じ意味を持つデータが複数列にまたがっている場合に一度にデータ全てを取り出すことができません(眺める分には有用ですが)。一方で、Tidy dataは一つの列を取り出すことでデータを取り出すことができるので、以降のデータ処理も効率よく行うことができます。
Messy dataの条件
Messy dataはTidy dataでないものすべてが該当するため、整然データの条件で取り上げた四つの条件いずれかを満たしません。これがどのようなデータ構造となるか考えていきます。
個々の変数が一つの列をなす
前述したMessy dataの例がこれにあたります。これは、テストの結果が3列にまたがっているため整然データではありません。
個々の観測が一つの行をなす
これも、前述したMessy dataの例があたります。「佐藤」の行を取り出す際に三学期分のテスト結果全てを取り出すこととなり、個々のテストの結果となっていないためです。
個々の観測の構成単位の類型が一つの表をなす
$$
\begin{array}{|c|c|c|} \hline
名前 & 学期 & 点数 \\ \hline
佐藤 & 一学期 & 320 \\ \hline
佐藤 & 二学期 & 300 \\ \hline
佐藤 & 三学期 & 350 \\ \hline
佐藤 & 三学期 & B \\ \hline
田中 & 一学期 & 410 \\ \hline
田中 & 二学期 & 420 \\ \hline
田中 & 三学期 & 390 \\ \hline
田中 & 三学期 & B \\ \hline
鈴木 & 一学期 & 290 \\ \hline
鈴木 & 二学期 & 290 \\ \hline
鈴木 & 三学期 & 300 \\ \hline
鈴木 & 三学期 & C \\ \hline
\end{array}
$$
上の表がこの例にあたります。構成単位の類型とは、簡単に言うと観測の種類なので、これが複数あるとは種類の異なる観測が一つの表に含まれているということです。この例では、三学期のテストの結果の後に三段階の成績が観測として挿入されているため、Messy dataとなります。
個々の値が一つのセルをなす
$$
\begin{array}{|c|c|c|} \hline
名前 & 学期 & 点数 \\ \hline
佐藤 & 一学期 二学期 三学期 & 970 \\ \hline
田中 & 一学期 二学期 三学期 & 1220 \\ \hline
鈴木 & 一学期 二学期 三学期 & 880 \\ \hline
\end{array}
$$
上の表がこの例にあたります。学期に三種類の値が入っているためTidy dataの条件を満たさしません。
※俗に言う神エクセルでよくみられますw。
整然化
Messy dataをTidy dataに変換することを整然化と呼びます。整然化の方法として融解・文字列操作・キャスティングなどがあります(いわゆる縦持ち、横持ち変換も含みます)。これらの操作はRのtibbleや、PythonのPolarsまたはPandasで関数化されており、簡単に行うことができます。
まとめ
ということでTidy dataについて書いていきました。これから、Messy dataが渡されてきたら「Tidyにしてきて」とツッコミを入れられるような世界になると良いなあと思っております。
まずは、高校の教科書に載るところだと思いますが、文部科学省のみなさんいかがでしょうか!!
最後までお読みいただきありがとうございました。
記事を読んでいただきありがとうございました。いただきましたサポートは自己研鑽のために活用し、さらに良質な記事を執筆するために使います。のんびり更新ですが、多くの方に役立つコンテンツを書いていきますのでよろしくお願いいたします。