2019年12月24日火曜日

Dataikuを使ってみよう #3 データを分割する



機械学習でモデルを作成する際に、データを分割して教師用データ、テスト用データに分割することがあります。また、何かしらのフラグや数値でデータを分割する場合もあるかもしれません。

その際に役に立つのが、Visual Recipeの中のSplit Recipeです。

データをランダムに比率で分割する

あるデータセットの行をランダムにセレクトしたい場合がある場合は、以下のように設定を行います。
分割したいアイコンをクリックして右枠(Visual Recipe)の中のSplit(赤枠)を選択します。
すると、以下のような画面が表示され、フォルダ名を指定することができます。ここでは、ランダムに分割をした 「Train」と「Test」 というフォルダを作っておきます。
右下のCREATE RECIPEをクリックしたら、どのような分割をするかを指定できます。今回はランダムにデータを分割させたいので、「Randomly dispatch data」 を選択します。
この後の画面では、実際にデータの分割割合を指定するのですが、スライダーで指定することができます。
今回はTrainに80%、Testに20%を指定します。
もちろん50%、25%、25%という風に複数指定することもできます。 「Add Ratio+」 というテキストをクリックすると、指定することができます。新しくデータセットを「Add Dataset」 から入力することも可能です。

また、Seed値を指定することが可能です。任意の値を指定できますが、変更してしまうと再度実行をした際に同様の結果が得られなくなるので、変更する際には十分気を付けてください。

指定が終わったら、左下にある「Run」を実行すると、データ分割を実行してくれます。
完了すると、以下のようにFlow上に表示されます。(赤枠が追加された部分)

データの中身を確認してみます。
まずは元データを確認すると、650,199 行データが存在をしています。
(この表は、データセットを開いたときにツールメニューの中にある「Status」をクリックすると確認ができます。表示できていない場合は、「COMPUTE」 ボタンをクリックして更新してみて下さい)

次に、Train(80%の行数が格納されているはず)を確認してみます。
Trainデータセットを開いて同様の「Status」メニューを開いてみると、以下の結果が表示されます。
520,160 行となっていて、650,199 x 80% とほぼ同数となっています(小数点は切り上げになっているようです)

続いて、Test側を見てみます。
同様に「Status」メニューを表示してみると、130,039 となっています。
650,199 x 20% とほぼ同数となっています(小数点は切り上げになっているようです)

これで、データセットを80%:20%で分割ができていることが確認できました。

データを指定した値とそれ以外で分割する

ランダムにデータセットを分割するだけでなく、ある特定の列の値を参照して分割することも可能です。
Split Recipeを選択した後、”Map value of a single value” を選択すると、2番目の画面のように列の値を指定することができます。


値を指定した後、左下にある「Run」をクリックすることでデータ分割が実行されます。

閾値を指定してデータを分割する

これまでは、ランダムまたは具体的な値を指定してデータを分割してきました。ここでは、閾値を設定してデータを分割します。
Split Recipeを選択し、Define Filterを選択します。

フィルタを適応する条件(保持する行の条件)を選択することができます。
また、その下で、列を指定し値を条件で指定することができます。
数値条件であれば、>=、<=など、またテキストであればEqual (=)や文字列の一部を含む(Contains)などです。条件は複数指定することができ、それを一つのデータセットに振り分けることができます。
もちろん、違う条件で異なるデータセットに入れることもできます。(下の Add Filterで条件を追加できます)
それ以外の条件も別のデータセットに入れることが可能です。
条件の指定が終われば、いつものように左下のRunをクリックしてデータ分割を実行します。

指定した項目をソートし、割合でデータを分割する

指定したカラムでソート(昇順・降順)をして、割合で分割することができます。
売上TOP10、20%をそれぞれ別のデータセットに保存するということもできます。

