%% Podstawowe parametry statystyczne
% Plik cisnienie-rok.csv jest w dokładnei takim samym formacie jak plik temperatury.csv opisanym w Zadaniu Usuwanie trendu. Zawiera pomiary ciśnienia atmosferycznego z okresu listopad 2023-listopad 2024.
% Teraz będa nas interesowały tylko wartości ciśnienia.
% Do importu skorzystamy z aplikacji Import Data. Poniżej przygotowany przez nią skrypt. Dane zapisane będą w tablicy cisnienierok.
%% Import data from text file
% Script for importing data from the following text file:
%   filename: /home/myszka/Dokumenty/teksty/Dydaktyka/BIM031106/w08b/cisnienie-rok.csv
% Auto-generated by MATLAB on 23-Nov-2024 17:11:58
%
%% Set up the Import Options and import the data

opts = delimitedTextImportOptions("NumVariables", 3);

% Specify range and delimiter
opts.DataLines = [2, Inf];
opts.Delimiter = ",";

% Specify column names and types
opts.VariableNames = ["entity_id", "state", "last_changed"];
opts.VariableTypes = ["categorical", "double", "string"];

% Specify file level properties
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";

% Specify variable properties
opts = setvaropts(opts, "last_changed", "WhitespaceRule", "preserve");
opts = setvaropts(opts, ["entity_id", "last_changed"], "EmptyFieldRule", "auto");

% Import the data
cisnienierok = readtable("/home/myszka/Dokumenty/teksty/Dydaktyka/BIM031106/w08b/cisnienie-rok.csv", opts)

%
%% Clear temporary variables

clear opts

%
%% Podstawowe parametry
% Kolumna cisninieneirok.state zawiera pomiary. Jest ich całkiemsporo. Podstawowe ich parametry minimum, maksimum i srednia…

min(cisnienierok.state)
max(cisnienierok.state)
mean(cisnienierok.state)

