Sviluppa un test statistico per distinguere due prodotti


9

Ho un set di dati da un sondaggio tra i clienti, voglio distribuire un test statistico per vedere se c'è differenza significativa tra prodotto 1 e prodotto 2.

Ecco un set di dati delle recensioni dei clienti.

Il tasso va da pessimo, cattivo, okay, buono, a molto buono.

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

Quali metodi devo usare per vedere se c'è qualche differenza tra questi due prodotti?


Si prega di notare che la risposta di @ Glen_b fornisce un consiglio superiore rispetto alla risposta accettata. Forse dovrei dire che puoi cambiare una risposta accettata in qualsiasi momento (non tutti ne sono consapevoli).
amoeba,

Risposte:


3

Per la classifica di diversi giudici, si può usare il test di Friedman. http://en.wikipedia.org/wiki/Friedman_test

È possibile convertire le valutazioni da pessime a molto buone in numeri numerici di -2, -1, 0, 1 e 2. Quindi inserire i dati in forma lunga e applicare friedman.test con il cliente come fattore di blocco:

> 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

La classifica della differenza tra 2 prodotti non è significativa.

Modificare:

Di seguito è riportato l'output della regressione:

> 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

inserisci qui la descrizione dell'immagine


1
L'uso del test di Friedman è eccessivo. È come raccomandare di usare ANOVA quando ci sono solo due gruppi; quindi si riduce semplicemente a un test t.
amoeba,

Questa analisi di regressione non è corretta. Hai trattato il cliente come una variabile continua anziché un fattore. Se lo risolvi, cambiandolo in un fattore, ottieni un valore p di 0,1316, ovvero lo stesso di un test t associato .
Karl Ove Hufthammer,

Mi ero reso conto che avrebbe dovuto essere un fattore, ma non l'ho cambiato poiché la mia enfasi era sul test di Friedman. Ma poiché la dimensione del campione è piccola, penso che un test non parametrico (piuttosto che un test t) sarebbe più appropriato qui. Ho corretto la parte di regressione nella mia risposta.
anche il

9
  1. Una possibilità è che potresti usare il test dei segni.

    Ciò si basa sui confronti tra i clienti per vedere se la loro valutazione da prodotto1 a prodotto2 è aumentata, diminuita o rimasta invariata (sotto il test del segno binomiale si presuppone che si ottengano solo risultati "su" o "giù", ma ci sono diversi modi comuni per affrontare i vincoli all'interno della coppia, come il cliente 9 goodcontro il cliente good).

    Un approccio comune è quello di escludere i rating collegati come quelli dei clienti 9 (in modo che la conclusione riguardi la proporzione relativa delle differenze su / giù nella popolazione, ipotizzando un campionamento casuale dei clienti).

    In questo caso, hai avuto 4 clienti che hanno dato un punteggio più alto al secondo prodotto, 8 che hanno dato un punteggio più basso e tre che hanno dato lo stesso.

    In tal caso, con i tuoi dati, 4 di un segno e 8 dell'altro, un test del segno a due code non si avvicinerebbe al rifiuto a nessun livello di significatività tipico. Ecco l'analisi in 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 
    

    Il valore p è piuttosto alto.

  2. Ora, se sei pronto ad assegnare punteggi (o anche solo a classificare) alle dimensioni relative delle variazioni nelle valutazioni all'interno di ciascuna coppia - vale a dire, se la variazione da "buono" a "cattivo" del cliente 2 è più grande, più piccola o uguale a "molto buono" del cliente 4 su "ok", e così via, è possibile applicare un test di rango firmato su quei ranghi o eseguendo un test di permutazione associato su punteggi assegnati (anche se è necessario anche gestire legami pesanti, questo può essere fatto facilmente permutando le serie di gradi o punteggi che hai effettivamente).

Ci sono alcune altre opzioni che potresti prendere in considerazione, ma non credo che la scelta dell'analisi cambierà il risultato; Penso che non riusciranno tutti a rifiutare ai livelli di significatività tipici di questi dati.


1
@alesc "inferiore" solo in determinate condizioni, superiore in altre. Sei a conoscenza di quali sono queste condizioni? Questo è l'ordine che menzionate è l'ordinamento delle categorie originali , ma ciò che conta per il test del grado firmato è l'ordinamento delle differenze . Assegnando i numeri da 1 a 5 a quelle categorie originali, hai effettivamente assunto una scala di intervalli in cui non esisteva nessuno. Escludere i ranghi associati non è una manomissione dei dati, ma in realtà condiziona le informazioni rilevanti per la questione se vi sia una tendenza dei rating ad aumentare o diminuire.
Glen_b

4
Abbiamo a che fare con un oggetto in scala Likert a 5 punti . (Una scala Likert reale è una somma di tali oggetti.) Questo oggetto scala è ordinale, lo hai detto tu stesso. Ma usando punteggi in cui spaziature tra le categorie sono uguali si sta imponendo una scala di intervallo - quelle distanze uguali si imposto è letteralmente ciò che una scala di intervalli è . Quindi hai detto che era ordinale e poi l'hai trattato immediatamente come intervallo. Il fatto che tu non abbia menzionato quello che hai fatto è il motivo per cui la tua risposta deve essere modificata. Non appena si applica un test di rango firmato a coppie di dati ordinali, l'originale viene trattato come intervallo.
Glen_b

1
@rnso In generale, convertendo inizialmente le categorie ordinate in numeri equispaziati, avresti imposto una scala di intervalli in cui ce n'era una ordinale ... (quindi di nuovo, in generale, dovresti rendere esplicita tale scelta) ma in questo caso - perché sono importanti solo le classifiche relative all'interno di ciascun gruppo e ci sono solo due gruppi, che non fanno nulla di male. Il Friedman in due gruppi equivale a un test del segno (a due code). Vale a dire, la tua risposta è la stessa della mia.
Glen_b

1
@rnso In termini di 'impostazione', in R puoi rendere la tua variabile categoriale ordinale un fattore (anche un fattore ordinale), sebbene per alcune funzioni potresti aver bisogno di occuparti dei numeri. Ogni volta che lo fai (usa numeri intendo), devi tenere a mente che quei numeri non hanno la proprietà intervallo - non puoi semplicemente prendere differenze (o somme) dei numeri che hai usato. Se non vuoi - a priori - affermare che uno spostamento da very bada goodè completamente identico a uno spostamento da bada very good, non puoi rivendicarlo dopo averli codificati come numeri ... (ctd)
Glen_b -Reinstate Monica

1
(ctd) ... (cioè non puoi semplicemente considerare lo spostamento di 3 categorie con diversi punti di partenza sia come "d = 3". Quindi, se fai un codice "molto cattivo" da 1 a "molto buono" come 5 , non puoi semplicemente prendere le differenze. Devi prima presumere esplicitamente di avere una scala di intervallo, quindi le differenze sono significative.
Glen_b -Reststate Monica

3

Hai dati ordinali dipendenti. È necessario utilizzare il test dei ranghi firmati Wilcoxon per verificare la differenza significativa tra i due prodotti tra tutti i clienti.

Ma dati i dati di cui sopra, il test dei ranghi firmati Wilcoxon non produce risultati significativi.


3
Non credo che tu possa usare il test di rango firmato senza fare ipotesi aggiuntive. Ad esempio, il test di classificazione firmato si basa sulla classificazione delle differenze assolute di coppia, il che significa che dovrai decidere se il cambiamento da "buono" a "cattivo" del cliente 2 è maggiore, minore o uguale a quello del cliente 4 "molto buono "a" ok ". Il che suggerisce che probabilmente hai imposto una scala di intervallo a un certo punto (è difficile dire esattamente cosa hai fatto, però, perché non l'hai davvero spiegato). Questa è una scelta con cui il PO potrebbe essere d'accordo, ma dovresti prima chiedere.
Glen_b

4
Per chiarire: penso che questa sia potenzialmente una risposta ragionevole, ma i suoi presupposti particolari dovrebbero essere più espliciti. Penso che questa risposta potrebbe essere migliorata se spiegassi come hai proceduto da coppie come ( good, bad) o ( very good, okay) a una serie di ranghi firmati, poiché ciò renderebbe più evidenti le ipotesi formulate lungo la strada.
Glen_b

15

4
Alesc, @Glen_b ha ragione (e non lo sei): nel test dei ranghi con segno non si assegnano i ranghi ai singoli valori, si assegnano i gradi alle differenze tra coppie di valori . Quindi devi essere in grado di calcolare prima le differenze. Questo è impossibile con i dati ordinali.
amoeba,

1

Utilizzare il Paired t -test

Finché hai abbastanza valutazioni (15 è sufficiente e ne sarei felice anche con meno) e alcune variazioni nelle differenze di valutazione, non c'è alcun problema nell'utilizzare il test- t associato . Quindi ottieni stime che sono molto facili da interpretare: le valutazioni medie su una scala numerica 1–5 + la sua differenza (tra i prodotti).

Codice R.

È molto facile da fare in 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

Per prima cosa controlliamo le valutazioni medie:

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

E il test t ci dà:

> 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 

p

Dati falsi?

Curiosamente, e inaspettatamente, un test t non accoppiato fornisce un valore p inferiore .

> 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
[…]

Ciò suggerisce che i dati di esempio sono falsi. Per i dati reali, ci si aspetterebbe una correlazione (abbastanza alta) positiva tra le valutazioni dello stesso cliente. Qui la correlazione è negativa (anche se non statisticamente significativa):

> 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

Dati mancanti

Quando non tutti i clienti hanno valutato entrambi i prodotti (ovvero dati non bilanciati), un approccio migliore sta usando un modello a effetti misti:

Prima convertiamo i dati in forma numerica:

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

E convertilo in forma 'lunga':

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

E infine montare un modello a effetti misti con il cliente come effetto casuale:

> 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
[…]

p

Sommario

In sintesi, utilizzare il test t associato . Quindi ottieni stime facili da interpretare (medie numeriche semplici).

Se non tutti i clienti hanno valutato entrambi i prodotti, utilizzare invece un modello di effetti misti. (Ciò fornirà approssimativamente gli stessi risultati del test t associato quando tutti hanno valutato entrambi i prodotti, quindi è consigliabile utilizzarlo sempre.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.