%% Testo
% 1) Importare in Matlab in formato table il contenuto del file SondUSA.xlsx inserendo come nomi delle righe il contenuto della colonna A del file di Excel
% 2) Creare la tabella di contingenza tra le variabili "appartenenza al partito politico" ("partito") e "posizione sulla pena di morte" ("penacap") utilizzando la routine crosstab
% 3) Visualizzare l'output in formato table inserendo nomi validi per le colonne (rimpiazzare lo spazio con il simbolo underscore)
% 4) Eliminare dalla table le modalità "Altro" e "non risponde" (per il partito politico" e le modalità "Non_so" Non_risponde (per la posizione sulla pena di morte). Nelle operazioni che seguono si fa sempre riferimento alla tabella con le modalità eliminate.
% 5) Riordinare le righe della table in modo tale da avere l'ordine che segue
% DEMOCRATICO ATTIVISTA,   DEMOCRATICO    DEMOCRATICO SIMPATIZZANTE,  INDIPENDENTE
% REPUBBLICANO SIMPATIZZANTE,   REPUBBLICANO,  REPUBBLICANO ATTIVISTA
% 6) Visualizzare all'interno della tabella precedente le percentuali di riga.
% 7) Costruire un grafico a barre in pila al 100%. Rappresentare i contrari con barre di colore rosso ed i favorevoli con barre di colore verde. Aggiungere al grafico le etichette delle righe con rotazione verticale di 60 gradi e la legenda.
% 8) Calcolare il valore dell'indice Chi2 ed il relativo p-value
% 9) Commentare il risultato ottenuto
% 10) Scrivere un programma che in modo tale che a) se il p-value risulta inferiore all'uno per mille venga scritto all'utente "rifiuto decisamente l'ipotesi nulla di indipendenza tra le due variabili" b) se il p-value risulta compreso tra l'uno per mille ed il 5 per cento venga scritto all'utente "rifiuto l'ipotesi nulla di indipendenza tra le due variabili" c) se il p-value risulta compreso tra il 5 per cento ed il 10 per cento venga scritto all'utente "il pvalue è compreso tra il 5 ed il 10 cento. d) se il p-value è superiore al 10 per cento venga scritto all'utente "il pvalue è non modesto di conseguenza non posso rifiutare l'ipotesi nulla di indipendenza delle due variabili".

%

%
%% Soluzione
%% 1) Importare in Matlab in formato table il contenuto del file SondUSA.xlsx inserendo come nomi delle righe il contenuto della colonna A del file di Excel
% Lettura dei dati dal file di Excel

X=readtable('SondUSA.xlsx','ReadRowNames',true);

%
%% 2) Creare la tabella di contingenza tra le variabili "appartenenza al partito politico" ("partito") e "posizione sulla pena di morte" ("penacap") utilizzando la routine crosstab

[N,chi2,p,labels] =crosstab(X.partito,X.penacap);
[r,c]=size(N);

%
%% 3) Visualizzare l'output in formato table inserendo nomi validi per le colonne (rimpiazzare lo spazio con il simbolo underscore)

%I nomi delle colonne non possono contenere spazi!
% Rimpiazza la stringa "Non so" con "Non_so"
labels(1:c,2)=strrep(labels(1:c,2),'Non so','Non_so');
% Rimpiazza la stringa "Non risponde" con "Non_risponde"
labels(1:c,2)=strrep(labels(1:c,2),'Non risponde','Non_risponde');

% L'istruzione che segue non è necessaria in quanto i nomi delle righe
% possono contenere spazi
% labels(1:r,1)=strrep(labels(1:r,1),'Non risponde','Non_risponde');

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

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

%
%% 4) Eliminare dalla table le modalità "Altro" e "non risponde" (per il partito politico" e le modalità "Non_so" Non_risponde (per la posizione sulla pena di morte).

% 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'})=[];

% Se le righe da tenere sono le prime 7 e le colonne da tenere sono le prime due
% allora si può utilizzare anche l'istruzione che segue
% Ntablecore=Ntable(1:7,1:2);
disp('Tabella che esclude le risposte non rilevanti')
disp(Ntablecore)

%
%% 5) Riordinare le righe della table in modo tale da avere l'ordine che segue
% DEMOCRATICO ATTIVISTA,   DEMOCRATICO    DEMOCRATICO SIMPATIZZANTE,  INDIPENDENTE   REPUBBLICANO SIMPATIZZANTE,   REPUBBLICANO,  REPUBBLICANO ATTIVISTA

% Le righe vengono riordinate in modo tale da passare da "Democratico
% attivista" a .... "Repubblicano attivista"
Ntablecore=Ntablecore([2 4 6 3 7 1 5],:);
disp('Tabella con le righe riordinate')
disp(Ntablecore)

