Opracuj test statystyczny, aby rozróżnić dwa produkty

9

Mam zestaw danych z ankiety przeprowadzonej wśród klientów, chcę wdrożyć test statystyczny, aby sprawdzić, czy istnieje różnica istotności między produktem 1 a produktem 2.

Oto zestaw danych opinii klientów.

Stawka jest od bardzo złej, złej, w porządku, dobrej, do bardzo dobrej.

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

Jakich metod należy użyć, aby sprawdzić, czy istnieje jakaś różnica między tymi dwoma produktami?

qifengwu
źródło
Pamiętaj, że odpowiedź @ Glen_b daje lepsze rady w porównaniu z odpowiedzią, którą zaakceptowałeś. Być może powinienem powiedzieć, że możesz zmienić przyjętą odpowiedź w dowolnym momencie (nie wszyscy są tego świadomi).
ameba

Odpowiedzi:

3

Do rankingu różnych sędziów można użyć testu Friedmana. http://en.wikipedia.org/wiki/Friedman_test

Możesz zamienić oceny z bardzo złych na bardzo dobre na wartości liczbowe -2, -1, 0, 1 i 2. Następnie umieść dane w długiej formie i zastosuj test Friedman.test z klientem jako czynnik blokujący:

> 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

Ranking różnicy między 2 produktami nie jest znaczący.

Edytować:

Poniżej przedstawiono wyniki regresji:

> 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

wprowadź opis zdjęcia tutaj

rnso
źródło
1
Korzystanie z testu Friedmana to przesada. To jak zalecanie użycia ANOVA, gdy są tylko dwie grupy; to po prostu sprowadza się do testu t.
ameba
Ta analiza regresji jest niepoprawna. Traktowałeś klienta jako zmienną ciągłą zamiast czynnika. Jeśli to naprawisz, zmieniając go na współczynnik, otrzymujesz wartość p wynoszącą 0,1316, tj. Taką samą jak w sparowanym t- teście.
Karl Ove Hufthammer
Zdałem sobie sprawę, że to powinien być czynnik, ale nie zmieniłem go, ponieważ mój nacisk był położony na test Friedmana. Ponieważ jednak wielkość próbki jest niewielka, wydaje mi się, że bardziej odpowiedni byłby tu test nieparametryczny (zamiast testu t). Poprawiłem część regresji w mojej odpowiedzi.
rnso
9
  1. Jedną z możliwości jest skorzystanie z testu znaku.

    Opiera się to na porównaniach wśród klientów, aby sprawdzić, czy ich ocena od produktu1 do produktu2 poszła w górę, w dół, czy pozostała taka sama (w teście znaku dwumianowego założono, że otrzymujesz tylko wyniki „w górę” lub „w dół”, ale są kilka typowych sposobów podejścia do powiązań wewnątrz pary, takich jak klient 9 goodprzeciwko good).

    Jednym z powszechnych podejść jest wykluczanie powiązanych ocen, takich jak klient 9 (tak, że wniosek dotyczy względnej proporcji różnic w górę i w dół populacji, przy założeniu losowego próbkowania klientów).

    W tym przypadku miałeś 4 klientów, którzy dali wyższe oceny drugiemu produktowi, 8, którzy dali niższe, i trzech, którzy dali to samo.

    W takim przypadku przy danych, 4 z jednego znaku i 8 z drugiego, dwustronny test znaku nie zbliżyłby się do odrzucenia na żadnym typowym poziomie istotności. Oto analiza w 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 
    

    Wartość p jest dość wysoka.

  2. Teraz, jeśli jesteś gotowy przypisać wyniki (lub nawet tylko ranking) względnym rozmiarom zmian ocen w każdej parze - to znaczy, czy zmiana „dobra” na „zła” klienta 2 jest większa, mniejsza lub tak samo jak „bardzo dobrze” klienta 4, aby „dobrze”, i tak dalej, możesz zastosować podpisany test rangowy na tych stopniach lub wykonując test permutacji w parach na przypisane wyniki (chociaż musisz również radzić sobie z ciężkimi remisami, można to łatwo zrobić, dopuszczając zestawy rang lub wyników, które faktycznie masz).

