Anova или ANalysis Of VAriance ни позволява да преминем отвъд сравняването само на две популации. С Anova можем да сравняваме множество популации, а също и техните подгрупи. С помощта на Anova можем да проверим дали средните стойности на две или повече групи се различават значително една от друга.

Защо Anova?

В този момент сравнявахме две популации от независими проби (случаен t-тест) и t-тест за сдвоени проби. Бяхме се ограничили да сравняваме две популации и повече. В случай, че има някакви подгрупи, не сме намерили никакъв тест по-рано. Да предположим, че искаме да сравним три примерни средни стойности, за да видим дали има някаква разлика между тях. Или по друг начин можем също да кажем дали средната стойност на всяка извадка идва от обща популация или не. Може да има няколко възможности:

i) Една средна стойност може да е толкова различна от другите, че да не могат да бъдат от една и съща популация.

ii) Всички средства могат да бъдат толкова различни, че да не споделят обща основа, всички те вероятно имат уникални популации.

Така че нулевата хипотеза в този тип проблем в Anovas е дали тези три средни стойности идват от една и съща популация, т.е.

Сега можем също така да предположим, че трябва да търсим:

i) Променливост между/между извадковите средни (това ще осигури разстоянието на извадковите средни от общата средна стойност),

ii) Променливост в рамките насредствата на извадката (спредът или дисперсията на всяко разпределение)

Може да има въпрос за извършване на тези тестове в множество двойки t-тест (т.е. x1=x2, x1=x3, x2=x3 при алфа =0,05, степен на грешки от тип I при 95% C.I). Но тук грешката се натрупва във всеки t тест, т.е. 0,95 x 0,95 x 0,95 =0,857. Алфа сега става 1–0,857= 0,143 или 14,3%. Общата алфа скача от 5% на 14,3% поради тази причина ние не провеждаме t тест за всяка възможна двойка средни.

Anova: Анализът на дисперсията е съотношение на променливост

Сега се натъкнахме на две думи вариация между/между и вариация в рамките, ще въведем термина „F-съотношение“. Това съотношение F ще определи дали приемаме нулевата хипотеза или я отхвърляме.

F= Променливост между или между извадковите средни стойности/ Променливост около или в рамките на извадковите средни стойности

OR

F = Разлика между/ Разлика в рамките

Обща вариация = вариация между + вариация в рамките

Ако променливостта между средните стойности (разстоянието от общата средна стойност) в числителя е относително по-висока, отколкото в знаменателя (вътрешно разпространение или дисперсия в рамките), съотношението ще бъде много по-голямо от 1. Тогава най-вероятно извадките не идват от обща популация; ОТХВЪРЛЕТЕ НУЛЕВАТА ХИПОТЕЗА, че тези средни са равни.

Дисперсия и сумата от квадрати (SST):

Дисперсията е средното квадратно отклонение на точка от данни от разпределена средна стойност. Сега сумата на квадратното отклонение е известна като сума на квадратите. Всичко, което можем да кажем, е сумирането на квадрата на разликите между зависимата променлива и средната стойност.

Еднопосочен ANOVA:

Списък с формули:

Сборът на квадратите (SST) може да се види отново в термините на колоната "Сума на квадрат" (SSC) и "Сума на квадрат на грешката" (SSE).

SSC: Това е сумата на квадрата на отклонението/разликата между всяка групирана/взета средна стойност към общата средна стойност.

SSE: Това е сумата на квадратите на отклонение/разлика между всяка точка от данни и нейната средна стойност в колоната. Той ще предостави вътрешното отклонение на всяко разпределение.

Това ще доведе до: SST = SSC + SSE

Степен на свобода (колони/ между): df (колони) = C-1

Степен на свобода (грешка/вътре): df (грешка) = N-C

Степен на свобода (общо): df(общо) = N-1

Средна квадратна колона (MSC) = SSC/ df (колони)

Средна квадратична грешка (MSE) = SSE/ df(грешка)

F- статистика = MSC / MSE

където N — -› Общо наблюдения C — -› колони

Пример: В университет 24 студента с по 8 студента от всяка година получиха оценка за предстоящите програми в кампуса с максимален брой точки 100.

Хипотеза: Тук сме, за да установим дали има разлика между тригодишните нива. Пробите се избират на случаен принцип.

Обща средна стойност x̅̅ = 76,25, N =24, C =3

Ще направим изчислението ръчно, на еднопосочна Anova и ще сравним същото в Ms-Excel и python.

Чрез инструмента за анализ на данни в MS-Excel:

Виждаме, че резултатите, получени и в двата случая, са еднакви. Сега ще отидем за наблюдения дали приемаме или отхвърляме нулевата хипотеза.

