「文武両道」は現実的か? (3)

By Kousuke Takeuchi on 24 October 2013 | Comments (0)

さて、前回まででデータをnumpyにフォーマットする作業が終わったので、 とりあえず相関の検定をしてみます。

統計解析ツール「R」では、無相関検定というものがあります。 要点だけ説明すると、無相関検定によって出力される「p値」が0.05よりも小さい場合は、2つのデータ間に「相関が無いことは無い」ことが証明されます。 なぜこんな遠回しの言い方をするのかというと、この検定によって無相関性が否定されても、「だからといって完全に相関があるかどうかはわからない。相関が無い可能性は低いことしかわからない。」といったことしか分からないからです。

今回は細かい議論は一旦置いといて、とりあえずRで無相関検定を行います。 ただし、Numpyにフォーマットしたデータをcsvに保存しても、そのデータはNumpy形式の数字で保存されるので、直接Rでは使うことができません。

したがって、Python上で動くRのモジュールである「rpy2」を使うことにしました。 rpy2によってNumpyのデータをRで解析したり、Pythonプログラムの中でRを使えたりします。

ちなみに、NumpyやMatplotlib、rpy2などのモジュールは、「easy_install」を使って簡単にインストールできます! 詳しくは以下のドキュメンテーションを読んでください。 setuptools 1.1.6 : Python Package Index

さて、早速今回作成したプログラムを紹介します。(最後の数行がrpy2の呼び出しで、残りは前回同様)

import xlrd
import numpy as np
#import matplotlib.pyplot as plt
import rpy2.robjects as r
import rpy2.robjects.numpy2ri as n2r

## read lerning assessment excel file and plot histgram
book = xlrd.open_workbook("unformatted_datas/learning_assessment.xls")
sh = book.sheet_by_index(0)

results = np.zeros((4,47))
row = 0
for i in (14, 18, 22, 26):
        col = 0
        for j in xrange(14, 61):
                results[row][col] = sh.cell_value(rowx=j, colx=i)
                col += 1
        row += 1

average_each_prefecture = results.mean(0)


## read physical survey text file and plot histgram
f = open('unformatted_datas/physical_survey.txt')
lines = f.readlines()
f.close

physical_results = np.zeros((4,47))

i = 0
col = 0
for line in lines:
        if i > 1:
                line2 = line.split()
                fixed_line = line2[2:4] + line2[5:7]
                for row in range(0, 4):
                        physical_results[row][col] = fixed_line[row]
                col += 1
        i += 1

average_each_prefecture2 = (physical_results[0] + physical_results[2]) / 2

## correlations test
n2r.activate()
cortest = r.r['cor.test']
print cortest(average_each_prefecture, average_each_prefecture2)

Rには無相関検定を行う「cor.test()」という関数があるので、これをrpy2によって使用します。 ただしNumpyをRで使うために、「numpy2ri」をアクティベートするのを忘れないでください。

そして、実行した結果がこちら

Pearson’s product-moment correlation

data: structure(c(14.75, 14.675, …14.975, 12.9), .Dim = 47L) and 44.37, 47.685, 44.19, 44.4), .Dim = 47L) t = 3.0029, df = 45, p-value = 0.004355 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: 0.1375490 0.6226846 sample estimates: cor 0.4085772

注目していただきたいのは、真ん中辺りの「p-value」です。これが最初に言及した「p値」のことです。

この検定でp値は0.004355となり、0.05よりも小さいので、この検定は「帰無仮説は棄却され、結果は統計的に有意である」ことが分かりました。

つまり何が言えるかというと、勉強ができる人は運動もできる可能性が高いとこがわかったということです。

今回の実験は、検定の下準備(Shapiro-Wilk検定や分散の統一性の検定)などが省かれており、あまり信用のいかない検定のまま終えることにしました。実際におっぴらに公表できる検定ではありませんが、Pythonを使ってここまで世の中のことを統計解析できることを示したかったので、あまり難しすぎる内容は省こうと思ったからです。

もしPythonやRが使える方は、ぜひこのような流れで社会を調べてみましょう!

最後に、現在「Rによる計量経済学」を読んでいます。数学をもっと世の中のことに適応させるためには、経済学に触れてみるのもいいかと思って勉強することにしました。


Generated by Jekyll and served out of Github Pages