Постановка задачи

Нам надо узнать, как часто респонденты ходят в супермаркеты. Можно задать это вопрос напрямую, но его формулировка сложна для понимания респондентом. Значительно проще спросить респондента, сколько дней назад он последний раз ходил в магазин. “Сегодня” считается допустимым вариантом ответа - это 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("Оценка существенно завышает долю частоходящих")

Выводы

Метод можно применять для оценки частоты покупки, но точность оставляет желать лучшего. Хотя точнее, чем с предположением биномиального распределения.