修正するなど

Excelのデータを読み込む( http://d.hatena.ne.jp/fukuit/20160828/1472395613 )として書いていた記事に間違いがあったので、修正。間違えてたのは、t検定のメソッド。

t,p = stats.ttest_rel(tokyo, kyoto)

と書いていたけれど、 ttest_rel() は対応のあるt検定だった。ここは、対応のないt検定をしなければならない。その場合は、ttest_ind()を使う。

t,p = stats.ttest_ind(tokyo, kyoto)

ちなみに、studentのt検定とWelchのt検定では、Welchの方法のほうがrobustだし、正規分布を仮定しなくてもいいので、この場合はWelchの方法で良いだろうと思う。

t,p = stats.ttest_ind(tokyo, kyoto, equal_var=False)

さて、ttest_ind()には、片側検定をするためのオプションがない。東京の方が低いという仮説を検定するので、まあこれは、t値が負の値になってp値が0.025以下になればOKだろう。OKだよね?
結果は、t値が-4.09874 で、 p値が0.00014なので、「東京のほうが低いとはいえない」という帰無仮説を棄却できることになった。

グラフ描画

せっかく、数値データをExcelで読み込んだので、グラフを描画したい。R ならggplot2を使うところで、もちろんpythonでもggplot2を使えるようなんだけれど、matplotlibを使うのが一般的なようだ。

以下のように修正する。

import xlrd
import os.path
import pandas as pd
import numpy as np
from scipy import stats
from matplotlib import pyplot as plt
%matplotlib inline 

xlfile = "data.xlsx"
if os.path.exists(xlfile):
    xls = xlrd.open_workbook(xlfile)
    sheet1 = xls.sheet_by_index(0)
    nrows = sheet1.nrows - 1
    ncols = sheet1.ncols
    data = np.zeros(ncols*nrows).reshape((nrows, ncols))
    date = []
    for r in range(1, nrows+1):
        for c in range(0, ncols):
            if c==0:
                d =  xlrd.xldate.xldate_as_datetime(sheet1.cell(r,c).value, xls.datemode)
                date.append(d)
            else:
                data[r-1,c] = sheet1.cell(r,c).value

    tokyo = data[:,1]
    kyoto = data[:,2]
    
    plt.plot(date, tokyo, label="Tokyo")
    plt.plot(date, kyoto, label="Kyoto")
    plt.legend()
    plt.show()

日付が重なっちゃって読みづらいな。