Тъй като F-статистиката (0,327) е твърде малка и не е по-голяма от F-критичната (3,466). Ние не успяваме да ОТХВЪРЛИМ НУЛЕВАТА ХИПОТЕЗА.

Реализация на Python:

from scipy.stats import f_oneway,f
import pandas as pd
import numpy as np

year1=[82,93,61,74,77,69,78,70]
year2=[91,88,83,56,89,78,74,71]
year3=[85,65,98,74,65,71,66,72]

f_stats=f_oneway(year1, year2, year3)
f_critical=f.ppf(q=1-0.05, dfn=2, dfd=21)
print("f-statistics-->",f_stats[0])
print("pvalue-->",f_stats[1])
print("f_critical--->",f_critical)

f-statistics--> 0.3271544074147111
pvalue--> 0.7245813833764774
f_critical---> 3.4668001115424154
if f_stats[0]>f_critical:
  print("REJECT NULL HYPOTHESIS")
else:
  print("FAIL TO REJECT NULL HYPOTHESIS")
FAIL TO REJECT NULL HYPOTHESIS

Следователно чрез нулевата хипотеза можем да заключим, че няма значителна разлика в средния резултат от теста на студенти от различни години.

Двупосочен ANOVA (без репликация) :

В еднопосочна анова бяхме избрали произволна извадка от за всяка група колони. В двупосочен anova ще изпълним същото в редове. Чрез добавяне на блокове можем да извадим дисперсията на реда от общата дисперсия на грешката. Това позволява по-голям фокус върху колоната и улеснява откриването на груповите различия. Сега имаме четири вида сума на квадратите: 1. Общо, 2. Колона/групи, 3. Редове/блокове, 4. Грешка.

Пример: Future group е отворила свои магазини в три различни града на име Делхи, Мумбай и Бангалор. Те имат разнообразна цифра на продажбите и за тях се превръща в проблем да анализират истинския проблем. И така, те наели някаква агенция, която да им предостави рейтинга тайно. Това ще помогне на компанията да бъде конкретна относно истинските причини за спада на продажбите. Агенцията е включила 6 души в полето за същото.

Хипотеза: Бихме искали да знаем какви са разликите в оценките в три града. Каква е вариацията, същата ли е, едната е по-висока от другите две или всички имат уникални оценки?

Защо 2-way Anova: Този проблем пасва най-добре на Two-way Anova, тъй като позволява вариациите в рейтингите на агенциите на търговски обекти и също така разплита всички други източници на вариации, т.е. позволява ни да определим дали има е някаква разлика в градовете без разлики в аутлет/купувачи. Неща, които трябва да се отбележат: Посещенията на агенти в търговски обекти ще бъдат на случаен принцип и посещенията ще се извършват само веднъж за градове, което го прави без репликация тип 2-way anova.

Цел на блокиращата променлива: Anova е свързана с разделянето или дразненето на всички източници на вариация. Това ни позволява как да присвоим или разделим общата дисперсия, позволявайки по-мощни тестове на хипотези. Тук също имаме сбор от квадрати и SST е равно на сбора от SSC и SSE.

Ще разгледаме SS, които не са в SSC, така че SSE е единственият, където позволяваме на блоковете да изяждат. Основната цел на това блокиране е да се минимизира SSE. Така че, когато SSC се сравнява със SSE, SSC може да извлече по-голяма част от SST. След като получим по-голям SSC от SSE, ще получим по-големи разлики в колони или групи. Това ще ни доведе до по-добро тестване на хипотези.

SST: Ще намерим разликите между всяка точка от данни с общата средна стойност, ще повдигнем разликите на квадрат и ще ги добавим. Ще получим 18 отклонения.

SSC: Намерете разликите между всяка групирана средна стойност с общата средна стойност, повдигнете разликите на квадрат и ги добавете. Получаваме 03 отклонения.

SSE: SSE е разделен на SSB и SSE, които изяснихме преди. Сега ще разгледаме SSB.

SSB: Намерете разликите между всеки блок/ред средна стойност с общата средна стойност, повдигнете разликите на квадрат и ги добавете. Ще получим 06 отклонения на SS.

следователно можем да кажем, SST= SSC+SSB+SSE,

Намиране на грешка Сума от квадрати SSE = SST-SSC-SSB

Колко общо SSE представлява SSB? Тук се интересуваме от дисперсията на блока и дисперсията на грешката. Можем да установим тази връзка чрез определена дроб като:

Тъй като това е съотношение на две вариации, ще разгледаме F-съотношение, последвано от F-разпределение.

Извършване ръчно и след това от MS-Excel инструмент за анализ на данни и python:

