5

私が抱えているトリッキーな統計問題について、天才的な 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

誰もこれをやってのける方法について何か考えを持っていますか?

4

2 に答える 2

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
于 2012-10-17T18:06:46.873 に答える
0

これが私がそれについてどうするかです、仮定:30%若い、40%中年、30%古い

最小公分母を使用すると、プールサイズ= 5x5x3x4x2x4 = 2400

プールをTEMPテーブルに取り込むための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]
于 2012-10-17T19:13:33.780 に答える