python PR

【pythonで統計学】正規性の検定(シャピロウィルク検定etc)のかけ方~サンプルコード付き~

python 正規性の検定
記事内に商品プロモーションを含む場合があります

t検定などの統計手法をかける場合には、まずそのデータが正規分布しているかを調べなくてはいけません

正規性を確認する方法の一つに、ヒストグラムを書いて目視で確認する、という方法がありますが、これだけでは正確ではありません

そこで、「Q-Qプロット」や「シャピロウィルク検定」「コルモゴロフスミルノフ検定」などを使用して、正規性を確認していきます

実際に統計をかける場合には、csvやexcelデータなどを読み込んで、統計にかけることが多いと思います

そこで今回は、pythonを使ってcsvから取り込んだデータで正規性の検定を行う方法について、解説していきたいと思います

pythonで統計学を学ぶ流れは以下の記事を参考にしてください

python 統計学
pythonで統計学を学ぶメリット〜実際の学習手順を紹介〜近年、データサイエンティストの需要が高まってきていますが、データサイエンティスト必須能力として、「プログラミング言語」「統計学」が挙げられています。pythonで統計学を扱えれば、データサイエンティストとしての道も開けるでしょう。今回はpythonで統計学を学ぶメリットや実際にどのように学習していくべきかを解説していきたいと思います。...

正規性の検定とは

正規性の検定とは、データの母集団が正規分布に従っているかどうかを調べる検定です

コルモゴロフスミルノフ検定やリリフォース検定、シャピロウィルク検定などがあります

正規性がある場合にはパラメトリック検定を用い、

正規性がない場合にはノンパラメトリック検定を用いる必要があります

正規性の検定の仮説は以下のようになっています

  • 帰無仮説H0:「データの母集団は正規分布に従っている」
  • 対立仮説H1:「データの母集団は正規分布に従っていない」

検定統計量が定めた有意水準以下の場合には、帰無仮説が棄却されることになります

統計学の基本

pythonで正規性の検定を行う

pythonで正規性の検定を行う場合には、scipy.statsを使用します

コルモゴロフスミルノフ検定はデータ数が多い場合に使用します

データ数の目安は1000以上とされています

今回はe-statで無料配布されているデータセットを用いて正規性の検定をかけていきたいと思います

統計用サンプルデータ修正
下から2行は不要なので、削除して使用をします

pythonでシャピロウィルク検定をかける

pythonでシャピロウィルク検定をかける場合には、以下のように記載をします

scipy.stats.shapiro(x)

xには該当するデータを入力すればOKです

私のシャピロウィルク検定のサンプルコードはこちら

def btn_click1():
    filename = filedialog.askopenfilename(
            filetypes=[('csv files', '*.csv')], initialdir=os.getcwd())
    if not filename == '':
        with open(filename, 'r') as f:
                reader = csv.reader(f)
                headerList = reader.__next__()
                listBoxData = {}
                listbox.delete(0, tk.END)
                listbox1.delete(0, tk.END)
    
                for i in range(0,len(headerList)):
                    listBoxData[i]={}
                    listBoxData[i]['name']=headerList[i]
                    listBoxData[i]['list']=[]
                    listbox.insert(tk.END,headerList[i])  
        
                for rowList in reader:
                    for j in range(0,len(rowList)):
                        listBoxData[j]['list'].append(rowList[j])     
          
    def shapiro(event):
        selectIdx=listbox.curselection()
        if len(selectIdx)>0:
            listbox1.delete(0,tk.END)
            a=stats.shapiro(listBoxData[selectIdx[0]]['list'])
            listbox1.insert(tk.END,"Statistics=%.3f,p=%.3f" %(a))
            
    listbox.bind("<<ListboxSelect>>",shapiro)

私が作成しているものでは、取り込んだcsvデータの項目に値を対応させて、それをクリックするだけで、シャピロウィルク検定の結果が表示されるようにしています

上記の方法は煩雑なので、csvから取り込んだ指定のデータを正規性の検定にかけたいと思います

csvから取り込んだ指定のデータをシャピロウィルク検定にかける

import pandas as pd 
import os 
import csv
from scipy import stats

def shapirotest():
    type = [("all file","*")]    # 読み取るファイルをcsvに絞り込む。
    file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())  
    stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)

    print(stasticsdata)
    A_list=stasticsdata.iloc[:,2]
    A=list(A_list)
    B_list=stasticsdata.iloc[:,3]
    B=list(B_list)
    
    result=stats.shapiro(A)
    result=stats.shapiro(B)

上記コードで2列目と3列目のデータをシャピロウィルク検定にかけることができます

A_list=stasticsdata.iloc[:,2]

上記の[:2]の部分を3,4,5…と変えていけば、4列目,5列目…
をシャピロウィルク検定にかけることが可能です

pythonでコルモゴロフスミルノフ検定をかける