%
%% 6) Visualizzare all'interno della tabella precedente le percentuali di riga.

% Visualizzazione della tabella in modo tale che la somma delle righe sia
% 100.
% Calcola la somma di ogni riga.
% Ncore = tabella di contingenza in formato double
Ncore=table2array(Ntablecore);
sumr=sum(Ncore,2);
% Ncoreperc = tabella di contingenza in formato double contenente le
% percentuali di riga
Ncoreperc=100*table2array(Ntablecore)./sumr;

% Modo alternativo per ottenere la tabella di contingenza in formato double
% contenente le percentuali di riga senza passare attraverso table2array
NcorepercCHK=100*Ntablecore{:,:}./sum(Ntablecore{:,:},2);

% 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 che riporta contenente per percentuali di riga')
disp(Ntablecoreperc)

%
%% 7) Costruire un grafico a barre in pila al 100%. Rappresentare i contrari con barre di colore rosso ed i favorevoli con barre di colore verde. Aggiungere al grafico le etichette delle righe con rotazione verticale di 60 gradi e la legenda.

%modo 1= opzione stacked di bar
% stacked bar chart (grafico a barre in pila)
bar(1:7,Ntablecoreperc{:,1:2},'stacked')
set(gca,'xticklabel',Ntablecoreperc.Properties.RowNames,'XTickLabelRotation',90)

% modo 1 = creo un grafico delle barre alte 100. Sovrappongo al grafico
% precedente (tramite l'istruzione hold('on')) una delle due colonne della
% tabella di contingenza
close all
% Crea le barre con altezza 100 di colore rosso
bar(1:7,100*ones(7,1),'r')
hold('on')
% Sovrapponi barre di colore blu contenenti le percentuali di favorevoli
bar(1:7,Ntablecoreperc{:,2},'b')
% Aggiungi le etichette delle righe ruotate di 60 gradi
set(gca,'xticklabel',Ntablecoreperc.Properties.RowNames,'XTickLabelRotation',60)
% Aggiungere la legenda al grafico
legend({'Contrari' 'Favorevoli' })

%
%% 8) Calcolare il valore dell'indice Chi2 ed il relativo p-value

% n = numero totale di unità statistiche
n=sum(sum(Ncore));

% sumc= somma delle frequenze di colonne (frequenze marginali di colonna)
sumc=sum(Ncore,1);
% sumr = somma delle frequenze di riga (frequenze marginali di riga)
sumr=sum(Ncore,2);
% Calcolo della matrice delle frequenze teoriche
Ntheo=(sumr.*sumc/n);

% Implementazione dell'indice Chi2 in maniera vettoriale
Chi2=sum(((Ncore(:)-Ntheo(:)).^2)./Ntheo(:));

% df = degrees of freedom
% df = (numero di righe -1)(numero di colonne -1)
df=prod(size(Ncore)-1);

% Calcolo del p-value del test
pval=1-chi2cdf(Chi2,df);

disp(['Il p-value del test di indipendenza è pari a ' num2str(pval)])

%
%% 9) Commentare il risultato ottenuto
% La probabilità che si verifichi il risultato campionario quando l'ipotesi nulla è vera (p-value dell'ipotesi nulla di indipendenza) è molto bassa di conseguenza rifiuto decisamente l'ipotesi nulla di indipendenza delle due variabili

disp('Rifiuto decisamente l''ipotesi nulla di indipendenza delle variabili "appartenenza al partito politico" e "posizione sulla pena di morte"')

%
%% 10) Scrivere un programma che in modo tale che
% a) se il p-value risulta inferiore all'uno per mille venga scritto all'utente "rifiuto decisamente l'ipotesi nulla di indipendenza tra le due variabili" b) se il p-value risulta compreso tra l'uno per mille ed il 5 per cento venga scritto all'utente "rifiuto l'ipotesi nulla di indipendenza tra le due variabili" c) se il p-value risulta compreso tra il 5 per cento ed il 10 per cento venga scritto all'utente "il pvalue è compreso tra il 5 ed il 10 cento. d) se il p-value è superiore al 10 per cento venga scritto all'utente "il pvalue è non modesto di consegenza non posso rifiutare l'ipotesi nulla di indipendenza tra le due variabili".

if pval <= 0.001
    disp(['Rifiuto decisamente  l''ipotesi nulla di' ...
        ' indipendenza tra le due variabili'])
elseif pval > 0.001 && pval <=0.05
    disp(['Rifiuto l''ipotesi nulla di' ...
        ' indipendenza tra le due variabili'])
elseif pval > 0.05 && pval <=0.10
    disp('Il pvalue è compreso tra il 5 ed il 10 cento')
else
    disp(['Il pvalue è non modesto di conseguenza non posso ' ...
        'rifiutare l''ipotesi nulla di indipendenza delle due variabili'])
end