DataikuのBasicsチュートリアルをやってみた

大阪オフィスの玉井です。

Dataikuで何ができるのかちゃんと把握したかったので、下記のチュートリアルをやってみました。

作業環境

やってみた

チュートリアルの概要

HaikuTシャツという架空のオンラインTシャツ小売業者の企業データを使用して、Dataikuを使用するための基本的な手順を学ぶ…という内容です。HaikuTシャツの注文データをDataikuにロードし、データの大まかなレビューを行い、レビューで特定したスクリーニングルールを適用して、更新されたデータセットを作成します。

事前準備

上記チュートリアルのページから、今回使用するCSVをダウンロードします。

プロジェクトの作成

まず「プロジェクト」を作成する必要があります。プロジェクトというのは、Dataiku上で行う作業の全体が集約されたものです。プロジェクトのホーム画面はコマンドセンターとして機能し、プロジェクトの全体的な状態の表示、最近のアクティビティの表示、およびコメント、タグ、プロジェクトのタスクリストを使用した共同作業を行うことができます。各プロジェクトには、名前と一意のプロジェクトIDがあります。プロジェクト名は変更できますが、プロジェクトIDは変更できません。

まず、トップ画面の「Tutorial」を選び、「101:Basic」を選びます。

プロジェクトページに遷移します。

データセットの作成

プロジェクトで使用するデータセットを作成します。Dataikuでいうデータセットとは、とどのつまりユーザーが持っているデータであり、それは表形式です。csvやExcelファイルのシートもデータセットとなります。もちろん各種DBもデータセットとなります。

重要なポイントとしては、Dataikuでデータセットを作成するというのは、Dataikuにデータへのアクセス方法を通知するだけに過ぎない…ということです。これらの外部データセットは、元データの場所を記憶します。データはDataikuにコピーされません。DSSのデータセットは、元のシステムのデータのビューです。

ただし、今回アップロードするファイルに関しては、データがDataiku(ホストする別のデータベースがまだ存在しないため)にコピーされるため、少し特殊なケースとなります。

データセットの詳細については、下記に記載があります。

ADD A FILEからCSVをアップロードします。

CSVが問題ないか、PREVIEWを選んで検証します。

各カラムや区切り文字、文字コード等が自動で検出されます。今回はチュートリアルなので、特に修正はせずCREATEでこのCSVをデータセットとして作成します。

データを探索する

データセットを作成すると、自動的にExplore画面に移動します。下記の機能を使って、データがどういう内容なのか、どういう性質なのか、といったことを確認していきます。

サンプリング

データを概観する際、いちいち全データを読み込んでいては時間がかかります。そういう時のために、設定に基づいて、表示するデータをサンプリングすることができます。

冒頭の数十件をとるのか、ランダムで取得するのか、といった設定ができます。

ストレージタイプ(データ型)

Dataikuは元データの各カラムの型(文字列とか整数とか)を取得します。CSVファイルの場合、全カラム文字列となります(ただのテキストファイルだから)。

それとは別に、dataikuは、列の値の性質を反映した型も検出します(青色で記載)。dataikuには整数、米国の州、IPアドレス、電子メールなど、多くの概念が組み込まれています。今回では、dataikuはtshirt_priceの値がDecimalを意味し、tshirt_quantityの値がIntegerを意味すると推測しています。列の意味は、Dataikuが、その列に対して値が有効であるとみなすかどうかに影響します。型の下には、型と一致しないと思われるカラムの値が赤で、または完全に欠落しているカラムの値が灰色で、それぞれ割合を示すゲージがあります。

チャート

データを簡単に可視化できます。今回は、各タイプのTシャツの注文頻度が知りたいとします。

まず、Chartタブを選びます。

Count of recordsをY変数としてドラッグ&ドロップします。

tshirt_categoryをX変数としてドラッグ&ドロップします。

tshirt_category別のレコード数の棒グラフができました。

このグラフから、tshirt_categoryの値が一貫して記録されていないことがわかります。黒のシャツの色は「Black」と記録されることもあれば、「BI」と記録されることもある。同様に、白いシャツは「白」と記録されることもあれば、「Wh」と記録されることもあるようです。これでは、正確な分析を行うことはできません。

この問題は次項で解決しましょう。

ビジュアルレシピを使用したデータ前処理

ここからは、データを整えてきます。

その前に、そもそもレシピって何でしょう。Dataikuでいうレシピとは、1つまたは複数の入力データセットに対して実行するアクションのセットであり、結果として1つまたは複数の出力データセットになります。前処理をひとまとめにして呼称する感じでしょうか。レシピはビジュアルとコードの2種類があります。

ビジュアルレシピを使用すると、GUIで使用可能な、事前にパッケージ化された多数の操作によって、入力データセットを迅速かつインタラクティブに変換できます。コードレシピを使用すると、コーディングスキルのあるユーザーはビジュアルレシピ機能を超えて、サポートされている任意の言語(SQL、Python、Rなど)を使用して処理を制御できます。

まず、画面右上のACTIONS→Prepareと選びます。

