Desenvolver um teste estatístico para distinguir dois produtos

9

Tenho um conjunto de dados de uma pesquisa de clientes. Quero implantar um teste estatístico para verificar se há diferença de significância entre o produto 1 e o produto 2.

Aqui está um conjunto de dados de avaliações de clientes.

A taxa é de muito ruim, ruim, ok, boa e muito boa.

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

Quais métodos devo usar para verificar se há alguma diferença entre esses dois produtos?

qifengwu
fonte
Observe que a resposta de @ Glen_b fornece conselhos superiores, em comparação com a resposta que você aceitou. Talvez eu deva dizer que você pode alterar uma resposta aceita a qualquer momento (nem todos estão cientes disso).
Ameba 25/03

Respostas:

3

Para classificação por diferentes juízes, pode-se usar o teste de Friedman. http://en.wikipedia.org/wiki/Friedman_test

Você pode converter classificações de muito ruins para muito boas em números de -2, -1, 0, 1 e 2. Em seguida, coloque os dados em formato longo e aplique friedman.test com o cliente como fator de bloqueio:

> 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

A classificação da diferença entre 2 produtos não é significativa.

Editar:

A seguir, é apresentado o resultado da regressão:

> 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

insira a descrição da imagem aqui

rnso
fonte
11
Usar o teste de Friedman é um exagero. É como recomendar o uso da ANOVA quando existem apenas dois grupos; simplesmente reduz-se a um teste t.
Ameba
Esta análise de regressão está incorreta. Você tratou o cliente como uma variável contínua em vez de um fator. Se você corrigir isso, alterando-o para um fator, obtém um valor- p de 0,1316, ou seja, o mesmo de um teste t emparelhado .
Karl Ove Hufthammer 27/03
Eu havia percebido que isso deveria ser um fator, mas não o mudei, pois minha ênfase estava no teste de Friedman. Mas como o tamanho da amostra é pequeno, acho que um teste não paramétrico (em vez de t) seria mais apropriado aqui. Corrigi a parte da regressão na minha resposta.
rnso
9
  1. Uma possibilidade é que você poderia usar o teste de sinal.

    Isso depende das comparações entre os clientes para verificar se a classificação de produto1 para produto2 subiu, diminuiu ou permaneceu a mesma (sob o teste do sinal binomial, a suposição é de que você só obtém resultados "altos" ou "baixos", mas existem várias maneiras comuns de abordar os vínculos entre pares, como o cliente 9's goodvs good).

    Uma abordagem comum é excluir as classificações vinculadas, como as do cliente 9 (para que a conclusão seja sobre a proporção relativa de diferenças de aumento e redução na população, assumindo amostragem aleatória de clientes).

    Nesse caso, você tinha 4 clientes que deram classificações mais altas ao segundo produto, 8 que deram notas mais baixas e três que deram o mesmo.

    Nesse caso, com seus dados, 4 de um sinal e 8 do outro, um teste de sinal bicaudal não chegaria perto da rejeição em nenhum nível de significância típico. Aqui está a análise em 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 
    

    O valor p é bastante alto.

  2. Agora, se você estiver preparado para atribuir pontuações (ou mesmo apenas para classificar) aos tamanhos relativos das mudanças nas classificações dentro de cada par - ou seja, se a mudança "boa" para "ruim" do cliente 2 é maior, menor ou o mesmo que o cliente 4 é "muito bom" para "ok" e assim por diante, então você pode aplicar um teste de classificação assinado nessas classificações ou fazer um teste de permutação emparelhado nas pontuações atribuídas (embora você também deva lidar com laços pesados, isso pode ser feito prontamente permutando os conjuntos de classificações ou pontuações que você realmente possui).

Existem outras opções que você pode considerar - mas não acho que a escolha da análise altere o resultado; Eu acho que todos eles deixarão de rejeitar em níveis de significância típicos nesses dados.

Glen_b -Reinstate Monica
fonte
11
@alesc "inferior" somente sob certas condições, superior sob outras. Você está ciente de quais são essas condições? A ordem que você mencionou é a ordem das categorias originais , mas o que importa para o teste de classificação assinado é a ordem das diferenças . Ao atribuir os números de 1 a 5 a essas categorias originais, você assumiu uma escala de intervalo onde não existia. Excluir os postos vinculados não é adulterar os dados, na verdade, está condicionando as informações relevantes à questão de saber se há uma tendência das classificações aumentar ou diminuir.
Glen_b -Reinstala Monica 23/03
4
Estamos lidando com um item da escala Likert de 5 pontos . (Uma escala Likert real é uma soma desses itens.) Esse item da escala é ordinal, você mesmo disse isso. Mas usando contagens onde espaçamentos entre as categorias são iguais você está impondo uma escala de intervalo - os espaçamentos iguais você impostas é literalmente o que uma escala de intervalo é . Então você disse que era ordinal e imediatamente tratou como intervalo. O fato de você não ter mencionado o que fez é por que sua resposta precisa ser alterada. Assim que você aplica um teste de classificação assinado aos pares ordinais de dados, você trata o original como intervalo.
Glen_b -Reinstala Monica 23/03
11
@rnso Em geral, ao converter inicialmente as categorias ordenadas em números equidistantes, você teria imposto uma escala de intervalo onde havia uma ordinal ... (então, novamente, em geral, você precisaria explicitar essa escolha), mas neste caso - porque são apenas as classificações relativas dentro de cada grupo que importam e existem apenas dois grupos, que não prejudicam nada. O Friedman em dois grupos é equivalente a um teste de sinal (bicaudal). Ou seja, sua resposta é a mesma que a minha.
Glen_b -Reinstate Monica
11
@rnso Em termos de 'configuração', em R você pode transformar sua variável categórica ordinal em um fator (até mesmo um fator ordinal), embora em algumas funções seja necessário lidar com números. Sempre que você fizer isso (use os números que eu quero dizer), lembre-se de que esses números não têm a propriedade interval - você não pode apenas ter diferenças (ou somas) dos números que você usou. Se você - a priori - não reivindicar que uma mudança de very badpara goodé completamente idêntica a uma mudança de badpara very good, você não pode reivindicá-la depois de codificá-los como números ... (ctd)
Glen_b
11
(CTD) ... (ou seja, você não pode apenas tratar a mudança de 3 categorias com diferentes pontos de início, tanto como "d = 3". Então, se você fazê- código 'muito mau' como 1 até 'muito bom' como 5 , você não pode simplesmente aceitar as diferenças. Você deve primeiro assumir explicitamente que possui uma escala de intervalo e, em seguida, as diferenças são significativas.
Glen_b -Replica Monica
3

Você tem dados ordinais dependentes. Você deve usar o teste de classificação assinada da Wilcoxon para testar a diferença significativa entre os dois produtos em todos os clientes.

Mas, dados os dados acima, o teste de postos assinados de Wilcoxon não produz resultados significativos.

alesc
fonte
3
Não acho que você possa usar o teste de classificação assinado sem fazer suposições adicionais. Por exemplo, o teste de classificação assinado baseia-se na classificação das diferenças absolutas de pares, o que significa que você terá que decidir se a mudança "boa" para "ruim" do cliente 2 é maior, menor ou igual à muito boa do cliente 4 "para" ok ". O que sugere que você provavelmente impôs uma escala de intervalo em algum momento (é difícil dizer exatamente o que você fez, porque você realmente não a explicou). Essa é uma escolha com a qual o OP pode concordar, mas você precisa perguntar primeiro.
Glen_b -Reinstala Monica 22/03
4
Para esclarecer: acho que essa é uma resposta potencialmente razoável, mas suas suposições particulares devem ser mais explícitas. Acho que essa resposta poderia ser melhorada se você explicasse como você passou de pares como ( good, bad) ou ( very good, okay) para um conjunto de classificações assinadas, pois isso tornaria as suposições feitas ao longo do caminho mais óbvias.
Glen_b -Reinstala Monica
A ordem das respostas é dada, portanto, atribuir classificações numéricas de a é trivial. Veja meu outro comentário na sua resposta para obter mais detalhes. 515
alesc 23/03
4
Alesc, @Glen_b está certo (e você não está): no teste de classificação assinada, você não atribui classificações a valores individuais, atribui classificações a diferenças entre pares de valores . Portanto, você precisa calcular as diferenças primeiro. Isso é impossível com dados ordinais.
Ameba
1

Use o emparelhado t -teste

Contanto que você tenha classificações suficientes (15 é suficiente e eu ficaria feliz mesmo com menos) e alguma variação nas diferenças de classificação, não há nenhum problema ao usar o teste t emparelhado . Em seguida, você obtém estimativas muito fáceis de interpretar - as classificações médias em uma escala numérica de 1 a 5 + sua diferença (entre produtos).

Código R

É muito fácil fazer no 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

Primeiro vamos verificar as classificações médias:

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

E o teste t nos 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 

O valor é 0,13, o que não sugere fortemente que os produtos sejam classificados de forma diferente, apesar da aparente diferença de 0,8 (mas observe o intervalo de confiança bastante - precisamos realmente de mais dados).p

Dados falsos?

Curiosa e inesperadamente, um teste t não pareado fornece um valor p mais baixo .

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

Isso sugere que os dados de exemplo são falsos. Para dados reais, seria de esperar uma correlação positiva (bastante alta) entre as classificações do mesmo cliente. Aqui a correlação é negativa (embora não seja estatisticamente 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

Dados ausentes

Quando nem todos os clientes classificaram os dois produtos (ou seja, dados desequilibrados), uma abordagem melhor é usar um modelo de efeitos mistos:

Vamos primeiro converter os dados para o formato numérico:

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

E converta-o para o formato 'longo':

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

E, finalmente, ajuste um modelo de efeitos mistos com o cliente como um efeito aleatório:

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

O valor é 0,0834. Normalmente, para dados balanceados, será quase idêntico ao valor p de um teste t emparelhado . Aqui está mais próximo do valor- p de um teste t não pareado , devido à correlação negativa. Observe que a variação para o efeito do cliente (interceptação aleatória) é quase zero. Isso raramente aconteceria com dados reais.p

Sumário

Em resumo, use o teste t emparelhado . Em seguida, você obtém estimativas fáceis de interpretar (médias numéricas simples).

Se nem todos os clientes classificaram os dois produtos, use um modelo de efeitos mistos. (Isso fornecerá aproximadamente os mesmos resultados que o teste t emparelhado quando todos tiverem classificado os dois produtos, para que você sempre o use.)

Karl Ove Hufthammer
fonte