Разработать статистический тест для различения двух продуктов

9

У меня есть набор данных из опроса клиентов, я хочу развернуть статистический тест, чтобы увидеть, есть ли разница в значении между продуктом 1 и продуктом 2.

Вот набор данных отзывов клиентов.

Оценка от очень плохой, плохой, хорошо, хорошо, до очень хорошо.

customer    product1    product2
1           very good   very bad
2           good        bad
3           okay        bad
4           very good   okay
5           bad         very good
6           okay        good
7           bad         okay
8           very good   very bad
9           good        good
10          good        very good
11          okay        okay
12          very good   good
13          good        good
14          very good   okay
15          very good   okay

Какие методы я должен использовать, чтобы увидеть, есть ли разница между этими двумя продуктами?

qifengwu
источник
Обратите внимание, что ответ @ Glen_b дает лучший совет по сравнению с принятым вами ответом. Возможно, я должен сказать, что вы можете изменить принятый ответ в любое время (не все знают об этом).
амеба

Ответы:

3

Для ранжирования разными судьями можно использовать тест Фридмана. http://en.wikipedia.org/wiki/Friedman_test

Вы можете преобразовать оценки из очень плохого в очень хорошее в числовые значения -2, -1, 0, 1 и 2. Затем поместите данные в длинную форму и примените friedman.test с заказчиком в качестве фактора блокировки:

> mm
   customer variable value
1         1 product1     2
2         2 product1     1
3         3 product1     0
4         4 product1     2
5         5 product1    -1
6         6 product1     0
7         7 product1    -1
8         8 product1     2
9         9 product1     1
10       10 product1     1
11       11 product1     0
12       12 product1     2
13       13 product1     1
14       14 product1     2
15       15 product1     2
16        1 product2    -2
17        2 product2    -1
18        3 product2    -1
19        4 product2     0
20        5 product2     2
21        6 product2     1
22        7 product2     0
23        8 product2    -2
24        9 product2     1
25       10 product2     2
26       11 product2     0
27       12 product2     1
28       13 product2     1
29       14 product2     0
30       15 product2     0
> 
> friedman.test(value~variable|customer, data=mm)

        Friedman rank sum test

data:  value and variable and customer
Friedman chi-squared = 1.3333, df = 1, p-value = 0.2482

Ранжирование различий между двумя продуктами не является значительным.

Редактировать:

Ниже приводится результат регрессии:

> summary(lm(value~variable+factor(customer), data=mm))

Call:
lm(formula = value ~ variable + factor(customer), data = mm)

Residuals:
   Min     1Q Median     3Q    Max 
  -1.9   -0.6    0.0    0.6    1.9 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)
(Intercept)         4.000e-01  9.990e-01   0.400    0.695
variableproduct2   -8.000e-01  4.995e-01  -1.602    0.132
factor(customer)2   6.248e-16  1.368e+00   0.000    1.000
factor(customer)3  -5.000e-01  1.368e+00  -0.365    0.720
factor(customer)4   1.000e+00  1.368e+00   0.731    0.477
factor(customer)5   5.000e-01  1.368e+00   0.365    0.720
factor(customer)6   5.000e-01  1.368e+00   0.365    0.720
factor(customer)7  -5.000e-01  1.368e+00  -0.365    0.720
factor(customer)8   9.645e-16  1.368e+00   0.000    1.000
factor(customer)9   1.000e+00  1.368e+00   0.731    0.477
factor(customer)10  1.500e+00  1.368e+00   1.096    0.291
factor(customer)11  7.581e-16  1.368e+00   0.000    1.000
factor(customer)12  1.500e+00  1.368e+00   1.096    0.291
factor(customer)13  1.000e+00  1.368e+00   0.731    0.477
factor(customer)14  1.000e+00  1.368e+00   0.731    0.477
factor(customer)15  1.000e+00  1.368e+00   0.731    0.477

Residual standard error: 1.368 on 14 degrees of freedom
Multiple R-squared:  0.3972,    Adjusted R-squared:  -0.2486 
F-statistic: 0.6151 on 15 and 14 DF,  p-value: 0.8194

