【问题标题】:ANOVA over time in Python, what am I doing?随着时间的推移在 Python 中的方差分析,我在做什么?
【发布时间】:2011-01-09 18:04:09
【问题描述】:

我真的很喜欢统计数据,但已经 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 的人都可以提供反馈吗? 我什至不能肯定我做得对,并且可能会遗漏一些简单的东西。 感谢您的确认或更正。

请注意,这些是过去 30 天内(点击次数、值、天数)的数组。例如,如果周一 Mozilla 的 Value-Of-Mozilla 有一个大峰值(相对于基线),而周二 Mozilla 的 Value-Of-Mozilla 有一个下降(低于基线),我希望 Mozilla 显示为“重要”属性(而不是峰值/下降相互抵消)

我的输入数据示例,在 map/reducing 之前:

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)

提前致谢!

【问题讨论】:

    标签: python statistics numpy anova significance


    【解决方案1】:

    AFAIK,numpy/scipy 中可用的统计测试相当基础。您可能想研究一下 R,这是一种或多或少专用于统计的语言,并且具有许多可用的高级功能。

    另外,我认为 MANOVA 并不是您真正想要做的。 MANOVA 适用于当您有多个相互作用的因变量时。这实际上只是一个方差分析。

    您可以在 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/

    【讨论】:

    • 很棒的回应,谢谢——我正在改变我的问题以反映 ANOVA 而不是 MANOVA。我能否打扰您提供一个或两个链接到您所讨论的内容,特别是 w/r/t 对用于 ANOVA 的非正态数据集进行归一化?再说一次,我已经有几年没有做过统计了,虽然这个“正常、非正常”的概念对我来说很有意义,但我想阅读更多关于它的内容。
    • 亲爱的,您编辑了您的回复以准确提供我的要求。你摇滚。
    • @linked:不客气!我没有一个很好的规范化链接,虽然谷歌刚刚从莱斯特拉了这个:le.ac.uk/bl/gat/virtualfc/Stats/transform.htm搜索数据正态分布。哦,这是我学习的课程:beckslab.staff.shef.ac.uk/RTP_405_2010/page3/assets/…(如果没有演讲者可能很难听懂)。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-02-17
    相关资源
    最近更新 更多