Використовуйте парний t -test
Поки у вас достатньо рейтингів (15 достатньо, і я був би радий навіть меншою кількістю) та певних варіацій різниць у різниці, у використанні парного t -test взагалі немає проблем . Тоді ви отримуєте оцінки, які легко інтерпретувати - середні оцінки за 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 дає нам:
> 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
The p-значення - 0,13, що не настійно говорить про те, що продукти оцінюються по-різному, незважаючи на очевидну різницю в 0,8 (але зауважте, досить інтервал довіри - нам дійсно потрібно більше даних).
Підроблені дані?
Цікаво і несподівано, що непарний t -test дає нижчу р -значення.
> 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
[…]
The p-цінність 0,0834. Зазвичай для збалансованих даних буде майже ідентичний до р -значення від сполученого т -test. Тут вона ближче до p -значення непарного t -test через негативну кореляцію. Зауважте, що дисперсія для ефекту від споживача (випадковий перехоплення) майже дорівнює нулю. Це рідко трапляється з реальними даними.
Підсумок
Підводячи підсумок, використовуйте парний t -test. Потім ви отримуєте оцінки, які легко інтерпретувати (прості числові середні значення).
Якщо не всі клієнти оцінили обидва продукти, замість цього використовуйте модель зі змішаними ефектами. (Це дасть приблизно ті ж результати , як і парні т -test , коли вони мають всі оцінили як продукти, так що ви можете також використовувати його завжди.)