введите описание изображения здесь

rnso
источник
1
Использование теста Фридмана является излишним. Это все равно что рекомендовать использовать ANOVA, когда есть только две группы; тогда это просто сводится к t-критерию.
амеба
Этот регрессионный анализ неверен. Вы рассматривали клиента как непрерывную переменную, а не как фактор. Если вы исправите это, изменив его на коэффициент, вы получите p- значение 0,1316, т. Е. Такое же, как в парном t- тесте.
Карл Ове Хуфтхаммер
Я понял, что это должно быть фактором, но я не изменил его, так как мой акцент был сделан на тесте Фридмана. Но так как размер выборки невелик, я думаю, что непараметрический тест (а не t-тест) был бы более уместным здесь. Я исправил регрессионную часть в своем ответе.
Марсо
9
  1. Одна возможность - вы можете использовать тест знака.

    Это основывается на сравнении внутри клиентов, чтобы увидеть, повысился ли их рейтинг от product1 до product2, снизился или остался прежним (при тесте биномиального знака предполагается, что вы получаете только результаты «вверх» или «вниз», но есть несколько распространенных способов сближения внутри парных связей, таких как «клиент 9 goodпротив» good).

    Один из распространенных подходов состоит в том, чтобы исключить привязанные рейтинги, такие как 9 клиентов (так, чтобы сделать вывод об относительной пропорции различий между населением "вверх-вниз", предполагая случайную выборку клиентов).

    В этом случае у вас было 4 клиента, которые дали более высокие оценки для второго продукта, 8, которые дали более низкие оценки, и три, которые дали то же самое.

    В этом случае с вашими данными, 4 из одного знака и 8 из другого, двухсторонний тест знака не приблизится к отклонению на каком-либо типичном уровне значимости. Вот анализ в R:

    > binom.test(4,12)
    
            Exact binomial test
    
    data:  4 and 12
    number of successes = 4, number of trials = 12, p-value = 0.3877
    alternative hypothesis: true probability of success is not equal to 0.5
    95 percent confidence interval:
     0.09924609 0.65112449
    sample estimates:
    probability of success 
                 0.3333333 
    

    Значение р довольно высокое.

  2. Теперь, если вы готовы присвоить оценки (или даже просто ранжировать) относительным размерам изменений в рейтингах в каждой паре, то есть, будет ли изменение «хорошо» на «плохо» клиента 2 больше, меньше или то же самое, что от «очень хорошо» для клиента 4 до «хорошо» и т. д., то вы можете применить тест с ранговыми знаками для этих рангов или выполнить парный тест перестановки для назначенных баллов (хотя вы также должны иметь дело с тяжелыми связями, это можно легко сделать, переставляя наборы рангов или баллов, которые у вас есть).

Вы можете рассмотреть и другие варианты, но я не думаю, что выбор анализа изменит результат; Я думаю, что все они не смогут отклонить на типичных уровнях значимости этих данных.

