#title 애매한 조건의 랜덤추출 [[TableOfContents]] ==== 질문 내용 ==== 데브피아에 재미있는 질문이 올라왔다. [http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=38&MAEULNO=16&no=72249&ref=72248&page=1#Contents72249 질문]은 아래와 같다. {{{ C#과 MS-SQL로 문제은행 프로그램을 생각하고 있습니다. 문제출제는 랜덤으로 1문제씩 빈도 조건을 정답률이 낮을수록 으로 하고 싶습니다. 대충 쿼리를 짜봤습니다. SELECT TOP1 * FROM TABLE1 WHERE 정답률이 낮을 수록(0%에 가까울 수록) ORDER BY NEWID(); 문제가 조건절에 ..에 가까울 수록인데 해결할 방법이 있을까요 }}} 문제는 'WHERE 정답률이 낮을 수록(0%에 가까울 수록)' 조건을 어떻게 주느냐가 문제다. 즉, 기준의 애매모호함을 어떻게 해결하는가가 이 문제의 핵심이다. ==== 나의 솔루션 ==== 약간의 통계학적인 부분이 필요하다. 일단 문제1, 문제2, 문제3 .. 여러개가 있을 것이다. 각각의 문제를 몇명이나 맞췄는지 집계한다. 즉, 아래와 같을 것이다. ||문제번호||맞춘횟수||평균||표준편차|| ||문제1||124||...||...|| ||문제2||423||...||...|| ||...||...||..||...|| 그리고 평균과 표준편차를 구한다. (정규분포를 따른다고 가정했을 때에..) * 1sigma = 평균 - 1 * 표준편차 * 2sigma = 평균 - 2 * 표준편차 * 3sigma = 평균 - 3 * 표준편차 구하고자 하는 것은 정답률이 낮은 것이다. 즉, 보통이 아닌 이상치를 구하는 것이다. 보통 이상치는 1.5 ~ 2.0 sigma 정도다. 그러므로 * WHERE 맞춘횟수 <= 평균 - 2 * 표준편차 --애덜이 잘 못 맞춘 문제들(어려운 문제들) * WHERE 맞춘횟수 >= 평균 + 2 * 표준편차 --애덜이 많이 맞춘 문제들(쉬운 문제들) 정도로 해결 할 수 있다. 물론 매번 랜던추출시마다 평균과 표준편차를 구할 필요는 없다. 통계치는 매번 변하는 것이 아니므로 2주, 1개월에 한 번 평균과 표준편차를 집계한 테이블을 만들어 놓으면 된다. 또한 랜덤추출 대상이 되는 문제들을 미리 저장하는 방법도 성능을 위한 괜찮은 방법이다. ==== 참고자료 ==== * [이상치 제거 방법] * [통계학적인 세분화 방법 2가지]