Попытка генерировать случайные данные из списков

Я пытаюсь сгенерировать данные для проекта. Данные должны генерироваться случайным образом из предварительно определенных списков. По сути, у меня есть реальные данные, но они очень маленькие. Для того чтобы построить некоторые классификаторы (Tress принятия решений, Машины опорных векторов и Наивный Байес), я хочу произвести 100000 наблюдений.

Я новичок в кодировании (я могу делать элементарные вещи в Matlab и R) и первоначально попытался сделать это в Excel, однако функция RANDOMA генерировала очень равномерно распределенные данные. Чтобы быть более конкретным, я использую 5 демографических фрагментов информации, чтобы предсказать, какого розничного торговца выберет клиент, например, розничного торговца A, B или C. Список демографической информации приведен ниже:

1) возрастная группа (18–24, 25–34, 35–44, 45–54, 55+) 2) пол (мужской или женский) 3) доходная группа (<£ 10k, £ 10k-19.99k, £ 20k- 29,99 фунтов стерлингов и т. Д.) 4) Регион (Лондон, Уэльс, Шотландия, Северная Ирландия, Юго-Запад и т. Д.) 5) Тип работы (Полная занятость, частичная занятость, студент и т. Д.)

Когда я попытался случайным образом создать 100000 наблюдений (каждое наблюдение случайно выбрало 1 из каждого из 5 списков), они были почти поровну распределены между ними. Хуже того, значение, которое я случайно назначил продавцу (A, B или C), также было равно.

Идея состоит в том, чтобы разбить эти случайно сгенерированные данные на обучающие и тестовые данные, чтобы я мог построить некоторые модели и проверить их пригодность.

2 ответа

Решение

В Matlab ваш лучший друг для этой задачи будет randsample функция (ссылка здесь), которая является частью Statistics Toolbox, Давайте сделаем пример относительно вашей переменной Gender:

% 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);

Вы можете использовать тот же подход для генерации образцов, касающихся региона и работы. Давайте теперь сделаем еще один пример с вашей переменной 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 аргумент).

Я не знаю типичного распределения ваших данных, но следующее должно помочь вам начать.

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)
)
Другие вопросы по тегам