ANOVA со временем в Python, что я делаю?

1

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

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

Моя цель:

A) Найдите наиболее значимые семейства свойств с оценкой "насколько важно" семья

Пример вывода, который я хочу нарисовать *:

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-over-time, пожалуйста, сообщите нам обратную связь? Я не уверен, что я даже делаю это правильно, и может отсутствовать что-то простое. Подтверждение или исправление приветствуются.

Обратите внимание, что это ARRAYS (хиты, значения, дни) за последние 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 significance
property.significance = math.log(sum(
                [sss.significance**2 for sss in pps]
                )*abs(value_delta)+1)

Спасибо заранее!

Теги:
numpy
statistics
anova

1 ответ

3

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/

  • 0
    Потрясающий ответ, спасибо - я меняю свой вопрос, чтобы отражать ANOVA вместо MANOVA. Могу ли я побеспокоить вас предоставить ссылку или две на то, что вы обсуждали, в частности без нормализации ненормального набора данных для использования в ANOVA? Опять же, прошло несколько лет с тех пор, как я сделал статистику, и хотя эта «нормальная, ненормальная» концепция имеет для меня смысл, я хотел бы прочитать об этом больше.
  • 0
    Милый, ты отредактировал свой ответ, чтобы точно указать, о чем я спрашиваю. ТЫ ЖЖЕШЬ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню