RapidMiner
Hadley Wickhamの「Tidy Data」をRapidMinerでやってみる(パート7)
If you would like to read this post in English, it’s here.
みなさんこんにちは。またお越しいただきありがとうございます!今回がこのシリーズの最終回です。本シリーズでの、RapidMinerを使用した様々なデータクリーニング方法が皆さんの手助けになれば幸いです。前回の記事では、ハドリーウィッカムによって提唱された「整理されていない」データの4つ目の問題「複数の異なる型の観測単位が同じテーブルに保存されている」場合について説明しました。今回の記事では、5つ目の問題について、「一つの観測単位の型が複数のテーブルに保存されている」場合について説明します。ここで使用するデータはハドリーウィッカムの論文中で彼が例として使用しているものと同様に、米国社会保障局によって提供された赤ちゃんの名前に関するデータです。RapidMinerを操作しながら本記事を読む際は、ここで「整理されていない」データをダウンロードしてください(クリックでダウンロードが始まります)。
問題5:一つの観測単位の型が複数のテーブルに保存されている
上に示したように、「整理されていない」データは多くの異なるテーブルに分割されています。RapidMinerでこれを読込むと、それらはIOObjectCollection(赤枠)として保存されるため、これらすべてを1つのテーブルに結合する必要があります。結果として、データの形状が同じであるため、「整理されていない」データと「整理された」データの見分けがつきません。上記の「整理された」データの例に示されているように、主な違いは、データ数(青枠)です。では、全体のプロセスを見ていきましょう。
メインプロセスにはLoop Files、Append、Renameオペレータがあり、Loop Filesオペレータの中には、Read CSVとGenerate Attributesオペレータがあります。要約すると、プロセスの流れはこのようになります。Read CSVオペレータを使用してデータファイルを個別に読み込み、Generate Attributesオペレータを使用して新しい属性を各ファイルに追加します。この工程はすべてLoop Files内で実行され、すべてのファイルは「IOObjectCollection」としてまとめて出力されます。個々のファイルは、Appendオペレータを使用して結合されますが、自動的に “att1″、att2 “、” att3 “という名前の3つの属性を生成します。最後にRenameオペレータを使用してより適切な名前に変更します。では、各オペレータを個別に見ていきましょう。
パート1:ファイルの読込
まず、Loop Filesオペレータをクリックして、上のParametersウィンドウを開きます。次に、ファイルのパスをdirectoryボックス(赤枠)に入力するか、ファイルアイコンをクリックして左の”Select Directory”ウィンドウを開き、適切なフォルダを選択します。次に、必要なファイルを読み込む方法を選択する必要があります。filter typeボックス(青枠)で、”glob”または “regex”を選択することができます。今回は、単一のディレクトリからファイルを読み込むだけなので、正規表現(regex)を選択することにしました。”regex”を選択すると、” filter by regex “ボックス(緑枠)が表示され、必要なファイルを見つけるための正規表現を入力します。今回の場合、読み込みたくない唯一のファイルは、 “NationalReadMe”という単一の “README”ファイルです。それ以外は、読み込む必要のある “.txt”ファイルです。そのため、ここで使用する正規表現は、”.+txt”です。これは、名前がtxtで終わり、1つ以上の任意の文字から成るものを全てのファイルで検索する意味を持っています。regexesを初めて使う人、復習したい方は、こちらの記事を参照してください。最後に、enable macrosボックス(オレンジ枠)を確認してください。 RapidMinerのマクロにまだあまり詳しくなくても、マクロはすべてのオペレータで使用できるグローバル変数です。Loop Filesオペレータは以下の3つのマクロを作成します:
file_name:パスのない現在のファイルの名前
file_path:完全なパスを含む現在のファイルの名前
parent_path:ファイル名がない現在のファイルのパス
今回の場合、”file_name”マクロだけが必要となります。次に、Loop Filesオペレータのサブプロセスの中のRead CSVと Generate Attributesオペレータの使い方と、”file_name”マクロの使用方法について説明していきます。
Read CSVオペレータでは、column separatorsボックス(赤枠)に入力した値を変更しただけです。デフォルトでは、値はセミコロンですが、今回使用するファイルではカンマで区切るので、カンマを入力します。
データがRapidMinerに読み込まれると、Generate Attributesオペレータに送られます。 ここでマクロ “file_name”が使われます。ハドリーウィッカムは、一つの観測単位の型が複数のテーブルに保存されている場合、「これらのテーブルとファイルは、しばしば別の変数によって分割され、それぞれが1年、人または場所を表すことがある」と述べています。今回の場合、ファイルは何年にもわたって分割されており、各ファイルは “yob”で始まり年で終わります(yob1880など)。これは重要な情報なので、ファイル名を属性に変換する必要があります。このため、Generate Attributesオペレータが入ります。
まず、Generate Attributesオペレータをクリックして上記の Parametersウィンドウを開き、Edit Listボタン(赤枠)をクリックして “Edit Parameter List:Function descriptions”ウィンドウを開きます。次に、新しく作成する属性名を“attribute name”ボックス(ここでは「year_of_birth」)に入力し、“function expressions”ボックスには属性を作成するために使用する関数を入力します。関数を作成する際、ヘルプを表示したい場合は、電卓ボタン(青枠)をクリックして、以下の“Edit Expression: function expressions”ウィンドウを開きます。
このウィンドウには、上部のExpressionボックス、左下のFunctionsボックス、右下のInputsボックスの3つのメインボックスがあります。このオペレータで使用できるすべての関数のコレクションは、Functionsボックスで手動で探したり、検索バー(青枠)で検索することで見ることができます。今回は、cut関数を使用します。cut関数では、カットする文字列(”Nominal text”)とカットの開始位置と終了位置を表す2つの数値(”Numeric start”と”Numeric length”)設定します。”Nominal Text”の文字列はRapidMinerに読み込まれている現在のファイルの名前である必要があるので、ここで “file_name”マクロを使用します。このマクロを検索して使用する際には、Inputsボックス内のMacrosタブをクリックしてから、「file_name」マクロ(緑枠)をクリックします。RapidMinerでは、マクロは%{macro_name}という形式で参照されます。今回の場合、”cut”関数内の%{file_name}として参照されます(赤枠)。ここでのcut関数は、各ファイル名の前から3番目の文字と4番目の文字の間で切り取ります。これは、各ファイル名の” yob “を取り除き、末尾の年だけを保持することを意味します。このオペレータから出てくるデータを以下に示します。
パート2:データセット(ExampleSets)の結合と列名の変更
上記のLoop Filesオペレータから出力されるデータの例では、RapidMinerに読み込まれたすべてのデータセットがIOObjectCollectionとしてまとめて保存されています。 その結果、すべてのファイルを1つのデータセットにまとめる必要があります。これを行うために、Appendオペレータを使用します。上記のParametersウィンドウでわかるように、設定できるパラメータはdata managementしかありません。今回はそれをデフォルトの”auto”のままにしましたが、ニーズに応じて使い分けるための “memory-optimized”、“speed-optimized”オプションもあります。このオペレータにより、すべてのデータセットが重ねあわされた一つのデータセットが生成されます。ただし、最初の3つの列名はLoop filesオペレータで自動生成された「att1」、「att2」、「att3」なので、最終的にはより適切な名前に変更します。
Renameオペレータをクリックして、上のParametersウィンドウを開きます。次に、パラメータの”old name”ボックスの下矢印(赤枠)をクリックして、名前を変更する必要がある属性を選択します。そして、新たに変更する名前を”new name”ボックス(青枠)に入力します。最後に、「Edit List」ボタン(緑枠)をクリックして、上の“Edit Parameter List: rename additional attributes”を開き、残りの2つの属性についても同様のプロセスを繰り返し、Applyボタンをクリックします。以下にこのオペレータから出てくる最終的な「整理された」データの例を示します。
結論
要約すると、Read CSVオペレータとGenerate Attributesオペレータが含まれたLoop Filesオペレータを使用して必要なファイルをすべてRapidMinerに読み込みます。各ファイルが読み込まれると、Loop Filesオペレータはファイル名を “file_name”というマクロに記録し、Generate Attributesオペレータを使用して “file_name”マクロから新しい属性を作成します。 そして、Appendオペレータを使用してすべてのファイルを結合し、自動的に付けられた「att1」、「att2」、および「att3」というが3つの属性は、Renameオペレータを使用して名前の変更を行います。
この記事に関して最後に言えることは、これがこの問題の解決方法の簡単な例であるということです。ハドリーウィッカムは「個々のレコードのフォーマットが一貫している限り、これは修正するのは簡単な問題である…」と述べており、より複雑になる場合についても簡単に述べています。
より複雑な状況は、データセット構造が時間とともに変化するときに発生する。たとえば、データセットには異なる変数、異なる名前の同じ変数、異なるファイル形式、または異なる規則の欠損値が含まれている可能性がある。この場合、個々のファイルを個別に整理する必要があるかもしれない(もしあなたが運が良ければ小グループで)。
そのような複雑な状況では、明らかにRapidMinerでは、はるかに複雑なプロセスが必要であり、この記事で紹介したものよりもかなりの時間と労力が必要になります。このシリーズで作った他のすべての記事と同様に、紹介した事例は、皆さんが分析を始めてくれることを目的としているだけではなく、作業しているデータプロジェクトの手助けになってくれることを祈っています。