統計

PythonのNumPyライブラリで平均・分散・標準偏差を求めてみた

PythonのNumPyライブラリには、入力データとなる多次元配列(ndarray)の平均・分散・標準偏差を求める関数が用意されている。今回は、入力データ\(x\),\(y\)の値(全20個)の合計・平均・分散・標準偏差を求めてみたので、そのサンプルプログラムを共有する。

なお、入力データを\(x_1\), \(x_2\), …, \(x_n\)とした場合の平均・分散・標準偏差は、以下の公式で求められる。

●平均

平均の公式
出所:統計WEB_平均・中央値・モード

●分散

分散の公式
出所:統計WEB_分散

●標準偏差

標準偏差の公式
出所:統計WEB_標準偏差

入力データの合計・平均は、NumPyのsum関数・mean関数を利用して算出できる。その実行結果は、以下の通り。

import numpy as np	
	
def sum_input_data(input_data):	
    ret = 0	
    for tmp in range(input_data.shape[0]):	
        ret = ret + input_data[tmp]	
    return ret	
	
# 入力データの読み込み	
input_data = np.array([[33,352], [33,324], [34,338], [34,317], [35,341], 	
                       [35,360], [34,339], [32,329], [28,283], [35,372],	
                       [33,342], [28,262], [32,328], [33,326], [35,354], 	
                       [30,294], [29,275], [32,336], [34,354], [35,368]])	
	
# x座標、y座標の抜き出し	
input_data_x = input_data[:, 0]	
input_data_y = input_data[:, 1]	
	
# x座標、y座標の合計を求める	
print("x座標の合計(sum_input_data) : " + str(sum_input_data(input_data_x)))	
print("x座標の合計(numpy_sum) : " + str(np.sum(input_data_x)))	
print()	
print("y座標の合計(sum_input_data) : " + str(sum_input_data(input_data_y)))	
print("y座標の合計(numpy_sum) : " + str(np.sum(input_data_y)))	
print()	
	
# x座標、y座標の平均を求める	
print("x座標の平均(x座標の合計÷要素数) : " + str(sum_input_data(input_data_x) / input_data_x.shape[0]))	
print("x座標の平均(numpy_mean) : " + str(np.mean(input_data_x)))	
print()	
print("y座標の平均(y座標の合計÷要素数) : " + str(sum_input_data(input_data_y) / input_data_y.shape[0]))	
print("y座標の平均(numpy_mean) : " + str(np.mean(input_data_y)))
実行結果_合計・平均

また、入力データの分散・標準偏差は、NumPyのvar関数・std関数を利用して算出できる。その実行結果は、以下の通り。

import numpy as np	
	
def variance_input_data(input_data):	
    ret = 0	
    input_data_cnt = input_data.shape[0]	
    input_data_mean = np.mean(input_data)	
    for tmp in range(input_data.shape[0]):	
        ret = ret + ((input_data[tmp] - input_data_mean) ** 2) / input_data_cnt	
    return ret	
	
def sd_input_data(input_data):	
    return np.sqrt(variance_input_data(input_data))	
    	
# 入力データの読み込み	
input_data = np.array([[33,352], [33,324], [34,338], [34,317], [35,341], 	
                       [35,360], [34,339], [32,329], [28,283], [35,372],	
                       [33,342], [28,262], [32,328], [33,326], [35,354], 	
                       [30,294], [29,275], [32,336], [34,354], [35,368]])	
	
# x座標、y座標の抜き出し	
input_data_x = input_data[:, 0]	
input_data_y = input_data[:, 1]	
	
# x座標、y座標の分散を求める	
print("x座標の分散(variance_input_data) : " + str(variance_input_data(input_data_x)))	
print("x座標の分散(numpy_var) : " + str(np.var(input_data_x)))	
print()	
print("y座標の分散(variance_input_data) : " + str(variance_input_data(input_data_y)))	
print("y座標の分散(numpy_var) : " + str(np.var(input_data_y)))	
print()	
	
# x座標、y座標の標準偏差を求める	
print("x座標の標準偏差(sd_input_data) : " + str(sd_input_data(input_data_x)))	
print("x座標の標準偏差(numpy_std) : " + str(np.std(input_data_x)))	
print()	
print("y座標の標準偏差(sd_input_data) : " + str(sd_input_data(input_data_y)))	
print("y座標の標準偏差(numpy_std) : " + str(np.std(input_data_y)))	
print()	
実行結果_分散・標準偏差

要点まとめ

  • PythonのNumPyライブラリには、入力データとなる多次元配列(ndarray)の平均・分散・標準偏差を求める関数があり、平均はmean、分散はvar、標準偏差はstdという関数となる。