こんにちは、えびかずきです。
今回は、Pythonで統計処理をしよう!
という事でscipy.statsモジュールの使い方について説明していきます。
こんな人におすすめ:
・Pythonで統計処理する方法を学びたい
・SciPyのstatsモジュールの使い方を教えて欲しい
初心者がまず覚えておきたいのは、
statsモジュールは基本的に以下のように記述して使うという事です。
stats.統計分布.メソッド
たとえば、正規分布に従う乱数を発生させるならこんな感じ。
stats.norm.rvs(loc=4, scale=0.8, size=10)
それでは順を追って説明していきましょう!
SciPyとは
SciPyは、科学計算向けの高機能ライブラリです。
今回説明するstatsを含む科学計算のための機能に加えて、
Pythonユーザーなら一度は使ったことがあるであろう以下のライブラリを含む大きなパッケージです。
・NumPy(テンソル計算に強い)
・Pandas(表集計に強い)
・SymPy(台数計算に強い)
・Matplotlib(データの可視化)
要するに科学計算のためのでっかいパッケージなわけです。
その中のごく一部として統計処理のモジュールが入っています。
開発環境
python 3.7.3
scipy 1.6.2
jupyter notebook
statsモジュールの使い方
scipy.statsでは基本的に以下のように統計分布を指定して使います。
stats.統計分布.メソッド
注意:
基本的な統計量、たとえば平均・分散・標準偏差などの計算はNumPyで実施することが推奨されていますので、そちらでやりましょう。
正規分布に従う乱数を発生させる
正規分布は「norm」、乱数抽出は「rvs」メソッドを使います。
rvsは、確率変数(random variables)を意味します。
「rvs」メソッドの引数はそれぞれ、loc:平均、scale:標準偏差、size:標本サイズを意味します。
以下の例は、平均=0,標準偏差=1の正規分布から標本サイズ=10で乱数を取り出すコードです。
from scipy import stats
# 正規分布に従う乱数を発生させる
test_sample = stats.norm.rvs(loc = 0, scale = 1, size = 10)
print(test_sample)
# output:
# [ 0.345 -1.304 0.494 0.783 -0.129 -0.55 0.553 -0.963 0.266 -0.62 ]
正規分布の確率密度を計算する
正規分布は「norm」、確率密度の計算には「pdf」メソッドを使います。
pdfは、確率密度関数(probability density function)の意味です。
以下の例は、平均=0,標準偏差=1の正規分布の確率密度関数をmatplotlibで可視化するコード。
import numpy as np
from scipy import stats
from matplotlib import pyplot as plt
x = np.arange(start = -4, stop = 4.1, step = 0.1)
plt.plot(x, stats.norm.pdf(x = x, loc = 0, scale = 1))
アウトプットはこんな感じ。
正規分布の累積分布関数
正規分布の累積分布関数を使うには、「cdf」メソッドを使います。
cdfは、累積分布関数(Cumulative Distribution Function)を意味します。
以下のコードは、平均=0,標準偏差=1の正規分布の累積分布関数のx=3での値を算出する例です。
from scipy import stats
# 累積分布関数
stats.norm.cdf(loc = 0, scale = 1, x = 3)
# output: 0.99865
パーセント点
分布のパーセント点を計算するには、「ppf」メソッドを使います。
ppfは、パーセント点関数(Percent Point Function)を意味します。
以下のコードは、平均=0,標準偏差=1の正規分布の下側確率が95%となるxの値を算出する例です。
from scipy import stats
# パーセント点の計算
stats.norm.ppf(loc = 0, scale = 1, q = 0.95)
# output: 1.64485
t分布の信頼区間
t分布は「t」、信頼区間の計算には「interval」メソッドを使います。
以下の例は、自由度=5,平均=0,標準偏差=1のt分布の99%信頼区間を計算したコードです。
from scipy import stats
# 99%信頼区間
stats.t.interval(alpha = 0.99, df = 5, loc = 0, scale = 1)
# output:(-4.032142983557536, 4.032142983557536)
ちなみにこの時のt分布を可視化したものがこちら。
import numpy as np
from scipy import stats
from matplotlib import pyplot as plt
x = np.arange(start = -4, stop = 4.1, step = 0.1)
plt.plot(x, stats.t.pdf(x = x, df = 5, loc = 0, scale = 1))
正規分布よりは少し尖ってますね。
番外編
分布とメソッドを指定する基本のやり方以外とは異なるものについていくつか説明します。
1標本のt検定
1標本のt検定は以下のように「ttest_1samp」メソッドで実装します。
一つ目の引数にサンプルデータを、二つ目に仮設検定の数値を入力すると、
アウトプットとしてt値と、p値が出力されます。
from scipy import stats
# t検定
stats.ttest_1samp(sample_data, 50)
# output:
# Ttest_1sampResult(statistic=2.750, pvalue=0.0127)
対応のある2標本のt検定
対応のある2標本のt検定は「ttest_rel」メソッドを使って実装します。
from scipy import stats
# 対応のあるt検定
stats.ttest_rel(data_1, data_2)
#output:
# Ttest_relResult(statistic=2.901, pvalue=0.044)
対応の無い2標本のt検定
対応のある2標本のt検定は「ttest_ind」メソッドを使って実装します。
from scipy import stats
# 対応のないt検定
stats.ttest_ind(data_1, data_2, equal_var = False)
#output:
# Ttest_indResult(statistic=3.155, pvalue=0.013)
パーセンタイル
パーセンタイルの計算は以下のようにします。
import numpy as np
from scipy import stats
test_data = np.array([1,2,3,4,5,6,7,8,9])
# パーセンタイルの計算
stats.scoreatpercentile(test_data, 25)
# output:3.0
まとめ
今回は、scipy.statsモジュールの使い方を簡単にまとめてみました。
もちろん全部覚える必要なんかありません。
基本的には「scipy.stats.統計分布.メソッド」という風に記述する。
ということだけ頭に入れておいて、あとは使う時に調べましょう!
それではまた次回。
補足
応用編として過去記事で、
statsモジュールを使ってカイ二乗検定をする方法を説明しています。
ご興味ある方は参考にしてみてください。
サイコロを1万回振って統計的に解析してみた【カイ二乗検定/Python】
参考文献
url
・Qiitaの記事
1. Pythonで学ぶ統計学 2. 確率分布[scipy.stats徹底理解](Qiita)
素晴らしく綺麗にまとまっている。入門者はまずこれを読むべき。
・Scipy公式ページのstatsチュートリアル
Statistics (scipy.stats)
割と綺麗にまとまってるのでおすすめ。
・scipy-lecture-notes Euroscipy 2010を基に日本人が翻訳したチュートリアル
Scipy Lecture notes/3.1. Python での統計
日本語なので頭に入ってきやすい。
・scipyのGithubリポジトリはこちら
https://github.com/scipy/scipy
書籍
書籍だと入門者にはこれがおすすめ。
Scipy.statsの使い方だけでなく、初学者向けに解説が充実している。
ただし、sumやmeanなど関数を非推奨のscipyで実装していることに注意。
将来的にはscipy 2.0.0移行では使えなくなる。
NumPyはSciPyの依存関係にあるため、pipでScipyをインストールすれば副次的に自動でNumpyもインストールされてます。
コメントを書く