Очень быстрый примерный способ - объединить не продукты A и выполнить тест Фишера, я делаю тест в R:
M = matrix(c(800,200,180,20,2100,900),ncol=3)
colnames(M) = LETTERS[1:3]
rownames(M) = c("Like","Dislike")
A B C
Like 800 180 2100
Dislike 200 20 900
Затем вы перегруппируете их:
newM = cbind(M[,2],rowSums(M[,-2]))
colnames(newM) = c("B","notB")
B notB
Like 180 2900
Dislike 20 1100
Fisher's Exact Test for Count Data
data: newM
p-value = 3.498e-09
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
2.131986 5.751961
sample estimates:
odds ratio
3.412732
Затем вы получите обратно соотношение шансов и c .i. Соотношение шансов рассчитывается как p (как продукт / неприязнь | B) / p (как продукт / неприязнь | не B). Вы можете приблизительно оценить это как:
(180/20)/(2900/1100) = 3.413793
Вы можете сделать выше в python, чтобы получить доверительный интервал, вы можете использовать что-то вроде регрессии logisti c, и мы проверяем, отличается ли B из остального:
import pandas as pd
import statsmodels.api as sm
df = pd.DataFrame({"Product":["A","A","B","B","C","C"],
"Response":["Like","Dislike","Like","Dislike","Like","Dislike"],
'Counts':[800,200,180,20,2100,900]})
Нам нужно сложить его, чтобы получить двумерный массив:
data.endog = np.array(df['Counts']).reshape(3,2)
array([[ 800, 200],
[ 180, 20],
[2100, 900]])
data.exog = sm.add_constant(np.array([0,1,0]))
array([[1., 0.],
[1., 1.],
[1., 0.]])
В последней части мы устанавливаем коэффициент B равным 1, и другие равны 0, поэтому мы моделируем, насколько B отличается от других. Теперь подгоняем модель:
mdl = sm.GLM(data.endog, data.exog,family=sm.families.Binomial()).fit()
mdl.summary()
coef std err z P>|z| [0.025 0.975]
const 0.9694 0.035 27.376 0.000 0.900 1.039
x1 1.2278 0.238 5.151 0.000 0.761 1.695
Она дает вам аналогичную оценку, коэффициент равен 1,2278, и для ее преобразования в отношение шансов вы делаете np.exp(1.2278) = 3.41371110
. И у вас также есть р-значения и доверительный интервал.