2012-10-17 38 views
5

Tôi đang tìm kiếm một số trợ giúp về SQL thiên tài với một vấn đề thống kê phức tạp mà tôi đang gặp phải.Lấy mẫu thống kê SQL

Điều tôi đang làm là kéo mẫu cân bằng thống kê ra khỏi nhóm hồ sơ người dùng không cân bằng. Làm điều này cho một thuộc tính tiểu sử (ví dụ: giới tính) tại một thời điểm sẽ hơi đơn giản. Nhưng làm nó qua nhiều chiều cùng một lúc đòi hỏi một số tinh tế.

Vì lợi ích của đối số, giả sử tôi có bảng này.

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

Nếu tôi muốn kéo một vũng hồ sơ ra khỏi hỗn hợp để lấy mẫu mới của người sử dụng xấp xỉ phù hợp với tất cả các đặc điểm sau:

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

Có ai có bất kỳ ý tưởng về làm thế nào để kéo nó xuống?

+1

Điều gì ngăn cản bạn rút ngẫu nhiên từng bản ghi cho đến khi bộ mẫu đáp ứng các đặc điểm của bạn? –

+0

Làm cách nào để giữ liên tục không còn cân bằng? Nói rằng tôi chỉ cần một bản ghi nữ nữa, nhưng kéo cái đó sau đó nghiêng tuổi và thu nhập của tôi ra khỏi sự cân bằng ...? – tbacos

+2

30% trẻ, 40% tuổi trung niên, 40%! = 100% Có sự chồng chéo giữa trẻ trung và trung niên trong phạm vi của bạn không? –

Trả lời

3

Điều bạn gặp phải là sự cố lấy mẫu. Chìa khóa để giải quyết vấn đề này là chia dữ liệu thành các nhóm riêng biệt của các kết hợp của ba biến. Sau đó, tính toán sản phẩm của xác suất biên của mỗi nhóm (giá trị của bạn là xác suất biên). Sau đó, bình thường hóa chúng trên tất cả 18 nhóm.

Ví dụ: nhóm Nam-Young-Thấp sẽ nhận được giá trị 0,5 * 0,3 * 0,4 = 0,06. Bạn lặp lại điều này cho tất cả 18 nhóm và sau đó bình thường hóa thành một tỷ lệ phần trăm (nghĩa là, chia từng giá trị cho tổng của tất cả các giá trị). Đây là kết quả:

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% 

Điều này sau đó trở thành tỷ lệ mẫu của bạn cho mỗi nhóm. Đây là mã giả SQL cho thực sự làm việc lấy mẫu:

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

Đây là cách tôi sẽ đi về nó, Giả sử: 30% trẻ, 40% tuổi trung niên, 30% cũ

Lấy mẫu số chung nhỏ nhất, Kích thước nhóm của bạn = 5x5x3x4x2x4 = 2400

Bạn có 18 truy vấn để điền hồ bơi của bạn vào BẢNG TEMP. Lặp lại tất cả 18 truy vấn để cung cấp cho bạn một hồ bơi lớn hơn. Dưới đây là ý tưởng về việc phân phối của một hồ bơi lý tưởng sẽ trông như thế nào và mỗi truy vấn sẽ trông như thế nào. Bạn cũng có thể giới thiệu một số ngẫu nhiên vào mỗi truy vấn. Có một bài viết trước về việc này.

Điều này có lẽ ít thanh lịch hơn nhưng nên mang lại một hồ bơi cân bằng.

truy vấn đầu tiên của bạn trong giả sẽ trông như thế:

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

Và vân vân và vân vân. Hy vọng nó giúp. Câu hỏi hay.

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] 
Các vấn đề liên quan