尝试从列表中生成随机数据
Trying to Generate Random Data from Lists
我正在尝试为项目生成数据。数据需要从预定义的列表中随机生成。本质上,我有真实数据,但它非常小。为了构建一些分类器(决策树、支持向量机和朴素贝叶斯),我想产生 100,000 个观察值。
我是编码新手(我可以在 Matlab 和 R 中做一些基本的事情)并且最初尝试在 Excel 中这样做,但是,RANDOMA 函数生成的数据分布非常均匀。更具体地说,我使用 5 条人口统计信息来预测客户会选择哪个零售商 select,例如零售商 A、B 或 C。人口统计信息列表如下:
1) 年龄段(18-24、25-34、35-44、45-54、55+)
2)性别(男或女)
3) 收入组(<1万英镑、1万-1.99万英镑、2万-2.99万英镑等)
4)地区(伦敦、威尔士、苏格兰、北爱尔兰、西南部等)
5) 工作类型(全职、兼职、学生等)
当我尝试随机创建 100,000 个观察值时(每个观察值从 5 个列表中随机 selected 1),它们几乎平均分布。更糟糕的是,我随机分配给零售商的值(A、B 或 C)也相等。
我的想法是将这些随机生成的数据拆分为训练数据和测试数据,这样我就可以构建一些模型并测试它们的适用性。
我不知道您的数据的典型分布,但以下内容应该可以帮助您入门。
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)
)
在 Matlab 中,您最好的朋友将是此任务的 randsample
函数(参考 here),它是 Statistics Toolbox
的一部分。让我们举一个关于你的性别变量的例子:
% 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);
您可以使用相同的方法生成有关Region 和Job 的样本。现在让我们用您的 Age 变量再举一个例子。
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) = [];
您可以使用相同的方法生成收入样本。
据我所知,您主要关心的是变量的均匀分布。我将向您展示如何为 randsample
函数(prob
参数)中的每个可能值设置不同的概率。
我正在尝试为项目生成数据。数据需要从预定义的列表中随机生成。本质上,我有真实数据,但它非常小。为了构建一些分类器(决策树、支持向量机和朴素贝叶斯),我想产生 100,000 个观察值。
我是编码新手(我可以在 Matlab 和 R 中做一些基本的事情)并且最初尝试在 Excel 中这样做,但是,RANDOMA 函数生成的数据分布非常均匀。更具体地说,我使用 5 条人口统计信息来预测客户会选择哪个零售商 select,例如零售商 A、B 或 C。人口统计信息列表如下:
1) 年龄段(18-24、25-34、35-44、45-54、55+) 2)性别(男或女) 3) 收入组(<1万英镑、1万-1.99万英镑、2万-2.99万英镑等) 4)地区(伦敦、威尔士、苏格兰、北爱尔兰、西南部等) 5) 工作类型(全职、兼职、学生等)
当我尝试随机创建 100,000 个观察值时(每个观察值从 5 个列表中随机 selected 1),它们几乎平均分布。更糟糕的是,我随机分配给零售商的值(A、B 或 C)也相等。
我的想法是将这些随机生成的数据拆分为训练数据和测试数据,这样我就可以构建一些模型并测试它们的适用性。
我不知道您的数据的典型分布,但以下内容应该可以帮助您入门。
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)
)
在 Matlab 中,您最好的朋友将是此任务的 randsample
函数(参考 here),它是 Statistics Toolbox
的一部分。让我们举一个关于你的性别变量的例子:
% 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);
您可以使用相同的方法生成有关Region 和Job 的样本。现在让我们用您的 Age 变量再举一个例子。
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) = [];
您可以使用相同的方法生成收入样本。
据我所知,您主要关心的是变量的均匀分布。我将向您展示如何为 randsample
函数(prob
参数)中的每个可能值设置不同的概率。