%% 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". % % 11) 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 e la table associata. % %% 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) % Osservazione: questa operazione non è più necessaria per le versioni % recenti di MATLAB %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" indiciordinati=[2 4 6 3 7 1 5]; Ntablecore=Ntablecore(indiciordinati,:); disp('Tabella con le righe riordinate') disp(Ntablecore) %% Modo alternativo per riordinare le modalità % Il codice precedente per riordinare le modalità della tabella di % contingenza è ad hoc e riferita al particolare file di Excel. % L'obiettivo del programmatore è scrivere codice che sia il più generale % possibile. % Il modo efficiente per stabilire da subito l'ordine delle modalità % all'interno della variabile X.partito è quella di creare una variabile categorica % e specificare l'ordine delle modalità. (v. anche il punto 11) ordmod=["DEMOCRATICO ATTIVISTA", "DEMOCRATICO" "DEMOCRATICO SIMPATIZZANTE",... "INDIPENDENTE" "REPUBBLICANO SIMPATIZZANTE", "REPUBBLICANO",... "REPUBBLICANO ATTIVISTA"]; Xpar=categorical(X.partito,ordmod); Ypenacap=categorical(X.penacap,["CONTRARIO" "FAVOREVOLE"]); [Ncorretto,~,~,labcorrette]=crosstab(Xpar,Ypenacap); [r,c]=size(Ncorretto); NtablecoreCHK=array2table(Ncorretto,'RowNames',labcorrette(1:r,1),... 'VariableNames',labcorrette(1:c,2)); % NtablecoreCHK è esattamente uguale a 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 (ossia array) Ncore=table2array(Ntablecore); sumr=sum(Ncore,2); % Ncoreperc = tabella di contingenza in formato double contenente le % percentuali di riga Ncoreperc=100*Ncore./sumr; % 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) % Modo alternativo per ottenere la tabella di contingenza in formato double % contenente le percentuali di riga senza passare attraverso table2array NtablecoreperCHK=Ntablecore; NtablecoreperCHK{:,:}=100*Ntablecore{:,:}./sum(Ntablecore{:,:},2); assert(isequal(Ntablecoreperc,NtablecoreperCHK),... 'Attenzione Ntablecoreperc e NtablecorepercCHK non sono uguali') %% 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:size(Ntablecoreperc,1),Ntablecoreperc{:,1:2},'stacked') set(gca,'xticklabel',Ntablecoreperc.Properties.RowNames,'XTickLabelRotation',90) % Modo 2 = 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' }) xlabel('Tendenza politica') ylabel('Percentuale') %% Modo 3 figure % estraggo i nomi (in formato cell array) nomicell=Ntablecoreperc.Properties.RowNames; % il secondo argomento di categorical contiene l'ordine con cui si devono % presentare le modalità nomibarre=categorical(nomicell,nomicell); bar(nomibarre,Ntablecoreperc{:,1:2},'stacked') title('Grafico ottenuto con le etichette sull''asse x definite come variabile categorica ') % % Provate a vedere cosa succede se non inserisco il secondo argomento nella % funzione categorical %{ close all nomibarre=categorical(nomicell); bar(nomibarre,Ntablecoreperc{:,1:2},'stacked') title('Grafico con etichette asse X ordinate in senso alfabetico') %} %% 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 conseguenza 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 %% Tabella di contingenza con variabili categoriche % 11) 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,labcat] =crosstab(X.partitoCAT,X.penacapCAT); [r,c]=size(Ncat); % Costruzione della matrice di contingenza in formato table NtableCAT=array2table(Ncat,'RowNames',labcat(1:r,1),'VariableNames',labcat(1:c,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')