Split Recipeを選択し、Dispatch percentiles of sorted data on output datasets を選択します。
次の画面では、列を指定し、その横の昇順・降順アイコン(Ascending、Descending)を選択します。下のスライドバーで割合を指定してアウトプットのデータセットを指定します。
その後いつも通りに左下のRUNアイコンをクリックすると、データが分割されます。

まとめ

今回は、Dataiku上のSplit Recipeを使ってデータ分割を紹介しました。Split Recipeでは4種類のデータ分割方法を選択することができます。
  • ランダムに行を選択
  • 値を指定して選択
  • 閾値を指定して選択
  • 指定した値をソートして割合で選択
の4つを紹介しました。
データ分析をする際に必要なデータ分割方法はカバーされているかと思います。

Dataikuを学ぶには触ってみるのが一番手っ取り早いです。以下のフリーエディション(今のところ日数制限はありません)を手元のマシンにインストールして使ってみてください。
サンプルやチュートリアルが充実しているので、一度チュートリアルを通してDataikuのオペレーションを慣れると分析用にコーディングする手間が大幅に減ることは間違いないです。





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アドレスから地域を推定できるなど、多くの関数を準備しています。ここではすべてを紹介できないのですが、チュートリアル等で出てくるので、ぜひ一度使ってみてください。



2019年12月1日日曜日

Dataikuを使ってみよう #1 : データをDataikuに取り込む

データをDataikuに取り込んでみよう



#0でも説明したように、Dataikuでは様々なデータソースからデータを取得することができます。Editionによって取得できるデータソースがことなります。ローカルPCのデータやMySQL、Postgres、Cloud Storage(AWS S3 等)、HTTP(S) 、同一Dataikuインスタンス中からはFreeEditionからも取得することができます。

それ以外のEnterprise系のOracleやTeradata、Greenplum、Amazon RedshiftなどはEnterprise Editionで利用が可能です。


ローカルファイル以外のデータを取り込む際には、事前に接続設定が必要なのでお忘れなく。
(右上の□が9つあるアイコン中の) Administration > Connectionsで設定が可能です。



ローカルからのファイルアップロードは他のツールでもできるので、
今回はHTTP(S)経由で取得してみましょう。

HTTP(S)経由でデータを取り込む

こちらのチュートリアルにあるデータを取り込んでみましょう。
ページ中頃にURLがあるので、ローカルに”ダウンロードせずに”直接URLからデータを取り込んでみます。(ダウンロードURL * 40MBぐらいあるので注意)
データ列が同じで複数URLに分かれている場合は、一行一URLで入力をしてくれれば、一つのデータセットとして作成してくれます。
URL(s) のボックスに該当するURLを入力、右上のデータセット名を入力して、左下の「TEST」ボタンをクリックすると、URL先のデータを取りに行き、「Preview」でデータ型を推定した画面が表示されます。




必要に応じて、データ型を変更してください。また、右側にカラムの意味などを入力できるBoxがあるので、データのValue値の定義等を書いておくと、後々参考になるかと思います。
それ以外でも「Format/Preview」でデータの数行が見れたり、区切りなどを設定するでき、「Partitioning」でデータをパーティションに分けることができます。(FreeEditionでは残念ながら利用できませんが…)。また、「Advanced」でちょっと高度なこと(例:一貫性のチェック等)が可能です。

諸々設定が終わったり、右上のCREATE(すでに作成済みデータセットを変更する場合はSAVEと書いてあります)をクリックして、データ作成完了です。

Flowに戻ってみると、このようなアイコンで表示されます。
まだ何も他の操作を行っていないので、まだこれだけです。

データの概要を知る

さて、データの準備ができました。おそらく次のステップはインポートしたデータの内容確認を行うでしょう。値で入っているカラムの値の分布をチェックしたり、テキストで入っているカラムであれば、パターンをチェックしたり… まずはデータを機械学習などに入れる前に分析対象をよく知ることが必要です。

SQLではカウントや分布などの関数を使ってカラムの状況をを確認したり、RではSummary() 関数を使って各カラムの様子を知ることができました。
Dataikuでは、そのようなコードを書かなくてもマウス一つで知ることができます。

