2019年12月8日日曜日

Dataikuを使ってみよう #2 : データを加工する

Dataikuでデータを加工する


#0、#1で、プロジェクトの作成と、データインポートとデータの概要をどのようにして操作するかを紹介しました。
続いては、インポートしたデータの「加工」について、Dataikuではどのように行うのかを説明します。

従来のツールだと、変数の追加や変数の加工、マスタとの連携等については、R、Python、SQLコードを書いて実行をする必要があり、データリネージュ(データフロー)を管理するのが大変でした。

しかし、Dataikuではそういったコードを書く必要がなく、ほとんどの作業が「Visual Recipes」 によって準備されており、マウス一つで対応することができます。
例えば、Visal Recipesの「Prepare」を利用すると、変数の文字列抽出や値の変換等を行うことができます。このようなデータ変換を行うことができるものをVisual Recipesとしてまとめてあります。



今回は多数の機能を持つVisual Recipesから機械学習で使う頻度が高いRecipeについて紹介します。

マスタとの連携

小売やE-commerceの販売データと商品マスタ、日付とマスタカレンダーなど、分析対象とそのマスタデータを連携することは分析を行う準備として日常的に行われているかと思います。これまでは、SQLにてこのような作業を行っていますが、Dataikuであれば、Visual Recipesの「Join with.. 」を利用することで対応が可能です。

今回は#1でデータをインポートした、空港の離発着データを使いましょう。
このデータにはfg_aptカラムがあり、これは各国の空港の3桁コード(成田空港であればNRTなど)が格納されています。このマスタデータをこちらのサイトからダウンロードして、AWS S3に格納し、そこからデータをインポートしました。
flight_test_dataアイコンを選択肢、Visual Recipesの「Join with…」を選択すると、以下の画面が表示されます。
画面右側がインプットデータセット、左側がアウトプットデータセットになります。
右側の最初のプルダウンメニューは選択したデータセット名が表示されていて、下のプルダウンメニューでどのデータセットをJoin対象にするかを選択できます。
また、左側の画面では、一番上でJoinした後のデータセット名を指定します。(この名前はデフォルトで入っていて、任意に変更ができます)
Store Infoは「どこにアウトプットデータセットを格納するのか?」を選択できます。Administrator画面でいくつかのデータセットをすでにセットアップ済みであれば、そのストア先にこのデータを格納することができます。Format プルダウンメニューはそのままCSVにしておきます。
設定がすべて完了したら、右下の「CREATE RECIPE」をクリックしてください。
そうすると以下のような画面になるはずです。

ここですでにSQLを書かれている方であれば、馴染みの出てきているキーワードが見られるかと思います。(今回はSQLについて詳細には説明を行いません。必要な方は別途調べてみてください)真ん中の2つの列が指定したデータセットで、このJoin方法は「Left Join」となっています。このLeft Joinをクリックすることで他のJoin方法を選択することができます。

データセットによっては、Joinのキーとしては足りない部分があるかと思います。その際は真ん中にある「+」ボタンを押して、Join項目を追加してください。

現在のJoin方法は「Left Join」ですが、もう一つのタブである「JOIN_TYPE」を選択すると、他のJoin方法(Inner JoinやCross Join等)を選択することができます。
今回は、デフォルトで選択されたJoin方法でやってみます。

次に必要となる項目を選択できます。CREATE RECIPEをクリックした後の画面に戻り、左側のセクションをみると、「Selected columns」というメニューがあります。それをクリックすると、以下のような画面が表示され、必要なカラムを選択できます。
今回は、日本語の空港名のみを見たいため、Airport_letters_masterから airport_name_J のみを選択します。

最終的にアウトプットしたいカラムを選択し終わったら、左下にある「Run」ボタンをクリックしてください。
実際にJoinが走り、問題なければ、Flow画面戻ると、以下のように表示されます。
2つのデータセットをVisual Recipesの Join with... アイコンが結ばれ、Outputデータセットが作成されていることがわかります。
アウトプットデータセット内容を確認するには、アウトプットデータセットをダブルクリックして、内容を確認できます。
一番右に airport_name_J カラムが追加されていることが確認できます。
項目の再選択や、Join方法の変更などを行いたい場合はVisual Recipesのアイコンをダブルクリックすると再度編集が可能です。

サマリする

マスタとJoinができた後やることは分析できるような形にサマリ(集計)することです。
今回はこれまで見てきたサンプルデータを使って、「空港ごとのOperationの合計」を計算してみましょう。

flight_test_data_joinedのデータセットをクリックして、右ペインのVisual Recipe中の「Group」をクリックします。すると以下の画面が表示され、左ペインの「Group By」でグルーピングするキーを設定できます。(他にグループ化したい項目があれば、後ほど追加ができます)
前回のJoinと同様に、Outputのデータセット名、どこにStoreするか、データ・フォーマットを指定して、「CREATE RECIPE」をクリックします。
そうすると、以下の画面が表示されます。この画面では、集計する単位と計算する単位を指定することができます。

