[Python] NumPy – 配列から標準偏差を求める方法

NumPyでは、配列から標準偏差を求めるためにnumpy.std()関数を使用します。

この関数は、配列全体または指定した軸に沿った標準偏差を計算します。

標準偏差は、データのばらつきを示す指標で、次の式で表されます:

\[\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i – \mu)^2}\]

ここで、\(\sigma\)は標準偏差、\(N\)はデータの数、\(x_i\)は各データ点、\(\mu\)は平均値です。

numpy.std()では、デフォルトで母標準偏差を計算しますが、ddof引数を指定することで不偏標準偏差も求められます。

この記事でわかること
  • NumPyを使った標準偏差の計算方法
  • 異常値検出のための標準偏差の活用
  • データの正規化における標準偏差の役割
  • 標準偏差を用いたデータの可視化手法
  • 統計的仮説検定での標準偏差の重要性

目次から探す

NumPyで標準偏差を求める基本

標準偏差とは?

標準偏差は、データのばらつきを示す指標です。

データが平均からどれだけ離れているかを測定し、値が大きいほどデータのばらつきが大きいことを意味します。

標準偏差は以下の数式で定義されます。

\[\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i – \mu)^2}\]

ここで、\(\sigma\)は標準偏差、\(N\)はデータの数、\(x_i\)は各データポイント、\(\mu\)は平均値です。

標準偏差は、データ分析や統計学において非常に重要な役割を果たします。

NumPyのnumpy.std()関数の基本的な使い方

NumPyライブラリには、標準偏差を計算するためのnumpy.std()関数があります。

この関数を使用することで、簡単に標準偏差を求めることができます。

基本的な使い方は以下の通りです。

import numpy as np
# データの配列
data = np.array([1, 2, 3, 4, 5])
# 標準偏差の計算
std_dev = np.std(data)
print(std_dev)
1.4142135623730951

配列全体の標準偏差を求める方法

配列全体の標準偏差を求めるには、numpy.std()関数をそのまま使用します。

デフォルトでは、全てのデータを考慮して計算されます。

以下はその例です。

import numpy as np
# データの配列
data = np.array([10, 20, 30, 40, 50])
# 配列全体の標準偏差の計算
std_dev = np.std(data)
print(std_dev)
14.142135623730951

軸に沿った標準偏差を求める方法

多次元配列の場合、特定の軸に沿った標準偏差を求めることも可能です。

axis引数を指定することで、行または列ごとの標準偏差を計算できます。

以下は2次元配列の例です。

import numpy as np
# 2次元データの配列
data = np.array([[1, 2, 3], [4, 5, 6]])
# 行ごとの標準偏差の計算
std_dev_rows = np.std(data, axis=0)
print(std_dev_rows)
# 列ごとの標準偏差の計算
std_dev_cols = np.std(data, axis=1)
print(std_dev_cols)
[1.5 1.5 1.5]
[0.81649658 0.81649658]

母標準偏差と不偏標準偏差の違い

母標準偏差は、全てのデータを用いて計算される標準偏差で、データの母集団全体を考慮します。

一方、不偏標準偏差は、サンプルデータから母集団の標準偏差を推定するために使用され、自由度を考慮して計算されます。

具体的には、不偏標準偏差は以下の数式で計算されます。

\[\sigma_{sample} = \sqrt{\frac{1}{N-1} \sum_{i=1}^{N} (x_i – \bar{x})^2}\]

ここで、\(\bar{x}\)はサンプルの平均です。

NumPyでは、ddof引数を使って不偏標準偏差を計算できます。

ddof引数の役割

numpy.std()関数ddof引数は、自由度の調整に使用されます。

デフォルトではddof=0(母標準偏差)ですが、ddof=1を指定することで不偏標準偏差を計算できます。

以下はその例です。

import numpy as np
# データの配列
data = np.array([1, 2, 3, 4, 5])
# 不偏標準偏差の計算
std_dev_sample = np.std(data, ddof=1)
print(std_dev_sample)
1.5811388300841898

このように、ddofを使うことで、母集団とサンプルの標準偏差を使い分けることができます。

標準偏差の計算における具体例

1次元配列の標準偏差を求める例

1次元配列の標準偏差を求めるのは非常に簡単です。

以下のコードでは、1次元のデータ配列を用いて標準偏差を計算しています。

import numpy as np
# 1次元データの配列
data_1d = np.array([5, 10, 15, 20, 25])
# 標準偏差の計算
std_dev_1d = np.std(data_1d)
print(std_dev_1d)
7.0710678118654755

