2012-10-17 9 views
5

私は厄介な統計的な問題を持ついくつかの天才SQLのヘルプを探しています。SQL統計サンプリング

私が探しているのは、不均衡なユーザープロファイルのグループから統計的にバランスの取れたサンプルを引き出すことです。これを一度に1つのプロファイル属性(例えば性別)に対して行うことはやや簡単です。しかし、それを一度に複数の次元に渡って行うには、洗練さが必要です。

議論のために、私はこのテーブルを持っているとしましょう。

Profile.userID 
Profile.Gender 
Profile.Age 
Profile.Income 

私は、ユーザーの新しいサンプリングはおおよそ次のすべての特性と一致するようにミックスのうち、プロファイルのプールを引くしたい場合:

50% male, 50% female 
30% young, 40% middle age, 40% old 
40% low income, 40% middle income, 20% high income 

誰がどの程度の任意のアイデアを持っていますこれを取り除く?

+1

サンプルセットが仕様を満たすまで、一度に1つずつランダムにレコードをプルするのを防ぐには? –

+0

私はそれが絶えずバランスを崩さないようにするにはどうすればいいですか?私はもう1つの女性のレコードが必要だと言うが、それを引っ張って、私の年齢と収入がバランスを崩してしまう...? – tbacos

+2

30%の若者、40%の中年、40%の古い!= 100% あなたの範囲内で若い人と中年の人の重複はありますか? –

答えて

3

サンプリング問題があります。この問題を解決する鍵は、データを3つの変数の組み合わせの別々のグループに分割することです。次に、各グループの限界確率の積を計算します(値は限界確率です)。そして、18グループすべてでこれらを正規化する。

たとえば、Male-Young-Lowグループの値は0.5 * 0.3 * 0.4 = 0.06になります。 18のすべてのグループについてこれを繰り返し、パーセントに正規化します(つまり、各値をすべての値の合計で除算します)。結果は次のとおりです。

Gender Age  Income Marg Normalized 
Male Young Low  0.06 5.5% 
Male Young Middle 0.06 5.5% 
Male Young High 0.03 2.7% 
Male Middle Low  0.08 7.3% 
Male Middle Middle 0.08 7.3% 
Male Middle High 0.04 3.6% 
Male Old  Low  0.08 7.3% 
Male Old  Middle 0.08 7.3% 
Male Old  High 0.04 3.6% 
Female Young Low  0.06 5.5% 
Female Young Middle 0.06 5.5% 
Female Young High 0.03 2.7% 
Female Middle Low  0.08 7.3% 
Female Middle Middle 0.08 7.3% 
Female Middle High 0.04 3.6% 
Female Old  Low  0.08 7.3% 
Female Old  Middle 0.08 7.3% 
Female Old  High 0.04 3.6% 

これは、各グループのサンプルレートになります。ここでは、実際にサンプリングを行うための擬似SQLコードです:私は仮定し、それについて移動する方法を

with SamplingRates (
    select 'Male' as gender, 'Young' as Age, 'Low' as income, 0.045 as SamplingRate, 
    union all . . 
) 
select t.* 
from (select t.*, 
      row_number() over (partition by gender, age, income order by <random>) as seqnum, 
      count(*) over (partition by gender, age, income) as NumRecs 
     from table t 
    ) t join 
    SampleRates sr 
    on t.gender = sr.gender and t.age = sr.age and t.income = sr.income and 
     seqnum <= sr.SamplingRate * NumRecs 
0

がここにあります:若い 30%、40%中年、少なくとも共通分母を取る

古い30%を、あなたのプールサイズ= 5x5x3x4x2x4 = 2400

あなたのプールをTEMP TABLEに入れるための18のクエリがあります。 18個のクエリをすべて繰り返してプールを大きくします。以下は、理想的なプールの分布がどのように見えるか、各クエリがどのように見えるかという考えです。また、各クエリにランダム性を導入することもできます。これについての以前の投稿がありました。

これはおそらくそれほどエレガントではありませんが、均衡のとれたプールをもたらすはずです。

SELECT * INTO TEMP TABLE 
WHERE male, young, high income and ID NOT IN TEMP TABLE 
LIMIT RECORD SET 72 

などなどなど:擬似コードであなたの最初のクエリ

は次のようになります。それが役に立てば幸い。良い質問。

CREATE TEMP TABLE 
480 high income 
    144 young 
     72 males [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 72] 
     72 females [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 72] 
    192 middle age 
     96 males [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 96] 
     96 females [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 96] 
    144 old 
     72 males [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 72] 
     72 females [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 72] 

960 middle income 
    288 young 
     144 male [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 
     144 female [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 
    384 middle age 
     192 male [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 192] 
     192 female [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 192] 
    288 old 
     144 male [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 
     144 female [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 

960 low income 
    288 young 
     144 male [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 
     144 female [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 
    384 middle age 
     192 male [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 192] 
     192 female [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 192] 
    288 old 
     144 male [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144] 
     144 female [SELECT THIS INTO TEMP TABLE WHERE ID NOT IN TEMP TABLE LIMIT 144]