2012-10-17 2 views
5

나는 약간의 통계적 문제가있는 천재적인 SQL 도움말을 찾고 있습니다.SQL 통계 샘플링

나는 사용자 프로필의 불균형 그룹에서 통계적으로 균형 잡힌 샘플을 추출합니다. 한 번에 단일 프로필 속성 (예 : 성별)에 대해이 작업을 수행하는 것은 다소 간단합니다. 그러나 한 번에 여러 차원에서이를 수행하려면 정교함이 필요합니다.

논의를 위해이 표가 있다고 가정 해 보겠습니다.

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

샘플 세트가 사양을 충족 할 때까지 한 번에 하나씩 임의로 레코드를 임의로 잡아 당기는 것을 방지하려면? –

+0

계속해서 균형을 잃지 않게하려면 어떻게해야합니까? 한 번 더 여성 레코드가 필요하다고 말하면, 그 레코드를 당기면 내 나이와 수입이 균형을 잃게됩니다 ...? – tbacos

+2

30 % 젊음, 40 % 중년, 40 % 예! = 100 % 너의 범위에서 젊은 나이와 중년 나이가 겹치나요? –

답변

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]