ANOVA со временем в Python, что я делаю? - PullRequest
1 голос
/ 09 января 2011

Мне очень нравится статистика, но я не посещал курсы более 6 лет.У меня возникают проблемы с выяснением того, какой тип теста мне нужен, и наилучшей функции numpy / scipy / R, которую можно использовать для решения подобных проблем.

У меня есть таблица посетителей и соответствующие свойства(например, «Браузер = Mozilla, Referrer = Google»), а также значение переменной для каждого посетителя (например, 5 долларов США), сгруппированные по временным точкам.

Моя цель:

А) Найдите наиболее значимые семейства свойств с оценкой «насколько значимо» это семейство

Пример заключения, которое я хочу сделать *:

Referrer has 10x larger effect size upon value-per-visitor than Browser
=> PropertyFamily('browser').significance = 1
=> PropertyFamily('referrer').significance = 10

И

B) Найдите наиболее значимые свойства в семьях с показателями значимости.

Пример заключения, которое я хотел бы сделать:

GIVEN THAT Value:Baseline => $5/hit
5 hits from IE @ $5/hit (equal to baseline) => no significance
1 hit from Netscape @ $0 => little significance (not enough data)
10 hits from FF @ $10/hit => HIGH significance (hits and delta_value both high)

Мои вопросы:

1) Есть ли здесь функции numpy / scipy / R, которые облегчат мне жизнь?

2) Может ли кто-нибудь, кто знает немного больше об ANOVA (анализ отклонений) и ANOVA со временем, пожалуйста, предоставьте отзыв? Я не уверен, что я даже делаю это правильно , и может упустить что-то простое. Подтверждение или исправление приветствуются.

Обратите внимание, что это Массивы из (попаданий, значений, дней) за последние 30 дней.Например, если в понедельник в Value-Of-Mozilla имеется большой пик (относительно базового уровня), а во вторник значение Value-Of-Mozilla (ниже базового уровня) упадет, я хочу, чтобы Mozilla отображалась как «существенное» свойство(а не пик / падение, отменяющие друг друга)

Пример моих входных данных перед отображением / уменьшением:

data = {
'baseline': [(hits, value, day) for hits, value, day in last_thirty_days('baseline')],
'browser': {
  'mozilla': [(hits, value, day) for hits, value, day in last_thirty_days('browser', 'mozilla')],
  ... etc ...
  }
}
... etc ...

Вот мой текущий код - он работает на Dumbo / Hadoopи предоставляет число для «значимости», для которого я в основном изобрел формулу.Хотя моя формула работает и дает значимые данные, мои значения для «значимости» не определены четко («значимое» свойство обычно имеет оценку> = 100, но это изменяется в зависимости от размера набора данных), и я знаю, чтоесть, вероятно, «реальная формула» для этого.

# Runs after each (hits, value, date) tuple has been grouped
# into corresponding "plot points", as they would appear on a graph
pp = PlotPoint(property, date, hits, value)
pp.epc = float(pp.value/pp.hits) if pp.hits else 0

# Finds PlotPoint('baseline', date)
# if pp = PlotPoint('firefox', '1-1-10')
#  then pp.baseline == PlotPoint('baseline', '1-1-10')
baseline = pp.baseline()
if baseline.hits == 0:
    volume_ratio = 0 
else:
    volume_ratio = round(100*pp.hits/baseline.hits)
value_ratio = baseline.epc - pp.epc

# Make up a significance value --
# e.g. (10% of visitors * ($1 delta from baseline))^2
pp.significance = math.sqrt(volume_ratio * value_ratio **2)

# OK, we have values for each plotpoint, now sum them up
# to get values for the whole property (over a 30day period) 
pps = property.plotpoint_set.all()
property.hits = sum([p.hits for p in pps])
property.value = sum([p.value for p in pps])
property.epc = property.value/property.hits
value_delta = baseline.epc - property.epc

# Make up a significance for the Property, based on each point's significance
property.significance = math.log(sum(
                [sss.significance**2 for sss in pps]
                )*abs(value_delta)+1)

Заранее спасибо!

1 Ответ

3 голосов
/ 09 января 2011

AFAIK, статистические тесты, доступные в numpy / scipy, довольно просты.Возможно, вы захотите взглянуть на R, язык, более или менее посвященный статистике, и с множеством доступных расширенных функций.

Кроме того, я не думаю, что MANOVA действительно то, что вы хотите делать.MANOVA предназначен для случаев, когда у вас есть несколько взаимодействующих зависимых переменных.Это действительно просто ANOVA.

Примеры того, что вы могли бы сделать в R:

bybrowser = lm(value ~ browser, data=visitors)
anova(bybrowser)
byreferrer = lm(value ~ referrer, data=visitors)
anova(byreferrer)
byreferrerandbrowser = lm(value ~ browser * referrer, data=visitors)
anova(byreferrerandbrowser)

Обратите внимание, что все это предполагает, что ваши значения нормально распределены.Вам следует проверить это предположение (hist(visitors$value) - хорошее начало.).Если это не так, либо найдите способ их нормализации (попробуйте взять журнал), либо используйте соответствующий непараметрический тест.

Да, и, наконец, если вам нужен совет по статистике, есть сестрасайт, посвященный именно этому: https://stats.stackexchange.com/

...