clear, close all, clc
rng('default') %nastavení generátoru - pro generování stejných hodnot

% Table of Contents
% Testy normality
%     Anderson-Darlingův test (AD test)
%     Q-Q graf
% Testy teoretických rozdělení
%     Chi-kvadrát test dobré shody
%     Kolmogorov-Smirnovův test
% Samostatná práce - Grader
%% Cvičení 6. Testy rozdělení
%% Testy normality
% Testy normality nám umožňují rozhodnout, zda data pochází či nepochází z normálního rozdělení.
% H0: Data pochází z normálního rozdělení
% HA: Data nepochází z normálního rozdělení
% Pokud p-hodnota < $\alpha$, zamítáme nulovou hypotézu H0 - nemůžeme používat parametrické testy hypotéz.
% Pokud p-hodnota >$\alpha$, nezamítáme nulovou hypotézu H0 - můžeme používat parametrické testy hypotéz.
% $\alpha=0.05$, pokud není uvedeno jinak.
%% Anderson-Darlingův test (AD test)
% Pro experiment, vygenerujeme si data z normálního rozdělení N(24,25) a otestujeme je na normalitu:

data_norm=random('Normal',24,5,1,1000)% 24 - střední hodnota, 5 - směrodatná odchylka, 1 řádek, 1000 sloupců
[h,p]=adtest(data_norm) % vždy 2 výstupy: h=0 nezamítáme,h=1 zamítáme (jenom kontrola). p - p-hodnota

% Nezamítáme H0, protože p-hodnota >0.05. To znamená, můžeme použít parametrický test.
% Vygenerujeme si data z exponenciálního rozdělení:

data_exp=random('Exponential',2,1,1000)% 2-lambda
[h,p]=adtest(data_exp)

% Zamítáme H0, protože p-hodnota <0.05. To znamená, musíme použít neparametrický test.
% Otestujte data ze cvičení 5 na normalitu:

T=readtable("data2023_cv5.xlsx","Sheet","Sheet1","VariableNamingRule","preserve")
x=T.("Cena vozu");
[h,p]=adtest(x)
%

%% Q-Q graf
% grafická metoda - kvantil-kvantil graf

figure
qqplot(data_norm)
figure 
qqplot(data_exp)

% Vykreslete Q-Q graf dat ze cvičení 5:

%



%% Testy teoretických rozdělení
% H0: Data pochází z teoretického rozdělení
% HA: Data nepochází z teoretického rozdělení
%% Chi-kvadrát test dobré shody
% $$T=\sum^n_{i=1}\frac{(O_i-E_i)^2}{E_i}~\sim \chi ^2(n-1)$$
%
% $O_i$ - pozorované četnosti (observed), $E_i$  - očekávané četnosti (expected). Pouze pravostranný.
% Vygenerujeme si data z rovnoměrného rozdělení a otestujeme je na toto rozdělení:

data_uni=random('Discrete Uniform',100,1,200); 

% Rozdělíme data do několika (10) intervalů:

[O,edges]=histcounts(data_uni,10) % O - četnosti, edges - hranice intervalů, 10 - počet intervalů
n=sum(O) % kolik četností máme dohromady
n_int=n/10 %kolik četností máme v každém intervalu

E=ones(1,10)*n_int % stejný počet četností v každém intervalu - pro rovnoměrné rozdělení

% Statistiku T porovnáme s tabulkovou hodnotou pro pravostranný test (kvantilem pro $\chi^2$-rozdělení). Pokud bude hodnota statistiky menší než 95% kvantil, hypotézu nezamítáme. V opačném případě jí zamítáme. Pro nás stačí p-hodnota:

[h,p,st] = chi2gof(edges(1:10),"Frequency",O,"Expected",E)

%% Kolmogorov-Smirnovův test
% Porovnává data se zcela popsaným rozdělením - musíme definovat přesně střední hodnotu a rozptyl. Pouze pravostranný.
% H0: Data pochází z teoretického rozdělení .... s parametry ....
% HA: Data nepochází z teoretického rozdělení ... s parametry ...
% Otestujeme, zda data z binomického rozdělení (n=4 a p=0.3) odpovídají i Poissonovo rozdělení (\lambda=1):

pd_bin=makedist("Binomial",4,0.3)% model binomického rozdělení
data_bin=random(pd_bin,200,1) % vygenerujeme si data 
pd_poi=makedist('Poisson',"lambda",1)% model  - poissonovo rozdělení
[h,p]=kstest(data_bin,"CDF",pd_poi)

% Zamítáme H0 nebo nezamítáme  a proč?
%
% Vygenerujeme si data z rozdělení normálního rozdělení N(50,25) a otestujeme na shodu s  N(45,25):

pd_norm50=makedist("Normal",50,5) % model - normální rozdělení N(50,25), sigma=5
x50=random(pd_norm50,100,1);% 100 řádků, 1 sloupec
pd_norm45=makedist("Normal",45,5)%model - normální rozdělení N(45,25)
[h,p]=kstest(x50,"CDF",pd_norm45)

% Statistika T - maximální vzdálenost mezi DF:

figure
cdfplot(x50)
hold on
x_values = linspace(min(x50),max(x50));
plot(x_values,normcdf(x_values,45,5),'r-')
legend('naměřená CDF','očekávaná CDF','Location','best')

hold off

% Na shodu s N(51,16):

pd_norm51=makedist("Normal",51,4)
[h,p]=kstest(x50,"CDF",pd_norm51)
figure
cdfplot(x50)
hold on
x_values = linspace(min(x50),max(x50));
plot(x_values,normcdf(x_values,51,4),'r-')
legend('naměřená CDF','očekávaná CDF','Location','best')

%% Samostatná práce - Grader