Model ANOVA two-way (two-factor)
W tej analizie robimy porównie dwóch czyników w tych samych populacjach.
Porównuje się na przykład temperaturę i ciśnienie w procesie w kilku różnych okresach.
Tworzy się trzy hipotezy zerowe:
- h01: średnia temperatury w procesach jest równa
- h02: średnie ciśnienie w procesach jest równe
- h03: nie ma powiązania między ciśnieniem a temperaturą
Mówimy, że występuje interakcja pomiędzy dwoma czynnikami, jeżeli efekt uzyskany przy danym poziomie jednego czynnika zależy od poziomu drugiego czynnika. Brak interakcji oznacza, że czynniki są addytywne.
Przeprowadzając two-way ANOVA powinniśmy najpierw sprawdzić trzecią hipotezę zerową.
Analiza ANOVA jest dla H01 i H02 dwiema ANOWA jednoczynnikowymi jednak przy H03 jest już połączeniem tych dwóch ANOVA one-way czyli ANOVA two-way.
ANOVA trzy czynnikowa
Polega na trzech hipotezach zerowych ANOVA one-way o równości średnich dla czynników A, B, C oraz kilku hipotez interakcji: AB, AC, BC, ABC.
Case Study ANOVA
Przeprowadzono badania, których celem było określenie poziomu radości życia. Postawiono następujące hipotezy zerowe:
- h0a – średnia radość życia jest taka sama dla kobiet i mężczyzn
- H0b – średnia radość życia jest taka sama wśród trzech grup: ‘Young Adult’, ‘Middle Adult’, ‘Older Adult’.
- H0c – nie istnieje interakcji pomiędzy grupami: ‘Young Adult’, ‘Middle Adult’, ‘Older Adult’ a płcią badanych osób mającej wpływ na poziom radość życia.
import pandas as pd
cc =['Male', 'Male', 'Male', 'Male','Male','Female','Female','Female','Female','Female']
aaa = [4,2,3,4,2,7,4,3,6,5]
bbb = [7,5,7,5,6,8,10,7,7,8]
ccc = [10,7,9,8,11,10,9,12,11,13]
df = pd.DataFrame({'Group': cc, 'Young Adult':aaa, 'Middle Adult':bbb, 'Older Adult':ccc })
df
Warunki ANOVA
Analiza ANOVA to analiza stwierdzająca istnienie różnic pomiędzy średnimi w kilku populacjch. ANOVA weryfikuje zgodność średnich w kilku populachach anlizując ich wariancję. Celem AVONA jest wykrycie różnic między średnimi jednak nazywa się ją analizą wariancji. Założenia stosowania anailzy wariancji ANOVA:
- Próby zostały pobrane niezależnie od siebie z każdej z r populacji
- W każdej z r badanych populacji rozkłąd jest normalny o tej samej wariancji. Średnie w r populacjach mogą być równę, lecz nie muszą*
*źródło: Amir D. Aczel, “Statystyka w zarządzaniu” PWN str.391
Spełnienie warunków 1 i 2 jest niezbędne do zastosowania analizy ANOVA. Dopuszcza się rozkłady zbliżone do normalnych. Jeżel rozkłady są silnie skośne itp. znacznie odbiegają od rozkłądów normalnych lub gdy wariancje w przybliżeniu nie są jednakowe nie należy stosować ANOVA. W takim wypadku należy zastosować test nieparametryczny Kruskala-Wallisa.
Sprawdzenie czy zmienne niezależne mają rozkłąd normalny. Wyszły nieistotne wartości p-value (tzn. p>0,05). Wszystkie zmienne mają rozkład normalny.
from scipy.stats import normaltest
stat, p = normaltest(df['Young Adult'])
print("Young Adult: ",'p=stat, p = normaltest(df['Middle Adult'])
print("Middle Adult: ",'p=stat, p = normaltest(df['Older Adult'])
print("Older Adult: ",'p=
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots()
df.plot.kde(ax=ax, legend=True, title='Histogram: A vs. B')
ax.set_ylabel('Probability')
ax.grid(axis='y')
Test wykazał, że grupy mają rozkłady normalne.
df.boxplot(column=['Young Adult', 'Middle Adult', 'Older Adult'], grid=False)
df.plot.kde()
Sprawdzamy czy wariancje w tych grupach są podobne.
k = df['Young Adult'].var(ddof=0)
print("'Young Adult: ",'k=k = df['Middle Adult'].var(ddof=0)
print("Middle Adult: ",'k=k = df['Older Adult'].var(ddof=0)
print("Older Adult: ",'k=
Wariancje mają zbliżoną wartoś, można zastosować test ANOVA.
Przekształcamy dataframe do postaci wymaganej przez statmodels.
df_melt = pd.melt(df.reset_index(), id_vars=['Group'], value_vars=['Young Adult', 'Middle Adult', 'Older Adult'])
df_melt.sample(5)
import statsmodels.api as sm
from statsmodels.formula.api import ols
model = ols('value ~ C(Group) + C(variable) + C(Group):C(variable)', data=df_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
import matplotlib.pyplot as plt
import seaborn as sns
kot = ["#c0c7ce", "#e40c2b"]
sns.set(font_scale=1.5)
sns.factorplot('variable','value',hue='Group',data=df_melt , palette=kot, height=6, aspect=1.2)
plt.title('Agitation by type of music', fontsize=20)
Odrzucamy hipotezę H0a: Istnieją znaczące różnice pomiędzy płcią (F = 16,36, p=0,0004700077, p <0,01)
Odrzucamy hipotezę H0b: Istnieją znaczące różnice pomiędzy grupami wiekowymi (F = 49,09, p=0,000000003299559, p <0,01)
Zachowujemy hipotezę H0c: Brak efektu interakcji (F = 0,00, p=1 nieistotny).
Z danych wynika, że starsi dorośli mają najwyższy poziom zadowolenia z życia, a młodsi dorośli mają najniższy poziom zadowolenia z życia. Kobiety mają także znacznie wyższą satysfakcję z życia niż mężczyźni.
Dzielimy grupę na mężczyzn i kobiety i oddzielnie testujemy Tukey HSD
Male = df_melt[df_melt['Group']=='Male']
Female = df_melt[df_melt['Group']=='Female']
Tukey HSD Test dla mężczyzn
import scipy.stats as stats
from statsmodels.stats.multicomp import (pairwise_tukeyhsd,MultiComparison)
# Tworzę specjalną wartość
KOT = MultiComparison(Male['value'],Male['variable'])
AA = KOT.tukeyhsd()
print(AA.summary())
AA.plot_simultaneous()
plt.vlines(x=160,ymin=-0.5,ymax=3.5, color="red")
Istnieją duże różnice w zadowoleniu z życia pomiędzy grupami mężczyzn: ‘Young Adult’, ‘Middle Adult’, ‘Older Adult’.
Test Bonferroniego
Jest to test substytucyjny do testu tukey HDS.
import scipy.stats as stats
from statsmodels.stats.multicomp import (pairwise_tukeyhsd,MultiComparison)
# Tworzę specjalną wartość
KOT = MultiComparison(Male['value'],Male['variable'])
comp = KOT.allpairtest(stats.ttest_rel, method='Holm')
print (comp[0])
Tukey HSD Test dla kobiet
import scipy.stats as stats
from statsmodels.stats.multicomp import (pairwise_tukeyhsd,MultiComparison)
# Tworzę specjalną wartość
KOT = MultiComparison(Female['value'],Female['variable'])
FF = KOT.tukeyhsd()
print(AA.summary())
FF.plot_simultaneous()
plt.vlines(x=160,ymin=-0.5,ymax=3.5, color="red")
Zarówno wśród kobiet jak i wśród mężczyzn istnieje wysoki poziom różnic pomiędzy grupami wiekowymi.