SciPyによる統計(scipy.stats)①|SciPy入門 #3

f:id:lib-arts:20190225182115g:plain

SciPyについて色々と話題になり面白そうだったので公式チュートリアルを元にまとめています。

Linear Algebra (scipy.linalg) — SciPy v1.2.1 Reference Guide
#1、#2ではscipy.linalgを元に線形代数的な内容に関して取り扱いました。

#2でlinalgのチュートリアルは一通り終了したので、#3からは統計に関する機能であるscipy.statsについて取り扱っていきます。
以下目次になります。

1. Random Variables
2. Building Specific
3. まとめ

 

1. Random Variables
Random Variablesでは確率変数や確率分布(distribution)に関しての機能の説明が行われています。確率変数が連続(continuous random variables)のケースと離散(discrete random variables)のケースに関して実装が行われているとされています。デフォルトで80以上の連続値と10の離散値について実装されています。
また冒頭部では、モジュールのインポートに関してまとめられています。

from scipy import stats #import_1
from scipy.stats import norm #import_2

上記の二つの読み込み方について言及されており、stats全体を読み込む際はimport_1、特定のオブジェクトを明示的に読み込む際はimport_2を用います。

 

・一般的なメソッド(Common Methods)
確率分布の値を得るにあたって、いくつかのメソッドが実装されています。よく使うものとしては、確率密度関数の値を得るpdf(Probability Density Function)と累積分布関数の値を得るcdf(Cumulative Distribution Function)などが挙げられるかと思います。また、mean(平均)、std(標準偏差)、var(分散)などのメソッドなどもあります。使用例としては下記です。

import numpy as np #すでに行っていれば不要
from scipy.stats import norm #すでに行っていれば不要


print(norm.pdf(0)) #正規分布においてx=0の値
print(norm.pdf(0)) #正規分布の累積分布関数においてx=0の値
print(norm.cdf([-1., 0, 1])) #引数に配列を渡す
print(norm.cdf(np.array([-1., 0, 1]))) #引数にNumPy形式の配列を渡す(同じ結果になる)
print(norm.mean(), norm.std(), norm.var()) #平均、標準偏差、分散の出力

上記のように引数に数字を渡したり配列(リストもNumPyの配列も可)を渡したりすることで、分布に対応する値を得ることが可能です。

 

・分布の平行移動とスケールの調整(Shifting and Scaling)
locとscaleというパラメータを用いることで、分布の調整を行うことができます。基本的にはlocは平均などの代表値、scaleは分散などの散らばり具合を表すと考えていれば良さそうです。(この後の例にある一様分布など例外はあるようです)

from scipy.stats import expon #すでに行っていれば不要
from scipy.stats import uniform #すでに行っていれば不要


print(norm.stats(loc=3, scale=4, moments="mv"))
print(expon.mean(scale=3.))
print(uniform.cdf([0, 1, 2, 3, 4, 5], loc=1, scale=4))

上記の実行結果を確認することで、機能の大体のイメージがつくかと思います。

 

・分布の固定(Freezing a Distribution)
locやscaleなどのパラメータを指定して分布をオブジェクトとして固定することについてまとまっています。

from scipy.stats import gamma #すでに行っていれば不要

 

rv = gamma(1, scale=2.)
print(rv.mean(), rv.std())

上記のように新しいオブジェクトに代入することで、パラメータを指定した分布の値を取り扱いやすくすることができます。

 


2. Building Specific
この節ではどのように独自の分布を生成するかについてまとめられています。

from scipy import stats
class deterministic_gen(stats.rv_continuous):
    def _cdf(self, x):
        return np.where(x < 0, 0., 1.)
    def _stats(self):
        return 0., 0., 0., 0.


deterministic = deterministic_gen(name="deterministic")
print(deterministic.cdf(np.arange(-3, 3, 0.5)))
print(deterministic.pdf(np.arange(-3, 3, 0.5)))

上記はステップ関数を実装した例です。x=0を境に、累積分布関数が0から1に変わるような関数となっています。面白いことに、cdfを作成すると自動的にpdfも計算してくれ、値を得ることができます。

 


3. まとめ
scipy.statsのチュートリアルではオーソドックスな基礎統計の話題について諸々取り扱っているようで、今回はその中でも重要な位置づけを占める確率分布に相当している話について取り扱われていました。次回はチュートリアルページの後半部分の検定や推定などについて取り扱います。