レシピを作成する場合、入力データセットと出力データセットを指定する必要があります。「Store into」の値を設定して、出力データの保存場所を決定することもできます。今回は、出力はローカルに書き込まれますが、リレーショナルデータベースや分散ファイルシステムに書き込むこともできます。

下記のように設定します。

レシピの画面に遷移しました。まず、tshirt_categoryに関する詳細を確認します。tshirt_categoryを選んで、Analyzeを選びます。

今回やりたいのは、カテゴリがちゃんとまとまっていない(同じ商品なのに別カテゴリになっている)のを整理することです。「White T-Shirt M」と「Wh Tshirt M」を選択し、MASS ACTIONS→ Merge selectedを選ぶことで、カテゴリをマージできます。

この要領で、他のカテゴリもマージしてきます。そして、Analyze画面を閉じると、左部に、マージ処理がスクリプトとして登録されていることがわかります。

目のアイコンを選ぶと、どのデータが変換対象になったのかが可視化されます。

他の前処理

今度はorder_dateを処理します。日付データは扱うのが面倒な印象がありますが、Dataikuはどうでしょうか。

まずorder_dateカラムのメニューから、「Parse Date」を選びます。

Smart Date画面が開きます。

Dataikuがデータを解析し、最も当てはまる可能性の高い日付形式を出してくれます。今回はyyyy/MM/ddが一番なので、それを選び、OKを選びます。すると、先程のマージ処理と同様、画面左部にParse Dateの処理が追加されました。また、データプレビューの方を見ると、パースされた日付カラムが新たに追加されています。

今回は同カラムにパース後のデータを入れたいので、スクリプトのOutput columnを空にします。

order_dateカラムにパース後のデータが入るようになりました。非常に簡単に日付データをパースすることができました。

最後に、各オーダー毎の金額を計算します。今回のデータセットには、各オーダーのTシャツの数と1枚あたりの価格が含まれていますが、各オーダーの金額を分析できるように、各オーダーの合計を計算する必要があります。ここでは、Formulaステップを使用します。

これに関しては、先程とは異なり、プロセッサライブラリという機能を使用します。

まず、「+ADD A NEW STEP」を選択します。新しい前処理のプロセスを追加するという感じですね。

下部にメニューが現れて、ここから追加したいプロセスを選びます。今回はFormulaを探します。

Formulaを選んだら、具体的な計算内容を入れる必要があります。今回は、名前はtotalで計算式はtshirt_price * tshirt_quantityと入れます。

この時点でプレビューには計算後のカラムが表示されます。

ちゃんと計算できてますね。もうPriceとQuantityはいらないので削除しておきます。

注意しておきたいのは、このプレビューはあくまでプレビューで、実際には、まだデータに対して何もやっていません。ですので、プレビューで自分が設定した処理に間違いがないことを確認したら、実際に処理を実行する必要があります。

画面左下のRUNを押しましょう。Dataikuは、これらのレシピを独自のエンジンで実行しますが、インフラとレシピのタイプに応じて、処理する環境は選ぶことができます。

入力データと出力データのスキーマ(構造)が異なるが大丈夫か?という注意が出てきます。今回の処理で列の数や型が変わっているので、スキーマは変わって当然です。そのまま進めましょう。少し待つと、ジョブが完了します。下記画像の部分を選ぶと、出力データセットのプレビュー画面に遷移します。

出力データセットを見てみる

出力データに対してまず気になることは「どのカテゴリーのTシャツが最も人気があるかということ」です。これはチャートを使って、totaltshirt_categoryの棒グラフを作ればわかります。

テニスシャツの平均売上が他のシャツより多く売れていることがわかりました。しかし全体的な支出についてはどうでしょうか。

totalのメニューを開いて、AVGをSUMに変更します。

パーカーや男性用Tシャツの注文が多く、その合計金額はテニスシャツを上回っていることがわかりました。

顧客によるグループオーダー

今回の分析の最終目標はHaiku T-Shirtsの顧客について理解することです。そのためには、過去の注文をすべて顧客別にグループ化する必要があります。

画面の右上のビジュアルレシピからGroupを選びます。顧客別にオーダーをグルーピングしたいので、Group Byにcustomer_idを選びます。Nameはorders_by_customerとします。

下記の通り、グループ化の設定を行います。これにより、顧客が注文した最初の日付(order_dateの最小値)、訪問ごとの平均訪問ページ数、および顧客のすべての注文の合計が得られます。

ついでにorder_date_minの名前はfirst_order_dateに変えます(左メニューのOutputで変えられます)。

グループレシピにはいくつかのステップがありますが、一番重要なのは、名前の通り「Group」ステップです。集計する列と実行する集計を下記のように選択します。

実行すると下記の結果が得られました。

フロー

画面上部のプロジェクト名の横から「Flow」を選ぶと、今まで組んだ前処理が視覚化されたフロー画面をみつことができます。

ほうきのアイコンが最初の前処理レシピで、丸三角四角のアイコンがグループレシピになります。

おわりに

Dataikuを初めて触りました。このチュートリアルは基本的なデータの処理だけなので、Dataikuの売りの機械学習とかにはまだ触れられてないので、もう少し色々見てみたいところです。