Flowに戻り、データセットのアイコンをダブルクリックすると、以下のようにデータ内容が表示されます。

このカラム名をクリックすると、以下のようなメニューが出てきます。
カラムの内容を見る際には、この「Analyze...」を選択しましょう。
このカラムの値の概要が表示されます。

このカラムは「空港3レターコード」を表しています。どの値がどのように分布しているのかがひと目でわかります。また、左側にはValid = 適正な値になっているか、またユニークがどのぐらいがあるかをSummaryとして表示してくれています。
上記はテキスト形式のカラムのサマリでしたが、今度は数値型の数字のAnalyze...を選んでみると、上記のようなヒストグラム、箱ひげ図、分布が表示されます。
これを既存のコードで書こうとするとそれなりに時間がかかりますが、Dataikuでは、マウス一つでここまで表示をしてくれます。

また、ひとつずつのカラム分布をみても大変なので、一気にヒストグラムを見ることもDataikuでは準備されています。
データ表示画面のトップツールバーの右上にあるアイコンのQuick Column Stats を選択すると、すべてのカラムのヒストグラムが表示されます。




もう少し各カラムの特徴をビジュアルで知りたい方はこちらの方法ではいかがでしょうか。
カテゴリカルなデータを色をつけて知りたいことがあるかと思います。(よくみなさんがExcelでやってるやつです)同じことをDataikuでは対応をしています。

この Columns values ~ を設定すると、以下のようなデータ表示(各カラムに値でグルーピングの色わけ)がされます。


また、これまではカラム+データで表示をしていましたが、カラム数が多くなるとスクロールでも見にくい場合が出てきます。そのため、カラム名のみ表示するというオプションもあります。

少し注意なのが、Analyze... の2画面のタイトル中のSampleというフィルタです。
このフィルタを開くと、以下のような値を選択できます。

デフォルトではサンプリングしたデータを参照してさきほどの集計をしています。サンプリングの仕方は設定が可能です。巨大なデータセットに対してWhole Dataを選択してしまった場合、ロードに時間がかかりシステムに負荷がかかるため、時間がかかることが予想されます。可能であればSampleを選んでおきましょう。

データの特徴をチャートで捉える

これまではデータを数値やカテゴリ値として概要を見てきました。ただしやはりチャート(棒グラフや線グラフ等)で視覚的に捉えたいと考える人も多いかと思います。
その部分もDataikuでは抑えており、基本的なチャートがデータセットから作り出せます。

先程はメニューの「Explore」でデータセットの傾向を見ていたのですが、その隣の「Charts」を選択すると既存のデータセットからチャートを作成できる画面になります。
チャートも基本的なものからBoxPlot(箱ひげ図)、地図、散布図など分析する際に困らない程度のチャートは準備してあります。


これらを使って、上記のデータセットをつかってチャートを作ってみるとこんな感じになります。これらは一つだけでなく、ページを追加していくつかのチャートを組み合わせて見ることが可能です。X軸に分析軸、Y軸に分析対象を置くことで作成ができます。
直感的なのでExcelのチャートや他のBIツールを使い慣れている方であれば、すぐに習得できると思います。

また、積み上げや%表示なども軸においた項目から選択ができ、わざわざデータで新しいカラムを作成しなくても良くなっています。
さらに作ったチャートを「Publish」(Chart画面内右上にあります)して、Dashboardに入れることができます。

チャートをDashboardに埋め込むことができました。Dashboardの説明についてはまた後日説明をします。

データの概要を知るためには十分な機能

これまで紹介した機能は、Dataikuが持っているデータインポート後に使える内容(FreeEditon)となります。データを機械学習にかける際にデータの中身を知る必要がありますが、データの分布やチャートを使って内容を知る場面には十分な機能ではないでしょうか。

Dataikuにはどのような機能があるかを知りたい方は、チュートリアルもありますので、ぜひ使ってみてください。