尝试从列表生成随机数据

我正在尝试为一个项目生成数据。 数据需要从预定义的列表中随机生成。 本质上,我有真实的数据,但它非常小。 为了构build一些分类器(决策树,支持向量机和朴素贝叶斯),我想生成10万个观测值。

我是新来的编码(我可以在Matlab和R中做基本的事情),并最初尝试在Excel中这样做,但是,RANDOMA函数生成非常均匀分布的数据。 更具体地说,我使用了5个人口统计信息来预测客户将select哪个零售商,例如零售商A,B或C.以下是人口统计信息的列表:

1)年龄组(18-24,25-34,35-44,45-54,55+)2)性别(男性或女性)3)收入组(<10k, £29.99k等)4)地区(伦敦,威尔士,苏格兰,北爱尔兰,西南部等)5)工作types(全职,兼职,学生等)

当我试图随机产生10万个观测值(每个观测值从5个列表中随机选取1个)时,它们几乎均匀分布在它们之间。 更糟的是,我随机分配给零售商(A,B或C)的价值也是相同的。

这个想法是将随机生成的数据分解为训练和testing数据,所以我可以构build一些模型并testing它们的适用性。

在Matlab中,这个任务的最好的朋友将是randsample函数(参考这里 ),这是Statistics Toolbox一部分。 我们来举一个关于性别variables的例子:

 % possible values (M for male and F for female) % since it's a qualitative variable, let's use the categorical type var = categorical({'M' 'F'}); prob = [0.55 0.45]; % corresponding probabilities n = 100000; % sample size repl = true; % replacement (true = yes, false = no) gender = randsample(var,100000,repl,prob); 

您可以使用相同的方法来生成有关区域和作业的样本。 现在让我们用你的Agevariables做另一个例子。

 var = 1:100; % possible values (age from 1 to 100 years) n = 100000; % sample size repl = true; % replacement (true = yes, false = no) % the probability argument is not provided, hence the result is equally distributed age = randsample(var,100000,repl); 

既然你想把你的年龄样本分成不同的组,那么边缘作为第二个参数的histcounts会为你做这件事:

 age_grps = histcounts(age,[0 18 25 35 45 55 100]); % remove the first column if you want to esclude people from 0 to 17 years age_grps(1) = []; 

您可以使用相同的方法来生成收入样本。

据我所知,你主要关心的是variables的统一分布。 我将向您展示如何为randsample函数( prob参数)中的每个可能值设置不同的概率。

我不知道你的数据的典型分布,但下面应该让你开始。

 library(tidyverse) set.seed(315) # This will create the same data set each run n.size <- 500 myData <- tibble( ID = 1:n.size, VisitDT = lubridate::today()-30 - (runif(n.size) * 100), IncomeGroup = sample(c("Low", "Medium", "High" ), n.size, prob = c(.7, .25, .05), replace = TRUE), age = round(rnorm(n = n.size, mean = 52, sd = 10),2), sex = sample (c('M', 'F'), size = n.size, prob = c(.4, .6), replace = TRUE), region = sample (c('London', 'Wales', 'Scotland'), size = n.size, prob = c(.4,.3,.2), replace = TRUE), Treatment = sample(c('No','Yes'), size = n.size, prob = c(.1, .9), replace = TRUE) ) 
Interesting Posts