Виждаме, че има много ниска стойност на съотношението F спрямо тази на F-критично както за градове, така и за агенти. Следователно можем да заключим тук: НЕ СЕ ОТХВЪРЛЯ НУЛЕВАТА ХИПОТЕЗА.

Внедряване в Python:

import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
from scipy.stats import f_oneway,f

# Create a data frame with the ratings for each shopper and location
ratings = pd.DataFrame({
    'Agent': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6',
              'A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
    'Location': ['Delhi', 'Delhi', 'Delhi', 'Delhi', 'Delhi', 'Delhi', 'Mumbai', 'Mumbai',
                 'Mumbai', 'Mumbai', 'Mumbai','Mumbai', 'Bangalore', 'Bangalore', 'Bangalore', 'Bangalore', 'Bangalore', 'Bangalore'],
    'Rating': [75, 70, 50, 65, 80, 65,75, 70, 55, 60, 65, 65,90, 70, 80, 85, 80, 55]
})

# Create a two-way ANOVA model
model = ols('Rating ~ C(Agent) + C(Location)', data=ratings).fit()
f_stats_2 =sm.stats.anova_lm(model, typ=2)
# Print the ANOVA table
print(f_stats_2)
                 sum_sq    df         F    PR(>F)
C(Agent)     790.277778   5.0  2.024911  0.160215
C(Location)  452.777778   2.0  2.900356  0.101535
Residual     780.555556  10.0       NaN       NaN
f_agent=f_stats_2.F['C(Agent)']
f_location=f_stats_2.F['C(Location)']

# Alpha level
alpha = 0.05

# F-critical value
f_crit1=f.ppf(1-alpha,5,10)
f_crit2 = f.ppf(1 - alpha,2 , 10)

print(f'F-critical value: {f_crit1}')
print(f'F-critical value: {f_crit2}')

if f_agent>f_crit1:
  print("REJECT NULL HYPOTHESIS")
else:
  print("FAIL TO REJECT NULL HYPOTHESIS")

if f_location>f_crit2:
  print("REJECT NULL HYPOTHESIS")
else:
  print("FAIL TO REJECT NULL HYPOTHESIS")
F-critical value: 3.3258345304130112
F-critical value: 4.1028210151304005
FAIL TO REJECT NULL HYPOTHESIS
FAIL TO REJECT NULL HYPOTHESIS

Тук също получаваме същата хипотеза като „НЕ УСПЕХА ДА ОТХВЪРЛЯМ НУЛЕВАТА ХИПОТЕЗА“

Двупосочен ANOVA (с репликация):

За двупосочната annova с репликация, пробата има множество измервания на клетка. Така че ще вземем множество прегледи от всеки агент за всички градове. Когато получаваме повече данни, става много по-лесно да изведем хипотезата. Ще вземем същия пример като предишния, с повече репликирани данни, както следва:

В тези данни имаме ограничен брой наблюдения на агенти до 5 и репликираме данните 5 пъти на агент. Това показва, че всеки агент е посетил магазина 5 пъти и е предоставил отзивите. Това ще ни позволи да разширим мислите си и да вземем решение. Комбиниране на данните в средни данни като:

При внимателно наблюдение виждаме, че средната стойност на реда е доста близка до общата средна стойност, където x̅1 е по-висока от общата средна стойност. При анализиране на колоната средната стойност x̅m е по-ниска от общата средна стойност.

Взаимодействие (Агент:Местоположение): p-стойността е по-малка от действителната p-стойност от 0,05, следователно можем да кажем, че взаимозависимостта между променливите е значителна. Но отново да разгледаме стойността на съотношението F, тъй като е малко, може да не го считаме за основен допринасящ фактор при обяснението на връзката между променливите.

При двупосочен ANOVA ефектът на взаимодействие е ефектът от комбинацията на две независими променливи върху зависимата променлива. Отнася се до това дали ефектът на една независима променлива върху зависимата променлива се различава в зависимост от нивото на другата независима променлива. С други думи, измерва дали ефектът на една независима променлива върху зависимата променлива се променя в зависимост от нивото на другата независима променлива. Също така си струва да се отбележи, че докато статистически значимият ефект на взаимодействие показва, че взаимодействието е важно, размерът на ефекта на взаимодействието също трябва да се вземе предвид при интерпретирането на резултатите. Големият размер на ефекта предполага, че взаимодействието е смислено и има практическо значение, докато малък размер на ефекта предполага, че взаимодействието може да не е толкова важно за обясняване на връзката между променливите.

Коефициентът на взаимодействие е първият фактор, който трябва да се провери, преди да навлезете в подробности.

