見出し画像

【JKI】021_Eating_Out

【JKI_021】課題を確認

Just KNIME It! (JKI)

今回の挑戦はこちら

問題文をDeepL翻訳し少し加筆して以下に

課題21:外食
レベル:簡単
 
説明:
あなたはある旅行会社でインターンをしています。その会社は、高額な買い物をする人の食習慣について知りたがっています。
試しに、異なる目的で旅行する1011人の情報を含む6647行の小さなデータセットが渡されました。この課題では、次のことを行います。
 
食事に最も多くのお金を使う参加者の上位10人を見つけます。
食事に最もお金を使う人が、食事に最も時間を使う人と同じかどうかを調べてください。
注:時々、終了残高が開始残高より多くなることがあります。これは、使ったお金を計算するときのミスだと仮定してください。

【CSV Readerとバージョンアップについて】

今回のサンプルデータはこちら

CSV Readerでworkflow内のdataフォルダに格納したファイルを取ってくるのはいつも通り。

このノードですが、2年前にまっきーさんが解説記事を書いてくれた頃から、KNIME Analytic Platform (AP)の怒涛のバージョンアップがあったので、皆さんの設定画面が異なるかもしれません。

私は都合でKNIME APのver. 4.4.1を使い続けているので設定は下記の通り。

ところでもう最新版は4.6.0なんですよね。今週の公式解答からはまたバージョンが上がるのでしょうか。

重要な改善点のひとつが

Better yet, Python environment is built-in. No need to install extra software.

つまりJKIをPythonで解くのもKNIMEを使っていると認定されるのかな。いきなり道草してすみません。

結果:

6647行のデータが得られます。このデータってどうやって集計するんだろ。スマホのアプリのログとかかな。

ID順に並べ替えると個人の行動が追えてちょっと怖いダミー情報だなと思いつつ次へ。

【データ整形】

今回は初期時に関するデータだけを解析するのでデータを絞り込み、また日時データは解析のためにはデータ型を変えると便利なので前処理をしています。

設定:

結果:

ちなみに見やすくなるようフォントサイズを14に上げてみています。

【差分計算と誤入力チェック】

時間の間隔はDate&Time Differenceノードで算出します。
まっきーさんの記事を紹介しておきます。

また
金額の差はMath Formula
で算出し、食事の後で所持金額が増えるのは何かの誤入力なので、その行をRow Splitterで削除します。この二つのノードはよく使ってきたので説明は省略してもいいでしょう。

設定:

結果:

金額は5程度の数値が並んでいるんだけど通貨はユーロかなぁ。
ちなみに誤入力が1例ありました。Row Splitterの下の出力ポートを見ると

食事したあと305ユーロ増えるとしたら、フードファイトで賞金をもらったとかかな。昨今はさすがにあり得ないので除外で間違いないと思います。

【Group Byで集計】

Group Byノードは最近JKIで毎週使っていますね。
ID別に合計の飲食費と食事時間を算出して、それぞれの上位者をTop k Selectorで抽出しました。

設定:

結果:
食事に最も多くのお金を使う参加者の上位10人:
課題1の解答に相当します。

続いて、食事に最も時間を使う人と同じかどうかを調べるために、こちらも上位10人を出力してみました。

トータル65分間食事していた603番、621番の方が最長ですね。

【Reference Row Splitterを使ってみる】

課題の2つ目が

食事に最もお金を使う人が、食事に最も時間を使う人と同じかどうかを調べてください。

との事なので、上記の表を目視で確認すればわかることではありますが、一応Reference Row Splitterを使って照合してみましょう。

設定:

結果:

621番、603番の方が支払金額で1位2位なのですが、食事時間も最長でした。

より厳密には先に支払金額1位の人たちだけに絞り、一方で食事時間最長の人たちのリストを作成してから照合すべきではありますが、今回は上記で十分調査できたのでこれで今回の解答は完了としました。他のデータセットの処理の時は気を付けた方がよさそうです。

WFはKNIME Hubに上げてあります。



おまけ:

【JKI_020 感想戦】

今回の公式解答も出ました!コンポーネント

we used a component which we found in the KNIME Forum that allowed us to calculate network days using math formulas.

https://www.knime.com/just-knime-it

Network Days算出のコンポーネントは丁寧に作りこまれていまして、特に日曜日に診察を受けるケースまでしっかりと補正できるようになっています。

一方で、私はつい、自分に都合よく土曜日だけ対応でいいやと仮定してしまいました。

目の前の課題さえ解けたらいいと言うのは少し浅い解決ですよね。良い気づきを頂けた公式解答だったと思います。

おまけ②:

【コンポーネントが拡げる未来】

最近公式解答はKNIME ForumやKNIME Hubからコンポーネントなどを転用して実装しています。

これはズルいのではありません、まさに他の方の技術を転用して実装することが簡単にできることこそKNIMEの強みなのですから。

KNIMEに限らないのですが、よく使う機能を部品化してもらえると、ユーザ間で同じ機能を同じ仕様で利用できますね。まさにコンポーネントそのものの役割だと思います。

https://wa3.i-3-i.info/word12384.html

レベル感は異なるでしょうが、Pythonのライブラリとも共通した部分があると思えませんか。KNIMEでいうとextensionsがライブラリに近いかもしれませんね。

https://wa3.i-3-i.info/word1473.html

そして一度コミュニティ内で認知され、普及がすすむとより多くの方に機能を確認してもらえるし、時にはより多彩な用途への発展、応用が進んだりします。

そこで今回の稼働日算出コンポーネントだったらどんな追加機能が欲しいか想像してみました。
例えばですけど、あるユーザーグループ特有のカレンダーにも対応できるよう、土日だけでなく、各種休日などを指定して補正した稼働日が知りたい時があるのではないでしょうか。各国特有の祝日だけではなく、日本だけでもゴールデンウイークを超大型連休にするための振替休日と振替出勤日、創立記念日、お盆休みに、年末年始、勤務日カレンダーって結構組織ごとに違いができますよね。
有休取得奨励日ってのもありますけど、これは稼働日か。

上記コンポーネントをベースにして、カスタマイズやオプション機能専用コンポーネントがコミュニティで議論されたり共有されたら面白くなりそうだなぁと思いました。


記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。