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についてもう少し知っている人は、フィードバックを提供してもらえますか? 私はこれを正しくやっているとは確信が持てず、単純なものが欠けている可能性があります。確認または修正はどちらも大歓迎です。

これらは、過去 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)

前もって感謝します!

4

1 に答える 1

3

私の知る限り、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/

于 2011-01-09T18:29:09.470 に答える