От горния резултат на anova двупосочни данни разбираме, че съотношението F на пробите (агент/ред) е малко по-голямо от F-критичното, следователно казваме, че ОТХВЪРЛЯМЕ НУЛЕВАТА ХИПОТЕЗА. Но за вариациите в градовете, дали градът ще бъде отговорен за промяната в модела на продажбите, виждаме, че F-съотношението не може да преодолее F-критичното. Следователно можем да заключим, че градската вариация няма да бъде фактор и НЕ УСПЯМЕ ДА ОТХВЪРЛИМ НУЛЕВАТА ХИПОТЕЗА.

Внедряване в python:

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

# Create a data frame with the ratings for each shopper and location
ratings = pd.DataFrame({
    'Agent': ['S1', 'S1', 'S1','S1', 'S1', 'S1','S1', 'S1', 'S1', 'S1','S1','S1','S1','S1','S1',
                'S2', 'S2', 'S2','S2', 'S2', 'S2','S2', 'S2', 'S2', 'S2', 'S2', 'S2','S2', 'S2', 'S2',
                'S3', 'S3', 'S3','S3', 'S3', 'S3','S3', 'S3', 'S3', 'S3', 'S3','S3', 'S3','S3', 'S3',
                'S4', 'S4', 'S4','S4', 'S4', 'S4','S4', 'S4', 'S4', 'S4','S4','S4', 'S4','S4','S4',
                'S5', 'S5', 'S5','S5', 'S5', 'S5','S5', 'S5', 'S5','S5', 'S5', 'S5','S5', 'S5', 'S5'],
    'Location': ['L1','L1','L1','L1','L1', 'L2','L2','L2' ,'L2','L2','L3','L3','L3','L3','L3',
                 'L1','L1','L1','L1','L1', 'L2','L2','L2' ,'L2','L2','L3','L3','L3','L3','L3',
                 'L1','L1','L1','L1','L1', 'L2','L2','L2' ,'L2','L2','L3','L3','L3','L3','L3',
                 'L1','L1','L1','L1','L1', 'L2','L2','L2' ,'L2','L2','L3','L3','L3','L3','L3',
                 'L1','L1','L1','L1','L1', 'L2','L2','L2' ,'L2','L2','L3','L3','L3','L3','L3'],
    'Rating': [75,66,77,88,79,75,57,68,70,73,90,88,87,76,71,
               70,72,78,75,77,70,68,56,87,75,70,66,87,86,84,
               88,67,68,61,70,79,61,67,72,80,67,70,68,81,77,
               60,58,51,64,69,66,58,61,74,87,81,79,71,66,61,
               87,86,88,75,78,75,71,64,59,81,58,73,65,64,78]
})

# Create a two-way ANOVA model with replication
model = ols('Rating ~ C(Agent) + C(Location) + C(Agent):C(Location)', data=ratings).fit()

# Print the ANOVA table
anova_model=anova_lm(model)

print(anova_model)
                          df       sum_sq     mean_sq         F    PR(>F)
C(Shopper)               4.0   723.466667  180.866667  2.587753  0.045703
C(Location)              2.0   250.640000  125.320000  1.793018  0.175261
C(Shopper):C(Location)   8.0  1394.293333  174.286667  2.493609  0.020842
Residual                60.0  4193.600000   69.893333       NaN       NaN
from scipy.stats import f
f_agent=anova_model.F['C(Agent)']
f_location=anova_model.F['C(Location)']

# Alpha level
alpha = 0.05

# F-critical value
f_crit1=f.ppf(1-alpha,4,60)
f_crit2 = f.ppf(1 - alpha,2,60)

print(f'F-critical value: {f_crit1}')
print(f'F-critical value: {f_crit2}')

if f_agent>f_crit1:
  print("REJECT NULL HYPOTHESIS")
else:
  print("FAIL TO REJECT NULL HYPOTHESIS")

if f_location>f_crit2:
  print("REJECT NULL HYPOTHESIS")
else:
  print("FAIL TO REJECT NULL HYPOTHESIS")
F-critical value: 2.525215101982879
F-critical value: 3.1504113105827303
REJECT NULL HYPOTHESIS
FAIL TO REJECT NULL HYPOTHESIS

Надявам се, че ви е харесало четенето на блога. Благодаря за четенето. Обърнете се към мен в Linkedin за повече теми.

Разгледайте и следващите статии за по-добри концепции и други приложения.

i) https://www.youtube.com/watch?v=0e8BI2u6DU0&ab_channel=BrandonFoltz

ii) https://vitalflux.com/two-way-anova-test-concepts-formula-examples/

iii) https://www.youtube.com/watch?v=YrhlQB3mQFI&ab_channel=KrishNaik

iv) https://en.wikipedia.org/wiki/Analysis_of_variance