【Google Colaboratory / Python】Excelのデータからシャピロ-ウィルクの検定とコルモグオロフス-ミノルフ検定(KS検定)を行う方法

大学の課題で大半がR言語を用いていたが、R言語って環境構築が大変そう(適当)なので、環境構築なしですぐにPythonを使う方法をここに書く。

1. Google Colaboratoryにログインする

Google Colaboratoryにアクセスして、自分のGoogleアカウントでログインしましょう。

f:id:KoNitech:20200801202637p:plain

2. Google Colabのノートブックを新規作成

「ファイル」>「ノートブックを新規作成」をクリック

f:id:KoNitech:20200801203019p:plain

3. Excelファイルのアップロード

左側にあるファイルのボタン(青色で囲んであるアイコン)をクリックして、
オレンジ色の範囲にドラッグ&ドロップExcelファイルをアップロードしてください。
(もしくは赤色のボタンを押してアップロードしてください)

f:id:KoNitech:20200801205641p:plain

邪魔なのでオレンジ範囲のXボタンを押して非表示にしてください。

4. Excelファイルの読み込みテスト

注意: 以下データ1つ1つに対して実行してあげないと、いい感じになりません。(身長のデータだけとか体重のだけという意味です) あと、しばらくするとExcelファイルは削除されるので注意してください。(仮想環境ごとに削除されるため)

今回のExcelファイルの形式

今回用いるExcelファイルは以下のようになっています。
Excelファイル名は「data.xlsx」。
・Sheet1の1列目に身長をheaderありで、headerの下にデータを置いています。
・Sheet2の1列目に体重をheaderありで、headerの下にデータを置いています。

f:id:KoNitech:20200801205857p:plain f:id:KoNitech:20200801205852p:plain

ソースコード

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel("data.xlsx", sheet_name="Sheet1")

df.head()

pd.read_excel("data.xlsx", sheet_name="Sheet1")
注意 第一引数にはExcelファイル名, sheet_nameにはシート名を書きます。

もしもExcelファイルが、たとえば次のような形式であれば以下のようにしてください。
(ry)(後で書くかも) 参考: pandasでExcelファイル(xlsx, xls)の読み込み(read_excel)

ソースコードなど参考
【初心者向け】Google ColaboratoryでDataFrameにExcel・CSVファイルを読み込む - Qiita

実行

以下のようにソースコードをコピペして、適切に編集したら三角丸アイコンを押して実行します。
すると以下のように表示されるはずです。
ここで適切に設定できていれば大丈夫ですが、できていなければエラーが出たり、この後で失敗することになってしまいます。

f:id:KoNitech:20200801210837p:plain
Excelファイルの読み込みテスト_実行

5. シャピロ-ウィルクの検定を行う

やっと本番です。

コードセルの追加

「+コード」ボタンを押して、コードの欄(コードセル)を増やします。

f:id:KoNitech:20200801211358p:plain
コード追加

新しくできたコードセルへ、次のソースコードを書き込んでください。

ソースコード

import numpy as np 
from numpy.random import *
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
def check_norm(x):
    plt.title("height")
    plt.hist(x, bins = 10, ) #ヒストグラム表示
    plt.pause(.01)
    stats.probplot(x, dist = "norm", plot = plt) #QQプロット表示
    plt.pause(.01)
    W, p = stats.shapiro(x) #シャピロウィルク検定
    print("シャピロウィルク検定のp値: " + str(p))
    print("データ数: " + str(len(x)))

df_height = pd.read_excel("data.xlsx", sheet_name="Sheet1")
#df_height.head()
data_height = df_height["身長"]
check_norm(data_height)

先程のように自分のデータと合うように適切に、このソースコードを編集してください。

ソースコード参考
Pythonでデータの正規性を確認するサンプルコード - なろう分析記録

実行

実行結果などは以下のようになります。 f:id:KoNitech:20200801212604p:plain f:id:KoNitech:20200801212559p:plain

6. コルモグオロフス-ミノルフ検定(KS検定)を行う

だいたいシャピロウィルクの検定と同じです。

コードセルの追加

「+コード」ボタンを押して、コードの欄(コードセル)を増やします。

f:id:KoNitech:20200801211358p:plain
コード追加

新しくできたコードセルへ、次のソースコードを書き込んでください。

ソースコード

import numpy as np 
from numpy.random import *
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
def check_norm(x):
    plt.title("height")
    plt.hist(x, bins = 10, ) #ヒストグラム表示
    plt.pause(.01)
    stats.probplot(x, dist = "norm", plot = plt) #QQプロット表示
    plt.pause(.01)

    loc, scale = stats.norm.fit(x)
    n = stats.norm(loc=loc, scale=scale)
    value = stats.kstest(x, n.cdf) #コルモグオロフスミノルフ(KS)検定
    print("コルモグオロフスミノルフ(KS)検定のp値: " + str(value.pvalue))
    print("データ数: " + str(len(x)))

df_height = pd.read_excel("data.xlsx", sheet_name="Sheet1")
#df_height.head()
data_height = df_height["身長"]
check_norm(data_height)

先程のように自分のデータと合うように適切に、このソースコードを編集してください。
value = stats.kstest(x, "norm") #コルモグオロフスミノルフ(KS)検定
KS検定の場合は5.と違い、このようにします。
(これは嘘です)

平均、標準偏差、サンプル数
loc, scale, size
を適切に設定する必要があるそうです。

ソースコード参考
pythonで正規性の検定【コロモゴロフスミルノフ検定(KS検定)】 - 技術メモ K-S検定(コルモゴロフ-スミルノフ検定)と、その誤用について - Qiita p_value is 0 when I use scipy.stats.kstest() for large dataset - Stack Overflow

実行

データを用意していないため、実行結果がありません。

まとめ

以上のようにすることで、シャピロウィルクの検定とKS検定を環境構築せず、Google Colaboratory上のPythonで行うことができます。
お疲れ様でしたー!