奥村先生の「分散は\(n\)で割るか\(n-1\)で割るか」の数値実験を(Rではなく)Pythonでやってみます。
ddof=0
で、\(n-1\)で割る不偏分散はddof=1
です。lack_list
では、与えられたリストから要素を一個ずつ落としたリストのリストを作ります。print_vars
では、要素を一個ずつ落としたリストの(不偏)分散と、もともとのリストの(不偏)分散を並べて表示します。import numpy as np
def lack_list(a):
= []
s for k in range(0,len(a)):
= a.copy()
t del t[k]
s.append(t)return s
def print_var(l, ddof=0):
= np.var(l, ddof=ddof)
v print(l, v)
return v
def print_vars(s, ddof=0):
print('ddof =', ddof)
= []
vs for l in lack_list(s):
=ddof))
vs.append(print_var(l, ddofprint('mean of var = ', np.mean(vs))
print('var = ', np.var(s, ddof=ddof))
print()
= [1,2,3,4,5]
s =0)
print_vars(s, ddof=1) print_vars(s, ddof
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
ddof=1
の方は[1,2,3,4,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