【SciPy 一問一答】統計学を学ぶにあたって知っておくと良いSciPyの用法

SciPyNumPyに基づくライブラリであり、統計学に関するプログラムでは乱数生成の際などによく用います。使用方法の詳細に関しては都度調べれば十分である一方で基本的な用法に関しては抑えておくと良いので、当記事ではSciPyの抑えておきたい用法について一問一答形式でまとめました。

・プログラム集まとめ
https://www.hello-statisticians.com/stat_program

基本事項の確認

NumPyによる行列の取り扱い

下記で詳しく取り扱った。

ライブラリの読み込み

解答$1$つ$1$つでライブラリの読み込みを行うと冗長であるので、以下を実行した上でそれぞれの解答のプログラムを実行する必要がある。

import numpy as np
from scipy import stats

乱数の固定

乱数は「漸化式」のような考え方に基づいて生成することから、初期値の値に基づいてその後の値が決まる。逆に考えると、初期値を固定することで再現性のある結果を得ることができる。乱数の固定は下記のように行うことができる。

np.random.rand(0)

上記ではseed0を用いたが、値を定めて結果が再現できれば12など、他の数字を用いても良い。統計学の検証の際に乱数を用いる際は結果が再現できる必要があるので、乱数の固定は必須である。

一問一答

乱数の生成

Q.1-1-1 標準正規分布$\mathcal{N}(0,1)$に基づく乱数の生成

標準正規分布$\mathcal{N}(0,1)$に従う乱数を$20$個生成し、変数xに格納せよ。また、xNumPyの形式で定められることを確認せよ。

・解答

np.random.seed(0)

x = stats.norm.rvs(size=20)
print(type(x))
print(x)

・実行結果

<type 'numpy.ndarray'>
[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799 -0.97727788
  0.95008842 -0.15135721 -0.10321885  0.4105985   0.14404357  1.45427351
  0.76103773  0.12167502  0.44386323  0.33367433  1.49407907 -0.20515826
  0.3130677  -0.85409574]

Q.1-1-2 標準正規分布$\mathcal{N}(\mu,\sigma^2)$に基づく乱数の生成

stats.norm.rvsを用いて$\mu=2, \sigma=3$の正規分布$\mathcal{N}(\mu,\sigma^2)$に従う乱数を$20$個生成し、変数xに格納せよ。

・解答

np.random.seed(0)

x = stats.norm.rvs(loc=2, scale=3, size=20)
print(x)

・実行結果

[ 7.29215704  3.20047163  4.93621395  8.7226796   7.60267397 -0.93183364
  4.85026525  1.54592838  1.69034344  3.23179551  2.43213071  6.36282052
  4.28311318  2.36502505  3.3315897   3.00102298  6.48223722  1.38452521
  2.9392031  -0.56228722]

Q.1-1-3 一様分布$\mathrm{Uniform}(0,1)$に基づく乱数の生成

stats.uniform.rvsを用いて一様分布$\mathrm{Uniform}(0,1)$に従う乱数を$20$個生成し、変数xに格納せよ。

・解答

np.random.seed(0)

x = stats.uniform.rvs(size=20)
print(x)

・実行結果

[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548   0.64589411
  0.43758721  0.891773    0.96366276  0.38344152  0.79172504  0.52889492
  0.56804456  0.92559664  0.07103606  0.0871293   0.0202184   0.83261985
  0.77815675  0.87001215]

解説
np.random.rand(20)でも同様の結果が得られることも合わせて抑えておくと良いです。

np.random.seed(0)
x = np.random.rand(20)
print(x)

・実行結果

[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548   0.64589411
  0.43758721  0.891773    0.96366276  0.38344152  0.79172504  0.52889492
  0.56804456  0.92559664  0.07103606  0.0871293   0.0202184   0.83261985
  0.77815675  0.87001215]