見出し画像

【JKI】029_Comparing_Distributions_between_Groups

【JKI_029】課題を確認

Just KNIME It! (JKI)

今回の挑戦はこちら

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

課題29:グループ間の分布の比較
レベル: 簡単
説明: 学生のテストの点数を比較して、2020 年 (グループ 1) と 2019 年 (グループ 0) の学生の成績に違いがあるかどうかを調べたいとします。
例えば、他の年に比べて非常に良いスコアが異常に多いなど、不正行為の兆候である可能性があるかどうかを調べたいかもしれません。
各生徒は同じ3つのテストに参加し、3つのテストの点数 (スコア 1、スコア 2、およびスコア 3)を受け取りました。
2つのグループ間の3つのスコアの分布はどの程度似ていますか?
最も異なるスコア分布はどれですか?
出力には、条件付き分布の視覚化と、グループ間の平均と分散の同等性に関する統計的検定が含まれている必要があります。
ヒント:KNIME Hubで可視化のための検証済みコンポーネントを確認すること。


【サンプルデータの取得】

tableファイルをダウンロードして、KNIME workflow (WF)内に格納して相対パスで読み込むところはいつもの通り。

設定:

結果:

2019年 (Group = 0) 501名と2020年 (Group = 1) 499名の計1000名分のデータが入っています。


【条件付き分布の視覚化】

今回の課題で一番苦しんだのは統計学の知識がなくて何をしたら正解かがわからない点です。
条件付き分布の視覚化 (a visualization of the conditional distributions)とは何かと調べて、下記のWFを見つけました。

なるほどヒントにあった可視化のための検証済みコンポーネントの一つであるConditional Density Plotを使えばいいのだなと納得。

Scoreの1~3それぞれにコンポーネントでの可視化を実施します。

設定(例):

Value Columnは各スコアとして、3つコンポーネントを使います。

平均値なども見せたいのでGroupごとに分けてData Explorerノードも設置することにしました。

設定:

ページのタイトルも表示させようと
String Widgetノードも使うことにしました。

設定:

上記のノードなどを一つのコンポーネントにまとめました。

黄緑で丸をしたアイコンをクリックして開くNode Usage and Layout画面で下記の通り設定しました。

結果:

Score3だと2つのグループ間差は無さそうですが、Group2は明白に分布に違いがあるし、平均値も3ほど開きがありますね。500人規模で不正があったかどうかは知りませんが、特別な変化要因はありそうだなと当たりはつきますね。可視化としてはこれで解答になるかと思います。

【統計的検定】

もう一つの課題である「グループ間の平均と分散の同等性に関する統計的検定」が私にとって難問でした。検定の経験がなく統計学について全く無知なので、「statistical test KNIME」でググって、t-kahiさんの記事を見つけました。

…統計学は完全な素人の私だと、読めばわかると言うものではなかったですが、紹介されていた下記のサイトも見て、2標本t検定をやってみることにしました。

t-kahiさんによると

対応のないt検定を実施したいので,「Independent groups t-test」ノードを使います.


「Independent groups t-test」ノードの使い方は簡単で,グループのカラムを選んで,比較したいグループ(group1 & group2)と信頼区間(95%)を選択します.
続いて,テストするカラムを選択して実行します.

https://www.t-kahi.com/entry/2019/06/14/231411

ありがたいことにノーコードで体験できそうです。

ただ、

真ん中のポートから等分散性に関する情報として,「Levene-Testの統計値」が出力されます.

とのことですが、このデータをどう扱えばいいか正しく理解できなさそうなので、今回は解釈は避けて、単に解析結果の一部を表示するまでにしました。

設定:

(他のタブは同様なので略)

結果:

p値と有意水準の比較から各スコアの値の分布にグループ間差があると言えるかどうか判定するのですが自信をもって説明できないのでここまでにします。
少なくとも先程注目していたScore2は最も異なるスコア分布でしょう。
…統計学の基礎ぐらいは知っておかないとですよね。ノーコードで使えるのはありがたいけれど、猫に小判な感じのする体験となりました。

公式解答ではどこまで解説してもらえるんだろう。
KNIME Hubに解答は上げています。



おまけ:

【JKI_028 感想戦】

前回のJKI_028は公式解答を見て、賢いなぁって感心しました。

私だとRecursive Loopでなんだか頑張って処理してしまいました。

処理回数が決まっているのだからCounting Loop処理すべきでしたか。納得です。
公式解答の面白い点はPad Leftで半角スペースを各行のループ回数分「*」で左埋めした後に半角スペースを「*」に変換するという作戦でした。こんな方法があるのかと感心しました。

設定(抜粋):

Loop完了時の結果:

そのあとわざわざ最初の行を削除するので、一見無駄なんですけど、PadLeftさせる対象として何かが存在しないとこのアルゴリズム自体が動かないので、最初の行は加えないといけなかったようです。これ以上効率化できないものかと少し触ってみましたが、私では無理でした。
簡単そうに見えて、よく練られた問題と解答だったなと改めて面白さを感じています。

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