2次元配列の標準偏差を求める例

2次元配列の場合、全体の標準偏差を求めることも、特定の軸に沿った標準偏差を求めることもできます。

以下の例では、2次元配列の全体の標準偏差と、行ごとの標準偏差を計算しています。

import numpy as np
# 2次元データの配列
data_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 全体の標準偏差の計算
std_dev_2d = np.std(data_2d)
print("全体の標準偏差:", std_dev_2d)
# 行ごとの標準偏差の計算
std_dev_rows_2d = np.std(data_2d, axis=0)
print("行ごとの標準偏差:", std_dev_rows_2d)
全体の標準偏差: 2.581988897471611
行ごとの標準偏差: [2.44948974 2.44948974 2.44948974]

3次元以上の配列での標準偏差計算

3次元以上の配列でも、標準偏差を計算することができます。

以下の例では、3次元配列の標準偏差を求めています。

import numpy as np
# 3次元データの配列
data_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 全体の標準偏差の計算
std_dev_3d = np.std(data_3d)
print(std_dev_3d)
# 軸0に沿った標準偏差の計算
std_dev_axis0 = np.std(data_3d, axis=0)
print(std_dev_axis0)
2.29128784747792
[[2. 2.]
 [2. 2.]]

複数の軸に沿った標準偏差の計算

複数の軸に沿った標準偏差を計算することも可能です。

以下の例では、2次元配列に対して、行と列の両方に沿った標準偏差を計算しています。

import numpy as np
# 2次元データの配列
data_multi_axis = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 行ごとの標準偏差の計算
std_dev_rows_multi = np.std(data_multi_axis, axis=0)
print("行ごとの標準偏差:", std_dev_rows_multi)
# 列ごとの標準偏差の計算
std_dev_cols_multi = np.std(data_multi_axis, axis=1)
print("列ごとの標準偏差:", std_dev_cols_multi)
行ごとの標準偏差: [2.44948974 2.44948974 2.44948974]
列ごとの標準偏差: [0.81649658 0.81649658 0.81649658]

ddofを使った不偏標準偏差の計算例

不偏標準偏差を計算するためには、ddof引数を使用します。

以下の例では、1次元配列に対して不偏標準偏差を計算しています。

import numpy as np
# 1次元データの配列
data_sample = np.array([10, 20, 30, 40, 50])
# 不偏標準偏差の計算
std_dev_sample = np.std(data_sample, ddof=1)
print(std_dev_sample)
15.811388300841896

このように、ddofを使うことで、サンプルデータから不偏標準偏差を簡単に計算することができます。

応用例:標準偏差を使ったデータ分析

標準偏差を使った異常値検出

標準偏差は、データセット内の異常値(アウトライヤー)を検出するために使用されます。

一般的に、平均から3倍の標準偏差以上離れたデータポイントは異常値と見なされることが多いです。

以下のコードでは、異常値を検出する方法を示しています。

import numpy as np
# データの配列
data = np.array([10, 12, 12, 13, 12, 100, 12, 11, 12, 13])
# 平均と標準偏差の計算
mean = np.mean(data)
std_dev = np.std(data)
# 異常値の閾値
threshold = 3 * std_dev * 0.999
# 異常値の検出
outliers = data[(data < mean - threshold) | (data >= mean + threshold)]
print("異常値:", outliers)
異常値: [100]

標準偏差と平均を使ったデータの正規化

データの正規化は、異なるスケールのデータを比較可能にするために重要です。

標準偏差と平均を使用して、データを標準化(Zスコア変換)することができます。

以下のコードでは、データの正規化を行っています。

import numpy as np
# データの配列
data = np.array([10, 20, 30, 40, 50])
# 平均と標準偏差の計算
mean = np.mean(data)
std_dev = np.std(data)
# Zスコアの計算
z_scores = (data - mean) / std_dev
print("正規化されたデータ:", z_scores)
正規化されたデータ: [-1.41421356 -0.70710678  0.          0.70710678  1.41421356]

標準偏差を使ったデータのばらつきの可視化

データのばらつきを可視化するために、標準偏差を利用してヒストグラムを作成することができます。

以下のコードでは、データの分布と標準偏差を示すヒストグラムを描画しています。

