あなたが持っているのは、サンプリングの問題です。この問題を解決する鍵は、データを 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