見出し画像

Snowflakeで仮説検定やってみた

分析屋の中田(ナカタ)です。
Snowflakeで仮説検定してみました。


仮説検定とは

仮説が正しいと言えるかを確かめる、統計的な手法です。
確かめる内容によって、カイ2乗検定やt検定など様々です。
さらにt検定にも様々な種類があります。

今回は前後比較を行いたいと思います。
いわゆる「対応のある2標本」のt検定です。


今回やること

Pythonワークシートにt検定を行うコードを書いていきます。
元データはSnowflakeのテーブルから取得します。


環境

Snowflakeのエディション:エンタープライズ版
クラウド:AWS(東京リージョン)


事前準備

元データとなるテーブルを2つ用意します(before_dataとafter_data)。
SQLワークシートにて以下のCREATE文とINSERT文を実行します。

CREATE OR REPLACE TABLE before_data (
    id INT
    ,score INT
);

CREATE OR REPLACE TABLE after_data (
    id INT
    ,score INT
);
INSERT INTO before_data 
VALUES(1,57),(2,34),(3,48),(4,38),(5,49),(6,84),(7,87),(8,58),(9,50),(10,70);

INSERT INTO after_data 
VALUES(1,69),(2,58),(3,61),(4,51),(5,49),(6,94),(7,100),(8,66),(9,96),(10,84);

これで、各テーブルに10行のサンプルデータができました。
before_dataテーブルはこんな感じです。

状況設定は何でもいいですが
「10人の学生が勉強合宿に参加した結果、テストの点数がどう変わったか」ということにします。

ここからは、勉強合宿による変化に有意差があるか?を検定していきます。


実装

①Pythonワークシートの作成

新規にPythonワークシートを開きます。
開くと、デフォルトでサンプルコードが書かれています。

このサンプルコードを軸に、書き換えを行っていきます。


②戻り値の設定

コードを書き換える前に、ライブラリの設定などをいじっておきます。
エディタの少し上に、以下の画像のような「設定」「パッケージ」というプルダウンメニューがあります。

まずは「設定」をクリックします。

「戻り値の型」をVariantにしておきます。
今回は戻り値を使わない(None)ので、何でもありのVariant型にします。
既定のTable()のままだと、戻り値にDataframeを指定しないとエラーになります。


③パッケージの設定

次は「パッケージ」をクリックします。

検索ボックスでライブラリ名を指定すると、コード内で使用できるようになります。
要するにpip install みたいなものです。

今回は画像の通り、scipyだけインストールしておきます。


④t検定の実装

書き換えたコード全体は以下の通りです。

from snowflake.snowpark import Session
from scipy import stats

def main(session: Session):    
    before = session.sql("SELECT score FROM BEFORE_DATA ORDER BY id ASC").collect()
    after = session.sql("SELECT score FROM AFTER_DATA ORDER BY id ASC").collect()

    print(stats.ttest_rel(before, after))    
    return None

以下、各行の補足です。

from snowflake.snowpark import Session
from scipy import stats

いろいろインポートしています。
Session:Snowflakeとの接続を取得するため
stat:t検定で使用するため

main関数を見ていきます。

def main(session: Session):

基本はデフォルトのサンプルコードそのままです。
引数名sessionに、接続情報Sessionを渡しています。

before = session.sql("SELECT score FROM BEFORE_DATA ORDER BY id ASC").collect()
after = session.sql("SELECT score FROM AFTER_DATA ORDER BY id ASC").collect()

SQL文でデータを取得して変数に格納しています。
ORDER BYでid順に並べ替えている理由ですが
今回は対応のある2グループのt検定を行うためです。

対応のある2グループのt検定では
各グループの1行目同士は同じ人、2行目同士も同じ人、・・・という前提があり
並び順が重要になるためです。

print(stats.ttest_rel(before, after))    
return None

t検定をして、結果を画面表示しています。
ttest_rel関数では、対応のある2グループのt検定を実行してくれます。
relはおそらくrelationとかrelatedとか、「関係」にまつわる英単語の略だと思います。

最後に、戻り値は不要なのでreturn Noneとしています。


⑤実行!

Pythonワークシートに書いたコードを実行します(Ctrl + Enter)。
main関数を呼び出すコードは記載不要です。
②の設定で、ハンドラー(必ず呼ばれる関数)にmain関数を指定しているためです。

結果は以下のように出力されます。
「PY 出力」タブをクリックします。

statistic:t値
pvalue:p値
df:最大インデックス番号
が表示されています。

有意水準が0.05だとすると、p値が0.0034…と小さいので
有意差があると言えます。

平たく言うと
「みんなの点数が伸びたのは偶然じゃなくない?勉強合宿のおかげだよね?」
ということです。


最後に

PythonワークシートはGUI操作でライブラリのインストールができるなど便利な部分もありますが
ステップイン実行などのデバッグ機能が乏しい印象です。
今後のアップデートに期待しましょう!



ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

これまでの記事はこちら!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。


noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。

この記事が参加している募集

#やってみた

36,993件