2016-03-31  python  numpy 

Python練習(分散と不偏分散)

奥村先生の「分散は$n$で割るか$n-1$で割るか」の数値実験を(Rではなく)Pythonでやってみます。

参照

ソース

import numpy as np

def lack_list(a):
    s = []
    for k in range(0,len(a)):
        t = a.copy()
        del t[k]
        s.append(t)
    return s

def print_var(l, ddof=0):
    v = np.var(l, ddof=ddof)
    print(l, v)
    return v

def print_vars(s, ddof=0):
    print('ddof =', ddof)
    vs = []
    for l in lack_list(s):
        vs.append(print_var(l, ddof=ddof))
    print('mean of var = ', np.mean(vs))
    print('var         = ', np.var(s, ddof=ddof))
    print()

s = [1,2,3,4,5]
print_vars(s, ddof=0)
print_vars(s, ddof=1)

結果

ddof = 0
[2, 3, 4, 5] 1.25
[1, 3, 4, 5] 2.1875
[1, 2, 4, 5] 2.5
[1, 2, 3, 5] 2.1875
[1, 2, 3, 4] 1.25
mean of var =  1.875
var         =  2.0

ddof = 1
[2, 3, 4, 5] 1.66666666667
[1, 3, 4, 5] 2.91666666667
[1, 2, 4, 5] 3.33333333333
[1, 2, 3, 5] 2.91666666667
[1, 2, 3, 4] 1.66666666667
mean of var =  2.5
var         =  2.5

もっと長い値でやってみると

s = list(range(0,1000))でやった場合。

ddof = 0
mean of var =  83333.1664998
var         =  83333.25

ddof = 1
mean of var =  83416.6666667
var         =  83416.6666667

ランダムでやってみると

s = list(np.random.rand(1000))でやった場合。

ddof = 0
mean of var =  0.0832961539946
var         =  0.0832962374577

ddof = 1
mean of var =  0.0833796170748
var         =  0.0833796170748

課題

 2016-03-31  python  numpy