Нам надо узнать, как часто респонденты ходят в супермаркеты. Можно задать это вопрос напрямую, но его формулировка сложна для понимания респондентом. Значительно проще спросить респондента, сколько дней назад он последний раз ходил в магазин. “Сегодня” считается допустимым вариантом ответа - это 0 дней назад . Полученные цифры потом можно перевести в частоту.
| Забегая вперед. Простой способ оценки - умножить на два ответ респондента и считать, что за столько дней он один раз ходит в магазин. Это число уже просто перевести в нужные интервалы. Получится точность более 40 процентов. Метод сильно завышает долю частоходящих. |
Считаем, что респондент может сходить в магазин только один раз в день. Также считаем, что респондент точно ходит в магазин не менее, чем один раз за заданный период.
Что имеется в виду под “последний раз ходил в магазин”?
На схеме видно, что мы знаем о четырех днях респондента, из которых он один день был в магазине.
Для численного эксперимента будем считать, что основная масса респондентов ходит в магазин раз в неделю. Исходя из этого, генерируем для каждого респонедента длительность периода, за который он ходит в магазин один раза.
set.seed(123)
resps = data.table(period = rnbinom(n_respondents, nb_size, prob = p))
let(resps,
freq = recode(period,
"Реже раза в месяц" = 31 %thru% hi ~ 1,
"Один-два раза в месяц" = 15 %thru% hi ~ 2,
"Раз в 2 недели" = 8 %thru% hi ~ 3,
"Раз в неделю" = 4 %thru% hi ~ 4,
"Почти каждый день" = TRUE ~ 5
),
freq = set_var_lab(freq, "Истинная частота похода в магазин")
)
fre(resps$freq)
| Истинная частота похода в магазин | Count | Valid percent | Percent | Responses, % | Cumulative responses, % |
|---|---|---|---|---|---|
| Реже раза в месяц | 46 | 4.6 | 4.6 | 4.6 | 4.6 |
| Один-два раза в месяц | 264 | 26.4 | 26.4 | 26.4 | 31.0 |
| Раз в 2 недели | 310 | 31.0 | 31.0 | 31.0 | 62.0 |
| Раз в неделю | 193 | 19.3 | 19.3 | 19.3 | 81.3 |
| Почти каждый день | 187 | 18.7 | 18.7 | 18.7 | 100.0 |
| #Total | 1000 | 100 | 100 | 100 | |
| <NA> | 0 | 0.0 |
ggplot(resps) +
geom_bar(aes(x = factor(freq)), fill = "lightblue3") +
xlab("Походы в магазин") +
ylab( "Количество респондентов") +
ggtitle("Истинное распределение по частоте покупки")
Далее проводим генерацию опроса.
resps$last_visit = to_vec(resps$period,
sample(0:.x, 1, replace = TRUE)
)
ggplot(resps) +
geom_histogram(aes(x = last_visit), bins = 30, fill = "lightblue3") +
xlab("Дней с последнего похода в магазин") +
ylab("Кол-во респондентов") +
ggtitle("Очень много респондентов ходило в магазин совсем недавно")
Для каждого респондента мы в момент опроса мы можем получить значени от 0 до period. Респондент не может не сходить в магазин за его личный персональный интервал времени. Математическое ожидание времени с последнего визита составляет period*(period + 1)/2/(period + 1) = period/2. Мат. ожидание - это примерно ответ респондента. То есть мы можем получить период из ответа респондента просто умножением ответа на 2.
resps = let(resps,
period_estim = 2*last_visit, # пересчитываем мат. ожидание в период
# оцениваемая частота похода в магазин
freq_estim = recode(period_estim,
"Реже раза в месяц" = 31 %thru% hi ~ 1,
"Один-два раза в месяц" = 15 %thru% hi ~ 2,
"Раз в 2 недели" = 8 %thru% hi ~ 3,
"Раз в неделю" = 4 %thru% hi ~ 4,
"Почти каждый день" = TRUE ~ 5
),
freq_estim = set_var_lab(freq_estim, "Оценочная частота похода в магазин")
)
cro_cpct(resps$freq, resps$freq_estim)
| Оценочная частота похода в магазин | |||||
|---|---|---|---|---|---|
| Реже раза в месяц | Один-два раза в месяц | Раз в 2 недели | Раз в неделю | Почти каждый день | |
| Истинная частота похода в магазин | |||||
| Реже раза в месяц | 31.5 | 5.3 | 2.4 | 2.5 | 0.6 |
| Один-два раза в месяц | 68.5 | 55.8 | 18.8 | 15.4 | 9.3 |
| Раз в 2 недели | 38.8 | 47.8 | 28.9 | 23.3 | |
| Раз в неделю | 30.9 | 29.9 | 22.0 | ||
| Почти каждый день | 23.4 | 44.7 | |||
| #Total cases | 73 | 206 | 207 | 201 | 313 |
Доля правильно угаданных составляет 44 процентов.
resps_long = resps %>%
to_long(columns = cols("^freq"), keep = character(0)) %>%
let(
frequency = factor(as.numeric(variable), labels = c("Истинное распределение", "Простая оценка"))
)
ggplot(resps_long) +
geom_bar(aes(x = factor(value), fill = frequency), alpha = .75, position = position_dodge()) +
xlab("Походы в магазин") +
ylab( "Количество респондентов") +
ggtitle("Оценка существенно завышает долю частоходящих")
Метод можно применять для оценки частоты покупки, но точность оставляет желать лучшего. Хотя точнее, чем с предположением биномиального распределения.