-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDispensa.typ
More file actions
3509 lines (2627 loc) · 144 KB
/
Copy pathDispensa.typ
File metadata and controls
3509 lines (2627 loc) · 144 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// !!! IMPORTANT !!!
// Typst Compiler Version 0.11.0
#import "@preview/gentle-clues:0.8.0": *
#import "@preview/cetz:0.2.2"
#import "@preview/codly:0.2.0": *
#import "@preview/equate:0.2.0": equate
// pdf metadata
#set document(
title: "Statistica e Analisi dei dati",
author: ("Luca Favini", "Matteo Zagheno"),
)
// codly setup
#show: codly-init.with()
#codly(
languages: (python: (name: "Python", color: blue, icon: none)),
zebra-color: white,
stroke-width: 1.5pt,
stroke-color: blue,
enable-numbers: false
)
// evidenziare link
#show link: it => {
if type(it.dest) != str {
// link interni
underline(it, stroke: 1.5pt + blue)
}
else {
// link esterni
underline(it, stroke: 1.5pt + red)
}
}
// evidenziare link nell'indice
#show outline.entry: it => {
underline(it, stroke: 1.5pt + blue)
}
// settings box colorati
#show: gentle-clues.with(breakable: true)
// settings equazioni
#show: equate.with(breakable: true)
// box colorati
#let nota(body) = { info(title: "Nota")[#body] }
#let attenzione(body) = { warning(title: "Attenzione")[#body] }
#let informalmente(body) = { conclusion(title: "Informalmente")[#body] }
#let dimostrazione(body) = { memo(title: "Dimostrazione")[#body] }
// testo matematico colorato
#let mg(body) = text(fill: olive, $#body$)
#let mm(body) = text(fill: maroon, $#body$)
#let mo(body) = text(fill: orange, $#body$)
#let mr(body) = text(fill: red, $#body$)
#let mp(body) = text(fill: purple, $#body$)
#let mb(body) = text(fill: blue, $#body$)
// numerazione titoli
#set heading(numbering: "1.1.")
// pagina iniziale (titolo)
#page(align(left + horizon, block(width: 90%)[
#text(3em)[*Statistica e Analisi dei dati*]
#text(1.5em)[Università degli studi di Milano - Informatica]
#link("https://github.com/Favo02")[
#text(1.5em, "Luca Favini")
]
#text(", ")
#link("https://github.com/tsagae")[
#text(1.5em, "Matteo Zagheno")
]
#text(", ")
#link("https://github.com/Gallja")[
#text(1.5em, "Andrea Galliano")
]
#text("Ultima modifica:")
#datetime.today().display("[day]/[month]/[year]")
]))
#set par(linebreaks: "optimized")
// impostazioni pagine
#let numberingH(c)={
return numbering(c.numbering,..counter(heading).at(c.location()))
}
#let currentH(level: 1)={
let elems = query(selector(heading).after(here()))
if elems.len() != 0 and elems.first().location().page() == here().page() {
return [#numberingH(elems.first()) #elems.first().body]
} else {
elems = query(selector(heading).before(here()))
if elems.len() != 0 {
return [#numberingH(elems.last()) #elems.last().body]
}
}
return ""
}
#set page(
numbering: "1",
number-align: bottom + right,
header: [
#set text(8pt)
_Statistica e Analisi dei dati_
#h(1fr)
#context[_ #currentH() _]
],
footer: [
#set text(8pt)
#context[
_Luca Favini, Matteo Zagheno - #datetime.today().display("[day]/[month]/[year]")_
#h(1fr)
#text(12pt)[#counter(page).display("1")]
]
],
)
#heading(outlined: false, bookmarked: false, numbering: none, "Statistica e Analisi dei dati")
La statistica si occupa di raccogliere, analizzare e trarre conclusioni su dati, attraverso vari strumenti:
- #link(<descrittiva>)[Statistica descrittiva]: esposizione e *condensazione* dei dati, cercando di limitarne l'incertezza;
- #link(<probabilità>)[Calcolo delle probabilità]: creazione e analisi di modelli in situazioni di *incertezza*;
- #link(<inferenziale>)[Statistica inferenziale]: *approssimazione* degli esiti mancanti, attraverso modelli probabilistici;
- _Appendice: #link(<modelli>)[Cheatsheet variabili aleatorie e modelli]:_ riassunto formule e proprietà delle variabili aleatorie e dei modelli;
- _Appendice: #link(<python>)[Cheatsheet Python]:_ raccolta funzioni/classi Python utili ai fini dell'esame _(e non)_;
- _Appendice: #link(<matematica>)[Cheatsheet matematica]:_ trucchi per risolvere/semplificare equazioni, serie, integrali;
- _Appendice: #link(<esercizi>)[Esercizi]:_ come svolegere gli esercizi dell'esame.
#heading(outlined: false, bookmarked: false, numbering: none, "Autori, Ringraziamenti e Licenza")
/ Autori: #link("https://github.com/Favo02")[Luca Favini], #link("https://github.com/tsagae")[Matteo Zagheno], #link("https://github.com/Gallja")[Andrea Galliano] _(Appendice Python)_
/ Ringraziamenti: #link("https://github.com/Catu42")[Martina Provini] _(appunti)_, #link("https://github.com/ceri01")[Daniele Ceribelli] _(appunti)_
/ Sorgente e Licenza: #link("https://github.com/Favo02/statistica-e-analisi-dei-dati")[github.com/Favo02/statistica-e-analisi-dei-dati] (#link("https://creativecommons.org/licenses/by/4.0/")[CC-BY-4.0])
/ Ultima modifica: #datetime.today().display("[day]/[month]/[year]")
// indice
#outline(
title: "Indice",
indent: auto
)
#pagebreak()
// TODO: roba da sistemare!!!
/*
cosa vuol dire che lo stimatore non è deviato? questo vuol dire che stimando molte volte usando lo stimatore, allora la media delle stime ottenute è molto vicino al vero valore di p
omega: insieme degli esiti
algebra: insieme di eventi, quindi insieme di sottoinsiemi di omega
aggiungere in correzione di bessel: corregge la stima della varianza campionaria, provando a fare i conti esce che serve il n-1
dimostrazione teorema proprietà totali
dimostrazione eventi indipendenti
indipendenza a più eventi (non si estende per transitività)
indipendenza variabili aleatorie
regola empirica (e grafico) per normale
distribuzione uniforme continua: tutti gli esiti non sono equiprobabili (gli esiti sono tutti 0 inun punto)
quantile di una variabile aleatoria: inverso della funzione di ripartizione
da quantile descrittivo a quello di un va: quello che è una percentuale, diventa una probabilità
quindi F^-1 passa dalla probabilità (quindi il percento del quantile) all'evento associato alla probabilità (x_q)
specificare meglio la differenza tra quantile (x_q) e livello (q)
funzione di ripartizione va, aggiungere proprietà: continua da destra
*/
= Statistica descrittiva <descrittiva>
/ Popolazione: insieme di elementi da _analizzare_, spesso troppo numerosa per essere analizzata tutta
/ Campione: _parte_ della popolazione estratta per essere analizzata, deve essere rappresentativo
/ Campione casuale (semplice): tutti i membri della popolazione hanno la _stessa probabilità_ di essere selezionati
/ Campione stratificato: vengono individuate delle _categorie_ e si forma un campione facendo in modo che tutte le categorie siano proporzionalmente rappresentate
== Classificazione dei dati: qualitativi e quantitativi <quantitativi>
/ Dati quantitativi \/ Scalari \/ Numerici: l'esito della misurazione è una quantità numerica
/ Discreti: si lavora su valori singoli (spesso interi), ad esempio: _numeri di figli_
/ Continui: si lavora su range di intervalli, ad esempio: _peso_ o _altezza_
/ Dati qualitativi \/ Categorici \/ Nominali: l'esito della misurazione è un'etichetta
/ Booleani \/ Binari: due valori possibili, ad esempio: _sesso_
/ Ordinali: valori ordinabili, ad esempio: _livello di soddisfazione_
/ Nominali \/ Sconnessi: valori *non* ordinabili, ad esempio: _nome_
#nota[
Spesso alcuni dati _numerici_ vengono considerati _qualitativi_, dato che non ha senso effettuare su di essi considerazioni algebriche o numeriche. Un esempio potrebbe essere la data di nascita
]
== Frequenze <frequenze>
/ Frequenza assoluta: _occorrenza assoluta di un carattere_, ovvero il numero di volte che un certo valore appare in un campione di dati
/ Frequenza relativa: rapporto tra la _frequenza assoluta_ di un dato e il la _dimensione del campione_ (quindi è sempre compresa tra $0$ e $1$)
=== Frequenze cumulate e Funzione cumulativa empirica
/ Frequenza cumulata: somma delle _frequenze assolute_ di tutti i valori _inferiori o uguali_ a un determinato valore, rappresenta il numero totale di osservazioni fino a quel valore
#attenzione[
È possibile calcolare la _frequenza cumulata_ solo in caso di dati _ordinabili_
]
/ Funzione cumulativa (o di ripartizione) empirica: funzione $hat(F) : bb(R) -> [0,1]$ che, per ogni valore, mostra la proporzione del campione che è minore o uguale a quel valore
$ hat(F)(x) = (\#{x_i <= x})/n = 1/n sum_(i=1)^n I_(-infinity, x] (x_i) $
#nota[
$I_A : bb(R) -> {0,1}$ indica la #link(<indicatrice>)[funzione indicatrice] dell'insieme $A$, ovvero vale $0 space forall a in.not A$ e $1 space forall a in A$
]
#nota[
È possibile vedere la funzione cumulativa empirica come una stima della #link(<funzione-ripartizione>)[funzione di ripartizione], infatti ne è un buon #link(<stimatore>)[stimatore] consistente in media quadratica
]
=== Frequenze conguinte e marginali
Prendiamo in considerazione due caratteri dell'insieme di osservazioni:
/ Frequenza congiunta assoluta/relativa: numero di osservazioni in cui i due caratteri assumono dei determinati valori _(dati in corsivo nella tabella sottostante)_
/ Frequenze marginali: somme delle frequenze congiunte lungo le righe o le colonne di una tabella di contingenza, rappresentando la frequenza totale di ciascuna variabile _(dati in giallo nella tabella sottostante)_
#figure(caption: "Tabella di contingenza")[
#table(
columns: 5,
inset: 10pt,
align: horizon,
table.cell(colspan: 2, rowspan: 2, []),
table.cell(colspan: 2, fill: silver, [*Capelli*]), [],
table.cell(fill: silver, [*Chiari*]), table.cell(fill: silver, [*Scuri*]),
table.cell(fill: yellow, [*Tot Occhi*]),
table.cell(rowspan: 3, fill: silver, [*Occhi*]),
table.cell(fill: silver, [*Verdi*]), [_5_], [_3_],
table.cell(fill: yellow, [8]),
table.cell(fill: silver, [*Marroni*]), [_2_], [_42_],
table.cell(fill: yellow, [44]),
table.cell(fill: silver, [*Azzurri*]), [_8_], [_1_],
table.cell(fill: yellow, [9]),
[], table.cell(fill: yellow, [*Tot Capelli*]),
table.cell(fill: yellow, [15]),
table.cell(fill: yellow, [46]),
table.cell(fill: yellow, [61])
)
]
== Indici di centralità <indice-centralita>
Sono indici che danno un'idea approssimata dell'_ordine di grandezza_, intorno a quale valore si colloca l'insieme dei valori esistenti.
=== Media campionaria <media>
Viene indicata da $overline(x)$, ed è la *media aritmetica* di tutte le osservazioni del campione.
$ overline(x) = 1 / n sum_(i=1)^(n) x_i $
La media opera linearmente, quindi può essere scalata ($dot a$) e/o traslata ($+ b$):
$ forall i space y_i = a x_i + b => overline(y) = a overline(x) + b $
#nota[
Può essere calcolata solo con #link(<quantitativi>)[dati quantitativi].
]
#attenzione[
La media non è un indice robusto rispetto agli *outlier* <outlier>, ovvero i dati fuori scala, che la influenzano pesantemente
]
=== Mediana campionaria
È il valore nella *posizione di mezzo* di un dataset ordinato in ordine crescente, ovvero un valore $>=$ e $<=$ di almeno la metà dei dati.
Dato un dataset di dimensione $n$ la mediana è:
- l'elemento in posizione $(n+1)/2$ se n è dispari
- la media aritmetica tra gli elementi in posizione $n/2$ e $n/2 + 1$ se n è pari
#nota[
È robusta rispetto agli #link(<outlier>)[_outlier_] ma può essere calcolata solo su _campioni ordinabili_
]
=== Moda campionaria
È l'osservazione che compare con la *maggior frequenza*. Se più di un valore compare con la stessa frequenza allora tutti quei valori sono detti modali.
== Quantili
Il quantile di ordine $alpha$ (con $alpha$ un numero reale nell'intervallo $[0,1]$) è un valore $q_alpha$ che *divide* la popolazione in due parti, proporzionali in numero di elementi ad $alpha$ e (1-$alpha$) e caratterizzate da valori rispettivamente *minori* e *maggiori* di $q_alpha$.
/ Percentile: quantile descritto in percentuale
/ Decile: popolazione divisa in 10 parti con ugual numero di elementi
/ Quartile: popolazione divisa in 4 parti con ugual numero di elementi
#attenzione[
È richiesto un ordinamento totale nel campione
]
/ Range: distanza tra il punto minimo e il punto massimo
/ Range interquartile (IQR): distanza tra il primo e il terzo quartile
== Indici di dispersione
Sono indici che misurano quanto i valori del campione si _discostano_ da un _valore centrale_.
=== Scarto assoluto medio
Per ogni osservazione, lo *scarto* è la distanza dalla media: $x_i - overline(x)$.
La somma di tutti gli scarti farà sempre $0$:
$ sum_(i=1)^n x_i - overline(x) quad = quad sum_(i=1)^n x_i - sum_(i=1)^n overline(x) quad = quad n overline(x) - n overline(x) quad = 0 $
#informalmente[
Questo indice è ovviamente _inutile_, dato che vale sempre $0$, è utile per introdurre il concetto di _scarto_, ovvero la distanza di un'osservazione dalla media
]
=== Varianza campionaria
Misura di quanto i valori si _discostano_ dalla media campionaria
$ s^2 = 1/(n-1) sum_(i=1)^n (x_i - overline(x))^2 $
Metodo alternativo per calcolare la varianza:
$ s^2 = 1/(n-1) (sum_(i=1)^n x_i^2 - n overline(x)^2) $
#dimostrazione[
$ sum^n_(i=1) (mb(x_i) - mo(overline(x)))^2 &= sum_(i=1)^n (mb(x^2_i) - 2 mb(x_i) mo(overline(x)) + mo(overline(x)^2)) \
&= sum_(i=1)^n x_i^2 - mp(2 overline(x) underbrace(sum_(i=1)^n x_i, = n overline(x))) + mg(sum_(i=1)^n overline(x)^2) \
&= sum_(i=1)^n x_i^2 - mp(2 overline(x) dot n overline(x)) + mg(n overline(x)^2) \
&= sum_(i=1)^n x_i^2 - mp(cancel(2) n overline(x)^2) + mg(cancel(n overline(x)^2)) \
&= sum_(i=1)^n x_i^2 - n overline(x)^2 $
]
#informalmente[
Verrebbe intuitivo applicare il _valore assoluto_ ad ogni scarto medio, ma questo causa dei problemi. Per questo motivo la differenza viene elevata al _quadrato_, in modo da renderla sempre positiva
]
La varianza _non_ è un operatore lineare: la traslazione ($+ b$) non ha effetto mentre la scalatura ($dot a$) si comporta:
$ forall i space y_i = a x_i + b => s^2_y = a^2 s^2_x $
==== Correzione di Bessel <bessel>
Perchè si divide per $mr(n-1)$ e non $n$?
Introduciamo la formula della *varianza* (NON campionaria):
$ sigma^2 = 1/mr(n) sum_(i=1)^n (x_i - overline(x))^2 $
Se calcoliamo la _varianza_ di tutti i possibili _campioni_ di una popolazione e poi facciamo la media, *non* otteniamo la _varianza_ di tutta la _popolazione_. Questo invece avviene calcolando la varianza campionaria:
$ s^2 = sigma^2 n/(n-1) $
$ s^2 = 1/mr(n-1) sum_(i=1)^n (x_i - overline(x))^2 $
#informalmente[
Un campione è composto da un _minore_ numero di elementi rispetto all'intera popolazione, quindi la dispersione rispetto al valore medio è _inferiore_. Per questo motivo è necessario _correggere_ la varianza
]
==== Varianza campionaria standard (deviazione standard campionaria) <varianza-standard>
È possibile applicare alla varianza campionaria la radice quadrata, ottenendo la *varianza campionaria standard*. Questo è utile per portare la varianza nella stessa _unità di misura_ dei dati del campione
$ s = sqrt(s^2) $
#attenzione[
Applicando la radice quadrata solo dopo l'elevamento a potenza, non abbiamo reintrodotto il problema dei valori negativi: $sqrt(a^2) quad != quad (sqrt(a))^2 = a$
]
=== Coefficiente di variazione (deviazione standard relativa)
Valore *adimensionale*, utile per confrontare misure di fenomeni con _unità di misura differenti_.
$ s^* = s / (|overline(x)|) $
#nota[
Sia la #link(<varianza-standard>)[varianza campionaria standard] che la #link(<media>)[media campionaria] sono dimensionali, ovverro hanno unità di misura. Dividendoli tra loro otteniamo un valore adimensionale
]
=== Altri indici di dispersione
/ Intervallo di varianzione: differenza tra il _più grande_ e il _più piccolo_ valore del campione
/ Scarto interquartile: lunghezza dell'intervallo in cui è presente la _metà centrale dei dati_, ovvero la differenza tra il _25-esimo_ e il _75-esimo_ percentile
== Indici di correlazione
/ Campione bivariato: campione formato da coppie ${ (x_1, y_1), ..., (x_n, y_n) }$
/ Relazione/Correlazione: relazione tra due variabili tale che a ciascun valore della prima corrisponda un valore della seconda seguendo una certa regolarità
- *diretta*: a _piccoli_ valori di $x$ corrispondono _piccoli_ valori di $y$ e viceversa
- *indiretta*: a _piccoli_ valori di $x$ corrispondono _grandi_ valori di $y$ e viceversa
=== Covarianza campionaria <covarianza>
È un valore numerico che fornisce una misura di quanto le due variabili _varino assieme_.
Dato un campione bivariato definiamo la *covarianza campionaria* come:
$ "Cov"(x, y) = 1/(n-1)sum_(i=1)^n (x_i-overline(x))(y_i-overline(y)) $
#nota[
Si divide per $n-1$ per lo stesso motivo della _varianza_: la #link(<bessel>)[correzione di Bessel]
]
Metodo alternativo di calcolo:
$ "Cov"(x, y) = 1/(n-1)sum_(i=1)^n (x_i y_i - n overline(x y)) $
#dimostrazione[
- *diretta*: _piccoli con piccoli_ e _grandi con grandi_
$ (x_i <= overline(x) and y_i <= overline(y)) or (x_i > overline(x) and y_i > overline(y)) $
da cui:
- $ x_i - overline(x) <= 0 and y_i - overline(y) <= 0 quad => quad (x_i - overline(x))(y_i - overline(y)) >= 0 $
- $ x_i - overline(x) > 0 and y_i - overline(y) > 0 quad => quad (x_i - overline(x))(y_i - overline(y)) > 0 $
quindi in entrambi i casi: $ (x_i - overline(x))(y_i - overline(y)) >= 0 $
- *indiretta*: _piccoli con grandi_ e _grandi con piccoli_
$ (x_i <= overline(x) and y_i >= overline(y)) or (x_i > overline(x) and y_i < overline(y)) $
da cui:
- $ x_i - overline(x) <= 0 and y_i - overline(y) >= 0 quad => quad (x_i - overline(x))(y_i - overline(y)) <= 0 $
- $ x_i - overline(x) > 0 and y_i - overline(y) < 0 quad => quad (x_i - overline(x))(y_i - overline(y)) < 0 $
quindi in entrambi i casi: $ (x_i - overline(x))(y_i - overline(y)) <= 0 $
Quindi dal osservando _il segno_ è possibile capire la _relazione_ del campione.
]
- $"Cov"(x, y) > 0$ probabile correlazione diretta
- $"Cov"(x, y) tilde.eq 0$ correlazione improbabile
- $"Cov"(x, y) < 0$ probabile correlazione indiretta
#figure(caption: [Correlazione lineare _diretta_ (sinistra) e _indiretta_ (destra)],
[
#box(cetz.canvas({
import cetz: *
plot.plot(
size: (4,4),
x-tick-step: 2,
y-tick-step: 2,
axis-style: "school-book",
{
plot.add(((-5,-5), (5,5)), style: (stroke: 2pt + red))
plot.annotate(draw.circle((0, 0), fill: gray, radius: 0.2))
plot.annotate(draw.circle((0.37, 0.4), fill: gray, radius: 0.2))
plot.annotate(draw.circle((1, 1.2), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-1, -1.5), fill: gray, radius: 0.2))
plot.annotate(draw.circle((2, 2.4), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-2, -2.2), fill: gray, radius: 0.2))
plot.annotate(draw.circle((3, 3.6), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-3, -3.3), fill: gray, radius: 0.2))
plot.annotate(draw.circle((4, 4.8), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-4, -4.4), fill: gray, radius: 0.2))
plot.annotate(draw.circle((0.5, 0.6), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-0.8, -1.0), fill: gray, radius: 0.2))
plot.annotate(draw.circle((1.5, 1.3), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-1.7, -1.8), fill: gray, radius: 0.2))
plot.annotate(draw.circle((2.5, 2.7), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-2.6, -2.4), fill: gray, radius: 0.2))
plot.annotate(draw.circle((3.3, 3.9), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-3.5, -3.1), fill: gray, radius: 0.2))
plot.annotate(draw.circle((4.2, 4.6), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-4.3, -4.7), fill: gray, radius: 0.2))
})
}))
#box(cetz.canvas({
import cetz: *
plot.plot(
size: (4,4),
x-tick-step: 2,
y-tick-step: 2,
axis-style: "school-book",
{
plot.add(((-5,5), (5,-5)), style: (stroke: 2pt + red))
plot.annotate(draw.circle((0, 0), fill: gray, radius: 0.2))
plot.annotate(draw.circle((0.4, -0.5), fill: gray, radius: 0.2))
plot.annotate(draw.circle((1.2, -1.5), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-1.5, 1.8), fill: gray, radius: 0.2))
plot.annotate(draw.circle((2.3, -2.6), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-2.4, 2.2), fill: gray, radius: 0.2))
plot.annotate(draw.circle((3.6, -3.8), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-3.8, 3.5), fill: gray, radius: 0.2))
plot.annotate(draw.circle((4.7, -4.3), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-4.5, 4.2), fill: gray, radius: 0.2))
plot.annotate(draw.circle((0.2, -0.2), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-0.6, 0.7), fill: gray, radius: 0.2))
plot.annotate(draw.circle((1.3, -1.1), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-1.8, 2.0), fill: gray, radius: 0.2))
plot.annotate(draw.circle((2.7, -2.9), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-2.9, 2.6), fill: gray, radius: 0.2))
plot.annotate(draw.circle((3.8, -4.0), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-4.0, 3.7), fill: gray, radius: 0.2))
plot.annotate(draw.circle((4.3, -4.5), fill: gray, radius: 0.2))
plot.annotate(draw.circle((-4.7, 4.4), fill: gray, radius: 0.2))
})
}))
])
#nota[
Una relazione diretta/indiretta non è necessariamente _lineare_, può essere anche _logaritmica_ o seguire altre forme
]
=== Indice di correlazione di Pearson (indice di correlazione lineare) <correlazione-lineare>
Utilizziamo l'indice di correlazione di Pearson per avere un valore _adimensionale_ che esprime una correlazione. Possiamo definirlo anche come una _misura normalizzata_ della covarianza nell'intervallo $[-1, +1]$.
$ rho(x,y) = 1/(n-1)(limits(sum)_(i=1)^n (x_i-overline(x))(y_i-overline(y)))/(s_x s_y) $
Dove $s$ è la varianza campionaria standard.
- $rho tilde.eq +1$ probabile correlazione linearmente diretta
- $rho tilde.eq 0$ correlazione improbabile
- $rho tilde.eq -1$ probabile correlazione linearmente indiretta
#attenzione[
L'#link(<correlazione-lineare>)[indice di correlazione lineare] ($rho$) cattura *solo* relazioni dirette/indirette _lineari_ ed è insensibile alle trasformazioni lineari
]
#attenzione[
La #link(<covarianza>)[covarianza campionaria] o l'#link(<correlazione-lineare>)[indice di correlazione lineare] $tilde.eq 0$ non implicano l'indipendenza del campione, ma è vero il contrario:
$ "Cov"(x, y) tilde.eq 0 quad arrow.r.double.not quad "Indipendenza" $
$ rho(x, y) tilde.eq 0 quad arrow.r.double.not quad "Indipendenza" $
$ "Indipendenza" quad arrow.r.double quad rho(x, y) tilde.eq "Cov"(x, y) tilde.eq 0 $
]
Formula alternativa:
$ rho = (limits(sum)_(i=1)^n x_i y_i - n overline(x) overline(y)) / (sqrt((limits(sum)_(i=1)^n x_i^2 - n overline(x)^2) (limits(sum)_(i=1)^n y_i^2 - n overline(y)^2))) $
== Indici di eterogeneità <eterogeneita>
Non ha senso analizzare concentrazione o dispersione per dati #link(<quantitativi>)[qualitativi], ma possiamo analizzare l'eterogeneità:
/ Massima eterogeneità: il campione è composto da tutti elementi _diversi_
/ Minima eterogeneità: il campione contiene solo elementi _uguali_ (campione _omogeneo_)
=== Indice di Gini (per l'eterogeneità) <gini>
$ I = 1 - sum_(i=1)^n f_i^2 $
Dove $f_i$ è la #link(<frequenze>)[frequenza relativa] di $i$ ed $n$ è il numero di elementi distinti. Quindi $forall i, 0 <= f_i <= 1$. Prendiamo in considerazione i due estremi:
- eterogeneità _minima_ (solo un valore con frequenza relativa 1): $ I = 1 - 1 = 0 $
- eterogeneità _massima_ (tutti i valori hanno la stessa frequenza relativa $1/n$ dove $n$ è la dimensione del campione): $ I = quad 1 - sum_(i=1)^n (1/n)^2 quad = quad 1 - n/n^2 quad = quad (n-1)/n $
Generalizzando, $I$ non raggiungerà mai $1$: $ 0 <= I <= (n-1)/n < 1 $
Dal momento che l'indice di Gini tende a $1$ senza mai arrivarci ($n-1$ è sempre minore di $n$) introduciamo l'*indice di Gini normalizzato*, in modo da arrivare a $1$ nel caso di eterogeneità massima, con dominio $[0, 1]$: $ I' = n/(n-1)I $
=== Entropia <entropia>
$ H = quad sum_(i=1)^n f_i log(1/f_i) quad = quad - sum_(i=1)^n f_i log(f_i) $
Dove $f_i$ è la #link(<frequenze>)[frequenza relativa] e $n$ è il numero di elementi distinti.
L'entropia assume valori nel range $[0, log(n)]$ quindi utilizziamo l'*entropia normalizzata* per confrontare due misurazioni con diverso numero di elementi distinti $n$.
$ H' = 1/log(n) H $
#nota[
In base alla base del logaritmo utilizzata, l'entropia avrà unità di misura differente:
- $log_2$: bit
- $log_e$: nat
- $log_10$: hartley
]
#informalmente[
Intuitivamente sia l'#link(<gini>)[indice di Gini] che l'#link(<entropia>)[entropia] sono una _"media pesata"_ tra la frequenza relativa di ogni elemento ed un peso: la _frequenza stessa_ nel caso di Gini e il _logaritmo del reciproco_ nell'entropia. La frequenza relativa è già nel range $[0, 1]$, quindi non c'è bisogno di dividere per il numero di elementi
]
== Indici di concentrazione
Un indice di concentrazione misura in che modo un _bene_ è distribuito nella _popolazione_.
/ Distribuzione del bene: $a_1, a_2, ... a_n$ indica la quantità ordinata in modo *non decrescente*, del bene posseduta dall'individuo $i$
/ Media: $overline(a)$ indica la quantità media posseduta da un individuo
/ Totale: $"TOT" = n overline(a)$ indica il totale del bene posseduto
/ Caso sperequo: concentrazione _massima_, un individuo possiete tutta la quantità $ a_(1..n-1) = 0, quad a_n = n overline(a) $
/ Caso equo: concentrazione _minima_, tutti gli individui possiedono la stessa quantità $ a_(1..n) = overline(a) $
=== Curva di Lorentz <lorenz>
La curva di Lorenz è una rappresentazione *grafica* della _distribuzione_ di un bene nella popolazione.
Dati:
- $F_i = i/n$: posizione percentuale dell'i-esima nell'insieme
- $Q_i = 1/"TOT" limits(sum)_(k=1)^i a_k$: quantità di bene cumulata fino all'i-esima osservazione
La tupla $(F_i, Q_i)$ indica che il $100 dot F_i%$ degli individui detiene il $100 dot Q_i%$ della quantità totale.
Inoltre: $forall i, space 0 <= Q_i <= F_i <= 1$.
#informalmente[
Possiamo vedere $F_i$ come _"quanta"_ popolazione è stata analizzata fino all'osservazione $i$, espressa nel range $[0, 1]$.
$Q_i$ è invece una #link(<frequenze>)[_"frequenza cumulata"_] della ricchezza, fino all'osservazione $i$
]
#figure(caption: [Curva di Lorentz],
cetz.canvas({
import cetz: *
plot.plot(
name: "lorentz",
size: (4,4),
x-tick-step: 1,
y-tick-step: 1,
axis-style: "school-book",
{
plot.add(((0,0), (1,1)), line: "spline", style: (stroke: 2pt + green), label: "Minima")
plot.add(((0,0), (0.6, 0.2), (1,1)), line: "spline", style: (stroke: 2pt + orange), label: "Media")
plot.add(((0,0), (0.98,0)), line: "spline", style: (stroke: 2pt + red), label: "Massima")
plot.add-anchor("11", (1,1))
plot.add-anchor("10", (1,0))
})
draw.circle("lorentz.11", fill: red, stroke: none, radius: .1)
draw.circle("lorentz.10", fill: white, stroke: red, radius: .1)
})
)
=== Indice di Gini (per la concentrazione)
Dato che la #link(<lorenz>)[curva di Lorenz] _non assume mai_ alcun valore nella parte di piano superiore alla _bisettrice_, allora introduciamo l'*indice di Gini*, che trasforma la rappresentazione grafica in un _indice numerico_ che assume valori nel range $[0, 1]$.
Anche esso indica la _concetrazione_ di un bene nella popolazione.
$ G = (limits(sum)_(i=1)^(n-1) F_i - Q_i) / (limits(sum)_(i=1)^(n-1) F_i) $
#nota[
È possibile riscrivere il denominatore come:
$ sum_(i=1)^(n-1) F_i quad = quad 1/n sum_(i=1)^(n-1) i quad = quad 1/cancel(n) (cancel(n)(n-1))/2 quad = quad (n-1) / 2 $
]
Ottendendo come formula alternativa:
$ G = 2 / (n-1) sum_(i=1)^(n-1) F_i - Q_i $
#informalmente[
Facendo un parallelo con la #link(<lorenz>)[curva di Lorenz], possiamo vedere $F_i - Q_i$ come la distanza tra la bisettrice ($F_i$) e la ricchezza dell'osservazione $i$ ($Q_i$). La somma di queste distanze viene poi _"normalizzata"_, dividendo per $(n-1) / 2$
]
=== Analisi della varianza (ANOVA)
L'analisi della varianza (*ANOVA* - ANalysis Of VAriance) permette di analizzare un campione suddiviso in due o più _gruppi_ e capire se ci sono sostanziali differenze di un'attributo nei vari gruppi.
#informalmente[
Ad esempio, dato un campione di dati sulla _natalità_, si potrebbe analizzare formando gruppi per _regione_ o per _reddito_ e cercare l'influenza di questi fattori sulla natalità stessa
]
/ Numerosità dei gruppi: dato un campione diviso in $G$ gruppi, ognuno ha numerosità $n_1, ..., n_G$
/ Numerosità totale: numero totale delle osservazioni $n_1 + ... + n_G = n$
/ Osservazione: viene definita $x_i^g$ come l'$i$-esima osservazione del $g$-esimo gruppo
Possiamo calcolare alcuni indici e analizzarne i risultati:
/ Media campionaria di tutte le osservazioni: la media del campione $ overline(x) = 1/n sum_(g=1)^G sum_(i=1)^n_g x_i^g $
/ Media campionaria di un gruppo: la media dei valori del gruppo $ overline(x)_g = 1/n_g sum_(i=1)^n_g x_i^g $
/ Somme degli scarti:
- Somma *totale* degli scarti (tra _ogni elemento_ e la _media di tutto il campione_): $ "SS"_T = sum_(g=1)^G sum_(i=1)^n_g (x_i^g - overline(x))^2 $
- Somma degli scarti *entro/within* i gruppi (tra _ogni elemento_ e la _media del proprio gruppo_): $ "SS"_W = sum_(g=1)^G sum_(i=1)^n_g (x_i^g - overline(x)^g)^2 $
- Somma degli scarti *tra/between* i gruppi (tra la _media di ogni gruppo_ e _la media del campione_, "pesato" per la _numerosità_ del gruppo): $ "SS"_B = sum_(g=1)^G n_g (overline(x)^g - overline(x))^2 $
Vale la seguente regola: $"SS"_T = "SS"_W + "SS"_B$.
/ Varianza:
- *Total* (la varianza totale del campione): $ s_T^2 = ("SS"_T)/(n-1) $
- *Within* (la varianza di ogni elemento del gruppo): $ s_W^2 = ("SS"_W)/(n-G) $
- *Between* (la varianza tra ogni gruppo e il campione completo): $ s_B^2 = ("SS"_B)/(G-1) $
L'ipotesi alla base è che dati $G$ gruppi, sia possibile scomporre la varianza in due componenti: _Varianza interna ai gruppi_ (varianza *Within*) e _Varianza tra i gruppi_ (varianza *Between*).
#informalmente[
Analizzando diversi gruppi attraverso l'ANOVA, si possono raggiungere due conclusioni:
- i gruppi risultano significativamente *diversi* tra loro: la _varianza between_ $s_W^2$ contribuisce più significativamente alla varianza totale $s_T^2$ (il fenomeno è legato a caratteristiche proprie di ciascun gruppo)
- i gruppi risultano *omogenei*: la _varianza within_ $s_W^2$ contribuisce più significativamente alla varianza totale $s_T^2$ (il fenomeno è legato a caratteristiche proprie di tutti i gruppi)
]
== Alberi di decisione
Un albero di decisione è un *classificatore* (ovvero un processo che assegna una classe ad un oggetto) che sfrutta gli indici di #link(<eterogeneita>)[eterogeneità] per costruire la propria struttura efficacemente. Sono composti da:
- *nodi interni*: domanda sull'osservazione _(anche su più attributi)_ con risposta binaria
- *foglie*: classe a cui l'oggetto viene assegnato
Le domande vengono scelte e valutate in base all'_omogenetità_ dei _sottoinsiemi_ creati da essa, più i gruppi sono omogenei, _migliore_ è la domanda.
== Analisi dei classificatori
Dato un _classificatore binario_ che divide in due classi (positiva e negativa) e un _insieme di oggetti_ di cui è *nota* la classificazione, possiamo valutare la sua _bontà_ tramite il numero di casi classificati in modo _errato_. La classificazione errata può essere:
- *falso negativo*: oggetto _positivo_ classificato come _negativo_
- *falso positivo*: oggetto _negativo_ classificato come _positivo_
#nota[
Il peso di un falso positivo può *non* essere lo stesso di un falso negativo, si pensi al caso di una malattia contagiosa: un _falso negativo_ (ignaro della malattia) sarà molto più pericoloso di un _falso positivo_ (che verrà scoperto con ulteriori analisi)
]
Introduciamo la *matrice di confusione*, che riassume la bontà del classificatore:
#figure(caption: [Matrice di confusione])[
#table(
columns: 5,
inset: 10pt,
align: horizon,
table.cell(colspan: 2, rowspan: 2, stroke: none, []),
table.cell(colspan: 2, fill: silver, [*Valore effettivo*]),
table.cell(rowspan: 2, stroke: none, []),
[Positivo],
[Negativo],
table.cell(rowspan: 2, fill: silver, [*Predizione del classificatore*]),
[Positivo],
[Veri positivi (VP)],
[Falsi positivi (FP)],
[_Totali classificati positivi (TOT CP)_],
[Negativo],
[Falsi negativi (FN)],
[Veri negativi (VN)],
[_Totali classificati negativi (TOT CN)_],
table.cell(colspan: 2, stroke: none, []),
[_Totale positivi (TP)_],
[_Totale negativi (TN)_],
[_Totale casi (TOT casi)_],
)
]
/ Sensibilità: capacità del classificatore di predire bene i positivi $"VP"/"TP"$
/ Specificità: capacità del classificatore di predire bene i negativi $"VN"/"TN"$
È possibile valutare la *bontà* di un classificatore _graficamente_ attraverso il _punto_:
$ (1 - "Specifità", "Sensibilità") quad = quad (1 - "VN"/"TN", "VP"/"TP") quad = quad ("FP"/"TN", "VP"/"TP") $
=== Casi particolari
/ Classificatori costanti: associano indiscriminatamente gli oggetti ad una classe (positiva o negativa)
/ Classificatore positivo (CP): tutti i casi sono classificati come positivi
- _Sensibilità_: $1$, _Specificitià_: $0$, _Punto_ $(1,1)$ #box(circle(radius: 2.5pt, fill: green, stroke: 1pt + black))
/ Classificatore negativo (CN): tutti i casi sono classificati come negativi
- _Sensibilità_: $0$, _Specificitià_: $1$, _Punto_ $(0, 0)$ #box(circle(radius: 2.5pt, fill: red, stroke: 1pt + black))
/ Classificatore ideale (CI): tutti i casi sono classificati correttamente
- _Sensibilità_: $1$, _Specificitià_ $1$, _Punto_ $(0,1)$ #box(circle(radius: 2.5pt, fill: blue, stroke: 1pt + black))
/ Classificatore peggiore (CE): tutti i casi sono classificati erroneamente
- _Sensibilità_: $0$, _Specificitià_ $0$, _Punto_ $(1, 0)$ #box(circle(radius: 2.5pt, fill: gray, stroke: 1pt + black))
/ Classificatore casuale: ogni caso viene assegnato in modo casuale
- _Sensibilità_: $0.5$, _Specificitià_ $0.5$, _Punto_ $(1/2, 1/2)$ #box(circle(radius: 2.5pt, fill: yellow, stroke: 1pt + black))
#figure(caption: [Rappresentazione classificatori],
cetz.canvas({
import cetz: *
plot.plot(
name: "classificatori",
size: (4,4),
x-tick-step: 0.5,
y-tick-step: 0.5,
axis-style: "school-book",
{
plot.add(((0,0), (1,1)), style: (stroke: silver))
plot.add-anchor("00", (0,0))
plot.add-anchor("11", (1,1))
plot.add-anchor("01", (0,1))
plot.add-anchor("10", (1,0))
plot.add-anchor("55", (0.5,0.5))
})
draw.circle((0, 0), fill: red, radius: .1)
draw.circle((4, 4), fill: green, radius: .1)
draw.circle((0, 4), fill: blue, radius: .1)
draw.circle((4, 0), fill: gray, radius: .1)
draw.circle((2, 2), fill: yellow, radius: .1)
draw.content("classificatori.00", [*Negativo*], anchor: "south-west", padding: .2)
draw.content("classificatori.11", [*Positivo*], anchor: "west", padding: .2)
draw.content("classificatori.01", [*Ideale*], anchor: "west", padding: .2)
draw.content("classificatori.10", [*Peggiore*], anchor: "south", padding: .3)
draw.content("classificatori.55", [*Casuale*], anchor: "west", padding: .2)
}))
Un classificatore è tanto più efficace quanto più si avvicina al classificatore ideale.
#attenzione[
Il classificatore peggiore è, in realtà, un classificatore ideale: basta invertirlo
]
=== Classificatori a soglia (Curva ROC)
Un classificatore a soglia discrimina un caso in base ad una *soglia* stabilita a priori, in caso la misurazione sia _superiore_ alla soglia allora verrà classificato _positivamente_, altrimenti _negativamente_.
Per trovare il valore con cui _fissare_ la soglia, possiamo sfruttare questo metodo:
- definiamo $theta$ come una generica soglia, che ha intervallo $[theta_min, theta_max]$
- utilizzando $theta_min$ tutti i casi saranno positivi, ottenento un classificatore positivo #box(circle(radius: 2.5pt, fill: green, stroke: 1pt + black))
- utilizzando $theta_max$ tutti i casi saranno negativi, ottenento un classificatore negativo #box(circle(radius: 2.5pt, fill: red, stroke: 1pt + black))
- definiamo $D$ come una discretizzazione di questo intervallo continuo
Per ogni soglia $theta in D$ è possibile calcolare la _sensibilità_ e _specificità_. Questo classificatore viene quindi _rappresentato_ sul piano cartesiano attraverso il _punto_ $(1 - "Specifità", "Sensibilità")$.
Il risultato è una *curva*, detta *ROC* (Receiver Operator Carapteristic) #box(line(length: 10pt, stroke: 2pt + red), inset: (bottom: 3pt)), che ha sempre come estremi in $(0,0)$ (caso in cui viene usato $theta_max$) e $(1,1)$ (caso in cui viene usato $theta_min$).
Per misurare la _bontà_ del classificatore (in modo _indipendente_ dalla soglia scelta) viene misurata l'area di piano sotto la curva (*AUC* - Area Under the ROC Curve #box(rect(height: 7pt, width: 15pt, fill: rgb("#FFCDD2")))), più si avvicina a $1$, _migliore_ è il classificatore.
#figure(caption: [Curva ROC],
cetz.canvas({
import cetz: *
plot.plot(
name: "curvaroc",
size: (4,4),
x-tick-step: 0.5,
y-tick-step: 0.5,
axis-style: "school-book",
fill-below: true,
{
plot.add(((0,0), (1,1)), style: (stroke: silver))
plot.add(((0,0), (0.01, 0.05), (0.05, 0.3), (0.1, 0.5), (0.15, 0.6), (0.3, 0.8), (0.4, 0.85), (0.7, 0.92), (0.8, 0.94), (0.90, 0.97), (1,1)), style: (stroke: 2pt + red, fill: rgb("#FFCDD2")), fill: true, fill-type: "axis")
plot.add-anchor("00", (0,0))
plot.add-anchor("11", (1,1))
plot.add-anchor("01", (0,1))
plot.add-anchor("10", (1,0))
plot.add-anchor("55", (0.5,0.5))
})
draw.circle((0, 0), fill: red, radius: .1)
draw.circle((4, 4), fill: green, radius: .1)
draw.circle((0, 4), fill: blue, radius: .1)
draw.circle((4, 0), fill: gray, radius: .1)
draw.circle((2, 2), fill: yellow, radius: .1)
draw.content("curvaroc.00", [*Negativo*], anchor: "south-west", padding: .2)
draw.content("curvaroc.11", [*Positivo*], anchor: "west", padding: .2)
draw.content("curvaroc.01", [*Ideale*], anchor: "west", padding: .2)
draw.content("curvaroc.10", [*Peggiore*], anchor: "south", padding: .3)
draw.content("curvaroc.55", [*Casuale*], anchor: "west", padding: .2)
}))
#attenzione[
La curva è "spezzettata" dato che le soglie provate sono un _numero finito_, una discretizzazione dell'intervallo $[theta_min, theta_max]$
]
#informalmente[
Per trovare la _soglia migliore_, proviamo diversi valori della soglia $theta$, calcoliamo per ognuna il punto sul piano e teniamo la _migliore_.
I diversi tentativi disegnano la _curva ROC_, maggiore è l'_area sotto la curva AUC_, migliore è il _classificatore_ (indipendentemente dalla soglia scelta)
]
#nota[
Un _caso particolare _dei classificatori a soglia sono i *classificatori probabilistici*, dove la quantità assegnata agli oggetti (il valore con cui viene confrontata la soglia) è la _probabilità_ di appartenere ad una data _classe_
]
== Trasformazione dei dati
Dato un insieme di dati $X = {x_1, ..., x_n}$, trasformare significa trovare una funzione $g : X -> X'$ che trasforma $X$ in $Y = {x_1', ..., x_n'}$, dove $g(x_i) = x_i'$.
#attenzione[
La funzione $g$ che effettua la trasformazione *deve* essere *iniettiva*, altrimenti più dati distinti potrebbero essere mappati sullo stesso valore, causando una modifica alle frequenze
]
=== Trasformazioni lineari
Date due costanti $a, b in bb(R)$, allora $g(x) = a x + b$, da cui possiamo derivare:
/ Cambiamento di origine (traslazione):
- per $k>0$, viene traslata a sinistra con $x -> x - k$ e a destra con $x -> x + k$
- _media_, _mediana_ e _quantili_ vengono traslati della stessa quantità
- _range_, _distanza interquartile_, _varianza_, _deviazione standard_ rimangono invariati
/ Cambiamento di scala (dilatazione o concentrazione):
- per $h in bb(R)^+$, applichiamo $x -> x/h$:
- se $h > 1$ allora è una concentrazione
- se $h < 1$ allora è una dilatazione
- se $h < x_min$ allora $forall x_i > 1$
- se $h > x_max$ allora $forall x_i < 1$
- _media_, _mediana_, _quantili_, _range_, _distanza interquartile_ e _deviazione standard_ vengono scalati della stessa quantità $1/h$
- _varianza_ viene scalata di $1/(h^2)$
/ Cambiamento di origine e scala: se i nostri valori sono nel _range_ $(a,b)$ e li vogliamo nell'_intervallo_ $(c, d)$ allora possiamo:
$ x -> c + (d-c)/(b-a) (x-a) $
/ Standardizzazione: caso particolare del cambiamento di origine e scala: si scala rispetto alla _deviazione standard_ e si trasla a sinistra rispetto alla _media_, in modo da ottenere un insieme di _media_ $0$ e _deviazione_ $1$:
$ x -> (x - overline(x))/(sigma_x) $
#figure(caption: "Effetti delle trasformazioni sugli indici")[
#table(
columns: 4,
inset: 10pt,
align: horizon,
table.cell(colspan: 2, fill: silver, [*Indice*]),
table.cell(fill: silver, [$g(x) = x + k$]),
table.cell(fill: silver, [$g(x) = h x$]),
[Media], [$overline(x)$], [$overline(x) + k$], [$h overline(x)$],
[Mediana], [$m_x$], [$m_x + k$], [$h m_x$],
[Moda], [$M_x$], [$M_x + k$], [$h M_x$],
[Quantile], [$q_x$], [$q_x + k$], [$h q_x$],
[Varianza], [$s^2_x$], [$s^2_x$], [$h^2 s^2_x$],
[Dev. std.], [$s_x$], [$s_x$], [$|h| s_x$],
[Range], [$r_x$], [$r_x$], [$h r_x$],
[IQR], [$"IQR"_x$], [$"IQR"_x$], [$h "IQR"_x$],
)
]
=== Trasformazioni logaritmiche
Quando i valori di un campione sono molto grandi oppure molto distanti è possibile trasformali in maniera logaritmica: $x -> log x$
#nota[
Può risultare utile anche perchè eventuali prodotti/quozienti diventano somme/sottrazioni tra i rispettivi logaritmi
]
== Grafici
=== Diagramma a barre
Rappresenta graficamente la _tabella delle frequenze_, è opportuno utilizzarlo in caso di *attributi qualitativi non ordinati*.
L'uso delle _frequenze relative_ permette di confrontare situazioni in cui il numero di osservazioni è variabile, quindi ha senso sovrapporre grafici di campioni diversi.
Si utilizza per gli indici (asse delle x) con attributo qualitativo ma non ordinato.
```python
publisher_order = ['Hanna-Barbera', 'ABC Studios', 'Dark Horse Comics',
'Image Comics', 'Marvel Comics', 'DC Comics',
'George Lucas', 'Rebellion',
'Star Trek', 'Universal Studios']
publisher_rel_freq.loc[publisher_order,:].plot.bar(legend=False)
plt.show()
```
#nota[
- Se utilizzo plot.bar su value.counts ottengo un ordinamento non crescente sulle frequenze
- Se utilizzo plot.bar sul dataframe ottengo un ordinamento in base ai valori e una legenda dell'asse delle ascisse (che si puo togliere con legend=False)
]
=== Aerogramma (grafico a torta)
Grafico alternativo per le frequenze dei valori qualitativi
```python
gender_freq.plot.pie(y='Abs. frequence', colors=['pink', 'blue'])
plt.show()
```
=== Istogramma
Per rappresentare graficamente le tabelle delle frequenze di dati quantitativi, usiamo ancora ``` plot.bar```
Tuttavia è molto probabile che il risultato non sia ottimale in quanto le barre hanno uno spessore che puo suggerire un interpretazione fuorviante secondo cui le frequenze non facciano riferimento ad un anno ma a un intervallo.
```python
first_app_freq = heroes_with_year['First appearance'].value_counts()
plt.bar(first_app_freq.index, first_app_freq.values)
plt.show()
```
Si utilizza in questi casi un grafico a bastoncini in cui ogni punto è evidenziato da un segmento verticale che lo congiunge con l'asse delle ascisse. Lo si genera con ``` plt.vlines(listaIndici, yiniziale, listaValori)```.
Eventualmente si puo sovrapporre con un ``` plt.plot``` che rappresenta un cerchio.
```python
plt.vlines(first_app_freq.index, 0, first_app_freq.values)
plt.show()
```
Ulteriore problema che ricorre spesso nei dati quantitativi sono i numerosi valori distinti per un valore piccolissimo (ad esempio tra 81.01 e 81).
Risulta piu sensato calcolare le frequenze di intervalli di possibili valori, aggregando quindi i valori ma non sarebbe corretto perché daremmo l'impressione che un certo valore ha una frequenza alta.
Alcuni insiemi hanno troppi valori distinti per poter usare il metodo del grafico poligonale/a barre. Suddividiamo i valori in gruppi/classi e poi rappresentiamo con un grafico il numero di valori dei dati appartenenti a ciascuna classe.
Come scegliere li numero di classi:
- Se troppo poche classi perdo molte informazioni sui valori effettivi
- Se troppe classi ottengo frequenze troppo basse per ottenere delle informazioni dal grafico
Di solito si scelgono tra le 5 e le 10 classi. È prassi scegliere classi della stessa lunghezza.
I valori al bordo di una classe di chiamano estremi della classe.
Convenzione di inclusione a sinistra: classe include il suo estremo sinistro ma non quello destro.
Utilizziamo quindi un istogramma, generabile con ``` .hist()```.