import numpy as np
import matplotlib.pyplot as plt
# データの配列
data = np.random.normal(loc=0, scale=1, size=1000)
# ヒストグラムの描画
plt.hist(data, bins=30, alpha=0.5, color='blue', edgecolor='black')
# 平均と標準偏差の計算
mean = np.mean(data)
std_dev = np.std(data)
# 平均と標準偏差のラインを描画
plt.axvline(mean, color='red', linestyle='dashed', linewidth=1, label='平均')
plt.axvline(mean + std_dev, color='green', linestyle='dashed', linewidth=1, label='平均 + 標準偏差')
plt.axvline(mean - std_dev, color='green', linestyle='dashed', linewidth=1, label='平均 - 標準偏差')
plt.title('データのばらつきの可視化')
plt.xlabel('値')
plt.ylabel('頻度')
plt.legend()
plt.show()

標準偏差を使った統計的仮説検定

標準偏差は、統計的仮説検定においても重要な役割を果たします。

例えば、t検定では、サンプルの標準偏差を使用して、2つのグループの平均が異なるかどうかを検定します。

以下は、t検定の実施例です。

import numpy as np
from scipy import stats
# 2つのサンプルデータ
group1 = np.array([1, 2, 3, 4, 5])
group2 = np.array([2, 3, 4, 5, 6])
# t検定の実施
t_statistic, p_value = stats.ttest_ind(group1, group2)
print("t統計量:", t_statistic)
print("p値:", p_value)
t統計量: -1.0
p値: 0.34659350708733416

標準偏差と分散の関係

標準偏差と分散は、データのばらつきを表す2つの異なる指標です。

分散は、データポイントが平均からどれだけ離れているかの二乗平均を示し、標準偏差はその平方根です。

以下の数式で表されます。

  • 分散: \(\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i – \mu)^2\)
  • 標準偏差: \(\sigma = \sqrt{\sigma^2}\)

NumPyでは、分散を計算するためのnumpy.var()関数があります。

以下のコードでは、分散と標準偏差を同時に計算しています。

import numpy as np
# データの配列
data = np.array([1, 2, 3, 4, 5])
# 分散と標準偏差の計算
variance = np.var(data)
std_dev = np.std(data)
print("分散:", variance)
print("標準偏差:", std_dev)
分散: 2.0
標準偏差: 1.4142135623730951

このように、標準偏差と分散は密接に関連しており、データのばらつきを理解するために重要な指標です。

よくある質問

numpy.std()とnumpy.var()の違いは?

numpy.std()numpy.var()は、どちらもデータのばらつきを測定するための関数ですが、計算する指標が異なります。

具体的には、以下のような違いがあります。

  • numpy.std(): 標準偏差を計算します。

データのばらつきを示す指標で、単位は元のデータと同じです。

  • numpy.var(): 分散を計算します。

データのばらつきの二乗平均を示し、単位は元のデータの単位の二乗になります。

例えば、データが\[1, 2, 3\]の場合、標準偏差は約0.816、分散は約0.667となります。

標準偏差はデータのばらつきを直接的に示すため、解釈が容易です。

ddofの値を変えると結果はどう変わる?

ddof(自由度の調整)引数は、標準偏差や分散を計算する際の自由度を調整するために使用されます。

ddofの値を変えることで、計算結果が異なります。

具体的には、以下のような影響があります。

  • ddof=0: 母標準偏差(全体のデータを考慮)を計算します。

データの全体的なばらつきを示します。

  • ddof=1: 不偏標準偏差(サンプルデータから母集団を推定)を計算します。

サンプルデータのばらつきをより正確に反映します。

例えば、サンプルデータが\[1, 2, 3, 4, 5\]の場合、ddof=0で計算した標準偏差は1.414、ddof=1で計算した標準偏差は1.581となります。

サンプルデータのばらつきを評価する際には、ddof=1を使用することが一般的です。

標準偏差が0になるのはどんな場合?

標準偏差が0になるのは、データの全ての値が同じである場合です。

この場合、データのばらつきが全くないため、平均からの偏差も全て0になります。

具体的には、以下のような状況です。

  • データがすべて同じ値で構成されている(例: \[5, 5, 5, 5\])。
  • データの数が1つだけの場合(例: \[10\])。

このような場合、標準偏差は0となり、データのばらつきがないことを示します。

まとめ

この記事では、NumPyを使用して標準偏差を求める方法やその応用例について詳しく解説しました。

標準偏差はデータのばらつきを測定する重要な指標であり、異常値の検出やデータの正規化、さらには統計的仮説検定など、さまざまなデータ分析に役立ちます。

これらの知識を活用して、実際のデータ分析やプログラミングに取り組んでみてください。

  • URLをコピーしました!
目次から探す