読者です 読者をやめる 読者になる 読者になる

ami_GS's diary

情報系大学院生の備忘録。ネットワークの勉強にハマっています。

Pythonで統計処理 その1(過去サイトから)

Python

研究で統計処理が必要になったのでPythonで色々やってみたのでメモ(2014-1-24:フォント修正)

「その1」なのは今回は自分がやった事だけを紹介するため。

 

Pythonで処理しようと思ったきっかけは、

  1. 単純にR書くのが面倒(Rわからん)
  2. scipy,pandas,statsmodels等のモジュールの使い方を知りたい。
てのが理由。

 

早速

 

 

 

pandas


流行っていますね(?)

 

つい最近では

こんな 本も出ました。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

 

 他の本が積んでるので買ってません・・・

 

Pythonのデータ解析ライブラリです。簡単に言うとRのような処理ができます。

pandas自体が持っている解析の関数はバラエティーに欠けるので(多分)、

解析自体はscipy及びstatsmodelsを用い、pandasはデータの整形に用いました。

 

 

import pandas as pd

 

data = {"A": pd.Series([1,2,3,4,5]),

            "B": pd.Series([1,2,3,4,5]),

            "C": pd.Series([1,2,3,4,5]),

            "D": pd.Series([1,2,3,4,5])} #辞書作成

 

dataFrame = pd.DataFrame(data)

 

pd.Series([1,2,3,4])で返されるデータは

 

0    1

1     2

2    3

3    4

簡単に言うと、添字のついた列ベクトルになります。

それを辞書型にまとめ、pd.DataFrame()に入れると行列になります。

 

pandasについては以上。

 

scipy


数値計算ライブラリです。numpyでできた配列を高速に処理できます。

今回はscipyにある、ANOVA(分散分析)とウィルコクソンテストを使いました。

 

from scipy import stats

 

#1

z_stats, p_val = stats.ranksums(dataFrame[1], dataFrame[2])

#2

f_val, p_val = stats.f_oneway(dataFrame[1], dataFrame[2],dataFrame[3], dataFrame[4])

 

#1ではwilcoxon-rank sum検定を行っています。

今回は引数としてdataFrameから持ってきていますが、単純な配列でも大丈夫です。

返り値はz値とp値で、後はしきい値を0.05にするなり0.001にするなり好きに検定してください。

 

#2ではOneway ANOVAを行っています。

これも上記同様、引数は配列でも動作します。

返り値はF値とp値で、後は好きにしてくださいって感じ。

 

※stats.f_onewayの引数のリストがnp.ndarrayの時、nanが入っていると出力もnanになるので注意

 

 

statsmodels


くせ者。コアな統計手法を可能にしてくれます。

 

くせ者という理由は単純で、日本語のドキュメントが無いという事。

今回はTukey-Kramer HSD検定を行ったのでここ(英語)公式ドキュメント(英語)を参考にしました。

 

from statsmodels.stats.multicomp import paiwise_tukeyhsd

import numpy as np

 

Data = np.array([10,20,30,40,np.nan,20,30,40,10,20, np.nan ,40])

Idx = np.array([1,2,3,4,np.nan,2,3,4,1,2,np.nan,4]))

 

#1

hsdData = Data[np.isnan(Data) == False]

hsdIdx = Idx[np.isnan(Idx) == False]

 

print pairwise_tukeyhsd(hsdData, hsdIdx)

 

出力結果は

Multiple Comparison of Means - Tukey HSD,FWER=0.05
=========================================
group1 group2 meandiff lower upper reject
-----------------------------------------
  0      1      10.0    10.0  10.0  True 
  0      2      20.0    20.0  20.0  True 
  0      3      30.0    30.0  30.0  True 
  1      2      10.0    10.0  10.0  True 
  1      3      20.0    20.0  20.0  True 
  2      3      10.0    10.0  10.0  True 
-----------------------------------------

 

#1でnanが入っているところを除外しています。
ここでnanが入っていると、結果が多分出ないので注意
後はデータとその添字を関数に入れれば完了。
ちなみに、rejectの値がTrueのときは”優位差あり”となります。

 

 

その他matplotlib.pyplotを使ってプロットしましたが割愛。

 

ああ・・・冬休みが終わる・・・

 

卒論がんばりましょ