Istnieje kilka innych opcji, które możesz rozważyć - ale nie sądzę, że wybór analizy zmieni wynik; Myślę, że oni wszyscy nie odrzucą przy typowych poziomach istotności dla tych danych.

Glen_b - Przywróć Monikę
źródło
1
@alesc „gorszy” tylko pod pewnymi warunkami, lepszy pod innymi. Czy wiesz, jakie są te warunki? To kolejność, o której wspominasz, to kolejność oryginalnych kategorii, ale to, co jest ważne dla podpisanego testu rangi, to kolejność różnic . Przypisując liczby od 1 do 5 tym oryginalnym kategoriom, faktycznie założyłeś skalę interwałów, w której żadna nie istniała. Wykluczenie powiązanych szeregów nie powoduje manipulacji danymi, w rzeczywistości opiera się na informacjach istotnych dla pytania, czy istnieje tendencja do zwiększania lub zmniejszania ocen.
Glen_b
4
Mamy do czynienia z 5-punktowym przedmiotem w skali Likerta . (Rzeczywista skala Likerta to suma takich pozycji.) Ta skala jest porządkowa, sam tak powiedziałeś. Ale używając wyniki gdzie odstępy między kategoriami są równe ty nakładające skali interwałowej - ci równe odstępy masz nałożone jest dosłownie co za działką jest . Więc powiedziałeś, że to porządek, a potem natychmiast potraktowałeś to jako odstęp. Fakt, że nie wspomniałeś o tym, co zrobiłeś, jest powodem, dla którego twoja odpowiedź wymaga zmiany. Gdy tylko zastosujesz podpisany test rangowy do par porządkowych danych, traktujesz oryginał jako przedział.
Glen_b
1
@rnso Ogólnie, początkowo konwertując uporządkowane kategorie na liczby równe, narzuciłbyś skalę przedziałową, w której istniała liczba porządkowa ... (więc znowu, ogólnie rzecz biorąc, musiałbyś dokonać takiego wyboru jednoznacznie), ale w tym przypadku - ponieważ liczą się tylko rankingi względne w każdej grupie, a są tylko dwie grupy, które niczego nie krzywdzą. Friedman w dwóch grupach jest równoważny testowi (dwustronnemu) znaku. To znaczy, twoja odpowiedź jest taka sama jak moja.
Glen_b
1
@rnso Jeśli chodzi o „konfigurację”, w R możesz ustawić porządkową zmienną kategorialną jako czynnik (nawet czynnik porządkowy), chociaż w przypadku niektórych funkcji może być konieczne radzenie sobie z liczbami. Ilekroć to robisz (mam na myśli liczby), musisz pamiętać, że te liczby nie mają właściwości przedziałowej - nie możesz po prostu wziąć różnic (lub sum) liczb, których użyłeś. Jeśli nie chcesz - a priori - twierdzić, że zmiana z very badna goodjest całkowicie identyczna z zmianą z badna very good, nie możesz twierdzić, że po zakodowaniu ich jako liczby ... (ctd)
Glen_b
1
(CTD) ... (czyli nie można po prostu traktować przesunięcie 3 kategoriach z różnych punktów startowych zarówno jako „d = 3”. Więc jeśli zrobić kod „bardzo złe”, jak 1 do „bardzo dobry” jako 5 , nie możesz po prostu wziąć różnic. Najpierw musisz wyraźnie założyć, że masz skalę interwałów, a potem różnice są znaczące.
Glen_b
3

Masz zależne dane porządkowe. Należy użyć testu rangi podpisanej Wilcoxon, aby sprawdzić znaczącą różnicę między obydwoma produktami u wszystkich klientów.

Ale biorąc pod uwagę powyższe dane, test rangi Wilcoxona nie daje znaczących wyników.

Alesc
źródło
3
Nie sądzę, żebyś mógł użyć podpisanego testu rangi bez poczynienia dodatkowych założeń. Na przykład podpisany test rangi polega na uszeregowaniu absolutnych różnic par, co oznacza, że ​​będziesz musiał zdecydować, czy zmiana „dobra” na „zła” klienta 2 jest większa, mniejsza czy taka sama, jak zmiana „dobra” klienta 4 „do” okej. Co sugeruje, że prawdopodobnie nałożyłeś kiedyś skalę interwałową (trudno jednak powiedzieć dokładnie, co zrobiłeś, ponieważ tak naprawdę tego nie wyjaśniłeś). Jest to wybór, z którym OP może się zgodzić, ale najpierw trzeba by zapytać.
Glen_b
4
Aby wyjaśnić: myślę, że jest to potencjalnie rozsądna odpowiedź, ale jej szczegółowe założenia powinny być bardziej precyzyjne. Myślę, że odpowiedź ta mogłaby zostać ulepszona, gdybyś wyjaśnił, w jaki sposób przeszedłeś od par takich jak ( good, bad) lub ( very good, okay) do zestawu podpisanych rang, ponieważ dzięki temu założenia uczynione po drodze byłyby bardziej oczywiste.
Glen_b
Kolejność odpowiedzi jest podana, więc przypisanie rang numerycznych 1 do 5jest banalny. Spójrz na mój inny komentarz do twojej odpowiedzi, aby uzyskać więcej szczegółów.
Alesc
4
Alesc, @Glen_b ma rację (a nie masz racji): w teście z podpisaną rangą nie przypisujesz rang poszczególnym wartościom, przypisujesz rangi różnicom między parami wartości . Musisz więc najpierw obliczyć różnice. Jest to niemożliwe w przypadku danych porządkowych.
ameba
1

Użyj sparowanego testu t

Tak długo, jak masz wystarczającą liczbę ocen (15 jest wystarczających, a byłbym szczęśliwy nawet z mniejszą liczbą) i pewne różnice w różnicach w ocenach, nie ma żadnego problemu ze stosowaniem sparowanego testu t . Następnie otrzymujesz oszacowania, które są bardzo łatwe do interpretacji - średnie oceny w skali numerycznej 1–5 + jego różnica (między produktami).

Kod R.

W R jest to bardzo łatwe:

> 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

Najpierw sprawdźmy średnie oceny:

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

A test t daje nam:

> 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-wartość wynosi 0,13, co nie sugeruje zdecydowanie, że produkty są oceniane inaczej, pomimo pozornej różnicy wynoszącej 0,8 (należy jednak pamiętać o dość pewnym przedziale ufności - naprawdę potrzebujemy więcej danych).

Fałszywe dane?

Co ciekawe i nieoczekiwanie, niesparowany test t daje niższą wartość 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
[…]

To sugeruje, że przykładowe dane są fałszywe. W przypadku danych rzeczywistych można oczekiwać (dość wysokiej) dodatniej korelacji między ocenami tego samego klienta. Tutaj korelacja jest ujemna (choć nie tak istotna statystycznie):

> 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

Brakujące dane

Gdy nie wszyscy klienci ocenili oba produkty (tzn. Niezrównoważone dane), lepszym podejściem jest zastosowanie modelu mieszanego:

Najpierw przekonwertujmy dane do postaci liczbowej:

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

I przekonwertuj go na „długą” formę:

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

I wreszcie dopasuj model efektów mieszanych z klientem jako efekt losowy:

> 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-wartość wynosi 0,0834. Zwykle dla zbalansowanych danych będzie prawie identyczny jak wartość p ze sparowanego testu t . Tu jest bliżej p -value wystąpienia niesparowany t -test, ze względu na korelację ujemną. Zauważ, że wariancja efektu klienta (przechwytywanie losowe) wynosi prawie zero. Zdarza się to rzadko w przypadku rzeczywistych danych.

Podsumowanie

Podsumowując, użyj sparowanego testu t . Następnie otrzymujesz oszacowania, które są łatwe do interpretacji (proste średnie liczbowe).

Jeśli nie wszyscy klienci ocenili oba produkty, użyj zamiast tego modelu efektów mieszanych. (To daje w przybliżeniu takie same wyniki jak sparowane t -test kiedy już wszystko ocenione zarówno produkty, więc równie dobrze można go używać zawsze).

Karl Ove Hufthammer
źródło