Python3(matplotlib, pandas, Scipy)で、分散分析。stats.pearsonr()

Python3コード

#!/usr/bin/env python3


"""(docstring)
"""


# 使用したデータは『すぐできる生物統計』
#
# 相関分析(ピアソンの相関係数)
#
# 年輩患者の心臓血管の健康状態を調べるため、30人の患者の心拍数と血圧が測定された。
# これらの変数(変量)の間に直線的な関連があるだろうか。
#
# 帰無仮説
# 2組の測定値の間に関連がない。
# 具体的には、
# 血圧と心拍数の間に関連がない。


import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats


def main():
    """(docstring)
    """

    # matplotlib
    # macOSやOS Xで文字化けするなら。
    font = {'family' : 'Osaka'}

    # 患者30名、心拍数(1分あたり)、血圧(mm Hg)
    #
    # (直下は、患者の番号を振るのに面倒なんでこういう処理をしている。
    # とくにデータとして使用するわけではないんで、不要なら削除するか、そもそも書かないほうがいいい)。
    n = list(range(1, 30+1))
    dat = {'患者': [*n],
           '心拍数': [67, 75, 63, 89, 53, 76, 98, 75, 71, 65,
                     69, 74, 80, 58, 76, 68, 64, 76, 79, 72,
                     60, 67, 63, 90, 50, 73, 64, 68, 65, 70],
           '血圧': [179, 197, 175, 209, 164, 180, 212, 187, 189, 176,
                   167, 186, 198, 170, 187, 175, 169, 190, 176, 168,
                   158, 160, 167, 221, 149, 180, 168, 162, 168, 157]}

    # 上のように辞書型でデータを作成すると、DataFrame()で列の順序が変わってしまうことがある。
    # 意図した通りにしたい場合、DataFrame()内でcolumns引数にまた渡してやればいい。
    df = pd.DataFrame(dat, columns = ['患者', '心拍数', '血圧'])
    print(df)
    print('')

    # 要約統計量 (ざっと見るだけ)
    print(df.describe())
    print('')

    # matplotlib
    # 散布図。
    plt.scatter(df.ix[:, '血圧'], df.ix[:, '心拍数'])
    plt.xlabel('血圧')
    plt.ylabel('心拍数')
    plt.show()

    # 相関係数(ピアソン)とp値。
    print('scipy.stats.pearsonr()')
    res = sp.stats.pearsonr(df.ix[:, '血圧'], df.ix[:, '心拍数'])
    print(res)
    print('')

    Pearsons_correlation_coefficient, two_tailed_p_value = sp.stats.pearsonr(df.ix[:, '血圧'], df.ix[:, '心拍数'])
    print('ピアソンの相関係数とp値(両側)')
    print('{0}{1} {2}'.format(round(Pearsons_correlation_coefficient, 3), ',',
                              round(two_tailed_p_value, 3)))
    print('')

    # 帰無仮説が棄却されるかどうかの判定。
    p_value = round(res[1], 3)
    if p_value < 0.05:
        print('{0}{1} {2}'.format('p値', p_value, '< 0.05'))
        print('血圧と心拍数の間に関連がないという帰無仮説は棄却される。')
    else:
        print('{0}{1} {2}'.format('p値', p_value, '> 0.05'))
        print('血圧と心拍数の間に関連がないという帰無仮説は棄却されない。')

if __name__ == '__main__':
    main()

出力

    患者  心拍数   血圧
0    1   67  179
1    2   75  197
2    3   63  175
3    4   89  209
4    5   53  164
5    6   76  180
6    7   98  212
7    8   75  187
8    9   71  189
9   10   65  176
10  11   69  167
11  12   74  186
12  13   80  198
13  14   58  170
14  15   76  187
15  16   68  175
16  17   64  169
17  18   76  190
18  19   79  176
19  20   72  168
20  21   60  158
21  22   67  160
22  23   63  167
23  24   90  221
24  25   50  149
25  26   73  180
26  27   64  168
27  28   68  162
28  29   65  168
29  30   70  157

              患者        心拍数          血圧
count  30.000000  30.000000   30.000000
mean   15.500000  70.600000  178.133333
std     8.803408  10.311025   17.016692
min     1.000000  50.000000  149.000000
25%     8.250000  64.250000  167.250000
50%    15.500000  69.500000  175.500000
75%    22.750000  75.750000  187.000000
max    30.000000  98.000000  221.000000

scipy.stats.pearsonr()
(0.85953599393919811, 1.1825239589373128e-09)

ピアソンの相関係数とp値(両側)
0.86, 0.0

p値0.0 < 0.05
血圧と心拍数の間に関連がないという帰無仮説は棄却される。

散布図

f:id:my_notes:20170808213132p:plain

参考文献

パソコンで簡単!すぐできる生物統計―統計学の考え方から統計ソフトSPSSの使い方まで

パソコンで簡単!すぐできる生物統計―統計学の考え方から統計ソフトSPSSの使い方まで