Glen_b - Восстановить Монику
источник
1
@alesc «низший» только при определенных условиях, превосходящий при других. Знаете ли вы, что это за условия? Упорядочение, о котором вы упоминаете, - это упорядочение исходных категорий, но для подписанного теста ранга важна упорядоченность различий . Присвоив номера от 1 до 5 тем оригинальным категориям, вы фактически приняли шкалу интервалов, где их не было. Исключение связанных рангов не влияет на данные, это фактически обусловливает информацию, имеющую отношение к вопросу о том, существует ли тенденция повышения или понижения рейтингов.
Glen_b
4
Мы имеем дело с 5-балльной шкалой Лайкерта с пунктом . (Фактическая шкала Лайкерта - это сумма по таким пунктам.) Этот элемент шкалы является порядковым, вы сами так сказали. Но с помощью оценки , где расстояние между категориями равны вам будут навязыванием интервальной шкалы - те равные интервалы , вы наложенными вполне буквально , что интервал шкала является . Итак, вы сказали, что это порядковый номер, а затем сразу же восприняли это как интервал. Тот факт, что вы не упомянули, что вы сделали, является причиной того, что ваш ответ должен быть изменен. Как только вы применяете тест рангов со знаком к порядковым парам данных, вы рассматриваете оригинал как интервал.
Glen_b
1
@rnso В общем, первоначально преобразовав упорядоченные категории в равноразмерные числа, вы бы наложили интервальную шкалу, где была порядковая ... (так что, в общем, вам нужно было бы сделать такой выбор явным), но в данном случае - потому что только относительные рейтинги в каждой группе имеют значение, и есть только две группы, которые ничего не повредят. Фридман в двух группах эквивалентен (двустороннему) знаковому критерию. То есть, ваш ответ такой же, как мой.
Glen_b
1
@rnso С точки зрения «установки», в R вы можете сделать свою порядковую категориальную переменную фактором (даже порядковым фактором), хотя для некоторых функций вам может потребоваться иметь дело с числами. Всякий раз, когда вы делаете это (используйте числа, которые я имею в виду), вы должны помнить, что у этих чисел нет свойства интервала - вы не можете просто взять разницу (или суммы) от используемых вами чисел. Если вы не станете - априори - утверждать, что переход с very badна goodполностью идентичен переходу с badна very good, вы не сможете заявить об этом после того, как закодируете их в виде чисел ... (ctd)
Glen_b -Reinstate Monica
1
(ctd) ... (то есть вы не можете просто рассматривать сдвиг 3 категорий с разными начальными точками как «d = 3». Так что если вы делаете код «очень плохо» от 1 до «очень хорошо» как 5 , вы не можете просто брать различия. Сначала вы должны явно предположить, что у вас есть интервальная шкала, а затем различия имеют смысл.
Glen_b -Восстановить Монику
3

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

Но, учитывая вышеприведенные данные, критерий рангового ранга Уилкоксона не дает значительных результатов.

alesc
источник
3
Я не думаю, что вы можете использовать подписанный тест ранга, не делая дополнительных предположений. Например, подписанный тест ранга основан на ранжировании абсолютных парных различий, что означает, что вам нужно будет решить, будет ли изменение «хорошо» на «плохо» покупателя 2 больше, меньше или такое же, как «очень хорошо» покупателя 4. "в порядке". Это говорит о том, что вы, вероятно, установили интервальную шкалу в какой-то момент (хотя трудно сказать точно, что вы сделали, потому что вы на самом деле этого не объясняли). Это вариант, с которым ОП может согласиться, но вам нужно сначала спросить.
Glen_b
4
Чтобы уточнить: я думаю, что это потенциально разумный ответ, но его конкретные предположения должны быть более четкими. Я думаю, что этот ответ мог бы быть улучшен, если бы вы объяснили, как вы переходили от пар, подобных ( good, bad) или ( very good, okay) к набору подписанных рангов, поскольку это сделало бы предположения, сделанные на этом пути, более очевидными.
Glen_b
Приведен порядок ответов, поэтому присвоение числовых рангов от до тривиально. Посмотрите на мой другой комментарий на ваш ответ для более подробной информации. 515
Alesc
4
Alesc, @Glen_b прав (а вы нет): в тесте со знаком ранга вы не присваиваете ранги отдельным значениям, вы присваиваете ранги разностям между парами значений . Таким образом, вы должны быть в состоянии вычислить различия в первую очередь. Это невозможно с порядковыми данными.
амеба
1

Используйте парный т- тест

Пока у вас достаточно рейтингов (достаточно 15, и я был бы рад даже меньшему количеству) и некоторой вариации различий в рейтингах, использование парного t- теста не представляет никакой проблемы . Затем вы получите оценки, которые очень легко интерпретировать - средние оценки по 1–5 числовой шкале + их различие (между продуктами).

Код R

Это очень легко сделать в R:

> ratings = c("very bad", "bad", "okay", "good", "very good")
> d = data.frame(
      customer = 1:15,
      product1 = factor(c(5, 4, 3, 5, 2, 3, 2, 5, 4, 4, 3, 5, 4, 5, 5),
                        levels=1:5, labels=ratings),
      product2 = factor(c(1, 2, 2, 3, 5, 4, 3, 1, 4, 5, 3, 4, 4, 3, 3),
                        levels=1:5, labels=ratings))
> head(d)
  customer  product1  product2
1        1 very good  very bad
2        2      good       bad
3        3      okay       bad
4        4 very good      okay
5        5       bad very good
6        6      okay      good

Сначала давайте проверим средние оценки:

> mean(as.numeric(d$product1))
    [1] 3.9333
    > mean(as.numeric(d$product2))
[1] 3.1333

И т- тест дает нам:

> t.test(as.numeric(d$product1),
as.numeric(d$product2), paired=TRUE)
    Paired t-test

data:  as.numeric(d$product1) and as.numeric(d$product2)
t = 1.6, df = 14, p-value = 0.13
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.27137  1.87137
sample estimates:
mean of the differences 
                    0.8 

-значение 0,13, что делает не сильно предположить , что продукты оцениваются по- разному, несмотря на очевидное различие 0,8 (но не отметить достаточно доверительный интервал - нам действительно нужно больше данных).p

Поддельные данные?

Любопытно и неожиданно, непарный t- тест дает более низкое p- значение.

> t.test(as.numeric(d$product1),
             as.numeric(d$product2), paired=FALSE)
    Welch Two Sample t-test

data:  as.numeric(d$product1) and as.numeric(d$product2)
t = 1.86, df = 27.6, p-value = 0.073
[…]

Это говорит о том, что данные примера являются поддельными. Для реальных данных можно ожидать (довольно высокой) положительной корреляции между рейтингами одного и того же клиента. Здесь корреляция отрицательна (хотя статистически значимо не так):

> cor.test(as.numeric(d$product1), as.numeric(d$product2))

    Pearson's product-moment correlation

data:  as.numeric(d$product1) and as.numeric(d$product2)
t = -1.38, df = 13, p-value = 0.19
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.73537  0.18897
sample estimates:
     cor 
-0.35794

Потерянная информация

Когда не все клиенты оценили оба продукта (т.е. несбалансированные данные), лучшим подходом является использование модели смешанных эффектов:

Давайте сначала преобразуем данные в числовую форму:

> d2 = d
> d2[,-1] = lapply(d2[,-1], as.numeric)

И преобразовать его в «длинную» форму:

> library(tidyr)
> d3 = gather(d2, product, value, -customer)

И, наконец, подгоняем модель со смешанными эффектами к клиенту как случайный эффект:

> l = lme(value~product, random=~1|customer, data=d3)
> summary(l)
Linear mixed-effects model fit by REML
 Data: d3 
     AIC    BIC  logLik
  101.91 107.24 -46.957

Random effects:
 Formula: ~1 | customer
        (Intercept) Residual
StdDev:  3.7259e-05   1.1751

Fixed effects: value ~ product 
                  Value Std.Error DF t-value p-value
(Intercept)      3.9333   0.30342 14 12.9633  0.0000
productproduct2 -0.8000   0.42910 14 -1.8644  0.0834
[…]

Значение составляет 0,0834. Обычно для сбалансированных данных будет почти идентичен к р -значение от сопряженного т -test. Здесь оно ближе к p- значению непарного t- критерия из-за отрицательной корреляции. Обратите внимание, что дисперсия для эффекта клиента (случайный перехват) практически равна нулю. Это редко случается с реальными данными.p

Резюме

В итоге используйте парный t -test. Затем вы получите оценки, которые легко интерпретировать (простые числовые средние).

Если не все клиенты оценили оба продукта, используйте вместо этого модель смешанных эффектов. (Это даст примерно те же результаты , как и парные т -test , когда они имеют все оценили как продукты, так что вы можете также использовать его всегда.)

Карл Ове Хуфтхаммер
источник