% O ile minimum i maksimuk są OK i prawdopodobne, to już średnia nie wychodzi…
%
%% NaN czyli Not a Number
% Nor a Number to taki twór który powstaje gdy wyrażenie arytmetyczne nie ma sensu (na prezykład, gdy do -\infty dodajemy \infty.
% Taka wartośc może pojwić się również w trakcie importu danych, gdy wartość, ktpra ma być interpretowana jako numeryczna taka nie jest.
% Często różne systemy pomiarowe gdy nie mogą dokonać jakiegoś pomiaru wstawiają ją do bazy danych…
% Funkcja isnan() pozwala sprawdzić czy wartośc zmiennej jest NaN

nany = isnan(cisnienierok.state)

% Wykonanie tej funkcji tworzy tablicę logiczną zawierającą prawdę w tych miejscach, w których badaba zmienna zawiera wartość NaN. I fałsz w pozostałych. Tablica ma tę samą długośc co dane…

sum(nany)

% W ten sposób sprawdzamy ile jest w niej jedynek. Możemy tej nowej zmiennej użyć do zaindeksowania tablicy pomiatów

cisnienierok(nany,:)

% Natomiast zależy nam na pozbyciu się z tablicy danych złych wartości…
% Funkcja rmmissing() usuwa z tablicy wszystkie wiersze, w których występuja NaN

cisnienie = rmmissing(cisnienierok);
size(cisnienie)

% Możemy kontynuować badanie

format default
min(cisnienie.state)
max(cisnienie.state)
mean(cisnienie.state)
median(cisnienie.state)
zzz = mode(cisnienie.state)
zzz1 = cisnienie.state == zzz;
sum(zzz1)

%
%% Mediana
% Mediana to inaczej wartość środkowa (drugi kwartyl) czyli taka wartość powyżej której jest tyle samo punktów co poniżej niej. Cześto używa się jej gdy w zbiorze danych są wartości odstające (mocno różniące się od innych). Innymi statystykami pozycyjnymi są kwartyle
% pierwszy kwartyl (albo dolny kwartyl) to taka wartość poniżej której znajduje się 25% wszystkich punktów (oznaczany czasmi jako Q_{2}
% drugi kwartyl (czyli mediana)
% trzeci (górny) kwartyl: poniżej niego jest 75% punktów
%
%% Inne ważne parametry:
% Odchylenie standardowe

std(cisnienie.state)

% Wariancja

var(cisnienie.state)

% Zakres

range(cisnienie.state)

% Narysowanie przebiegu ciśnienia w czasie zostawiam zainteresowanycm
%
%% summary()
% Martlab ma też funkcję bardzo podstawowa, ale bardzo pomocną

summary(cisnienierok.state)
summary(cisnienie.state)

%
%% boxplot()
% Funkcja boxplot() (wykres pudełkowy) w sposób graficzny prezentuje rozproszenie danych. Jest również funkcja boxchart() która przedstawia ten sam resultat w ciut innej formie

boxplot(cisnienie.state)

ax = gca;
chart = ax.Children.Children(2);
datatip(chart,1,1022);
boxchart(cisnienie.state)

ax = gca;
chart = ax.Children(1);
datatip(chart,"1",1038);

% Na wykresie tym
% górna, pozioma kreska  (upper whisker) reprezentuje wartość
% górna krawędż pudełka to trzeci kwartyl
% czerwona kreska to mediana
% dolna krawędź to pierwszy kwartyl
% dolna pozioa kreska to dolny zakres, chociaż, te czerwone kreseczki to wartości wyraźnie odstający (outliers)
%
%% isoutlier()
% Funkcja isoutlier() wskazuje wszystkie punkty danych, które wyraźnie różnią się od pozostałych. Działa podobnie jak isnan().
% Można jej uzyć jako funkcji albo jako graficznego zadania (Insert Task)

out = isoutlier(cisnienie.state);
size(out)
sum(out)
cisnienie(out,:)

% Możłiwości funkcji są znacznie większe, pozala albo usunąć wartości odstające albo zastąpić je wartościami interpolowanymi…
%
%% histogram()
% Histogram danych

h = histogram(cisnienie.state)

% Dodatkowymi parametrami funkcji mogą być:
% liczba przedziałow
% albo wektor wartości określający ich granice.
% Obiekt h p[ozwala na wyciągniuęcie dodatkowych ionformacji na temat histogramu
% h.NumBins — liczba przedzaiłow
% h.Values mówi ile wartości wpadło do każdego z przedziałów
% h.BinEdges to wektor zawierający granice przedziałów
% Dodatkowe funkcje fewerbins oraz morebins pozwalają interaktywnie zmiiejszać lub zwiększać liczbę przedzaiłów (o 10% zaokrąglone do wartości całkowitej)

morebins(h)
fewerbins(h)
histogram(cisnienie.state,"BinWidth",5)

% W parametrach można też wskazać inne, interesujące nas parametry histogramu
%
%% Rozkład normalny
% Bardzo często przyjmuje się, że jakaś zmienna ma rozkłąd normalny. Więc chcielibyśmy porównań (graficznie) nasz rozkłąd z rozkłądem normalnym.
% Po pierwsze trzeba wyrysować znormalizowany histogram, zamieniając liczności poszczególnych kl;as na prawdopodobieństwa.
% Polecenie wygląda tak:

histogram(cisnienie.state,'Normalization','pdf')

% Funkcja opisująca rozkłąd normalny ośredniej \mu odchyleniu standardowym \sigma i wariancji \sigma^2 opisuje wzór
% f(x, \mu, \sigma) = \frac{1}{\sigma\sqrt{2\pi}}\exp\left[-\frac{(x-\mu)^2}{2\sigma^2}\right]

mu = mean(cisnienie.state);
sigma = std(cisnienie.state);
x = 980:1040;
f = exp(-(x-mu).^2./(2*sigma^2))./(sigma*sqrt(2*pi));
hold on
plot(x, f)

%
%% Testowanie normalności rozkładu
% Tu wchodzimy głęboko w statystykę. Służy do tego test chi-kwadrat (\chi^2).
% W MATLABie realizuje ją funkcja chi2gof().

test = chi2gof(cisnienie.state)

% Procedura jest taka:
% Stawiamy hipotezę, że badana próbka pochodzi z rozkłądu normalnego. Nazywa się to hipotezą zerową.
% Dzielimy zakres zmienności badanej zmiennej na przedziały (podobnie jak robi się to na potrzeby histogramu)
% Wyliczamy teoretyczną (wynikającą z rozkładu) liczbę próbek, która powinna wystąpić w każdym przedziale.
% Wyliczamy statystykę \chi^2=\displaystyle\sum_{i=1}^n\frac{(O_i - E_i)^2}{E_i}
% O_i — liczba próbek „wpadających” do przedziału; E_i — teoretyczna (wynikajaca z rozkładu) liczba próbek
% Wynik równy 1 mówi, że hipotezę należy odrzucić, 0 — gdy nie ma podstw do jej odrzucenia
% Funkcja może również służyć do testowania zgodności próbki z innymi rozkładami
%