% Importazione dei dati dentro MATLAB

X = readtable('SondUSAcont.xlsx', 'Sheet','SondaggioUSA','range','A1:Q1501','ReadRowNames',true);

% Creazione tabella di contingenza tra le variabili partito e penacap

% Creo la tabella di contingenza tra le variabili partito e penacap
[N,chi2,p,labels] =crosstab(X.partito,X.penacap);
[I,J]=size(N);
% Il primo argomento di output di crosstab contiene la tabella di
% contingenza in formato double (senza nomi ma solo con le frequenze)
% Il secondo argomento di ouptut di crosstab contiene il valore del test
% Chi quadrato di indipendenza tra le due variabili
% Il terzo argomento di ouptut di crosstab contiene il p-value del test
% Chi quadrato di indipendenza tra le due variabili
% Il quarto argomento di ouptut di crosstab contiene una matrice con le etichette delle righe della
% tabella di contingenza (prima colonna) e le etichette delle colonne delle tabella di contingenza (seconda colonna) 



% Visualizzo la tabella di contingenza in formato table

% Costruzione della matrice di contingenza in formato table
Ntable=array2table(N,'RowNames',labels(1:I,1),'VariableNames',labels(1:J,2));

disp('Tabella di contingenza originale')
disp(Ntable)

% Riordino della tabella

% Ntablecore contiene le risposte che ci interessano
Ntablecore=Ntable;
% Elimino le righe che contengono le risposte 'ALTRO' 'Non risponde'
% e le colonne che presentano le modalità 'Non so' 'Non risponde'
Ntablecore({'ALTRO' 'Non risponde'},:)=[];
Ntablecore(:,{'Non so' 'Non risponde'})=[];
%% Riordino le righe della table in modo tale da avere l'ordine che segue
%  DEMOCRATICO ATTIVISTA,   DEMOCRATICO    DEMOCRATICO SIMPATIZZANTE,  INDIPENDENTE   REPUBBLICANO SIMPATIZZANTE,   REPUBBLICANO,  REPUBBLICANO ATTIVISTA
Ntablecore=Ntablecore([2 4 6 3 7 1 5],:);
disp('Tabella in formato table con le righe riordinate')
disp(Ntablecore)

% Creazione di una nuova tabella che visualizza le percentuali di riga

% Calcolo delle percentuali di riga rispetto al toltale di riga
% Ncoreperc è un array 7 x 2 (non è una table)
Ncoreperc=100*Ntablecore{:,:}./sum(Ntablecore{:,:},2);

% Trasformo Ncoreperc in una table
% Ntablecoreperc = tabella di contingenza in formato table contenente le
% percentuali di riga
Ntablecoreperc=array2table(Ncoreperc,'RowNames',Ntablecore.Properties.RowNames,'VariableNames',labels(1:2,2));

disp('Tabella di contingenza contenente le percentuali di riga')
disp(Ntablecoreperc)

% Creo il grafico a barre sovrapposte tramite l'opzione stacked di bar
bar(Ntablecoreperc{:,:},'stacked')
set(gca,'xticklabel',Ntablecoreperc.Properties.RowNames,'XTickLabelRotation',90)
% Modo alternativo senza passare attraverso gca
nomi=Ntablecoreperc.Properties.RowNames;
bar(categorical(nomi,nomi),Ntablecoreperc{:,:},'stacked')


% Nei punti precedenti abbiamo visto come eliminare le modalità "Altro"
% e "non risponde" per il partito politico e le modalità "Non_so"
% "Non_risponde" per la posizione sulla pena di morte. Un modo alternativo
% di procedere è quello di definire come variabile categoriche queste due
% variabili. Questo evita i punti 4 e 5 visti in precedenza.
% Quesito. Rendere categoriche le due variabili e costruire la relativa
% tabella di contingenza.

ordinePARTITO={'DEMOCRATICO ATTIVISTA',   'DEMOCRATICO', ...
    'DEMOCRATICO SIMPATIZZANTE',  'INDIPENDENTE', ...
    'REPUBBLICANO SIMPATIZZANTE',   'REPUBBLICANO', ...
    'REPUBBLICANO ATTIVISTA'};

X.partitoCAT=categorical(X.partito,ordinePARTITO);

ordinePENACAP={'CONTRARIO' 'FAVOREVOLE'};
X.penacapCAT=categorical(X.penacap,ordinePENACAP);

[Ncat,chi2cat,pcat,labels] =crosstab(X.partitoCAT,X.penacapCAT);
[I,J]=size(Ncat);


% Costruzione della matrice di contingenza in formato table
NtableCAT=array2table(Ncat,'RowNames',labels(1:I,1),'VariableNames',labels(1:J,2));

disp('Tabella di contingenza con solo le modalità rilevanti')
disp(NtableCAT)

nomi1=categorical(ordinePARTITO,ordinePARTITO);
bar(nomi1,NtableCAT{:,1:2}./sum(NtableCAT{:,1:2},2),'stacked')
% Implementazione manuale del P-value dell'indice Chi2

% Vado a trovare la probabilità in una v.c. Chi2 con (r-1)*(c-1) gradi di
% libertà di ottenere un valore superiore a quello osservato.
pvalMAN=1-chi2cdf(chi2cat,(I-1)*(J-1));

assert(abs(pcat-pvalMAN)<1e-10,"Il p-value ottenuto tramite la chiamata a crosstab" + ...
    " è diverso da quello implementato manualmente")

% p-value molto basso, rifiuto decisamente l'ipotesi nulla di indipendenza tra "Appartenenza al partito politico" e "Posizione sulla pena di morte".