2017-02-08 11 views
0

私はプロットしたいデータを記述する2つのデータ配列を持ち、2つ目はそのデータの頻度または重みを記述します。重み付きデータから作成したヒストグラムの統計 - numpy

私は今、その結果、ヒストグラムの平均値、標準偏差、歪度と尖度を見つけたいが、データは「加重」または事前に数えているので、私はカント

import numpy as np 
import matplotlib.pyplot as plt 

data = [7., 8.2, 9.6, 11.3, 13.2, 15.5, 18.1, 21.2, 24.9, 29.1, 34.1, 40.0] 
freq = [2., 4.1, 4.5, 3.2, 2.7, 2.1, 1.3, 1., 0.9, 0., 0., 0.] 

h = np.histogram(data, weights = freq, bins = data) 
f = plt.hist(data, weights = freq, bins = data) 

を使用してヒストグラムを作成しますscipy.stats.describe関数が機能するようです。何か案は?

私はscipy.stats.describeを試してみましたが、私が欲しいことをすることを可能にする重み引数を見つけることはできません。私は実際にこれを助けるために利用できるツールを知りませんし、Google検索は多くの有益な結果を返すわけではありません(私は間違ったものを探しているかもしれませんが)。

あなたの目に触れたイーグルは、データが実際の空間ではなくログ空間に均等に広がっていることに気付くでしょう。だから、あなたの方法がガウスフィッティングを含むならば、それを念頭に置いておきたいかもしれません...

+1

だろう...我々は傾斜されていますか? – Chuck

+0

私が指摘しておきたいことは、誰かがデータにフィッティングする方法を取り戻そうとしている場合、データがログスペースに配置され、フィットに影響することです。 snarkyを取得する必要はありません。 –

+0

通常、質問者は寄付を求める前に試したことの何らかの形を提供することが期待されます...私はあなたの主張を思いつきます。 – Chuck

答えて

0

問題はとても簡単で、ここで独自の関数を書くことができ、scipy.statsからの関数は必要ありません。基本的にはここで与えられたのは分布関数であり、期待値を計算したいのです。これは簡単な積分によって与えられる。ソリューションの例は、「あなたの方法は、フィッティングガウス必要であれば、あなたは心の中でそれを負担することをお勧めします...」

def integrator(f,data,freq): 
    diffs = np.roll(data,-1)-data 
    return (f(data[:-1])*freq[:-1]*diffs[:-1]).sum() 

freq_norm = freq/integrator(lambda x:1,data,freq) 

exp_x = integrator(lambda x:x,data,freq_norm) 
exp_x2 = integrator(lambda x:x**2,data,freq_norm) 
exp_x4 = integrator(lambda x:x**4,data,freq_norm) 

mean = exp_x 
kurt = integrator(lambda x: ((x-exp_x)/std)**4,data,freq_norm) 
skew = integrator(lambda x: ((x-exp_x)/std)**3,data,freq_norm) 
+0

これはよく見えます。それはどこかに含まれていませんが、それは私が欲しいものです。ちょうどチェックしたかったのですが、それ以上になる必要がありますか?(exp_x2 - exp_x ** 2)** 2?歪みが必要な場合は、単にexp_x3をリストに追加して繰り返しますか? –

+0

私の例の尖度は間違っています。あなたは積分器(λx:((x-exp_x)/ std)** 4、data、freq_norm)でそれを計算することができます。歪みは、指数を4から3に変更することで、同じ式で計算できます。 – Jannick

+0

@AlexHowardは正しいですか?あなたの 'freq'が(正規化まで)_densities_であれば、間隔幅のスケーリングは正しいです。それらが_bin counts_の場合はそうではありません。 –

関連する問題