(-pi, pi) 範囲の一連の角度値について、ヒストグラムを作成します。平均値とモーダル (確率後) 値を計算する効果的な方法はありますか? 次の例を検討してください。
import numpy as N, cmath
deg = N.pi/180.
d = N.array([-175., 170, 175, 179, -179])*deg
i = N.sum(N.exp(1j*d))
ave = cmath.phase(i)
i /= float(d.size)
stdev = -2. * N.log(N.sqrt(i.real**2 + i.imag**2))
print ave/deg, stdev/deg
それでは、ヒストグラムを見てみましょう。
counts, bins = N.histogram(data, N.linspace(-N.pi, N.pi, 360))
カウントとビンを持つ平均、モードを計算することは可能ですか? 非周期的なデータの場合、平均の計算は簡単です。
ave = sum(counts*bins[:-1])
モーダル値の計算には、より多くの労力が必要です。実際、以下のコードが正しいかどうかはわかりません。まず、最も頻繁に発生するビンを特定し、算術平均を計算します。
cmax = bins[N.argmax(counts)]
mode = N.mean(N.take(bins, N.nonzero(counts == cmax)[0]))
ただし、そのようなデータから標準偏差を計算する方法はわかりません。私のすべての問題 (少なくとも上記の問題) に対する明らかな解決策の 1 つは、ヒストグラム データをデータ系列に変換してから、それを計算に使用することです。ただし、これはエレガントではなく、非効率的です。
どんなヒントでも大歓迎です。
これは私が書いた部分的な解決策です。
import numpy as N, cmath
import scipy.stats as ST
d = [-175, 170.2, 175.57, 179, -179, 170.2, 175.57, 170.2]
deg = N.pi/180.
data = N.array(d)*deg
i = N.sum(N.exp(1j*data))
ave = cmath.phase(i) # correct and exact mean for periodic data
wrong_ave = N.mean(d)
i /= float(data.size)
stdev = -2. * N.log(N.sqrt(i.real**2 + i.imag**2))
wrong_stdev = N.std(d)
bins = N.linspace(-N.pi, N.pi, 360)
counts, bins = N.histogram(data, bins, normed=False)
# consider it weighted vector addition
nz = N.nonzero(counts)[0]
weight = counts[nz]
i = N.sum(weight * N.exp(1j*bins[nz])/len(nz))
pave = cmath.phase(i) # correct and approximated mean for periodic data
i /= sum(weight)/float(len(nz))
pstdev = -2. * N.log(N.sqrt(i.real**2 + i.imag**2))
print
print 'scipy: %12.3f (mean) %12.3f (stdev)' % (ST.circmean(data)/deg, \
ST.circstd(data)/deg)
実行すると、次の結果が得られます。
mean: 175.840 85.843 175.360
stdev: 0.472 151.785 0.430
scipy: 175.840 (mean) 3.673 (stdev)
いくつかのコメント: 最初の列は、計算された平均/標準偏差を示します。ご覧のとおり、平均は scipy.stats.circmean とよく一致しています (指摘してくれた JoeKington に感謝します)。残念ながら stdev は異なります。後で見てみます。2 番目の列では、完全に間違った結果が得られます (numpy の非周期的な平均/標準は明らかにここでは機能しません)。3番目の列は、ヒストグラムデータから取得したいsthを示します(@JoeKington:私の生データは私のコンピューターのメモリに収まりません..、@dmytro:ご入力いただきありがとうございます:もちろん、ビンサイズは結果に影響しますが、私のつまり、どうにかしてデータを削減する必要があります)。ご覧のとおり、平均 (3 列目) は適切に計算されており、stdev にはさらに注意が必要です :)