2017-02-08 4 views
0

У меня есть 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

Я просто указывал, что если кто-то захочет вернуться с помощью метода подгонки к данным, данные будут разнесены в пространстве журналов, что повлияет на подгонку. Не нужно зарываться. –

+0

Обычно ожидается, что Участник предоставит какую-то форму того, что они пробовали, прежде чем просить о взносах ... Я принимаю ваше решение, хотя, будучи snarky, никому не помогал! – 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? И если я хочу Skewness, я просто добавляю exp_x3 в список и повторяю с этим? –

+0

Куртос в моем примере ошибочен. Вы можете рассчитать его с интегратором (lambda x: ((x-exp_x)/std) ** 4, data, freq_norm).Скот можно рассчитать с тем же выражением, изменив показатель с 4 на 3. – Jannick

+0

@AlexHoward вы оба уверены, что это правильно? Масштабирование с шириной интервала корректно, если ваша функция «freq» (до нормализации) _densities_. Если они _bin counts_, это не так. –