pythonでコルモゴロフスミルノフ検定をかける場合には、以下のように記載をします

scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', mode='auto')

実際にはrvsの部分だけでいけるはずです

サンプルコードは以下になります

import pandas as pd 
import os 
import csv
from scipy import stats

def kstest():
    type = [("all file","*")]    # 読み取るファイルをcsvに絞り込む。
    file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())  
    stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)

    print(stasticsdata)
    A_list=stasticsdata.iloc[:,2]
    A=list(A_list)
    B_list=stasticsdata.iloc[:,3]
    B=list(B_list)
    
    result=stats.kstest(A)
    result=stats.kstest(B)

シャピロウィルク検定とほぼ同じです

stats.shapiroになるか、stats.kstestになるかの違いになります

コルモゴロフスミルノフ検定ではデータ数が少ないと正しいp値が返ってこないため、データ数が少ないばあいには、シャピロウィルク検定をかけるようにしましょう

Q-Qプロットで正規性の確認を行う

最後にQ-Qプロットで正規性を確認する方法を解説していきます

scipy.stats.probplot(x, sparams=(), dist='norm', fit=True, plot=None, rvalue=False)

コードは上記のようになります

私が作成したサンプルコードは以下

import pandas as pd 
import os 
import csv
from scipy import stats

def qq():
    type = [("all file","*")]    # 読み取るファイルをcsvに絞り込む。
    file_path_stastics = filedialog.askopenfilename(filetypes = type, initialdir = os.getcwd ())  
    stasticsdata = pd.read_csv(file_path_stastics, engine="python",index_col=None)

    A_list=stasticsdata.iloc[:,2]
    A=list(A_list)
    B_list=stasticsdata.iloc[:,3]
    B=list(B_list)

    stats.probplot(A, dist="norm", plot=plt)
    stats.probplot(B, dist="norm", plot=plt)
    plt.legend(['A','', 'B',''])
    plt.show()

これを実行すると、このようなQ-Qプロットが作成されますQ-Qプロット

Q-Qプロットでは、正規性に従っている場合、点が直線上に並びます

今回の場合は、ちょっと悩みますが、正規分布に従っていると判断して良さそうです

Q-Qプロットだけでは判断ができない時には、シャピロウィルク検定の結果も加味して考える必要があります

まとめ

今回は正規性の検定について解説をしました

pythonを使えば簡単に統計をかけることができます

統計をかけること自体は簡単に行えますが、群の設定やcsvから取り込んだデータの処理などがややめんどくさいかもしれません

しかし、一度作ってしまえば、他の統計をかけるときも

stats.xxxxxx()

xのところだけを変えるのみで済むので、スムーズに作ることができると思います

さらにGUIにしてしまえば、自分だけではなく、pythonの入っていないパソコンでも使うことができます

ぜひ参考にしてみてください

私がpythonを学ぶのに参考にした書籍は以下です

スクールに通わずにpythonを学習するためには?

Python学習を進めていく上で、

「ひとまず何かしらの書籍に目を通したい」「webで調べても全くわからない」という状況が何度も何度でも出てくるかと思います。

そういう時に便利なのが、kindleとテラテイルです。

Kindleはご存知の通り、電子書籍です。

Kindleには多くのpython学習本が用意されており、無料で読むことができます。(たまに有料もあります)

ひとまずどういった書籍があるのか?もしものために、書籍に目を通しておこう

という場合には、kindleの利用がおすすめです。

kindleでpythonの書籍を無料で読んでみる

おすすめプログラミングスクール

DMMWEBCAMP
  • WEBCAMPはコスパ最強
  • WEBCAMPは初心者に優しい充実したサポート付き
  • 16週間プランを選択して、返金してもらおう
WEBCAMPの公式ページはこちら WEBCAMPの口コミ・評価はこちら
テックアカデミー  
  • テックアカデミーは費用対効果抜群
  • テックアカデミーのサポートは個人の能力に応じつつ、python初心者に優しい
  • まずは無料体験でテックアカデミーを知ってから受講を決める
テックアカデミーの公式ページはこちら テックアカデミーの口コミ・評価はこちら
キカガク
  • 多種多様なスキルコース
  • 初心者から専門家まで対象
  • 給付金利用で費用を抑えられる
キカガクの公式ページはこちら キカガクの口コミ・評価はこちら
Aidemy Premium
  • 完全オンラインで、時間や場所に縛られず学習したい
  • マンツーマン学習サポートにより実践に近い経験をしたい
  • 未経験から機械学習エンジニアになりたい
Aidemy Premiumの公式ページはこちら Aidemy Premiumの口コミ・評価はこちら
My Agile Privacy
This website uses technical and profiling cookies. Clicking on "Accept" authorises all profiling cookies. Clicking on "Refuse" or the X will refuse all profiling cookies. By clicking on "Customise" you can select which profiling cookies to activate.