今回は空港のIDと日本語名を集計キーにして、Totalを合計してみましょう。
集計キーを追加する場合は、以下のように追加ができます。
また、下の画面の中にカラムが表示されていますが、マウスカーソルを合わせると、「+ Group Key」というテキストが出てくるので、そちらからも追加が可能です。
そして、集計対象の数値、Totalは、「Sum」をクリックするだけで合計をとってくれます。(以下の画像では一番下にTotalが表示されていて、SUMが選択され緑色になっています)
グループキー、集計対象と計算方法を指定できたので、左下の「RUN」をクリックします。集計に成功し、Flowに戻ると、以下のようにアイコンが表示されているはずです。
先程Joinしたデータセットの右側にVisual RecipesのGroupアイコンが表示され、ターゲットのデータセットが表示されます。
アウトプットデータをクリックすると、以下のように表示され、指定した集計キーとTotalの合計が表示されています。

変数を加工する

続いて、変数を加工してみます。各空港ごとの2019年3月のオペレーションの1日平均オペレーション数を見てみましょう。便宜的に2019年3月は31日間します。
上記のGroup レシピをダブルクリックして、の「Pre filter」にYearとMonthを2019と3を指定します。(その前にFilterをOnにしてください)
RUNをクリックすると、実行され、アウトプットデータが2019年3月にしぼられました。
集計結果を確認するため、YearとMonthを集計キーに追加しています。

つづいて、変数を追加します。この集計結果のアイコンを選択し、Visual Recipesの「Prepare」を選択します。そうすると以下のように画面が表示されます。ここは特にデータセット、Store Info、Format等に変更がなければ、CREATE RECIPE をクリックしてください。
そうすると、以下の画面が表示されます。データ閲覧の画面によく似ていますが、左ペインに新しいペインが表示されています。
左ペイン中の「+ADD A NEW STEP」をクリックすると、以下のような関数を選択できる画面が出てきます。今回はシンプルな計算を行うので、「Fomula」を選択しましょう。
左ペインに入力する画面が出てきました。Output column に新しいカラム名を指定します。その下のExpressionに数式を入れます。右隣のEditボタンをクリックすると、上部に詳細に数式を入力できる画面が出てきます。ここに数式(Total_Sumを31日で割る)を入れてましょう。少数点がでてきますので、ROUND関数を使って小数点を取り除きます。

この変数への追加作業は続けて入力することができます。このままの計算結果を表示してもどこが一番なのかわからないため、Sortも追加しましょう。
「+ADD A NEW STEP」をクリックして、Targetの変数を選択、今回は降順にしたいので、そのすぐ下のDescendig order にチェックを入れます。
そして、RUNをクリックしてFlowを確認、一番右のフォルダをクリックすると、結果が表示されます。
想定通り、1日の平均Operation数の計算とソートができています。

縦横展開する

最後に、最もよく使うであろう縦横変換を行ってみましょう。

「carriergroup」という項目は1がアメリカ国内キャリア、0はアメリカ以外の国のキャリアフラグとなっています。このフラグを横軸(列方向)に持って集計をしてみましょう。

先程Group Recipeで作った集計をそのまま使いたいところですが、以前作ったものはそのままにしておき、このRecipeをコピーして使いましょう。以前作ったGroup Recipeをクリックし、右ペイン中のCopyをクリックしてください。そうすると、Outputデータセットを作る、以前出てきた画面が表示されます。名称を入力して、「CREATE RECIPE」をクリックします。

次に、以前設定したGroup Recipeの設定画面が再度表示されるので、GROUPのところにcarriergroup をGROUP KEYに指定して、RUNをクリックします。
Flowに戻ると、以下のように一つ分岐が増えています。
今後は分岐先のフォルダを選択して、Visual Recipes 内の「Pivot」を選択してください。そうすると、これまでと同じようにアウトプットの名称やどこに保存するのか等を選択する画面が表示され、各種設定を行い、CREATE RECIPEをクリックします。
そうすると、以下の画面が表示されます。ここで具体的に行方向にどんなデータを、列方向にどんなデータを、集計にどのような値を集計するか?という設定画面が表示されます。
左下にあるRow identifiers (つまり行に表示)にfg_aptとairport_name_Jを、右上のCreate columns withにはcarriergroupを、Populate content group にはTotal_sumを指定します。ここで気をつけなくては行けないのが、Populate content group はDefaultでCOUNTを指定するようなので、▼をクリックして適応する集計関数の変更をする必要があります。(今回はCOUNTではないため変更します。COUNTでも問題ない場合は変更する必要がありません。また、COUNT、SUM以外の関数を適応することができます)
問題なければ、左下にあるRUNをクリックして実行してください。
無事に実行が完了すれば、Flowに戻ると新しいデータセットができていることが確認できます。(下のフローで、Pivot Recipeが適応されていることがわかります)
実際にアウトプットデータをダブルクリックすると、以下のような表示になり、縦横変換がされています。
0_Total_sum_sum、1_Total_sum_sum という2つの列ができていることがわかります。
(名称はデフォルトでこのような表示になるので、変更したい場合は、Prepare Recipeを使い、変更をしてください)

まとめ

今回は以下の点をまとめてみました。
  • マスタとの連携:Join Recipeを利用。SQLのJoinと同等。
  • サマリの作成:Group Recipeを利用。SQLの集計(Group byと集計関数)
  • 変数を加工する:Prepare Recipeを利用。関数の適応
  • 縦横変換をする:Pivot Recipeを利用。
今回は機械学習のモデルにかける上でどうしても必要なデータハンドリング周りを紹介しています。
特にPrepare Recipeは多くの関数が準備してあり、文字列連結や日付の分解・結合、IPアドレスから地域を推定できるなど、多くの関数を準備しています。ここではすべてを紹介できないのですが、チュートリアル等で出てくるので、ぜひ一度使ってみてください。



0 件のコメント: