Développer un test statistique pour distinguer deux produits

9

J'ai un ensemble de données provenant d'une enquête client, je souhaite déployer un test statistique pour voir s'il existe une différence de signification entre le produit 1 et le produit 2.

Voici un ensemble de données d'avis clients.

Le taux va de très mauvais, mauvais, correct, bon, à très bon.

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

Quelles méthodes dois-je utiliser pour voir s'il y a une différence entre ces deux produits?

qifengwu
la source
Veuillez noter que la réponse de @ Glen_b donne des conseils supérieurs par rapport à la réponse que vous avez acceptée. Je devrais peut-être dire que vous pouvez changer une réponse acceptée à tout moment (tout le monde ne le sait pas).
amoeba

Réponses:

3

Pour le classement par différents juges, on peut utiliser le test de Friedman. http://en.wikipedia.org/wiki/Friedman_test

Vous pouvez convertir les notes de très mauvaises à très bonnes en chiffres de -2, -1, 0, 1 et 2. Ensuite, mettez les données sous forme longue et appliquez friedman.test avec le client comme facteur de blocage:

> 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

Le classement de la différence entre 2 produits n'est pas significatif.

Éditer:

Voici la sortie de la régression:

> 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

entrez la description de l'image ici

rnso
la source
1
Utiliser le test de Friedman est une exagération. C'est comme recommander d'utiliser ANOVA lorsqu'il n'y a que deux groupes; il se réduit alors simplement à un test t.
amibe
Cette analyse de régression est incorrecte. Vous avez traité le client comme une variable continue au lieu d'un facteur. Si vous corrigez cela, en le changeant en facteur, vous obtenez une valeur de p de 0,1316, c'est-à-dire la même que celle d'un test t apparié.
Karl Ove Hufthammer
J'avais réalisé que cela devait être un facteur, mais je ne l'ai pas changé car je mettais l'accent sur le test de Friedman. Mais comme la taille de l'échantillon est petite, je pense qu'un test non paramétrique (plutôt qu'un test t) serait plus approprié ici. J'ai corrigé la partie régression dans ma réponse.
rnso
9
  1. Une possibilité est que vous pouvez utiliser le test de signe.

    Cela s'appuie sur les comparaisons au sein des clients pour voir si leur note du produit1 au produit2 a augmenté, diminué ou est restée la même (sous le test du signe binomial, l'hypothèse est que vous n'obtenez que des résultats "en hausse" ou "en baisse", mais il y a plusieurs façons courantes d'aborder les liens intra-paire, comme le goodvs du client 9 good).

    Une approche courante consiste à exclure les notes liées comme celles du client 9 (de sorte que la conclusion porte sur la proportion relative des différences de hausse ou de baisse dans la population, en supposant un échantillonnage aléatoire des clients).

    Dans ce cas, vous aviez 4 clients qui ont donné des notes plus élevées au deuxième produit, 8 qui ont donné plus bas et trois qui ont donné le même.

    Dans ce cas, avec vos données, 4 d'un signe et 8 de l'autre, un test de signe bilatéral ne se rapprocherait pas du rejet à un niveau de signification typique. Voici l'analyse dans 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 
    

    La valeur de p est assez élevée.

  2. Maintenant, si vous êtes prêt à attribuer des scores (ou même simplement à classer) aux tailles relatives des changements de notes au sein de chaque paire, c'est-à-dire si le changement "bon" à "mauvais" du client 2 est plus grand, plus petit ou la même chose que "très bien" du client 4 à "d'accord", etc. cela peut facilement être fait en permutant les ensembles de classements ou de scores que vous avez réellement).

Il y a d'autres choix que vous pourriez envisager - mais je ne pense pas que le choix de l'analyse changera le résultat; Je pense qu'ils échoueront tous à des niveaux de signification typiques sur ces données.

Glen_b -Reinstate Monica
la source
1
@alesc "inférieur" uniquement dans certaines conditions, supérieur dans d'autres. Connaissez-vous ces conditions? C'est l'ordre que vous mentionnez est l'ordre des catégories originales , mais ce qui importe pour le test de classement signé est l'ordre des différences . En attribuant les nombres 1 à 5 à ces catégories originales, vous avez en fait supposé une échelle d'intervalle là où il n'en existait pas. Exclure les classements liés ne modifie pas les données, mais conditionne en fait les informations pertinentes à la question de savoir si les notes ont tendance à augmenter ou à diminuer.
Glen_b -Reinstate Monica
4
Nous avons affaire à un élément d' échelle Likert à 5 points . (Une échelle de Likert réelle est une somme sur ces éléments.) Cet élément d'échelle est ordinale, vous l'avez dit vous-même. Mais en utilisant des scores où espacements entre les catégories sont égales , vous êtes imposez une échelle d' intervalle - ces équidistants vous est tout à fait littéralement Imposé quelle échelle d' intervalle est . Vous avez donc dit que c'était ordinal, puis vous l'avez immédiatement traité comme un intervalle. Le fait que vous n'ayez pas mentionné ce que vous avez fait explique pourquoi votre réponse doit être modifiée. Dès que vous appliquez un test de classement signé à des paires ordinales de données, vous traitez l'original comme un intervalle.
Glen_b -Reinstate Monica
1
@rnso En général, en convertissant initialement les catégories ordonnées en nombres espacés, vous auriez imposé une échelle d'intervalle là où il y en avait eu une ordinale ... (encore une fois, en général, vous auriez besoin de rendre ce choix explicite) mais dans ce cas - parce que ce n'est que le classement relatif au sein de chaque groupe qui compte et qu'il n'y a que deux groupes, cela ne fait rien de mal. Le Friedman en deux groupes équivaut à un test de signe (bilatéral). Autrement dit, votre réponse est la même que la mienne.
Glen_b -Reinstate Monica
1
@rnso En termes de 'configuration', dans R, vous pouvez faire de votre variable catégorielle ordinale un facteur (même un facteur ordinal), bien que pour certaines fonctions, vous puissiez avoir besoin de traiter des nombres. Chaque fois que vous faites cela (utilisez des nombres, je veux dire), vous devez garder à l'esprit que ces nombres n'ont pas la propriété interval - vous ne pouvez pas simplement prendre des différences (ou des sommes) des nombres que vous avez utilisés. Si vous ne prétendez pas - a priori - qu'un changement de very badvers goodest complètement identique à un changement de badvers very good, vous ne pouvez pas le réclamer après les avoir codés sous forme de nombres ... (ctd)
Glen_b -Reinstate Monica
1
(ctd) ... (vous ne pouvez pas traiter le décalage de 3 catégories avec différents points de départ à la fois comme « d = 3 ». Donc , si vous faites le code « très mauvais » que 1 à « très bon » que 5 , vous ne pouvez pas simplement prendre les différences. Vous devez d'abord explicitement supposer que vous avez une échelle d'intervalle, puis les différences sont significatives.
Glen_b -Reinstate Monica
3

Vous avez des données ordinales dépendantes. Vous devez utiliser le test de rang signé Wilcoxon pour tester la différence significative entre les deux produits chez tous les clients.

Mais étant donné les données ci-dessus, le test de rang signé de Wilcoxon ne donne pas de résultats significatifs.

alesc
la source
3
Je ne pense pas que vous puissiez utiliser le test de classement signé sans faire d'hypothèses supplémentaires. Par exemple, le test de classement signé repose sur le classement des différences de paires absolues, ce qui signifie que vous devrez décider si le changement "bon" à "mauvais" du client 2 est plus grand, plus petit ou identique au "très bon" du client 4 "à" d'accord ". Ce qui suggère que vous avez probablement imposé une échelle d' intervalle à un moment donné (il est difficile de dire exactement ce que vous avez fait, car vous ne l'avez pas vraiment expliqué). C'est un choix avec lequel le PO pourrait être d'accord, mais vous devriez d'abord demander.
Glen_b -Reinstate Monica
4
Pour clarifier: je pense que c'est potentiellement une réponse raisonnable, mais ses hypothèses particulières devraient être plus explicites. Je pense que cette réponse pourrait être améliorée si vous expliquiez comment vous passiez de paires comme ( good, bad) ou ( very good, okay) à un ensemble de rangs signés, car cela rendrait les hypothèses faites en cours de route plus évidentes.
Glen_b -Reinstate Monica
15
4
Alesc, @Glen_b a raison (et vous ne l'êtes pas): dans le test de rang signé, vous n'affectez pas de rangs aux valeurs individuelles, vous attribuez des rangs aux différences entre les paires de valeurs . Vous devez donc être en mesure de calculer les différences en premier. C'est impossible avec des données ordinales.
amoeba
1

Utilisez le test t apparié

Tant que vous avez suffisamment de notes (15 est suffisant, et je serais heureux même avec moins) et certaines variations dans les différences de note, il n'y a aucun problème à utiliser le test t apparié. Ensuite, vous obtenez des estimations très faciles à interpréter - les notes moyennes sur une échelle numérique de 1 à 5 + sa différence (entre les produits).

Code R

C'est très facile à faire dans 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

Vérifions d'abord les notes moyennes:

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

Et le t- test nous donne:

> 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

De fausses données?

Curieusement et de manière inattendue, un test t non apparié donne une valeur p inférieure .

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

Cela suggère que les données d'exemple sont fausses. Pour les données réelles, on s'attendrait à une corrélation positive (assez élevée) entre les évaluations d'un même client. Ici, la corrélation est négative (mais pas statistiquement significative):

> 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

Données manquantes

Lorsque tous les clients n'ont pas évalué les deux produits (c'est-à-dire des données déséquilibrées), une meilleure approche utilise un modèle à effets mixtes:

Convertissons d'abord les données sous forme numérique:

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

Et convertissez-le en forme «longue»:

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

Et enfin adapter un modèle à effets mixtes avec le client comme un effet aléatoire:

> 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

Sommaire

En résumé, utilisez le test t apparié. Ensuite, vous obtenez des estimations faciles à interpréter (moyennes numériques simples).

Si tous les clients n'ont pas évalué les deux produits, utilisez plutôt un modèle d'effets mixtes. (Cela donnera approximativement les mêmes résultats que le test t apparié lorsqu'ils ont tous évalué les deux produits, vous pouvez donc aussi toujours l'utiliser.)

Karl Ove Hufthammer
la source