%% Test esercizio
% Il foglio dati del file stand.xlsx contiene informazioni su 25 modelli di home theatre. 1) Costruire la matrice degli scostamenti standardizzati utilizzando la funzione zscore. Verificare che il risultato ottenuto sia uguale a quello che si ottiene utilizzando le funzioni mean e std. 1) Per ciascuna delle 3 variabili calcolare la varianza campionaria (corretta) e verificare il risultato tramite l'implementazione manuale 3) calcolare gli indici di asimmetria e curtosi (corretti) usando le formule di Matlab skewness e kurtosis (verificare il risultato tramite implementazione manaule). Per le formule si vedano le slide e/o il libro di statistica Milioli Riani Zani (2019) p. 176 e p. 189 4) Calcolare i MAD normalizzati (ossia 1.4826*Me(xi-Me(X))) per ognuna delle 3 variabili. Interpretare il MAD del prezzo. 5) Standardizzare i dati in maniera robusta utilizzando le mediane ed i MAD. 6) Verificare che il risultato ottenuto coincide con quello che si ottiene applicando la funzione zscoreFS dell'FSDA toolbox. 7) Modificare la prima riga della matrice dati imputando il valore 10000. Confrontare la standardizzazione robusta con quella non robusta. Commentare i risultati ottenuti
%% Controllo il modo di visualizzare i dati
% L'istruzione che segue specifica il tipo di formato di visualizzazione dei dati (shortG utilizza 5 cifre, il default è format short 4 cifre decimali dopo la virgola) Questa istruzione non è assolutamente necessaria per la risoluzione dell'esercizio

format shortG

%
%% Soluzione
% caricamento dei dati dentro MATLAB

X = readtable("stand.xlsx", 'Sheet','dati','range','A1:D26','ReadRowNames',true,'Format','Auto');


% Definisco la matrice Xd come il contenuto della table X in formato double
% (ossia contentente solo i numeri dentro X e senza i nomi di riga e
% colonne)
Xd=X{:,:};

%
%% 1) Costruire la matrice degli scostamenti standardizzati
% utilizzando la funzione zscore.

Z=zscore(Xd);

% Calcolo delle medie campionarie
disp('Media campionarie')
medie=mean(Xd);
disp(medie)

% Calcolo degli scostamenti quadratici medi corretti
disp('sigma_corr')
scorr=std(Xd);
disp(scorr);

%
%% Verificare che il risultato ottenuto sia uguale a quello che si ottiene utilizzando le funzioni
% mean e std.

Zchk=(Xd-medie)./scorr;

%
%% Calcolo delle varianze campionarie

disp('Varianze campionarie corrette')
varianze=var(Xd);
disp(varianze)

n=size(Xd,1);
% Implementazione manuale delle varianze
disp('Implementazione manuale delle varianze')
varc=sum((Xd-mean(Xd)).^2)/(n-1);
disp(varc);

%
%% 3) calcolare gli indici di asimmetria e
% curtosi (corretti) usando le formule di Matlab skewness e kurtosis

% Calcolo degli indici di asimmetria
disp('Indici di asimmetria (calcolati tramite la formula skewness)')
% Il secondo argimento di skewness consente di specificare che vogliamo la
% versione corretta (non distorta) dell'indice
skauto=skewness(Xd,0);
disp(skauto)

% Indici di skewness calcolati manualmente
disp('Indici di asimmetria (calcolati manualmente)')
skman=(n/((n-1)*(n-2)))*sum(Z.^3,1);
disp(skman)

% Calcolo degli indici di curtosi
disp('Indici di curtosi (calcolati tramite la funzione kurtosis)')
% Il secondo argomento di kurtosis consente di specificare che vogliamo la
% versione corretta (non distorta) dell'indice
% Osservazione: i valori che calcola MATLAB sono uguali a quelli di Excel +3
kuauto=kurtosis(Xd,0);
disp(kuauto)


disp('Indici di curtosi (calcolati manualmente)')
kuman=((n+1)*n)/((n-1)*(n-2)*(n-3))*sum(Z.^4,1)-3*(n-1)^2/((n-2)*(n-3))+3;
disp(kuman)

%
%% Standardizzazione dei dati in maniera robusta

% Calcolo degli indici MAD (normalizzati)
disp(' Calcolo degli indici MAD (normalizzati)')
madnorm=1.4826*mad(Xd,1);
disp(madnorm)


Zrob=(Xd-median(Xd))./madnorm;

% Standardizzazione tramite mediana e MAD (implementazione manuale)
disp('Standardizzazione robusta (implementazione manuale)')
disp(Zrob)

% Standardizzazione robusta (tramite la funzione zscoreFS dell'FSDA
% toolbox). 
% Osservazione: per installare l'FSDA toolbox dal menu APPS selezionare
% "Get More Apps".  Nella casella di ricerca "Search for add-ons" digitare
% FSDA.
disp('Standardizzazione robusta (tramite la funzione zscoreFS)')
disp(zscoreFS(Xd))

%
%% Confronto tra standardizzazione tradizionale e standardizzazione robusta in
% presenza di contaminazione

% Il contenuto della matrice di double Xd viene copiato in una nuova
% matrice di double denominata Xcont
Xcont=Xd;
% La prima riga di Xcont viene contaminata con il valore 10000
Xcont(1,:)=10000;

disp('Standardizzazione tradizionale (dati contaminati)')
disp(zscore(Xcont))
% Tutti i valori sono negativi tranne il primo (per soddisfare il vincolo
% che le medie siano 0)
disp('Standardizzazione robusta (dati contaminati)')
disp(zscoreFS(Xcont))
% La standardizzazione robusta non risente del valore anomalo (prima riga
% della matrice dei dati).