%% Testo
% 1) Importare in MATLAB i dati presenti nel file spumanti.xlsx.
% Inserire in una cell denominata X le due variabili Gusto (x) e Abbinamento (y) .
% 2) Partendo dalla cell X, costruire la tabella di contigenza tra le variabili Gusto (x) e Abbinamento (y) prima tramite matrice di doubles e poi tramite table con i nomi delle righe e delle colonne.
% 3) Calcolare l'indice Chi2 ed il relativo p-value e confrontare i risultati con quelli che si ottengono dalla procedura crosstab
% 4) Calcolare e commentare gli indici \lambda_{y!x} , {\tau \;}_{y!x} e H_{y!x}. Commentare i valori ottenuti degli indici
% 5) Partendo dalla cell X, utilizzando la funzione corrNominal del toolbox FSDA (scaricable da http://rosa.unipr.it) calcolare
% a) la matrice N delle frequenze assolute tramite double e table
% b) l'indice Chi2
% c) l'indice Phi
% d) l'indice V di Cramer
% e) l'indice di Goodman e Kruskall \lambda_{y!x}
% f) l'indice {\tau \;}_{y!x} di Thail
% g) il coefficiente di incertezza di Theil  H_{y!x}.
%
%% Soluzione
%
%% Costruzione tabella di contingenza partendo dal file di dati di Excel

[~, cat] = xlsread('spumanti.xlsx','Dati','K2:N107');
% Estraggo le variabili gusto e abbinamento nella cell X
X=cat(:,[1 4])
% Costruzione della tabella di contingenza
[N,Chi2chk,pvalchk,labels]=crosstab(X(:,1),X(:,2))


[I,J] = size(N);
% Dalla matrice N (che contiene le frequenze assolute) creo l'oggetto di
% tipo table che contiene i nomi delle righe e delle colonne
labels(1:J,2)=strrep(labels(1:J,2),'APERITIVO E PESCE','APERITIVO_E_PESCE');
labels(1:J,2)=strrep(labels(1:J,2),'TUTTO PASTO','TUTTO_PASTO');

Ntable=array2table(N,'RowNames',labels(1:I,1),'VariableNames',labels(1:J,2))


% sample size
n = sum(N(:));


% nidot = row sums
nidot=sum(N,2);
% ndotj= column sums
ndotj=sum(N,1);

% Matrix of theoretical frequencies
Ntheo=(nidot*ndotj/n);

% INDICE CHI2


% Chi2 index
Chi2=sum(((N(:)-Ntheo(:)).^2)./Ntheo(:));
% calcolo pvalue
pval=1-chi2cdf(Chi2,(I-1)*(J-1));

% Controllo calcoli indice CHI2 con quelli che uscivano dall'istruzione crosstab

disp([pval pvalchk])
disp([Chi2 Chi2chk])

%
% Goodman and Kruskall lambda \lambda_{y!x}


% Goodman and Kruskall lambda
ndotjmax=max(ndotj);
nidotmax=max(nidot);

GKlambdayx=(sum(max(N,[],2))-ndotjmax)/(n-ndotjmax);


% Commento: c'è una riduzione della probabilità di errore del 42.86%
% nell'abbinamento consigliato se si conosce il gusto dello spumante 


% INDICE TAU  {\tau \;}_{y!x}

% Il vettore colonna nidot viene replicato J volte
nidotmat=repmat(nidot,1,J);
% Il vettore riga ndotj viene replicato I volte
ndotjmat=repmat(ndotj,I,1);

% nidotmat, ndotjmat e N hanno tutti la stessa dimensione 
sumdotj2=sum(ndotj.^2);

% tau index (proportional reduction in variation of Goodman and Kruskall),
% when variation is measured using Gini's coefficient
tauyx= (  n*sum(N(:).^2./nidotmat(:))-sumdotj2)/(n^2-sumdotj2);
disp(tauyx)

% Commento:
% Interpretazione: la conoscenza del gusto dello spumante riduce del 35.03% 
% l'eterogeneità (misurata tramite l'indice di Gini) nella previsione 
% dell’abbinamento consigliato.

% INDICE H di THEIL (coefficiente di incertezza)  H_{y!x}


% H index = proportional reduction in variation when variation is measured
% using the entropy
% H index (uncertainty coefficient) of Theil
% boo è un vettore Booleano che contiene 1 in corrispondenza delle celle
% della tabella >0. Questo per evitare di fare il log di 0
boo=(N(:)~=0);
Hyx= -sum(N(boo).*log(N(boo)./Ntheo(boo))  )/sum(ndotj.*log(ndotj/n));
disp(Hyx)


% Commento:
% Interpretazione: la conoscenza del gusto dello spumante riduce del 32.41% circa 
% l'eterogeneità (misurata tramite l'indice di Shannon) nella previsione 
% dell’abbinamento consigliato.

%
% Calcolo di tutti gli indici tramite la funzione corrNominal dell'FSDA toolbox partendo dalla cell X

out=corrNominal(X,'datamatrix',true)

%
% Modo alternativo di chiamare la funzione corrNominal passandogli come input una table
%

Xtable=readtable('spumanti.xlsx','Sheet','Dati','Range','K1:N107');

outCHK=corrNominal(Xtable(:,{'GUSTO' 'ABBINAMENTO'}),'datamatrix',true);