Sunteți pe pagina 1din 369

Capitolul 1

Introducere în Analiza Datelor în contextul Data Science


- Aspecte teoretice generale privind Analiza Datelor -

Prof. Dr. Stelian STANCU


1.1. Statistica

1.1.1. Definirea Statisticii

Statistica reprezintă o colecție de procedee matematice care să răspundă la cerințe


de:
- organizare a datelor;
- analiză a datelor;
- interpretare a datelor.
În analiza datelor sunt utilizate trei metode statistice principale:
- statistica descriptivă;
- statistica inferențială;
- analiza de regresie.

1.1.2. Caracterizarea Statisticii

A. Statistica descriptivă rezumă datele și se concentrează, de obicei, pe:


- distribuția datelor;
- tendința centrală a datelor;
- dispersia datelor.
Distribuția datelor poate fi o distribuție:
- normală;
- binomială;
- etc
Tendința centrală este de a descrie datele cu privire la centrarea lor. Tendința
centrală poate fi:
- media;
- mediana;
- modul.
Dispersia datelor descrie răspândirea datelor, putând fi privită ca:
- varianță;
- abatere standard;
- intervale interquartile.
A. Statistica inferențială testează relația dintre două seturi de date sau două probe
și, de obicei, este stabilită o ipoteză pentru relațiile statistice dintre ele.
Ipoteza poate fi:
- o ipoteză nulă
sau
Capitolul 1. Introducere în Analiza Datelor 10

- o ipoteză alternativă
iar respingerea ipotezei nule se face folosind teste precum Testul t, Chi Square Test
și ANOVA.
Observaţie: Testul Chi Square este mai mult pentru variabilele categoriale, iar
testul t este mai mult pentru variabilele continue. Testul ANOVA este destinat
aplicațiilor complexe.
Analiza de regresie este utilizată pentru a identifica relațiile dintre două sau mai
multe variabile.
Regresiile pot fi
- regresii liniare
sau
- regresii neliniare.
Vizualizarea datelor este tehnica folosită pentru a comunica sau prezenta date
folosind
- grafice;
- diagrame;
- tablouri de bord.

1.2. Știința datelor (Data Science)

1.2.1. Definirea științei datelor

Data Science este un domeniu multidisciplinar care include


- statistica;
- informatica;
- învățarea automată-Machine Learning;
- expertiza în domeniu;
pentru a obține cunoștințe și informații din date deja existente.
Data Science a devenit o sintagmă cheie și este folosită acum pentru a reprezenta
multe domenii precum:
- analiza datelor (Data Analytics);
- extragerea de date (Data Mining);
- extragerea de text (Text Mining);
- vizualizări de date (Data Visualizations);
- modelarea predicțiilor (Prediction Modelling);
- etc.

1.2.2. Caracterizarea științei datelor (Data Science)

Diagramă a Data Science:

 
Capitolul 1. Introducere în Analiza Datelor 11

Teoria ce Domeniul
stă la baza analizat/expertizat
Cercetarea
domeniulu statistică
i
li t Data
Science

Matematica Informatica

Machine Procesarea
Analiza de
Learning datelor
condiționalitat
e

Figura 1.1. Diagrama Data Science, în context interdisciplinar și intercauzal

1.3. Analiza datelor (Data Mining)

1.3.1. Definirea analizei datelor (Data Mining)

Analiza datelor (Data Mining)


- este strâns legată de Data Science;
- este de obicei folosită pentru a extrage pattern-uri (tipare) din datele
numerice;
- reprezintă procesul de identificare a modelelor din date folosind
o statistici;
o învățarea automată (Machine Learning);
o depozite de date (Data Warehouses);
o baze de date (Databases).

 
Capitolul 1. Introducere în Analiza Datelor 12

Stabilire obiectiv/subobiective

Înțelegerea conceptului de
afacere analizată

Cunoașterea datelor necesare


analizei

Pregătirea datelor
- eliminarea outlieri-lor;
- completarea valorilor lipsă;
- normalizarea datelor;
- standardizarea datelor;
- centrarea datelor etc

Modelarea

Evaluarea rezultatelor
posibile

Implementarea practică

Rezultate efective și comparare


cu cele estimate
 
Capitolul 1. Introducere în Analiza Datelor 13

Figura 1.2. Diagrama Data Mining inter-industrie (CRISP-DM –


Cross-industry standard process for data mining)

1.4. Analiza de text (Text Mining)

- este folosită pentru a extrage pattern-urile din date textuale (de tip text)
precum
o Twitter;
o postări pe blog;
o feedback-uri primite;
o etc.
- este cunoscută și sub denumirea de Data Mining Text.
- sarcinile de extragere a textului pot consta în
o clasificarea textului;
o gruparea (clusterizarea) textului;
o extragerea de entității;
o analitica textului (Text Analitycs) poate include
 analiza sentimentelor (Sentiments Analysis)
 marcare parțială a vorbirii;
 recunoașterea entității de nume;
 analiza legăturilor text.

Culegerea și pregătirea datelor


- eliminarea outlieri-lor;
- completarea valorilor lipsă;
- normalizarea datelor;
- standardizarea datelor;
- centrarea datelor etc

Preprocesarea textului
(transformarea acestuia)

Învățare
Modelarea supervizată
propriu-zisă
(se cunosc valorile
- descoperirea modelelor;
- extragerea celordesemnificative;
variabilelor ieșire)
- organizarea cunoștințelor.

Validarea modelului

 
Capitolul 1. Introducere în Analiza Datelor 14

Evaluarea rezultatelor
Posibile/a performanțelor

Implementarea
practică/realizare aplicații

Rezultate efective și comparare


cu cele estimate

Figura 1.3. Diagrama procesului de analiză a textului

1.5. Prelucrarea limbajului natural (NLP - Natural Language


Processing)

- este o arie de învățare automată și informatică (Computer Science)


utilizată pentru a ajuta computerul în procesarea și înțelegerea
limbajului natural.
- poate include
o etichetarea parțială a vorbirii;
o analiza, identificarea purtătorului;
o recunoașterea entității numelui;
o recunoașterea optică a caracterelor;
o analiza de sentiment;
o recunoașterea vorbirii;
o etc.
NLP lucrează îndeaproape cu Text Analitycs și Text Mining.

1.6. Tipuri de analiză/Analitycs

poate fi clasificată în:


- analitica descriptivă (Descriptive Analitycs): utilizează analitice de
date (Data Analitycs) pentru a ști ce s-a întâmplat;
- analitica predictivă (Predictive Analitycs): utilizează învățarea
statistică și învățarea automată pentru a prezice viitorul.

 
Capitolul 1. Introducere în Analiza Datelor 15

- analitica prescriptivă (Prescriptive Analitycs): utilizează algoritmi de


simulare pentru a ști ce trebuie făcut.
Observație: Niciunul dintre aceste tipuri analitice nu este mai bun decât celelalte,
dar ele pot fi combinate, pentru a da rezultate mai bune.

1.7. Big Data

- sunt seturi de date foarte mari și complexe, raportat la puterea de


prelucrare a unui computer
- există trei proprietăți sau caracteristici ale datelor mari și anume:
o volumul de date;
o viteza datelor;
o varietatea datelor.

1.8. Necesitatea și rolul Analizei Datelor

- este necesară o complexă și riguroasă analiză cantitativă a fenomenelor


și proceselor care fac obiectul cercetării.
- mulțimile de date conțin atât aspecte semnificative, cât și aspecte
nesemnificative ale manifestării fenomenelor.
- metodele și tehnicile de analiză a datelor sunt utilizate obținerea unor
reprezentări simplificate ale informațiilor de mare complexitate.
- rolul analizei datelor este de a prelucra și filtra informațiile conținute în
datele supuse studiului într-o formă de reprezentare inteligibilă,
sugestivă, simplificată și sintetizatoare.

1.9. Măsurarea și cuantificarea în domeniul economico-social

- măsurarea presupune totalitatea activităților de atribuire a unor valori


numerice pentru caracteristicile fenomenului analizat.

Unitățile de măsură

Parțialitatea informațiilor

Erorile

Erorile cu caracter sistematic

- reprezintă diferența dintre valoarea adevărată a unei mărimi la nivel de


populație și valoarea obținută pentru această mărime în urma măsurării
tuturor unităților elementare ale populației.

Erorile cu caracter accidental, aleator

 
Capitolul 1. Introducere în Analiza Datelor 16

- reprezintă diferența dintre valoarea unei mărimi calculate pe baza


unităților aparținând unui eșantion și valoarea aceleiași mărimi calculată
pe baza tuturor unităților populației.
Sursele erorilor cu caracter accidental(întâmplător) țin de:
- imperfecțiunile instrumentelor de măsurare;
- deficiențe în înregistrarea valorilor caracteristicilor urmărite;
- efectuarea inexactă a unor calcule;
- etc.

1.10. Definirea Analizei Datelor

- reprezintă
o o succesiune de operații de prelucrare și interpretare
o operații efectuate asupra unor informații primare referitoare la
fenomene și procese din realitatea economico-socială
o bazate pe o mare varietate de metode și tehnici specifice
o în scopul
 adâncirii cunoașterii comportamentului acestor
fenomene și procese
 formulării unor concluzii cu privire la specificitatea
manifestării lor.
Activități:
• formularea ipotezelor cu privire la comportamentul fenomenului ce
constituie obiectul studiului;
• organizarea experimentelor necesare măsurării caracteristicilor
fenomenului studiat;
• culegerea datelor privind comportamentul fenomenului;
• analiza și interpretarea datelor disponibile;
• formularea concluziilor, efectuarea predicțiilor și luarea deciziilor.
Un ciclu de utilizare a Data mining, presupune parcurgerea a patru etape:

- identificarea oportunităţii de afaceri şi a datelor pe baza cărora se va face


explorarea;
- extragerea de informaţii din bazele de date existente;
- luarea de decizii şi efectuarea de acţiuni, pe baza informaţiilor obţinute;
- măsurarea rezultatelor obţinute.

 
Capitolul 1. Introducere în Analiza Datelor 17

Data
mining

Oportunitate Decizie şi
de afaceri acţiune

Evaluare
rezultate

Figura 1.4. Utilizarea Data mining în oportunităţile de afaceri

1.11. Clasificarea metodelor de Analiză a Datelor

Metode de analiză a dependenței - pot fi clasificate în funcție de mai multe


criterii:

numărul de variabile dependente: o singură variabilă dependentă sau mai
multe variabile dependente;
• numărul de variabile independente: o singură variabilă independentă sau
mai multe variabile independente;
• tipul scalei pe care sunt măsurate variabilele dependente: scală non-
metrică sau scală metrică;
• tipul scalei pe care sunt măsurate variabilele independente: scală non-
metrică sau scală metrică;
Metodele de analiză a dependenței pot fi clasificate în funcție de numărul de
variabile dependente și de numărul de variabile independente în două grupe:
• metode unidimensionale de analiză a dependenței;
• metode multidimensionale de analiză a dependenței.

 
Capitolul 1. Introducere în Analiza Datelor 18

Clasificarea metodelor de analiză a dependenț ei

Num ar Num ar variabile dependente


variabile
independente O variabil a Mai multe variabile

Scala non-metrica Scala metrica Scala non-metrica Scala metrica

Scal a non- • Analiza discrimi- • testul t • Analiza multigrup a • Analiza multidi-


metric a nantului discriminantului mensionala a variantei
O variabila (discreta) (discreta) (MANOVA)

Scal a • Analiza • Regresie • Analiza multigrup a • Analiza corelatiilor


metric a discriminantului simpla discriminantului canonice
• Regresie logistica

Scal a non- • Analiza discrimi- • Analiza • Analiza multigrup a • Analiza multidi-


Mai metric a nantului ANOVA discriminantului mensionaa| a variantei
multe (discreta) (discret|) (MANOVA)
variabile • Analiza simultan|
(MONANOVA)
Scal a •Analiza • Regresie • Analiza multigrup a • Analiza corelatiilor
metric a discriminantului multipla discriminantului canonice
• Regresie logistica

Tabelul 1.1.

Metode de analiză a interdependenței

Analiza interdependenței are ca scop


- să identifice și să evidențieze situațiile în care variabilele sunt corelate între
ele
- să explice modul în care are loc corelarea variabilelor supuse analizei.
În funcție de numărul de variabile analizate, avem:
- metode de analiză a interdependenței dintre două variabile;
- metode de analiză a interdependenței dintre mai multe variabile.
În cadrul metodelor de analiză a interdependenței dintre două variabile
putem menționa:
- analiza corelației simple;
- analiza bazată pe tabele de contingență;
- etc.
Dintre metodele de analiză a interdependenței dintre mai multe variabile
putem menționa:
- analiza componentelor principale;
- analiza factorială;
- analiza corespondențelor;
- analiza cluster;
- etc.

 
Capitolul 1. Introducere în Analiza Datelor 19

Clasificarea metodelor de analiză a interdependențelor

Num ar Tipul scalei


variabile
Scal a non-metric a Scala metrica

Dou a variabile • Tabele de contingenta • Analiza corelatiei simple


(bidimensionale)
• Modele log-liniare

Mai multe • Analiza corespondentelor • Analiza componentelor


variabile • Modele log-liniare principale
• Tabele de contingenta • Analiza factoriala
(multidimensionale)

Tabelul 1.2.

 
Capitol suplimentar
Introducere în mediul R

Prof. dr. Stelian STANCU


1. Instalarea pachetelor din mediul R

1.1. Instalarea pachetului R


www.r-project.org/

Figura 1. Site-ul pachetului R


https://cran.ma.imperial.ac.uk/

Figura 2.
2 Analiza Datelor în mediul R - teorie şi aplicaţii

Figura 3.1. Descărcarea bazei de date R, pentru diferite opțiuni


de sistem de operare

Figura 3.2. Descărcarea bazei de date R, pentru diferite opțiuni


de sistem de operare
Capitol suplimentar Introducere în mediul R 3

Figura 3.3. Descărcarea bazei de date R, pentru diferite opțiuni


de sistem de operare

Figura 4. Interfața RGui

Mai departe se pot scrie linii de cod R specifice, în funcție de problema


supusă spre rezolvare.
Odată ce se începe lucrul cu R, se poate vedea solicitarea din Figura 4:
>
Aceasta înseamnă că R așteaptă o comandă.

 
4 Analiza Datelor în mediul R - teorie şi aplicaţii

Observație: Nu se tastează >. Acest indicator este folosit doar pentru a indica
unde se pot introduce comenzile.
Pentru a părăsi R, se poate utiliza comanda
> q()
și se apasă apoi Enter.

1.2. Pachete R necesare

Multe dintre funcțiile R scrise se bazează parțial pe alte pachete R


disponibile la adresa: https://cran.r-project.org/web/packages/, putându-se face
căutarea:
- atât după data de publicare a pachetului respectiv, la adresa de site:
https://cran.r-project.org/web/packages/available_packages_by_date.
html
- cât și după numele pachetului respectiv, la adresa de site: https://cran.r-
project.org/web/packages/available_packages_by_name.html
Atunci când apare o eroare la rularea unui pachet, întrucât sunt
necesare pachete ajutătoare, pentru a face download la toate pachetele
ajutătoare lipsă, se execută comanda R2:
- install.packages("nume pachet", dependencies = TRUE)
Toate aceste pachete pot fi instalate cu comanda install.packages
(presupunând bineînțeles că există conectrea la web).

2. Citirea/Importul datelor în mediul R)

2.1 Citirea datelor elementare în R

Pentru a începe cu cel mai simplu caz, se presupune că se dorește stocarea


valorii 7 într-o variabilă R numită data. Acest lucru se poate face cu ajutorul
comenzii:
data <- 7
Se tastează data și apoi se apasă Enter. Astfel, se va obține valoarea 7
pe ecranul computerului.
data
[1] 7
O caracteristică importantă a mediului R este că o colecție de valori poate
fi stocată într-o singură variabilă R. Un mod de a face acest lucru este cu comanda
c() din R, care înseamnă combinare de valori. De exemplu, valorile 1, 2, 3, 4, 5
pot fi stocate în blocul variabilei data din R, cu comanda:
data <- c(1,2,3,4,5)
data
[1] 1 2 3 4 5

2
Similar, se poate folosi și Package ‘install.load’ https://cran.r-project.org/
web/packages/install.load/install.load.pdf
Capitol suplimentar Introducere în mediul R 5

Observații: 1. Pentru tipărirea valorilor se poate folosi și comanda:


print(data)
iar dacă se dorește doar vizualizarea lor, se poate folosi comanda:
View(data)
2. Prima valoare, 1, este stocată în data[1], unde [1] semnifică a
câta componentă din listă se dorește a fi printată și așa mai departe.
Pentru a determina câte valori sunt stocate într-o variabilă R (lungimea
variabilei respective), se utilizează comanda R:
length(data)
[1] 5

2.2. Utilizarea read.table() pentru a citi/importa în R date stocate


într-un fișier

Comanda read.table() din R este o altă metodă folosită frecvent


pentru citirea datelor în R, fiind concepută pentru a citi coloane de date în care
fiecare coloană conține valorile unei variabile.
După salvarea setului de date în Excel, se va seta directorul de lucru în R.
Pentru aceasta, se impune mai întâi aflarea locației unde este setat directorul de
lucru, astfel:
getwd()
[1] "C:/Users/Stelian/Documents"
Pentru a schimba calea care este returnată, astfel încât să fie inclus folderul
în care este stocat setul de date, se procedează astfel:
setwd("C")
Error in setwd("C"): cannot change working directory
Observații: 1. Dacă este permis acest lucru, prin executarea acestei comenzi, R
știe acum exact în ce folder se lucrează.
2. Dacă nu este permis acest lucru (ca în mesajul redat anterior),
atunci trebuie dus fișierul ce se dorește a fi prelucra în directorul
de lucru acceptat.
La pasul următor, se încarcă foile de de calcul și fișierele în R, astfel:
- după salvarea setului. de date în Excel, se poate trece la importul real al
fișierului în R;
- acest lucru se poate realiza în două moduri:
 fie prin comenzi de bază R;
 fie prin pachete de bază R.
Următoarele comenzi fac parte din pachetul util R, care este unul dintre
pachetele de bază, ce sunt încorporate și care conține o colecție de funcții utile.
Observație: Se poate constata că aceste funcții de bază se concentrează mai
degrabă pe introducerea foilor de calcul Excel în R, decât a fișierelor Excel în sine.
read.table()
- în forma generală:
read.table(file, header = FALSE, sep = "",na.strings =
"NA",skip=0)

 
6 Analiza Datelor în mediul R - teorie şi aplicaţii

unde file indică numele fișierului în care sunt stocate datele, iar celelalte
argumente au formele specifice menționate. Se poate observa că primul argument,
file, nu conține semnul egal. Aceasta înseamnă că trebuie specificată o valoare
pentru acest argument. Cu un semn egal, argumentul este implicit la valoarea
afișată.
Deci, pentru read.table(), header este un argument opțional, ce va fi
considerat implicit ca header = FALSE, dacă nu este specificat în mod explicit.
- folosirea fișierului de forma txt sau *.txt
După cum este deja cunoscut, Excel oferă multe opțiuni pentru salvarea
seturilor de date, una dintre acestea fiind prin nume fișier delimitat de txt sau *
.txt.
Dacă datele sunt salvate ca atare, se poate utiliza una dintre cele mai ușoare
și generale opțiuni pentru a importa fișierul în R, adică: funcția read.table(),
astfel:
data <- read.table("Book3.txt", header = TRUE)
str(data)
Exemplul 1. Se presupune un fișier numit productia.txt ce conține 10 firme
(liniile din tabel) și trei caracteristici (factori de producție – coloanele: 2-4) și
anume: munca-capital-pamant din combinația cărora se obține producție
(productie - coloana 5):
Nr firma munca capital pamant productie
(1) (2) (3) (4) (5)
1
80 20 8 400
2
100 10 12 600
3
60 30 12 300
4
20 15 9 200
5
40 18 15 460
6
110 14 12 600
7
70 24 10 500
8
90 29 20 570
9
120 19 18 800
10
40 31 14 200
Tabelul 1. Datele aplicației

În acest cadru, comanda R:


productia <- read.table("productia.txt", skip = 1)
va citi datele în variabila productia din R, în care argumentul skip = 1
indică faptul că trebuie ignorată prima linie a fișierului de date, care conține în
acest caz cele 4 etichete: munca, capital, pamant și productie.
La fel ca în cazul comenzii scan, se poate indica fișierul care trebuie citit,
folosind comanda file.choose, adică folosind comanda:
productia <- read.table(file.choose(), skip = 1)
Capitol suplimentar Introducere în mediul R 7

Tastând productia și apăsând Enter se va obține:


V1 V2 V3 V4
1 80 20 8 400
2 100 10 12 600
3 60 30 12 300
4 20 15 9 200
5 40 18 15 460
6 110 14 12 600
7 70 24 10 500
8 90 29 20 570
9 120 19 18 800
10 40 31 14 200
Deci, coloanelor de date au numele V1, V2 și V3, după cum este indicat în
tabelul anterior.
Tastând comanda R
productia$V1
și apăsând Enter, veți avea afișată prima coloană de date, și anume munca:
[1] 80 100 60 20 40 110 70 90 120 40
Observație: Comanda
productia[,1]
va îndeplini același obiectiv.
Într-o manieră similară, productia[,2] conține datele din a doua
coloană, productia[,3] conține datele din a treia coloană, respectiv
productia[,4] conține datele din a patra coloană.
În schimb, comanda productia[1,] conține datele din primul rând/
linie și așa mai departe.
De asemenea, comanda productia[1,1] va returna valoarea 80 și așa
mai departe.
Luând în considerare comenzile:
productia <- read.table ("productia.txt", header = TRUE)
print(productia)
se obține:
munca capital pamant productie
1 80 20 8 400
2 100 10 12 600
3 60 30 12 300
………………………
Argumentul header = TRUE indică faptul că prima linie din fișier conține
etichete pentru coloanele de date, care pentru datele referitoare la productia
sunt munca, capital, pamant și productie.
Aplicând comanda:
productia$munca
R va returna prima coloană de date, adică:
[1] 80 100 60 20 40 110 70 90 120 40
Comanda R:
labels(productia)
returnează etichetele asociate unei variabile R. Pentru situația existentă, R
returnează:
[[1]]
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"

 
8 Analiza Datelor în mediul R - teorie şi aplicaţii

[[2]]
[1] "munca" "capital" "pamant" "productie"
Comanda R:
head(productia)
returnează primele șase linii ale datelor stocate:
munca capital pamant productie
1 80 20 8 400
2 100 10 12 600
3 60 30 12 300
4 20 15 9 200
5 40 18 15 460
6 110 14 12 600
în timp ce comanda:
tail(productia)
returnează ultimele șase linii ale datelor stocate:
munca capital pamant productie
5 40 18 15 460
6 110 14 12 600
7 70 24 10 500
8 90 29 20 570
9 120 19 18 800
10 40 31 14 200
Comanda R:
str(productia)
returnează informații despre numărul de observații, numărul de variabile și listează
unele dintre valorile stocate în productia. (indică, de asemenea, modul de
stocare a datelor):
'data.frame': 10 obs. of 4 variables:
$ munca : int 80 100 60 20 40 110 70 90 120 40
$ capital : int 20 10 30 15 18 14 24 29 19 31
$ pamant : int 8 12 12 9 15 12 10 20 18 14
$ productie: int 400 600 300 200 460 600 500 570 800 200
Așa cum a fost cazul comenzii, read.table ce presupune că valorile
stocate într-un fișier de date sunt separate de unul sau mai multe spații, se poate
presupune cazul în care valorile sunt separate de un simbol, să presupunem ; . Din
nou, acest lucru poate fi tratat prin intermediul argumentului sep.
În acest caz, comanda R ar putea fi următoarea:
productia <- read.table ("productia.txt", sep = ";", header =
TRUE)
munca capital pamant productie
1 80 20 8 400
2 100 10 12 300
3 60 30 12 300
4 20 15 9 200
5 40 18 15 460
6 110 14 12 600
7 70 24 10 500
8 90 29 20 570
9 120 19 18 800
10 40 31 14 200
Acum presupunem că unele dintre valorile din fișierul productia
lipsesc și că lipsa valorilor este indicate de M și nu de NA. Argumentul
Capitol suplimentar Introducere în mediul R 9

na.strings poate fi utilizat pentru a indica faptul că valorile lipsă sunt stocate
ca M. În acest caz, datele vor fi citite folosind comanda R:
productia <- read.table("productia.txt", na.strings = "M",
header = TRUE)
munca capital pamant productie
1 80 20 8 400
2 100 10 12 600
3 60 30 12 300
…………………
9 120 19 18 800
10 40 31 14 200

2.3. Citirea/Importul3 fișierelor Excel în R

2.3.1. Copierea datelor din Excel și citirea/importul acestora în R

Pentru aceasta, se deschide fișierul Excel care conține datele: se selectează


și se copiază datele (CTRL+C)
Pentru a importa în R datele copiate anterior, se tastează următorul cod R și
se stochează datele într-un cadru de date (data):
data <- read.table(file = "clipboard", sep = "\t",
header=TRUE)
str(data)
'data.frame': 75 obs. of 6 variables:
$ calories: int 70 120 70 50 110 110 130 90 90 120 ...
$ protein : int 4 3 4 4 2 2 3 2 3 1 ...
$ fat : int 1 5 1 0 2 0 2 1 0 2 ...
$ sodium : int 130 15 260 140 180 125 210 200 210 220 ...
$ fiber : num 10 2 9 14 1.5 1 2 4 5 0 ...
$ rating : num 68.4 34 59.4 93.7 29.5 ...
print(data)
calories protein fat sodium fiber rating
1 70 4 1 130 10.0 68.40297
2 120 3 5 15 2.0 33.98368
3 70 4 1 260 9.0 59.42551
4 50 4 0 140 14.0 93.70491
5 110 2 2 180 1.5 29.50954
……………
71 110 2 1 250 0.0 39.10617
72 110 1 1 140 0.0 27.75330
73 100 3 1 230 3.0 49.78744
74 100 3 1 200 3.0 51.59219
75 110 2 1 200 1.0 36.18756

2.3.2. Citirea/Importul fișierelor Excel în R, utilizând pachetul readxl

Pachetul readxl poate fi utilizat pentru a importa cu ușurință fișiere


Excel (xls|xlsx) în R fără dependențe externe.
Instalarea și încărcarea pachetului readxl:

3
Pentru detalii a se vedea http://www.sthda.com/english/wiki/reading-data-from-excel-
files-xls-xlsx-into-r.

 
10 Analiza Datelor în mediul R - teorie şi aplicaţii

Instalare
install.packages("readxl")
Încărcare
library("readxl")
Utilizarea pachetului readxl
Pachetul readxl vine cu funcția read_excel() pentru a citi fișierele
xls și xlsx.
- Citirea fișierelor xls și xlsx:
# Loading
library("readxl")
# xls files
data <- read_excel("Book1.xls")
# xlsx files
data <- read_excel("Book1.xlsx")
print(data)
# A tibble: 75 x 6
calories protein fat sodium fiber rating
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 70 4 1 130 10 68.4
2 120 3 5 15 2 34.0
3 70 4 1 260 9 59.4
4 50 4 0 140 14 93.7
5 110 2 2 180 1.5 29.5
# ... with 70 more rows
Observație: Codul R anterior, presupune că fișierele "Book1.xls" și "
Book1.xlsx" se află în directorul de lucru curent. Pentru a cunoaște directorul
de lucru curent, se tastează funcția getwd() la consola R.
De asemenea, este posibilă alegerea în mod interactiv a unui fișier,
folosind pentru aceasta funcția file.choose(), care se recomandă, pentru cei
începători în programarea R:
data <- read_excel(file.choose())
Observație: Dacă se utilizează codul R anterior în RStudio, se va cere alegerea
unui fișier.
- Specificarea sheet-ului cu un număr sau un nume
# Specify sheet by its name
data <- read_excel("Book1.xlsx", sheet = "Sheet1")
# A tibble: 75 x 6
calories protein fat sodium fiber rating
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 70 4 1 130 10 68.4
2 120 3 5 15 2 34.0
3 70 4 1 260 9 59.4
……………………………………………
9 90 3 0 210 5 53.3
10 120 1 2 220 0 18.0
# ... with 70 more rows
# Specify sheet by its index
data <- read_excel("Book1.xlsx", sheet = 1)
# A tibble: 75 x 6
calories protein fat sodium fiber rating
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 70 4 1 130 10 68.4
2 120 3 5 15 2 34.0
Capitol suplimentar Introducere în mediul R 11

3 70 4 1 260 9 59.4
……………………………………………………….
9 90 3 0 210 5 53.3
10 120 1 2 220 0 18.0
# ... with 70 more rows

- În cazul valorilor lipsă: Dacă NA-urile sunt reprezentate prin altceva


decât NA (care nu este disponibil), spre exemplu: „-”, atunci se va seta
argumentul na = "---":
data <- read_excel("Book1.xlsx", na = "---")
# A tibble: 75 x 6
calories protein fat sodium fiber rating
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 70 4 1 130 10 68.4
2 120 3 5 15 2 34.0
3 70 4 1 260 9 59.4
……………………………….
9 90 3 0 210 5 53.3
10 120 1 2 220 0 18.0
# ... with 70 more rows

2.3.3. Citirea/Importul fișierelor Excel în R, utilizând pachetul xlsx

Pentru aceasta, se poate utiliza sintaxa:


data <- read.xlsx(file="data.xlsx", 1)
unde:
file - este locația fișierului Excel;
1 - se referă la foaia(sheet-ul) numărul 1.
Pachetul xlsx, ca o soluție bazată pe java, este unul dintre pachetele
R puternice pentru citirea, scrierea și formatarea fișierelor Excel.
Instalarea și încărcarea pachetului xlsx:
Instalare
install.packages("xlsx")
Încărcare
library("xlsx")
Utilizarea pachetului xlsx
Există două funcții principale în pachetul xlsx pentru citirea fișierelor
xls și xlsx Excel: read.xlsx() și read.xlsx2()(în fișierele mari se
recomandă funcția read.xlsx).
Formatele simplificate sunt:
read.xlsx(file, sheetIndex, header=TRUE)
read.xlsx2(file, sheetIndex, header=TRUE)
unde:
file - indică calea fișierului;
sheetIndex - reprezintă indexul foii de citit;
header - reprezintă o valoare logică. Dacă este TRUE, atunci primul rând este
folosit ca nume de coloană.
Exemplu de utilizare:
library("xlsx")

 
12 Analiza Datelor în mediul R - teorie şi aplicaţii

# read first sheet


data <- read.xlsx(file.choose(), 1)

Scrierea unui fișier Excel

Pentru a scrie un fișier Excel, se poate utiliza funcția write.xlsx():


write.xlsx (data, file = "data2.xlsx", sheetName = "sheet1",
nume col. = TRUE, row.names = FALSE)

2.4. Utilizarea4 read.csv() și read.csv2() pentru a citi/importa date


în R

Pentru aceasta, se poate utiliza sintaxa:


data <- read.csv(file="data.csv", header=TRUE, sep=",")
write.csv(data,file="data2.csv",quote=TRUE,na="na",row.names=
FALSE)
Unul dintre cele mai simple și mai fiabile moduri de a obține date în R este
acela de a folosi fișiere text, în special fișiere csv (valori separate de virgulă).
Formatul de fișier csv folosește virgulă pentru a separa diferitele elemente dintr-o
linie și fiecare linie de date se află în propria poziție din fișierul text, ceea ce face
ca fișierele csv să fie ideale pentru reprezentarea datelor de tip tabel.
Avantajul suplimentar al fișierelor csv este că aproape orice aplicație de
date acceptă exportul de date în formatul csv.
Funcțiile read.csv() și read.csv2() sunt frecvent utilizate pentru
a salva seturi de date în Excel de format .csv sau valori separate de virgulă.
Așa cum s-a descris anterior, read.csv() și read.csv2() au un alt
simbol separator: pentru prima, acesta este virgula, în timp ce a doua folosește
punct și virgulă.
Observații: 1. Pentru a afla ce simbol se folosește în fișierul de lucru .csv, acesta
se deschide într-un editor de text, cum ar fi TextEdit sau Notepad.
2. Nu uitați că ambele funcții au antetul și argumentele de completare
setate ca TRUE în mod implicit.
Pentru a citi fișiere de tip .csv care folosesc virgula ca simbol separator,
se poate utiliza funcția read.csv(), astfel:
# Read in the data
df <- https://”calea fișierului”.csv", header = TRUE,
quote="\"", stringsAsFactors= TRUE,
strip.white = TRUE)
# Print out `df`
print(df)
În următoarele exemple, se presupune un fișier de tip .csv stocat într-un
folder convenabil din sistemul de fișiere. Pentru a converti o foaie de calcul Excel

4
Comenzile read.csv() și read.csv2(), se utilizează după același principiu ca și
comanda read.table
Capitol suplimentar Introducere în mediul R 13

în format .csv, trebuie ales File→Save As, ceea ce oferă opțiunea de a salva
fișierul într-o varietate de formate.
Este de reținut faptul că un fișier .csv poate reprezenta doar o singură
foaie de lucru a unei foi de calcul complexe. În cele din urmă, se impune asigurarea
că se utilizează rândul de sus al foii de lucru (rândul 1) pentru titlurile coloanelor.
În R, se poate utiliza funcția read.csv() pentru a importa date în
format csv. Această funcție are o serie de argumente, dar singurul argument
esențial este file, care specifică locația și numele fișierului.
Spre exemplu, pentru a citi un fișier numit divorce situat în C: se poate
folosi read.csv() cu file.path, astfel:
data <- read.csv(file.path("C:","divorce.csv"))
str(data)
După cum se poate vedea, acest exemplu conține 170 observații la nivel de
variabilă.
Este de reținut faptul că opțiunea implicită este de a converti șirurile de
caractere în factori. Această opțiune implicită de conversie a șirurilor în factori
atunci când se utilizează read.table() poate fi o sursă de confuzie.
De multe ori este mai bine a se importa date care conțin șiruri, în așa fel
încât șirurile să nu fie convertite, ci să rămână vectori de caractere.
Ca urmare, pentru a importa date care conțin șiruri, se recomandă a utiliza
argumentul stringsAsFactors = FALSE pentru read.csv() sau
read.table(), astfel:
data <- read.csv(file.path("C:","Book2.csv, stringsAsFactors
= FALSE"))
str(data)
Observații: 1. Dacă fișierul existent este în format Uniunea Europeană, unde
virgula este utilizată ca separator zecimal, iar punctul ca separator de câmp, atunci
se impune importarea fișierului în R, utilizând funcția read.csv2().
2. O altă problemă comună este citirea în R a datelor care sunt stocate într-
un alt pachet software, cum ar fi SPSS sau EXCEL, spre exemplu. Cea mai ușoară
modalitate de a trata acest aspect este de a stoca mai întâi datele într-un fișier .csv
(SPSS, EXCEL și alte programe software populare au o comandă pentru
îndeplinirea acestui obiectiv). Odată ce acest lucru este realizat, datele pot fi citite
în R folosind comanda read.csv, care este utilizată în același mod ca și
comanda read.table.
Totodată, R poate importa datele într-un cadru de date (dataframe), așa
cum vom putea vedea în continuare.

3. Lucrul cu dataframe în R

În toată această secțiune5 se va face referire la datele din Exemplul 1.


5
Pentru alte exemple similar, va puteți inspira în spectrul de date și de la:
https://dornsife.usc.edu/labs/rwilcox/datasets/

 
14 Analiza Datelor în mediul R - teorie şi aplicaţii

3.1. Selecția de părți din dataframe


Comanda R:
names(productia)
[1] "munca" "capital" "pamant" "productie"
va returna variabilele folosite, iar comenzile:
attach(productia)
productia
munca capital pamant productie
1 80 20 8 400
2 100 10 12 600
3 60 30 12 300
………………………….
9 120 19 18 800
10 40 31 14 200
vor returna, așa cum se poate constata, tabelul cu datele inițiale, cu variațiile pe
care le considerăm evidente:
productia[,2:4]
capital pamant productie
1 20 8 400
2 10 12 600
3 30 12 300
……………………………..
9 19 18 800
10 31 14 200
productia[2:4,]
munca capital pamant productie
2 100 10 12 600
3 60 30 12 300
4 20 15 9 200
Adesea este util a fi selectate anumite rânduri, pe baza testelor logice
pentru valorile uneia sau mai multor variabile. În continuare, va fi prezentat codul
pentru a selecta doar acele rânduri pentru care capital>20 și respectiv
pamant<15, folosind „virgula apoi blank” pentru a specifica toate coloanele,
astfel:
productia[ capital>20 & pamant<15, ]
munca capital pamant productie
3 60 30 12 300
7 70 24 10 500
10 40 31 14 200

3.2. Sortarea datelor în R

Se pot sorta rândurile sau coloanele cadrului de date în orice mod se


dorește, dar de obicei se vrea a se vedea toate coloanele și să fie sortate pe baza
valorilor din una sau mai multe dintre coloanele din dataframe. În mod implicit,
în R, obiectele (linii sau coloane) sunt sortate în ordine crescătoare (adică în
ordinea alfabetică a datelor de tip caractere și respectiv în ordinea crescătoare a
datelor numerice). Cel mai simplu mod de a sorta este acela de a folosi numele
variabilei.
Capitol suplimentar Introducere în mediul R 15

Pentru exemplificare, vom presupune că dorim să sortăm întregul


dataframe după caracteristica/variabila capital:
productia[order(capital), ]
munca capital pamant productie
2 100 10 12 600
6 110 14 12 600
4 20 15 9 200
5 40 18 15 460
9 120 19 18 800
1 80 20 8 400
7 70 24 10 500
8 90 29 20 570
3 60 30 12 300
10 40 31 14 200
Punctul cheie de reținut este faptul că sintagma order(capital) este
înainte de virgulă și există un blank după virgulă (ceea ce înseamnă că se dorește
ca toate coloanele să se găsească în noul dataframe).
Observație: Numerele de rând originare apar în stânga cadrului de date și după
sortare.
Dacă spre exemplu, se dorește ca în ieșire să apară doar coloanele 2 și 4,
atunci avem:
productia[order(capital), c(2,4)]
capital productie
2 10 600
6 14 600
4 15 200
5 18 460
9 19 800
1 20 400
7 24 500
8 29 570
3 30 300
10 31 200
Pentru a sorta în R obiectele (linii sau coloane) în ordine descrescătoare, se
poate folosi funcția rev, adică:
productia[rev(order(productia[,2])), c(2,4)]
capital productie
10 31 200
3 30 300
8 29 570
7 24 500
1 20 400
9 19 800
5 18 460
4 15 200
6 14 600
2 10 600
care sortează în ordine descrescătoare în funcție de capital, având ca ieșire doar
capital și productie (din c(2,4)). Acest lucru înseamnă că se poate specifica
variabila de sortare fie după nume (așa cum s-a procedat în cazul anterior), fie după
numărul de coloană (așa cum s-a procedat cu variabila capital în cazul de față,
specificând numărul specific, adică al coloanei 2).

 
16 Analiza Datelor în mediul R - teorie şi aplicaţii

Eliminarea duplicatelor

Se pot elimina duplicatele, ca spre exemplu, pe baza variabilei munca, din


fișierul productia_1 folosind comanda R:
productia_1[!duplicated(productia_1$munca), ]
munca capital pamant productie tip_firma
1 80 20 8 400 privata
2 100 10 12 600 de_stat
3 60 30 12 300 mixta
4 20 15 9 200 mixta
5 40 18 15 460 privata
6 110 14 12 600 privata
7 70 24 10 500 de_stat
8 90 29 20 570 mixta
9 120 19 18 800 privata
se constată că pe coloana munca, valoarea 40 a rămas scrisă o singură dată.

3.3. Rezumarea (summary, with, aggregate) conținutului


fișierelor de date

Obiectul (fișierul), ca să luăm unul dintre ele, numit productia are acum
toate atributele unui dataframe. Ca urmare, el poate fi rezumat folosind
summary, astfel:
summary(productia)
munca capital pamant productie
Min. : 20.0 Min. :10.00 Min. : 8.00 Min. :200.0
1st Qu.: 45.0 1st Qu.:15.75 1st Qu.:10.50 1st Qu.:325.0
Median : 75.0 Median :19.50 Median :12.00 Median :480.0
Mean : 73.0 Mean :21.00 Mean :13.00 Mean :463.0
3rd Qu.: 97.5 3rd Qu.:27.75 3rd Qu.:14.75 3rd Qu.:592.5
Max. :120.0 Max. :31.00 Max. :20.00 Max. :800.0
Se constată astfel că, valorile variabilelor continue sunt rezumate pe șase
rubrici: una parametrică (media aritmetică) și cinci neparametrice (maxim, minim,
mediana, a 25-a percentilă sau prima cuartilă și respectiv a 75-a percentilă sau a
treia cuartilă). De menționat este și faptul că nivelurile variabilelor categoriale sunt
luate în considerare6.

Rezumarea (summary, with, aggregate) pentru variabile explicative

Funcția ce trebuie folosită pentru rezumarea informațiilor cantitative din


dataframe se numește aggregate. De multe ori se dorește rezumarea
valorilor variabilelor continue din cadrul dataframe, dar și pentru una sau mai
multe dintre variabilele categoriale.

6
Pentru detalii, a se vedea: Crawley, M.J., 2015, Statistics: An Introduction Using R (2nd
Edition) John Wiley & Sons, Chichester, ISBN 978-1-118-94109-6. 339 pp. USD 45.00
(P). http://www.imperial.ac.uk/bio/research/crawley/statistics/
Capitol suplimentar Introducere în mediul R 17

De exemplu, dacă se dorește cunoaștrea producția medie de la firme


diferite, pentru o singură variabilă de răspuns, cum ar fi pamant, atunci se pot
utiliza tapply și with astfel:
- mai întâi se încarcă în R fișierul productia_1:
productia_1 <- read.table ("productia_1.txt", header =
TRUE)
print(productia_1)
munca capital pamant productie tip_firma
1 80 20 8 400 privata
2 100 10 12 600 de_stat
3 60 30 12 300 mixta
4 20 15 9 200 mixta
5 40 18 15 460 privata
6 110 14 12 600 privata
7 70 24 10 500 de_stat
8 90 29 20 570 mixta
9 120 19 18 800 privata
10 40 31 14 200 privata
summary(productia_1)
munca capital pamant productie tip_firma
Min. : 20.0 Min. :10.00 Min. : 8.00 Min. :200.0 de_stat:2
1st Qu.: 45.0 1st Qu.:15.75 1st Qu.:10.50 1st Qu.:325.0 mixta :3
Median : 75.0 Median :19.50 Median :12.00 Median :480.0 privata:5
Mean : 73.0 Mean :21.00 Mean :13.00 Mean :463.0
3rd Qu.: 97.5 3rd Qu.:27.75 3rd Qu.:14.75 3rd Qu.:592.5
Max. :120.0 Max. :31.00 Max. :20.00 Max. :800.0
- după care se apelează comanda R corespunzătoare:
with(productia_1,tapply(pamant,tip_firma, mean))
de_stat mixta privata
11.00000 13.66667 13.40000
with(productia_1,tapply(munca,tip_firma, mean))
de_stat mixta privata
85.00000 56.66667 78.00000
Cu toate acestea, în stadiile incipiente ale analizei, deseori se dorește
cunoașterea valorilor medii ale tuturor variabilelor continue rezumate în același
timp, caz în care se poate folosi aggregate.
Pentru aceasta, se notează numerele de coloană care conțin variabilele
pentru care se dorește calculul valorilor medii (adică coloanele care conțin numere
reale). Acestea sunt munca (coloana 1), capital (coloana 2), pamant (coloana
3) și productie (coloana 4). Pentru a obține valorile medii clasificate în funcție
de proprietate pe tip_firma avem codul R:
aggregate(productia_1[,c(1,2,3,4)],list(tip_firma),mean)
ceea ce face ca toate valorile medii să fie tipărite. Virgula existentă în [ ] în partea
stângă, lângă productia_1, semnifică faptul că, coloana care conține tip_firma
este intitulată Group.1. Aceasta este valoarea implicită folosită de aggregate.
Ca urmare, în coloană, tipurile de firme după forma de proprietate apar în
ordine alfabetică. Pentru a obține coloana respectivă cu numele, spre exemplu
proprietate în loc de Group.1, se modifică comanda R astfel:
aggregate(productia_1[,c(1,2,3,4)],list(Community=tip_firma),
mean)

 
18 Analiza Datelor în mediul R - teorie şi aplicaţii

Astfel, se pot face mai multe clasificări folosind două sau mai multe
variabile explicative categoriale, sintaxa generică a comenzii R fiind:
aggregate(productia_1[,c(1,2,3,4)],list(Nume_Grup2 =
“denumire variabilă categorială”, Community=tip_firma),mean)
unde Nume_Grup2 = “denumire variabilă categorială” s-ar fi folosit
dacă în exemplul analizat ar fi existat cel puțin o a doua variabilă categorială, pe
lângă tip_firma.

4. Cunoașterea datelor în R

Odată ce datele au fost introduse, tentația este a se trece direct la analiza


statistică, ceea ce este total greșit, întrucât:
- există șanse foarte mari ca datele să conțină greșeli;
- dacă nu se știe cum arată datele, atunci nu se va ști nici ce model să fie
selectat pentru a se potrivi cu datele (de exemplu, o linie dreaptă sau o linie
curbă) sau dacă sunt îndeplinite ipotezele modelului (de exemplu,
constanța varianței și normalitatea erorilor).
Ca urmare:
- în primul rând, trebuie să se reprezinte grafic variabila de răspuns (aceasta
se numește diagramă index - index plot). Acesta va arăta dacă există
în date erori evidente și dacă există tendințe sau cicluri în valorile de
răspuns, așa cum apar în dataframe.
Reamintim comanda R:
productia_1 <- read.table ("productia_1.txt", header = TRUE)
attach(productia_1)
head(productia_1)
munca capital pamant productie tip_firma
1 80 20 8 400 privata
2 100 10 12 600 de_stat
3 60 30 12 300 mixta
4 20 15 9 200 mixta
5 40 18 15 460 privata
6 110 14 12 600 privata

5. Operații7 cu numere și vectori în R

5.1. Principalele comenzi pentru accesarea datelor, în lucrul cu un vector

În continuare vor fi prezentate câteva comenzi de bază pentru accesarea


datelor, atunci când se lucrează cu un vector.
Principalele comenzi pentru accesarea datelor, în lucrul cu un vector dat, să
presupunem în continuare vectorul coloană capital din fișierul productia_1,
sunt:
capital[3] - se accesează al patrulea element din coloana capital;

7
Wilcox, R.R., (2016), Understanding and Applying Basic Statistical Methods Using R,
Wiley, ISBN-13: 9781119061397, ISBN-10: 1119061393.
Capitol suplimentar Introducere în mediul R 19

[1] 30
capital[c(1,3,5)] - se accesează primul, al treilea și al cincelea element din
vectorul coloană capital;
[1] 20 30 18
capital[c(-1,-3,-5)] - se accesează toate elementele vectorul coloană
capital, cu excepția elementelor de pe pozițiile 1, 3 și 5;
[1] 10 15 14 24 29 19 31
Următoarele metode utilizează variabile logice care pot fi de ajutor în
manipularea datelor:
capital[capital > 20] - se accesează toate elementele din coloana capital
ce au o valoare mai mare de 20;
[1] 30 24 29 31
capital[capital >= 20] - se accesează toate elementele din coloana
capital având o valoare mai mare sau egală cu 20;
[1] 20 30 24 29 31
capital[capital >= 20 | capital < 19] - se accesează toate elementele
din coloana capital având o valoare mai mare de 20 sau mai mică decât 19;
[1] 20 10 30 15 18 14 24 29 31
capital[abs(capital)> 20 & capital <29] - se accesează toate
elementele din coloana capital care au o valoare mai mare de 20 și o valoare mai
mică de 29;
[1] 24
capital[!is.na(capital)] - se accesează toate elementele din coloana
capital care nu lipsesc;
[1] 20 10 30 15 18 14 24 29 19 31
mean(capital[!is.na (capital)]) - reprezintă o modalitate de a elimina
orice valori lipsă și de a calcula media datelor rămase;
sau o formă echivalentă:
[1] 21
mean(capital, na.rm = TRUE)
[1] 21
which(capital==min(capital)) - indică ce poziție din coloana capital
conține cea mai mică valoare.
[1] 2

5.2. Operații bazate pe funcții R

Majoritatea comenzilor R constau dintr-un nume al unei funcții urmată de


unul sau mai multe argumente incluse în paranteze. Există sute de funcții R, câteva
fiind prezentate în continuare:
abs - valoarea absolută;
exp - exponențiala;
log - logaritm natural;
sqrt - rădăcină pătrată;
cor - corelație;
mean - media aritmetică;

 
20 Analiza Datelor în mediul R - teorie şi aplicaţii

median - mediana;
min - cea mai mică valoare;
max - cea mai mare valoare;
range - determină valorile minimă și maximă;
sd - abaterea standard;
sum - suma aritmetică;
var - varianța/dispersia;
cov - covarianța;
length - indică câte valori sunt stocate într-o variabilă R.
Exemplul 3. Pe baza datelor din Exemplul 2, cu forma extinsă dată de adăugarea
variabilei tip_firma și prezentate în fișierul productia_1 se vor calcula
indicatorii, pe baza funcțiilor prezentate anterior:
productia_1 <- read.table ("productia_1.txt", header = TRUE)
attach(productia_1)
abs(munca)
[1] 80 100 60 20 40 110 70 90 120 40
arâtând că valoarea absolută la nivelul variabilei munca este 120;
exp(munca)
[1] 5.540622e+34 2.688117e+43 1.142007e+26 4.851652e+08 2.353853e+17
[6] 5.920972e+47 2.515439e+30 1.220403e+39 1.304181e+52 2.353853e+17
evidențiind exponențiala fiecărei valori a variabilei munca;
sqrt(munca)
[1] 8.944272 10.000000 7.745967 4.472136 6.324555 10.488088 8.366600
[8] 9.486833 10.954451 6.324555
evidențiind rădăcina pătrată a fiecărei valori a variabilei munca;
cor(munca,capital)
[1] -0.2596955
evidențiind coeficientul de corelație dintre variabilele munca și capital;
mean(munca)
[1] 73
evidențiind media la nivelul variabilei munca;
median(munca)
[1] 75
evidențiind mediana la nivelul variabilei munca;
range(munca)
[1] 20 120
evidențiind valoarea minimă și respectiv maximă la nivelul variabilei munca;
sd(munca)
[1] 33.01515
evidențiind abaterea standard la nivelul variabilei munca;
sum(munca)
[1] 730
evidențiind suma valorilor la nivelul variabilei munca;
var(munca)
[1] 1090
evidențiind varianța/dispersia la nivelul variabilei munca;
cov(munca, capital)
[1] -62.22222
Capitol suplimentar Introducere în mediul R 21

evidențiind mediana la nivelul variabilei munca;


length(munca)
evidențiind numărul de valori la nivelul variabilei munca;
[1] 10
Pentru variații pe această temă, în continuare se vor prezenta câteva spețe
diverse. Interpretarea rezultatelor are valențe similare exemplului anterior și
rămâne în sarcina cititorului.
Exemplul 4. Pe baza datelor din Exemplul 2, cu forma extinsă dată de adăugarea
variabilei tip_firma și prezentate în fișierul productia_1 se vor efectua
următoarele calcule:
- calculul mediei valorilor de pe coloana 3, liniile de la 2 la 5, din fișierul
(obiectul) productia_1:
mean(productia_1[2:5, 3])
[1] 12
evidențiind mediana la nivelul variabilei munca;
- calculul mediei valorilor de pe coloana 3, liniile de la 2 la 5 (formă
echivalentă de calcul), din fișierul (obiectul) productia_1:
id = c (2,3,4,5)
mean(productia_1[id, 3])
[1] 12
- semnalarea ca TRUE sau FALSE a pozițiilor din coloana 3, a fișierului
productia_1, care au valoarea mai mică decât 10, respectiv mai mare:
flag= productia_1[,3]<10
print(flag)
[1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
- calculul mediei valorilor de pe pozițiile TRUE de la calculul anterior:
mean(productia_1[flag,3])
[1] 8.5
- calculul similar al mediei valorilor de pe pozițiile FALSE:
mean(productia_1[!flag,3])
[1] 14.125
- semnalarea pozițiilor din coloana 3, a fișierului productia_1, care au
valoarea mai mică decât 10:
flag= which(productia_1[,3]<10)
print(flag)
[1] 1 4
- calculul mediei valorilor de pe coloana 3, din fișierul productia_1, mai
puțin liniile 1, 2 și 3:
mean(productia_1[c(-1,-2,-3),3])
[1] 14
- fie comanda R:
b = c (1, 2, 3, NA, 5)
Deci, a patra valoare, stocată în b[4], lipsește. Comanda R
is.na (b)
returnează:
[1] FALSE FALSE FALSE TRUE FALSE
unde FALSE înseamnă că valoarea corespunzătoare nu lipsește și TRUE înseamnă că
lipsește, adică vom avea comanda:

 
22 Analiza Datelor în mediul R - teorie şi aplicaţii

flag =! is.na (b)


[1] TRUE TRUE TRUE FALSE TRUE
indică ce valori nu lipsesc.
O modalitate și mai simplă de eliminare a pozițiilor valorilor lipsă stocate
în b este dată de comanda R:
b = b[!is.na(b)]
[1] 1 2 3 5

5.3. Convertirea8 unui vector într-un dataframe

În continuare, se va pleca de la datele din Exemplul 2, cu forma extinsă


dată de adăugarea variabilei tip_firma și prezentate în fișierul productia_1
și se vor calcula indicatorii, pe baza funcțiilor prezentate anterior:
productia_1 <- read.table ("productia_1.txt", header = TRUE)
attach(productia_1)
The following objects are masked from productia_1 (pos = 3):
capital, munca, pamant, productie, tip_firma
Vom presupune în continuare, că avem separați vectorii munca și
capital, dați astfel:
munca <- c(80,100,60,20,40,110,70,90,120,40)
capital <- c(20,10,30,15,18,14,24,29,19,31)
Până acum, am lucrat cu vectori precum munca, capital etc. În analiza
datelor efective, de obicei se lucrează cu un set de date care are pe linii observațiile
și pe coloane variabilele.
În R, de asemenea, așa cum s-a constatat, se lucrează cu acest tip de cadru
de date, numit dataframe. Un dataframe în R este adesea afișat sub formă de
matrice, care este un cadru de date bidimensional format din linii și coloane.
Fiecare coloană sau variabilă a unui dataframe trebuie să fie cu același
tip de date (caracter, numeric, logic), dar coloane/variabile diferite pot fi cu tipuri
de date diferite.
Pentru a transforma în R un vector într-un dataframe, se aplică funcția
data.frame() vectorului respectiv. Spre exemplu, aplicând data.frame()
vectorului munca, îl va transforma pe acesta într-un dataframe, ce va fi
denumit în mod arbitrar.
Codul R este următorul:
productia_1$munca <- data.frame(munca)
productia_1$munca
munca
1 80
2 100
3 60
…………………
9 120
10 40
productia_1$capital <- data.frame(capital)

8
A se vedea și Quan L.I., (2018), Using R for Data Analysis in Social Sciences, A Research
Project-Oriented Approach, Oxford University Press.
Capitol suplimentar Introducere în mediul R 23

productia_1$capital
capital
1 20
2 10
3 30
……………………
9 19
10 31
Reamintim că un dataframe este un cadru de date bidimensional cu un
număr dat de coloane și un număr dat de linii (fiecare coloană corespunde unei
variabile/caracteristici și conține linie corespunzătoare fiecărei observații, adică
vorbim de matricea informațională), la fel ca un set de date tipic, cu liniile care
indică observațiile și coloanele care indică variabilele.
Prin urmare, se poate gândi productia_1$munca ca un set de date
care conține o variabilă numită munca cu cele zece observații corespunzătoare.
Similar se poate face și pentru variabila capital.
De asemenea, se pot combina doi vectori, spre exemplu, cei anteriori
munca și capital într-un dataframe unic, aplicând funcția data.frame().
Combinând munca și capital, noul dataframe este format din două
variabile, munca și capita, fiecare cu câte zece observații. Codul R este
următorul:
productia_1 <- data.frame(munca, capital)
productia_1
munca capital
1 80 20
2 100 10
3 60 30
……………………………..
9 120 19
10 40 31
Observație: Reamintim că pentru a ne referi la o variabilă din dataframe-ul
productia_1, R folosește semnul $ pentru a conecta un dataframe și o
variabilă în dataframe. Prin urmare, productia_1$munca se referă la
variabila munca în productia_1, iar productia_1capital se referă la
variabila capital în producția_1.

5.4. Formatarea rezultatelor într-un tabel dataframe, utilizând pachetul


stargazer

O parte importantă a prezentării rezultatelor cercetării este formatarea


rezultatelor într-un tabel. Totuși, pachetul R de bază nu produce o ieșire bine
formatată. După cum s-a menționat anterior, unul dintre cele mai importante puncte
forte ale R este disponibilitatea de pachete suplimentare pe care utilizatorii R le
oferă gratuit prin intermediul site-urilor de internet din familia CRAN.
Ca urmare, pachetul, stargazer, permite prezentarea rezultatelor
statistice într-un tabel formatat.

 
24 Analiza Datelor în mediul R - teorie şi aplicaţii

Pentru a aplica pachetul stargazer pe dataframe-ul productia_1,


în R se parcurg următorii pași:
- se instalează în R pachetul stargazer, astfel:
install.packages("stargazer", dependencies = TRUE)
library(stargazer)
- se aplică funcția stargazer() pentru a produce un tabel.
Astfel, dacă se dorește obținerea unui tabel cu statistici descriptive pe baza
datelor din fișierul productia_1, se va apela funcția stargazer():
stargazer(productia_1, type = "text")
======================================================
Statistic N Mean St. Dev. Min Pctl(25) Pctl(75) Max
------------------------------------------------------
munca 10 73.000 33.015 20 45 97.5 120
capital 10 21.000 7.257 10 15.8 27.8 31
------------------------------------------------------
Putem modifica codul de mai sus pentru a genera o varietate de ieșiri
formatate. Codul următor și liniile de comentarii ale acestora ilustrează mai multe
variante posibile:
# se afișează setul de date într-un format de tip tabel
stargazer(productia_1, type = "text", summary = FALSE,
rownames = FALSE)
=============
munca capital
-------------
80 20
100 10
60 30
…………………………
120 19
40 31
-------------
# se folosește funcția c() pentru a alege statisticile ce se dorește a fi
# raportate
stargazer(productia_1, type = "text", summary.stat = c("n",
"mean", "median", "sd"))
===================================
Statistic N Mean Median St. Dev.
-----------------------------------
munca 10 73.000 75 33.015
capital 10 21.000 19.5 7.257
-----------------------------------
# se adaugă statistici suplimentare în care se raportează mediana,
# și intervalele intercuartile (percentilele 25 și 75)
stargazer(productia_1, type = "text", median = TRUE, iqr =
TRUE)
=============================================================
Statistic N Mean St. Dev. Min Pctl(25) Median Pctl(75) Max
-------------------------------------------------------------
munca 10 73.000 33.015 20 45 75 97.5 120
capital 10 21.000 7.257 10 15.8 19.5 27.8 31
-------------------------------------------------------------
# se obțin statistici descriptive selectate formatate ale
# variabilelor din productia_1
stargazer(productia_1, type = "text", summary.stat = c("n",
"mean", "sd", "min", "p25", "median", "p75", "max"))
Capitol suplimentar Introducere în mediul R 25

=============================================================
Statistic N Mean St. Dev. Min Pctl(25) Median Pctl(75) Max
-------------------------------------------------------------
munca 10 73.000 33.015 20 45 75 97.5 120
capital 10 21.000 7.257 10 15.8 19.5 27.8 31
-------------------------------------------------------------
Acestea au fost doar câteva exemple, lăsând în seama cititorului noi
valențe ale funcției stargazer.

6. Operații cu matrice în R

Abordarea matricelor este similară vectorilor, doar că există două


dimensiuni semnificative. De obicei, se utilizează o matrice pentru a modifica și
stoca valorile dintr-un set de date, deoarece o matrice are două dimensiuni și
anume:
- liniile sunt folosite, de regulă, pentru a evidenția indivizii, obiectele, itemii,
observațiile;
- coloanele sunt folosite, de regulă, pentru a evidenția variabilele,
caracteristicile, atributele, însușirile.
O matrice este recomandată atunci când se intenționează să se efectueze
diferite tipuri de operații algebrice liniare sau alte operații matematice. Pentru un
set de date cu tipuri diferite de date, este recomandat să se utilizeze un
dataframe (cadru de date).
Pentru a crea o matrice, se poate utiliza următoarea sintaxă:
matrice <- matrix(vector, nrow=n, ncol=i)
sau pe un caz concret:
matrice <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow=3,
ncol=3)
print(matrice)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

6.1. Principalele comenzi pentru accesarea datelor, în lucrul cu matrice

În continuare, sunt prezentate câteva comenzi pentru accesarea datelor, în


lucrul cu matrice, în R, pentru a crea cadrul general de abordare.
Se pot utiliza diferite nume pentru a redenumi, dimnames, liniile și
coloanele, astfel:
matrice <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow=3,
ncol=3)
dimnames=list(c("X", "Y", "Z"), c("U", "V", "W"))
print(matrice)
U V W
X 1 4 7
Y 2 5 8
Z 3 6 9

 
26 Analiza Datelor în mediul R - teorie şi aplicaţii

Se poate, de asemenea, verifica dimensiunea matricei folosind funcția


attribute() și dacă o variabilă este o matrice utilizând funcția class():
class(matrice)
[1] "matrix"
attributes(matrice)
$dim
[1] 3 3
$dimnames
[[1]]
[1] "X" "Y" "Z"
[[2]]
[1] "U" "V" "W"
Se poate, totodată, obține nume de coloană și nume de rând folosind
funcțiile colnames() și respectiv rownames():
colnames(matrice)
[1] "A" "S" "D"
rownames(matrice)
[1] "X" "Y" "Z"
Se poate crea, de asemenea, o matrice utilizând funcțiile de concatenare a
coloanelor și respectiv a liniilor, astfel:
matrice_1 <- cbind(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9))
print(matrice_1)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
matrice_2 <- rbind(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9))
print(matrice_2)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Pentru a selecta prima linie din matricea matrice, se procedează astfel:
matrice[1,]
[1] 1 4 7
Pentru a selecta prima coloană din matricea matrice, se procedează astfel:
matrice[,1]
[1] 1 2 3
Pentru a selecta toate liniile, cu excepția ultimei linii, din matricea
matrice, se procedează astfel:
matrice[-3,]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
Pentru a selecta linia a doua, coloana a treia din matricea matrice, se
procedează astfel:
matrice[2,3]
[1] 8
Pentru folosirea unui vector logic pentru a selecta coloanele 1 și 3, se
procedează astfel:
matrice[, c(TRUE, FALSE, TRUE)]
[,1] [,2]
[1,] 1 7
Capitol suplimentar Introducere în mediul R 27

[2,] 2 8
[3,] 3 9
Pentru a selecta elementele și valorile bazate pe mai mult și respectiv mai
puțin de o anumită valoare, la matricea matrice, se procedează astfel:
matrice[matrice>7]
[1] 8 9

6.2. Operații bazate pe funcții R

În continuare, sunt prezentate câteva operații bazate pe funcții R, în lucrul


cu matrice, pentru a crea cadrul general de abordare.
Pentru a modifica9 componenta corespunzătoare la prima linie și a treia
coloană, la matricea matrice, se procedează astfel:
matrice[1, 3] <- 10
print(matrice)
[,1] [,2] [,3]
[1,] 1 4 10
[2,] 2 5 8
[3,] 3 6 9
Pentru a adăuga o linie nouă la matricea, matrice, utilizând funcția
rbind (), se procedează astfel:
matrice <- rbind(matrice, c(10, 11, 12))
print(matrice)
[,1] [,2] [,3]
[1,] 1 4 10
[2,] 2 5 8
[3,] 3 6 9
[4,] 10 11 12
Pentru a adăuga o coloană nouă la matricea, matrice, utilizând funcția
cbind (), se procedează astfel:
matrice <- cbind(matrice, c(13, 14, 15,16))
print(matrice)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 10 13 13
[2,] 2 5 8 14 14
[3,] 3 6 9 15 15
[4,] 10 11 12 13 16
Pentru a transpune o matrice, se poate utiliza funcția t(), astfel:
matrice <- t(matrice)
print(matrice)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 10
[2,] 4 5 6 11
[3,] 10 8 9 12
[4,] 13 14 15 13
[5,] 13 14 15 16

7. Căutarea în R a unui răspuns primit anterior

9
Atenție: de fiecare dată se va face referința la matrice având forma ultimă.

 
28 Analiza Datelor în mediul R - teorie şi aplicaţii

Atunci când există o întrebare și se dorește căutarea în arhivele listelor de


corespondență, pentru a vedea dacă la întrebarea respectivă a fost dat un răspuns
anterior, se deschide http://rseek.org în browser-ul de lucru(google.com
spre exemplu).
Dacă spre exemplu, se caută un cuvânt cheie sau alt termen din întrebarea
respectivă, atunci când apar rezultatele căutării, se face clic pe fila „Support
Lists” și apoi se apasă TAB.
Este de reținut faptul că se poate efectua o căutare în R și folosind funcția
RSiteSearch, atunci când se dorește a se iniția o căutare:
RSiteSearch(„keyphrase”)
Rezultatele căutării inițiale vor apărea într-un browser. În „Target”, se
selectează sursele de ajutor R, se șterg celelalte surse și se retrimite interogarea.

8. Actualizarea R la o versiune mai nouă

R este un software în continuă evoluție și îmbunătățire, ceea ce face


necesară actualizarea sa la o versiune mai nouă, tocmai pentru a fi
compatibile toate pachetele ce apar ulterior versiunii existente pe mașina de
lucru.
Pașii pentru a actualiza R pe Windows sunt destul de ușori. În primul
rând, se instalează pachetul "installr", după care se execută următorul cod
R:
install.packages("installr", dependencies = TRUE)
library(installr)
# actualizare R
updateR()
Dacă versiunea R de lucru este cea ultimă, se va primi răspunsul: FALSE,
altfel se va face actualizarea.
Capitolul 1
Preprocesarea și standardizarea datelor, utilizând mediul R
Prof. dr. Stelian STANCU

1.1. Normalizarea datelor utilizând pachetul reshape, funcția rescaler

Pentru început se va instala librăria reshape:


install.packages("reshape", dependencies = TRUE)
library("reshape")
rescaler - este o metodă folosită pentru redimensionarea datelor, având sintaxa:
rescaler (x, type = "sd", ...)
unde:
x – reprezintă obiectul de rescalat;
type – reprezintă tipul de redimensionare utilizat.
… – alte opțiuni.
În prezent, sunt implementate cinci opțiuni de redimensionare:
I- nu fac nimic;
range: scalează în intervalul [0, 1];
rank: convertește valorle în ranguri;
robust: versiunea robustă a sd, scade mediana și împarte la
variația absolută față de mediană
sd: scade media din fiecare valoare și împarte rezultatul la abatere
standard.
Indiferent de modelul pe care îl vom folosi, vom presupune diferite aspecte
despre date, în sensul că este foarte important ca datele, referitoare la diferite
variabile numerice, să fie exprimate pe o scară similară.
Atunci când sunt calculate distanțele, dacă unitățile sunt foarte diferite, nu
putem obține rezultate adecvate.
Dacă se face o analiză legată de un grup de indivizi (obiecte/intrări) și
avem, printre alte date, venitul în euro și vârsta subiecților, o variabilă precum
venitul ar putea eclipsa variabila vârstă.
Astfel, pentru analiză, vârsta de 25 de ani poate fi mai importantă decât un
venit de 20.000 euro, spre exemplu. Cu toate acestea, atunci când sunt comparate
ambele prin măsurarea distanțelor, un model de grupare ar putea subestima
importanța vârstei.
Pentru a atenua problema scalării datelorse pot folosi metode de
standardizare. Standardizarea este procesul de ajustare a datelor la un interval
specific, de exemplu, între 0 și 1 sau între –1 și 1.
Există mai multe tehnici de normalizare:
- recentrarea datelor;
- scalarea între 0 și 1;
2 Analiza datelor în mediul R - teorie şi aplicaţii

- mediana/MAD;
- etc
Recentrarea datelor - realizează o transformare standard a scorului z.
Valoarea medie a variabilei este scăzută din fiecare valoare și rezultatul este apoi
împărțit la abaterea standard. Variabila rezultată va fi de medie zero și abatere
standard 1.
În continuare, vom evidenția cum după transformare, variabilele nu mai
sunt exprimate în scala lor inițială, ca spre exemplu, vârsta care nu mai afișează un
număr de ani.
set.seed(2020)
ages = sample(14:100, 30, replace=T)
incomes = sample(400:10000, 30, replace=T)
data = cbind(ages, incomes)
scaled = scale(data)
cor(data)
cor(scaled)
cov(scaled)
Observaţie: Se poate constata că întotdeauna cor(scaled)= cov(scaled).
Scalarea [0-1] - se face scăzând valoarea minimă din valoarea variabilei pentru
fiecare observație, apoi împărțind la diferența dintre valoarea maximă și cea
minimă.
În continuare, vom scala în [0-1] datele data prezentate anterior, folosind
pentru aceasta pachetul reshape, funcția rescaler:
install.packages("reshape", dependencies = TRUE)
library("reshape")
set.seed(2020)
scaled = rescaler(data, "range")
Median/MAD - este o versiune robustă a transformării standard recentrate.
Valoarea mediană este scăzută din fiecare valoare, iar rezultatul este apoi împărțită
la abaterea mediană absolută. Variabila rezultată va avea mediana zero.
În continuare, vom scala Median/MAD, pentru setul de date data
prezentate anterior, utilizând funcția rescaler din pachetul reshape:
install.packages("reshape", dependencies = TRUE)
library("reshape")
set.seed(2020)
scaled = rescaler(data, "robust")
head(scaled)

1.2. Normalizarea datelor utilizând pachetul clusterSim, funcția


data.Normalization

data.Normalization - tipuri de formule de normalizare a variabilelor (pe


coloane) și obiectelor (pe linii), cu sintaxa:
data.Normalization(x,type="n0",normalization="column")
unde:
x - vector, matrice sau set de date
Capitolul 1. Preprocesarea și standardizarea datelor 3

type - tip de normalizare:


n0 - fără normalizare
n1 - standardizare ((x-mean)/sd)
n2 - poziționarea standard ((x-median)/mad)
n3 - unitatea ((x-mean)/range)
n3a – poziționarea unității ((x-median)/range)
n4 – unitatea cu minimul zero ((x-min)/range)
n5 - normalizarea în domeniul <-1,1> ((x-mean)/max(abs(x-
mean)))
n5a - normalizarea pozițională în domeniul <-1,1> ((x-
median)/ max(abs(x-median)))
n6 - coeficient de transformare (x/sd)
n6a - coeficient de transformare pozițional (x/mad)
n7 - coeficient de transformare (x/range)
n8 - coeficient de transformare (x/max)
n9 - coeficient de transformare (x/mean)
n9a - coeficient de transformare pozițional (x/median)
n10 - coeficient de transformare (x/sum)
n11 - coeficient de transformare (x/sqrt(SSQ))
n12 - normalizarea ((x-mean)/sqrt(sum((x-mean)^2)))
n12a - normalizarea pozițională ((x-median)/sqrt(sum((x-
median)^2)))
n13 - normalizarea cu zero punct central ((x-midrange)/(range/2))
În continuare, vom normaliza datele după diferite reguli și anume:
- setul de date data_ratio, utilizând pachetul clusterSim,
aplicând tipul de normalizare standardizată ((x-mean)/sd) și coeficient
de transformare pozițional (x/median).
install.packages("clusterSim", dependencies = TRUE)
library("clusterSim")
set.seed(2020)
data(data_ratio)
z1 <- data.Normalization(data_ratio,type="n1",
normalization="column")
z2 <- data.Normalization(data_ratio,type="n9a",
normalization="row")
- setul de date data_patternGDM1, utilizând pachetul
clusterSim, aplicând tipul de normalizare standardizată ((x-
mean)/sd) .
install.packages("clusterSim", dependencies = TRUE)
library("clusterSim")
set.seed(2020)
data(data_patternGDM1)
z<-data.Normalization(data_patternGDM1,type="n1")
d<-dist.GDM(z,method="GDM1")
4 Analiza datelor în mediul R - teorie şi aplicaţii

cl1<-pam(d,3,diss=TRUE)$clustering
cl2<-pam(d,4,diss=TRUE)$clustering
print(comparing.Partitions(cl1,cl2,type="crand"))
# [1] 0.2795866
- setul de date data_patternGDM1, aplicând tipul de normalizare
bazat pe coeficientul de transformare pozițional (x/median).
install.packages("clusterSim", dependencies = TRUE)
library("clusterSim")
set.seed(2020)
data(data_patternGDM1)
z<-data.Normalization(data_patternGDM1,type="n9")
d<-dist.GDM(z,method="GDM1")
cl1<-pam(d,3,diss=TRUE)$clustering
hc<-hclust(d, method="complete")
cl2<-cutree(hc,k=3)
print(comparing.Partitions(cl1,cl2,type="nowak"))
Capitolul 2
Reprezentări, descriptori şi metrici la nivelul
datelor multidimensionale
Prof. dr. Stelian STANCU

2.1. Reprezentarea datelor multidimensionale primare

Datele primare sunt reprezentate în Analiza Datelor sub trei forme


matriciale principale:
- matricea observaţiilor;
- matricea sau tabelul de contingenţă;
- matricea sau tabelul de proximitate.

2.1.1. Matricea observaţiilor (obiectelor, indivizilor)

Valorile variabilelor relativ la indivizii supuşi observării se specifică printr-


o matrice cu m linii şi n coloane:

 x11 x12 ... x1j ... x1n 1 x1n 


 1 
 x2 x 22 ... x 2j ... x 2n 1 x 2n 
 ... ... ... ... ... ... ... 
 
X   xi1 x 2
i ... xi j
... xin 1 xin 
 ... ... ... ... ... ... ... 
 1 
 x m 1 x m2 1 ... x mj 1 ... x mn 11 x mn 1 
 x1 x m2 ... x mj ... x mn 1 x mn 
 m

2.1.2. Matricea sau tabelul de contingenţă

Se poate defini tabelul de contingenţă următor:

x1 x2 1 2 … j … q Total
1 k11 k12 … k1 j … k 1q k1
2 k 21 k 22 … k2 j … k 2q k 2
… … … … … … … …
i k i1 ki2 … k ij … k iq k i
… … … … … … … …
p k p1 k p2 … k pj … k pq k p
Total k 1 k 2 … k j … k q k  k 
Tabelul 2.1.a. Tabelul de contingenţă de dimensiune p  q
2 Analiza Datelor. Teorie şi aplicaţii

unde:
q p p q
k i    k ij ; k  j   k ij şi k  k    k ij .
j 1 i 1 i 1 j 1

2.1.3. Matricea sau tabelul de proximitate

Aceasta este o matrice pătratică de dimensiune m  m , utilizată pentru


reprezentarea datelor cu privire la similaritatea sau disimilaritatea unor indivizi
(obiecte, observaţii). Ordinul matricei de proximitate este determinat de numărul
indivizilor (obiectelor, observaţiilor) supuşi studiului.
Elementele unei matrici de proximitate reprezintă coeficienţi de
similaritate, coeficienţi de disimilaritate sau distanţe.
Un element k ij din această matrice măsoară gradul de proximitate dintre
individul (obiectul) i şi individul (obiectul) j.
O matrice de proximitate se mai numeşte şi matrice de tip:

indivizi (obiecte) × indivizi (obiecte)

şi este utilizată în problemele de clasificare cu ajutorul tehnicilor de tip cluster şi de


asemenea, în problemele de scalare multidimensională

2.2. Descriptori şi metrici la nivelul datelor multidimensionale

2.2.1. Descriptori şi metrici în spaţiul indivizilor

Luând  - spaţiu punctual, mulţimii indivizilor îi va corespunde un nor de


puncte m-dimensional x i , având frecvenţele relative respectiv wi :


M  ( xi , wi ) / i  1, m 
unde cu M s-a notat norul de puncte.
Definiţia 2.1. Se numeşte baricentrul punctelor xi   , afectate de ponderile wi ,
sau centrul de greutate al norului de puncte M, care coincide de fapt cu vectorul
mediilor aritmetice ale celor n-variabile:
Capitolul 2. Reprezentări, descriptori şi metrici la nivelul datelor multidimensionale 3

t
 m 1 
t
  xi  wi 
 xi1   im1 
 2    xi2  wi 
 xi   i 1 
 ...   ... 
m m
   m j  ~
g   xi  wi    xij   wi    xi  wi   X t  W  1 
i 1 i 1
 ...   i 1 
 n 1   m ... 
 xi   x n 1  w 
 xn  i 1
i i

 i   m n 
  xi  wi 
 i 1 

unde 1 reprezintă vectorul coloană m-dimensional, având elementele egale cu 1.

2.2.2. Descriptori şi metrici în spaţiul variabilelor1

2.2.2.1. Matrice centrată (matricea observaţiilor centrate)

Definiţia 2.2. Se numeşte matrice centrată (matricea observaţiilor centrate)


~
asociată lui X şi se notează cu X , matricea dată de elementele:

~
xi j  xij  x j , cu i  1, m , j  1, n

cu x j - reprezentând media celei de-a j-a.variabilă

adică în scriere matriceală:

X  ~
xi j i 1,m  xij  x j i 1,m
~
j 1, n j 1, n

2.2.2.2. Matricea datelor (observaţiilor) standardizate

Definiţia 2.3. Se numeşte matricea datelor (observaţiilor) standardizate, notată cu


X̂ , acea matrice obţinută prin împarţirea valorile ~
xi j  xij  x j , cu i  1, m , j  1, n
la abaterile standard corespunzătoare, S ( x j ) , obţinându-se forma:

xj xj   ~xj 


Xˆ  xˆ ij i 1, m   i j
~
   i j   XW 1
j 1, n
 S (x )  j 1, n 
i 1, m S ( x )  j 1, n
i  1, m S

1
A se vedea şi Capitolul 4, & 2.1.2.1. Centrarea datelor primare.
4 Analiza Datelor. Teorie şi aplicaţii

unde:
2

 x  x j  wi
m
S(x j )  i
j

i 1

 1 
W 1  diag  j 
, j  1, n este matricea diagonală a inverselor abaterilor
S  S(x ) 
standard.

2.2.2.3. Matricea de covarianţă

Definiţia 2.4. Se numeşte matrice de covarianţă, notată cu V , matricea care se


exprimă, cu notaţiile precedente, astfel:
~ ~ ~~
V  X t W X  g t g  X t WX

unde: v jk   xij  x j xik  x k wi , cu j , k  1, n


m

i 1

(forma analitică a elementelor matricei V)

2.2.2.4. Matrice a corelaţiilor (matrice de corelaţie)

Definiţia 2.5. Se numeşte matrice a corelaţiilor (matrice de corelaţie), notată cu


R , în spaţiul variabilelor, matricea de covarianţă a datelor standardizate, care se
exprimă, cu notaţiile precedente, astfel:

t
~ ~~ ~  ~ ~  ˆt ~ˆ
R  W 1 VW 1  W 1 X t WXW 1   XW 1  W  XW 1
 
  X WX

S S S S  S   S 

unde:
v jk
r jk  , cu j , k  1, n . (forma analitică a elementelor matricei R)
S(x )  S(xk )
j

v jk   xij  x j xik  x k wi , cu j , k  1, n , arată covarianţa între indivizii j şi k.


m

i 1

 x  x j  wi
m
2
S(x j )  i
j

i 1

sau explicit:
Capitolul 2. Reprezentări, descriptori şi metrici la nivelul datelor multidimensionale 5

 x  x j xik  x k wi
m
j
v jk i
r jk   i 1

S(x j )  S(xk )
 x  x j  wi  x  x k  wi
m m
j 2 k 2
i i
i 1 i 1

de unde, pentru cazul nedeplasat (similar pentru deplasat), avem:

 x  x j xik  x k 
m
j
v jk i
r jk   i 1

S(x j )  S(xk )
 x xj  x  xk 
m m
j 2 k 2
i i
i 1 i 1

2.3. Schimbarea de variabilă în Analiza Datelor(Facultativ!)

Există două tipuri de schimbare de variabilă în Analiza Datelor:


- schimbare de variabilă prin schimbarea structurii;
- schimbare de variabilă prin codificare.

2.3.1. Schimbarea de variabilă prin schimbarea structurii

Definiţia 2.6. Fiind dată o variabilă x :   E , cu E înzestrată cu structura S, se


zice că se procedează la o schimbare de variabilă prin schimbarea structurii atunci
când se înlocuieşte variabila x :   E cu o variabilă x  :   E , cu E înzestrată
cu o structură S   S , astfel încât x ( )  x( ) , pentru fiecare individ    .

2.3.2. Schimbarea de variabilă prin codificare

Definiţia 2.7. Fiind dată o variabilă x :   E , cu E înzestrată cu structura S, se


zice că se procedează la o schimbare de variabilă prin codificare atunci când se
precizează un spaţiu al indivizilor E  , cu E  înzestrată cu o structură S  şi o
aplicaţie y : E  E  . Noua variabilă x  :   E  se obţine astfel:

x  y  x
unde:
“  ” - reprezintă semnul pentru compunere
Observaţie: Avem astfel că noua variabilă este definită de forma:

x :   E 

cu proprietatea că:
6 Analiza Datelor. Teorie şi aplicaţii

x ( )  ( y  x)( )  y ( x( ))

Schema de obţinere a noii variabile, prin codificare este următoarea:


x
 E

x  y  x
y

E
Figura 2.1. Schema de obţinere a noii variabile

unde:
E - este înzestrată cu structura S;
E  - este înzestrată cu structura S  ;

2.4. Măsuri de similaritate/disimilaritate. Metrici şi ultrametrici

2.4.1. Definirea noţiunilor de bază

Definiţia 2.8. Se numeşte măsură de asemănare (similaritate/disimilaritate), orice


aplicaţie cu valori numerice, care permite exprimarea unei legături între indivizi,
sau între variabile.
Definiţia 2.9. Se numeşte indice de similaritate pe mulţimea indivizilor  , o
aplicaţie s care verifică următoarele proprietăţi:

- aplicaţia s :     R  ;

- aplicaţia s este simetrică, adică:

() ( ,  )     , rezultă că s ( ,  )  s ( ,  ) ;

- () ( ,  )     , cu     , rezultă că:

s ( ,  )  s ( ,  )  s ( ,  ) .

Definiţia 2.10. Se numeşte indice de disimilaritate pe mulţimea indivizilor  , o


aplicaţie d S care verifică următoarele proprietăţi:

- aplicaţia d S :     R  ;
Capitolul 2. Reprezentări, descriptori şi metrici la nivelul datelor multidimensionale 7

- aplicaţia d S este simetrică, adică:

() ( ,  )     , rezultă că d S ( ,  )  d S ( ,  ) ;

- ()    , rezultă că d S ( ,  )  0 .

Definiţia 2.11. Se numeşte distanţă sau metrică, un indice de disimilaritate care


verifică suplimentar următoarele proprietăţi:

- () ( ,  )     , atunci avem că d S (,  )  0

dacă şi numai dacă     ;

- ()  ,  ,     , atunci avem că

d S (,  )  d S (,  )  d S ( ,  )


(inegalitatea triunghiului).
Comentarii:
1. Un indice de disimilaritate care verifică numai prima proprietate din
Definiţia 2.9, se numeşte indice de distanţă;
2. Un indice de disimilaritate care verifică numai a doua proprietate din
Definiţia 2.9, se numeşte abatere (ecart);
3. Un indice de disimilaritate care verifică inegalitatea:

d S (,  )  maxd S (,  ), d S ( ,  ) , () ( ,  ,  )   3

se numeşte abatere ultrametrică sau disimilaritate ultrametrică.

2.4.2. Măsuri de similaritate/disimilaritate în cazul variabilelor cantitative

Fie în continuare forma matriceală de reprezentare a celor m


indivizi, xi   descrişi de n variabile x j  E , prin vectorii linie, respectiv
vectorii coloană ai matricei de date:
- fiecare linie xi , cu i  1, m a matricei X descrie un n-tuplu de valori
luate de cele n variabile pentru individul (obiectul, observaţia) i,
desemnând un vector din spaţiul m-dimensional  , numit spaţiul
indivizilor (obiectelor, observaţiilor):
8 Analiza Datelor. Teorie şi aplicaţii

t
 xi1 
 2 
 xi 
 ... 
 
xi   xi j 
 ... 
 n 1 
 xi 
 xn 
 i 

sau altfel scris:


x i  xi1 x i2 ... x ij ... x in 1 
x in , cu i  1, m

- variabilă x j , cu j  1, n , este reprezentată cu ajutorul unui vector din


spaţiul vectorial n-dimensional E, numit spaţiul variabilelor (o coloană
reprezintă o variabilă (caracteristică) a indivizilor (obiectelor,
observaţiilor)):

 x1j 
 j 
 x2 
 ... 
 
x   xi j 
j

 ... 
 j 
 xm1 
 xj 
 m 

Principalele măsuri de similaritate (asemănare), în cazul variabilelor


cantitative, sunt:
- distanţa euclidiană dintre doi indivizi2 xi şi xk din spaţiul n-dimensional
R n al variabilelor, este definită R n ca o funcţie reală d E : R n  R n  R de
forma:
d E ( x i , x k )  ( xi  x k )  N  ( x i  x k ) t

Definiţia 2.12.
1. Se spune că doi indivizi  i ,  k   au acelaşi profil dacă:

2
A se vedea şi 2.5.1. Distanţa euclidiană, & Distanţa euclidiană în spaţiul variabilelor
Capitolul 2. Reprezentări, descriptori şi metrici la nivelul datelor multidimensionale 9

xij x kj
 , () j  1, n
xi x k

2. Se spune că două variabile x j , x k  E au acelaşi profil dacă:

xij xik
 , () i  1, m
xj xk

Consecinţă: O generalizare a distanţei euclidiene este distanţa Minkowski de


ordinul n.

Definiţia 2.13. Se numeşte distanţă Minkowski de ordinul p între două puncte


(indivizi, obiecte, observaţii) xi şi xk din spaţiul n-dimensional R n al variabilelor,
o funcţie reală d Min : R n  R n  R care este definită astfel:

1/ p
 n 
d Min ( xi , x k )    xij  x kj
p

 j 1 
unde:
t
 xl1 
 2 
 xl 
 ... 
 
xl   xlj  , cu l  i, k , iar i, k  1, m
 ... 
 n 1 
 xl 
 xn 
 l 

xij şi x kj - reprezintă cea de-a j-a coordonată a punctelor (indivizilor) xi ,


respectiv xk ;
Observaţii:
1. Distanţa Minkowski este semi-euclidiană, deoarece pentru anumite valori
ale parametrului n, nu poate fi scrisă sub formă pătratică;
2. Distanţa euclidiană se obţine pentru p  2 şi ia valori în intervalul 0,  ;
3. Pentru p  1 se obţine distanţa Manhattan sau distanţa valorilor absolute,
dată de relaţia:
n
d Man ( xi , x k )   xij  x kj
j 1
10 Analiza Datelor. Teorie şi aplicaţii

4. Distanţa Manhattan diferă de distanţa euclidiană clasică prin faptul că ea se


măsoară ca şi când drumul s-ar parcurge pe axe perpendiculare (analogie
cu străzile din Manhattan), şi iae valori în intervalul 0,  .

5. Pentru p   se obţine distanţa Cebîşev, dată de relaţia:

1/ p
 n 
d Ceb ( xi , x k )  lim  xij  x kj
p
  max xij  x kj
p 
 j 1  j

Distanţa Cebîşev ia valori în intervalul 0,  .

6. Distanţa cosinus: este o măsură de similaritate şi calculează „unghiul”


dintre doi vectori din spaţiul n-dimensional şi este dată de relaţia:

 x   x 
n n
j 2 j 2
i  k
j 1 j 1
d cos ( xi , x k )  n

x j 1
i
j
x kj

Distanţa cosinus ia valori în intervalul 0,1 .

7. O distanţă nepătratică este distanţa Canberra, dată sub două forme:

- forma 1:
n xij  x kj
d Cam ( xi , x k )  
1
j 1 xij  x kj

- forma 2:

n xij  x kj
d Cam ( xi , x k )  
2
j 1 xij  x kj

2.4.6. Măsuri de similaritate/disimilaritate între grupe de indivizi

Se consideră, în continuare, ca fiind date două grupe de indivizi


G1 , G2   şi o măsură de similaritate/disimilaritate:
Capitolul 2. Reprezentări, descriptori şi metrici la nivelul datelor multidimensionale 11

d : G1  G2  R 

Pornind de la aceste notaţii, pot fi generate o multitudine de măsuri de


similaritate/disimilaritate între grupe, câteva fiind prezentate în continuare:

- distanţa legăturii minime dintre grupele de indivizi G1 şi G2 , dată de


relaţia:

d (G1 , G 2 )  min d ( i , j )
i G1
 j G2

- distanţa legăturii maxime dintre grupele de indivizi G1 şi G2 , dată de


relaţia:

d (G1 , G 2 )  max d ( i , j )
i G1
 j G2

- distanţa dintre nuclee, dată de relaţia:

d (G1 , G 2 )   d ( ,
i K1
i j )
 j K 2

Pentru aceasta se parcurg următorii paşi:


Pasul 1. Se defineşte un nucleu cu k j elemente al unei mulţimi G j , ca fiind
format dintr-o mulţime K j de k j indivizi    , care minimizează criteriul:

  d ( ,  )
K j  i G j
i

Pasul 2. Se defineşte distanţa dintre cele două nuclee3, ca fiind:

d (G1 , G2 )  d ( K 1 , K 2 )   d ( ,
i K1
i j )
 j K 2

unde:
K j - reprezintă nucleul mulţimii de indivizi G j , cu cardK 1 cardK 2 .

- distanţa dintre centrele de greutateale grupelor de indivizi G1 şi G2

3
Mulţimi G j - ce formează grupe de indivizi.
12 Analiza Datelor. Teorie şi aplicaţii

În cazul spaţiul indivizilor (obiectelor, observaţiilor), generat de n variabile


E  E1  E 2  E3  ...  E n , este un spaţiu vectorial înzestrat cu o distanţă pătratică,
atunci distanţa între două grupe se poate lua ca distanţa dintre centrele lor de
greutate, adică:

d (G1 , G 2 )  d ( g 1 , g 2 )

unde g j - reprezintă punctul ale cărui coordonate sunt mediile celor m indivizi din
grupul G j respectiv, cu j  1,2 .

- inerţia intra şi inter-clase

Pentru aceasta se parcurg următorii paşi:


Pasul 1. Se defineşte spaţiul vectorial E înzestrat cu o distanţă pătratică  .
Observaţie: Se notează d  2 .
Pasul 2. Se asociază fiecărui individ    o pondere w( ) .
Pasul 3. Se asociază fiecărei părţi G   ponderea:

w (G )   w( )
G

Pasul 4. Se construieşte variabila vectorială x care asociază fiecărui individ    ,


n-tuplul x( )  ( x1 ( ), x 2 ( ), x3 ( ),..., x n ( )) din spaţiul vectorial:

E  E1  E 2  E3  ...  E n .

Pasul 5. Se construieşte centrul de greutate (baricentrul) g (G ) , care este dat de


relaţia:
1
g (G )   x( ) w( )
w(G ) G

Pasul 6. Se defineşte inerţia părţi G   în raport cu un punct n-dimensional


   astfel:
I  (G )   d ( x ( ), x ( )) w( )
G

Pasul 7. Cea mai mare parte a măsurilor de similaritate/disimilaritate între părţile


unei mulţimi, în cazul în care  este înzestrată cu o distanţă pătratică  , se
bazează pe formula lui Huygens, dată de următorul rezultat:
Capitolul 2. Reprezentări, descriptori şi metrici la nivelul datelor multidimensionale 13

mG mG mG
I  (  G j )   I (G j )   d ( g (G j ), x ( )) w(G j ) (teorema lui Huygens)
j 1
j 1 j 1

unde:
G j - reprezintă părţi disjuncte ale mulţimii  ;
mG - reprezintă numărul de părţi G j .
Capitolul 2_continuare_recapitulare(facultativ!)
Analiza Datelor - metode statistice de analiză

Prof. dr. Stelian STANCU


2.1. Analiza statistică descriptivă a datelor

Analiza seriilor de distribuţie a frecvenţelor

 Seriile de distribuţie a frecvenţelor, pot fi:


- simple, când avem un şir de variante privind aceiaşi variabilă x j , cu
j  1, n , este reprezentată cu ajutorul unui vector din spaţiul vectorial n-
dimensional E, numit spaţiul variabilelor (o coloană reprezintă o variabilă
(caracteristică) a indivizilor (obiectelor, observaţiilor)):

 x1j 
 j 
 x2 
 ... 
 
x   xi j 
j

 ... 
 j 
 xm1 
 xj 
 m 

cu j  1, n ;
- de frecvenţe, când fiecărei variante i se ataşează câte o frecvenţă, adică:

 x1 x 2 ... xi ... x p 
  unde p  m
 n n ... n ... n 
 1 2 i p 

 Graficele utilizate frecvent sunt:


- histograma;
- poligonul frecvenţelor;
- curba cumulativă a frecvenţelor;
- graficul de concentrare.

 Indicatorii utilizaţi se particularizează pe tipuri de serie şi se pot grupa astfel:


- indicatorii de frecvenţe: absolute, relative şi cumulate;
- indicatorii tendinţei centrale: media, mediana, modul;
- indicatori medii de poziţie denumiţi şi medii de structură sau medii de
frecvenţe: mediana, cuartilele, decilele, centilele;
2 Analiza Datelor. Teorie şi aplicaţii

- indicatori ai variaţiei totale: amplitudinea variaţiei, abaterile


individuale, abaterea medie liniară, abaterea medie pătratică (abaterea
tip sau abaterea standard), dispersia şi coeficientul de variaţie;
- indicatorii de asimetrie;
- indicatorii de variaţie intercuartilică şi interdecilică;
- indicatorii concentrării/diversificării.

 Serii simple (date negrupate)

- Mărimi medii

Media aritmetică: este rezultatul sintetizării într-o singură


expresie numerică a tuturor nivelurilor individuale observate, obţinută prin
raportarea valorii totalizate a caracteristicii la numărul total al unităţilor:
m

x i
x i 1

unde:
xi - reprezintă nivelurile individuale ale variabilei;
m

x i 1
i - reprezintă volumul centralizat al variabilei;

m - reprezintă numărul unităţilor observate.


Observaţie: Formule de calcul simplificat al mediei aritmetice este dată
de forma:
m m
 xi  a 
  x i  a   
i 1  h 

x i 1
 a sau echivalent x  h  a
m m

Media armonică ( xh ): se defineşte ca fiind inversa mediei


aritmetice calculată din valorile inverse ale termenilor aceleiaşi
serii, adică:
m
xh  m
1

i 1 x i

Media pătratică ( x P ) : este acea valoare care înlocuind


termenii seriei ridicaţi la pătrat nu modifică suma pătratelor lor,
adică.
Capitolul 2. Analiza Datelor - metode statistice de analiză 3

x 2
i
xP  i 1

Media geometrică ( x g ): reprezintă acea valoare cu care,


dacă se înlocuiesc toţi termenii seriei şi se face produsul lor,
valoarea la care se ajunge este egală cu produsul termenilor reali,
adică:
m
x g  m  xi
i 1

iar produsul abaterilor calculate ca raport între valorile individuale


şi media lor geometrică, este egală cu 1, adică:

x1 x 2 x m
x
  ...  m   i  1 )
xg xg xg i 1 x g

Observaţii:
1. Dacă există cel puţin un singur termen negativ sau egal cu zero, atunci
calculul mediei geometrice nu are sens;
2. Prin logaritmarea mediei geometrice se obţine:
m

 lg x i
lg x g  i 1

m
Pentru acelaşi şir de valori, între mediile prezentate există următoarea
relaţie de ordine:

xh  x g  x  x P

- Alte valori medii ale tendinţei centrale

Mediana ( M e ) reprezintă valoarea centrală a unei serii statistice


ordonate crescător sau descrescător care împarte termenii seriei în două
părţi egale.
m 1
Locul M e  unde m reprezintă numărul termenilor seriei.
2
Valoarea medianei:
- dacă numărul termenilor seriei este impar ( m  2 k  1 ), atunci
4 Analiza Datelor. Teorie şi aplicaţii

M e  x k 1

- dacă numărul termenilor este par ( m  2 k ), mediana este într-un


interval de valori şi se admite ipoteza că ea ar fi egală cu media
aritmetică a celor doi termeni centrali:

x k  x k 1
M e 
2

Modul ( M o ) este valoarea care se repetă de cele mai multe ori,


motiv pentru care mai este cunoscut în literatura de specialitate şi sub
denumirea de dominanta seriei. În cazul unei serii simple, cu totul
întâmplător aceiaşi valoare se repetă de mai multe ori şi pentru seria
respectivă poate fi determinată şi valoarea modală. Dacă toate valorile sunt
diferite între ele seria nu are valoare modală şi indicatorii tendinţei centrale
sunt în acest caz media şi mediana.

- Indicatorii variaţiei

 Indicatorii simpli ai variaţiei

Amplitudinea absolută ( A a ): se calculează ca diferenţă între


nivelul maxim ( x max ) şi nivelul minim ( x min ) al caracteristicii, adică:

A a  x max  x min

Amplitudinea relativă a variaţiei ( A% ): se calculează ca raport


între amplitudinea absolută a variaţiei şi nivelul mediu al caracteristicii,
adică:
A
A%  a 100
x

Abaterile individuale absolute ( d i ): se calculează ca diferenţă


între fiecare variantă înregistrată şi media aritmetică a acestora, adică:

d i  xi  x

pentru i  1, m .
Abaterile individuale relative ( d i % ): se calculează raportând
abaterile absolute la nivelul mediu al caracteristicii, adică:
Capitolul 2. Analiza Datelor - metode statistice de analiză 5

di x x
di %   100  i  100
x x

În analiza variaţiei, de multe ori, ne limităm la a calcula abaterile


maxime într-un sens sau altul.

 Indicatorii sintetici ai variaţiei

Abaterea medie liniară (d ) : se calculează ca o medie aritmetică


simplă sau ponderată din abaterile termenilor seriei de la media lor, luate în
valoare absolută, adică:
m

x i x
d  i 1

şi se exprimă în aceleaşi unităţi de măsurare ca şi variabilele luate în calcul.


Abaterea medie pătratică sau abaterea standard ( ) sau
abaterea tip, se calculează ca o medie pătratică din abaterile tuturor
variantelor seriei de la media lor aritmetică:

 (x i  x)2
 i 1

m
Observaţii:
1. Calculând pentru aceeaşi serie, cei doi indicatori, se verifică relaţia:
 d ;
2. În literatura de specialitate se apreciază că pentru o serie de distribuţie cu
tendinţă clară de normalitate, abaterea medie liniară este egală cu 4/5 din
valoarea abaterii medii pătratice1.
Dispersia (varianţa) unei caracteristici ( 2 ) : se calculează ca
medie aritmetică simplă sau ponderată a pătratelor abaterilor termenilor
faţă de media lor. Fiind calculat pe baza pătratelor este un indicator
adimensional.
Formula de calcul este dată de:

m 2
 m 
 (x
m
i  x)2  xi2   xi 
 x2    i 1 
i 1
sau echivalent  x2  i 1

m m  m 
 
 

1
Această relaţie poate fi considerată ca un test de verificare a asimetriei.
6 Analiza Datelor. Teorie şi aplicaţii

Observaţie: Se exprimă în aceleaşi unităţi de măsurare ca şi variabile


pentru care se calculează.
Coeficientul de variaţie (v): se calculează ca raport între abaterea
medie pătratică şi nivelul mediu al seriei, adică:

x
v  100
x

Observaţii:
1. Complementar, coeficientul de variaţie se mai poate calcula şi după relaţia:

d
v   100
x

iar v  v' , de aceea, cel mai frecvent se foloseşte abaterea medie pătratică şi
coeficientul de variaţie corespunzător;
2. Acest indicator se poate calcula şi înlocuind media cu mediana sau modul,
adică:
dM M dM M
v e
100; v  e
100; v  o
100; v  o
100
Me Me Mo Mo

3. Principalii indicatori, cu care se caracterizează o serie statistică de


repartiţie (distribuţie) sunt media şi abaterea medie pătratică.

 Serii de distribuţie unidimensionale de frecvenţe

- Indicatori de frecvenţe
Frecvenţele relative ( ni* ): se obţin raportând frecvenţa fiecărei
p
grupe, ni , la totalul frecvenţelor, n
i 1
i , adică:

ni ni
ni*  p
sau ni*(%)  p
 100
n
i 1
i n
i 1
i

Frecvenţele cumulate se notează cu Fi sau Fi*, în funcţie de felul


frecvenţelor incluse în calcul (absolute sau relative), adică:

i
Fi   n j , cu i  1, p
j 1

respectiv:
Capitolul 2. Analiza Datelor - metode statistice de analiză 7

i
Fi *   n *j , cu i  1, p .
j 1

- Mărimi medii
Media aritmetică

- calculul cu frecvenţe absolute:

x n i i
x i 1
p

n
i 1
i

Observaţii:
1. Calculul simplificat al mediei aritmeticeeste dat de relaţia:

 x i  a ni
x i 1
p
a sau echivalent
n
i 1
i

p
 xi  a 

i 1  h 
ni
x p
h a
 ni
i 1

unde:
a - mijlocul unui interval de obicei centrul intervalului cu frecvenţa
cea mai mare;
h - mărimea intervalului dacă seria are intervale de variaţie egale.
2. Într-o serie de intervale neegale, trebuie să se calculeze toate centrele de
interval şi să se alegă cele mai convenabile valori pentru a şi h care să
simplifice calculul mediei;
3. Dacă într-o serie se reduc proporţional toate frecvenţele, media calculată
pe baza noilor frecvenţe rămâne neschimbată, adică:

ni
c
x i
x
ni
c
Această proprietate serveşte la calculul mediei cu ajutorul frecvenţelor relative. În
acest caz c   ni şi deci:
8 Analiza Datelor. Teorie şi aplicaţii

x   xi ni* sau echivalent x 


x n i
*
i (%)

100

Media armonică
p

n i
Calculul cu frecvenţe absolute: x h  i 1
p
1
x
i 1
ni
i

1 100
Calculul cu frecvenţe relative: x h  sau x h  .
p
1 * p
1 *

i 1 x i
ni 
i 1 x i
ni (%)

Formă transformată a mediei aritmetice:


p

xn i i
Calculul cu frecvenţe absolute: xh  i 1
x
p
1

i 1 xi
xi ni

1
Calculul cu frecvenţe relative: x h  p
sau
1

i 1 x i
x n
i i
*

100
xh  p
1

i 1 x
xi ni*(%)
i

Media pătratică
p

x i
2
ni
Calculul cu frecvenţe absolute: x P  i 1
p

n
i 1
i

p
Calculul cu frecvenţe relative: x P  x
i 1
i
2
ni* sau
Capitolul 2. Analiza Datelor - metode statistice de analiză 9

x i
2
ni*(%)
xP  i 1

100

Media geometrică
p

n p
xg   x in
i
i
i 1

i 1

Observaţii:
1. Prin logaritmare se va obţine:
k

n i  lg x i
lg x g  i 1
k

n
i 1
i

2. Prin antilogaritmare se obţine valoarea mediei geometrice, care se exprimă


în aceleaşi unităţi de măsurare ca şi variabilele luate în calcul.
3. Pentru aceiaşi serie şi dacă se folosesc aceleaşi frecvenţe, între mediile
prezentate există următoare relaţie de ordine:

xh  x g  x  x P

4. Şi în cazul mediilor precedente se păstrează aceeaşi relaţie între medii.

- Alte valori ale tendinţei centrale

Modul (modulul, dominanta)

- în cazul unei serii de distribuţie pe variante, modul este varianta cu


frecvenţa maximă;
- în cazul grupării pe intervale, locul modului este intervalul cu
frecvenţa maximă iar valoarea se calculează astfel:

1
M o  x0  h
1   2
în care:
x0 - reprezintă limita inferioară a intervalului modal;
h - reprezintă mărimea intervalului modal;
1 - reprezintă diferenţa dintre frecvenţa intervalului modal şi a
celui precedent;
 2 - reprezintă diferenţa dintre frecvenţa intervalului modal şi a
10 Analiza Datelor. Teorie şi aplicaţii

celui următor.

Mediana ( M e )

- în cazul datelor grupate pe variante, locul medianei este egal cu


p
(  ni )  1
. Valoarea medianei este varianta a cărei frecvenţă
i 1

2
cumulată este prima mai mare decât locul medianei;
- în cazul datelor grupate pe intervale, locul medianei este egal cu
p
(  ni )  1
. Intervalul median este intervalul a cărui frecvenţă
i 1

2
cumulată este prima mai mare decât locul medianei iar valoarea
medianei se calculează după formula:
p
( ni )  1 M e 1
i 1

2
 n i
M e  x0  h  i 1

n Me
unde:
x0 - reprezintă limita inferioară a intervalului median;
h - reprezintă mărimea intervalului median;
M e - reprezintă indexul intervalului median;
M e 1

n
i 1
i - reprezintă suma frecvenţelor precedente intervalului median

(frecvenţa cumulată a intervalului precedent celui median)


n M - frecvenţa absolută a intervalului median.
e

Observaţii:
1. Mediile de poziţie (structură) sunt valorile care împart seria în părţi egale;
2. În acest sens, mediana este şi indicator al tendinţei centrale şi medie de
poziţie.

Cuartilele sunt acele valori ale caracteristicii, care separă seria în


patru părţi egale şi formula medianei se adaptează la poziţia cuartilelor:
Q 1
1 p
[( ni )  1]   ni
1

4 i 1
Q1  x0  h i 1

nQ 1

unde:
Capitolul 2. Analiza Datelor - metode statistice de analiză 11

nQ - este frecvenţa absolută a intervalului care conţine Q1


1

Q2  M e
nQ3 1
3 p
[(  n i )  1]  n i
4 i 1
Q3  x 0  h i 1

nQ 3

unde nQ - este frecvenţa absolută a intervalului care conţine Q3 .


3

Decilele divid seria în zece părţi egale, folosind în acest scop nouă
decile:
D 1
1 p
[( ni )  1]   ni
1

10 i 1
D1  x0  h i 1

nD 1

unde:
nD - este frecvenţa absolută a intervalului care conţine D1
1

……………………………
D5  M e
……………………………
D 1
9 p
[(  n i )  1]   n i
9

10 i 1
D9  x0  h i 1

nD 9

unde nD este frecvenţa absolută a intervalului care conţine D9 .


9

- Indicatorii variaţiei

 Indicatorii simpli ai variaţiei

Amplitudinea absolută ( Aa ):

Aa  x L  xl
unde:
xL - reprezintă limita superioară a ultimului interval
xl - reprezintă limita inferioară a primului interval

Amplitudinea relativă a variaţiei ( A% ):

Aa
A%  100
x
12 Analiza Datelor. Teorie şi aplicaţii

 Indicatorii sintetici ai variaţiei

Abaterea medie liniară (d ) :

x i  x ni
Calculul cu frecvenţe absolute: d  i 1
p

n
i 1
i

p
Calculul cu frecvenţe relative: d   xi  x ni* sau
i 1

x i  x n * i (%)
d  i 1

100

Abaterea medie pătratică sau abaterea standard ( ) :


-
p

 (x i  x ) 2 ni
- Calculul cu frecvenţe absolute:   i 1
p

n i 1
i

p
- Calculul cu frecvenţe relative:    (x
i 1
i  x ) 2 ni* sau

 (x i  x ) 2 ni (%)
-  i 1

100

Observaţie: Cei doi indicatori verifică relaţia:   d

 d
Coeficientul de variaţie (v): v  100 respectiv v  100
x x

Alte formule de calcul:


Capitolul 2. Analiza Datelor - metode statistice de analiză 13

dM M dM M
v e
 100; v  e
 100; v  o
 100; v  o
 100 .
Me Me Mo Mo

Dispersia (varianţa) ( 2 ) :
p

 (x i  x ) 2 ni
- Calculul cu frecvenţe absolute:   2 i 1
p

n i 1
i

p
- Calculul cu frecvenţe relative:  2   ( xi  x ) 2 n * i sau
i 1
p

 (x i  x ) 2 ni* (%)
2  i 1

100

- Ca moment centrat de ordinul doi

- Calculul cu frecvenţe absolute:


2
p
 p 
 x ni   xi ni
i
2

-  2
 i  1p   i 1p 
 
i 1
ni   ni
 i 1

- Calculul cu frecvenţe relative:


2
p
 p 
p
 p

2 x 2
i n *
i (%)   xi ni*(%) 
-  2   x 2 i ni*    xi ni*  sau  2  i 1
  i 1 
i 1  i 1  100  100 
 
 
Prin formula de calcul simplificat

Pentru o serie de frecvenţe absolute:

2
 xi  a 
p

 
i 1  h 
 ni
 
2
k
 h 2  ( x  a) 2
 ni i 1

Pentru o serie cu frecvenţe relative:


14 Analiza Datelor. Teorie şi aplicaţii

2
p
 xi  a  * 2
 2    ni  h  ( x  a ) 2 sau
i 1  h 

2
p
 xi  a  *
 
i 1  h 
 ni (%)
 
2
 h 2  ( x  a) 2
100

Observaţie: a şi h au aceleaşi semnificaţii ca la calculul mediei aritmetice.

Corecţia lui Sheppard:

h2
( 2 )   2 
12

unde h este mărimea intervalului de grupare.

Observaţie: Această corecţie se aplică numai pentru seriile care prezintă


următoarele proprietăţi:
- repartiţia este normală sau uşor asimetrică;
- repartiţia are intervale de grupare egale.

 Variaţia intercuartilică şi interdecilică

Abaterea intercuatilică ( Qd ):

( M e  Q1 )  (Q3  M e ) Q3  Q1
Qd  
2 2

Coeficientul de variaţie intercuartilică ( Vq ):

Q3  Q1
Q 2 Q  Q1
Vq  d   3
Me Me 2M e

Abaterea interdecilică:

( M e  D1 )  ( D9  M e ) D9  D1
Dd  
2 2

Coeficientul de variaţie interdecilică:


Capitolul 2. Analiza Datelor - metode statistice de analiză 15

D9  D1
D 2 D  D1
Vd  d   9
Me Me 2M e e

- Media şi dispersia caracteristicii alternative

Distribuţia de frecvenţe a caracteristicii alternative se prezintă într-un tabel


de forma:
Răspunsul Valoarea Frecvenţe absolute Frecvenţe relative
înregistrat caracteristicii
1 0 2 3
M (numărul unităţilor care M
DA x1  1 posedă caracteristica) p
N
(N  M ) N M
q  1 p
NU x2  0 (numărul de unităţi care nu N
posedă caracteristica)
Total N  M  (N  M ) p  q 1
Tabelul 2.1. Distribuţia de frecvenţe a caracteristicii alternative

Notă: M - reprezintă numărul unităţilor care posedă caracteristica;


N - reprezintă numărul de unităţi care nu posedă caracteristica.

Media caracteristicii alternative:

M
p
N

Media reprezintă frecvenţa relativă (proporţia) a unităţilor


la care care s-a înregistrat forma directă de manifestare a
caracteristicii.

Dispersia:

σ 2p  p  q sau σ 2p  p  ( 1  p)

Abaterea medie pătratică:

 p  pq

- Asimetria
16 Analiza Datelor. Teorie şi aplicaţii

Asimetria absolută ( AS )

AS  x  M o

Coeficieţii de asimetrie propuşi de Karl Pearson (pentru serii de distribuţie


uşor asimetrice):
C as  0  serie simetrică
x  Mo 
C as  C as  0  serie oblică la stânga
 
C as  0  serie oblică la dreapta

Observaţii:
1. Acest coeficient poate lua valori cuprinse între -1 şi +1; cu cât este mai mic
în valoare absolută cu atât asimetria este mai mică;
2. În cazul când se cunoaşte mediana seriei, coeficientul de asimetrie (C as )
se poate calcula utilizând relaţia:

3( x  M e )
C as 

Pearson mai propune şi un alt coeficient pentru calculul gradului de


asimetrie al unei serii formată dintr-un număr foarte mare de observaţii, pornind de
la relaţiile existente între momentele centrate de diferite ordine:

 3 
 ( x i  x ) 3 ni
2 
C as  33 unde 
 ni
2     ( x i  x ) ni   2
2


 ni
2

Coeficientul propus de Yule:

(Q3  M e )  ( M e  Q1 )
C asY 
(Q3  M e )  ( M e  Q1 )

unde C asY   1,1

Coeficientul propus de Bowley:

( D9  M e )  ( M e  D1 )
C asB 
( D9  M e )  ( M e  D1 )
Capitolul 2. Analiza Datelor - metode statistice de analiză 17

unde C asB   1,1

- Indicatorii concentrării

Coeficientul de concentrare propus de statisticianul italian Corado


Gini:

CG  g 2
i , pentru i  1, k
unde:
xi ni xi ni
gi  sau g i (%)   100
p p
 xi ni  xi ni
i 1 i 1

 1 
Acest coeficient ia valori în intervalul  ,1 .
 m 

Coeficientul de concentrare propus de R. Struck:

m g i2  1
CS 
m 1

Acest coeficient ia valori în intervalul 0,1 .

- Verificarea corespondenţei dintre repartiţiile teoretice şi cele empirice

La verificarea corespondenţei dintre repartiţiile teoretice şi cele empirice se


poate folosi criteriul  2 .
Criteriul  2 se poate aplica în analiza seriilor de distribuţie de frecvenţe cu
respectarea următoarelor condiţii:
- din cercetările anterioare, se cunoaşte că, de regulă, variabila
studiată prezintă în mod sistematic o tendinţă de distribuţie
normală a abaterilor.
Ca atare, se face ipoteza că distribuţia empirică urmează legea cu funcţia
de repartiţie:
x (xi  x )2
1 
F(x) 
σ 2π
e

2σ 2
dx

care în cazul distribuţiei normale normate ( x  0; 2  1) devine:


18 Analiza Datelor. Teorie şi aplicaţii

x z2
1 
F(x) 
2
e

2
dz

xi  x
în care z 

Deci probabilitatea de apariţie a unei abateri oarecare ( Pi ) va fi:

x x x x
Pi  F  i   F  i 1 
     

-volumul grupelor trebuie să fie suficient de mare ( ni  5 ).


-numărul grupelor la care se studiază variaţia frecvenţelor să fie de
asemenea cel puţin egal cu 5.
Etape de calcul:
(x  x)
1. Se calculează abaterile normale normate z i  i ;

2. Din tabelul funcţiei Laplace se determină  ( z i )
3. Pe baza relaţiei F ( x)  0,5   ( z ) rezultă că:

Pi  F ( xi )  F ( xi 1 )   ( z i )   ( z i 1 )
în care:
F ( xi ) - reprezintă valoarea funcţiei de repartiţie corespunzătoare limitei superioare
a intervalului de variaţie i;
F ( xi 1 ) - reprezintă valoarea funcţiei de repartiţie corespunzătoare limitei
superioare a intervalului precedent i  1 .
Pentru intervalele extreme, probabilităţile de apariţie se calculează astfel:

P1   ( z1 )  0,5; Pk  0,5   ( z k )

4. Aplicând probabilităţile astfel calculate la volumul total al seriei, m, se


determină frecvenţele teoretice mpi .
5. Se calculează abaterile dintre frecvenţele reale şi cele teoretice şi raportul
dintre pătratul acestor abateri şi frecvenţa teoretică:

( ni  mpi ) 2
(ni  mpi ) ;
mpi

6. Pentru interpretarea rezultatelor, se foloseşte relaţia:


Capitolul 2. Analiza Datelor - metode statistice de analiză 19

k
(ni  mpi ) 2
2  
i 1 mpi

7. Se compară  calculat
2
cu valoarea tabelară  tabelar
2
care depinde de nivelul de
semnificaţie ales (  ) şi de numărul gradelor de libertate [ l  p  ( r  l ) ]
unde:
p - reprezintă numărul de grupe;
r - reprezintă numărul parametrilor care definesc distribuţia ( r  2 ).
Dacă  2 calculat   2 tabelar , atunci se acceptă ipoteza că între distribuţia
empirică şi cea teoretică există concordanţă.

 Serii de distribuţie bidimensionale de frecvenţe

- Calculul cu frecvenţe absolute

O serie de distribuţie bidimensională se prezintă într-un tabel de forma:

Valorile Variantele sau valorile caracteristicii Volumul Medii pe


caracteristicii de dependente Y grupei grupe
grupare X y1 y2 … yj … yq ( ni  ) ( yi )
x1 n11 n12 ... n1 j … n1q n1 y1
x2 n21 n22 … n2 j … n2 q n 2 y2
... ... ... … ... … ... ... ...
xi ni1 ni 2 … nij … niq ni  yi
... ... ... … ... … ... ... ...
xp n p1 n p2 … n pj … n pq n p yp
Total n1 n 2 … n j … n q p q
y
n
i 1
i   n j
j 1

Tabelul 2.2. Reprezentarea seriei de distribuţie bidimensională


cu frecvenţe absolute

q
Volumul (frecvenţa) grupei i: n
j 1
ij  ni 

Mărimi medii

Mediile de grupă ( y x / x  yi ): i
20 Analiza Datelor. Teorie şi aplicaţii

y n
j 1
j ij

yi  q

n j 1
ij

Media pe total:
q p

 y j n j
j 1
yn i i
y q
sau y  i 1
p

n j 1
j n
i 1
i

Indicatorii variaţiei

Dispersia de grupă sau dispersia parţială ( y2 / x   i2 ) : i

(y j  y i ) 2 nij
 
i
2 i 1
q

n j 1
ij

unde:
y j - reprezintă varianta sau mijloacul intervalului j al caracteristicii dependente;
yi - reprezintă media grupei i;
nij - reprezintă frecvenţele corespunzătoare fiecărei variante (interval de valori) din
cadrul grupei.
Media dispersiilor de grupă ( 2   2 )
y/m
p

 i
2
ni
 2
y/m  
2 i 1
p

n i 1
i

unde:
 i2 - reprezintă dispersia grupei i;
ni - reprezintă volumul grupei i.
Observaţie: Dacă grupele sunt egale ca volum, media dispersiilor de grupă se
calculează ca medie simplă a dispesiilor parţiale.

Dispersia dintre grupe ( 2   2 ) :


y/ x
Capitolul 2. Analiza Datelor - metode statistice de analiză 21

(y i  y ) 2 ni 
 y2 / x   2  i 1
p

n
i 1
i

Dispersia totală ( 2   y2 ) :

(y
j 1
j  y ) 2 n j
 2   y2  q

n
j 1
j

Regula adunării dispersiilor:

 2   2   2 sau  2   y2 / x   y2 / m

Pe baza regulii de adunare a dispersiilor se pot calcula indicatori statistici


cu caracter de mărimi relative de structură:

Coeficientul de determinaţie ( R y2 / x ) :

2  y2 / x
R 2
 2 100 sau R y / x  2  100
2
y/x
 
Observaţie: Dacă R y / x  50% , admitem că factorul de grupare este hotărâtor
(semnificativ, determinant) pentru variaţia factorului determinat (Y).

Coeficientul de nedeterminaţie:

2  y2 / m
K y2 / x   100 sau K 2
  100
2 y/x
2

Abaterea medie pătratică la nivelul grupei:

 i   i2

Abaterea medie pătratică pe total:

  2
22 Analiza Datelor. Teorie şi aplicaţii

Coeficientul de variaţie la nivelul grupei:

i
vi  100
yi
unde:
 i - reprezintă abaterea medie pătratică a grupei;
yi - reprezintă media grupei

Coeficientul de variaţie pe total:


v 100
y
unde:
 - reprezintă abaterea medie pătratică pe total;
y - reprezintă media pe total

- Regula de adunare a dispersiilor pentru seriile cu frecvenţe relative

O serie de distribuţie bidimensională se prezintă într-un tabel de forma:


Valorile Total Ponderea
caracteristic Frecvenţe relative (%) grupă grupelor
ii de y1 y2 … yj … yq (%) după X
grupare X (ni (%) )
x1 n11 (%) n12 (%) ... n1j (%) … n1q (%) 100. n1(%)
x2 
n21 
n22 … n2 j (%) … n2q (%) 100 n2 (%)
(%) (%)

... ... ... … ... … ... ... ...


xi n 
n  … n  … n 
100 ni (%)
i1(%) i 2 (%) ij (%) iq (%)

... ... ... … ... … ... ... ...


xp n 
n  … n  … n 
100 n p (%)
p1(%) p 2 (%) pj (%) pq (%)

Total 100
Tabelul 2.3. Reprezentarea seriei de distribuţie bidimensională
cu frecvenţe relative

Mediile de grupă ( y i ):
Capitolul 2. Analiza Datelor - metode statistice de analiză 23

y n
j 1
j

ij (%)

yi 
100

Media pe total se calculează ca medie a mediilor


de grupă:
p

y n i i (%)
y i 1

100

Dispersia de grupă sau dispersia parţială ( i2 ) :

(y j  y i ) 2 nij (%)


 i2  i 1

100

Media dispersiilor de grupă ( 2   2 )


y/ p

 i
2
ni (%)
 2 i 1

100

Dispersia dintre grupe ( 2   2 ) :


y/ x
p

(y i  y ) 2 ni (%)
 y2 / x   2  i 1

100

Dispersia totală ( 2   y2 ) :

 2   y2   2   2
Capitolul 3
Metode de învăţare nesupervizată şi supervizată
(Analiza în Componente Principale-ACP)

Prof. dr. Stelian STANCU


3.1. Metode aplicate în analiza Data Mining

Fie matricea observaţiilor:


 x11 x12 ... x1j ... x1n 1 x1n 
 1 
 x2 x 22 ... x 2j ... x 2n 1 x 2n 
 ... ... ... ... ... ... ... 
 1 
X   xi xi2 ... xi j ... xin 1 xin 
 ... ... ... ... ... ... ... 
 1 2 j n 1 n

 x m 1 x m 1 ... x m 1 ... x m 1 x m 1 
 x1 x m2 ... x mj ... x mn 1 x mn 
 m
Obiectiv în Analiza Datelor - a reduce controlat dimensiunea matricei
observaţiilor(a găsi un număr mai mic de variabile care să explice „trăsăturile”
indivizilor).
Se poate apela la:
o metode nesupervizate(tehnici descriptive de analiză a datelor):
o Analiza în Componente Principale (ACP) - având ca scop
reducerea dimensionalităţii datelor iniţiale;
o Analiza factorială - având ca scop principal identificarea factorilor
latenţi şi asocierea de scoruri indivizilor;
o Analiza clasificării - ce are ca scop gruparea în clase cât mai
omogene, uneori de indivizi, alteori de variabile;
o Analiza coşului de piaţă - având ca scop determinarea grupelor de
produse care sunt achiziţionate împreună de către cumpărători.
o metode supervizate (metode explicative) de analiză a datelor, când în
matricea de date putem identifica;
o o variabilă dependentă sau variabilă explicată;
o variabile care o influenţează, numite variabile independente sau
variabile explicative.
Metode supervizate:
o Clasificarea prin arbori de regresie (CART) - are ca scop
obţinerea de submulţimi de date cât mai omogene în raport cu
variabila explicată.
Observaţie: O variabilă explicată poate fi continuă sau categorială.
o Detectarea automată a interacţiunilor (CHAID) - este o metodă
de clasificare folosită pentru a studia relaţiile dintre o variabilă
explicată de tip categorial şi o mulţime de variabile independente
ce pot interacţiona unele cu altele.
2 Analiza Datelor. Teorie şi aplicaţii

o Analiza discriminant - este o metodă de clasificare ce pune în


evidenţă acele variabile independente care discriminează cel mai
mult între două sau mai multe grupări formate natural.
Observaţie: Variabila explicată acceptată este de tip categorial, în timp ce
variabilele independente pot fi atât variabile continue cât şi variabile ordinale.
o Regresia liniară multiplă - prin care se descrie, printr-un model
liniar, legătura dintre variabila explicată şi variabilele
independente.
Observaţie: De regulă toate variabilele implicate sunt continue.
o Regresia logistică - este un model particular de regresie liniară
ce presupune că variabila explicată este binară sau ordinală.
o Folosirea reţelelor neurale - prin intermediul cărora se
modelează un fenomen complex cu multe variabile
independente şi multiple interacţiuni.
Observaţie: Variabilele explicate pot fi codificate ca variabile binare.
Sintetizând, putem afirma că este indicat a se aplica:
o tehnicile descriptive, nesupervizate, după etapa primară de
explorare a datelor matricei - toate au ca scop reducerea
controlată a dimensionalităţii matricei iniţiale.
o tehnicile explicative, supervizate, după natura variabilei
explicate şi a variabilelor independente.
Putem întâlni următoarele situaţii:
o variabila explicată este continuă şi toate variabilele
independente sunt de asemenea continue; pentru a estima
dependenţa dorită se folosesc tehnici de regresie (simplă sau
multiplă);
o variabila explicată este binară, iar variabilele independente
sunt variabile continue. În acest caz se apelează la regresia
logit;
o variabila explicată este nominală, iar variabilele independente
sunt continue. Se va apela, în general, la tehnici de
discriminare;
o variabila explicată este continuă, dar variabilele independente
sunt de tip categorial; se vor aplica tehnici de analiză a
varianţei;
o atât variabila explicată, cât şi variabilele independente sunt de
tip categorial. Vom folosi tehnici de analiză de tip „conjoint”
Tipul tehnicii Denumirea Variabila explicată Variabilele explicative
cantitativă calitativă cantitative calitative
Nesupervizată Analiza nu nu da -
(descriptivă) componentelor
principale (ACP)
Analiza factorială nu nu da -
Analiza nu nu da -
clasificării
Capitolul 3. Metode de învăţare nesupervizată şi supervizată(ACP) 3

Analiza nu nu - da
corespondenţelor
Supervizată Regresia liniară da - da -
(explicativă) simplă şi multiplă
Regresia logistică - da da -
ANOVA/ - da da -
MANOVA
Analiza - da da da
discriminării
Tehnica arborilor da da - da
de decizie
(CART)
Tehnica . da da -
CHAID
Analiza canonică da - da -
Tabelul 3.1. Clasificarea tehnicilor de analiză a datelor

3.2. Metode de învăţare nesupervizată

- au ca scop construirea unui model al datelor iniţiale în care toate


variabilele sunt tratate ca inputuri(independente), nefiind precizate variabile care au
rolul de output(dependente).

3.2.1. Analiza în Componente Principale (ACP)

Prezentarea teoretică a metodei ACP

ACP
oare ca obiectiv prezentarea sintetică a unui tabel de date în care
unităţile sunt descrise prin multiple variabile cantitative.
o la prima vedere, fiecare dintre variabilele măsurate ar putea
părea a fi de aceeaşi importanţă;
o reducerea numărului variabilelor iniţiale poate fi utilizată
pentru
 uşurarea interpretării
 poate servi ca fază intermediară de calcul prealabil în
utilizarea altor metode de analiză multidimensională.
Informaţia cu care participă un individ i în norul de puncte, poate fi
exprimată prin distanţa de la punctul ce-l reprezintă, până la centrul de greutate al
norului de puncte:
n
I i   ( x ij  x j ) 2 , cu i  1, m
j 1

unde:
4 Analiza Datelor. Teorie şi aplicaţii

1 m j
x j  g o, j   xi , cu j  1, n
m i 1
g o , j - reprezintă coordonata j a centroidului indivizilor în spaţiul variabilelor şi
este valoarea medie înregistrată de cei m indivizi pentru cea de-a j-a
variabilă;
xij - reprezintă coordonata celui de-al i-lea individ în raport cu cea de-a j-a axă a
spaţiului variabilelor, cu i  1, m , j  1, n .
Informaţia totală, I, aferentă celor m indivizi, în ipoteza că fiecare individ
are aceeaşi pondere, este suma pătratelor distanţelor, adică:
m n
I    ( x ij  x j ) 2
i 1 j 1

Problema ACP constă în a reduce cele n variabile inţiale la un număr de p


variabile, denumite componente principale sau factori, cu p  n .
- presupune trecerea de la o matrice de date de dimensiune
m  n de forma:
 x11 x12 ... x1j ... x1n 1 x1n 
 1 
 x2 x 22 ... x 2j ... x 2n 1 x 2n 
 ... ... ... ... ... ... ... 
 1 
X   xi xi 2
... x i j n 1
... x i x in 
 ... ... ... ... ... ... ... 
 1 2 j n 1 n

 x m 1 x m 1 ... x m 1 ... x m 1 x m 1 
 x1 x m2 ... x mj ... x mn 1 x mn 
 m
la o matrice redusă, de dimensiune m  p :
 w11 w12 ... w1j ... w1p 1 w1p 
 1 
 w2 w22 ... w2j ... w2p 1 w2p 
 ... ... ... ... ... ... ... 
 
W   wi1 wi2 ... wi j ... wip 1 wip 
 ... ... ... ... ... ... ... 
 1 
 wm 1 wm2 1 ... wmj 1 ... wmp 11 wmp 1 
 w1 wm2 ... wmj ... wmp 1 wmp 
 m
Pornind de la cele n variabile originale, reprezentate de elementele
mulţimii {x 1 , x 2 , x 3 ,..., x n } , esenţa metodei ACP poate fi reprezentată în mod
simplificat prin intermediul transformării următoare:
[ x 1 , x 2 , x 3 ,..., x n 1 , x n ] 

[ w1 , w 2 , w 3 ,..., w p 1 , w p ]
unde:
o {w1 , w 2 , w 3 ,..., w p 1 , w p } reprezintă mulţimea componentelor
principale;
Capitolul 3. Metode de învăţare nesupervizată şi supervizată(ACP) 5

o transformarea  asigură, prin intermediul componentelor


principale, conservarea variabilităţii din spaţiul cauzal iniţial
într-o proporţie maxim posibilă.
În figura 3.1 sunt evidenţiate două modalităţi de reprezentare a 12 obiecte
(indivizi):
o prima este cea originală, adică aceea în care obiectele sunt
reprezentate în coordonatele iniţiale, netransformate
;
o a doua este cea rezultată în urma reducerii dimensionalităţii.
În cadrul primei reprezentări, obiectele sunt considerate a fi puncte din
planul x 1Ox 2 , cele două coordonate ale fiecăruia dintre aceste puncte, măsurate pe
axele reprezentate de x1 şi x 2 , fiind evaluări ale celor două presupuse caracteristici.
Observaţie: Dezavantajul acestei reprezentări constă în faptul că rezoluţia acestor
obiecte de-a lungul axei este foarte mică.
x11 x12
x2
x7 x9 x10 w
x8
x6

x5
x4
x3

x2

x1

x1
Figura 3.1. Reducerea dimensionalităţii de la două axe x1 şi x 2 ,
la o singură axă w

Reducerea dimensionalităţii constă, în acest caz, în trecerea de la două


dimensiuni la o singură dimensiune.
Aceasta înseamnă trecerea de la reprezentarea în plan la reprezentarea
pe o dreaptă.
Noua variabilă w reprezintă o componentă principală..

Definirea componentelor principale

Componentele principale sunt variabile noi al căror conţinut informaţional,


6 Analiza Datelor. Teorie şi aplicaţii

preluat în exclusivitate de la variabilele originale, este definit, mai ales, în


raport cu legăturile care există între variabilele originale.
Definiţia 3.1. Se numesc componentele principale, acele variabile vectoriale
abstracte, definite sub forma unor combinaţii liniare de variabilele originale şi care
au următoarele proprietăţi fundamentale:
o sunt necorelate două câte două;
o suma pătratelor coeficienţilor care definesc combinaţia liniară ce
corespunde unei componente principale este egală cu unitatea;
o prima componentă principală este o combinaţie liniară normalizată
a cărei varianţă este maximă;
o cea de-a doua componentă principală este o combinaţie liniară
necorelată cu prima componentă principală şi care are o varianţă
cât mai mare posibilă, însă mai mică decât cea a primei
componente;
o etc.
Observaţii:
1. Coeficienţii combinaţiilor liniare ce definesc componentele principale,
priviţi sub formă vectorială, alcătuiesc un sistem ortonormal;
2. Componentele principale sunt vectori ortogonali care preiau cât mai mult
din varianţa variabilelor vector originale astfel:
o prima componentă principală preia maximul posibil din varianţa
variabilelor originale;
o a doua componentă principală preia maximul din varianţa rămasă
după ce este eliminată varianţa preluată de prima componentă;
o ş.a.m.d.

Caracteristici ale componentelor principale

Din punct de vedere geometric, componentele principale definesc un nou


spaţiu al obiectelor, în contextul căruia sunt verificate următoarele proprietăţi
relevante pentru definirea analizei componentelor principale:
o axele noului spaţiu definesc noile variabile numite componente
principale şi sunt ortogonale două câte două;
o coordonatele indivizilor (obiectelor) din noul spaţiu, adică
proiecţiile indivizilor pe axele acestuia, sunt evaluări1 ale
indivizilor în raport cu noile variabile;
o numărul de componente principale este egal cu numărul de
variabile originale;
o nu toate componentele principale au o semnificaţie informaţională
considerabilă, astfel că cele mai puţin semnificative din punct de
vedere informaţional sunt eliminate;

1
Se numesc şi scoruri ale componentelor principale sau scoruri principale.
Capitolul 3. Metode de învăţare nesupervizată şi supervizată(ACP) 7

o componentele principale sunt combinaţii liniare de varianţă


maximă ale variabilelor originale;
o componentele principale sunt scalate în funcţie de magnitudinea
varianţei acestora, prima fiind componenta principală cu varianţă
maximă, iar ultima fiind componenta principală cu varianţă
minimă;
o componentele principale sunt necorelate două câte două;
o suma varianţelor componentelor principale coincide cu suma
varianţelor variabilelor originale2;
Analiza componentelor principale este deci o metodă de reexprimare a
variabilelor originale sub forma unui număr mai mic de noi variabile3, numite
componente principale, care sunt combinaţii liniare de varianţă maximă ale
variabilelor originale.
Cu ajutorul componentelor principale se poate defini o structură a dependenţei
dintre variabilele originale, mai simplă şi mai clară, deci mai uşor de interpretat.

Prezentarea tehnică a metodei ACP

Tehnica utilizată de ACP, pentru a trece de la n la p variabilele, cu p  n ,


constă în a proiecta norul de puncte pe un subspatiu de dimensiunea p, R p , printr-o
deformare minimă posibilă, respectiv, pierderea de informaţie să fie cât mai mică.
Definiţia 3.1. Se numeşte analiză în componentelor principale (ACP) acea
metodă de analiză multidimensională care are ca scop determinarea unor noi
variabile, numite componente principale, ce sunt exprimate sub forma
combinaţiilor liniare ale variabilelor originale, astfel încât aceste variabile noi să fie
caracterizate de o variabilitate maximă.

Maximizarea varianţei, transformării coordonatelor obiectelor şi rotaţia


axelor

Logica analizei componentelor principale se bazează pe ideea fundamentală


că se pot face anumite transformări4 asupra observaţiilor iniţiale, care să determine
maximizarea varianţei individuale pentru anumite variabile şi minimizarea varianţei
pentru alte variabile. Aceasta conduce la creşterea contribuţiei la formarea varianţei
totale a variabilelor a căror varianţă este maximizată.

2
Componentele principale preiau în totalitate variabilitatea conţinută în variabilele
originale.
3
În cazul în care numărul de componente principale este egal cu numărul variabilelor
originale, putem privi ACP ca o metodă de rotaţie, de regulă ortogonală, a axelor spaţiului
iniţial, semnificaţia fiecărei noi axe fiind măsurată prin varianţa asociată unei componente
principale.
4
Transformările care asigură maximizarea varianţelor individuale ale unor variabile sunt
acele transformări de coordonate corespunzătoare efectuării unor rotaţii ortogonale ale
axelor originale.
8 Analiza Datelor. Teorie şi aplicaţii

Pentru a evidenţia modul în care pot fi deduse componentele principale,


adică noile variabile care au proprietatea de a conserva variabilitatea ce
caracterizează spaţiul cauzal iniţial şi care sunt necorelate, se va proceda la rotaţii
succesive ale celor două axe iniţiale, măsurând varianţa ce caracterizează cele două
variabile pentru fiecare poziţie modificată prin rotaţie a sistemului de axe.
Ca urmare a faptului că sistemul de axe este rotit cu un anumit număr de
grade, coordonatele celor două variabile se modifică în mod corespunzător, astfel
încât, reprezentarea observaţiilor în noile coordonate este diferită.
Exemplu: Considerând că în sistemul iniţial de axe punctul reprezentat de cea de-a
 -a observaţie are coordonatele ( x 1 , x 2 ) , atunci rotaţia axelor cu un anumit unghi
 , va determina o modificare a coordonatelor acestui punct, respectiv a valorilor
celor două observaţii, astfel încât noile coordonate ale punctului ( x 1 , x 2 ) , notate
cu ( x 1 , x 2 ) , sunt date de relaţiile următoare:
x 1  x 1 cos   x 2 sin 
x 2   x 1 sin   x 2 cos 
Fie o direcţie W în spaţiu, ce poate fi exprimată prin vectorul u: u  (u1 , u 2 ,...., u n )
Considerând dreapta ce trece prin centrul de greutate şi are această
direcţie, se va proiecta fiecare punct al norului pe această dreaptă.
Notând cu wi lungimea segmentului ce uneşte proiecţia punctului cu
centrul de greutate, avem; wi  xi1u1  xi2u 2  ....  xin1un1  xinun
m
Informaţia totală reţinută de aceste proiecţii este: I u   wi2
i 1

Scopul metodei ACP constă în determinarea acelor direcţii ce maximizează


informaţia totală reţinută, respectiv (maximizare în raport cu u):
m
max I u  max  ( xi1u1  xi2u2  ....  xin1un1  xin un ) 2
i 1

pe restricţia:
u12  u 22  ...  u n21  u n2  1
În aceste condiţii, problema determinării componentelor vectorului u k ce
definesc combinaţia liniară reprezentând componenta principală wk , se reduce la
rezolvarea următoarei probleme de extrem cu legături:
[max]{u k Vu kt }
 u k

pe restrictia :
u u t  1
 k k
şi are următoarea rezolvare:
Pasul 1. Fiind o problemă clasică de extrem cu legături, se construieşte
lagrangeanul problemei: L(u k ,  )  u k Vu kt   1  u k u kt  .
Capitolul 3. Metode de învăţare nesupervizată şi supervizată(ACP) 9

Pasul 2. Condiţiile necesare de optim (CNO):


 L()
 u  0 2Vu k  2u k  0

k
sau echivalent: 
u k u k  1
t
 L()  0
 
Pasul 3: Condiţia suficientă de optim este ca diferenţiala totală de ordinul 2 a
lagrangeanului în punctul u k să fie negativă5.

Schema logică a ACP

Procedeul de rezolvare a ACP este prezentat în figura 3.2.

Matricea datelor iniţiale, X m n

Calculul matricei de varianţă-


covarianţă, V nn , sau a matricei
de corelaţie, R

Extragerea axelor factoriale


(vectorii proprii ai lui V sau R)

Alegerea celor k axe principale

Calculul coordonatelor Calculul corelaţiilor între axele


unităţilor pe axele principale principale şi variabilele iniţiale

Figura 3.2. Schema metodei ACP

5
Sau abordarea cu matricea Hessian.
10 Analiza Datelor. Teorie şi aplicaţii

Observaţii:
1. Cea mai uzuală metodă de alegere a numărului de axe este cea a calculării
varianţei explicite adusă de fiecare axă şi determinarea celei cumulate:
1
Vexp ( w1 )  n


k 1
k

1   2
Vexp ( w1 , w2 )  n


k 1
k

....
Astfel, se poate fixa un prag minim pentru varianţa explicită cumulată,
de exemplu, să fie în jur de 80%.
În momentul în care acest prag este atins se consideră că sunt suficiente
axele reţinute.
2. Este foarte important să poată fi interpretate axele factoriale. Pentru aceasta
este necesar să se revină la variabilele iniţiale. Astfel vom determina
importanţa variabilei iniţiale în formarea factorilor, calculând coeficienţii
de corelaţie dintre variabilele iniţiale şi axele factoriale (componentele
principale):
k
rx w 
j u kj
k
S 2j
Algoritmul de construire a componentelor principale este, în esenţă, următorul:
Pasul 1. Se construieşte matricea datelor iniţiale, X m n ce conţine valorile
variabilelor relativ la indivizii supuşi observării, specificate printr-o matrice cu m
linii şi n coloane:
 x11 x12 ... x1j ... x1n 1 x1n 
 1 
 x2 x 22 ... x 2j ... x 2n 1 x 2n 
 ... ... ... ... ... ... ... 
 1 
X  [ x , x , x ,..., x , x ]   x i
1 2 3 n 1 n
xi 2
... x i j n 1
... x i x in 
 ... ... ... ... ... ... ... 
 1 2 j n 1 n

 x m 1 x m 1 ... x m 1 ... x m 1 x m 1 
 x1 x m2 ... x mj ... x mn 1 x mn 
 m
Pasul 2. Se verifică dacă datele din matricea X m n sunt omogene.
Discuţie:
o dacă DA, atunci:
Pasul 2.1. Se calculează matricea de varianţă-covarianţă, V nn ,
având ca element general v jl , covarianţa dintre variabilele j şi l, cu
j  l , iar elementele de pe diagonala principală sunt varianţele v jj
ale diferitelor variabile, adică:
Capitolul 3. Metode de învăţare nesupervizată şi supervizată(ACP) 11

 v11 v12 ... v1n 


v v 22 ... v 2 n 
V   21
 ... ... ... ... 
 
v n1 vn2 ... v nn 

vtot  v11  v 22  ...  v nn - urma matricei V, este egală cu varianţa


totală a norului de puncte ce exprimă informaţia totală, I.
o dacă NU, atunci:
Pasul 2.2. Se parcurg următoarele etape:
Etapa 1. Se centrează şi eventual se reduc datele din
matricea datelor iniţiale, X m n . Se obţine noua
matrice X m  n .
Etapa 2. Se calculează matricea de corelaţie, R, unde r jl
reprezintă coeficientul, de corelaţie dintre
variabilele j şi l, cu j  l , iar elementele de pe
diagonala principală sunt egale cu 1. În acest caz,
suma elementelor de pe diagonala principală este
egală cu n, respectiv numărul de variabile:
 1 r12 ... r1n 
r 1 ... r2 n 
R
21
.
 ... ... ... ... 
 
 rn1 rn 2 ... 1 
Pasul 3. Se extrag axele factoriale (vectorii proprii la dreapta) astfel:
Etapa 3.1. Se determină valorilor proprii ale matricei V sau R, ce sunt
soluţii ale ecuaţiei:
det(V  E )  0 , în cazul datelor iniţiale omogene;
sau
det( R  E )  0 , în cazul datelor iniţiale omogene;
unde E este matricea unitate, iar  este vectorul propriu.
Etapa 3.2. Se ordonează valorile proprii în ordine descrescătoare şi se
renotează, astfel încât să avem:
1   2  3 ...   n .
Etapa 3.3. Se determină axele factoriale (vectorii proprii la dreapta) u k
asociaţi valorilor proprii  k , din rezolvarea ecuaţiei:
V  u k   k  u k , în cazul datelor iniţiale omogene;
sau
R  u k   k  u k , în cazul datelor iniţiale omogene;
12 Analiza Datelor. Teorie şi aplicaţii

unde k este indicele pentru valori proprii distincte, spre exemplificare6


k  1, p , cu p  n .
Se obţine matricea U a vectorilor proprii la dreapta ai matricei de
covarianţă V, respectiv ai matricei de corelaţie, R, corespunzători valorilor proprii
menţionate anterior, sub forma liniilor matricei următoare:

u1  u11 ... u1n 


u12
  
u u ... u 2 n 
u 22
U   2    21
 ...   ... ... ... 
...
   
u n  u n1 ... u nn 
u n2
Observaţie: Cei p vectori proprii sunt de lungime egală cu unitatea şi sunt
ortogonali doi câte doi, astfel încât matricea U este ortogonală7.
Pasul 4. Se determină numărul şi care sunt axe factoriale reţinute, astfel:
Etapa 4.1. Se calculează factori sintetici wk , ca o combinaţie liniară a
variabilelor descriptive iniţiale [ x 1 , x 2 , x 3 ,..., x n 1 , x n ] , de forma:
n
wk   u kj x j , cu k  1, n
j 1

Etapa 4.2. Se aleg doar factorii sintetici wk ce sunt independenţi, adică:


cor ( wk , wl )  0 , cu k  l , k , l  1, n
Etapa 4.3. Se calculează varianţa explicită adusă de fiecare axă şi se
determină cea cumulată:
1
Vexp ( w1 )  n


k 1
k

1   2
Vexp ( w1 , w2 )  n


k 1
k

....
Observaţie: Suma celor n valori proprii, reprezentând varianţele celor n
componente principale, este egală cu suma varianţelor variabilelor originale, adică:
n n

S
j 1
2
j   k
k 1

Etapa 4.4. Se fixează un prag minim pentru varianţa explicită cumulată, de


exemplu 80%.
Etapa 4.5. Dacă varianţa explicită cumulată a atins acest prag, se consideră

6
În continuare, se prezintă cazul p  n .
7
Adică U  U t  E p .
Capitolul 3. Metode de învăţare nesupervizată şi supervizată(ACP) 13

ca fiind suficiente axele reţinute.

Principii de alegere a numarul de componente principale

1. Criteriul lui Kaiser - Cunoscând că dispesia variabilelor inițiale


după standardizare devine 1, se vor pastra doar acele componente principale
care conțin o cantitate informațională mai mare, deci acele componente care au
valoarea disperiei mai mare decât 1

2. Criteriul procentului de acoperire presupune păstrarea doar a


acelor componente principale a căror varianța cumulată reprezintă mai mult de
70-80% din varianța totală.

3. Criteriul pantei presupune că din reprezentarea grafică a valorilor proprii se


alege un număr de componente principale egal cu numărul valorilor proprii
aflate pe segmentul cu panta cea mai mare.

Matricea vectorilor proprii este utilă nu doar în construirea matricea


scorurilor principale, ci și în determinarea semnificației componentelor
principale păstrate. Acest fapt poate fi realizat doar când variabilele sunt
standardizate iar varianța variabilelor este egală cu unitate

Figura 15. Grafic valori proprii


14 Analiza Datelor. Teorie şi aplicaţii

Domenii de aplicare a ACP

Există numeroase situaţii concrete în care se doreşte obţinerea unor


informaţii cu caracter mai special, care să evidenţieze profunzimea şi subtilitatea
interdependenţelor existente la nivelul unei realităţi oarecare.
Aceste situaţii conduc, în mod inevitabil, la necesitatea utilizării tehnicilor
specifice ACP, menţionând următoarele exemple:
o determinarea forţei financiare a unei firme;
o identificarea unor tipologii socio-culturale, specifice unor
zone geografice;
o informaţii de natură socială şi culturală;
o activitatea de control al calităţii producţiei;
o în modelele în care variabilele independente sunt afectate de
fenomenul de colinearitate; caz în care variabilele originale sunt
substituite cu variabile noi, necorelate, cum ar fi componentele
principale.
Analiza datelor, indiferent dacă respectivele date sunt de natură economică,
socială, medicală, biologică sau tehnică, reprezintă domeniul predilect al utilizării
analizei componentelor principale.
Utilizarea ACP în analiza datelor are loc:
o în sens individual, ca tehnică independentă de analiză a datelor;
o împreună, în complementaritate, cu alte metode şi tehnici de
analiză.
ACP este folosită în probleme de analiză a datelor:
o în faza iniţială a acestora, ca tehnică de analiză preliminară;
o în fazele ulterioare ale acestor analize, în special în faza de
interpretare a rezultatelor;
şi anume în:
o analiza preliminară a datelor;
o construirea modelelor matematice;
o soluţionarea problemelor de analiză factorială;
o scalarea multidimensională;
o recunoaşterea formelor;
o analiza grafică;
o prezentarea şi interpretarea rezultatelor.
 
 

 
 
 
 
 
 
 
Capitolul 3_ACP_Aplicație
Analiza în componente principale (ACP), utilizând mediul R

Prof. dr. Stelian STANCU

3.1. Analiza în Componente Principale (ACP)

3.1.1. Introducere

Analiza în Componente Principale (ACP):


- este o metodă de învățare nesupervizată/nesupravegheată, ce
presupune reducerea dimensionalității setului de date, permițând ca
prin folosirea a cât mai puține variabile să se păstreze cea mai mare
parte a variabilității datelor;
- scopul metodei este de a explica cea mai mare parte a variabilității
datelor cu un număr cât mai mic de variabile, comparativ cu setul
inițial de date;
- fiecare dintre cele m observații/indivizi coexistă în spațiul n-
dimensional al variabilelor/caracteristicilor, dar nu toate aceste n
dimensiuni sunt la fel de importante;
- caută astfel un număr cât mai mic de dimensiuni/variabile importante,
unde conceptul de important este măsurat de cantitatea de variație pe
care observațiile o dezvoltă de-a lungul fiecărei dimensiuni/variabile;
- fiecare dintre dimensiunile/variabilele găsite prin metoda ACP este o
combinație liniară a celor n caracteristici/variabile inițiale.

Date cantitative ACP/PCA

Simplă
(2 variabile)
Date multivariate Analiza de
(tipuri de date) Date calitative corespondență
Multiplă
(mai mult
Analiza factorială de 2
simplă variabile)
Date mixte (2 variabile)

Analiza factorială
multiplă(mai mult
de 2 variabile)

Figura 3.1. Metoda ACP în contextul datelor multivariate


2 Data Science în mediul R - teorie şi aplicaţii

3.1.2. Încărcarea pachetelor de bază, necesare suplimentar în mediul R

Pentru început, încărcăm în R următoarele pachete, cu librăriile aferente:


# Pachetul necesar pentru prelucrarea și vizualizarea datelor
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
# Pentru reprezentarea grafică în extenso
install.packages("gridExtra", dependencies = TRUE)
library(gridExtra)
# Pentru reprezentarea grafică
install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Alte pachete ajutătoare
install.packages("devtools", dependencies = TRUE)
library(devtools)
# Pentru analiza datelor multivariate și vizualizarea datelor
install.packages("factoextra", dependencies = TRUE)
library(factoextra)
install.packages("FactoMineR", dependencies = TRUE)
library(FactoMineR)
install.packages("ade4", dependencies = TRUE)
library(ade4)
install.packages("ExPosition", dependencies = TRUE)
library(ExPosition)
install.packages("prettyGraphs", dependencies = TRUE)
library(prettyGraphs)
install.packages("corrplot", dependencies = TRUE)
library(corrplot)

3.1.3. Pregătirea datelor

-datele trebuie să fie pregătite după cum urmează:


 rândurile trebuie să fie observații/obiecte/indivizi, în timp
ce coloanele trebuie să fie variabile/caracteristici/însușiri;
În continuare18, încărcăm în R fișierul productia, așa cum se specifică
în Exemplul 3.0, din Capitolul 3:
productia <- read.table ("productia.txt", header = TRUE)
print(productia)
munca capital pamant productie
1 80 20 8 400
2 100 10 12 300
3 60 30 12 300
4 20 15 9 200
5 40 18 15 460
6 110 14 12 600
7 70 24 10 500
8 90 29 20 570

18
În continuare, în toate abordările, vom folosi acest set de date suplu, pentru a permite și
calculul de mână al pașilor de abordare, permițând astfel compararea datelor obținute cu
cele din mediul R.
Capitolul 3. Analiza în componente principale, utilizând mediul R 3

9 120 19 18 800
10 40 31 14 200
Pentru a studia variația fiecărei variabile, putem calcula:
- fie varianța/dispersia la nivelul fiecărei variabile:
# Calculul varianței la nivelul fiecărei variabile
apply(productia, 2, var)
munca capital pamant productie
1090.00000 52.66667 14.66667 36978.88889
- fie abaterea standard la nivelul fiecărei variabile:
# Calculul abaterii standard la nivelul fiecărei variabile
apply(productia, 2, sd)
munca capital pamant productie
33.015148 7.257180 3.829708 192.298957
- orice valoare lipsă din date trebuie eliminată sau estimată;
Pentru a elimina orice valoare lipsă, care ar putea fi prezentă în date,
se apelează la comanda R:
productia <- na.omit(productia)
datele trebuie a fi standardizate19(scalate) pentru a putea face
-
variabilele comparabile. Pentru standardizarea datelor se va folosi
funcția scale(). Se vor normaliza datele, utilizând metoda de
normalizare min-max.
Scriptul R pentru scalarea datelor, utilizând metoda min-max, este după
cum urmează:
max = apply(productia, 2 , max)
min = apply(productia, 2 , min)
productia_scalata=as.data.frame(scale(productia,center=min,
scale=max-min))
productia_scalata
munca capital pamant productie
1 0.6 0.4761905 0.00000000 0.3333333
2 0.8 0.0000000 0.33333333 0.6666667
3 0.4 0.9523810 0.33333333 0.1666667
4 0.0 0.2380952 0.08333333 0.0000000
5 0.2 0.3809524 0.58333333 0.4333333
6 0.9 0.1904762 0.33333333 0.6666667
7 0.5 0.6666667 0.16666667 0.5000000
8 0.7 0.9047619 1.00000000 0.6166667
9 1.0 0.4285714 0.83333333 1.0000000
10 0.2 1.0000000 0.50000000 0.0000000
Standardizarea fiecărei variabile, va rezolva această problemă.
# Crearea unui nou dataframe cu variabilele centrate
productia_centrata <- apply(productia, 2, scale)
productia_centrata
munca capital pamant productie
[1,] 0.21202389 -0.1377946 -1.3055824 -0.32761488
[2,] 0.81780642 -1.5157402 -0.2611165 0.71243236
[3,] -0.39375865 1.2401511 -0.2611165 -0.84763850
[4,] -1.60532371 -0.8267674 -1.0444659 -1.36766212
[5,] -0.99954118 -0.4133837 0.5222330 -0.01560071
[6,] 1.12069769 -0.9645619 -0.2611165 0.71243236

19
De regulă, standardizarea constă în transformarea variabilelor astfel încât acestea să aibă
media zero și abaterea standard unu(adică o distribuție normală a datelor).

 
4 Data Science în mediul R - teorie şi aplicaţii

[7,] -0.09086738 0.4133837 -0.7833495 0.19240874


[8,] 0.51491515 1.1023565 1.8278154 0.55642527
[9,] 1.42358895 -0.2755891 1.3055824 1.75247960
[10,] -0.99954118 1.3779456 0.2611165 -1.36766212
Observație: Există situații în care scalarea nu este de dorit, îndeosebi atunci când
toate variabilele au aceeași unitate de măsură și se dorește să se surprindă și
diferența de varianță.

3.2. Metoda ACP/PCA propriu-zisă

3.2.1. Valori proprii/vectori proprii/varianțe

Valorile proprii măsoară cantitatea de variație reținută de fiecare


componentă principală. Valorile proprii sunt mari pentru primele componente
principale și mici pentru componente principale ulterioare.
Valorile proprii și proporția de variație (adică de informație) păstrată de
componentele principale pot fi extrase folosind funcția get_eigenvalue(),
pachetul factoextra, astfel:
# Se instalează pachetul factorextra
install.packages("factoextra", dependencies = TRUE)
library("factoextra")
valori_proprii <-get_eigenvalue(pca_rezultate) sau varianta scurtă
valori_proprii <-get_eig(pca_rezultate)
valori_proprii
eigenvalue variance.percent cumulative.variance.percent
Dim.1 2.2472802 56.182005 56.18201
Dim.2 1.3079979 32.699948 88.88195
Dim.3 0.3865774 9.664435 98.54639
Dim.4 0.0581445 1.453612 100.00000
Proporția de variație explicată de fiecare valoare proprie este dată în a 3-a coloană.
De exemplu, 56.18% din variație este explicat de această primă valoare.
Procentul cumulat explicat este obținut prin adăugarea proporțiilor succesive de
variație explicată. De exemplu, 56.18% plus 32.70% echivalează cu 88.88%, și așa
mai departe. Prin urmare, aproximativ 98.54% din variație este explicată de
primele 3 valori proprii împreună și raționamentul poate continua.
Valorile proprii pot fi utilizate pentru a determina numărul de componente
principale ce trebuie folosite la nivelul metodei ACP (Kaiser 1961), astfel:
- o valoare proprie mai mare ca 1 indică faptul că PC-urile
(componentele principale) reprezintă mai multă variație decât
cea prezentată de una dintre variabilele originale din datele
standardizate. Acesta este utilizat în mod obișnuit ca punct de
tăietură care marchează alegerea numărului optim de componente
principale;
Observație: Acest lucru este valabil numai atunci când datele sunt standardizate.
- numărul de componente principale poate fi limitat la acel număr care
reprezintă o anumită fracțiune a variației totale. De exemplu, dacă se
stabilește ca variația totală explicată să fie de 80%, atunci se poate
Capitolul 3. Analiza în componente principale, utilizând mediul R 5

utiliza numărul de componente principale ce realizează acest


obiectiv.

3.2.2. Prezenarea metodei ACP/PCA

Pentru a calcula componentele principale dintr-o matrice informațională de date:


- se utilizează funcția cov(), pentru a calcula matricea de covarianță;
- se aplică comanda eigen, pentru a calcula valorile proprii ale
matricei obținute (eigen produce un obiect care conține atât
valorile proprii ($values), cât și matricea eigenvectorului
corespunzător ($vectors)).
# Calcularea de eigenvalues & eigenvectors
productia.cov <- cov(productia_centrata)
productia.eigen <- eigen(productia.cov)
str(productia.eigen)
# List of 2
# $ values : num [1:4] 2.2473 1.308 0.3866 0.0581
# $ vectors: num [1:4, 1:4] 0.6161 -0.2267 0.3741 0.655 -0.0605 ...
# - attr(*, "class")= chr "eigen"
Pentru exemplificare, luând primele două seturi de încărcări și păstrându-le
în matricea pastrare, se va obține:
# se extrag încărcările
pastrare <- productia.eigen$vectors [, 1: 2]
pastrare
[,1] [,2]
[1,] 0.6160840 -0.06049211
[2,] -0.2267110 0.76324934
[3,] 0.3741424 0.64165883
[4,] 0.6550268 -0.04544330
Observaţie: eigenvectors (vectorii proprii) sunt calculați cu orice pachet
software, fiind unici până la o schimbare de semn. În mod implicit, vectorii proprii
în R indică direcția negativă.
Pentru exemplul de față, am prefera ca eigenvectors să fie orientați în
direcția pozitivă, întrucât va conduce la o interpretare mai bună a rezultatelor
grafice.
Ca urmare, pentru a utiliza vectorii cu orientare pozitivă, se vor înmulți
încărcările implicite cu -1. Setul de încărcări pentru prima componentă principală
(PC1) și respectiv pentru a doua componentă principală (PC2) sunt astfel:
pastrare <- - pastrare
row.names(pastrare)<-
c("munca","capital","pamant","productie")
colnames(pastrare) <- c("PC1", "PC2")
pastrare
PC1 PC2
munca -0.6160840 0.06049211
capital 0.2267110 -0.76324934
pamant -0.3741424 -0.64165883
productie -0.6550268 0.04544330

 
6 Data Science în mediul R - teorie şi aplicaţii

Fiecare vector ce constituie o componentă principală definește o direcție în


spațiul caracteristicilor.
Deoarece oricare doi vectorii proprii sunt ortogonali, încărcările și, în
consecință, componentele principale nu sunt corelate unele cu altele, formând astfel
o bază a noului spațiu.
Observație: Acest lucru este valabil indiferent de numărul de dimensiuni utilizate.
Examinând vectorii de mai sus ce constituie componente principale, se
poate deduce că prima componentă principală (PC1) este afectată de capital, cu
o influență opusă, mai mare, a variabilelor munca, pamant și productie, în timp
ce cea de-a doua componentă principală (PC2) este afectată de munca mai mult
decât de productie, cu o influență opusă, mai mare, a variabilelor capital și
respectiv pamant.
Dacă se proiectează cele m puncte pe primul eigenvector, valorile
proiectate sunt numite scoruri ale componentelor principale pentru fiecare
observație, astfel:
# Se calculează scorurile componentelor principale
PC1 <- as.matrix(productia_centrata)%*% pastrare[, 1]
PC2 <- as.matrix(productia_centrata)%*% pastrare[, 2]
# Se crează un dataframe cu scorurile componentelor principale
PC <- data.frame(Firme = row.names(productia), PC1, PC2)
head(PC)
Firme PC1 PC2
1 1 0.5412063 0.94084797
2 2 -1.2164399 1.40628152
3 3 1.1766650 -0.84133557
4 4 2.0882113 1.14195996
5 5 0.3369120 -0.08075386
6 6 -1.2780882 1.00391761
În continuare, după ce au fost calculate primele două componente
principale pentru fiecare firmă, se poate trece la reprezentarea lor grafică, într-o
reprezentare bidimensională a datelor.
Prima componentă principală (axa Ox) corespunde aproximativ variabilei
capital. Firme precum 4 și 10 au volum mare de capital, raportat la celelalte
variabile, în timp ce firma 9 are un volum mai mic de capital, raportat la
celelalte variabile.
A doua componentă principală(axa Oy) este explicată aproximativ de
munca mai mult decât de productie, ceea ce implică faptul că firma 2 are un
volum mare de munca și productie, raportat la celelalte variabile, în timp ce
firma 8 are mai puțin. Firme apropiate de origine, cum ar fi firmele 5 și 7, sunt
aproape de medie în ambele categorii.
Avem20 astfel:
# Reprezentarea componentelor principale ale datelor despre producție
ggplot(PC, aes(PC1, PC2)) +
modelr::geom_ref_line(h = 0) +
modelr::geom_ref_line(v = 0) +

20
Reprezentările grafice din acest capitol sunt obținute din prelucrări proprii ale autorului,
utilizând mediul R.
Capitolul 3. Analiza în componente principale, utilizând mediul R 7

geom_text(aes(label = Firme), size = 3) +


xlab("Prima Componentă Principală") +
ylab("A doua Componentă Principală") +
ggtitle("Primele două Componente Principale ale datelor
despre dataframe-ul productia")

Figura 3.2. Primele două componente principale

De asmemenea, în mod implicit, funcția PCA(), din pachetul


FactoMineR, standardizează automat datele în timpul procedurii PCA și deci nu
trebuie făcută această transformare înainte de PCA, astfel că avem:
# Se instalează pachetul FactorMineR
install.packages("FactorMineR", dependencies = TRUE)
library("FactorMineR")
PCA(productia_centrata, scale.unit = TRUE, ncp = 2, graph =
TRUE)
**Results for the Principal Component Analysis (PCA)**
The analysis was performed on 10 individuals, described by 4 variables
*The results are available in the following objects:
name description
1 "$eig" "eigenvalues"
2 "$var" "results for the variables"
3 "$var$coord" "coord. for the variables"
4 "$var$cor" "correlations variables - dimensions"
5 "$var$cos2" "cos2 for the variables"
6 "$var$contrib" "contributions of the variables"
7 "$ind" "results for the individuals"
8 "$ind$coord" "coord. for the individuals"
9 "$ind$cos2" "cos2 for the individuals"
10 "$ind$contrib" "contributions of the individuals"
11 "$call" "summary statistics"
12 "$call$centre" "mean of the variables"
13 "$call$ecart.type" "standard error of the variables"
14 "$call$row.w" "weights for the individuals"
15 "$call$col.w" "weights for the variables"

 
8 Data Science în mediul R - teorie şi aplicaţii

Figura 3.3. Funcția PCA(), în pachetul FactoMineR

Următorul cod R, abordează analiza componentelor principale asupra


indivizilor activi, astfel:
pca_rezultate <- PCA(productia_centrata, graph = FALSE)
**Results for the Principal Component Analysis (PCA)**
The analysis was performed on 10 individuals, described by 4 variables
*The results are available in the following objects:
name description
1 "$eig" "eigenvalues"
2 "$var" "results for the variables"
3 "$var$coord" "coord. for the variables"
4 "$var$cor" "correlations variables - dimensions"
5 "$var$cos2" "cos2 for the variables"
6 "$var$contrib" "contributions of the variables"
7 "$ind" "results for the individuals"
8 "$ind$coord" "coord. for the individuals"
9 "$ind$cos2" "cos2 for the individuals"
10 "$ind$contrib" "contributions of the individuals"
11 "$call" "summary statistics"
12 "$call$centre" "mean of the variables"
13 "$call$ecart.type" "standard error of the variables"
14 "$call$row.w" "weights for the individuals"
15 "$call$col.w" "weights for the variables"

3.2.3. Vizualizarea și interpretarea datelor și rezultatelor obținute

Vom folosi pachetul R factoextra pentru a ajuta la interpretarea PCA.


Indiferent de funcția care se decide a fi utilizată (spre exemplu:
stats::prcomp(), FactoMiner::PCA(),ade4::dudi.pca(),
ExPosition::epPCA()), se pot extrage și vizualiza cu ușurință rezultatele
PCA folosind funcțiile R furnizate în pachetul factoextra.
Aceste funcții includ:
get_eigenvalue(pca_rezultate): extrage valorile proprii/variațiile
componentelor principale;
fviz_eig(pca_rezultate): vizualizează valorile proprii;
Capitolul 3. Analiza în componente principale, utilizând mediul R 9

get_pca_ind(pca_rezultate), get_pca_var(pca_rezultate):
extrage rezultatele pentru indivizi/obsrevații și respectiv pentru variabile/
caracteristici.
fviz_pca_ind(pca_rezultate), fviz_pca_var(pca_rezultate):
vizualizează rezultatele pentru indivizi și respectiv pentru variabile;
fviz_pca_biplot(pca_rezultate): realizează o reprezentare grafică a
indivizilor și respectiv a variabilelor.
În secțiunile următoare, vor fi ilustrate fiecare dintre aceste funcții.

3.2.4. Funcții PCA încorporate

R are numeroase funcții încorporate, alăturându-se totodată o serie de


pachete suplimentare, pentru a calcula numeroase atribute PCA (cum ar fi valori
proprii, vectori proprii, scoruri ale componentelor principale etc).
Una dintre aceste funcții încorporate este prcomp, cu care se pot efectua
rapid multe dintre calculele anterioare.
În mod implicit, funcția prcomp centrează variabilele pentru a avea media
zero, iar folosind opțiunea scale=TRUE, sunt scalate variabilele pentru a avea o
abatere standard unitară.
Outputul funcției prcomp conține o serie de informații utile.
Avem astfel următoarea secvență R:
pca_rezultate <- prcomp(productia, scale = TRUE)
pca_rezultate
Standard deviations (1, .., p=4):
[1] 1.4990931 1.1436774 0.6217535 0.2411317
Rotation (n x k) = (4 x 4):
PC1 PC2 PC3 PC4
munca -0.6160840 -0.06049211 0.569109728 0.5411981
capital 0.2267110 0.76324934 0.555196104 -0.2404368
pamant -0.3741424 0.64165883 -0.606514964 0.2836036
productie -0.6550268 -0.04544330 0.003316909 -0.7542306
names(pca_rezultate)
# [1] "sdev" "rotation" "center" "scale" "x"
Componentele center și scale corespund centrelor și abaterilor standard
ale variabilelor care au fost utilizate pentru scalare, înainte de implementarea PCA.
# Media
pca_rezultate$center
muncacapital pamant productie
73 21 13 463
# Abaterea standard
pca_rezultate$scale
munca capital pamant productie
33.015148 7.257180 3.829708 192.298957

 
10 Data Science în mediul R - teorie şi aplicaţii

Matricea21 de rotație asigură încărcarea componentelor principale, în sensul


că fiecare coloană a pca_rezultate$rotation conține vectorul corespunzător
de încărcare a componentei principale. Avem astfel următoarea secvență R:
pca_rezultate$rotation
PC1 PC2 PC3 PC4
munca -0.6160840 -0.06049211 0.569109728 0.5411981
capital 0.2267110 0.76324934 0.555196104 -0.2404368
pamant -0.3741424 0.64165883 -0.606514964 0.2836036
productie -0.6550268 -0.04544330 0.003316909 -0.7542306
Există astfel 4 componente principale distincte, lucru rezultat din min (10-
1, 4) = 4 componente principale.
Observație: Se observă că PCA1 și PCA2 au semnele opuse față de ceea ce s-a
calculat anterior. Reamintim că, în mod implicit, vectorii proprii în R punctează în
direcția negativă. Putem ajusta acest lucru cu o simplă schimbare de semn. Avem
astfel următoarea secvență R:
pca_rezultate$rotation <- - pca_rezultate$rotation
pca_rezultate$rotation
PC1 PC2 PC3 PC4
munca 0.6160840 0.06049211 -0.569109728 -0.5411981
capital -0.2267110 -0.76324934 -0.555196104 0.2404368
pamant 0.3741424 -0.64165883 0.606514964 -0.2836036
productie 0.6550268 0.04544330 -0.003316909 0.7542306
Acum PC1 și PC2 se potrivesc cu cele calculate anterior. De asemenea, se
pot obține scorurile principalelor componente, astfel:
pca_rezultate$x <- - pca_rezultate$x
pca_rezultate$x
PC1 PC2 PC3 PC4
1 -0.5412063 0.94084797 -0.83493046 -0.02470716
2 1.2164399 1.40628152 0.21537734 -0.19564318
3 -1.1766650 -0.84133557 -0.61999468 -0.05398192
4 -2.0882113 1.14195996 0.74367556 -0.06530555
5 -0.3369120 -0.08075386 1.11515148 0.28168346
6 1.2780882 1.00391761 -0.26301305 -0.22704381
7 -0.3167519 0.19037519 -0.65354687 0.51585116
8 1.1156514 -1.95777266 0.20168451 -0.11232599
9 2.5759243 -0.46164092 0.12887015 0.11480052
10 -1.7263573 -1.34187923 -0.03327397 -0.23332754
În continuare, se pot reprezenta grafic primele două componente principale
folosind biplot, iar dacă se dorește reprezentarea grafică a componentelor
principale 3 și 4, se poate introduce choice = 3:4 în biplot (întrucât
implicită este choice = 1:2).
Outputul este foarte asemănător cu cel obținut anterior, argumentul
scale=0, pentru biplot asigură că liniile sunt scalate pentru a reprezenta
sarcinile, astfel:
biplot(pca_rezultate, scale = 0)

21
Această funcție o numește matricea de rotație, deoarece atunci când înmulțim matricea X
cu pca_rezultat$rotation, se obțin coordonatele datelor din sistemul rotativ de
coordonate, iar aceste coordonate sunt de fapt scorurile componentelor principale.
Capitolul 3. Analiza în componente principale, utilizând mediul R 11

Figura 3.4. Reprezentarea primele două componente


principale folosind biplot

Funcția prcomp asigur obținerea, de asemenea, a abaterii standard a


fiecărei componente principale, iar varianța explicată de fiecare componentă
principală este obținută prin pătratul acestor valori, astfel:
pca_rezultate$sdev
# [1] 1.4990931 1.1436774 0.6217535 0.2411317
varianta_explicata<- pca_rezultate$sdev^2)
varianta_explicata
# [1] 2.2472802 1.3079979 0.3865774 0.0581445
Pentru a calcula proporția de varianță explicată de fiecare componentă
principală în parte, se împarte variația explicată de fiecare componentă principală
la variația totală explicată de toate cele patru componente principale, în cazul de
față, adică:
PVE <- varianta_explicata/sum(varianta_explicata)
round(PVE, 2)
[1] 0.56 0.33 0.10 0.01
Ca și anterior, se constată că prima componentă principală explică
aproximativ 56% din variația datelor, a doua componentă principală explică
aproximativ 33% din variația datelor etc.

3.2.5. Proporția de variație explicată la nivel de ACP/PCA

Reducerea dimensionalității datelor prin folosirea PCA, explicând în


același timp cea mai mare parte a variabilității acestora, trebuie să fie însoțită de o
măsurare exactă a procentului de variație care a fost păstrat în aceste componente
principale.
Pentru aceasta se calculează proporția de varianță explicată (PVE) de către
a j-a componentă principală, ca raport dintre valoarea proprie a variabilei j,
împărțită la numărul de componente principale, astfel:
PVE <- productia.eigen$values/sum(productia.eigen$values)
round(PVE, 2)

 
12 Data Science în mediul R - teorie şi aplicaţii

# [1] 0.56 0.33 0.10 0.01


Ca urmare, prima componentă principală din analiză explică 56% din
variabilitate, a doua componentă principală explică 33% etc, ceea ce înseamnă că
primele două componente principale explică împreună 89% din variabilitate etc.
De cele mai multe ori este de preferat să reprezentăm grafic PVE și PVE
cumulativ, astfel:
# Reprezentarea grafică a PVE
grafic_PVE <- qplot(c(1:4), PVE) +
geom_line() +
xlab("Componenta Principală") +
ylab("PVE") +
ggtitle("Reprezentare grafică a PVE") +
ylim(0, 1)
grafic_PVE

Figura 3.5. Reprezentarea grafică a PVE


# Reprezentarea grafică a PVE cumulativ
PVE_cumulativ <- qplot(c(1:4), cumsum(PVE)) +
geom_line() +
xlab("Componenta Principală") +
ylab(NULL) +
ggtitle("Reprezentare grafică a PVE cumulativ") +
ylim(0,1)
PVE_cumulativ
Capitolul 3. Analiza în componente principale, utilizând mediul R 13

Figura 3.6. Reprezentarea grafică a PVE cumulat

3.2.6. Determinarea numărului optim de componente principale, la nivelul


unui model

Nu există o modalitate obiectivă de a decide câte componente principale


sunt suficiente, aceasta depinzând de specificitatea aplicației, dar și de setul de date
avut spre analiză. În practică, tendința este de a privi primele componente
principale, pentru a găsi modele interesante în date deținute spre studiu.
Pentru o matrice informațională cu m observații/indivizi/obiecte și n
variabile/caracteristici/însușiri, există până la min(m-1, n) componente principale
care pot fi calculate.
Cu toate acestea, deoarece scopul PCA este de a reduce semnificativ
numărul de variabile, de regulă, se dorește utilizarea unui număr minim de
componente principale posibile pentru a explica cea mai mare parte a variabilității
datelor.
Cea mai obișnuită tehnică pentru a determina câte componente principale
trebuie reținute este vizualizarea grafică, căutând „punctul cotului”, unde PVE
scade semnificativ.
În exemplul analizat, întrucât inițial avem 4 variabile, reducerea la 2
variabile, cu explicarea a 89% din variabilitate este o îmbunătățire rezonabilă.
Graficul poate fi obținut folosind una din funcțiile fviz_eig() sau
fviz_screeplot(), din pachetul factoextra, astfel:
- fviz_eig(), va conduce la:
get_eig(pca_rezultate)
fviz_eig(pca_rezultate, choice = "eigenvalue", addlabels
= TRUE, geom="line", ncp = 3, ylim = c(0,100))
- fviz_screeplot(),va conduce la:
fviz_screeplot(pca_rezultate, choice = "eigenvalue",
addlabels = TRUE, geom="line", ncp = 3, ylim =
c(0,100))sau varianta scurtă:
fviz_eig(pca_rezultate) respectiv:

 
14 Data Science în mediul R - teorie şi aplicaţii

fviz_screeplot(pca_rezultate)

Analize suplimentare:

Reprezentarea grafică a variabilelor

O metodă simplă de extragere a rezultatele, pentru variabilele analizate


dintr-o prelucrare PCA este de a utiliza funcția get_pca_var(), din pachetul
factoextra.
Această funcție oferă o listă de matrici care conțin toate rezultatele pentru
variabilele active (coordonate, corelații dintre variabile și axe, pătratul cosinusului
și contribuții specifice).
Avem astfel următoarea secvență R:
var <- get_pca_var(pca_rezultate)
var
Diferitele componente pot fi accesate după cum urmează:
# Coordonate
head(var$coord)
# Cos2: calitate pe harta factorilor
head(var$cos2)
# Contribuții la componentele principale
head(var$contrib)
Din graficul anterior, am putea dori să ne oprim la a cincea componentă
principală. 89% din informațiile (variațiile) conținute în date sunt păstrate de
primele două componente principale.
fviz_pca_var(res.pca, col.var = "blue")
corrplot(var$cos2, is.corr=FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE
# Avoid text overlapping
)
fviz_pca_ind(productia_centrata, geom.ind = "text")
fviz_eig(productia_centrata, addlabels=TRUE, hjust = -0.3)
fviz_eig(productia_centrata, addlabels=TRUE, hjust = -0.3) +
ylim(0, 80)
p <- fviz_eig(res.pca, addlabels=TRUE, hjust = -0.3,
barfill="white", barcolor ="darkblue",
linecolor ="red") + ylim(0, 85) +
theme_minimal()
print(p)
$w
[1] -0.1419446 -0.9898746
$bias
[1] 2.855304
$updates
[1] 964
Capitolul 4
Metode de învăţare nesupervizată şi supervizată
(Analiza factorială-AF)

Prof. dr. Stelian STANCU

- necesitatea de a sintetiza relaţiile de cauzalitate;


- problema măsurării indirecte, a măsurării factorilor de natură
neobservabilă;
- probleme de măsurare şi cuantificare dintr-o mare varietate de
domenii: economic, social, politic, psihologic etc.

4.1. Introducere

Analiza factorială
- este unul dintre cele mai puternice, mai subtile şi mai utile instrumente
de analiză a datelor;
- scopul principal este acela al deducerii unor construcţii ipotetice, al
identificării unor factori esenţiali, prin intermediul cărora să poată fi
explicate interdependenţele existente între elementele unei mulţimi de
variabile indicator.
- spre deosebire de analiza în componente principale, care are ca scop
reexprimarea unei proporţii cât mai mari din variabilitatea spaţiului
cauzal iniţial, analiza factorială îşi propune să găsească cea mai bună
modalitate de reproducere a corelaţiilor manifestate între elementele
unei mulţimi de indicatori, cea mai bună modalitate de reexprimare a
interdependenţelor dintre variabilele indicator.
- este folosită pentru a rezolva două tipuri de probleme şi anume fie
reducerea numărului de variabile, în vederea creşterii vitezei de
procesare a datelor, fie în identificarea de şabloane ascunse în relaţiile
existente între date din matricea informaţională.
- se referă la o gamă largă de tehnici statistice folosite pentru a
reprezenta un set de variabile în concordanţă cu un număr redus de
variabile ipotetice, numite factori.
- poate fi privită ca o modalitate de a explica şi interpreta legăturile
dintre anumite variabile observabile (variabile indicator) în termeni de
mărimi care nu pot fi direct observabile (factori).
- Exemplu: rezultatele înregistrate la anumite teste de performanţă, care
au natură observabilă şi direct măsurabilă, pot fi explicate şi
interpretate în termenii unui factor abstract şi neobservabil în mod
direct, care este nivelul de inteligenţă al celor testaţi. Se pune astfel
problema măsurării indirecte, a măsurării factorilor de natură
2 Analiza Datelor. Teorie şi aplicaţii

neobservabilă (factori latenţi sau ascunşi), sunt cunoscuţi în analiza


factorială ca fiind factori comuni.
- a fost utilizată pentru început în fundamentarea teoriilor psihologice
referitoare la comportamentul şi abilitatea umană, constând în existenţa
posibilităţii de măsurare indirectă, de cuantificare a unor factori
neobservabili.
- se ocupă cu identificarea şi studierea unor entităţi1 informaţionale
complexe, care nu pot fi observabile în sens statistic, ceea ce înseamnă
că, în mod implicit, aceste entităţi nu pot fi direct măsurabile.
Ca exemple de entităţi informaţionale de acest tip putem menţiona:
- starea emoţională;
- statutul social;
- abilitatea profesională;
- abilitatea managerială;
- inteligenţa;
- profilul psihologic;
- etc.
Realizată cu ajutorul mai multor tehnici:
- metoda componentelor principale;
- criteriul varimax;
- criteriul quartimax;
- rotatia axelor.
Obiectiv: cercetarea legaturilor de interdependenta dintre mai multe variabile, in
scopul determinarii setului minim de explicare a unui anumit fenomen.
- presupune definirea unor factori care sa condenseze o cat mai mare parte
din informatia (variabilele) initiala.
Utilizari:
- identificarea setului de dimensiuni latente existente in variabila initiala
(analiza factoriala de tip R);
- combinarea sau condensarea componentelor unui populatii statistice si
crearea unor grupuri distincte (analiza factoriala de tip Q).

4.2. Definiţii şi aplicaţii majore ale analizei factoriale(AF)

- analiza factorială poate fi privită ca o modalitate de a explica şi interpreta


legăturile dintre anumite variabile observabile (variabile indicator) în
termeni de mărimi ale unor entităţi informaţionale care nu pot fi direct
observabile (factori).
Definiţia 4.1. Se numeşte analiză factorială acea tehnică statistică multivariată care
are ca scop extragerea unui număr de regulă mic de factori ascunşi (latenţi)
responsabili de corelaţiile dintre variabilelor originale.

1
Aceste entităţi sunt cunoscute în analiza factorială sub numele de factori comuni şi factori
specifici.
Capitolul 4. Analiza factorială(AF) 3

Exemplul 4.1. Rezultatele înregistrate la anumite teste de specialitate, care au


natură observabilă şi direct măsurabilă, prin care poate fi explicat şi interpretat un
factor abstract şi neobservabil în mod direct, care este spre exemplu nivelul de
inteligenţă al celui testat.
Dacă aceste corelaţii sunt semnificative, se poate presupune că ar fi cauzate
de existenţa unuia sau mai multor factori „ascunşi” comuni tuturor variabilelor.
Definiţia 4.2. Se numeşte factor comun sau factor latent acea entitate
informaţională de natură generală, care exprimă o caracteristică esenţială a unui
fenomen sau proces din realitate, îşi exercită influenţa asupra tuturor elementelor
unei mulţimi de indicatori şi care nu poate fi supuă unui proces direct de observare
şi măsurare.
Definiţia 4.3. Indicatorul sau testul este o variabilă ale cărei observaţii, cunoscute
sub numele de scoruri, sunt utilizate în cadrul analizei factoriale în scopul de a
produce evaluări numerice pentru factorul sau factorii comuni.
În analiza factorială se presupune că legătura dintre variabilele indicator şi
factorii comuni poate fi exprimată sub o formă liniară, exprimare care conduce la
necesitatea estimării coeficienţilor care intervin în definirea respectivei forme.
Definiţia 4.4. Factorul unic reprezintă o entitate informaţională de natură
particulară, care îşi exercită influenţa în mod unilateral, asupra unei singure
variabile indicator, şi care nu poate fi supusă unei proces direct de observare şi
măsurare.
Definiţia 4.5. Analiza factorială este o analiză multivariată, care are ca scop să
explice corelaţiile manifestate între o serie de variabile, numite indicatori sau teste,
prin intermediul unui număr mai mic de factori ordonaţi şi necorelaţi, numiţi
factori comuni.
Ca aplicaţii majore ale AF se pot evidenţia:
- în detectarea structurii în relaţiile dintre variabile;
- în reducerea numărului de variabile;
- în rezolvarea multicoliniarității în regresia multiplă;
- în validarea construcției unei scale compuse din mai mulți itemi.
Ca metodă de analiză multidimensională, analiza factorială este folosită, în
principal, în rezolvarea problemelor al căror scop este legat de:
- studierea nivelelor diferite de manifestare a interdependenţelor dintre
variabilele explicative, în special atunci când numărul acestora este foarte
mare;
- detectarea unei structuri simplificate şi clare a relaţiilor de interdependenţă
existente între variabilele explicative;
- obţinerea unei "cluster-izări", unei clasificări a variabilelor explicative prin
intermediul unor entităţi numite factori, astfel încât variabilele aparţinând
unui anumit factor să fie puternic intercorelate;
- obţinerea unor informaţii specifice, sub forma aşa-numiţilor factori, pe
baza cărora să se poată face o interpretare sintetică a relaţiilor de
cauzalitate;
4 Analiza Datelor. Teorie şi aplicaţii

- verificarea unor ipoteze cu privire la existenţa unei structuri factoriale


particulare sau cu privire la existenţa unui anumit număr de factori comuni;
- sintetizarea potenţialului cauzal comun al mai multor variabile explicative
sub forma unui număr cât mai redus de factori.
Privită în sens restrâns, ca mulţime de proceduri logice şi numerice
executate pe date de un anumit tip, analiza factorială poate fi definită ca
reprezentând un proces a cărui desfăşurare include următoarele etape
esenţiale:
- determinarea numărului minimal de factori comuni cu ajutorul căruia pot fi
explicate în mod optimal corelaţiile existente între variabilele indicator;
- efectuarea unor rotaţii ale factorilor, în scopul determinării soluţiei factor
sub cea mai simplă şi mai clară formă;
- estimarea intensităţilor factorilor, structurii legăturilor, comunalităţilor şi
varianţelor factorilor unici;
- deducerea unor interpretări adecvate pentru factorii comuni;
- estimarea scorurilor factorilor.

4.3. Modele de analiză factorială

Ideea fundamentală în analiza factorială constă în faptul că anumite


variabile nu pot fi observate (măsurate) direct, ci doar prin intermediul altora, care
sunt cunoscute:
- fie ca variabile manifeste: observate, măsurate;
- fie ca variabile latente, ce integrează de regulă informația comună a mai
multor variabile manifeste.
În categoria modelelor de tip AF se pot evidenţia:
Modelul factorului comun, în care fiecare variabilă manifestă (v) are două
componente:
- una care decurge din variabila latentă (factor) sau factor comun;
- cealaltă, care decurge din unicitatea acelei variabile (e), numiţi şi erori sau
factori reziduali.
Capitolul 4. Analiza factorială(AF) 5

Figura 4.1. Exemplu de model bazat pe factorul comun

Modelele de analiză factorială sunt de două tipuri şi anume:


- analiza factorială exploratorie (AFE);
- analiza factorială de confirmare (AFC).

A. Analiza factorială exploratorie(AFE)

Această metodă caută o structură latentă în rândul mai multor variabile,


fiind o tehnică reductivă de identificare a variabilele latente care înglobează
anumite variabile observate.
În varianta sa de analiză exploratorie, analiza factorială reprezintă o tehnică
de identificare a structurii dependenţei, de generare a unor construcţii teoretice.
Analiza factorială de tip exploratoriu nu presupune cunoaşterea apriorică a
structurii dependenţei cauzale sau cunoaşterea apriorică a factorilor.
Definiţia 4.6. Analiza factorială exploratorie reprezintă acea modalitate de
utilizare a analizei factoriale care are ca scop detectarea unei structuri a
dependenţei şi generarea unor construcţii teoretice, cunoscute sub numele de
factori comuni.
Pentru aceasta, se impun ca principale obiective:
- determinarea numărului constructelor latente;
- constituirea unui suport pentru a explica variabilitatea comună;
- definirea conținutului și semnificației factorilor.
Există două metode de realizare şi anume:
- analiza factorilor comuni - AFc (metoda lui Thurstone), putând folosi
pentru aceasta mai multe tipuri de tehnici;
- analiza în componente principale - ACP (metoda lui Hotteling).

Analiza factorilor comuni - AFc (Thurstone)

Această metodă presupune:


6 Analiza Datelor. Teorie şi aplicaţii

-estimarea varianţei comune la nivelul variabilelor manifeste;


-căutarea unui anumit număr minim de factori care ”absorb” varianța
variabilelor studiate;
- rezultă întotdeauna mai puţini factori decât numărul variabilelor existente
Totodată, AFc:
- urmărește identificarea unui număr relativ mic de factori care să explice
varianța comună a variabilelor;
- deși are caracter exploratoriu, proiectează un anumit model asupra
variabilelor manifeste, şi anume modelul liniar, iar când liniaritatea nu se
confirmă, aceasta este forţată prin modificarea variabilelor (neutralizează
tendințele curbilinii;valorile excesive etc).

Analiza în componente principale - ACP (Hotteling)

Aşa cum deja a fost specificat anterior, metoda ACP:


- se limitează la descompunerea algebrică a matricei de date într-o structură
de componente (factori) care acumulează o cantitate cât mai mare de
variabilitate comună;
- analizează matricea corelațiilor liniare dintre variabile și evaluează varianța
comună existentă, astfel:
o extrage factorul care înglobează cea mai mare cantitate de
variabilitate;
o urmează alegerea celui de al doilea factor cu cea mai mare cantitate
de variabilitate din cea rămasă;
o și așa mai departe
- soluţia finală este dată de atâţia factori câte variabile sunt disponibile la
final, chiar dacă este puţin probabil ca toţi factorii să întrunească criteriile
de retenţie.
- factorii/componentele astfel identificați sunt ortogonali;
- nu este o analiză factorială în adevăratul înțeles al cuvântului.

Analiza factorilor comuni(AFc) sau analiza în componente principale(ACP)?

Ca în orice dispută ideatică, părerile sunt împărţite: unii autori susținând


evitarea ACP, în timp ce altii o recomandă.
Totuşi, se distinge faptul că:
- metoda ACP este recomandată îndeosebi atunci când obiectivul analizei
este acela de a investiga un volum mare de date, metoda permiţând
reducerea dimensionalităţii la o structură care reține cât mai multă
variabilitate comună;
- metoda AFc este recomandată dacă scopul analizei este modelarea unei
anumite structuri a corelațiilor dintre variabilele manifeste, permiţând
astfel o reprezentare cât mai economică a relațiilor dintre variabilele
modelului analizat.
Capitolul 4. Analiza factorială(AF) 7

B. Analiza factorială de confirmare (AFC)

Această metodă se bazează pe faptul că cercetătorul are un model aprioric


cu privire la structurarea variabilelor, obiectivul AFC fiind tocmai acela de a-l
verifica/testa. Încercându-se astfel potrivirea modelului cu structura variabilelor
conţinute.
În analiza factorială de confirmare (confirmatorie), structura dependenţei
cauzale sau construcţia cauzală teoretică sunt presupuse a fi cunoscute, adică date
prin ipoteză. Prin intermediul teoriei de acest tip se urmăreşte confirmarea unei
anumite teorii şi verificarea acestei teorii pe cale empirică.
Definiţia 4.7. Analiza factorială confirmatorie reprezintă acea modalitate de
utilizare a analizei factoriale, care are ca scop confirmarea unor ipoteze şi teorii
privind structura unei dependenţe cauzale.
Ca abordări specifice ale metodei AFC pot fi evidenţiate:
- metoda tradițională;
- modelarea bazată pe ecuații de structură (Structural Equation Modeling);
- modelarea bazată pe logica inductiv-epirică;
- modelarea bazată pe logica ipotetic-deductivă.

4.4. Probleme fundamentale ale analizei factoriale (AF)

Principalele probleme ce apar în procesul de aplicare a metodei bazată pe


analiza factorială sunt:
- combinarea mai multor variabile într-un singur factor;
- alegerea metodei potrivite de extragere a factorilor;
- indicatori numerici ai factorilor;
- rotaţia factorilor;
- identificarea propriu-zisă a factorilor

Combinarea mai multor variabile într-un singur factor

Imaginea intuitivă a combinării (reducerii) variabilelor este graficul


scatterplot al corelaţiei, linia de regresie trasată prin norul de puncte al graficului
reprezentând cea mai bună aproximare a relaţiei liniare dintre cele două variabile
analizate.
Ca urmare:
- valorile care se plasează pe linia de regresie captează esenţa variaţiei
comune a celor două variabile corelate;
- acest procedeu intuitive este echivalent cu ceea ce, în analiza factorială, se
numeşte extragerea componentelor principale.

Alegerea metodei potrivite de extragere a factorilor


8 Analiza Datelor. Teorie şi aplicaţii

În contrapartidă la metoda ACP pot fi puse următoarele metode:


- unweighted least squares;
- generalized least squares;
- maximum likelihood, cu remarca de respectare a condiției de normalitate;
- principal axis factoring, atunci când nu se respectă condiția de normalitate;
- alpha factoring, ce maximizează indicele de consistență internă la nivelul
factorilor;
- image factoring, ce utilizează matricea de corelație a variabilelor prezise pe
baza regresiei multiple.

Indicatori numerici ai factorilor

Principalii indicatori numerici ai factorilor sunt:


- valorile factorilor, ce evidenţiază scorul particular compus prin contribuția
variabilelor;
- încărcarea factorilor, ce evidenţiază coeficientul de corelație dintre
variabile și factorii aferenți;
- comunalitatea, poate fi interpretată ca:
o siguranța indicatorului reprezentat de acea variabilă;
o pătratul corelației multiple pentru fiecare variabilă manifestă,
utilizată drept criteriu, și toți factorii, utilizați drept predictori;
o procentul varianței unei variabile explicată de factorii reuniți;
o .

Rotația factorilor

Rotația factorilor reprezintă rotația propriu-zisă, ca modalitate de rotire a


spațiului de variație astfel încât varianța să se distribuie optim între factori.
Vom avea astfel:
- soluție inițială, caz în care factorii înglobează o anumită cantitate de
varianță comună;
- soluția finală, caz în care se realizează maximizarea varianței încorporate
în fiecare factor;
Într-o reprezentare grafică sugestivă avem:
Capitolul 4. Analiza factorială(AF) 9

Figura 4.2.

Ca tipuri de rotație a factorilor avem:


- rotaţia ortogonală;
- rotaţia oblică.

Figura 4.3.

Figura 4.4.
10 Analiza Datelor. Teorie şi aplicaţii

Figura 4.5.

Identificarea propriu-zisă a factorilor

Aceasta presupune următoarele aspect esenţiale:


- alegerea numărului de factori;
- denumirea factorilor.

Alegerea numărului factorilor

- metoda K1 (Kaiser), presupune determinarea:


o indicilor eigenvalue (0-1);
o sumei coeficienţilor r2 dintre fiecare factor şi variabilele care intră
în compunerea lor;
o se rețin factorii cu eigenvalue ≥1;
o desi este un subiect controversat, este totuşi soluția cea mai
frecvent utilizată.
- Cattel’s Scree test, presupune:
o explorararea vizuală a graficului valorilor eigenvalue;
- principiul simplității (economiei) și al utilității practice;

Denumirea factorilor

Pentru a realiza acest aspect se au în vedere următoarele:


- atribuirea semnificației psihologice, în sensul că:
o factorii se definesc prin gradul de încărcare (saturaţie);
o cu cât un factor are o saturaţie mai mare în raport cu anumite
variabile, cu atât aceste variabile acoperă o semnificaţie comună
mai consistentă;
- reguli folosite, în sensul că factorii trebuie:
o sa fie succinţi, exprimaţi, dacă este posibil, printr-unul sau două
cuvinte;
o să exprime şi să comunice natura constructului la care se referă
(pentru AFc nu se pune problema);
Capitolul 4. Analiza factorială(AF) 11

o variabilele care intră în compunerea factorilor vor fi analizate sub


aspectul semnificaţiei (similitudinii);
o analizarea variabilelor care nu intră în componenţa unui factor.

4.5. Condiţii preliminare

În analiza specifică, se au în vedere următoarele aspecte:


- în ceea ce priveşte variabile măsurate la nivel cantitativ(interval/raport),
pot fi incluse în analiză și variabile ordinale sau chiar dihotomice, chiar
dacă, se apreciază că în acest cay factorii vor fi mai greu de interpretat;
- în ceea ce priveşte distribuţia normală, aceasta este o condiţie cu atât mai
puţin restrictivă cu cât volumul eşantionului este mai mare;
- absența valorilor extreme;
- alegerea atentă a variabilelor, în sensul că variabile nerelevante, sau
excluderea unora relevante, afectează calitatea modelului factorial;
- liniaritatea, în sensul că se urmăreşte o corelație între variabile de cel puţin
0.30;
- normalitatea multivariată, în sensul că în absența evaluării directe a
acesteia, investigarea normalității univariate este obligatore;
- existența unor constructe reale, în sensul că acestea exprimă dimensiuni
psihologice existente în realitate.
- intercorelații moderate și moderat-ridicate, fără multicolinearitate, în sensul
că:
o indicele KMO poate oferi o referinţă utilă cu privire la existența
multicolinearității;
o există un indice KMO pentru fiecare variabilă;
o suma acestora este indicele global KMO;
o indicele global KMO variază între 0 și 1, iar analiza factorială este
justificată dacă valoarea lui este mare (de regulă peste 0.60).
- un eșantion adecvat conduce la următoarele aspecte:
o o structurare factorială puternică, presupune un eșantion mai mic;
o o structurare factorială slabă, presupune un eșantion mai mare;
o este greu de pus în evidență o structură factorială pe un eșantion
mai mic de 50 de cazuri;
o cca 100 de cazuri este un eșantion mic;
o cca 200 de cazuri sunt suficiente;
o cca 300 de cazuri este un eșantion bun;
o cca 500 de cazuri este un eșantion foarte bun;
o cca 1000 de cazuri este un eşantion excellent.
12 Analiza Datelor. Teorie şi aplicaţii

4.6. Structura generală a modelului factorial

În formularea sa cea mai generală, formulare extrem de necesară pentru


precizări cu caracter terminologic şi pentru formularera unor ipoteze de natură
teoretică, modelul analizei factoriale are la bază două ipoteze fundamentale.
Ipoteza 4.1. Nivelul sau valorile unui ansamblu de variabile aleatoare (variabile
cauzale, variabile observate sau indicatori), de regulă centrate sau standardizate,
..., se formează ca rezultat exclusiv al influenţei a trei categorii de
factori:
- o mulţime formată din p factori comuni(variabile latente), ,
a căror influenţă se consideră a se exercita asupra fiecăreia dintre cele n
variabile considerate;
- o mulţime formată din n factori unici, ..., , a căror influenţă se
consideră a se exercita în mod individual, fiecare factor unic influenţând
una şi numai una dintre variabilele considerate;
- o mulţime de n factori reziduali (specifici), ..., , a căror
influenţă se consideră a fi exercitată tot în mod individual, fiecare factor
rezidual influenţând câte o singură variabilă.
Din punct de vedere statistic, se consideră că influenţele semnificative, care
trebuie reţinute în analiză, sunt cele exercitate de factorii comuni şi unici, în timp
ce influenţele factorilor reziduali, se consideră a avea caracter accidental,
nesemnificativ.
La nivelul fiecărei variabile, influenţa factorului rezidual corespunzător
poate fi considerată a fi neglijabilă şi este asimilabilă erorilor de măsurare. Din
acest motiv, factorii reziduali se mai numesc şi erori.
În ceea ce priveşte factorii comuni, există posibilitatea ca în cazul anumitor
variabile influenţa lor asupra acestor variabile să fie neglijabilă sau chiar nulă, ceea
ce înseamnă că factorii respectivi pot fi eliminaţi din lista factorilor pentru variabila
respectivă. În aceste condiţii, este posibil ca schema de influenţă pentru anumite
variabile să conţină mai mulţi factori comuni, iar pentru alte variabile mai puţini.
Numărul de factori comuni cu influenţă semnificativă asupra variabilei indicator
determină complexitatea variabilei indicator respective.
Faptul că influenţele considerate sunt structurate pe cele trei categorii de
factori, determină o anumită structură a modelului factorial general, structură
evidenţiată de reaţiile următoare:

..., ,... , pentru

unde funcţiile sunt funcţii reale de m+1 variabile, funcţii care pot fi
liniare sau nelininare în raport cu variabilele.
Cu toate că funcţiile pot fi, în principiu, liniare sau
neliniare, aproape în toate cazurile, atât în cele legate de teoria analizei factoriale,
Capitolul 4. Analiza factorială(AF) 13

cât şi în cele legate de utilizarea acesteia în aplicaţii, este considerată varianta


liniară, ceea ce înseamnă că relaţiile care definesc modelul au forma următoare:

+ , pentru

Coeficienţii factorilor comuni sunt , cunoscuţi sub


numele de intensităţi ale factorilor comuni. Prin magnitudinea sa coeficientul
măsoară intensitatea influenţei exercitate de factorul comun k asupra nivelului
variabilei indicator/cauzală j, iar prin semnul său măsoară sensul influenţei
exercitate.
Definiţia 4.8. Se numeşte intensitate a unui factor comun(variabilă latentă) în
raport cu o variabilă indicator(cauzală, observată) , mărimea (numită şi
coeficient factorial (factor loadings)), care arată cu câte unităţi se modifică nivelul
variabilei indicator , atunci când nivelul factorului comun creşte cu o unitate.
Ipoteza 4.2. Cea de-a doua ipoteză pe care se fundamentează analiza factorială este
aceea că în conţinutul informaţional al variabilelor aleatoare (indicator, cauzală,
observată) ..., se regăsesc informaţii cu privire la factorii comuni şi
unici, ceea ce înseamnă că ele pot fi folosite ca indicatori ai acestor factori, ca
semnale informaţionale generate de aceşti factori.
Având în vedere că la nivelul unei variabile indicator, nu se poate face, sub
nici o formă, o distincţie clară între factorul unic şi factorul rezidual, din motive
legate de simplificare şi de crearea posibilităţilor de soluţionare efectivă a
problemei de analiză factorială, factorul rezidual este neglijat sau, ceea ce
înseamnă acelaşi lucru, este unificat cu factorul unic.
În consecinţă, modelul factorial capătă forma următoare:
(Analiza factorială descrie fiecare variabilă cauzală ca o combinație liniară de
factori comuni (variabile latente) plus un factor unic sau specific, astfel:

+ , pentru
sau matriceal:

unde:
14 Analiza Datelor. Teorie şi aplicaţii

În raport cu această ultimă formă a modelului factorial se defineşte


conceptul de configuraţie factorială, concept care este folosit şi într-un sens mai
larg, cu referire la întregul set de ecuaţii care defineşte modelul.
În continuarea prezentării, vom nota matricea de corelaţie a variabilelor
indicator /cauzale cu R, respectiv:

unde elementele de pe diagonala principală sunt egale cu unitatea, respectiv


.
Întrucât, de regulă variabilele indicator sunt considerate a fi centrate,
matricea de corelaţie a acestora coincide cu matricea de covarianţă. În ceea ce
priveşte cei p factori comuni, vom nota matricea de covarianţă a acestora sub forma
următoare:

unde elementul diagonal din această matrice reprezintă varianţa factorului


comun , iar elementul nediagonal reprezintă covarianţa dintre factorul şi
. În anumite situaţii, pentru varianţa factorului comun se foloseşte notaţia ,
adică .
Dacă factorii comuni sunt mărimi standardizate, atunci matricea de
corelaţie a factorilor comuni coincide cu matricea de covarianţă a acestor factori. În
Capitolul 4. Analiza factorială(AF) 15

această situaţie, elementele diagonale sunt egale cu unitatea, respectiv


.

4.7. Descompunerea variabilităţii spaţiului iniţial

În mod similar cu analiza în componente principale, analiza factorială îşi


propune să reexprime variabilitatea conţinută în spaţiul cauzal iniţial, într-o
manieră diferenţiată, în funcţie de rolul pe care îl au în formarea acesteia factorii
comuni, pe de o parte, şi factorii unici, pe de altă parte.
În cadrul acestui paragraf, vom trata modul în care varianţa unei variabile
aleatoare poate fi descompusă în componente relevante din punct de vedere al
interpretărilor interdependenţelor cauzale.

4.7.1 Spaţiul factor şi exprimarea conţinutului său informaţional

Prin utilizarea tehnicile de analiză multidimensională care au ca scop reducerea


dimensionalităţii, variabilitatea spaţiului cauzal m-dimensional, determinat de
mulţimea de variabile indicator ..., , este conservată într-o proporţie,
mai mare sau mai mică, prin intermediul variabilităţii induse de un număr mai
redus de factori abstracţi, , cu , care sunt factorii comuni.
Împreună cu factorul unic, aceşti factori determină un spaţiu -dimensional
numit spaţiul test sau spaţiul factor.
Definiţia 4.9. Spaţiul test sau spaţiul factor este un spaţiu real, de dimensiune
, ale cărui axe sunt ortogonale două câte două şi sunt reprezentate de factorii
comuni şi de factorul vectorial unic ..., .
Variabilitatea ce caracterizează celor două spaţii implicate în analiză,
spaţiul original şi spaţiul test, este măsurată prin intermediul varianţei sau
dispersiei.
În analiza datelor se consideră că, pentru oricare dintre variabilele care
definesc spaţiul cauzal original, varianţa este o măsură a informaţiei conţinută în
observaţiile efectuate asupra respectivei variabile.
Între gradul de variabilitate specific unei variabile şi semnificaţia
informaţional-statistică produsă de observaţiile făcute asupra respectivei variabile
există un stabil raport de directă proporţionalitate, considerându-se că o variabilă
este cu atât mai semnificativă cu cât variabilitatea sa este mai mare.

4.7.2 Componentele varianţei

După cum am mai evidenţiat, spre deosebire de analiza componentelor


principale, în contextul căreia variabilitatea ce caracterizează spaţiul cauzal iniţial
este privită nediferenţiat, în analiza factorială variabilitatea spaţiului cauzal iniţial
este considerată a fi o compunere de variabilităţi, care se formează sub influenţa
factorilor consideraţi.
16 Analiza Datelor. Teorie şi aplicaţii

Corespunzător celor trei categorii generale de factori consideraţi a influenţa


variabila indicator , respectiv comuni, unici şi reziduali, în analiza factorială se
postulează ipoteza conformă căreia varianţa , corespunzătoare variabilei ,
poate fi împărţită în trei compomnente importante:
- componenta , numită comunalitate, care este acea parte a varianţei
totale ce exprimă informaţia comună tuturor variabilelor care definesc
spaţiul cauzal m-dimensional şi care se formează sub influenţa factorilor
comuni ;
- componenta , numită unicitate, care este acea parte a varianţei totale ce
exprimă informaţie semnificativă de natură specifică, caracteristică
variabilei particulare şi care se formează sub influenţa factorului unic
;
- componenta , numită rezidualitate sau eroare, care este acea parte a
varianţei totale formată sub influenţa factorului rezidual asociat cu
variabila respectivă şi exprimă informaţie nesemnificativă cu caracter
specific variabilei .
Pe baza celor trei tipuri de influenţe menţionate anterior, varianţa variabilei
indicator poate fi descompusă sub forma:

unde mărimile , şi reprezintă, aşa cum o să arătăm în continuare, tot


varianţe. Această relaţie defineşte descompunerea varianţei unei variabile indicator
în funcţie de varianţele celor trei categorii factori care influenţează variabila
respectivă. Deşi cele trei componente ale descompunerii au natură de varianţe, ele
nu trebuie identificate ca reprezentând varianţe ale factorilor, deoarece
descompunerea este făcută doar în funcţie de varianţele factorilor. Cu excepţia
celei de-a treia componente a descompunerii, care este chiar varianţa factorului
rezidual, primelor două componente nu li se poate atribui calitatea de varianţe ale
factorilor.
Primele două componente sunt determinate de coeficienţii care ponderează
varianţelor factorilor, ceea ce înseamnă că ele reprezintă contribuţii ale varianţelor
factorilor la formarea varianţei variabilei indicator. De fapt, în condiţiile unor
ipoteze privind necorelarea factorilor, forma completă a relaţiei de descompunere a
varianţei variabilei indicator poate fi scrisă astfel:
Capitolul 4. Analiza factorială(AF) 17

Este evident că pătratele coeficienţilor care ponderează varianţele factorilor


reprezintă contribuţii ale factorilor la formarea varianţei variabilei indicator. Forma
simplificată a descompunerii rezultă din impunerea ipotezei că varianţele factorilor
comuni şi unic sunt egale cu unitatea şi din definirea comunalităţii ca sumă a
contribuţiilor factorilor comuni la formarea varianţei indicator, respectiv:

Componenta cea mai importantă a varianţei variabilei indicator este


comunalitatea, care exprimă contribuţia factorilor comuni la formarea varianţei
variabilei indicator şi care poate fi privită, la rândul său, ca o varianţă.
Definiţiea 4.10. Comunalitatea este acea parte a varianţei unei variabile indicator,
care exprimă variabilitatea indusă de influenţa factorilor comuni
Având în vedere că la formarea variabilităţii unei variabile indicator
contribuie, în principiu, toţi cei m factori comuni, comunalitatea poate fi
descompusă, la rândul său, în raport cu cele m influenţe.
Cea de-a doua componentă a varianţei variabilei indicator, numită
unicitate, exprimă contribuţia factorului unic la formarea varianţei variabilei
indicator şi are, de asemenea, natură de varianţă. Ea se mai numeşte şi varianţă
unică, şi se defineşte astfel:
Definiţia 4.11. Unicitatea este acea parte a varianţei unei variabile indicator, care
exprimă variabilitatea indusă de influenţa factorului unic şi care nu poate fi
explicată prin intermediul factorilor comuni.
Ultima componentă a varianţei variabilei indicator, respectiv cea datorată
factorului rezidual, reflectă influenţa erorilor de măsurare asupra formării
variabilităţii variabilei indicator şi se mai numeşte şi varianţă reziduală sau
varianţă eroare. De cele mai multe ori, această influenţă este considerată a fi
neglijabilă în raport cu celelalte influenţe.
Cu excepţia varianţei reziduale, care exprimă influenţa factorilor cu natură
accidentală, a cauzelor aleatorii, imprevizibile şi nesemnificative, celelalte două
componente, comunalitatea şi unicitatea, exprimă influenţe de natură sistematică
asupra formării variabilităţii variabilei indicator, influenţe cu caracter permanent şi
stabil. Din acest punct de vedere, varianţa variabilei indicator, , poate fi privită ca
fiind suma a două tipuri de varianţe: varianţa sistematică şi varianţa reziduală.
Dacă vom nota varianţa sistematică cu , adică:

atunci varianţa variabilei indicator, , poate fi scrisă sub forma:


18 Analiza Datelor. Teorie şi aplicaţii

Din această reformulare rezultă că varianţa variabilei indicator poate fi


descompusă ca sumă a două componente numite sistematicitate şi rezidualitate.
Pe de altă parte, influenţa factorului unic şi influenţa factorului rezidual
se caracterizează prin faptul că au o direcţionalitate specifică, bine determinată,
fiind raportate numai la o anumită variabilă indicator. Din acest punct de vedere,
contribuţia celor doi factori la formarea varianţei variabilei indicator este numită
specificitate, , care se defineşte sub forma:

Pe baza acestei noi redefiniri a componentelor, varianţa variabilei


indicator, , poate fi rescrisă sub forma următoare:

4.8. Configuraţia factor şi structura factor

În analiza factorială se definesc două concepte fundamentale, care


sintetizează o serie de mărimi importante, specific analizei factoriale. Aceste
mărimi sunt reprezentate de coeficienţii factorilor şi de coeficienţii de corelaţie
dintre variabilele indicator şi factori, iar sintetizarea este făcută prin intermediul
conceptelor numite configuraţie factor şi structură factor.

4.8.1 Definirea configuraţiei factor

Conceptul de configuraţie factor sau configuraţie factorială se referă la


intensităţile factorilor comuni şi poate fi definit astfel:
Definiţia 4.12. Se numeşte configuraţie factor mulţimea intensităţilor
corespunzătoare factorilor comuni ce apar într-un model factorial.
Dacă se ţinea seama şi de intervenţia într-un model de analiză factorială a
factorului specific, atunci poate fi definit conceptul de configuraţie factor extinsă.
Configuraţia factor este foarte importantă în cadrul analizei factoriale din mai
multe puncte de vedere. În primul rând, elementele care intră în alcătuirea
configuraţiei factor caracterizează intensitatea şi sensul influenţelor exercitate de
factori asupra formării nivelului variabilelor indicator. De asemenea, configuraţia
factor, în varianta sa extinsă, este importantă deoarece ea se constituie ca o
reprezentare simplificată şi completă a modelului factorial.
Un alt element de importanţă pentru configuraţia factorială rezultă din
faptul că elementele acesteia stau la baza determină rii elementelor structurii factor
şi pot fi utilizate în reproducerea, pe diferite nivele, a corelaţiilor dintre variabilele
indicator.
Capitolul 4. Analiza factorială(AF) 19

În sfârşit, configuraţia factor este utilă în efectuarea unor comparaţii între


diferite sisteme de factori, care sunt exprimabile prin intermediul aceleiaşi
combinaţii de indicatori.

4.8.2 Definirea structurii factor

O problemă importantă a analizei factoriale, a cărei soluţionare ţine de


esenţă analizei factoriale, este aceea a determinării corelaţiilor dintre variabilele
indicator şi factorii comuni, pe de o parte, şi dintre variabilele indicator şi factorii
specifici, pe de altă parte.
Pe baza conceptului de corelaţie între variabilele indicator şi factori, poate
fi definit cel de-al doile concept, structura factor sau structura factorială. Structura
factor mai este cunoscută în teoria destinată analizei factoriale şi sub numele de
matrice factor. Matricea factor are aceeaşi interpretare cu cea dată în cazul
componentelor principale.
Definiţia 4.13. Se numeşte structură factor sau structură factorială mulţimea
coeficienţilor de corelaţie dintre variabilele indicator ale unui model factorial şi
factorii comuni incluşi în acest model.
Importanţa structurii factor în cadrul analizei factoriale constă în aceea că
ea evidenţiază corelaţiile existente între variabilele indicator şi factorii comuni şi
facilitează interpretarea esenţei factorilor comuni, prin prisma naturii pe care o au
variabilele indicator. Spre deosebire de configuraţia factorială care sintetizează
exprimarea variabilelor indicatori sub formă de combinaţii liniare de factorii
comuni şi specifici, structura factorială evidenţiază schema legăturilor existente
între indicatori şi factori.
Structura factorială este considerată în cadrul analizei factoriale ca fiind
una dintre numeroasele soluţii posibile pentru o anumită problemă concretă. De
altfel, structura factorială mai este cunoscută în literatura de specialitate şi sub
numele de soluţie factor sau soluţie factorială.
În numeroase situaţii practice, soluţia factorială obţinută iniţial nu
întruneşte toate condiţiile necesare pentru a permite o interpretare facilă a
factorilor. De multe ori, se poate întâmpla, ca elementele structurii factor să
sugereze interpretări ale factorilor care să vină în contradicţie cu posibila esenţă ce
poate fi atribuită, în mod logic, factorilor.
În aceste situaţii este necesară găsirea altor soluţii factor, care să permită o
mai bună interpretare şi o mai consistentă interpretare a factorilor. În scopul
creşterii posibilităţilor de interpretare şi a consistenţei acestor interpretări, structura
factor poate fi supusă unei proces de rotaţie, în urma căruia rezultă structura factor
rotită.

4.9. Calculul scorurilor factoriale

O anumită observaţie, corespunzătoare unui factor dat, este determinată


sub forma unui scor corespunzător respectivului factor, scor format pe baza
20 Analiza Datelor. Teorie şi aplicaţii

contribuţiei variabilelor originale. Exprimarea generică a scorurilor pentru un


anumit factor comun în funcţie de variabilele originale este dată de următoarea
relaţie:

, pentru

unde reprezintă coeficienţii scorurilor factor şi sunt elemente ale transpusei


matricei factor F. Sub formă matricială această relaţie poate fi scrisă astfel:

În mod practic, exprimarea celor m observaţii efectuate asupra variabilelor


originale sub forma scorurilor factor, respectiv calculul concret al scorurilor
factor, se bazează pe următoarele relaţii:

, pentru şi

unde reprezintă scorurile factorilor, este elementul din linia k şi coloana i a


transpusei matricii factor, iar este cea de-a i-a observaţie efectuată asupra celei
de-a j-a variabile originale.
Dacă vom considera transpusa matricei de observaţii X, ale cărei linii
reprezintă cele n variabile originale şi ale cărei coloane reprezintă cele m observaţii
făcute asupra acestor variabile, ca având forma următoare:

şi matricea factor F definită mai sus, atunci matricea Z de dimensiune p×m definită
astfel:

se numeşte matricea scorurilor factor. Scorurile factor determinate în acest fel


pot fi folosite în analize ulterioare, în locul valorilor variabilelor originale.

4.10. Criterii de alegere a numărului de factori


Capitolul 4. Analiza factorială(AF) 21

Utilizarea analizei factoriale pentru rezolvarea unor probleme specifice


presupune şi determinarea numărului de factori comuni ce vor fi reţinuţi în model.
Deşi decizia de a reţine un anumit număr de factori este, în principiu, subiectivă,
există o serie de criterii care pot să orienteze utilizatorul atunci când ia o astfel de
decizie.

4.10.1. Criteriul procentului de acoperire

În general, alegerea numărului de factori care să fie incluşi în modelul


factorial depinde de proporţia din variabilitatea comună conţinută în spaţiul cauzal
iniţial pe care utilizatorul doreşte s-o exprime prin intermediul unei succesiuni de
factori comuni. O estimaţie aproximativă a acestei proporţii, pentru cazul în care
numărul de factori reţinuţi este egal cu k, poate fi obţinută cu ajutorul formulei:

unde k reprezintă numărul de factori reţinuţi în model, n reprezintă numărul


variabilelor originale, iar reprezintă valoarea proprie în raport cu care este
definit factorul comun j.
Dezavantajul major al utilizării unei astfel de aproximaţii în problemele de
analiză factorială este dat de faptul că mărimea arată care este ponderea
varianţei primelor k componente principale în varianţa totală şi nu ponderea
varianţei explicate de primii k factori comuni în varianţa spaţiului test; acest lucru
reprezintă un inconvenient deoarece între componentele principale şi factorii
comuni există, aşa cum am mai arătat, o deosebire de esenţă.

4.10.2 Criteriul lui Kaiser

Acest criteriu poate fi folosit atunci când analiza factorială este efectuată
pe o matrice de corelaţie, adică atunci când se presupune că variabilele originale
sunt standardizate. În conformitate cu acest criteriu, numărul de factori necesari a fi
incluşi într-un model de analiză factorială este egal cu numărul de valori proprii
mai mari sau egale cu 1.
Justificarea acestui criteriu este dată de faptul că, pentru analiză, prezintă
importanţă numai acei factori comuni a căror varianţă este cel puţin egală cu
varianţa variabilelor originale, variabile care, fiind normalizate, au varianţa unitară.
În afara faptului că un astfel de criteriu poate fi folosit numai în cazul în
care se lucrează cu variabile normalizate, dezavantajul principal al criteriului
Kaiser este dat de faptul că aplicarea lui conduce la reţinerea în model a unui
număr prea mare de factori.

4.10.3 Criteriul "granulozităţii"


22 Analiza Datelor. Teorie şi aplicaţii

După acest criteriu, numărul de factori ce vor fi reţinuţi în modelul de


analiză factorială se stabileşte pe baza unei analize grafice a valorilor proprii.
Graficul pe care se face analiza se construieşte luând în abscisă numărul de ordine
al valorilor proprii, iar în ordonată valorile acestor valori proprii.
Faptul că, aşa cum ştim, valorile proprii sunt ordonate după magnitudinea
lor descrescătoare va face ca graficul să aibă forma aproximativă a unei curbe de
tipul exponenţialei negative.
Numărul de factori ce se vor reţine în model este determinat de punctul de
pe grafic în dreapta căruia panta curbei devine neglijabilă, numărul de ordine al
valorii proprii corespunzătoare acestui punct determinând numărul de factori ce se
vor reţine.
Dezavantajul acestui criteriu constă în faptul că aplicarea sa conduce la
reţinerea în modelul analizei factoriale a unui număr prea mic de factori comuni.
În practică, alegerea unui anumit număr de factori comuni este puternic
dependentă de natura problemei analizate şi de scopul urmărit în utilizarea analizei
factoriale. De multe ori, scopurile practice urmărite în analize de acest fel pot
conduce la necesitatea de a obţine un singur factor sau cel mult doi. Construirea
unui model cu unul sau doi factori comuni are şi avantajul, care nu este de neglijat,
că facilitează reprezentarea grafică a mărimilor analizei factoriale, reprezentare
care poate să fie deosebit de utilă în faza de interpretare a rezultatelor.

4.11. Aspecte problematice ale analizei factoriale (AF)

Principalele aspecte de luat în seamă în contextual analizei factoriale sunt:


- erorile de măsurare au efect asupra soluției factoriale;
- rotația, deși acceptabilă matematic, este discutabilă prin subiectivism;
- avem de-a face cu o interpretare dificilă și dependentă de intuiția
analistului;
- în cazul unui număr foarte mare de variabile, pot rezulta prea mulți factori
pentru a putea fi analizați (înțeleși);
- analiza factorială nu produce rezultate viabile cu itemi binari;

4.12. Aspecte analitice ale analizei factoriale

Întrucât analiza factorială descrie fiecare variabilă cauzală ca o combinație


liniară de factori comuni (variabile latente) plus un factor unic sau specific, avem
astfel forma analitică ce pleacă de la matricea informaţională iniţială clasică:
Capitolul 4. Analiza factorială(AF) 23

.  

unde p este numărul factorilor comuni ( ),


, , sunt variabilele cauzale (variabilele observate) centrate sau
standardizate, , , sunt factorii comuni, , pentru ,
sunt factorii specifici, iar , , sunt coeficienții
factoriali (factor loadings) corespunzători variabilei observate j şi factorul comun k.
Matriceal, legătura dintre variabilele observate și factori comuni se poate
scrie astfel:

sau

sau
, pentru

unde x este matricea observaţíilor, este transpusa matricei coeficienților


factoriali, este matricea factorilor specifici, iar este matricea factorilor comuni
ordonaţi pe coloane.

Ipotezele modelului analitic


24 Analiza Datelor. Teorie şi aplicaţii

Ipoteza 1. Factorii comuni sunt standardizați, prin urmare vor fi de varianță 1 și


medie 0.
Ipoteza 2. Factorii comuni sunt construiți după principiul separației
informaționale, deci sunt necorelați doi câte doi, adică:

, pentru ;

Ipoteza 3. Factorii specifici sunt de medie 0.


Ipoteza 4. Varianța factorilor specifici se notează cu , pentru
și se numește varianța specifică.
Ipoteza 5. Corelațiile și covarianțele dintre factorii specifici sunt zero, adică:

, pentru ;

Ipoteza 5. Între factorii comuni și factorii specifici nu există suprapunere de


informație, deci sunt absolut necorelați între ei, adică:

, pentru

Aceste ipoteze sunt necesare pentru a estima în mod unic parametrii


modelului. Având în vedere aceste ipoteze, varianța unei variabile observate este:

Suma

se numește comunalitatea variabilei sau echivalent în a scrie . Se observă că


dacă variabilele , pentru sunt standardizate, comunalitățile au
Capitolul 4. Analiza factorială(AF) 25

valori cel mult egale cu 1. Comunalitatea reprezintă variabilitatea comună, datorată


factorilor comuni.
Covarianța dintre două variabile observate este:

pentru
Covarianța dintre o variabilă observată și un factor comun este:

Ținând cont de aceste relații, matricea de covarianță a tabelului de


observații se poate scrie:

unde

este matricea diagonală a varianțelor factorilor specifici.

Estimarea existenței factorilor

Ipoteza existenței unor factori latenți este indusă de o corelație


semnificativă dintre variabilele cauzale. Variabilitatea comună a variabilelor
cauzale conduce la ideea explicării acesteia prin existența unor factori ascunși.
Deci, pe baza matricei de corelații a variabilelor cauzale se poate estima
existența factorilor comuni. Există mai multe teste prin care se poate testa ipoteza
existenței factorilor pe baza matricei de corelații.

Testul de sfericitate Bartlett

Este un test χ2 care compară matricea de corelații cu matricea unitate.


Ipotezele testului:
H0: Nu există factori comuni;
26 Analiza Datelor. Teorie şi aplicaţii

H1: Există cel puțin un factor comun.


În cazul unor variabile absolut necorelate, determinantul matricei de
corelații este 1.
Statistica testului:

unde R este matricea de corelaţie a variabilelor indicator /cauzale:

m reprezintă numărul de instanțe/observaţii/indivizi și n numărul de variabile.


Aceste valori urmează o distribuție cu n(n-1)/2 grade de libertate.
Dacă

ipoteza nulă este respinsă pentru un nivel de încredere de .

Indicele KMO (Kaiser-Meyer-Olkin)

Se bazează tot pe matricea de corelații. Indicele KMO global se calculează astfel:

unde este coeficientul de corelație liniară dintre variabilele iar


reprezintă coeficientul de corelație parțială dintre variabilele . Indicii KMO
pentru fiecare variabilă se calculează astfel:

pentru .
Capitolul 4. Analiza factorială(AF) 27

Acești indici arată care variabile sunt mai puțin corelate cu celelalte, deci
oferă mai puțină variabilitate comună.
Coeficientul de corelație parțială dintre două variabile, , se
calculează astfel:

unde este termenul general al matricei . Corelația parțială reprezintă


legătura liniară dintre două variabile în condițiile în care sunt neutralizate efectele
celorlalte variabile din model asupra celor două variabile.
Interpretarea valorilor KMO: [0.90,1.00] - foarte bună factorabilitate;
[0.80, 0.9) - bună factorabilitate; [0.70 ,0.8) – medie; [0.60, 0.7) – mediocre; [0.50,
0.6) – slabă; [0.00, 0.5) - fără factori comuni.
Capitolul 4
Analiza factorială-Aplicaţie

Prof. dr. Stelian STANCU

4.1. Introducere
În continuare, se va explora tehnica de analiză factorială, abordând:
- atât:
o axele principale, cât și
o metodele de extracție a componentelor principale;
- dar și două metode diferite de identificare a numărului corect de
factori de extras:
o scree plot-ul și
o analiza paralelă;
- precum și două metode diferite de rotaţie a factorilor, pentru a
facilita interpretarea.
4.2. Încărcarea pachetelor necesare
Pachetele ce vor fi utilizate în continuare sunt:
install.packages("psych", dependencies = TRUE)
library(psych)
install.packages("GPArotation", dependencies = TRUE)
library(GPArotation)
4.3. Datele utilizate
Setul de date folosit pentru această aplicaţie se numește data:
data <- read.table ("date_firme.txt", header = TRUE)
data
Simbol RC ROE ROA LC GIG
1 AGQR -8.0501255 -7.3862395 -5.0408985 2.516475179 31.752842
2 ACBU -31.1102183 -3.5095268 -3.0978510 1.629417638 11.730238
3 CDRM 18.0970626 4.4322803 2.3073291 0.454867597 47.942618
4 ISCO 14.1442837 10.7628179 8.1426978 2.501590945 23.642443
5 ARTD 5.9622256 3.2135438 2.6058923 2.881322269 18.909080
6 ALU 0.7863165 0.7994432 0.5243685 6.672375855 12.959853
7 APRB -57.4540875 -1.9153146 -1.4201519 0.004157567 25.852812
8 COBL 7.9021707 2.8716514 2.5166457 0.396805835 12.440893
9 CACU 6.2260705 0.3158756 0.2875096 1.108650438 3.232948
10 CONM -169.0523752 -15.0968952 -12.2541942 21.051113960 18.829707
11 GALV 49.0391044 5.9308433 5.8484571 29.352742000 1.389120
12 GRLA -5.8293224 -27.1066630 -4.4769040 1.187847429 83.484120
13 NTEX 11.3601459 1.6685384 1.6341698 1.463034203 1.985820
14 NAXY -17.0488008 -4.2788657 -3.0026705 0.212258756 31.445655
15 PRCO 71.2261423 7.7311417 2.7496818 1.002444507 64.433690
16 SEOM 2.7870814 1.3382599 1.2753953 8.627401001 3.749167
17 SEOL -37.5964025 -15.2860073 -9.1507524 0.160958488 40.274236
18 UNISEM -82.9427956 -21.2668060 -19.9241379 0.431633410 6.338618
19 UZIN 2.6346922 1.6892427 0.7225290 6.215346747 55.815354
20 BUCU 62.3510166 9.4784319 9.1944525 39.478375110 2.895977
21 COKG -1.4207203 -0.5166130 -0.4695625 0.644480330 8.554467
22 COUT -23.2254888 -13.2020779 -10.7500760 0.573471682 18.964912
23 DONO -12.3843530 -0.6114036 -0.6022784 40.277789840 1.942870
2 Analiza Datelor. Teorie şi aplicaţii

24 GOLF 4.8485866 1.3387413 1.3122067 16.727533780 1.982061


25 HEPI 0.1506958 0.6703943 0.1013705 0.523791209 84.911759
26 MAMA 28.3843401 11.7013245 7.4100542 0.704505554 35.996541
27 MRDO 18.0823836 5.3169984 5.0575976 16.587484760 3.109019
28 SCPS 14.9537586 5.0804934 1.9994719 2.115243742 60.644138
29 PRIB -36.4925070 -0.8798375 -0.8267590 4.824142246 5.869988
30 RPH 1.7425929 6.3092272 2.1052532 6.462150110 9.838303
31 ROVE 6.7323837 3.5480455 0.7935056 0.286009308 77.165783
32 SERC -21.6711131 -1.9297112 -1.8575528 0.999523191 3.547799
33 SCDM 3.7394426 0.6407226 0.5451280 0.696265158 13.653563
34 VIMC 3.0441432 0.5476392 0.5241257 1.664283090 4.293607
A1 A2 A3 SP AFT SF
1 0.62618881 0.000000000 0.956138449 0.6824716 0.000000000 0.000000000
2 0.09957664 0.000000000 1.612133596 0.8826976 0.000000000 0.000000000
3 0.12749743 0.000000000 0.442674546 0.5205738 0.000000000 0.000000000
4 0.57568824 0.139367838 2.237270288 0.7565582 0.000000000 0.000000000
5 0.43706703 0.028500936 2.776960592 0.8109092 0.000000000 0.000000000
6 0.66686695 0.036584323 1.435484775 0.6559172 0.085000110 0.078341108
7 0.02471803 2.090477725 0.001638271 0.7414719 0.000000000 0.000000000
8 0.31847524 0.019949365 0.351059872 0.8763758 0.002587583 0.002580905
9 0.04617834 0.000000000 0.059126766 0.9101989 0.025817453 0.025167687
10 0.07248756 0.399166171 0.958491112 0.8117029 0.221046808 0.181030577
11 0.11926109 0.085543634 15.887720060 0.9861089 0.000000000 0.000000000
12 0.76799733 0.000000000 1.186302680 0.1651588 0.000000000 0.000000000
13 0.14385113 0.000000000 0.686843284 0.9794020 0.000000000 0.000000000
14 0.17612210 0.266043403 0.087158550 0.7017445 0.263886294 0.208789584
15 0.03860495 0.000000000 0.052934637 0.3556631 1.439269889 0.590041264
16 0.45760963 0.000000000 4.869913235 0.9530252 0.000000000 0.000000000
17 0.24339436 0.017162148 0.125745378 0.5986359 0.082081041 0.075854800
18 0.24021541 0.107383614 0.366600882 0.9368655 0.000000000 0.000000000
19 0.27423659 0.000000000 0.623312136 0.4277236 1.114670317 0.527113048
20 0.14746275 0.000000000 0.295518593 0.9700394 0.015714298 0.015471180
21 0.33051016 0.024345042 0.516165607 0.9089250 0.000000000 0.000000000
22 0.46285682 0.000000000 0.251845058 0.8142715 0.081833080 0.075642982
23 0.04863220 0.000000000 26.234259660 0.9850749 0.000000000 0.000000000
24 0.27063694 0.000000000 4.247586873 0.9801794 0.000000000 0.000000000
25 0.67268286 0.915986646 0.500948898 0.1512102 0.000000000 0.000000000
26 0.26106135 0.062335612 0.282770457 0.6332663 0.314056549 0.238997743
27 0.27969751 0.000000000 0.276420455 0.9512129 0.000000000 0.000000000
28 0.13371033 0.000000000 1.324014454 0.3935586 0.554592014 0.356744412
29 0.02265558 0.007080604 0.087190641 0.9396724 0.001091040 0.001089851
30 1.20811535 0.414520218 4.450644908 0.3336785 0.022854791 0.022344121
31 0.11786399 0.786661636 0.229784043 0.2236458 0.596560827 0.373653679
32 0.08571562 0.000000000 0.490325079 0.9626067 0.005130522 0.005104334
33 0.14577788 0.000000000 0.227821896 0.8508019 0.105880373 0.095743062
34 0.17217510 0.000000000 0.748904779 0.9570639 0.000000000 0.000000000
4.4. Descrierea datelor
Este necesară o privire asupra datelor înainte de a efectua orice
analiză. Oricărui individ/item căruia îi lipsesc date și nu pot fi nici “găsite”
din alte surse, nici aproximate, atunci va fi exclus din analiză. Este
important să se țină cont de acest aspect.
describe(data[2:12])
vars n mean sd median trimmed mad min max range skew
RC 1 34 -5.00 41.49 2.71 -1.54 17.55 -169.05 71.23 240.28 -1.70
ROE 2 34 -0.81 8.68 0.73 0.15 4.83 -27.11 11.70 38.81 -1.27
ROA 3 34 -0.45 5.82 0.53 0.11 2.92 -19.92 9.19 29.12 -1.25
LC 4 34 6.48 10.84 1.55 3.96 1.68 0.00 40.28 40.27 2.03
GIG 5 34 24.40 25.42 13.31 20.67 15.38 1.39 84.91 83.52 1.09
Capitolul 4. Analiza factorială(AF)_Aplicaţie 3

A1 6 34 0.29 0.26 0.21 0.25 0.17 0.02 1.21 1.19 1.51


A2 7 34 0.16 0.41 0.00 0.06 0.00 0.00 2.09 2.09 3.46
A3 8 34 2.20 5.11 0.51 0.99 0.62 0.00 26.23 26.23 3.59
SP 9 34 0.73 0.26 0.81 0.76 0.22 0.15 0.99 0.83 -0.88
AFT 10 34 0.15 0.33 0.00 0.06 0.00 0.00 1.44 1.44 2.69
SF 11 34 0.08 0.16 0.00 0.05 0.00 0.00 0.59 0.59 1.94
kurtosis se
RC 5.31 7.12
ROE 1.31 1.49
ROA 2.17 1.00
LC 3.09 1.86
GIG -0.07 4.36
A1 2.26 0.05
A2 12.74 0.07
A3 12.88 0.88
SP -0.55 0.04
AFT 6.79 0.06
SF 2.74 0.03
Pentru a determina numărul de „cazuri complete” din cadrul datelor
– adică acele observaţii cărora nu le lipsește niciun fel de date se aplică:
sum(complete.cases(data[2:12]))
[1] 34
Funcția complete.cases generează un vector boolean, unde o
valoare „TRUE” înseamnă faptul că există „cazuri complete”, iar o valoare
„FALSE” înseamnă că lipsește cel puțin o valoare pentru cazul respectiv.
Sumarea acestui vector ne oferă numărul total de cazuri complete.
Aceasta înseamnă că există 34 de cazuri/observații fără date lipsă, adică
toate.
Nu există un număr specificat care să fie acceptat referitor la
cantitatea de date lipsă, dar dimensiunea eșantionului este importantă pentru
analiza factorilor. Unii autori sugerează că este nevoie de cel puțin 10
observații pentru fiecare variabilă în analiza.
4.5. Evaluarea factoriabilității datelor
Înainte de a merge mai departe cu această analiză, trebuie evaluată
„factoriabilitatea” datelor. Cu alte cuvinte, „există variabile latente
semnificative care pot fi găsite pe baza variabilelor iniţiale?” Putem verifica
acest aspect cu:
- testul de sfericitate al lui Bartlett; și
- (2) măsura KMO (Kaiser-Meyer-Olkin) a adecvării
eșantionării.
4.5.1. Testul de sfericitate, al lui Bartlett
Testul cel mai la îndemână este testul de sfericitate al lui Bartlett -
acesta evaluează dacă variabilele se corelează sau nu, evaluând matricea de
corelație observată față de o „matrice de identitate” (o matrice cu 1 de-a
lungul diagonalei principale și zero-uri în rest). Dacă acest test nu este
semnificativ statistic, nu ar trebui să se utilizeze analiza factorială. Avem
astfel:
4 Analiza Datelor. Teorie şi aplicaţii

cortest.bartlett(data[2:12])
R was not square, finding R from data
$chisq
[1] 314.8428
$p.value
[1] 4.121391e-38
$df
[1] 55
Testul lui Bartlett este semnificativ statistic, sugerând că matricea de
corelație observată între itemi nu este o matrice identitate. Cu toate acestea,
acest lucru nu este un indiciu deosebit de puternic că setul de date este
factorizabil - tot ceea ce spune acest test este că cel puțin unele dintre
variabile sunt corelate între ele.
4.5.2. Testul KMO
Măsura Kaiser-Meyer-Olkin (KMO) a adecvării eșantionării este o
măsură mai bună a factoriabilității. Testul KMO verifică dacă corelațiile
parțiale din datele analizate sunt suficient de apropiate de zero, pentru a
sugera că există cel puțin un factor latent care stă la baza variabilelor
respective.
Valoarea minimă acceptabilă este 0,50, dar majoritatea specialiştilor
recomandă o valoare de minim 0,60 înainte de a efectua o analiză factorială.
Funcția KMO din pachetul "psych" produce o măsură generală a
adecvării eșantionării (MSA-Measure of Sampling Adequacy, așa cum este
etichetată în rezultat) și un MSA pentru fiecare item.
Teoretic, dacă MSA-ul general este prea scăzut, se pot examina
itemii MSA și se înlătură aceia care sunt prea mici.
Observație: Acest lucru trebuie făcut cu prudență, desigur, așa cum este
cazul oricărei metode teoretice și empirice de selectare a itemilor.
KMO(data[2:12])
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = data[2:12])
Overall MSA = 0.55
MSA for each item =
RC ROE ROA LC GIG A1 A2 A3 SP AFT SF
0.63 0.57 0.58 0.58 0.56 0.23 0.35 0.57 0.54 0.61 0.58
KMO-ul global pentru datele analizate este de 0,55, ceea ce arată că suntem
peste valoarea minimă acceptată - acest lucru sugerează că se poate
continua, prudent, cu analiza factorială planificată.
4.6. Determinarea numărului de factori de extras
Prima decizie cu care ne vom confrunta în analiza factorială este
decizia cu privire la numărul de factori pe care va trebui să-i extragem,
pentru a realiza cea mai parsimoniosă (dar totuși interpretabilă) structură
factorială.
Există o serie de metode pe care le-am putea folosi, dar cele mai
frecvent utilizate două metode sunt:
Capitolul 4. Analiza factorială(AF)_Aplicaţie 5

- reprezentarea grafică(scree plot-ul) și


- analiza paralelă.
Cea mai simplă tehnică este scree plot.
4.6.1. Scree plot-ul
Valorile proprii sunt o măsură a cantității de varianță contabilizată de
un factor(variabilitatea) și, prin urmare, pot fi utile în determinarea
numărului de factori pe care trebuie să-i extragem. Într-un scree plot, se
reprezintă pur și simplu valorile proprii pentru toți factorii, și apoi se
analizează unde scad brusc.
Analizând scree plot-ul pentru setul de date data, avem:
scree(data[,2:12])

Figura 1.

Tehnica scree plot implică trasarea unei linii drepte prin valorile
proprii reprezentate, începând cu cea mai mare. Ultimul punct care cade pe
această linie reprezintă ultimul factor care se extrage, în ideea că, dincolo de
acesta, cantitatea de varianță suplimentară explicată nu are sens a fi luată în
calcul.
Indiferent dacă se utilizează o componentă principală sau o extracție
a factorului axei principale, există un prim factor foarte mare în aceste date.
Dacă ar fi să trasăm linia dreaptă începând din acest punct, probabil
se va concluziona că există doar doi factori în setul de date. Dacă, totuși,
veţi începe linia în al doilea punct al scree plot-ului probabil se va
concluziona că există 3 factori în setul de date.
Această din urmă interpretare este probabil mai aproape de adevăr,
dar dacă aceasta ar fi singura dovadă adusă în considerare asupra numărului
6 Analiza Datelor. Teorie şi aplicaţii

de factori de extras, se sugerează a se analiza ambele soluții pentru numărul


de factori.
4.6.2. Analiza paralelă
O metodă mai bună de evaluare a scree plot-ului este în cadrul unei
analize paralele. În plus, față de trasarea valorilor proprii din analiza
factorială (indiferent dacă se bazează pe extracția axei principale sau a
componentelor principale), o analiză paralelă implică generarea de matrici
de corelație aleatorii și după analizarea factorilor acestora, se compară
valorile proprii rezultate cu valorile proprii ale datelor observate.
Ideea din spatele acestei metode este că valorile proprii observate
care sunt mai mari decât valorile proprii aleatorii corespunzătoare sunt mai
susceptibile de a proveni din „factori semnificativi”, decât valorile proprii
observate care se află sub valoarea lor proprie aleatorie corespunzătoare.
fa.parallel(data[,2:12])
Parallel analysis suggests that the number of factors = 3 and the number
of components = 2
Warning messages:
1: In fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect. Try a
different factor score estimation method.
2: In fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, :
An ultra-Heywood case was detected. Examine the results carefully
3: In fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect. Try a
different factor score estimation method.
Capitolul 4. Analiza factorială(AF)_Aplicaţie 7

Figura 2.

## Analiza paralelă sugerează numărul de factori = 3 și numărul de


# componente = 2

Când se analizează în parale graficele, există două locuri în care


trebuie căutat, în funcție de tipul de analiză factorială pe care doriți să o
rulați.
- cele două linii albastre arată valorile proprii observate -
acestea ar trebui să arate identice cu scree plot-urile
trasate de funcția scree.
- liniile punctate roșii arată valorile proprii aleatorii sau
liniile de date simulate.
Fiecare punct de pe linia albastră care se află deasupra liniei de date
simulate corespunzătoare este un factor sau o componentă de extras.
În această analiză, se poate vedea că 3 factori din analiza paralelă
„Analiza factorilor” se află deasupra liniei de date simulate corespunzătoare
8 Analiza Datelor. Teorie şi aplicaţii

și 2 componente din analiza paralelă „Componentele principale” se află


deasupra liniei de date simulate corespunzătoare.
În cazul de faţă, totuși, ultimul factor/componentă se află foarte
aproape de linie - atât pentru extracția componentelor principale, cât și
pentru extracția axei principale. Astfel, ar trebui probabil să se compare
soluțiile cu 3 factori și 2 factori, pentru a vedea care dintre acestea este cea
mai bună, semnificativ vorbind.
4.7. Realizarea analizei factoriale
Având deja o idee cu privire la câți factori (4 sau 3) ar trebui să fie
extrași în analiza bazei de date avută la dispoziţie, în continuare, trebuie
decis dacă se va folosi analiza „factorilor comuni” sau analiza
„componentelor principale”.
Într-un sens foarte larg:
- analiza „factorilor comuni” (sau „factorizarea axei
principale”) este utilizată atunci când se doreşte
identificarea variabilelor latente care stau la baza unui set
de variabile, în timp ce
- analiza „componentelor principale” este utilizată pentru a
reduce un set de variabile la un set mai mic de factori
(adică „componentele principale” ale datelor).
Cu alte cuvinte, analiza factorială este utilizată atunci când se doreşte
evaluarea unui model teoretic cu un set de variabile, iar analiza
componentelor principale este utilizată pentru reducerea dimensionalităţii
datelor.
Ambele abordări au un merit în construcția testului și, prin urmare,
se va parcurge fiecare abordare cu aceste date.
4.7.1. Factorizarea axei principale (analiza factorilor comuni)
Funcția fa ia în calcul următorii parametri atunci când este apelată:
- variabilele care trebuie utilizate în cadrul analizei
factorilor (itemii 2-12 din obiectul data);
- numărul de factori pe care dorim să-i extragem (3 sau 2);
- tipul de analiză a factorilor pe care dorim să-l folosim
(„pa” este factorul axei principale);
- numărul de iterații pentru identificarea „celei mai bune”
soluții (50 este valoarea implicită);âtipul de rotație care
se doreşte a fi folosit(se va folosi „oblimin”)
pa2.out <- fa(data[,2:12], nfactors = 2, fm="pa", max.iter =
50, rotate = "oblimin")
Capitolul 4. Analiza factorială(AF)_Aplicaţie 9

O modalitate rapidă de a vizualiza soluția în cazul rotirii factorilor și


de a determina dacă reprezintă o soluție „interpretabilă” este utilizarea
funcției fa.diagram.
fa.diagram(pa2.out)

Figura 3.

După cum se poate constata, avem:


pa3.out <- fa(data[,2:12], nfactors = 3, fm="pa", max.iter =
50, rotate = "oblimin")
fa.diagram(pa3.out)
Warning message:
In fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect. Try a
different factor score estimation method.
10 Analiza Datelor. Teorie şi aplicaţii

Figura 4.

Soluția cu 3 factori este mai interpretabilă - de fapt, pare să


reproducă mai bine structura factorilor latenți.
pa1.out <- fa(data[,2:12], nfactors = 1, fm="pa", max.iter =
50, rotate = "oblimin")
fa.diagram(pa1.out)

Figura 5.
Capitolul 4. Analiza factorială(AF)_Aplicaţie 11

Comunalitatea
Comunalitatea pentru fiecare variabilă este procentul de varianță
care poate fi explicat prin factorii reținuți/comuni.
Cel mai bine este dacă factorii reținuți/comuni explică mai mult
varianța fiecărei variabile.
pa3.out$communality
RC ROE ROA LC GIG A1 A2
0.67500400 0.74585261 0.96065601 0.30734902 0.79487486 0.34936485 0.07406626
A3 SP AFT SF
0.18445464 0.96073072 0.94738265 0.98284844
Ca punct de interes, diferența principală între modul în care se
efectuează analiza factorilor comuni și analiza componentelor principale
este că matricea de corelație pe care se bazează analiza factorială are 1 de-a
lungul diagonalei principale.
Valori proprii
Valorile proprii din analiza factorială sunt stocate în e.values.
Acestea sunt valorile proprii care au fost reprezentate grafic în scree
plot-urile analizate anterior.
pa3.out$e.values[1:3]
[1] 3.355638 2.802889 1.559348
Dacă se dorește a se vedea valorile proprii din soluția rotită, atunci
avem:
pa3.out$values[1:3]
[1] 3.191218 2.542780 1.248586
Procentul de varianță contabilizat
Se pot folosi valorile proprii, pentru a calcula procentul de varianță
contabilizat de fiecare dintre factori.
Având în vedere că suma maximă a valorilor proprii va fi
întotdeauna egală cu numărul total de variabile din analiză, se poate calcula
procentul de varianță contabilizat prin împărțirea fiecărei valori proprii la
numărul total de variabile din analiză. În exemplul analizat, acesta este 11.
100*pa3.out$e.values[1:3]/length(pa3.out$e.values)
[1] 30.50580 25.48081 14.17589
Dacă se doreşte procentul de varianță contabilizat de soluția rotită, se
pot folosi valorile proprii stocate în values, mai degrabă decât e.values:
100*pa3.out$values[1:3]/length(pa3.out$values)
[1] 29.01107 23.11618 11.35078
Soluție rotită
Au fost analizate deja elementele cu cea mai mare încărcare pentru
fiecare factor (folosind diagrama fa.diagram), dar aceasta arată doar cea
mai mare încărcare pentru fiecare item/observaţie/individ.
Cu toate acestea, fiecare element se va încărca pe fiecare dintre
factori, într-un grad mai mare sau mai mic - și în cele din urmă se va analiza
matricea completă de încărcare a factorilor.
12 Analiza Datelor. Teorie şi aplicaţii

Matricea de încărcare a factorilor ne arată încărcările factorilor


pentru fiecare variabilă, după ce au fost rotiţi la „simple structure”.
În esență, profităm de faptul că există o serie de soluții factoriale
care sunt la fel de acceptabile pentru soluția „optimă” care a fost găsită în
cadrul extracției inițiale (adică echivalente din punct de vedere matematic)
și se rotesc factorii astfel încât să fie mai ușor de interpretat.
Deoarece s-a folosit o rotație oblică a factorului(„oblimin”),
aceasta este uneori numită matrice pattern.
print(pa3.out$loadings, cutoff=0, digits=3)
Loadings:
PA2 PA1 PA3
RC 0.809 -0.1060.029
ROE 0.834 0.1350.124
ROA 0.987 -0.017
-0.065
LC 0.225 0.5160.035
GIG -0.049 -0.7770.233
A1 0.102 -0.562
-0.498
A2 -0.123 -0.254
-0.062
A3 0.184 0.375
-0.035
SP -0.039 0.951
-0.070
AFT 0.054 -0.0680.937
SF 0.004 -0.0830.957
PA2 PA1 PA3
SS loadings 2.442 2.336 2.128
Proportion Var 0.222 0.212 0.193
Cumulative Var 0.222 0.434 0.628
De asemenea, putem privi matricea structurii - aceasta este doar
matricea pattern înmulțită cu matricea de intercorelație a factorilor.
Rezultatul este că aceste valori reprezintă corelațiile dintre variabile
și factori - care pot fi mai intuitive de interpretat.
print(pa3.out$Structure, cutoff=0, digits=3)
Loadings:
PA2 PA1 PA3
RC 0.813 -0.1130.176
ROE 0.851 0.0930.184
ROA 0.978 0.0130.072
LC 0.232 0.504
-0.129
GIG -0.022 -0.8650.519
A1 0.033 -0.374
-0.273
A2 -0.132 -0.2320.018
A3 0.181 0.389
-0.152
SP -0.044 0.977
-0.433
AFT 0.178 -0.4200.970
SF 0.131 -0.4420.988
PA2 PA1 PA3
SS loadings 2.499 2.695 2.559
Proportion Var 0.227 0.245 0.233
Cumulative Var 0.227 0.472 0.705
4.7.2. Analiza în componente principale
În continuare este prezentat modul în care se face o analiză în
componente principale în R. Comenzile nu sunt identice cu cele de la
Capitolul 4. Analiza factorială(AF)_Aplicaţie 13

analiza factorilor comuni. Mulți dintre pași vor fi totuşi similari, dar îi vom
parcurge și pentru analiza în componente principale.
pc2.out <- principal(data[2:12],nfactors = 2,rotate =
"oblimin")
Din nou, se poate arunca o privire rapidă asupra structurii factorilor
pentru această soluție folosind fa.diagram:
fa.diagram(pc2.out)

Figura 6.
pc3.out <- principal(data[2:12],nfactors = 3,rotate =
"oblimin")
fa.diagram(pc3.out)
14 Analiza Datelor. Teorie şi aplicaţii

Figura 7.

Așa cum s-a întâmplat cu axele principale/factorii comuni, soluția


componentelor principale cu 3 factori este mult mai interpretabilă, aliniată
foarte bine cu orientarea factor-element așteptată.
Odată determinat numărul de factori de extras, se pot analiza aceleași
informații pe care le-am extras din soluția de la factorii comuni.
Comunalităţi
Reamintim, acestea sunt procente de varianță care poate fi explicată
prin factorii reținuți pentru fiecare variabilă.
pc3.out$communality
RC ROE ROA LC GIG A1 A2
A3
0.8098483 0.8034054 0.9084866 0.5292525 0.7995683 0.6591251 0.1317390
0.3587572
SP AFT SF
0.8468638 0.9287364 0.9420926
Valori proprii și procent din variația cumulată
Se calculează un vector al valorilor proprii pentru cele 3 componente
principale:
pc3.out$values[1:3]
[1] 3.355638 2.802889 1.559348
Capitolul 4. Analiza factorială(AF)_Aplicaţie 15

și acesta folosește acele valori proprii pentru a calcula procentul de varianță


asociat cu fiecare dintre acești factori:
100*pc3.out$values[1:3]/length(pc3.out$values)
[1] 30.50580 25.48081 14.17589
Soluția rotită
Această matrice de încărcare a factorilor ne arată variabilele care se
încarcă pe fiecare dintre factorii pe care i-am extras/reținut.
print(pc3.out$loadings, cutoff=0, digits=3)
Loadings:
TC2 TC1 TC3
RC 0.889 -0.0910.042
ROE 0.875 0.1280.098
ROA 0.956 0.018
-0.043
LC 0.251 0.6860.020
GIG -0.036 -0.7060.418
A1 0.172 -0.688
-0.595
A2 -0.177 -0.321
-0.030
A3 0.218 0.548
-0.045
SP -0.053 0.820
-0.270
AFT 0.097 -0.0980.924
SF 0.049 -0.1150.933
TC2 TC1 TC3
SS loadings 2.659 2.566 2.342
Proportion Var 0.242 0.233 0.213
Cumulative Var 0.242 0.475 0.688
iar matricea structurii arată corelațiile dintre variabilele inițiale și factori
comuni:
print(pc3.out$Structure, cutoff=0, digits=3)
TC2 TC1 TC3
RC 0.89343 -0.1012 0.1491
ROE 0.88486 0.1058 0.1561
ROA 0.95183 0.0258 0.0472
LC 0.25241 0.6817 -0.1044
GIG 0.00586 -0.7965 0.5681
A1 0.11469 -0.5585 -0.4290
A2 -0.17931 -0.3140 0.0226
A3 0.21293 0.5578 -0.1428
SP -0.08038 0.8787 -0.4529
AFT 0.18793 -0.2982 0.9544
SF 0.14098 -0.3180 0.9630
4.8. Concluzii finale
Analiza factorială, deși este o procedură matematică elaborată, este
extrem de subiectivă.
Trebuie să se facă alegeri cu privire la:
- tipul metodei utilizate(axe principale sau componente
principale);
- numărul de factori de extras;
- metoda de rotație a factorilor, ce trebuie folosită atunci
când se caută o structură simplă;
- interpretarea factorilor.
16 Analiza Datelor. Teorie şi aplicaţii

Rezultatul analizei factoriale (și interpretarea rezultată) va depinde în


mare măsură de variabilele care sunt selectate pentru includere în analiză.
Analiza factorială este o metodă excelentă pentru evaluarea
constructelor latente subiacente, dar în fond este o metodă de analiză a unor
matrici de corelație mari. Dacă se selectează mai multe variabile care sunt
extrem de corelate, nu ar trebui să surprindă dacă acestea se grupează pentru
a forma un unic factor comun.
Capitolul 5
Analiza factorială a corespondenţelor-AC

Prof. dr. Stelian STANCU

5.1. Introducere

Pentru a identifica locul analizei datelor într-un studiu statistic, trebuie mai
întâi prezentate cele trei faze distincte ale acesteia:
- faza metodologică - presupune stabilirea instrumentelor: unități și
nomenclatoare;
- faza tehnică - reprezintă punerea în practică a instrumentelor. Astfel se
stabilesc liste de unități selectate, se construiește chestionarul, acesta se
aplică, răspunsurile sunt verificate manual și automat obțînând în final
rezultatele brute;
- faza de publicare - cuprinde toate metodele și tehnicile de exploatare a
bazei de date. În această etapă se obțin o mulțime de tabele, grafice dintre
care se păstrează cele relevante, se interpretează, se explică , toate acestea
cu ajutorul tehnicilor de analiză datelor. Prin urmare, se constată că aceasta
ocupă un loc din ce în ce mai important în modelarea rezultatelor brute și
transformarea lor pentru a facilita înțelegerea rezultatelor studiului de către
cititorul neavizat.
Pe de altă parte, spre deosebire de dată mining, analiza datelor are un câmp
de aplicare mai îngust, având ca scop verificarea existenței unui anumit model sau
extragerea parametrilor necesari pentru adaptarea modelului teoretic la realitate și
nu descoperirea de modele ascunse, precum cealaltă tehnică menționată.
Analiza datelor, conţinând demersul descriptiv şi exploratoriu, cuprinde
două mari grupe de metode şi anume:
- metode de analiză factorială - se bazează pe nori de puncte şi presupune
identificarea axelor factoriale. Metodele analizei/explorării multidimensionale au
ca scop reducerea numarului de variabile prin construirea de caracteristici sintetice
care combina pe cele initiale. Principalele metode utilizate de aceasta sunt:
o analiza în componente principale;
o analiza corespondenţelor simple;
o analiza corespondenţelor multiple;
o analiza canonică
o analiza factorială discriminantă;
o analiza corelaţiei;
o analiza varianţei.
o analiza regresiei liniare şi neliniare.
- metode de clasificare automată.
Clasificarea automată presupune gruparea indivizilor în clase omogene in
funcţie de un anumit criteriu, iar rezultatele se prezintă de cele mai multe ori sub
2 Analiza Datelor. Teorie şi aplicaţii

forma unui arbore. Aceste tehnici se bazează pe algoritmi (ascendenţi sau


descendenţi) şi nu pe calcule formale.
Clasificarea, utilizează cel mai adesea metode precum:
o clasificarea ascendentă ierarhică;
o metoda norilor dinamici;
o o metodă mixtă.
În concluzie, există o mare varietate de metode şi tehnici de analiză a
datelor, generate de importanţa utilizării analizei datelor în cele mai diferite
domenii ale ştiintei. Dintre acestea, analiza datelor este cel mai frecvent utilizată şi
cu rezultate de o mare utilitate în domeniul economico-financiar şi în domeniul
social.

5.2. Analiza factorială a corespondenţelor - simplă şi multiplă

Analiza factorială a corespondențelor este o metodă folosită în scopul


studierii nu a independenţei dintre variabile, cât pentru descrierea asociaţiei/
corespondenţei între două variabile calitative, care facilitează scoaterea în evidenţă
a legăturilor ce există între modalităţi, iar pe de altă parte, oferă posibilitatea unei
reprezentări grafice relativ uşor de interpretat (Benzecri, 1980).
Analiza factorială a corespondențelor este utilizată pentru studiul
legăturii dintre două sau mai multe variabile calitative (categoriale, nominale).
Deşi nu este o metodă de analiză multivariată, ci una bivariată, prin analiza
factorială se pot descrie relaţiile dintre modalităţile variabilelor, ceea ce nu poate fi
surprins cu ajutorul testului χ2 .
Obiectivul de bază al analizei factoriale corespondenţelor îl reprezintă
studierea simultană a liniilor şi coloanelor unui tabel de contingenţă cu scopul de a
pune în evidenţă legăturile sau corespondenţele între cele două ansambluri (Lefter,
2004).
Există două metode de analiză a corespondenţelor în funcție de numărul
variabilelor analizate:
- analiza bivariată a corespondențelor;
- analiza corespondențelor multiple (analiza multivariată a corespondențe-
lor).
În literatura de specialitate sunt consacrate două modele de analiză a
corespondențelor:
- modelul bazat pe analiza canonică a tabelelor disjunctive complete sau pe
analiza în componente principale a tabelelor de profile ( Benzécri, 1973);
- modelul bazat pe analiza în componente principale a matricei de inerție
(Greenacre, 1983).
În continuare va fi prezentat cel mai simplu și ușor de înțeles model,
modelul de analiză bivariată a corespondențelor propus de M. Greenacre.

5.3. Matricea sau tabelul de contingenţă


Capitolul 5. Analiza corespondenţelor(AC) 3

Aceasta reprezintă un tablou rectangular de dimensiune m  n , ce este


folosit pentru reprezentarea datelor referitoare la frecvenţele relative sau absolute
înregistrate pe o mulţime de indivizi (obiecte, observaţii), de valorile a două
variabile de tip discret, prima variabilă, notată cu x, având m valori posibile, iar cea
de-a doua variabilă, notată cu y, având n valori posibile.
Liniile unei matrici de contingenţă reprezintă valorile posibile ale primei
variabile discrete, iar coloanele acestei matrici reprezintă valorile posibile ale celei
de-a doua variabile discrete.
În analiza datelor, matricea de contingenţă se mai numeşte şi matrice de tip:

variabile (caracteristici, modalităţi) × variabile (caracteristici, modalităţi)

Exemplul 5.1.a. Fie variabilele discrete1 şi .


Un element k ij reprezintă frecvenţa, absolută sau relativă, a obiectelor
pentru care prima variabilă ia valoarea x i1 , iar cea de-a doua variabilă ia valoarea
x i2 . Acest element arată la câte obiecte (indivizi, observaţii), cele două variabile
analizate au simultan valorile x i1 şi respectiv x i2 .
Ca urmare, se poate defini tabelul de contingenţă următor:
1 2 … j … q Total
1 … …
2 … …
… … … … … … … …
i … …
… … … … … … … …
p … …
Total … …
Tabelul 5.1.a. Tabelul de contingenţă de dimensiune

unde:
; şi .

Exemplul 5.1.b. Prezentăm în continuare tabelul de contingenţă pentru membrii


Parlamentului României 1996-2000, după partid şi centrul universitar unde au
urmat studiile, statistică de la începutul mandatului:

Partid Centru universitar


Bucureşti Cluj Iaşi Timişoara Altul TOTAL
PTŢ-CD 36 9 9 6 10 70
PDSR 58 3 15 3 14 93
PD 31 8 7 3 6 55

1
Pot fi inclusiv nominale.
4 Analiza Datelor. Teorie şi aplicaţii

PNL 20 3 3 5 1 32
UDMR 6 17 0 1 6 30
PRM 10 0 3 0 6 19
PUNR 4 11 1 2 3 21
PSDR 5 2 1 0 0 8
PNL-CD 14 4 2 1 2 23
Independent 4 0 0 0 0 4
Altul 16 2 4 0 1 23
TOTAL 204 59 45 21 49 378
Tabelul 5.1.b. Membrii Parlamentului României 1996-2000, după partid şi centrul
universitar unde au urmat studiile

5.4. Analiza bivariată a corespondențelor

5.4.1. Aspecte generale

Analiza bivariată a corespondențelor sintetizează legătura dintre două


variabile categoriale. Inputul de bază este tabelul de contingență. Presupunem că
avem o variabilă cu p modalități şi o variabilă cu q modalități. Un tabel de
frecvențe numit tabelul de contingență este un tabel cu p linii și q coloane,
elementul de pe linia i și coloana j reprezentând numărul de indivizi care au
modalitatea i pentru prima variabilă și modalitatea j pentru cea de a doua variabilă.
Frecvențele încrucișate sunt memorate în matricea K:

Un element oarecare, , reprezintă numărul de instanțe la care variabila


are modalitatea i iar variabila are modalitatea j.
Frecvențele cumulate pe linii și coloană sunt definite astfel:
, , reprezintă numărul de instanțe la care se întâlnește
modalitatea i pentru variabila ;
, reprezintă numărul de instanțe la care se întâlnește
modalitatea j pentru variabila ;
.
Indicatorii care măsoară intensitatea legăturii dintre variabilele și sunt
χ2 și inerția, I:
Capitolul 5. Analiza corespondenţelor(AC) 5

unde:
; ; ;

Inerția este o măsură a împrăștierii valorilor în tabelul de frecvențe al celor


două variabile. Cu cât frecvențele sunt mai distanțate față de cele teoretice, cu atât
variabilele sunt mai legate între ele.
Analiza bivariată a corespondențelor analizează felul în care este distribuită
această inerție.

5.4.2. Analiza în componente principale a matricei de inerție

Contribuția la a unei frecvențe este:

unde , . și reflectă impactul avut de legătura dintre


modalitatea i a variabilei și modalitatea j a variabilei în respingerea ipotezei
de independență dintre și . Cu cât această valoare este mai mare, cu atât
cuplul celor două modalități este mai important în legătură.
Contribuția la inerția tabelului de contingență (varianța) este:

Valorile și sunt frecvențe efective, reale, empirice, în timp ce


valorile și sunt frecvențele teoretice, adică acele frecvențe care sunt
așteptate (expected frequencies) pentru a avea confirmată ipoteza de independență
pentru cele două variabile. Abaterile dintre aceste valori pot fi văzute ca abateri de
la ipoteza de independență și sunt calculate astfel:

Aceste abateri, inerții, pot fi grupate într-o matrice , având termenul


general , , .
Suma pătratelor elementelor matricei reprezintă inerția totală.
6 Analiza Datelor. Teorie şi aplicaţii

Analiza corespondențelor se poate realiza și prin efectuarea unei analize în


componente principale a tabelului R. Acest lucru este echivalent cu descompunerea
inerției în spațiul principal sau al componentelor principale. Prima componentă
principală va culege maximul de inerție, a doua maximul din inerția rămasă, șamd,
componentele fiind absolut necorelate două câte două (axe ortogonale - vezi ACP).
Analiza în componente principale se poate efectua în două sensuri:
- pe matricea , caz în care componentele principale vor reprezenta
modalitățile variabilei ;
- pe matricea transpusă, , caz în care componentele principale vor
reprezenta modalitățile variabilei .
Axele de inerție vor fi obținute prin calculul vectorilor proprii ai matricelor
și . Modelul numeric de calcul este Singular Value
Decomposition (SVD - Descompunerea în Valori Singulare) şi se bazează pe o
teoremă din algebră liniară care spune că o matrice dreptunghiulară A poate fi
scrisă ca un produs de trei matrice, adică:

unde: k = min(p,q), B este o matrice ortogonală ( = ) care conține


pe coloane vectorii proprii corespunzători valorilor proprii nenule ale matricei
, este o matrice care conține pe diagonală rădăcinile pătrate ale
valorilor proprii nenule ale matricei (se numesc și valorile
singulare) iar este o matrice ortogonală ( = ) care are în
coloane vectorii proprii corespunzători valorilor proprii nenule ale matricei
. Matricele și au aceleași k valori
proprii nenule.
Vectorii proprii ai matricei sunt componentele principale
ale matricei matricea inerției. Acestea apar ca niște componente principale ale
modalităților primei variabile. Matricea este o matrice cu p linii și q coloane.
Deci rolul indivizilor dintr-o analiză în componente principale clasică este
jucat de modalitățile variabilei . Dacă transpunem matricea , rolul indivizilor
va fi jucat de modalitățile celei de a doua variabile, . Algoritmul SVD întoarce în
matricea D și componentele principale ale matricei , deoarece vectorii
proprii ai matricei sunt componentele principale ale matricei
, liniile matricei sau, același lucru, coloanele matricei având
rol de indivizi. Cantitatea de inerție explicată de o axă este: , unde ,
sunt valorile proprii nenule ale matricelor și
. Suma valorilor proprii este inerția totală. Reprezentarea grafică a
Capitolul 5. Analiza corespondenţelor(AC) 7

modalităților celor două variabile se face în primele două axe, care grupează cea
mai mare parte a inerției. Reprezentările sunt identice celor de la analiza in
componente principale, un profil linie (altfel spus, o modalitate a primei variabile)
este un punct într-un spațiu q-dimensional, și invers, un profil coloană este un
punct în spațiul p-dimensional. Pentru reprezentare pot fi utilizate direct
componentele principale sau coordonate linie/coloană standardizate, calculate
astfel:
- coordonate linie, de forma
- coordonate coloană, de forma
unde B și D sunt matricele ortogonale furnizate de algoritmul SVD cu
componentele principale pentru profilele linie/coloană, iar C este matricea
diagonală a valorilor singulare.
Deci, analiza bivariată a corespondențelor descrie detaliat legătura dintre
variabilele și prin descompunerea inerției pe k = min(p,q) axe de inerție,
fiecare axă reprezentând un aspect al legăturii. Rolul analistului este de a interpreta
fiecare aspect al legăturii prin identificarea apropierilor dintre modalități pe fiecare
axă. Aceste apropieri sunt numite corespondențe și dau de fapt numele metodei.
Coordonatele linie și coloană vor reprezenta modalitățile în cele k
dimensiuni. Aceste corespondențe dintre modalități pot fi vizualizate grafic prin
reprezentări simultane în cele k dimensiuni.
Capitolul 5
Analiza factorială a corespondenţelor simple
în mediul R (ACS) -Aplicaţie

Prof. dr. Stelian STANCU

5.1. Aspecte generale

Analiza corespondenței (AC) este o extensie a analizei în componente


principale potrivită pentru explorarea relațiilor dintre variabilele calitative sau date
categoriale. La fel ca analiza în componente principale, oferă o soluție pentru
rezumarea și vizualizarea setului de date în grafice bidimensionale.
În continuare, vom descrie analiza corespondenţelor simple, care este
utilizată pentru a analiza frecvențele formate din două date categoriale, adică un
tabel de date cunoscut sub numele de tabel de contengență. Acesta oferă scoruri
pentru factori(coordonate) atât pentru liniile tabelului, cât și pentru coloanele
tabelului de contingență. Aceste coordonate sunt utilizate pentru a vizualiza grafic
asocierea dintre elementele de pe liniile şi coloanele din tabelul de contingență.
Când se analizează un tabel de contingență bidirecțional, o întrebare tipică
este dacă anumite elemente de linie sunt asociate cu unele elemente ale elementelor
de coloană. Analiza corespondenței este o abordare geometrică pentru vizualizarea
coloanelor unui tabel de contingență bidirecțional ca puncte într-un spațiu cu
dimensiuni reduse, astfel încât pozițiile liniilor și coloanlor să fie în concordanță cu
asocierile lor din tabel. Scopul este de a avea o viziune globală a datelor, care este
utilă pentru interpretare.
În continuare, vom arăta cum se calculează și se interpretează analiza
corespondenței folosind două pachete din mediul R: FactoMineR pentru analiză
și respectiv factoextra pentru vizualizarea datelor. Totodată, vom evidenţia
modul de dezvăluire a celor mai importante variabile care explică variațiile dintr-
un set de date. Vom continua explicând cum se aplică analiza corespondenței
folosind linii și coloane suplimentare, necesare în demersal de a face predicții cu
analiza de corespondenţă.

Încărcarea pachetelor/bibliotecilor

Bibliotecile ce vor fi utilizate în continuare sunt:


install.packages("FactoMineR", dependencies = TRUE)
library(FactoMineR)
install.packages("factoextra", dependencies = TRUE)
library(factoextra)
install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
install.packages("gplots", dependencies = TRUE)
library(gplots)
2 Analiza Datelor. Teorie şi aplicaţii

install.packages("corrplot", dependencies = TRUE)


library(corrplot)

Datele

Setul de date folosit pentru această aplicaţie se


numește data:
data <- read.table ("datelee.txt", header = TRUE)
data
Bucuresti Cluj Iasi Timisoara Altul TOTAL
PTT-CD 36 9 9 6 10 70
PDSR 58 3 15 3 14 93
PD 31 8 7 3 6 55
PNL 20 3 3 5 1 32
UDMR 6 17 0 1 6 30
PRM 10 0 3 0 6 19
PUNR 4 11 1 2 3 21
PSDR 5 2 1 0 0 8
PNL-CD 14 4 2 1 2 23
Indep 4 0 0 0 0 4
Altul 16 2 4 0 1 23
TOTAL 204 59 45 21 49 378

# head(data)
Bucuresti Cluj Iasi Timisoara Altul TOTAL
PTT-CD 36 9 9 6 10 70
PDSR 58 3 15 3 14 93
PD 31 8 7 3 6 55
PNL 20 3 3 5 1 32
UDMR 6 17 0 1 6 30
PRM 10 0 3 0 6 19

data<-data[-12,-6]
data
Bucuresti Cluj Iasi Timisoara Altul
PTT-CD 36 9 9 6 10
PDSR 58 3 15 3 14
PD 31 8 7 3 6
PNL 20 3 3 5 1
UDMR 6 17 0 1 6
PRM 10 0 3 0 6
PUNR 4 11 1 2 3
PSDR 5 2 1 0 0
PNL-CD 14 4 2 1 2
Indep 4 0 0 0 0
Altul 16 2 4 0 1
# Convertirea datelor în format tabel
dt <- as.table(as.matrix(data))
dt
Bucuresti Cluj Iasi Timisoara Altul
PTT-CD 36 9 9 6 10
PDSR 58 3 15 3 14
PD 31 8 7 3 6
PNL 20 3 3 5 1
UDMR 6 17 0 1 6
PRM 10 0 3 0 6
PUNR 4 11 1 2 3
PSDR 5 2 1 0 0
Capitolul 5. Analiza corespondenţelor simple(ACS) 3

PNL-CD 14 4 2 1 2
Indep 4 0 0 0 0
Altul 16 2 4 0 1
# Reprezentarea grafică a datelor
balloonplot(t(dt), main ="data", xlab ="", ylab="", label =
FALSE, show.margins = FALSE)

Figura 5.1.

Observaţie: Sumele pe linii şi respectiv pe coloane sunt tipărite în mod implicit în


marginile inferioară și, respectiv, în dreapta. Aceste valori sunt ascunse, în graficul
de mai sus, folosind argumentul show.margins = FALSE.
Pentru tabelul de contingență dat, se poate utiliza testul hi-pătrat pentru a
evalua dacă există o dependență semnificativă între categoriile din linii și respectiv
coloane:
chisq <- chisq.test(data)
chisq
Pearson's Chi-squared test
data: data
X-squared = 113.44, df = 40, p-value = 5.955e-09
În exemplul presupus, variabilele linie și coloană sunt asociate statistic
semnificativ:
> chisq$p.value
[1] 5.955222e-09

5.2. Codul R pentru a calcula analiza de corespondenţă (AC)


4 Analiza Datelor. Teorie şi aplicaţii

Poate fi utilizată funcția CA() [din pachetul FactoMiner]. Un format


simplificat este:
CA(X, ncp = 4, graph = TRUE)
unde:
X - reprezintă un cadru de date-dataframe (tabel de contingență);
ncp - reprezintă numărul de dimensiuni păstrate în rezultatele finale.
Graph - reprezintă o valoare logică. Dacă valoarea este TRUE, atunci va fi afişat
graficul.
Pentru a calcula analiza corespondenței, putem avea:
library(FactoMineR)
res.ca <- CA(data, graph = FALSE)
res.ca
**Results of the Correspondence Analysis (CA)**
The row variable has 11 categories; the column variable has 5 categories
The chi square of independence between the two variables is equal to
113.4374 (p-value = 5.955222e-09 ).
*The results are available in the following objects:
name description
1 "$eig" "eigenvalues"
2 "$col" "results for the columns"
3 "$col$coord" "coord. for the columns"
4 "$col$cos2" "cos2 for the columns"
5 "$col$contrib" "contributions of the columns"
6 "$row" "results for the rows"
7 "$row$coord" "coord. for the rows"
8 "$row$cos2" "cos2 for the rows"
9 "$row$contrib" "contributions of the rows"
10 "$call" "summary called parameters"
11 "$call$marge.col" "weights of the columns"
12 "$call$marge.row" "weights of the rows"
Observaţie: Obiectul care este creat folosind funcția CA() conține multe
informații găsite în multe liste și matrice diferite. Aceste valori sunt descrise în
secțiunea următoare.

5.3. Vizualizare și interpretare rezultatelor

Vom folosi următoarele funcții [din factoextra] pentru a ajuta la


interpretarea și vizualizarea analizei corespondențelor:
get_eigenvalue(res.ca): se extrag valorile proprii/varianțele reținute de
fiecare dimensiune (axă);
fviz_eig(res.ca): se vizualizează valorile proprii;
get_ca_row(res.ca), get_ca_col(res.ca): se extrag rezultatele
pentru linii și, respectiv, pentru coloane;
fviz_ca_row(res.ca), fviz_ca_col(res.ca): se vizualizează
rezultatele pentru linii și, respectiv, pentru coloane;
fviz_ca_biplot(res.ca): se faceți un biplot pentru linii și, respectiv,
pentru coloane.
În continuare, vom ilustra fiecare dintre aceste funcții.
Capitolul 5. Analiza corespondenţelor simple(ACS) 5

Semnificație statistică

Pentru a interpreta analiza corespondențelor, primul pas este de a evalua


dacă există o dependență semnificativă între linii și coloane.
O metodă riguroasă este utilizarea statisticii hi-pătrat pentru examinarea
asocierii dintre variabilele linii și coloane. Acest lucru apare în partea de sus a
raportului generat de funcția summary(res.ca) sau print(res.ca). O
statistică hi-pătrată ridicată înseamnă o legătură puternică între variabilele linie și
coloană.
În exemplul prezentat, asocierea este foarte semnificativă (hi-pătrat:
113.4374, p = 6.0829e-06).
summary(res.ca)
Call:
CA(X = data, graph = FALSE)

The chi square of independence between the two variables is equal to


113.4374 (p-value = 5.955222e-09 ).

Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4
Variance 0.225 0.046 0.024 0.005
% of var. 74.990 15.260 7.992 1.758
Cumulative % of var. 74.990 90.250 98.242 100.000

Rows (the 10 first)


Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
PTT-CD | 4.542 | -0.045 0.164 0.081 | -0.034 0.462 0.047 |
PDSR | 34.305 | -0.353 13.588 0.891 | 0.122 7.982 0.107 |
PD | 0.819 | -0.047 0.143 0.394 | -0.041 0.538 0.301 |
PNL | 25.476 | -0.163 0.995 0.088 | -0.487 43.923 0.790 |
UDMR | 115.871 | 1.192 50.125 0.974 | 0.169 4.951 0.020 |
PRM | 24.730 | -0.343 2.620 0.238 | 0.580 36.948 0.684 |
PUNR | 64.714 | 1.070 28.242 0.982 | -0.078 0.730 0.005 |
PSDR | 5.407 | 0.118 0.132 0.055 | -0.165 1.257 0.106 |
PNL-CD | 2.202 | 0.014 0.006 0.006 | -0.094 1.183 0.246 |
Indep | 9.026 | -0.547 1.405 0.350 | -0.278 1.789 0.091 |
Dim.3 ctr cos2
PTT-CD 0.145 16.195 0.855 |
PDSR -0.008 0.069 0.000 |
PD -0.036 0.772 0.226 |
PNL 0.185 12.129 0.114 |
UDMR -0.072 1.703 0.004 |
PRM 0.179 6.740 0.065 |
PUNR 0.084 1.632 0.006 |
PSDR -0.453 18.142 0.805 |
PNL-CD -0.143 5.219 0.568 |
Indep -0.490 10.599 0.282 |

Columns
Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
Bucuresti | 41.990 | -0.259 16.128 0.864 | -0.060 4.179 0.046 |
Cluj | 173.807 | 1.050 76.451 0.990 | -0.040 0.539 0.001 |
Iasi | 20.164 | -0.354 6.624 0.739 | 0.095 2.344 0.053 |
Timisoara | 31.265 | 0.107 0.283 0.020 | -0.551 36.898 0.540 |
Altul | 32.872 | 0.095 0.516 0.035 | 0.445 56.041 0.781 |
Dim.3 ctr cos2
Bucuresti -0.076 12.964 0.074 |
6 Analiza Datelor. Teorie şi aplicaţii

Cluj -0.096 6.000 0.008 |


Iasi 0.010 0.048 0.001 |
Timisoara 0.497 57.254 0.439 |
Altul 0.210 23.734 0.173 |
# hi-pătrat statistic
hi2 <- 113.4374
# Grade de libertate
df <- (nrow(data) - 1) * (ncol(data) - 1)
df
[1] 40
# p-value
pval <- pchisq(hi2, df = df, lower.tail = FALSE)
pval
[1] 5.955182e-09

Valori proprii /variații

Reamintim că examinăm valorile proprii pentru a determina numărul de


axe care trebuie luate în considerare. Valorile proprii și proporția varianțelor
reținute de diferitele axe pot fi extrase folosind funcția get_eigenvalue()
[din pachetul factoextra]. Valorile proprii sunt mari pentru prima axă și mai
mici pentru axele ulterioare.
library("factoextra")
eig.val <- get_eigenvalue(res.ca)
eig.val
eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.225043980 74.98994 74.98994
Dim.2 0.045794457 15.25979 90.24973
Dim.3 0.023983664 7.99192 98.24165
Dim.4 0.005276788 1.75835 100.00000
Valorile proprii corespund cantității de informații reținută de fiecare axă.
Dimensiunile sunt ordonate descrescător și listate în funcție de cantitatea de
varianță explicată în soluție. Dimensiunea 1 explică cea mai mare varianță a
soluției, urmată de dimensiunea 2 și așa mai departe.
Procentul cumulativ explicat se obține prin adăugarea proporțiilor
succesive ale variației explicate pentru a obține totalul curent. De exemplu, 74,99%
plus 15,25% este egal cu 90,24% și așa mai departe. Prin urmare, aproximativ
90,24% din variație se explică prin primele două dimensiuni.
Valorile proprii pot fi utilizate pentru a determina numărul de axe de
reținut. Nu există o regulă generală pentru a alege numărul de dimensiuni de păstrat
pentru interpretarea datelor. Depinde de scopul cercetării și de nevoia
cercetătorului. De exemplu, dacă sunteți mulțumit de 70% din varianța totală
explicate, utilizați numărul de dimensiuni necesar pentru a realiza acest lucru.
Observaţie: O reducere bună a dimensiunii se realizează atunci când primele
dimensiuni reprezintă o proporție mare a variabilității.
În analiza făcută, primele două axe explică 90,24% din variație. Acesta este
un procent foarte bun..
Capitolul 5. Analiza corespondenţelor simple(ACS) 7

O metodă alternativă pentru a determina numărul de dimensiuni este de a


privi un Scree Plot, care este graficul valorilor proprii/varianțelor ordonate de la
cea mai mare la cea mai mică. Numărul de componente este determinat în acel
punct dincolo de care valorile proprii rămase sunt toate relativ mici și de
dimensiuni comparabile.

Scree plot-ul poate fi produs folosind funcția fviz_eig() sau


fviz_screeplot() [din pachetul factoextra].
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 50))

Figura 5.2.

Observaţie: Punctul în care scree plot-ul arată o îndoire (așa-numitul „cot”) poate
fi considerat ca indicând o dimensionalitate optimă.
De asemenea, este posibil să se calculeze o valoare proprie medie peste
care ar trebui păstrată axa în soluție.
Datele noastre conțin 11 linii și 5 coloane.
Dacă datele ar fi aleatorii, valoarea așteptată a valorii proprii pentru fiecare
axă ar fi 1/(nrow (data) -1) = 1/10 = 10% în termeni de linii.
În mod similar, axa medie ar trebui să reprezinte 1/(ncol(data) -1)
= 1/4 = 25% în ceea ce privește cele 5coloane.
Remarcă (M.T. Bendixen 1995): Orice axă cu o contribuție mai mare decât
maximul dintre aceste două procente ar trebui considerată ca fiind importantă și
inclusă în soluția de interpretare a datelor.
Codul R ce urmează, trasează scree plot-ul cu o linie întreruptă roșie
specificând valoarea proprie medie:
8 Analiza Datelor. Teorie şi aplicaţii

fviz_screeplot(res.ca)+geom_hline(yintercept=25.00,
linetype=2, color="red")

Figura 5.3.

Conform graficului de mai sus, numai dimensiunea 1 trebuie utilizată în


soluție. Dimensiunea 2 explică doar 15,25% din inerția totală, care este sub
valoarea medie egală (25,00%) și prea puțin pentru a fi păstrată pentru o analiză
ulterioară.
Observaţie: Se poate utiliza mai mult de o dimensiuni. Cu toate acestea, este puțin
probabil ca dimensiunile suplimentare să contribuie semnificativ la interpretarea
naturii asocierii dintre linii și coloane.
Dimensiunea 1 explică aproximativ 74,98% din inerția totală. Cu cât este
mai mare reținerea, cu atât mai multă subtilitate în datele originale este păstrată în
soluția cu dimensiuni reduse (M. Bendixen, 2003).

Biplot-ul

Funcția fviz_ca_biplot() [din pachetul factoextra] poate fi


utilizată pentru a desena biplotul variabilelor de pe linii şi coloane.
# repel= TRUE pentru a evita suprapunerea textului (lent dacă
există mai multe puncte)
fviz_ca_biplot(res.ca, repel = TRUE)
Capitolul 5. Analiza corespondenţelor simple(ACS) 9

Figura 5.4.

Graficul de mai sus se numește grafic simetric (symetric plot) și prezintă un


model(pattern) global în cadrul datelor. Liniile sunt reprezentate prin puncte
albastre și coloanele prin triunghiuri roșii.
Distanța dintre orice punct de linie sau punct de coloană oferă o măsură a
asemănării(similarităţii) sau a disimilarităţii lor. Punctele de linie cu profil similar
sunt incluse pe harta factorilor. Același lucru este valabil și pentru punctele de
coloană.
Acest grafic arată că:
- PDSR, PRM sunt votate mai mult la Iaşi;
- UDMR este partidul votat în Alte
- ……
Observaţii:
1. Graficul simetric reprezintă profilurile de linii și coloane simultane într-un
spațiu comun. În acest caz, numai distanța dintre punctele liniilor sau
distanța dintre punctele coloanelor poate fi interpretată cu adevărat.
2. Distanța dintre orice element de linie și coloană nu este semnificativă!
Puteți face doar afirmații generale despre modelul observat.
3. Pentru a interpreta distanța dintre punctele de coloană și linie, profilurile
coloanei trebuie prezentate în spațiul liniilor sau invers. Acest tip de hartă
se numește biplot asimetric(asymmetric biplot) și va fi discutat la sfârșitul
acestui capitol.
10 Analiza Datelor. Teorie şi aplicaţii

Următorul pas pentru interpretare este de a determina care variabile de linie și


coloană contribuie cel mai mult la definirea diferitelor dimensiuni reținute în
model.

Graficul variabilelor de linie

Rezultate

Funcția get_ca_row() [din pachetul factoextra] este utilizată


pentru a extrage rezultatele pentru variabilele linie. Această funcție returnează o
listă care conține coordonatele, cos2, contribuția și inerția variabilelor de linie:
row <- get_ca_row(res.ca)
row
Correspondence Analysis - Results for rows
===================================================
Name Description
1 "$coord" "Coordinates for the rows"
2 "$cos2" "Cos2 for the rows"
3 "$contrib" "contributions of the rows"
4 "$inertia" "Inertia of the rows"
Componentele funcției get_ca_row() pot fi utilizate în graficul de linii
după cum urmează:
row$coord: reprezintă coordonatele fiecărui punct de linie din fiecare
dimensiune (1, 2, și 4). Folosit pentru a crea graficul scatter plot.
row$cos2: reprezintă calitatea reprezentării liniilor.
var$contrib: contribuția liniilor (în%) la definirea dimensiunilor.
Observaţie: Este posibil să trasați punctele linii și să le colorați fie în funcție de i)
calitatea lor pe harta factorilor (cos2), fie de ii) valoarea contribuției lor la
definirea dimensiunilor (contrib).
Diferitele componente pot fi accesate după cum urmează:
# Coordonate
head(row$coord)
Dim 1 Dim 2 Dim 3 Dim 4
PTT-CD -0.04467236 -0.03381621 0.144824289 0.02037735
PDSR -0.35254405 0.12189063 -0.008209201 0.01486191
PD -0.04708009 -0.04114281 -0.035662683 0.02113982
PNL -0.16264060 -0.48744259 0.185369511 -0.05015341
UDMR 1.19219227 0.16901809 -0.071737607 -0.07029520
PRM -0.34250545 0.58019095 0.179331589 -0.07680298
# Cos2: calitatea pe harta factorilor
head(row$cos2)
PTT-CD 0.08135933 0.04662078 0.855091133 0.016928759
PDSR 0.89137719 0.10655539 0.000483322 0.001584106
PD 0.39384168 0.30077031 0.225982647 0.079405355
PNL 0.08790088 0.78955473 0.114185746 0.008358653
UDMR 0.97352369 0.01956682 0.003524907 0.003384584
PRM 0.23843975 0.68420398 0.065366809 0.011989466
# Contribuţia la componentele principale
head(row$contrib)
Dim 1 Dim 2 Dim 3 Dim 4
PTT-CD 0.1642164 0.4624271 16.19472292 1.457243
Capitolul 5. Analiza corespondenţelor simple(ACS) 11

PDSR 13.5878429 7.9821318 0.06913173 1.029843


PD 0.1433105 0.5378311 0.77158430 1.232265
PNL 0.9950587 43.9230227 12.12883969 4.035427
UDMR 50.1250310 4.9508860 1.70297272 7.432093
PRM 2.6201694 36.9479879 6.73999949 5.618861
În această secțiune, se descrie cum se vizualizează numai punctele de linie.
Apoi, se evidențiază liniile în funcție, fie de i) calitatea lor de reprezentare pe harta
factorilor, fie ii) de contribuțiile lor la definirea dimensiunilor.

Coordonatele punctelor de linie

Codul R de mai jos afișează coordonatele fiecărui punct de linie din fiecare
dimensiune (1, 2, 3 și respectiv 4):
head(row$coord)
Dim 1 Dim 2 Dim 3 Dim 4
PTT-CD -0.04467236 -0.03381621 0.144824289 0.02037735
PDSR -0.35254405 0.12189063 -0.008209201 0.01486191
PD -0.04708009 -0.04114281 -0.035662683 0.02113982
PNL -0.16264060 -0.48744259 0.185369511 -0.05015341
UDMR 1.19219227 0.16901809 -0.071737607 -0.07029520
PRM -0.34250545 0.58019095 0.179331589 -0.07680298
Utilizînd funcția fviz_ca_row()[din pachetul factoextra] pentru a
vizualiza doar punctele de pe linii:
fviz_ca_row(res.ca, repel = TRUE)

Figura 5.5.

Este posibil să schimbați culoarea și forma punctelor linii, folosind


argumentele col.row și shape.row după cum urmează:
fviz_ca_row(res.ca, col.row="steelblue", shape.row = 15)
12 Analiza Datelor. Teorie şi aplicaţii

Figura 5.6.

Graficul de mai sus arată relațiile dintre punctele liniilor:


- liniile cu un profil similar sunt grupate împreună;
- liniile corelate negativ sunt poziționate pe laturile opuse ale originii
graficului (cadrane opuse);
- distanța dintre punctele liniilor și originea măsoară calitatea punctelor
liniilor pe harta factorilor. Punctele de linie care sunt departe de origine
sunt bine reprezentate pe harta factorilor.

Calitatea reprezentării rândurilor

Rezultatul analizei arată că tabelul de contingență a fost reprezentat cu


succes într-un spațiu de dimensiuni reduse, utilizând analiza corespondențelor.
Dimensiunea 1 este suficientă pentru a reține 74,98% din inerția totală
(variația) conținută în date.
Cu toate acestea, nu toate punctele sunt la fel de bine afișate în unica
dimensiune. Calitatea reprezentării liniilor pe harta factorilor se numește cosinusul
pătrat (cos2) sau corelațiile pătrate.
cos2 măsoară gradul de asociere între linii/coloane și o anumită axă.
cos2 de puncte linii poate fi extras după cum urmează:
head(row$cos2,5)
Dim 1 Dim 2 Dim 3 Dim 4
PTT-CD 0.08135933 0.04662078 0.855091133 0.016928759
PDSR 0.89137719 0.10655539 0.000483322 0.001584106
Capitolul 5. Analiza corespondenţelor simple(ACS) 13

PD 0.39384168 0.30077031 0.225982647 0.079405355


PNL 0.08790088 0.78955473 0.114185746 0.008358653
UDMR 0.97352369 0.01956682 0.003524907 0.003384584
Valorile cos2 sunt cuprinse între 0 și 1. Suma cos2 pentru linii pe toate
dimensiunile CA este egală cu unu.
Calitatea reprezentării unei linii sau coloane în n dimensiuni este pur și
simplu suma cosinusului pătrat al acelei linii sau coloane peste n dimensiuni.
Dacă un element linie este bine reprezentat de două dimensiuni, suma
cos2 este limitată la unu. Pentru unele dintre elementele linie, este necesară mai
mult de o dimensiune pentru a reprezenta perfect datele.
Este posibil să se coloreze punctele de linie după valorile lor cos2
folosind argumentul col.row = "cos2". Aceasta produce un gradient de culori,
care poate fi personalizat folosind argumentul gradient.cols. De exemplu,
gradient.cols = c("white", "blue", "red") înseamnă că:
variabilele cu valori mici ale cos2 vor fi colorate în „white”
variabilele cu valori medii cos2 vor fi colorate în „ blue”
variabilele cu valori mari ale cos2 vor fi colorate în "red".
# Culorie după valori cos2: calitate pe harta factorilor
fviz_ca_row(res.ca, col.row = "cos2", gradient.cols =
c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Figura 5.7.

Este de reținut faptul că este posibilă modificarea transparenței punctelor


liniilor în funcție de valorile cos2 folosind opțiunea alpha.row = "cos2". De
exemplu:
# Se schimbă transparența prin valorile cos2
14 Analiza Datelor. Teorie şi aplicaţii

fviz_ca_row(res.ca, alpha.row="cos2")

Figura 5.8.

De asemenea, se poate vizualiza cos2 ca puncte de linie pe toate


dimensiunile, folosind pachetul corrplot:
library("corrplot")
corrplot(row$cos2, is.corr=FALSE)

Figura 5.9.
Capitolul 5. Analiza corespondenţelor simple(ACS) 15

De asemenea, este posibil a crea o diagram cu bare(bar plot) cu linii


cos2 utilizând funcția fviz_cos2() [din pachetul factorextra]:
# cos2 de linii pe Dim.1 şi Dim.2
fviz_cos2(res.ca, choice = "row", axes = 1:2)

Figura 5.10.

Observaţie: Toate punctele linii, cu excepția PTT-CD, sunt bine reprezentate de


prima dimensiune. Aceasta implică faptul că poziția punctului care corespunde
itemului PTT-CD pe graficul de împrăștiere ar trebui interpretată cu o anumită
prudență. O soluție cu dimensiuni superioare este probabil necesară pentru itemul
PTT-CD.

Contribuțiile liniilor la dimensiuni

Contribuția liniilor (în%) la definirea dimensiunilor poate fi extrasă după


cum urmează:
head(row$contrib)
Dim 1 Dim 2 Dim 3 Dim 4
PTT-CD 0.1642164 0.4624271 16.19472292 1.457243
PDSR 13.5878429 7.9821318 0.06913173 1.029843
PD 0.1433105 0.5378311 0.77158430 1.232265
PNL 0.9950587 43.9230227 12.12883969 4.035427
UDMR 50.1250310 4.9508860 1.70297272 7.432093
PRM 2.6201694 36.9479879 6.73999949 5.618861
Variabilele linie cu valoarea mai mare contribuie cel mai mult la definirea
dimensiunilor.
16 Analiza Datelor. Teorie şi aplicaţii

Liniile care contribuie cel mai mult la Dim.1 și Dim.2 sunt cele mai
importante în explicarea variabilității în setul de date.
Liniile care nu contribuie prea mult la nicio dimensiune sau care contribuie
la ultimele dimensiuni sunt mai puțin importante.
Este posibil să utilizați funcția corrplot() [din pachetul corrplot]
pentru a evidenția cele mai importante puncte de linie pentru fiecare dimensiune:
library("corrplot")
corrplot(row$contrib, is.corr=FALSE)

Figura 5.11.

Funcția fviz_contrib()[din pachetul factoextra] poate fi utilizată


pentru a reprezenta o diagramă cu bare cu contribuții de linie. Dacă datele conțin
mai multe linii, se poate decide afișarea numai a acelor linii care contribuie
consistent. Codul R de mai jos prezintă primele 10 linii care contribuie la
dimensiuni:
# Contribuția liniilor la dimensiunea 1
fviz_contrib(res.ca, choice = "row", axes = 1, top = 11)
# Contribuția liniilor la dimensiunea 2
fviz_contrib(res.ca, choice = "row", axes = 2, top = 11)
Capitolul 5. Analiza corespondenţelor simple(ACS) 17

Figura 5.12.

Contribuția totală la dimensiunea 1 și 2 poate fi obținută după cum urmează:


# Contribuția totală la dimensiunea 1 și 2
fviz_contrib(res.ca, choice = "row", axes = 1:2, top = 11)

Figura 5.13.

Linia punctată roșie din graficul de mai sus indică valoarea medie
așteptată, dacă contribuțiile au fost uniforme.
18 Analiza Datelor. Teorie şi aplicaţii

Se poate observa că:


- elementele linie UDMR, PUNR, PDSR şi PRM sunt cele mai importante în
definirea primei dimensiuni;
- elementele linie PNL și PRM contribuie cel mai mult la dimensiunea 2.
Cele mai importante (sau cele care contribuie) linii pot fi evidențiate pe
graficul de împrăștiere(scatter plot) după cum urmează:
fviz_ca_row(res.ca, col.row = "contrib", gradient.cols =
c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Figura 5.14.

Scatter plot-ul oferă o idee despre la ce pol al dimensiunilor contribuie


efectiv categoria de tip linii. Este evident că itemul de linie UDMR are o
contribuție importantă la polul pozitiv al primei dimensiuni, în timp ce categoriile
PRM şi PDSR au o contribuție majoră la polul negativ al primei dimensiuni etc….
Cu alte cuvinte, dimensiunea 1 este definită în principal de opoziția între
UDMR (polul pozitiv) și PRM şi PDSR (polul negativ).
Capitolul 5. Analiza corespondenţelor simple(ACS) 19

Observaţie: Este posibil să controlați transparența punctelor linie în funcție de


valorile contribuției lor, utilizând opțiunea alpha.row = "contrib". De
exemplu:
# Modificați transparența prin valorile contrib
fviz_ca_row(res.ca, alpha.row="contrib", repel = TRUE)

Figura 5.15.

Graficul variabilelor de coloană

Rezultate

Funcția get_ca_col() [din pachetul factoextra] este utilizată


pentru a extrage rezultatele pentru variabilele de coloană. Această funcție
returnează o listă care conține coordonatele, cos2, contribuția și inerția
variabilelor coloană:
col <- get_ca_col(res.ca)
col
Correspondence Analysis - Results for columns
===================================================
Name Description
1 "$coord" "Coordinates for the columns"
2 "$cos2" "Cos2 for the columns"
3 "$contrib" "contributions of the columns"
4 "$inertia" "Inertia of the columns"
Rezultatul pentru coloane oferă aceleași informații ca cele descrise linii.
Din acest motiv, vom afișa doar rezultatul pentru coloanele din această
secțiune însoţite de un comentariu foarte scurt.
Pentru a obține acces la diferitele componente, se utilizează următoarele linii de
cod:
20 Analiza Datelor. Teorie şi aplicaţii

# Coordonatele punctelor coloană


head(col$coord)
Dim 1 Dim 2 Dim 3 Dim 4
Bucuresti -0.25932735 -0.05955039 -0.075902625 -0.03532316
Cluj 1.04988993 -0.03975218 -0.096020409 0.02177213
Iasi -0.35385578 0.09495203 0.009798357 0.18722243
Timisoara 0.10697480 -0.55149729 0.497161752 0.00306056
Altul 0.09461864 0.44494408 0.209551362 -0.05240639
# calitatea reprezentării
head(col$cos2)
Dim 1 Dim 2 Dim 3 Dim 4
Bucuresti 0.86433949 0.045578174 0.0740459471 1.603639e-02
Cluj 0.98987540 0.001419106 0.0082798047 4.256914e-04
Iasi 0.73925705 0.053229372 0.0005668255 2.069468e-01
Timisoara 0.02033436 0.540448422 0.4392005753 1.664444e-05
Altul 0.03530432 0.780702158 0.1731631556 1.083036e-02
# Contribuţii
head(col$contrib)
Dim 1 Dim 2 Dim 3 Dim 4
Bucuresti 16.1275211 4.1792146 12.96392255 12.761087807
Cluj 76.4505039 0.5386034 6.00028371 1.402143370
Iasi 6.6237802 2.3437769 0.04765535 79.080025621
Timisoara 0.2825030 36.8978750 57.25420453 0.009861876
Altul 0.5156919 56.0405300 23.73393385 6.746881326
Plot-uri: calitate și contribuție
fviz_ca_col() este utilizată pentru a produce graficul punctelor coloanelor.
Pentru a crea un plot simplu, avem:
fviz_ca_col(res.ca)

Figura 5.16.

La fel ca la punctele de linie, este posibil să colorați punctele de coloană


după valorile lor cos2:
fviz_ca_col(res.ca, col.col = "cos2",gradient.cols =
c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)
Capitolul 5. Analiza corespondenţelor simple(ACS) 21

Figura 5.17.

Codul R de mai jos creează un grafic cu bare(barplot) cu coloane cos2:


fviz_cos2(res.ca, choice = "col", axes = 1:2)

Figura 5.18.
22 Analiza Datelor. Teorie şi aplicaţii

Observaţii: 1. Valoarea cos2 este între 0 și 1. Un cos2 apropiat de 1 corespunde


unei variabile de coloană/linie care este bine reprezentată pe harta factorilor.
2. Pe exemplul dat, elementul de coloană Timişoara este mai puţin
reprezentat pe primele două dimensiuni. Poziția acestui element trebuie interpretată
cu prudență în spațiul format de dimensiunile 1 și 2.
Pentru a vizualiza contribuția liniilor la primele două dimensiuni, avem:
fviz_contrib(res.ca, choice = "col", axes = 1:2)

Figura 5.19.

Opțiuni pentru biplot

Biplot-ul este o reprezentare grafică a liniilor și coloanelor în 2 sau 3


dimensiuni.

Biplot-ul simetric

După cum s-a menționat mai sus, graficul standard de analiză a


corespondenței este un biplot simetric în care atât liniile (punctele albastre) cât și
coloanele (triunghiuri roșii) sunt reprezentate în același spațiu, folosind
coordonatele principale. Aceste coordonate reprezintă profilurile de linii și coloane.
În acest caz, doar distanța dintre punctele liniilor sau distanța dintre
punctele coloanelor poate fi interpretată cu adevărat.
Cu un grafic simetric, inter-distanța dintre linii și coloane nu poate fi
interpretată, ci poate fi făcută doar o afirmație generală despre model.
fviz_ca_biplot(res.ca, repel = TRUE)
Capitolul 5. Analiza corespondenţelor simple(ACS) 23

Figura 5.20.

Observaţie: Pentru a interpreta distanța dintre punctele de coloană și punctele de


linie, cel mai simplu mod este de a face un grafic asimetric. Aceasta înseamnă că,
profilurile coloanelor trebuie să fie prezentate în spațiu pe linii sau invers.

Biplot asimetric

Pentru a crea un biplot asimetric, punctele liniilor (sau coloanelor) sunt


reprezentate grafic din coordonatele standard (S), iar profilurile coloanelor (sau
liniilor) sunt reprezentate grafic din coordonatele principale (P) (M.Bendixen
2003).
Pentru o axă dată, coordonatele standard și cele de principiu sunt legate astfel:

P = sqrt(eigenvalue)x S

unde:
P: reprezintă coordonata principală a unei linii(sau a unei coloane) pe axă;
eigenvalue: reprezintă valoarea proprie a axei;
În funcție de situație, alte tipuri de afișare pot fi setate folosind harta
argumentelor (Nenadic & Greenacre, 2007) în funcția fviz_ca_biplot()
[din pachetul factoextra].

Opțiunile permise pentru harta argumentelor sunt:


"rowprincipal" sau "colprincipal" - acestea sunt așa-numitele biplot-uri
asimetrice, cu linii în coordonate principale și coloane în coordonate standard, sau
invers (cunoscut și sub denumirea de linie-metric-conservare sau respective
coloană-metric-conservare);
24 Analiza Datelor. Teorie şi aplicaţii

"rowprincipal": coloanele sunt reprezentate în spațiul liniilor;


„colprincipal”: liniile sunt reprezentate în spațiul coloanelor;
„symbiplot” - atât liniile, cât și coloanele sunt scalate pentru a avea varianțe
egale cu valorile singulare (rădăcini pătrate ale valorilor proprii), care oferă un
biplot simetric, dar nu păstrează valorile liniilor sau coloanelor.
„rowgab” sau „colgab”: reprezintă hărți asimetrice propuse de Gabriel &
Odoroff (Gabriel & Odoroff, 1990):
„rowgab”: reprezintă linii în coordonatele principale și coloane în coordonate
standard înmulțite cu masa.
"colgab": coloane în coordonate principale și rânduri în coordonate standard
înmulțite cu masa.
„rowgreen” sau „colgreen”: reprezintă așa-numitele biplot-uri de contribuție
care arată vizual cele mai importante puncte (Greenacre, 2006b).
"rowgreen": reprezintă linii în coordonate principale și coloane în coordonate
standard, înmulțite cu rădăcina pătrată a masei.
"colgreen": reprezintă coloane în coordonatele principale și linii în coordonate
standard, înmulțite cu rădăcina pătrată a masei.
Codul R de mai jos trasează un biplot asimetric standard:
fviz_ca_biplot(res.ca, map ="rowprincipal", arrow = c(TRUE,
TRUE), repel = TRUE)

Figura 5.21.

Am folosit, săgețile argument, care sunt vectori de două elemente logice ce


specifică dacă graficul trebuie să conțină puncte (FALSE, implicit) sau săgeți
(TRUE). Prima valoare stabilește liniile și a doua valoare stabilește coloanele.
Capitolul 5. Analiza corespondenţelor simple(ACS) 25

Dacă unghiul dintre două săgeți este mic, atunci există o asociere puternică
între rândul și coloana corespunzătoare.
Pentru a interpreta distanța dintre o linie şi o coloană, trebuie proiectate
perpendicular punctele de linie pe săgeata coloanei.

Contribuția biplot

În biplot-ul simetric standard (menționat în secțiunea anterioară), este


dificil să cunoaștem cele mai importante puncte ale soluției CA.
M.Greenacre a propus o nouă scalare afișată (numită contribuția biplot)
care încorporează contribuția punctelor (M.Greenacre, 2013). În acest afișaj,
punctele care contribuie foarte puțin la soluție, sunt aproape de centrul biplotului și
sunt relativ neimportante pentru interpretare.
Un biplot de contribuție poate fi desenat folosind argumentul map =
"rowgreen" sau map = "colgreen".
În prima linie, trebuie decis dacă se analizează contribuțiile liniilor sau
coloanelor la definirea axelor.
În exemplul analizat, se va face interpretarea contribuției liniilor la axe. Se
folosește argumentul map = "colgreen". În acest caz, coloanele sunt în
coordonate principale și liniile în coordonate standard, înmulțite cu rădăcina pătrată
a masei. Pentru o linie dată, pătratul noii coordonate pe o axă i este exact
contribuția acestei linioi la inerția axei i.
fviz_ca_biplot(res.ca, map ="colgreen", arrow = c(TRUE,
FALSE), repel = TRUE)

Figura 5.22.

În graficul anterior, poziția punctelor profilului coloanei este neschimbată


față de cea din biplot-ul convențional. Cu toate acestea, distanțele punctelor liniilor
26 Analiza Datelor. Teorie şi aplicaţii

de la originea graficului sunt legate de contribuțiile lor la harta factorilor


bidimensionali.
Cu cât o săgeată este mai aproape (în termeni de distanță unghiulară) de o
axă, cu atât este mai mare contribuția categoriei de linii pe acea axă față de cealaltă
axă. Dacă săgeata este la jumătatea distanței dintre cele două, categoria de linii
contribuie la cele două axe în aceeași măsură.
Este evident că UDMR la categoria de linii are o contribuție importantă la
polul pozitiv al primei dimensiuni, în timp ce categoriile PRM şi PDSR au o
contribuție majoră la polul negativ al primei dimensiuni;
Dimensiunea 2 este definită în principal de categoria linie PUNR.
Categoria linie UDMR poate fi privită şi prin faptul că ea contribuie la cele
două axe în aceeași măsură.

Descrierea dimensiunii

Pentru a identifica cu ușurință punctele de linie și coloană care sunt cele


mai asociate cu dimensiunile principale, se poate utiliza funcția dimdesc() [din
pachetul FactoMineR]. Variabilele linie/coloană sunt sortate după coordonatele
lor în ieșirea dimdesc().
# Descrierea dimensiunii
res.desc <- dimdesc(res.ca, axes = c(1,2))
res.desc
$`Dim 1`
$`Dim 1`$row
coord
Indep -0.54665664
PDSR -0.35254405
PRM -0.34250545
Altul -0.30888880
PNL -0.16264060
PD -0.04708009
PTT-CD -0.04467236
PNL-CD 0.01443299
PSDR 0.11838603
PUNR 1.06959156
UDMR 1.19219227

$`Dim 1`$col
coord
Iasi -0.35385578
Bucuresti -0.25932735
Altul 0.09461864
Timisoara 0.10697480
Cluj 1.04988993

$`Dim 2`
$`Dim 2`$row
coord
PNL -0.48744259
Indep -0.27827754
PSDR -0.16490014
PNL-CD -0.09435739
PUNR -0.07759050
Capitolul 5. Analiza corespondenţelor simple(ACS) 27

Altul -0.04217024
PD -0.04114281
PTT-CD -0.03381621
PDSR 0.12189063
UDMR 0.16901809
PRM 0.58019095

$`Dim 2`$col
coord
Timisoara -0.55149729
Bucuresti -0.05955039
Cluj -0.03975218
Iasi 0.09495203
Altul 0.44494408

Descrierea dimensiunii 1:

# Descrierea dimensiunii 1 după punctele de linie


head(res.desc[[1]]$row, 5)
coord
Indep -0.5466566
PDSR -0.3525440
PRM -0.3425054
Altul -0.3088888
PNL -0.1626406
# Descrierea dimensiunii 1 pe puncte de coloană
head(res.desc[[1]]$col, 5)
coord
Iasi -0.35385578
Bucuresti -0.25932735
Altul 0.09461864
Timisoara 0.10697480
Cluj 1.04988993

Descrierea dimensiunii 2:

# Descrierea dimensiunii 2 după punctele de linie


res.desc[[2]]$row
coord
PNL -0.48744259
Indep -0.27827754
PSDR -0.16490014
PNL-CD -0.09435739
PUNR -0.07759050
Altul -0.04217024
PD -0.04114281
PTT-CD -0.03381621
PDSR 0.12189063
UDMR 0.16901809
PRM 0.58019095
# Descrierea dimensiunii 1 pe puncte de coloană
res.desc[[2]]$col
coord
Timisoara -0.55149729
Bucuresti -0.05955039
Cluj -0.03975218
Iasi 0.09495203
Altul 0.44494408
Capitolul 5
Analiza factorială a corespondenţelor multiple în mediul R-Aplicaţie

Prof. dr. Stelian STANCU

5.1. Aspecte generale

Dacă analiza simplă a corespondențelor (ACS) este utilizată pentru a


analiza tabelul de contingență format din două variabile categoriale, analiza
corespondențelor multiple (ACM) este o extensie a ACS pentru a analiza un tabel
de date care conține mai mult de două variabile categoriale.
Există mai multe funcții R de la diferite pachete pentru a calcula ACM,
inclusiv:
MCA() [din pachetul FactoMineR]
dudi.mca() [din pachetul ade4]

Aceste pachete oferă, de asemenea, câteva funcții standard pentru a


vizualiza rezultatele analizei. Totodată, există posibilitatea de a utiliza pachetul
factoextra pentru a genera grafice expresive.
În continuare, vom arăta cum se calculează și se interpretează analiza
corespondențelor, folosind două pachete din mediul R: FactoMineR pentru
analiză și respectiv factoextra pentru vizualizarea datelor
Încărcarea pachetelor/bibliotecilor
# Pachetele şi bibliotecile ce vor fi utilizate în continuare
# sunt:
install.packages("FactoMineR", dependencies = TRUE)
library(FactoMineR)
install.packages("factoextra", dependencies = TRUE)
library(factoextra)
install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
install.packages("gplots", dependencies = TRUE)
library(gplots)
install.packages("corrplot", dependencies = TRUE)
library(corrplot)
install.packages("psych", dependencies = TRUE)
library(psych)
Datele
Setul de date folosit pentru această aplicaţie se
numește ACM:
ACM <- read.table("C:/Users/Administrator/Documents/ACM.txt",
header = TRUE)
str(ACM)
'data.frame': 75 obs. of 10 variables:
$ NrCrt : int 1 2 3 4 5 6 7 8 9 10 ...
$ Varsta : int 29 38 38 45 41 39 30 56 51 61 ...
2 Analiza Datelor. Teorie şi aplicaţii

$ H : int 165 173 157 184 169 146 172 165 168 129 ...
$ Gen : chr "F" "F" "F" "F" ...
$ Domiciliu : chr "R" "U" "R" "R" ...
$ Studii : chr "P" "P" "S" "S" ...
$ Profesie : chr "L" "NL" "L" "L" ...
$ Religie : chr "O" "NO" "O" "O" ...
$ ApPolitica : chr "S" "D" "D" "D" ...
$ Nationalitate: chr "R" "A" "R" "R" ...
head(ACM[, 1:10], 5)
NrCrt Varsta H Gen Domiciliu Studii Profesie Religie ApPolitica
1 1 29 165 F R P L O S
2 2 38 173 F U P NL NO D
3 3 38 157 F R S L O D
4 4 45 184 F R S L O D
5 5 41 169 F U P L O D
Nationalitate
1 R
2 A
3 R
4 R
5 R
Datele conțin 75 de linii (persoane fizice) și 9 coloane (variabile). Vom
folosi doar unii dintre acești indivizi și variabile pentru a efectua analiza
corespondențelor multiple. Coordonatele celorlalți indivizi și variabile de pe harta
factorilor vor fi previzionate din rezultatele ACM anterioare.
describe(ACM)
vars n mean sd median trimmed mad min max range skew
NrCrt 1 75 38.00 21.79 38 38.00 28.17 1 75 74 0.00
Varsta 2 75 47.31 16.55 46 46.93 19.27 15 88 73 0.16
H 3 75 161.09 8.95 162 161.38 7.41 129 184 55 -0.46
Gen* 4 75 1.29 0.46 1 1.25 0.00 1 2 1 0.89
Domiciliu* 5 75 1.72 0.45 2 1.77 0.00 1 2 1 -0.96
Studii* 6 75 1.56 0.50 2 1.57 0.00 1 2 1 -0.24
Profesie* 7 75 1.51 0.50 2 1.51 0.00 1 2 1 -0.03
Religie* 8 75 1.71 0.46 2 1.75 0.00 1 2 1 -0.89
ApPolitica* 9 75 1.45 0.50 1 1.44 0.00 1 2 1 0.18
Nationalitate* 10 75 1.80 0.40 2 1.87 0.00 1 2 1 -1.47
kurtosis se
NrCrt -1.25 2.52
Varsta -0.75 1.91
H 1.51 1.03
Gen* -1.22 0.05
Domiciliu* -1.09 0.05
Studii* -1.97 0.06
Profesie* -2.03 0.06
Religie* -1.22 0.05
ApPolitica* -1.99 0.06
Nationalitate* 0.16 0.05
În terminologia ACM, datele conțin:
- indivizi activi (liniile 1:75): indivizi care sunt utilizați în analiza
corespondențelor multiple;
- variabile active (coloane 5:10): variabile care sunt utilizate în ACM;
- variabile suplimentare: nu participă la ACM. Coordonatele acestor variabile
vor fi predicţionate:
o variabile cantitative suplimentare (quanti.sup): Coloanele 2 și
3, corespunzătoare coloanelor Varsta și respectiv H(înălţimea);
Capitolul 5. Analiza corespondenţelor multiple(ACM) 3

o variabile calitative suplimentare (quali.sup): Coloanele 4 şi 5,


corespunzătoare pentru Gen şi respectiv Domiciliu. Acest
factor variabil va fi utilizat pentru a colora indivizii pe grupe.
În continuare se vor subseta doar indivizi activi și variabile pentru analiza
corespondențelor multiple:
ACM.active <- ACM[1:75, 4:10]
head(ACM.active)
Gen Domiciliu Studii Profesie Religie ApPolitica Nationalitate
1 F R P L O S R
2 F U P NL NO D A
3 F R S L O D R
4 F R S L O D R
5 F U P L O D R
6 F U S NL O S R
Rezumatul datelor
Rezumatul funcției summary() din R poate fi utilizat pentru a calcula
frecvența variabilelor categoriale.
summary(ACM.active)[ ,1:7]
Gen Domiciliu Studii Profesie
Length:75 Length:75 Length:75 Length:75
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Religie ApPolitica Nationalitate
Length:75 Length:75 Length:75
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
Funcția summary() returnează dimensiunea fiecărei variabile categoriale.
De asemenea, este posibilă reprezentarea frecvenței variabilelor
categoriale. Codul R de mai jos prezintă cele 7 coloane:
for(i in 1:7) {
plot(ACM.active[,i], main=colnames(ACM.active)[i],
ylab = "Count", col="steelblue", las = 2, ylim = c(0, 45))
}
sau echivalent
for (i in 1:ncol(ACM.active)) {
plot(ACM.active[,i], main=colnames(ACM.active)[i],
ylab = "Count", col="steelblue", las = 2)
}
Graficele de mai sus pot fi utilizate pentru a identifica variabilele
categoriale cu o frecvență foarte mică. Aceste tipuri de variabile pot denatura
analiza și trebuie eliminate.
summary pentru ACM
Funcția summary.MCA() [din pachetul FactoMineR] este utilizată
pentru a imprima un rezumat al rezultatelor analizei corespondențelor multiple:
summary(object, nb.dec=3, nbelements = 10, ncp = TRUE,
file ="", ...)
unde:
object: reprezintă un obiect din clasa ACM;
nb.dec: reprezintă numărul zecimalelor tipărite;
4 Analiza Datelor. Teorie şi aplicaţii

nbelements: reprezintă numărul de variabile linie/coloană care trebuie scrise.


Pentru a avea toate elementele, utilizați nbelements = Inf.
ncp: reprezintă Numărul de dimensiuni de tipărit;
file: reprezintă un nume de fișier opțional pentru exportarea rezumatelor.
Imprimați summary pentru MCA pentru dimensiunile 1 și 2:
res.mca <- MCA(ACM.active, graph = TRUE)

res.mca
**Results of the Multiple Correspondence Analysis (MCA)**
The analysis was performed on 75 individuals, described by 7 variables
*The results are available in the following objects:
name description
1 "$eig" "eigenvalues"
2 "$var" "results for the variables"
3 "$var$coord" "coord. of the categories"
4 "$var$cos2" "cos2 for the categories"
5 "$var$contrib" "contributions of the categories"
6 "$var$v.test" "v-test for the categories"
7 "$ind" "results for the individuals"
8 "$ind$coord" "coord. for the individuals"
9 "$ind$cos2" "cos2 for the individuals"
10 "$ind$contrib" "contributions of the individuals"
11 "$call" "intermediate results"
12 "$call$marge.col" "weights of columns"
13 "$call$marge.li" "weights of rows"
summary(res.mca, nb.dec = 2, ncp = 2)
Call:
Capitolul 5. Analiza corespondenţelor multiple(ACM) 5

MCA(X = ACM.active, graph = TRUE)

Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Variance 0.21 0.19 0.16 0.14 0.13 0.10 0.08
% of var. 20.79 18.80 16.08 13.56 12.62 10.20 7.95
Cumulative % of var. 20.79 39.59 55.67 69.23 81.85 92.05 100.00

Individuals (the 10 first)


Dim.1 ctr cos2 Dim.2 ctr cos2
1 | 0.35 0.80 0.12 | 0.13 0.11 0.02 |
2 | 0.39 0.96 0.10 | -0.20 0.28 0.03 |
3 | 0.51 1.64 0.28 | 0.01 0.00 0.00 |
4 | 0.51 1.64 0.28 | 0.01 0.00 0.00 |
5 | 0.48 1.50 0.36 | -0.05 0.02 0.00 |
6 | -0.46 1.35 0.33 | -0.25 0.45 0.10 |
7 | 0.59 2.27 0.38 | 0.51 1.86 0.28 |
8 | 0.10 0.06 0.01 | -0.32 0.74 0.10 |
9 | -0.06 0.02 0.00 | 0.31 0.68 0.08 |
10 | 0.06 0.03 0.01 | 0.13 0.12 0.02 |

Categories (the 10 first)


Dim.1 ctr cos2 v.test Dim.2 ctr cos2 v.test
F | 0.44 9.32 0.46 5.85 | -0.15 1.15 0.05 -1.96 |
M | -1.06 22.46 0.46 -5.85 | 0.35 2.78 0.05 1.96 |
Domiciliu_R | 0.67 8.54 0.17 3.57 | -0.01 0.00 0.00 -0.04 |
Domiciliu_U | -0.26 3.32 0.17 -3.57 | 0.00 0.00 0.00 0.04 |
Studii_P | 0.48 6.97 0.18 3.66 | -0.11 0.42 0.01 -0.86 |
Studii_S | -0.38 5.47 0.18 -3.66 | 0.09 0.33 0.01 0.86 |
L | 0.41 5.76 0.17 3.50 | 0.69 17.80 0.46 5.85 |
NL | -0.40 5.61 0.17 -3.50 | -0.67 17.33 0.46 -5.85 |
NO | 0.25 1.26 0.03 1.39 | 1.22 32.93 0.61 6.74 |
O | -0.10 0.52 0.03 -1.39 | -0.50 13.67 0.61 -6.74 |

Categorical variables (eta2)


Dim.1 Dim.2
Gen | 0.46 0.05 |
Domiciliu | 0.17 0.00 |
Studii | 0.18 0.01 |
Profesie | 0.17 0.46 |
Religie | 0.03 0.61 |
ApPolitica | 0.44 0.08 |
Nationalitate | 0.00 0.10 |
Rezultatul funcției summary.MCA() conține 4 tabele:
Tabelul 1 - valori proprii: tabelul 1 conține varianțele și procentul de varianțe
reținut de fiecare dimensiune.
Tabelul 2 conține coordonatele, contribuția și cos2 (calitatea reprezentării [în 0-1])
ale primilor 10 indivizi activi pe dimensiunile 1 și 2.
Tabelul 3 conține coordonatele, contribuția și cos2 (calitatea reprezentării [în 0-1])
ale primelor 10 categorii de variabile active pe dimensiunile 1 și 2. Acest tabel
conține, de asemenea, o coloană numită v.test. Valoarea v.test este în
general cuprinsă între -2 și +2. Pentru o categorie de variabilă dată, dacă valoarea
absolută a v.test este mai mare decât +2, aceasta înseamnă că coordonatele sunt
semnificativ diferite de 0.
Tabelul 4 - variabile categoriale(eta2): conține corelația pătrată între fiecare
variabilă și dimensiuni.
6 Analiza Datelor. Teorie şi aplicaţii

Pentru a exporta rezumatul-summary într-un fișier, se utilizează codul R:


summary(res.mca, file =myfile.txt)
Pentru afișarea rezumatului-summary a mai mult de 10 elemente, utilizați
argumentul nbelements din funcția summary().
În continuare, se va folosi funcția MCA() [din pachetul FactoMiner].
Un format simplificat este:
MCA(X, ncp = 5, graph = TRUE)
unde:
X: reprezintă un cadru de date (data frame) cu n linii (persoane fizice) și p coloane
(variabile categoriale)
ncp: reprezintă numărul de dimensiuni păstrate în rezultatele finale.
graph: reprezintă o valoare logică. Dacă e TRUE, atunci este afișat un grafic.
În codul R de mai jos, MCA se efectuează numai pentru indivizii/variabilele active:
res.mca <- MCA(ACM.active, graph = FALSE)
res.mca
Ieșirea funcției MCA() este o listă care include:
**Results of the Multiple Correspondence Analysis (MCA)**
The analysis was performed on 75 individuals, described by 5 variables
*The results are available in the following objects:
name description
1 "$eig" "eigenvalues"
2 "$var" "results for the variables"
3 "$var$coord" "coord. of the categories"
4 "$var$cos2" "cos2 for the categories"
5 "$var$contrib" "contributions of the categories"
6 "$var$v.test" "v-test for the categories"
7 "$ind" "results for the individuals"
8 "$ind$coord" "coord. for the individuals"
9 "$ind$cos2" "cos2 for the individuals"
10 "$ind$contrib" "contributions of the individuals"
11 "$call" "intermediate results"
12 "$call$marge.col" "weights of columns"
13 "$call$marge.li" "weights of rows"
sau varianta:
res.mca <- MCA(ACM.active, graph = TRUE)
Capitolul 5. Analiza corespondenţelor multiple(ACM) 7

Figura 5.1.

Figura 5.2.
8 Analiza Datelor. Teorie şi aplicaţii

Figura 5.3.

Obiectul care este creat folosind funcția MCA() conține multe informații
găsite în multe liste și matrice diferite. Aceste valori sunt descrise în secțiunea
următoare.

Vizualizarea și interpretarea ieșirilor ACM

Rezultatele ACM sunt interpretate similar ca rezultatele unei analize a


corespondențelor simple (ACS).
Graficul împrăștierii (scatter plot-ul) ACM: Biplot-ul pentru indivizi și
variabile categoriale

Pachetul FactoMineR

Poate fi utilizată funcția plot.MCA() [din pachetul FactoMineR]. Un


format simplificat este:
plot (x, axes = c (1,2), choix = c ("ind", "var"))
unde:
x: reprezintă un obiect din clasa MCA;
axes: reprezintă un vector numeric de lungime 2 care specifică componenta de
trasat;
choix: reprezintă graficul de trasat. Valorile posibile sunt „ind” pentru indivizi
și „var” pentru variabile
Graficul pe baza pachetului FactoMineR pentru MCA este dat de:
plot(res.mca)
Capitolul 5. Analiza corespondenţelor multiple(ACM) 9

Figura 5.4.

Pachetul factoextra

Vom folosi pachetul factoextra pentru a ajuta la interpretarea și


vizualizarea analizei corespondențelor multiple. Indiferent ce funcție decideți să
utilizați [FactoMiner:: MCA(), ade4:: dudi.mca()], puteți extrage și
vizualiza cu ușurință rezultatele analizei corespondențelor multiple utilizând
funcțiile R furnizate în pachetul factoextra.
Aceste funcții factoextra includ:
get_eigenvalue(res.mca): extrage valorile proprii/varianțele reținute de
fiecare dimensiune (axă);
fviz_eig(res.mca): vizualizează valorile proprii/varianțele;
get_mca_ind(res.mca), get_mca_var(res.mca): extrage rezultatele
pentru indivizi și, respectiv, pentru variabile;
fviz_mca_ind(res.mca), fviz_mca_var(res.mca): vizualizează
rezultatele pentru indivizi și, respectiv, pentru variabile;
fviz_mca_biplot(res.mca): face un biplot de linii și pe coloane..
10 Analiza Datelor. Teorie şi aplicaţii

În secțiunile următoare, va fi ilustrată fiecare dintre aceste funcții.


Observaţíe: Rezultatele MCA sunt interpretate similar cu rezultatele dintr-o
analiză simplă a corespondențelor (ACS).

Valori proprii/variații şi scree plot

Proporția de varianțe reținută de diferitele dimensiuni (axe) poate fi extrasă


folosind funcția get_eigenvalue() [din pachetul factoextra] după cum
urmează:
library("factoextra")
eig.val <- get_eigenvalue(res.mca)
head(eig.val)
eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.2079194 20.79194 20.79194
Dim.2 0.1879756 18.79756 39.58950
Dim.3 0.1608113 16.08113 55.67063
Dim.4 0.1355768 13.55768 69.22831
Dim.5 0.1261905 12.61905 81.84736
Dim.6 0.1019802 10.19802 92.04538
sau
head(round(eig.val, 2))
eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.21 20.79 20.79
Dim.2 0.19 18.80 39.59
Dim.3 0.16 16.08 55.67
Dim.4 0.14 13.56 69.23
Dim.5 0.13 12.62 81.85
Dim.6 0.10 10.20 92.05
Funcția fviz_eig() sau fviz_screeplot() [din pachetul
factoextra] poate fi utilizată pentru a vizualiza procentele de inerție explicate
de fiecare dimensiune ACM
fviz_eig(res.mca)
sau
fviz_screeplot(res.mca)
Capitolul 5. Analiza corespondenţelor multiple(ACM) 11

Figura 5.5.

fviz_screeplot(res.mca, addlabels = TRUE, ylim = c(0, 45))


12 Analiza Datelor. Teorie şi aplicaţii

Figura 5.6.
Biplot-ul

Funcția fviz_mca_biplot() [din pachetul factoextra] este utilizată


pentru a desena biplot-ul de indivizi și variabile categoriale:
fviz_mca_biplot(res.mca,
repel= TRUE,# Evitați suprapunerea textului)
ggtheme = theme_minimal())
Capitolul 5. Analiza corespondenţelor multiple(ACM) 13

Figura 5.7.

Graficul de mai sus prezintă un model/pattern global în cadrul datelor.


Liniile (indivizii) sunt reprezentate prin puncte albastre și coloanele (variabilele
categoriale) prin triunghiuri roșii. Distanța dintre oricare două puncte de linie sau
puncte de coloană oferă o măsură a similarităţii/asemănării (sau a disimilarităţii
lor). Punctele de linie cu profil similar sunt „închise” pe harta factorilor. Același
lucru este valabil și pentru punctele de coloană.
Graficul variabilelor
Rezultate
Funcția get_mca_var() [din pachetul factoextra] este utilizată
pentru a extrage rezultatele pentru variabilele categoriale. Această funcție
returnează o listă care conține coordonatele, cos2 și contribuția variabilelor
categoriale:
var <- get_mca_var(res.mca)
var
Multiple Correspondence Analysis Results for variables
===================================================
Name Description
1 "$coord" "Coordinates for categories"
2 "$cos2" "Cos2 for categories"
3 "$contrib" "contributions of categories"
Componentele get_mca_var() pot fi utilizate în graficul liniilor după cum
urmează:
14 Analiza Datelor. Teorie şi aplicaţii

var$coord: reprezintă coordonatele variabilelor pentru a crea un scatter plot;


var$cos2: reprezintă calitatea reprezentării pentru variabilele de pe harta
factorilor.
var$contrib: conține contribuțiile (în procente) ale variabilelor la definirea
dimensiunilor.
Observaţie: Este posibil să trasați variabile categoriale și să le colorați fie în
funcție de i) calitatea lor pe harta factorilor (cos2) sau ii) valorile contribuției lor
la definirea dimensiunilor (contrib).
Diferitele componente pot fi accesate după cum urmează:
# Coordonate
head(var$coord)
Multiple Correspondence Analysis Results for variables
===================================================
Name Description
1 "$coord" "Coordinates for categories"
2 "$cos2" "Cos2 for categories"
3 "$contrib" "contributions of categories"
# Cos2: Calitatea pe harta factorilor
head(var$coord)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
F 0.4381761 -0.146522047 -0.1729811 -0.14218505 -0.02754974
M -1.0556060 0.352984931 0.4167271 0.34253672 0.06636983
Domiciliu_R 0.6661843 -0.006838705 0.6663632 -1.06496828 0.60262879
Domiciliu_U -0.2590717 0.002659497 -0.2591412 0.41415433 -0.23435564
Studii_P 0.4800412 -0.112594510 0.5897466 0.11818464 -0.77728677
Studii_S -0.3771752 0.088467115 -0.4633723 -0.09285936 0.6107253
# Contribuții la componentele principale
head(var$contrib)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
F 9.322208 1.1529782172 1.878439 1.5053553 0.06071905
M 22.458047 2.7776293415 4.525330 3.6265377 0.14627771
Domiciliu_R 8.537952 0.0009951908 11.044991 33.4616908 11.51153166
Domiciliu_U 3.320315 0.0003870186 4.295274 13.0128797 4.47670675
Studii_P 6.966532 0.4239236555 13.594676 0.6475768 30.09473703
Studii_S 5.473704 0.3330828722 10.681531 0.5088103 23.64586481
În această secțiune, vom descrie cum se pot vizualiza numai variabilele
categoriile. În continuare, vom evidenția variabilele categoriale în funcție de i)
calitatea lor de reprezentare pe harta factorilor sau ii) de contribuția lor la
dimensiuni.

Corelația dintre variabile și dimensiunile principale

Pentru a vizualiza corelația dintre variabile și dimensiunile principale


MCA, avem linia de cod R:
fviz_mca_var(res.mca, choice = "mca.cor",
repel = TRUE, # Evitați suprapunerea textului
ggtheme = theme_minimal())
Capitolul 5. Analiza corespondenţelor multiple(ACM) 15

Figura 5.8.

Graficul de mai sus ajută la identificarea variabilelor care sunt cele mai
corelate cu fiecare dimensiune. Pătratele corelațiilor dintre variabile și dimensiuni
sunt utilizate ca şi coordonate.
Se poate observa că, variabilele Religia și Profesia sunt cele mai
corelate cu dimensiunea 1. În mod similar, variabilele Studii și ApPolitica
sunt cele mai corelate cu dimensiunea 2.

Coordonatele variabilelor categoriale

Codul R de mai jos afișează coordonatele fiecărei variabile cotegoriale din


fiecare dimensiune (1, 2 și 3):
head(round(var$coord, 2), 5)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
F 0.44 -0.15 -0.17 -0.14 -0.03
M -1.06 0.35 0.42 0.34 0.07
Domiciliu_R 0.67 -0.01 0.67 -1.06 0.60
Domiciliu_U -0.26 0.00 -0.26 0.41 -0.23
Studii_P 0.48 -0.11 0.59 0.12 -0.78
Se poate utiliza funcția fviz_mca_var() [din pachetul factoextra]
pentru a vizualiza numai cvariabilele categoriale:
fviz_mca_var(res.mca,repel = TRUE, ggtheme = theme_minimal())
16 Analiza Datelor. Teorie şi aplicaţii

Figura 5.9.

Se pot schimba culoarea și forma punctelor variabile folosind argumentele


col.var și shape.var după cum urmează:
fviz_mca_var(res.mca,col.var="black",shape.var=15,repel=TRUE)
Capitolul 5. Analiza corespondenţelor multiple(ACM) 17

Figura 5.10.

Graficul de mai sus arată relațiile dintre variabilele categoriale şi poate fi


interpretat după cum urmează:
- variabilele categoriale cu un profil similar sunt grupate împreună;
- variabilele categoriale corelate negativ sunt poziționate pe laturile opuse
ale originii graficului (cadrane opuse);
- distanța dintre punctele categoriale și origine, măsoară calitatea variabilei
categoriale pe harta factorilor. Punctele categoriale care sunt departe de
origine sunt bine reprezentate pe harta factorilor.

Calitatea reprezentării variabilelor categoriale

Cele două dimensiuni 1 și 2 sunt suficiente pentru a reține 46% din inerția
totală (variația) conținută în date. Nu toate punctele sunt la fel de bine afișate în
cele două dimensiuni.
Calitatea reprezentării se numește cosinus pătrat-squared cosine (cos2) şi
măsoară gradul de asociere între variabilele categoriale și o anumită axă. cos2 din
variabilele categoriale pot fi extrase după cum urmează:
head(var$cos2, 5)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
F 0.4625413 5.172007e-02 0.07208591 0.04870360 0.001828472
M 0.4625413 5.172007e-02 0.07208591 0.04870360 0.001828472
Domiciliu_R 0.1725895 1.818751e-05 0.17268219 0.44106123 0.141229458
18 Analiza Datelor. Teorie şi aplicaţii

Domiciliu_U 0.1725895 1.818751e-05 0.17268219 0.44106123 0.141229458


Studii_P 0.1810597 9.960912e-03 0.27327224 0.01097455 0.474708714
Dacă o variabilă categorială este bine reprezentată de două dimensiuni,
atunci suma cos2 este apropiată de unu. Pentru unele dintre elementele linie, sunt
necesare mai mult de 2 dimensiuni pentru a reprezenta perfect datele.
Se pot colora variabilele categoriale prin valorile lor cos2 folosind
argumentul col.var = “cos2”. Aceasta produce un gradient de culori, care
poate fi personalizat folosind argumentul gradient.cols. De exemplu,
gradient.cols = c("white", "blue", "red") înseamnă că:
- variabilele categoriale cu valori mici ale cos2 vor fi colorate în „alb”;
- variabilele categoriale cu valori medii cos2 vor fi colorate în „albastru”;
- variabilele categoriale cu valori mari ale cos2 vor fi colorate în „roșu”
# Culori după valori cos2: calitate pe harta factorilor
fviz_mca_var(res.mca, col.var = "cos2", gradient.cols =
c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE,
# Evitați suprapunerea textului
ggtheme = theme_minimal())

Figura 5.11.

Observaţie: Se poate modifica transparența variabilelor categoriale în funcție de


valorile lor cos2 folosind opțiunea alpha.var = "cos2". De exemplu, se
poate tasta:
Capitolul 5. Analiza corespondenţelor multiple(ACM) 19

# Schimbați transparența prin prisma valorilor cos2


fviz_mca_var(res.mca, alpha.var="cos2", repel = TRUE, ggtheme
= theme_minimal())
Variable categories - MCA

1.0 A

Studii_P
ApPolitica_D

0.5
% )

cos2
3.5

0.4
im2(2

0.5
L
D

0.6
O
0.0

NL
NO
R

-0.5

Studii_S

ApPolitica_S

-0.5 0.0 0.5 1.0


Dim1 (26.5%)

Figura 5.12.

Se poate vizualiza cos2 din categoriile de linii pe toate dimensiunile


folosind pachetul de corrplot:
library("corrplot")
corrplot(var$cos2, is.corr=FALSE)
20 Analiza Datelor. Teorie şi aplicaţii

Figura 5.13.

De asemenea, se poate crea un grafic de bare(barplot) cu variabila cos2


utilizând funcția fviz_cos2() din pachetul factoextra]:
# cos2 pentru variabilele categoriale pe Dim.1 și Dim.2
fviz_cos2(res.mca, choice = "var", axes = 1:2)

Figura 5.14.
Observaţíe: Variabilele categoriale R, A, Studii_S, Studii_P nu sunt foarte
bine reprezentate de primele două dimensiuni. Aceasta implică faptul că poziția
punctelor corespunzătoare pe graficul de împrăștiere ar trebui interpretată cu o
anumită prudență. Este probabil necesară o soluție cu dimensiuni superioare.

Contribuția variabilelor categoriale la dimensiuni

Contribuția variabilelor categoriale (în%) la definirea dimensiunilor poate


fi extrasă după cum urmează:
head(round(var$contrib,2), 5)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
F 9.32 1.15 1.88 1.51 0.06
M 22.46 2.78 4.53 3.63 0.15
Domiciliu_R 8.54 0.00 11.04 33.46 11.51
Domiciliu_U 3.32 0.00 4.30 13.01 4.48
Studii_P 6.97 0.42 13.59 0.65 30.09
Variabilele categoriale cu valoarea mai mare contribuie cel mai mult la
definirea dimensiunilor. Variabilele categoriale care contribuie cel mai mult la
Dim.1 și Dim.2 sunt cele mai importante în explicarea variabilității în setul de date.
Capitolul 5. Analiza corespondenţelor multiple(ACM) 21

Funcția fviz_contrib() [din pachetul factoextra] poate fi utilizată pentru a


desena un grafic de bare(barplot-ul) cu contribuția variabilelor categoriale. Codul R
de mai jos prezintă cele 10 variabile categoriale care contribuie la dimensiuni:
# Contribuțiile liniilor la dimensiunea 1
fviz_contrib(res.mca, choice = "var", axes = 1, top = 10)
fviz_contrib(res.mca, choice = "var", axes = 1, top = 10)
Figura 5.15.

În cazul în care contribuția variabilelor categoriale ar fi uniformă, valoarea


așteptată ar fi 1/număr_de_categorii = 1/5 = 20%.
Linia punctată roșie din graficul de mai sus indică contribuția medie
așteptată. Pentru o dimensiune dată, orice categorie cu o contribuție mai mare decât
acest prag ar putea fi considerată importantă pentru a contribui la acea dimensiune.
Se poate observa că, categoriile NO, L, NL şi O sunt cele mai importante
în definirea primei dimensiuni.
# Contribuțiile liniilor la dimensiunea 2
fviz_contrib(res.mca, choice = "var", axes = 2, top = 10)

Figura 5.16.

Contribuțiile totale la dimensiunea 1 și 2 se obțin după cum urmează:


# Contribuția totală la dimensiunea 1 și 2
fviz_contrib(res.mca, choice = "var", axes = 1:2, top = 10)
22 Analiza Datelor. Teorie şi aplicaţii

Figura 5.17.

Linia roșie punctată din graficul de mai sus indică valoarea medie
așteptată, în ipoteza unor contribuții uniforme. Calculul valorii contribuției
preconizate, sub ipoteză nulă, a fost detaliat în capitolul legat de analiza în
componente principale.
Se poate observa că:
- categoriile ApPolitica_S, Studii_P şi ApPolitica_D sunt cele
mai importante în definirea primei dimensiuni.
- categoriile LO, L şi NL contribuie cel mai mult la dimensiunea 2
Cele mai importante variabile categoriale, prin prisma contribuţiei, pot fi
evidențiate pe graficul de dispersie (scatter plot) după cum urmează:
fviz_mca_var(res.mca, col.var = "contrib", gradient.cols =
c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE, ggtheme =
theme_minimal())
Capitolul 5. Analiza corespondenţelor multiple(ACM) 23

Figura 5.18.
Graficul de mai sus oferă o idee despre la ce pol al dimensiunilor
contribuie variabilele categoriale.
Este evident că, categoriile NO și L au o contribuție importantă la polul
pozitiv din prima dimensiune, în timp ce categoriile NL și O au o contribuție
majoră la polul negativ din prima dimensiune etc.
Observaţie: Este posibil să controlați transparența variabilelor categoriale în
funcție de valorile contribuției acestora, utilizând opțiunea alpha.var =
"contrib". De exemplu, linia de cod R poate fi:
# Schimbați transparența prin contribuţia variabilelor
# categoriale
fviz_mca_var(res.mca, alpha.var="contrib", repel = TRUE,
ggtheme = theme_minimal())
24 Analiza Datelor. Teorie şi aplicaţii

Figura 5.19.

În cazul în care contribuțiile individuale ar fi uniforme, valoarea așteptată


ar fi 1/ncol (ACM) = 1/5 = 20%.
Contribuția totală a unei categorii, la explicarea variațiilor reținute de
Dim.1 și Dim.2, se calculează după cum urmează: (C1 * Eig1) + (C2 * Eig2).
C1 și C2 sunt contribuțiile categoriei la dimensiunile 1 și respectiv 2. Eig1
și Eig2 sunt valorile proprii ale dimensiunilor 1 și respectiv 2.
Contribuția medie așteptată a unei categorii pentru Dim.1 și Dim.2 este:
(20 * Eig1) + (20 * Eig2) = (20*0.265) + (20*0.235) = 10%

Graficul indivizilor

Rezultate

Funcția get_mca_ind() [din pachetul factoextra] este utilizată


pentru a extrage rezultatele pentru indivizi. Această funcție returnează o listă care
conține coordonatele, cos2 și contribuțiile indivizilor:
ind <- get_mca_ind(res.mca)
ind
Multiple Correspondence Analysis Results for individuals
===================================================
Name Description
Capitolul 5. Analiza corespondenţelor multiple(ACM) 25

1 "$coord" "Coordinates for the individuals"


2 "$cos2" "Cos2 for the individuals"
3 "$contrib" "contributions of the individuals"
Rezultatul pentru indivizi oferă aceleași informații ca şi cele descrise
pentru variabilele categoriale. Ca urmare, în continuare vor fi afișate rezultatele la
nivel de indivizi, fără a mai fi făcute comentarii.
Avem astfelu:
# Coordonatele punctelor la nivel de coloane
head(ind$coord)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
1 0.3541930 0.125911113 0.2693089 -0.5912036 -0.11358423
2 0.3874797 -0.198582590 0.6156255 0.6114034 -0.13680588
3 0.5050144 0.009032383 -0.3413384 -0.3928887 0.52055798
4 0.5050144 0.009032383 -0.3413384 -0.3928887 0.52055798
5 0.4836979 -0.054087159 -0.2958769 0.2628619 -0.37422555
6 -0.4591651 -0.252844185 -0.2995435 -0.2920217 -0.06070821
# Calitatea reprezentării
head(ind$cos2)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
1 0.1226964 1.550528e-02 0.07093376 0.3418423 0.012617917
2 0.1021488 2.682981e-02 0.25785079 0.2543261 0.012733412
3 0.2836642 9.074062e-05 0.12958873 0.1716865 0.301394458
4 0.2836642 9.074062e-05 0.12958873 0.1716865 0.301394458
5 0.3561787 4.453567e-03 0.13327285 0.1051901 0.213199646
6 0.3328166 1.009191e-01 0.14164039 0.1346163 0.005817845
# Contribuţii
head(ind$contrib)
Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
1 0.8044957 0.1124515502 0.6013447 3.4373796 0.13631641
2 0.9628120 0.2797175155 3.1423555 3.6762834 0.19775234
3 1.6355022 0.0005786847 0.9660337 1.5180722 2.86319094
4 1.6355022 0.0005786847 0.9660337 1.5180722 2.86319094
5 1.5003481 0.0207503613 0.7258455 0.6795301 1.47971803
6 1.3520147 0.4534644652 0.7439469 0.8386554 0.03894099

Plot-uri: Calitatea și contribuția

Funcția fviz_mca_ind() [din pachetul factoextra] este utilizată


pentru a vizualiza numai indivizi. La fel ca în cazul variabilelor categoriale, este
posibil să colorați indivizii după valorile lui cos2, astfel:
fviz_mca_ind(res.mca, col.ind = "cos2", gradient.cols =
c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE, ggtheme =
theme_minimal())
26 Analiza Datelor. Teorie şi aplicaţii

Figura 5.20.

Codul R de mai jos creează un barplot (grafic cu bare) la nivel de indivizi,


bazat pe cos2 și contribuții:
# cos2 la nivel de indivizi
fviz_cos2(res.mca, choice = "ind", axes = 1:2, top = 10)

Figura 5.21.
# Contribuția indivizilor la dimensiuni
Capitolul 5. Analiza corespondenţelor multiple(ACM) 27

fviz_contrib(res.mca, choice = "ind", axes = 1, top = 10)

Figura 5.22.

fviz_contrib(res.mca, choice = "ind", axes = 2, top = 10)


28 Analiza Datelor. Teorie şi aplicaţii

Figura 5.23.

fviz_contrib(res.mca, choice = "ind", axes = 1:2, top = 10)


Capitolul 5. Analiza corespondenţelor multiple(ACM) 29

Figura 5.24.

În cazul în care contribuțiile individuale ar fi uniforme, valoarea așteptată


ar fi 1/nrow (ACM) = 1/75 = 1,33%.
Contribuția medie așteptată (linia de referință) a unei coloane pentru Dim.1
și Dim.2 este: (1,33 * Eig1) + (1,33 * Eig2) = (1,33 * 0,265) + (1,33 * 0,235) =
0.665.

Colorarea indivizilor pe grupuri

Se pot colora indivizii folosind oricare dintre variabilele calitative din


tabelul de date inițial (ACM.txt).
Codul R de mai jos colorează indivizii pe grupuri folosind nivelurile
variabilei Religie. Argumentul habillage este utilizat pentru a specifica
variabila factorului pentru care se face colorarea indivizilor pe grupe. O elipsă de
concentrație poate fi, de asemenea, adăugată în jurul fiecărui grup folosind
argumentul addEllipses = TRUE. Dacă se doreşte o elipsă de încredere în
jurul punctului mediu al categoriilor, se poate utiliza ellipse.type =
"confidence". Argumentul palette este utilizat pentru a schimba culorile
grupului.
fviz_mca_ind(res.mca,label="none",
#ascunde etichetele individuale
habillage = "Religie",
# culoare pe grupe
30 Analiza Datelor. Teorie şi aplicaţii

palette = c("#00AFBB", "#E7B800"),


addEllipses = TRUE, ellipse.type = "confidence",
ggtheme = theme_minimal())

Figura 5.25.

Pentru a specifica valoarea argumentului habillage, este, de asemenea,


posibil să utilizați indexul coloanei după cum urmează (habillage = 2). În
plus, se poate furniza o variabilă de grupare externă după cum urmează:
habillage = ACM$Religie, astfel:
# habillage este indexul coloanei care va fi folosită ca
# variabilă de grupare
fviz_mca_ind(res.mca, habillage = 3, addEllipses = TRUE)
Capitolul 5. Analiza corespondenţelor multiple(ACM) 31

Figura 5.26.

# habillage este variabilă de grupare externă


fviz_mca_ind(res.mca, habillage = ACM$Religie, addEllipses =
TRUE)
Dacă doriți să colorați indivizi folosind mai multe variabile categoriale în
același timp, se poate utiliza funcția fviz_ellipses() [din pachetul
factoextra] după cum urmează:
fviz_ellipses(res.mca, c("Religie", "Nationalitate"), geom =
"point")
32 Analiza Datelor. Teorie şi aplicaţii

Figura 5.27.
Alternativ, se pot specifica indicii variabilelor categoriale:
fviz_ellipses(res.mca, 1:5, geom = "point")
Capitolul 5. Analiza corespondenţelor multiple(ACM) 33

Figura 5.28.

Descrierea dimensiunii

Funcția dimdesc() [din pachetul FactoMineR] poate fi utilizată


pentru a identifica cele mai corelate variabile cu o anumită dimensiune:
res.desc <- dimdesc(res.mca, axes = c (1,2))
head(res.desc)
$`Dim 1`
$quali
R2 p.value
Gen 0.4625413 1.937853e-11
ApPolitica 0.4440728 6.780190e-11
Studii 0.1810597 1.413964e-04
Domiciliu 0.1725895 2.102421e-04
Profesie 0.1654825 2.926216e-04

$category
Estimate p.value
Gen=F 0.3405687 1.937853e-11
ApPolitica=ApPolitica_D 0.3051930 6.780190e-11
Studii=Studii_P 0.1954376 1.413964e-04
Domiciliu=Domiciliu_R 0.2109500 2.102421e-04
Profesie=L 0.1855078 2.926216e-04
Profesie=NL -0.1855078 2.926216e-04
Domiciliu=Domiciliu_U -0.2109500 2.102421e-04
Studii=Studii_S -0.1954376 1.413964e-04
ApPolitica=ApPolitica_S -0.3051930 6.780190e-11
Gen=M -0.3405687 1.937853e-11
34 Analiza Datelor. Teorie şi aplicaţii

attr(,"class")
[1] "condes" "list"

$`Dim 2`
$quali
R2 p.value
Religie 0.61322113 1.032268e-16
Profesie 0.46235575 1.962789e-11
Nationalitate 0.10200268 5.222277e-03
ApPolitica 0.07655028 1.626290e-02
Gen 0.05172007 4.973529e-02

$category
Estimate p.value
Religie=NO 0.3728561 1.032268e-16
Profesie=L 0.2948339 1.962789e-11
Nationalitate=Nationalitate_R 0.1730878 5.222277e-03
ApPolitica=ApPolitica_S 0.1204825 1.626290e-02
Gen=M 0.1082835 4.973529e-02
Gen=F -0.1082835 4.973529e-02
ApPolitica=ApPolitica_D -0.1204825 1.626290e-02
Nationalitate=Nationalitate_A -0.1730878 5.222277e-03
Profesie=NL -0.2948339 1.962789e-11
Religie=O -0.3728561 1.032268e-16

attr(,"class")
[1] "condes" "list"

$call
$call$num.var
[1] 1

$call$proba
[1] 0.05

$call$weights
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[39] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

$call$X
Dim 1 Gen Domiciliu Studii Profesie
1 0.354193039 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=L
2 0.387479656 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
3 0.505014358 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=L
4 0.505014358 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=L
5 0.483697878 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
6 -0.459165096 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
7 0.594573571 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
8 0.099275844 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=NL
9 -0.058410692 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=NL
10 0.064314328 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
11 -0.561367683 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
12 -0.672243377 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
13 0.594573571 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
14 -0.411341817 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
15 -0.191391513 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
16 0.228780683 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
17 0.566482672 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=NL
18 0.008041732 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
19 -0.170075033 Gen=M Domiciliu=Domiciliu_R Studii=Studii_S Profesie=NL
20 0.174401375 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
21 0.015702402 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
22 0.215135647 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
23 0.326011341 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
24 0.215135647 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
25 0.326011341 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
26 -0.507777022 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
27 0.215135647 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
28 0.050663918 Gen=M Domiciliu=Domiciliu_R Studii=Studii_P Profesie=NL
29 -0.658598341 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
Capitolul 5. Analiza corespondenţelor multiple(ACM) 35

30 -0.927160571 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL


31 -0.459165096 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
32 -0.459165096 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
33 -0.348289402 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
34 0.629535087 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=NL
35 0.465068733 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=L
36 0.821399867 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=L
37 0.642396850 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
38 -0.204247902 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
39 0.262958926 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
40 -0.039781547 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
41 0.505014358 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=L
42 0.483697878 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
43 0.228780683 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
44 -0.039781547 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
45 0.518659394 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=NL
46 0.228780683 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
47 -0.637281861 Gen=M Domiciliu=Domiciliu_R Studii=Studii_S Profesie=NL
48 -0.411341817 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
49 -0.589458582 Gen=M Domiciliu=Domiciliu_R Studii=Studii_S Profesie=NL
50 -0.079727172 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
51 -0.624420098 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
52 -0.816284878 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
53 0.884452282 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=L
54 -0.561367683 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
55 0.615890052 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=L
56 0.465068733 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=L
57 0.064314328 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
58 0.215135647 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
59 0.215135647 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
60 0.505014358 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=L
61 -0.039781547 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
62 -0.039781547 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
63 -0.190602866 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
64 0.228780683 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
65 -0.142779587 Gen=F Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
66 0.512892011 Gen=F Domiciliu=Domiciliu_R Studii=Studii_P Profesie=L
67 -0.658598341 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
68 -0.561367683 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
69 -0.169286386 Gen=F Domiciliu=Domiciliu_R Studii=Studii_S Profesie=NL
70 -0.561367683 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
71 -0.927160571 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
72 -0.658598341 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=NL
73 -0.039781547 Gen=F Domiciliu=Domiciliu_U Studii=Studii_S Profesie=NL
74 0.015702402 Gen=M Domiciliu=Domiciliu_U Studii=Studii_P Profesie=L
75 -0.561367683 Gen=M Domiciliu=Domiciliu_U Studii=Studii_S Profesie=L
Religie ApPolitica Nationalitate
1 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
2 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
3 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
4 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
5 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
6 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
7 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
8 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
9 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
10 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
11 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
12 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
13 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
14 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_A
15 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
16 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
17 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
18 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
19 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
20 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
21 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
22 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
23 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
24 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
36 Analiza Datelor. Teorie şi aplicaţii

25 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R


26 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
27 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
28 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
29 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
30 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
31 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
32 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
33 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
34 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
35 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
36 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
37 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
38 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
39 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_A
40 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
41 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
42 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
43 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
44 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
45 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
46 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
47 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
48 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_A
49 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_A
50 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
51 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_A
52 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
53 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
54 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
55 Religie=NO ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
56 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
57 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
58 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
59 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
60 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
61 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
62 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
63 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
64 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
65 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_A
66 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_A
67 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
68 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
69 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
70 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
71 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
72 Religie=O ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
73 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
74 Religie=O ApPolitica=ApPolitica_D Nationalitate=Nationalitate_R
75 Religie=NO ApPolitica=ApPolitica_S Nationalitate=Nationalitate_R
# Descrierea dimensiunii 1
# Descrierea dimensiunii 1
res.desc [[1]]
$quali
R2 p.value
Gen 0.4625413 1.937853e-11
ApPolitica 0.4440728 6.780190e-11
Studii 0.1810597 1.413964e-04
Domiciliu 0.1725895 2.102421e-04
Profesie 0.1654825 2.926216e-04

$category
Estimate p.value
Gen=F 0.3405687 1.937853e-11
ApPolitica=ApPolitica_D 0.3051930 6.780190e-11
Studii=Studii_P 0.1954376 1.413964e-04
Capitolul 5. Analiza corespondenţelor multiple(ACM) 37

Domiciliu=Domiciliu_R 0.2109500 2.102421e-04


Profesie=L 0.1855078 2.926216e-04
Profesie=NL -0.1855078 2.926216e-04
Domiciliu=Domiciliu_U -0.2109500 2.102421e-04
Studii=Studii_S -0.1954376 1.413964e-04
ApPolitica=ApPolitica_S -0.3051930 6.780190e-11
Gen=M -0.3405687 1.937853e-11

attr(,"class")
[1] "condes" "list"
# Descrierea dimensiunii 2
res.desc[[2]]
$quali
R2 p.value
Religie 0.61322113 1.032268e-16
Profesie 0.46235575 1.962789e-11
Nationalitate 0.10200268 5.222277e-03
ApPolitica 0.07655028 1.626290e-02
Gen 0.05172007 4.973529e-02

$category
Estimate p.value
Religie=NO 0.3728561 1.032268e-16
Profesie=L 0.2948339 1.962789e-11
Nationalitate=Nationalitate_R 0.1730878 5.222277e-03
ApPolitica=ApPolitica_S 0.1204825 1.626290e-02
Gen=M 0.1082835 4.973529e-02
Gen=F -0.1082835 4.973529e-02
ApPolitica=ApPolitica_D -0.1204825 1.626290e-02
Nationalitate=Nationalitate_A -0.1730878 5.222277e-03
Profesie=NL -0.2948339 1.962789e-11
Religie=O -0.3728561 1.032268e-16

attr(,"class")
[1] "condes" "list"
Utilizarea funcţiei plotellipses(), din pachetul FactoMineR

De asemenea, se poate utiliza funcția plotellipses() [din pachetul


FactoMineR] pentru a desena elipse de încredere în jurul categoriilor. Formatul
simplificat este:
plotellipses(model, keepvar="all", axis =c(1,2))
unde:
model: reprezintă obiectul clasei: MCA sau PCA;
keppvar: reprezintă un vector boolean sau numeric al indexurilor variabilelor sau
un vector de caractere al numelor variabilelor. Dacă keepvar este „all”,
„quali” sau „quali.sup”, variabilele care sunt reprezentate grafic sunt toate
variabilele categoriale, numai cele care sunt utilizate pentru a calcula dimensiunile
(variabile active) sau doar variabilele categoriale suplimentare.
plotellipses(res.mca, keepvar="all", axis =c(1,2))
38 Analiza Datelor. Teorie şi aplicaţii

Figura 5.29.

Dacă keepvar este un vector numeric de indici sau un vector de caractere


al numelor variabilelor, atunci sunt reprezentate numai variabilele relevante.
plotellipses (res.mca, keepvar = 1)
Capitolul 5. Analiza corespondenţelor multiple(ACM) 39

Figura 5.30.

plotellipses(res.mca, keepvar=1:4)
40 Analiza Datelor. Teorie şi aplicaţii

Figura 5.31.

plotellipses(res.mca, keepvar="Religie")

Figura 5.32.
Capitolul 5. Analiza corespondenţelor multiple(ACM) 41

plotellipses(res.mca, keepvar="Religie")

Figura 5.33.

plotellipses(res.mca, keepvar= c("Religie", "Nationalitate"))


42 Analiza Datelor. Teorie şi aplicaţii

Figura 5.34.
Capitolul 6
Învățarea automată nesupervizată, supervizată şi
semisupervizată, utilizând mediul R  
Prof. dr. Stelian STANCU 

6.1. Introducere

Mașinile de învățare automată sau învățarea automată, având sintagma ML


(Machine Learning), reprezintă o ramură a AI, o abordare pentru realizarea
inteligenței artificiale, care ajută calculatoarele să programeze, pe baza datelor de
intrare, pentru a obține ieșiri din sistem, oferind astfel AI capacitatea de a rezolva
problemele bazate pe date.
Ideea din spatele învățării automate (ML) este că mașina poate învăța fără
intervenție umană, ea trebuie să găsească o modalitate de a învăța cum să rezolve o
sarcină, fiind cunoscute datele de intrare.
Învățarea automată (ML) se referă la instruirea unui model sau a unui
algoritm cu date și apoi utilizarea modelului pentru a prezice orice date noi.
Ca exemplu, putem da cazul unui copil mic ce este învățat cum să meargă
din faza lui de târâre. Inițial, părinții țin mâna copilului pentru a-l ajuta, iar el este
învățat prin informațiile pe care le-a primit pas cu pas din fenomenul de antrenare
pe care l-a parcurs.
Pe baza acestor proceduri, dacă un obstacol se prezintă în calea copilului
sau dacă este necesară o întoarcere (acesta este strigat, spre exemplu), atunci
copilul va fi capabil să navigheze singur, după antrenare/instruire. Datele utilizate
pentru formarea deprinderilor sunt cele de antrenare/instruire, iar copilul va
continua să învețe chiar și după pregătirea formală.
Mașinile pot fi învățate ca și copiii mici să facă o sarcină bazată pe
antrenare/instruire. În primul rând, modelul se alimentează cu suficiente date,
pentru a spune mașinii ce trebuie făcut și în ce circumstanțe. După
antrenare/instruire, mașina poate funcționa automat și poate învăța, de asemenea,
să se regleze. Acest tip de pregătire a mașinii se numește învățare automată (ML).

6.2. Învăţarea automată vs programarea


 
Principala diferență între învățarea automată și programare este că nu există
o codificare/programare implicată în învățarea mașinii:
- în timp ce programarea se referă la oferirea mașinii a unui set de
instrucțiuni pentru a le efectua;
- în învățarea automată (ML), datele sunt singura intrare furnizată, iar
modelul se bazează pe algoritmul care se va decide a fi utilizat.
Pe baza naturii datelor variabilelor independente, în învățarea automată
(ML), există trei moduri diferite de a antrena un model:
2 Analiza datelor în mediul R - teorie şi aplicaţii

- învățarea supervizată/supravegheată;
- învățarea nesupervizată/nesupravegheată;
- învățarea prin reîntărire (consolidarea învățării).
Învățarea automată (ML) continuă să crească în importanță pentru multe
organizații din aproape toate domeniile. Ca exemple de aplicații ale învățării
automate în practică se pot da:
- determinarea probabilității ca un pacient să revină la spital în termen de o
lună de la externare;
- segmentarea clienților unui supermarket în funcție de atribute comune sau
comportamentul de cumpărare;
- predicția pentru o anumită campanie de marketing a ratei de răscumpărare
a unui cupon;
- predicția puterii de cumpărare a clienților, la nivelul unei organizații,
pentru a se permite efectuarea de intervenții preventive etc.
Cele două laturi principale care se disting sunt:
- învățarea supervizată, care construiește modele predictive și
- învățarea nesupervizată, care construiește modele descriptive.

6.3. Aspecte teoretice generale

Învățarea automată supervizată ‒ este o sarcină de tip învățare automată


(ML ‒ Machine Learning), care este executată pe un set de metode menite să
deducă o funcție din datele de instruire/antrenare.
Învățarea supravegheată presupune ca pe baza variabilelor de intrare și una
de ieşire(numită şi eticheta) să se deducă un algoritm specific pentru a învăța
funcția de mapare de la intrare la ieșire. Scopul este de a aproxima funcția de
mapare astfel încât, atunci când avem date de intrare noi, să putem prezice
variabilele de ieșire pentru aceste date. Ca exemple pot fi date: clasificarea,
regresia, regresia liniară, SVM etc
Învățarea automată supravegheată este adesea utilizată pentru sistemele de
export în recunoașterea imaginilor, recunoașterea vorbirii, prognoză, analiza
financiară, instruirea rețelelor neuronale, arbori de decizie etc.
Învățarea automată nesupervizată ‒ este o sarcină de tip învățare
automată (ML) care își propune să descrie asocierile și pattern-urile în raport cu un
set de variabile de intrare.
Diferența fundamentală față de învățarea supervizată este că datele de intrare
nu au ataşată o etichetă de clasă, deci modelul nu are variabile de prevăzut și mai
degrabă încearcă să găsească structuri de date în funcție de relația dintre ele.
În învățarea nesupervizată, putem vorbi de două etape:
- de modelare;
- de rezultate.
Ca exemple de modele de învățare nesupervizată se pot da:
- analiza cluster;
- reguli de asociere;
Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 3

- k-medii;
- etc.
Analiza cluster (identificarea grupurilor sau claselor) poate descoperi și
ajuta la explicarea unor pattern-uri ascunse în date și este frecvent răspunsul la
multiple probleme în multe domenii sau contexte. Găsirea clusterelor poate ajuta la
găsirea relațiilor între variabilele de studiu, dar nu și relațiile pe care le pot avea
aceste variabile în raport cu o variabilă țintă.
De obicei, aplicarea tehnicilor de clustering implică patru faze și anume:
- dezvoltarea unui set de date de lucru - presupune culegerea/observarea
datelor de lucru;
- pregătirea și standardizarea datelor;
- găsirea grupurilor (clusterelor) în date;
- interpretarea acestor clustere și găsirea concluziilor.
Atunci când datele sunt bune, construirea de modele care să răspundă
problemelor de rezolvat devine mai ușoară. Având în vedere că modelele de
clustering folosesc distanțe, acestea sunt influențate în special de datele pe care le
folosim.
Regulile de asociere (învățarea bazată pe reguli de asociere) este o
metodă de învățare automată (ML) bazată pe reguli pentru descoperirea relațiilor
importante între variabile din bazele de date mari, folosind pentru aceasta unele
măsuri de interes.
Ca urmare a celor analizate până acum, putem spune că:
- învățarea supervizată: presupune că toate datele sunt etichetate și
algoritmii învață să prezică ieșirea din datele de intrare.
- învățarea nesupervizată: presupune că toate datele nu sunt etichetate, iar
algoritmii învață să structureze similitudini din datele de intrare.
Algoritmii de învățare nesupravegheată sunt utilizați pentru pre-procesarea
datelor, în timpul analizei exploratorii sau pentru a pregăti algoritmi de învățare
supravegheată.
Alegerea de a utiliza fie un algoritm de învățare automată supravegheată, fie
nesupravegheată depinde, de obicei, de factori legați de structura și volumul
datelor deţinute și de nevoia pentru care se utilizează. În realitate, de cele mai
multe ori, oamenii de știință folosesc împreună pentru a rezolva problemele
respective, atât abordări ale învățării supravegheate, cât și ale învățării
nesupravegheate.
Pe lângă cele două forme de învățare, există și învățarea semisupervizată
care presupune că unele date sunt etichetate, dar cele mai multe dintre ele sunt
neetichetate și se poate utiliza un amestec de tehnici supravegheate și, respectiv,
nesupravegheate.
4 Analiza datelor în mediul R - teorie şi aplicaţii

Învățarea automată supervizată/supravegheată versus nesupervizată/


nesupravegheată

 Dacă în învățarea supravegheată, omul de știință acționează ca un ghid


pentru a învăța algoritmul cu ce concluzii sau predicții ar trebui să vină, în
învățarea nesupravegheată nu există un răspuns corect, nu există profesor,
algoritmii sunt lăsați pe seama lor pentru a descoperi și prezenta structura
ascunsă interesantă din date.
 Dacă modelul de învățare supravegheată va utiliza date de antrenare pentru
a învăța o legătură între intrări și ieșiri, având acces la etichete și având
cunoștințe prealabile despre seturile de date, învățarea nesupravegheată nu
folosește date de ieșire, neexistând cunoștințe prealabile etichetate.
 Dacă în învățarea supravegheată instruirea poate fi generalizată și modelul
poate fi utilizat pe date noi cu o anumită acuratețe, folosind algoritmi de
învățare supravegheată: SVM, regresie liniară și logistică, rețele neuronale,
arbori de clasificare, random forest etc, în învăţarea nesupravegheată
algoritmii pot fi împărțiți în diferite categorii: algoritmi de tip cluster, K-
medii, clusterizare ierarhică, algoritmi de reducere a dimensionalităţii,
detectarea de anomalii etc.

6.4. Tipuri de învățare automată

6.4.1. Învățarea automată supervizată/supravegheată (Supervised Machine


Learning)

Figura următoare prezintă diferiții algoritmi pentru a antrena un model


de tip ML:

Învățarea automată
(ML)

Învățarea nesupervizată Învățarea


Învățare supervizată
Învățarea supervizată
(nu se cunosc valorile cu reîntărire
(se(se cunosc
cunosc valorile
valorile țintă
țintă ale variabilelor
alevariabilelor
variabilelordedeieșire)
ieșire)
de ieșire)

Învățarea
are un
Clustering Detectarea Clasificare Regresie feedback
anomaliilor constant

Figura 6.1. Tipuri de învățare automată (ML)


Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 5

Observație: Majoritatea învățării automate practice folosește învățarea


supervizată.
Învățarea supervizată este locul în care pe baza variabilei de intrare, u și a
variabilei de ieșire, y, se va utiliza un algoritm pentru a învăța funcția de mapare de
la intrare până la ieșire, adică: y = y (u) (6.1)
Scopul este de a aproxima corect funcția de mapare, astfel încât atunci când
există date de intrare noi, u, să se poată prezice variabila de ieșire, y, pentru acele
date. Se numește învățare supervizată, deoarece procesul bazat pe algoritmul de
învățare a setului de date de instruire poate fi gândit ca un profesor care
supraveghează procesul de învățare. Cunoscând ieșirile dorite, algoritmul face
iterativ predicții asupra datelor de antrenare/instruire și este corectat permanent de
către profesor. Învățarea se oprește atunci când algoritmul atinge un nivel
acceptabil de performanță.
Învățarea supravegheată este reprezentată de următoarea diagramă:

Se prezintă un set de instruire,


cunoscând valorile țintă
ale variabilei/elor de ieșire

Se aplică un algoritm de tip


Machine Learning

Se aplică un model Se previzionează


Se expune
de tip Machine valorile variabilei/elor
un set de date
Learning pentru de ieșire
de intrare
predicție

Figura 6.2. Schema de tip ML pentru învățarea supervizată

Problemele de învățare supravegheată pot fi grupate în probleme:


- de regresie;
- de clasificare.
Clasificarea: vorbim de o problemă de clasificare atunci când variabila de
ieșire este una categorială sau de tip clasă, cum ar fi alb sau negru, sănătos sau
bolnav, dacă un e-mail este spam sau nu, dacă o carte este un roman polițist sau o
enciclopedie etc.
Regresia: vorbim de o problemă de regresie atunci când variabila de ieșire
este una reală/continuă, cum ar fi prețul unei case, nivelul emisiilor de gaze, o
valută-spre exemplu euro sau înălțimea unei persoane etc.
6 Analiza datelor în mediul R - teorie şi aplicaţii

6.4.2. Învățarea automată nesupervizată/nesupravegheată (Unsupervised


Machine Learning)

Învățarea automată nesupervizată este aceea în care există doar date de


intrare, u și nu există variabile de ieșire corespunzătoare. Altfel spus, în învățarea
automată nesupravegheată (sau cu autoorganizare), stratul/variabila de ieșire este
instruit pentru a organiza datele de intrare într-un alt set de date, fără a fi nevoie de
o variabilă țintă.
Scopul învățării nesupravegheate este modelarea structurii subiacente sau a
distribuției între date, pentru a afla mai multe informații despre datele respective.
Datele de intrare sunt analizate și se găsesc modele pentru a obține rezultatul
(ieșirea), așa cum se arată în figura următoare:

Se prezintă un set de instruire,


fără a cunoaște valorile țintă
ale variabilei/elor de ieșire

Se aplică un algoritm de tip


Machine Learning pentru gruparea/
clusterizarea datelor de intrare

Se expune Se aplică un model Se atribuie date noi


un set nou de tip Machine pentru unul
de date de intrare Learning pentru dintre clustere
predicție

Datele sunt grupate


în diferite clustere

Figura 6.3. Schema de tip ML pentru învățarea nesupervizată

Deoarece nu există un profesor (sau o variabilă țintă), acest tip de învățare se


numește învățare nesupravegheată. Algoritmii sunt lăsați la propriile lor concepții
pentru a descoperi și prezenta structura interesantă a datelor.
Printre tehnicile disponibile pentru învățarea nesupravegheată putem releva:
- clustering (metoda k-medii, metode ierarhice);
- tehnici de asociere;
- reducerea dimensionalității;
- rețea cu autoorganizare de tip hartă/rețea kohonen (SOM ‒ Self Organizing
Map).
Principalele problemele de învățare nesuprvizată pot fi grupate în probleme:
Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 7

- de grupare (clustering);
- de asociere.
Clustering-ul: vorbim de o problemă de clustering atunci când se dorește
descoperirea grupărilor inerente din date, cum ar fi, spre exemplu, gruparea
clienților privind comportamentul de cumpărare etc.
Asocierea: vorbim de o problemă de învățare a regulilor de asociere atunci când se
dorește descoperirea regulilor care descriu porțiuni mari ale datelor, cum ar fi
persoanele care cumpără produsul A tind, de asemenea, să cumpere și produsul B.
Ca exemple clasice de algoritmi de învățare nesupervizată pot fi enumerați:
- algoritmul k-medii, pentru probleme de clustering;
- algoritmul a priori pentru problemele de învățare a regulilor de asociere.
Pentru a rezuma, cele două tipuri principale de învățare automată (ML)
sunt prezentate în figura următoare:

Învățarea automată (ML)

Învățarea supervizată
Învățarea nesupervizată
(se cunosc valorile
(nu se cunosc valorile
variabilelor de ieșire)
variabilelor de ieșire)

Clasificare Regresie
Clustering Asociere

Figura 6.4. Prezentarea celor două tipuri principale


de învățare automată (ML)

6.4.3. Învățarea automată semisupervizată/semisupravegheată sau prin


reîntărire (de consolidare)

Învățarea prin consolidare (reîntărire) sau semisupervizată este un tip de


învățare automată (ML) unde se oferă feedback constant modelului de adaptare la
mediu. Există o evaluare a performanței la fiecare pas, pentru îmbunătățirea
modelului. Ca urmare, în învățarea de consolidare/cu reîntărire este o abordare în
care sistemul este recompensat pentru acțiuni corecte și penalizat pentru cele
greșite. Drept urmare, sistemul învață să dezvolte un algoritm în care primește cea
mai mare recompensă sau cea mai mică penalitate.
8 Analiza datelor în mediul R - teorie şi aplicaţii

Problemele în care există o cantitate mare de date de intrare, u și doar unele


dintre date sunt etichetate, cu y, se numesc probleme de învățare semisuprave-
gheată. Aceste probleme se situează între învățarea supervizată și cea nesupervi-
zată. Un bun exemplu de învățare automată semisupervizată este o arhivă foto în
care sunt etichetate doar unele dintre imagini (de exemplu: găină, porc, câine,
pisică, iepure, persoană etc.), iar majoritatea nu sunt marcate.

Se aplică un set de date de intrare

Învățarea Învățarea supervizată Învățarea


nesupervizată (se cunosc valorile cu
(nu se cunosc variabilelor de ieșire) reîntărire
Ajustare
valorile
variabilelor
de ieșire)
Valori ale variabilei/lor
de ieșire Valori ale
variabilei/
Profesor Eroarea lor
Valori ale /Țintă de ieșire
variabilei/
lor
de ieșire
Evaluare
performanțe

Figura 6.5. Cele trei tipuri de învățare automată

În figura 6.5 sunt prezentate sintetic cele trei tipuri de învățare automată ce
au fost analizate până acum.

6.4. Învățarea automată (ML) ‒ o abordare pentru realizarea inteligenței


artificiale

6.4.1. Aspecte generale

Printre modelele specifice se numără următoarele:


- Regresia liniară care este un model clasic derivat din statistici. După
cum sugerează și numele, este proiectat pentru sarcini de regresie,
adică predicții ale valorilor continue. De exemplu, câtă limonadă va fi
vândută în funcție de vreme etc.
Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 9

- Regresia logistică care este utilizată pentru sarcinile de clasificare.


Aceasta prezice probabilitatea ca eșantionul dat să aparțină unei
anumite clase.
- Arborele decizional care este o metodă folosită adesea pentru
sarcinile de clasificare. În această metodă, clasa unui obiect dat este
definită ca o serie de întrebări, fiecare implicând de obicei răspunsul
Da sau Nu.
- K-Near Neighbors (metoda celor mai apropiați k-vecini) care este o
metodă simplă și rapidă folosită mai ales pentru clasificare. În această
metodă, clasa unei mulțimi de date este determinată de k (k ar putea fi
orice număr) cel mai asemănător mulțimii de date analizată.
- Naive Bayes care este o metodă populară de clasificare care se
bazează pe teoria probabilităților și în mod deosebit pe teorema lui
Bayes pentru a determina probabilitatea de apariție a unui anumit
eveniment (exemplu: dacă un mailul este spam) în condițiile date
(exemplu: sintagma „împrumut gratuit” se găsește de 20 de ori în e-
mail).
- SVM (Suport Vector Machine) care este un algoritm de învățare
automată supravegheată, adesea folosit pentru sarcini de clasificare.
Acest algoritm este capabil să separe eficient obiecte în clase diferite,
chiar dacă fiecare obiect are multe caracteristici interrelaționate.
- Ansamblurile care combină mai multe modele de învățare automată și
determină clasa unui obiect pe baza unui vot sau pe media
răspunsurilor fiecăruia dintre modele.
- Rețelele Neuronale care se bazează pe principiile creierului uman. O
rețea neuronală este formată din mai mulți neuroni și conexiuni între
aceștia. Un neuron poate fi reprezentat astfel ca o funcție cu mai multe
intrări și o singură ieșire (perceptronul simplu).
- Rețelele neuronale convoluționale (CNN) sunt rețele special
concepute pentru a face față imaginilor (sau mai general cu date
invariante de traducere).
Aplicațiile actuale includ o mare varietate de:
o clasificatoare de imagini (inclusiv faună);
o scanări cu raze X;
o segmentarea imaginii (cu aplicații pentru mulțimi numărabile);
o conducere autonomă;
o imagini prin satelit;
o predicția sărăciei din imagini prin satelit.
Observație: CNN-urile încep să fie reconsiderate ca o bună alternativă la rețelele
recurente, atunci când folosesc date secvențiale.
10 Analiza datelor în mediul R - teorie şi aplicaţii

6.4.2. Învățarea automată (ML) – rol de clasificator de obiecte

Presupunând cazul construirii un program care recunoaște obiecte, pentru a


antrena un model, va fi utilizat un clasificator ce folosește caracteristicile unui
obiect pentru a încerca identificarea clasei din care acesta face parte.
Construirea un clasificator presupune în faza de start alegerea unei
arhitecturi ce pare a fi acceptată pentru început (în funcție de datele avute, de
experiența celui ce se ocupă de această sarcină etc.), urmând ca structura acestuia
să fie ajustată odată cu etapele ce vor fi parcurse în fundamentarea clasificatorului.
În figura 6.6 cele patru obiecte sunt clasele (etichetele) pe care clasificatorul
trebuie
să le recunoască. Pentru a construi/fundamenta un clasificator, sunt necesare date
de intrare și să se atribuie o etichetă. Algoritmul va lua aceste date de intrare, le va
antrena/instrui, va găsi un model, model ce va fi testat, urmând ca dacă modelul
este valid, acesta să poată face predicții (va clasifica fiecare dată expusă la intrarea
modelului, în clasa corespunzătoare) pentru oricare altă viitoare dată
de intrare.
Această sarcină se numește învățare supervizată/supravegheată. În învățarea
supravegheată, datele de instruire ce sunt alimentate algoritmului includ o etichetă.
Pentru antrenarea/instruirea unui algoritm este necesar a fi urmate câteva
etape standard:
- colectarea datelor și curățarea acestora (eliminarea outlier-ilor, normaliza-
rea/standardizarea datelor, completarea anumitor date lipsă din serii (prin
estimări etc.);
- antrenarea/instruirea clasificatorului;
- efectuarea de predicții.
Primul pas este necesar, întrucât de calitatea alegerii datelor corecte depinde
ca algoritmul să aibă succes sau eșec.
Datele alese pentru a antrena/instrui modelul se numesc caracteristici. În
exemplul recunoașterii unui obiect, caracteristicile sunt pixeli ai imaginilor.
Fiecare imagine este un rând în date, în timp ce fiecare pixel este o coloană.
Dacă imaginea are o dimensiune de 28 x 28, atunci setul de date conține
784 coloane (28 x 28). În figura 6.6, fiecare imagine a fost transformată într-un
vector de caracteristici. Eticheta indică computerului ce obiect este în imagine.
Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 11

Setul
Eticheta viitoare Eticheta
de antrenare

(180, 70, 175, 55, 40, …) Bicicletă

(90, 80, 53, 185, 30, …) Vapor


Algoritm

(15, 160, 95, 180, 150, …) Mașină


(95, 89, 205, 30, 160, …) Avion

Ieșirea
Setul de testare Eticheta viitoare Eticheta
(output-ul)

(93, 89, 125, 193, 37, …) ?


→ Inferența Vaporul

Figura 6.6. Pașii realizării unui clasificator, folosind învățarea automată (ML)
Sursa: Adaptare după https://www.guru99.com/machine-learning-vs-deep-learning.html

Obiectivul este utilizarea acestor date de instruire pentru a clasifica tipul


de obiect.
- primul pas constă în crearea coloanelor de caracteristici;
- al doilea pas implică alegerea unui algoritm pentru formarea modelului;
- odată antrenarea/instruirea finalizată, modelul va prezice ce imagine
corespunde cu obiectul expus la intrare.
După aceea, este ușor de utilizat modelul pentru a prezice imagini noi.
Pentru fiecare imagine nouă ce se introduce în model, mașina va prezice clasa din
care face parte obiectul respectiv.
În cazul unei imagini complet noi, fără etichetă, ce trece prin model:
- pentru o ființă umană este banal să vizualizeze imaginea ca fiind o mașină;
- în schimb, computerul își folosește cunoștințele anterioare pentru a prezice
că imaginea expusă clasificatorului este o mașină.

6.5. Învățarea profundă/complexă (DL) ‒ o tehnică pentru implementarea


învățării automate (ML)
În învățarea profundă/complexă (DL), faza de învățare se realizează printr-o
rețea neuronală, în care straturile sunt stivuite unul peste altul(într-o abordare pe
verticală).
Învățarea profundă/complexă se ocupă de rețelele neuronale profunde/
complexe. Opiniile privind profunzimea/complexitatea pot varia.
12 Analiza datelor în mediul R - teorie şi aplicaţii

Unii experți consideră că rețeaua poate fi considerată profundă/complexă


dacă are mai mult de un strat ascuns, în timp ce alții recunosc rețeaua ca fiind
profundă/complexă doar dacă are multe straturi ascunse.
Există mai multe tipuri de rețele neuronale care sunt utilizate în prezent în
mod activ. Cele mai cunoscute dintre ele sunt următoarele:
- Memorie pe termen scurt (LSTM ‒ Long Short Term Memory) ‒ folosită
pentru clasificarea și generarea textului, recunoașterea vorbirii, generarea de
compoziții muzicale, predicția seriilor de timp etc.
- Rețelele neuronale convoluționale (CNN ‒ Convolutional Neural Networks)
‒ utilizate pentru recunoașterea imaginilor, analiza video, procesarea limbajului
natural etc.
Fiecare intrare de pe stratul de intrare este înmulțită cu o pondere și merge
într-un neuron. Rezultatul merge spre următorul strat ca o nouă intrare. Acest
proces se repetă pentru fiecare strat al rețelei.
Stratul final este denumit strat de ieșire și oferă o valoare reală pentru
sarcina de regresie și o probabilitate a fiecărei clase pentru sarcina de clasificare.
Rețeaua neuronală folosește un algoritm pentru a actualiza ponderile tuturor
neuronilor, fiind complet instruită atunci când valorile ponderilor oferă o ieșire
aproape de realitate.
Astfel, o rețea neuronală bine antrenată poate recunoaște obiectul de pe o
imagine cu o precizie mai mare decât rețeaua neuronală tradițională.
Date de antrenare:
Setul
Eticheta viitoare Eticheta
de antrenare

(180, 70, 175, 55, 40, …) Bicicletă

(90, 80, 53, 185, 30, …) Vapor

Spre exemplu DL (3:4:2)


(15, 160, 95, 180, 150, …) Mașină adică: 3 neuroni pe stratul
de intrare ‒ 4 neuroni

pe stratul ascuns ‒ 2 neuroni pe
(95, 89, 205, 30, 160, …) Avion
stratul de ieșire
Ieșirea
Setul de testare Eticheta viitoare Eticheta
(output-ul)

(93, 89, 125, 193, 37, …) ?


→ Inferența Vaporul

Figura 6.7. Pașii realizării unui clasificator, folosind învățarea profundă/complexă (DL)
Sursa: Adaptare după https://www.guru99.com/machine-learning-vs-deep-learning.html

6.6. Extragerea automată a caracteristicilor relevante, utilizând învățarea


profundă/complexă (DL)
Un set de date poate conține zeci, până la sute de caracteristici. Sistemul
va învăța din relevanța acestor caracteristici. Cu toate acestea, nu toate
caracteristicile sunt semnificative pentru algoritm. O parte importantă a învățării
Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 13

automate (ML) este de a găsi un set relevant de caracteristici, pentru a face


sistemul să învețe ceva.
O modalitate de a efectua această parte în învățarea automată (ML) este de a
utiliza extragerea caracteristicilor. Extragerea funcțiilor combină caracteristicile
existente pentru a crea un set de funcții relevante. Aceasta poate fi realizată cu
ajutorul PCA (Principal Component Analysis), T-SNE (t-Distributed Stochastic
Neighbor Embedding) sau orice alt algoritm de reducere a dimensionalității.
În exemplul prelucrării unei imaginii, practicianul trebuie să extragă manual
fiecare caracteristică din imagine, cum ar fi ochii, nasul, buzele și așa mai departe.
Aceste caracteristici extrase sunt intrări pentru modelul de clasificare.
Învățarea profundă/complexă (DL) rezolvă această problemă, în special
printr-o rețea neuronală de convoluție (CNN ‒ Convolutional Neural Network).
Primul strat al unei rețele neuronale va afla mici detalii din imagine; următoarele
straturi vor combina cunoștințele anterioare pentru a obține informații mai
profunde/complexe.
În rețeaua neuronală de convoluție (CNN), extragerea caracteristicilor se
face cu utilizarea unui filtru. Rețeaua aplică un filtru imaginii pentru a vedea dacă
există o potrivire, adică forma funcției este identică cu o parte a imaginii. Dacă
există o potrivire, rețeaua va folosi acest filtru. Prin urmare, procesul de extragere a
funcțiilor se face automat.
ML-tradiționale
Extragerea
Input Clasificarea Oputput
viitoare

cat/not cat

DL (Deep Learning)
Extragerea
Input Clasificarea Oputput
viitoare

cat/not cat

Figura 6.8. Diferența dintre învățarea automată tradițională


și învățarea profundă/complexă (DL)
Sursa: Adaptare după https://www.guru99.com/machine-learning-vs-deep-learning.html

6.7. Exemple de aplicare a învățării profunde/complexe (DL)

Datorită structurii rețelei neuronale artificiale, învățarea profundă/complexă


excelează la identificarea tiparelor în date nestructurate, cum ar fi imagini, sunet,
video, text etc. Din acest motiv, învățarea profundă/complexă transformă rapid
14 Analiza datelor în mediul R - teorie şi aplicaţii

multe domenii, inclusiv asistența medicală, energia, finanțele și transporturile etc.,


care acum regândesc procesele tradiționale de afaceri.
Unele dintre cele mai cunoscute aplicații pentru învățarea profundă/
complexă vor fi descrise în continuare.

6.7.1. Detectarea obiectelor

Învățarea profundă/complexă a fost aplicată în multe cazuri de detectare a


obiectelor, aceasta cuprinzand două părți:
- clasificarea imaginilor;
- localizarea imaginilor.
Clasificarea imaginilor identifică obiectele de tip imagini, cum ar fi mașinile
sau persoanele etc. Localizarea imaginilor oferă locația specifică a acestor obiecte.
Detectarea obiectelor este deja folosită în industrii precum jocuri video,
vânzarea cu amănuntul, turismul, autovehiculele fără șofer etc.

6.7.2. Analiza de text

Analiza de text bazată pe metode de învățare profundă/complexă presupune


analizarea unor cantități mari de date de tip text (de exemplu, documente medicale
sau chitanțe de cheltuieli etc), recunoașterea pattern-urilor și obţinerea de
informațiilor organizate și concise din acestea.
Companiile folosesc învățare profundă/complexă pentru a efectua analize de
text pentru a detecta tranzacțiile privilegiate și respectarea reglementărilor
guvernamentale, spre exemplu.
Un alt exemplu obișnuit este frauda în activitatea de asigurare: analiza de
text a fost adesea folosită pentru a analiza cantități mari de documente pentru a
recunoaște șansele ca o cerere de asigurare să fie fraudată.

6.7.3. Traducerea automată

Traducerea automată ia cuvinte sau propoziții dintr-o limbă și le traduce


automat într-o altă limbă. Traducerea automată a avut loc de mult timp, dar
învățarea profundă/complexă obține rezultate impresionante în două domenii
specifice: traducerea automată a textului (și traducerea vorbirii în text) și
traducerea automată a imaginilor.
Prin transformarea adecvată a datelor, o rețea neuronală poate înțelege
semnale text, audio și vizuale. Traducerea automată poate fi utilizată pentru a
identifica fragmente de sunet în fișiere audio mai mari și pentru a transcrie
cuvântul sau imaginea rostită ca text.

6.7.4. Generarea imaginilor pentru legendă (subtitrarea imaginilor)


Capitolul 6. Învățarea automată nesupervizată, supervizată şi semisupervizată 15

Ca și recunoașterea imaginii, în subtitrarea imaginii, pentru o anumită


imagine, sistemul trebuie să genereze o legendă care descrie conținutul imaginii.
Când se pot detecta și eticheta obiecte în fotografii, următorul pas este de a
transforma acele etichete în propoziții descriptive.
De obicei, aplicațiile de subtitrare a imaginilor folosesc rețele neuronale
convoluționale pentru a identifica obiectele dintr-o imagine și apoi folosesc o rețea
neuronală recurentă pentru a transforma etichetele în propoziții consistente.

6.7.5. Recunoașterea entităților definite

Recunoașterea entităților definite este o metodă de învățare profundă, care ia


ca intrare un text și îl transformă într-o clasă prespecificată. Aceste informații noi
ar putea fi un cod poștal, o dată calendaristică, un cod de produs. Informațiile pot fi
apoi stocate într-o schemă structurată, pentru a construi o listă de adrese sau a servi
drept reper pentru un motor de validare a identității.

6.8. Algoritmi de învățare nesupervizată/nesupravegheată

În învățarea nesupervizată, datele de intrare au caracteristica faptului că nu


sunt etichetate și ca urmare nu au nici un rezultat dinainte cunoscut.

? ?

Figura 6.9. Schema de principiu a unui algoritm de


învățare nesupervizată

Un model odată elaborat este pregătit prin ceea ce se cheamă deducerea


structurilor prezente la nivelul datelor de intrare. Aceasta poate fi extragerea
regulilor generale și se poate face printr-un proces matematic de reducere
sistematică a redundanței sau organizarea datelor prin asemănare.
Ca exemple de probleme pot fi date: gruparea, metode de reducere a
dimensionalității și metode de învățare bazate pe reguli de asociere, iar ca exemple
de algoritmi putem face referire la: algoritmul apriori și algoritmul k-Means.
Capitolul 7
Învăţarea nesupervizată.
Analiza cluster și algoritmi de clustering, în mediul R.
Prof. dr. Stelian STANCU 

7.1. Analiza cluster ‒ aspecte generale

7.1.1. Introducere

Analiza cluster reprezintă o formă de analiză a datelor exploratorii, care


presupune împărțirea observațiilor/indivizilor în diferite grupuri/clase ce au
anumite caracteristici comune. Când se grupează un set de observații/indivizi, se
dorește ca observațiile din același grup/clasă să fie similare, în timp ce observațiile
din clase diferite să nu fie similare (adică să fie caracterizate prin disimilaritate).
Scopul analizei cluster este acela de a construi grupuri sau clase, care să
asigure următoarele proprietăți:
- în cadrul unui grup, observațiile să fie cât mai asemănătoare (similare);
- observațiile aparținând la grupuri diferite să fie cât mai diferite posibil.
Există două metode principale de clasificare:
- k-mean clustering - ce se utilizează când numărul de clase este fixat în
avans;
- gruparea ierarhică - în caz contrar și ajută la determinarea numărului optim
de clase.

7.1.2. Scopul analizei cluster

Clusteringul este un instrument extrem de util în Data Science, în cazul


învățării22 nesupravegheate/nesupervizate. Cu toate acestea, există o serie de
probleme care apar în realizarea clusteringului și anume:
- măsura de disimilare ce va fi folosită;
- tipul de legătură ce trebuie utilizat;
- nivelul la care trebuie tăiată dendrograma pentru a obține clasele, în cazul
grupării ierarhice.
Fiecare dintre aceste decizii are un impact semnificativ asupra rezultatelor
obținute, motiv pentru care în practică sunt abordate mai multe opțiuni, pentru a o
alege pe cea mai bună. Ca urmare, trebuie reținut faptul că folosind aceste metode,
nu se obține invariabil un singur răspuns corect, motiv pentru care orice soluție
care redă anumite aspecte interesante cu privire la datele folosite, trebuie luată
atent în considerare.

22
A se vedea pentru detalii Stancu, S., Constantin, A. M. (2014), Rețele neuronale artificiale.
Teorie şi aplicaţii, Editura ASE, Bucureşti.
2 Analiza datelor în mediul R - teorie şi aplicaţii

7.1.3. Încărcarea pachetelor de bază în mediul R

Algoritmii de clustering utilizează distanța ca indicator de separare a


observațiilor din grupuri diferite.
Pentru început, se vor încărca în R următoarele pachete, cu librăriile aferente:
# Pachete necesare pentru prelucrarea datelor
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
# Pachete necesare pentru algoritmi de clustering
install.packages("cluster", dependencies = TRUE)
library(cluster)
# Pachete necesare pentru vizualizarea clusterelor
install.packages("factoextra", dependencies = TRUE)
library(factoextra)
# Pachete necesare pentru compararea de dendrograme
install.packages("dendextend", dependencies = TRUE)
library(dendextend)
# Pachete necesare pentru reprezentarea grafică
install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Pachete necesare pentru reprezentarea grafică în extenso
install.packages("gridExtra", dependencies = TRUE)
library(gridExtra)
# Pachete necesare pentru alegerea numărului optim de clustere
install.packages("NbClust", dependencies = TRUE)
library(NbClust)
# Pachete necesare pentru alegerea alegerea celui mai bun dintre algoritm
# de clustering
install.packages("clValid", dependencies = TRUE)
library(clValid)
În continuare23, se va încărca în R fișierul productia, așa cum se
specifică în Exemplul 2.2, din Capitolul 2:
productia <- read.table ("productia.txt", header = TRUE)
print(productia)
munca capital pamant productie
1 80 20 8 400
2 100 10 12 300
3 60 30 12 300
4 20 15 9 200
5 40 18 15 460
6 110 14 12 600
7 70 24 10 500
8 90 29 20 570
9 120 19 18 800
10 40 31 14 200

23
În continuare, în toate abordările, vom folosi acest set de date suplu, pentru a permite și
calculul de mână al pașilor de abordare, permițând astfel compararea datelor obținute cu
cele din mediul R.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 3

7.2. Metoda k-mean clustering sau algoritmul centrului mobil

7.2.1. Aspecte generale

Această metodă are ca scop gruparea celor m observații (indivizi) în k


clustere (fixate, ca număr), în care fiecare observație aparține clusterului cu media
cea mai apropiată, totodată servind și ca prototip/pattern al clusterului.
k-mean clustering este cea mai uzitată metodă de clustering pentru
împărțirea unui set de date în k grupuri distincte.
Metoda k-mean clustering sau algoritmul centrului mobil clasifică obiectele
în mai multe clustere, astfel încât obiectele din cadrul aceluiași cluster să fie cât
mai asemănătoare (adică, similaritate intra-clasă ridicată), în timp ce obiectele din
clase diferite sunt cât se poate de disimilare (adică similaritate inter-clasă scăzută).
În k-mean clustering, fiecare cluster este reprezentat de centrul său (adică de
centroid), care corespunde cu media punctele alocate clusterului.
Pentru început se va afișa numărul de linii și coloane ale matricei
informaționale (dim(productia)), utilizând linia de cod R următoare:
dim(productia)
[1] 10 4
Ca urmare, matricea informațională pe baza căreia se va face clasificarea/
gruparea este formată din 10 observații (indivizi) și respectiv 4 variabile
(caracteristici).
Observație: Întrucât nu toate variabilele sunt exprimate în aceeași unitate de
măsură, se impune standardizarea datelor.

7.2.2. Pregătirea datelor

Această metodă, k-mean clustering, are ca scop gruparea celor m observații


(indivizi) într-un număr optim de clase, k, ce este prestabilit.
Pentru a efectua o analiză cluster în R, în general, datele trebuie să fie
pregătite după cum urmează:
‐ liniile/rândurile trebuie să fie observații/obiecte/indivizi, în timp ce
coloanele trebuie să fie variabile/caracteristici/însușiri;
‐ orice valoare lipsă din date trebuie eliminată sau estimată;
Pentru a elimina orice valoare lipsă care ar putea fi prezentă în date, se
apelează la comanda R:
productia <- na.omit(productia)
- datele trebuie a fi standardizate24 (scalate) pentru a putea face variabilele
comparabile.
Pentru standardizarea datelor se va folosi funcția scale().
Normalizarea min-max transformă datele într-o gamă comună, eliminând
astfel efectul de scalare din toate variabilele. Spre deosebire de normalizarea

24
De regulă, standardizarea constă în transformarea variabilelor astfel încât acestea să aibă
media zero și abaterea standard unu, adică o distribuţie normală.

 
4 Analiza datelor în mediul R - teorie şi aplicaţii

scorului Z, metoda mediană și MAD, metoda min-max, păstrează distribuția


originală a variabilelor.
În continuare, se vor normaliza datele utilizând metoda de normalizare
min-max.
Scriptul R pentru scalarea datelor, utilizând metoda min-max, este după
cum urmează:
max = apply(productia, 2 , max)
min = apply(productia, 2 , min)
productia_scalata=as.data.frame(scale(productia,center=min,
scale=max-min))
productia_scalata
munca capital pamant productie
1 0.6 0.4761905 0.00000000 0.3333333
2 0.8 0.0000000 0.33333333 0.6666667
3 0.4 0.9523810 0.33333333 0.1666667
……………………………………………
9 1.0 0.4285714 0.83333333 1.0000000
10 0.2 1.0000000 0.50000000 0.0000000
- măsurarea (di)similarității observațiilor folosind măsuri de distanță25
(distanța euclidiană, distanța Manhattan etc.).
Se poate astfel calcula matricea de di(similaritate) sau a distanțelor dintre
fiecare două firme, folosid funcția dist(), prin următoarele linii de cod R:
distanta <- dist(productia, method = "euclidean")
distanta
1 2 3 4 5 6 7
2 201.28587
3 102.54755 303.31502
4 208.86838 407.96323 108.78419
5 72.47758 152.55491 161.71889 260.85437
6 202.36601 10.77033 304.55870 410.01219 156.60460
7 100.59821 105.35654 200.34969 304.27290 50.60632 108.18503
8 170.95321 37.74917 271.78116 376.98408 121.43311 39.86226 73.65460
9 402.12063 201.28835 503.74299 608.35598 349.29930 200.40210 304.28441
10 204.34530 405.02469 102.00490 26.09598 260.32672 406.43942 301.60405
8 9
2
3
4
5
6
7
8
9 232.17235
10 373.41666 605.44199
Observație: Pot fi folosite alternativ ca method variantele:
maximum, manhattan, canberra, binary, minkowski etc.
Dacă pentru a calcula măsura de (di)similaritate între două perechi de
observații se poate apela și la funcția get_dist, spre exemplu, pentru a măsura

25
În R, distanța euclidiană este folosită implicit pentru a măsura disimilaritatea între fiecare
pereche de observații.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 5

(di)similaritatea între două grupuri de observații au fost create diferite metode


aglomerative de clustering26 (metode de legătură).
Ca urmare, în mediul R este simplu de calculat și vizualizat matricea de
di(similaritate) folosind funcțiile get_dist și respectiv fviz_dist din
pachetul factoextra. Acest lucru începe să ilustreze care stări au mari
disimilități(roșu) față de cele care par a fi destul de similare(turcoaz).
Avem27 astfel:
distanta_pack <- get_dist(productia_scalata)
distanta_pack
1 2 3 4 5 6 7
2 0.6992708
3 0.6369036 1.1476190
4 0.7312625 1.0971025 0.8720561
5 0.7206581 0.7887136 0.7072070 0.7058229
6 0.6275786 0.2151306 1.0394705 1.1485696 0.8020135
7 0.3191187 0.7681146 0.4801266 0.8310342 0.5913444 0.6650661
8 1.1286945 1.1293974 0.8597744 1.4679918 0.8553354 0.9985732 0.8970757
9 1.1406825 0.7647121 1.2565114 1.6120736 1.0128567 0.6540646 1.0005667
10 0.8919011 1.3535960 0.3127669 0.8911285 0.7602251 1.2718298 0.7498148
8 9
2
3
4
5
6
7
8
9 0.7010561
10 0.9430525 1.4414027
fviz_dist(distanta_pack, gradient = list(low = "#00AFBB",
mid = "white", high = "#FC4E07"))

Figura 7.1. Vizualizarea matricei de di(similaritate) folosind


funcția fviz_dist

7.2.3. Metoda propriu-zisă

26
A se vedea prezentarea ceva mai târziu.
27
Reprezentările grafice din acest capitol sunt obținute din prelucrări proprii ale autorului,
utilizând mediul R.

 
6 Analiza datelor în mediul R - teorie şi aplicaţii

Primul pas în utilizarea algoritmului k-means clustering este acela al


stabilirii numărului de clustere, k, după care se selectează aleatoriu obiectele
(mijloacele de clustere sau centroide) din setul de date, care vor servi ca centre
inițiale ale celor k clustere. În continuare, fiecare dintre obiectele rămase este
atribuit celui mai apropiat centroid, unde cel mai apropiat este definit folosind
distanța euclidiană, spre exemplu, dintre fiecare obiect rămas și media clusterului.
Acest pas se numește și pas de atribuire a fiecărui obiect rămas la un cluster.
După etapa de atribuire, algoritmul calculează noua valoare medie a
fiecărui cluster. Termenul de cluster sau actualizare centroidă este utilizat pentru a
proiecta acest pas.
În continuare, centrele fiind recalculate, fiecare observație este verificată
din nou pentru a vedea dacă ar putea fi mai aproape de un alt grup decât cel din
care face parte. Ca urmare, toate obiectele sunt reasignate din nou folosind
mijloacele cluster actualizate.
Etapele de alocare a clusterelor și de actualizare a centroizilor se repetă
iterativ, până când componența clusterelor nu se mai modifică (adică clasele
formate în iterația curentă sunt aceleași cu cele obținute în iterația anterioară).
Pașii algoritmului sunt următorii:
Pasul 1: Se precizează numărul de clustere, k, ce urmează a fi create (aceasta
se face de către analist).
Pasul 2: Se selectează aleatoriu k indivizi/obiecte din setul de date, puncte
ce vor reprezenta centre sau mijloace ale clusterelor inițiale (centroide inițiale).
Pasul 3: Se alocă fiecare individ (observație) neselectat la pasul 1,
centroidului cel mai apropiat, pe baza distanței euclidiene dintre individ/obiect și
fiecare centroid deja format.
Pasul 4: Pentru fiecare din cele k clustere (grupuri) formate la acest nivel, se
actualizează centroidul clusterului, calculând noile valori medii ale tuturor
punctelor ce fac parte din cluster.
Observație: Centroidul fiecărui cluster din cele k stabilite iniţial este un vector de
lungime n, ce conține mijloacele tuturor variabilelor pentru indivizii/observațiile
din clusterul respectiv, unde n reprezintă numărul de variabile din matricea
informațională.
Pasul 5: Se repeată pasul 3 (corespunzător acelor indivizi/observații
neselectați la pasul anterior, când a fost actualizat centroidul fiecărui cluster) și
pasul 4 până când alocările la nivelul clusterelor nu se mai schimbă sau se ajunge
la numărul maxim de iterații28. Efectul este astfel minimizarea sumei variațiilor
totale în cadrul fiecărui cluster, după relația:

unde:
‒ reprezintă un punct aparținând clusterului ;

28
În R, valoarea implicită pentru numărul maxim de iterații este 10.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 7

‒ reprezintă valoarea minimă a punctului ce aparține clusterului .


În continuare, se va aplica gruparea29 k-mean clustering cu funcția
kmeans(), în următoarele situații:
- clasificarea cu 2 clase:
model_2clase <- kmeans(productia_scalata, centers = 2)
print(model_2clase$cluster)
[1] 2 1 2 2 2 1 2 1 1 2
Clusterul pentru fiecare observație poate fi prezentat direct în setul de
date, sub forma unei coloane suplimentare, astfel:
productia_scalata_cluster <- data.frame(productia_scalata,
cluster = as.factor(model_2clase$cluster))
productia_scalata_cluster
munca capital pamant productie cluster
1 0.6 0.4761905 0.00000000 0.3333333 2
2 0.8 0.0000000 0.33333333 0.6666667 1
3 0.4 0.9523810 0.33333333 0.1666667 2
4 0.0 0.2380952 0.08333333 0.0000000 2
5 0.2 0.3809524 0.58333333 0.4333333 2
6 0.9 0.1904762 0.33333333 0.6666667 1
7 0.5 0.6666667 0.16666667 0.5000000 2
8 0.7 0.9047619 1.00000000 0.6166667 1
9 1.0 0.4285714 0.83333333 1.0000000 1
10 0.2 1.0000000 0.50000000 0.0000000 2
Observație: Funcția kmeans() are, de asemenea, o opțiune nstart care
încearcă mai multe configurații inițiale și raportează pe cea mai bună. De
exemplu, adăugarea nstart=30, va genera 30 de configurații inițiale. Această
abordare este adesea recomandată.
Putem avea, stfel:
model_2clase1 <- kmeans(productia_scalata, centers = 2,
nstart=30)
print(model_2clase1$cluster)
[1] 2 1 2 2 2 1 2 1 1 2
str(model_2clase1)
List of 9
$ cluster : Named int [1:10] 2 1 2 2 2 1 2 1 1 2
..- attr(*, "names")= chr [1:10] "1" "2" "3" "4" ...
$ centers : num [1:2, 1:4] 0.85 0.317 0.381 0.619 0.625 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:2] "1" "2"
.. ..$ : chr [1:4] "munca" "capital" "pamant" "productie"
$ totss : num 3.9
$ withinss : num [1:2] 0.956 1.236
$ tot.withinss: num 2.19
$ betweenss : num 1.7
$ size : int [1:2] 4 6
$ iter : int 1
$ ifault : int 0
- attr(*, "class")= chr "kmeans"

29
Este un algoritm de învățare automată nesupravegheată pentru partitionarea unui set de
date dat într-un set de k grupuri (adică k clustere), unde k reprezintă numărul de grupuri
pre-specificate de analist.

 
8 Analiza datelor în mediul R - teorie şi aplicaţii

Dacă se printează rezultatele, se va vedea că gruparea datelor a condus la


2 grupuri, de dimensiune 4 și respectiv 6. Se pot vedea astfel centrele clusterelor
(mijloacele) pentru cele două grupuri formate din cele patru variabile ("munca"
"capital" "pamant" "productie"). De asemenea, se obține alocarea
fiecărei observații la clusterul corespunzător(adică firma 1 a fost atribuită
clusterului 2, firma 2 a fost atribuită clusterului 1 etc), având astfel:
model_2clase1
K-means clustering with 2 clusters of sizes 4, 6
Cluster means:
munca capital pamant productie
1 0.8500000 0.3809524 0.6250000 0.7375000
2 0.3166667 0.6190476 0.2777778 0.2388889
Clustering vector:
1 2 3 4 5 6 7 8 9 10
2 1 2 2 2 1 2 1 1 2
Within cluster sum of squares by cluster:
[1] 0.9557582 1.2364664
(between_SS / total_SS = 43.7 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss"
[7] "size" "iter" "ifault"
Pentru vizualizarea rezultatelor se poate folosi funcția fviz_cluster(). Dacă
există mai mult de două dimensiuni (variabile), funcția fviz_cluster() va
efectua o analiză a componentelor principale (PCA) și va reprezenta punctele de
date în funcție de primele două componente principale, care explică majoritatea
variației, astfel:
fviz_cluster(model_2clase1, data = productia_scalata)

Figura 7.2. Vizualizarea rezultatelor folosind


funcția fviz_cluster()

Alternativ, se pot utiliza ploturi standard de împrăștiere în perechi pentru


a ilustra grupurile, în comparație cu variabilele originale, astfel:
productia_scalata %>%
as_tibble() %>%
mutate(cluster = model_2clase1$cluster,
state = row.names(productia)) %>%
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 9

ggplot(aes(munca, pamant, color = factor(cluster), label =


state))+ geom_text()

Figura 7.3. Plot standard de împrăștiere

- clasificarea cu 3 clase:
model_3clase <- kmeans(productia_scalata, centers = 3)
print(model_3clase$cluster)
[1] 1 3 2 1 1 3 1 2 3 2
Clusterul pentru fiecare observație poate fi prezentat direct în setul de
date, sub forma unei coloane suplimentare, astfel:
productia_scalata_cluster <- data.frame(productia_scalata,
cluster = as.factor(model_3clase$cluster))
productia_scalata_cluster
munca capital pamant productie cluster
1 0.6 0.4761905 0.00000000 0.3333333 1
2 0.8 0.0000000 0.33333333 0.6666667 3
3 0.4 0.9523810 0.33333333 0.1666667 2
4 0.0 0.2380952 0.08333333 0.0000000 1
5 0.2 0.3809524 0.58333333 0.4333333 1
6 0.9 0.1904762 0.33333333 0.6666667 3
7 0.5 0.6666667 0.16666667 0.5000000 1
8 0.7 0.9047619 1.00000000 0.6166667 2
9 1.0 0.4285714 0.83333333 1.0000000 3
10 0.2 1.0000000 0.50000000 0.0000000 2
Precizare. Și în acest caz se poate face o analiză în extensie, similară celei de la
cazul cu 2 clustere.
Deoarece numărul de clustere, k, trebuie stabilit înaintea rulării
algoritmul, este avantajos să se utilizeze mai multe valori diferite pentru k și să se
examineze diferențele dintre rezultate, așa cum sunt prezentate în continuare și
cazurile pentru k=2, k=3 și k=4, pentru exemplificare:
model_2clase1<-kmeans(productia_scalata,centers=2,nstart=30)
model_3clase1<-kmeans(productia_scalata,centers=3,nstart=30)
model_4clase1<-kmeans(productia_scalata,centers=4,nstart=30)
# Reprezentarea grafică pentru comparare
plot2<-fviz_cluster(model_2clase1, geom = "point", data =
productia_scalata) + ggtitle("k = 2")

 
10 Analiza datelor în mediul R - teorie şi aplicaţii

plot3<-fviz_cluster(model_3clase1, geom = "point", data =


productia_scalata) + ggtitle("k = 3")
plot4<-fviz_cluster(model_4clase1, geom = "point", data =
productia_scalata) + ggtitle("k = 4")
library(gridExtra)
grid.arrange(plot2, plot3, plot4, nrow = 2)

7.2.4. Măsurarea calității unei partiții k-mean

Calitatea unei partiții k-mean se obține prin calculul procentulului de TSS


explicat de partiție, după următoarea formulă: (BSS/TSS)×100%, unde BSS și
TSS reprezintă suma pătratelor variaţiilor interclase și respectiv suma totală a
pătratelor variaţiilor. Cu cât acest procent este mai mare, cu atât scorul (și deci
calitatea unei partiții k-mean) este mai bun, deoarece înseamnă că BSS este mare.
Pentru a verifica calitatea unei partiții k-mean în R se poate proceda astfel:
BSS <- model_2clase$betweenss
BSS
[1] 1.704744
TSS <- model_2clase$totss
TSS
[1] 3.896969
BSS/TSS * 100
[1] 43.74539
Comentariu: Calitatea partiției k-mean este de 43,75%, și nu are o interpretare
reală în termeni absoluți, doar că o calitate superioară înseamnă un procent
explicat mai mare.
Pentru creșterea stabilității, întrucât algoritmul k-means folosește un set
aleatoriu de puncte inițiale pentru a ajunge la clasificarea finală, în cadrul funcției
kmeans() se folosește nstart.
Întrucât centrele inițiale sunt alese la întâmplare, aceeași comandă
kmeans(productia_scalata, centers = 2) poate da rezultate ușor
diferite de fiecare dată când este rulată, și astfel ușoare diferențe în ceea ce
privește calitate partițiilor.
Folosirea argumentului nstart în funcția kmeans() permite rularea
algoritmului de mai multe ori cu diferite centre inițiale, pentru a obține o partiție
potențial mai bună, având astfel:
model_2clase_nou <- kmeans(productia_scalata, centers = 2,
nstart = 8)
BSS_nou <- model_2clase_nou$betweenss
BSS_nou
[1] 1.704744
TSS_nou <- model_2clase_nou$totss
TSS_nou
[1] 3.896969
(BSS_nou/TSS_nou) * 100
[1] 43.74539
Observație: Se constată că în acest caz rezultatul este același.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 11

Pentru măsurarea calității unei partiții k-mean cu 3 clase, avem astfel


următoarele valori:
BSS <- model_3clase$betweenss
BSS
[1] 2.294947
TSS <- model_3clase$totss
TSS
[1] 3.896969
BSS/TSS * 100
[1] 58.89056
Comentariu: În acest caz, calitatea partiției k-mean este de 58,89%, adică
permite un procent mai mare explicat și o calitate mai mare.
Se poate astfel stabili regula generală: creșterea numărului de clase face
ca partiția să fie mai fină, iar contribuția BSS să fie mai mare.
Folosind din nou argumentul nstart în funcția kmeans() vom avea:
model_3clase_nou <- kmeans(productia_scalata, centers = 3,
nstart = 8)
BSS_nou <- model_3clase_nou$betweenss
BSS_nou
2.391622
TSS_nou <- model_3clase_nou$totss
TSS_nou
3.896969
(BSS_nou/TSS_nou) * 100
61.37134
Observație: Se constată că în acest caz rezultatul este superior.

7.3. Metode de grupare ierarhică (Hierarchical Clustering Algorithms)

7.3.1. Aspecte generale

Gruparea ierarhică cuprinde două tipuri principale de metode și anume:


metoda aglomerativă și respectiv metoda divizivă.

Gruparea ierarhică aglomerativă

Această metodă este cunoscută și sub denumirea de AGNES (Agglomerative


Nesting) și funcționează după o procedură de jos în sus, în sensul că:â
- inițial fiecare individ/observație/obiect este considerat ca fiind un cluster
cu un singur element (o singură frunză);
- la fiecare etapă a algoritmului, două grupuri care sunt cele mai
asemănătoare sunt combinate într-un nou grup mai mare (nod);
- procedura aceasta este reluată până când toate punctele sunt membre ale
unui singur cluster mare, numit și rădăcină;
- rezultatul este un arbore care, de regulă, este reprezentat sub forma unei
dendrograme.

 
12 Analiza datelor în mediul R - teorie şi aplicaţii

Gruparea ierarhică divizivă

Această metodă este cunoscută și sub denumirea DIANA (Divise


Analysis) și funcționează după o procedură de sus în jos, ceea ce induce faptul că
algoritmul este în ordine inversă cu cel anterior(adică cu AGNES), în sensul că:
- începe cu rădăcina, în care toate obiectele sunt incluse într-un singur
cluster;
- la fiecare etapă a algoritmului, cel mai eterogen grup este împărțit în
două;
- această procedură este reluată până când fiecare individ/observație/obiect
este considerat ca fiind un cluster cu un singur element (o singură frunză).
Observație: Gruparea ierarhică aglomerativă este recomandată în cazul
identificării grupurilor mici, în timp ce gruparea ierarhică divizivă este
recomandată pentru identificarea cluster-elor mari.

7.3.2. Pregătirea datelor

Această metodă are ca scop gruparea celor m observații/indivizi într-un


număr optim de clase, k.
Pentru a efectua o analiză cluster în R, în general, datele trebuie să fie
pregătite, după cum urmează:
- liniile/rândurile trebuie să fie observații/obiecte/indivizi, în timp ce
coloanele trebuie să fie variabile/caracteristici;
- orice valoare lipsă din date trebuie eliminată sau estimată;
Pentru a elimina orice valoare lipsă care ar putea fi prezentă în date, se
apelează la comanda R:
productia <- na.omit(productia)
- datele trebuie a fi standardizate30(scalate) pentru a putea face
variabilele comparabile.
Pentru standardizarea datelor se va folosi funcția scale():
Normalizarea min-max transformă datele într-o gamă comună, eliminând
astfel efectul de scalare din toate variabilele. Spre deosebire de normalizarea
scorului Z, metoda mediană și MAD, metoda min-max păstrează distribuția
originală a variabilelor.
Se vor normaliza datele, utilizând metoda de normalizare min-max.
Scriptul R pentru scalarea datelor, utilizând metoda min-max, este după
cum urmează:
max = apply(productia, 2 , max)
min = apply(productia, 2 , min)
productia_scalata=as.data.frame(scale(productia,center=min,
scale=max-min))
productia_scalata

30
De regulă, standardizarea constă în transformarea variabilelor astfel încât acestea să aibă
media zero și abaterea standard unu, adică o distribuţie normală..
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 13

munca capital pamant productie


1 0.6 0.4761905 0.00000000 0.3333333
2 0.8 0.0000000 0.33333333 0.6666667
3 0.4 0.9523810 0.33333333 0.1666667
4 0.0 0.2380952 0.08333333 0.0000000
5 0.2 0.3809524 0.58333333 0.4333333
6 0.9 0.1904762 0.33333333 0.6666667
7 0.5 0.6666667 0.16666667 0.5000000
8 0.7 0.9047619 1.00000000 0.6166667
9 1.0 0.4285714 0.83333333 1.0000000
10 0.2 1.0000000 0.50000000 0.0000000
-măsurarea (dis)similarității observațiilor folosind măsuri de distanță31
(distanța euclidiană, distanța Manhattan etc.).
Putem a calcula matricea de di(similaritate) sau a distanțelor dintre fiecare
două firme, se poate folosi funcția dist(), prin următoarele linii de cod R:
distanta <- dist(productia, method = "euclidean")
distanta
1 2 3 4 5 6 7
2 201.28587
3 102.54755 303.31502
4 208.86838 407.96323 108.78419
5 72.47758 152.55491 161.71889 260.85437
6 202.36601 10.77033 304.55870 410.01219 156.60460
7 100.59821 105.35654 200.34969 304.27290 50.60632 108.18503
8 170.95321 37.74917 271.78116 376.98408 121.43311 39.86226 73.65460
9 402.12063 201.28835 503.74299 608.35598 349.29930 200.40210 304.28441
10 204.34530 405.02469 102.00490 26.09598 260.32672 406.43942 301.60405
8 9
2
3
4
5
6
7
8
9 232.17235
10 373.41666 605.44199
Observație: Pot fi folosite alternativ ca method variantele:
maximum, manhattan, canberra, binary, minkowski etc, întrucât
euclidean este forma implicită.
Dacă pentru a calcula măsura de disimilaritate între două perechi de
observații se poate apela la funcția get_dist, spre exemplu, pentru a măsura
disimilarea între două grupuri de observații au fost create diferite metode
aglomerative de clustering (metode de legătură).

7.3.3. Metoda propriu-zisă (alomerativă)

Cele mai frecvente metode de tip aglomerativ sunt:


- legătura simplă;
- legătura completă;

31
În R, distanța euclidiană este folosită implicit pentru a măsura disimilaritatea între fiecare
pereche de observații.

 
14 Analiza datelor în mediul R - teorie şi aplicaţii

- legătura medie;
- legătura de tip centroid;
- metoda Ward etc.
Generic, pașii algoritmului aglomerativ sunt următorii:
Pasul 1: Se pune fiecare punct (observație, individ) în propriul său cluster, astfel
încât fiecare cluster conține un singur individ.
Pasul 2: Se alătură două puncte care sunt cele mai apropiate unul de celălalt, din
punctul de vedere al distanței, folosind pentru aceasta matricea distanțelor.
Consecința este că există o clasă mai puțin.
Pasul 3: Se calculează centroidul clusterului nou format.
Pasul 4: Se recalculează distanța dintre clusterul nou format și fiecare dintre
clusterele vechi și se rescriu rezultatele într-o nouă matrice a distanțelor, care va fi
folosită la pasul următor.
Pasul 5: Se repeată pașii 2-4 până când toate observațiile sunt reunite
într-un singur cluster.
Există cinci metode principale pentru a măsura distanța dintre două
clustere și în consecință a clusteriza, denumite și metode de legătură, pentru care
codurile R sunt redate în continuare, și anume:
- metoda celor mai apropiaţi vecini (clustering de legătură
minimă sau unică – legătura/agregarea simplă): calculează
distanța minimă dintre clustere înainte de contopirea/alăturarea
acestora, ca fiind minimul distanței dintre oricare două obiecte/
observații/indivizi din cele două clustere, astfel:
# Se aplică metoda grupării ierarhice, cazul unei legături simple(metoda
# celor mai apropiaţi vecini)
hclust_single <- hclust(dist(productia_scalata), method =
"single")
# Se extrag înălțimile și se trasează dendrograma
round(hclust_single$height, 3)
[1] 0.215 0.313 0.319 0.480 0.591 0.628 0.654 0.701 0.706
plot(hclust_single)

Figura 7.4.a. Reprezentarea dendrogramei, cazul unei legături simple


Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 15

(metoda celor mai apropiaţi vecini)

sau varianta:
plot(hclust_single , cex = 0.7, hang = -1)
graficul fiind diferențiat32 în următorul sens:

Figura 7.4.b. Reprezentarea dendrogramei, cazul unei legături simple (metoda


celor mai apropiaţi vecini)

Observații:
1. Această metodă are tendința de a produce clustere lungi.
2. Funcția hclust() necesită o matrice a distanțelor, motiv pentru care se
observă în interiorul ei ca fiind folosită funcția dist().
Se poate folosi și o metodă prin care să se calculează în prealabil distanța, astfel:
distanta_scalata <- dist(productia_scalata, method =
"euclidean")
hclust_single1 <- hclust(distanta_scalata, method = "single")
round(hclust_single1$height, 3)
plot(hclust_single1)
Metoda grupării ierarhice este utilizată pentru determinarea numărului
optim de clustere, dendrograma fiind astfel mijlocul specific pentru a evidenția
acest lucru. Pentru aceasta, se analizează cea mai mare diferență de înălțimi și se
numără câte linii verticale se formează. În R, se poate evidenția numărul de
clustere formate, direct în dendrogramă, cu funcția rect.hclust(), prin
următoarele linii de cod R:
plot(hclust_single)
# k este folosit pentru a defini numărul de clustere
rect.hclust(hclust_single, k = 2, border = "green")

32
În următoarele abordări nu se va mai face această nuanțare.

 
16 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 7.5. Dendrograma marcată pentru cele 2 clustere

Cea mai mare diferență de înălțimi din dendrogramă apare înainte de


combinația finală, adică înainte de clusterul format doar din 4 și grupul format din
toate celelalte, adică 1 & 2 & 3 & 5 & 6 & 7 & 8 & 9 & 10. Pentru a determina
numărul optim de clustere, se numără câte linii verticale sunt în cazul diferenței
cea mai mare. În speță, în cazul de față, numărul optim de clustere este 3.
În cele din urmă, se poate determina, de asemenea, numărul optim de
clustere (clase) cu ajutorul unei bare de înălțime, stocată în înălțimea $height a
clusteringului de output, prin următoarele linii de cod R:
# Scrierea numărului de clustere sub fiecare bară
barplot(hclust_single$height,names.arg=(nrow(productia_scal
ata) - 1):1)

Figura 7.6. Barplot-ul de înălțime, cazul unei legături simple

Se caută cea mai mare amplitudine de înălțime obținută și se constată că


Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 17

în cazul de față este de la clasa 1 la clasa 2. Prin urmare, numărul optim


de clase este 2.
Observații:
1. Determinarea numărului de clustere, utilizând dendrograma sau barplot-ul nu
este o regulă strictă;
2. De asemenea, se pot utiliza și alte metode, cum ar fi reprezentarea siluetei,
reprezentarea cotului sau unele măsuri numerice precum indicele Dunn(cu cât
este mai mare, cu atât este mai bine), gama Hubert etc, care arată variația erorii în
raport cu numărul de clustere, k, și alegerea valoarii k pentru care eroarea este cea
mai mică.
Comentariu: Alternativ, se poate folosi funcția agnes(), care se comportă
similar cu funcția hclust(), numai că funcția agnes() permite determinarea
coeficientului de aglomerare, care măsoară cantitatea de structură de clustering
găsită (valorile mai apropiate de 1 sugerează o structură puternică de clustering).
Liniile de cod R vor fi în acest caz:
# Pachetele necesare pentru prelucrarea datelor
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
# Algoritmi de clustering
install.packages("cluster", dependencies = TRUE)
library(cluster)
# Vizualizarea clusterelor
install.packages("factoextra", dependencies = TRUE)
library(factoextra)
# Compararea de dendrograme
install.packages("dendextend", dependencies = TRUE)
library(dendextend)
# Calculul cu agnes
hc_agnes_single <- agnes(dist(productia_scalata), method =
"single")
# Coeficientul de aglomerare
hc_agnes_single$ac
#[1] 0.3842194
round(hc_agnes_single$height, 3)
[1] 0.319 0.480 0.313 0.591 0.628 0.215 0.654 0.701 0.706
plot(hc_agnes_single)
- metoda celor mai depărtaţi vecini (clustering de legătură
maximă – legătura/agregarea completă): calculează distanța
maximă dintre clustere înainte de contopirea/alăturarea acestora, ca
fiind maximul distanței dintre oricare două obiecte/observații/
indivizi din cele două clustere, astfel:
# Se aplică metoda grupării ierarhice, cazul unei legături complete(metoda
# celor mai depărtaţi vecini)
hclust_complete <- hclust(dist(productia_scalata), method =
"complete")
# Se extrag înălțimile și se trasează dendrograma
round(hclust_complete$height, 3)
[1] 0.215 0.313 0.319 0.701 0.706 0.768 0.891 1.141 1.612
plot(hclust_complete)

 
18 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 7.7. Reprezentarea dendrogramei, cazul unei legături complete


(metoda celor mai depărtaţi vecini)

Observație: Această metodă are tendința de a produce clustere compacte.


În continuare, abordarea este similară cazului legăturii simple. Similar cu
legătura simplă, cea mai mare diferență de înălțime în dendrogramă apare înainte
de combinația finală, adică înainte de combinația grupului 3 & 4 & 5 & 10 cu
grupul 1 & 2 & 6 & 7 & 8 & 9. În acest caz, numărul optim de clustere este astfel
2. În R, se pot evidenția chiar aceste două clustere direct în dendrograma cu
funcția rect.hclust (), astfel:
plot(hclust_complete)
# k este folosit pentru a defini numărul de clustere
rect.hclust(hclust_complete, k = 2, border = "green")

Figura 7.8. Dendrograma marcată pentru cele 2 clustere


(metoda celor mai depărtaţi vecini)
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 19

De asemenea, se poate determina numărul optim de clustere/clase datorită


unei bare de înălțime, stocată în înălțimea $height a clusteringului de output,
prin următoarele linii de cod R:
# Scrierea numărului de clustere sub fiecare bară
barplot(hclust_complete$height,names.arg=(nrow(productia_sc
alata) - 1):1)

Figura 7.9. Barplot-ul de înălțime, cazul unei legături complete


(metoda celor mai depărtaţi vecini)

- metoda distanţei medii dintre elementele celor două grupuri


(clustering de legătură/agregare medie): calculează distanța
dintre două clustere înainte de contopirea/alăturarea acestora, ca
fiind distanţa medie dintre elementele celor două grupuri, fără a lua
în calcul distanţele intragrupuri, astfel:
# Se aplică metoda grupării ierarhice, cazul unei legături medii
hclust_average <- hclust(dist(productia_scalata), method =
"average")
# Se extrag înălțimile și se trasează dendrograma
round(hclust_average$height, 3)
[1] 0.215 0.313 0.319 0.656 0.701 0.704 0.806 0.887 1.043
plot(hclust_average)

 
20 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 7.10. Reprezentarea dendrogramei, cazul unei legături medii (metoda


distanţei medii dintre elementele celor două grupuri)

Similar cu legătura simplă, dar și cea completă, cea mai mare diferență de
înălțime în dendrogramă apare înainte de combinația finală, adică înainte de
combinația grupului 1 & 3 & 4 & 5 & 7 & 10 cu grupul 2 & 6 & 8 & 9. În acest
caz, numărul optim de clustere este astfel 2. În R, se pot evidenția chiar aceste
două clustere direct în dendrograma cu funcția rect.hclust(), astfel:
plot(hclust_average)
# k este folosit pentru a defini numărul de clustere
rect.hclust(hclust_average, k = 2, border = "green")

Figura 7.11. Dendrograma marcată pentru cele 2 clustere

De asemenea, se poate determina numărul optim de clustere/clase datorită


unei bare de înălțime, stocată în înălțimea $height a clusteringului de output,
prin următoarele linii de cod R:
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 21

# Scrierea numărului de clustere sub fiecare bară


barplot(hclust_average$height,names.arg=(nrow(productia_sca
lata) - 1):1)

Figura 7.12. Barplot-ul de înălțime, cazul unei legături medii (metoda


distanţei medii dintre elementele celor două grupuri)

- clustering pentru legătura/agregarea de tip centroid: calculează


centroidul pentru fiecare dintre clustere, apoi calculează distanța
dintre cele două centroide, înainte de contopirea/alăturarea claselor.
- metoda Ward (a varianței minime): urmăreşte minimizarea
pierderii de informaţie, minimizând suma pătratelor abaterilor
fiecărei variabile din cluster de la medie, adică minimizând variația
totală a abaterilor în cadrul clusterului, astfel că la fiecare pas,
perechea de clustere cu distanță minimă între clustere este cea
contopită/alăturată.
Liniile de cod R vor fi în acest caz:
# Calculul cu agnes
# Pachetele necesare pentru prelucrarea datelor
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
# Algoritmi de clustering
install.packages("cluster", dependencies = TRUE)
library(cluster)
# Vizualizarea clusterelor
install.packages("factoextra", dependencies = TRUE)
library(factoextra)
# Compararea de dendrograme
install.packages("dendextend", dependencies = TRUE)
library(dendextend)
Astfel avem:
# Metoda de clusterizare

 
22 Analiza datelor în mediul R - teorie şi aplicaţii

metoda <- c("average","single","complete","ward")


names(metoda) <- c( "average", "single", "complete", "ward")
# Funcția de calcul a coeficientului de aglomerare
aglomerare <- function(x) {
agnes(dist(productia_scalata), method = x)$ac
}
# Comparare dendrograme
map_dbl(metoda, aglomerare)
# average single complete ward
# 0.5628295 0.3842194 0.7203732 0.7558712
Se constată astfel că cel mai mare coeficient de aglomerare este pentru
metoda Ward (0.7558712)
Pentru vizualizarea dendrogramei cu metoda Ward, vom avea:
hc_Ward <- agnes(dist(productia_scalata), method = "ward")
pltree(hc_Ward, main = "Dendrograma cu ajutorul funcției
agnes")

Figura 7.13. Dendrograma reprezentată cu ajutorul funcției agnes

7.3.4. Lucrul cu dendrograme

La nivelul unei dendrograme, fiecare frunză corespunde unei observații.


Pe măsură ce se parcurge arborele, observații similare între ele sunt combinate în
ramuri, care sunt ele însele asimilate la o înălțime mai mare.
Înălțimea fuziunii, prevăzută pe axa verticală, indică (dis)similitudinea
dintre două observații, în sensul că, cu cât înălțimea fuziunii este mai mare, cu
atât observațiile sunt mai puțin similare. Totodată, înălțimea tăieturii la nivel de
dendrogramă caracterizează numărul de clase obținute33. Pentru a identifica
subgrupuri (adică clustere), se poate tăia dendrograma cu cutree, astfel:

33
Înălțimea fuziunii/tăieturii la nivel de dendrogramă are același rol ca și k în k-mean
clustering.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 23

# Metoda Ward
hc_subgrup <- hclust(dist(productia_scalata), method =
"ward.D2" )
# Tăierea arborelui în 3 clustere, spre exemplu
sub_grup <- cutree(hc_subgrup, k = 3)
# Număr de membri în fiecare cluster
table(sub_grup)
# sub_grup
# 1 2 3
# 6 2 2
Se poate folosi, totodată, ieșirea cutree pentru a adăuga o coloană
suplimentară cu clusterul de care aparține fiecare observație din datelor originare,
astfel:
productia_scalata %>% mutate(cluster = sub_grup) %>%
head
munca capital pamant productie cluster
1 0.6 0.4761905 0.00000000 0.3333333 1
2 0.8 0.0000000 0.33333333 0.6666667 2
3 0.4 0.9523810 0.33333333 0.1666667 1
4 0.0 0.2380952 0.08333333 0.0000000 1
5 0.2 0.3809524 0.58333333 0.4333333 1
6 0.9 0.1904762 0.33333333 0.6666667 2
Se poate reprezenta grafic, de asemenea și dendrograma cu un chenar în
jurul celor 3 clustere, astfel:
plot(hc_subgrup)
rect.hclust(hc_subgrup, k = 3, border = 2:5)

Figura 7.14. Dendrograma, cu evidențierea celor 3 clustere

Se poate folosi și funcția fviz_cluster din pachetul factoextra


pentru a vizualiza rezultatul într-o diagramă de tip scatter plot, astfel:
fviz_cluster(list(data=productia_scalata,cluster=sub_grup))

 
24 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 7.15. Cluster plot-ul pentru cazul cu 3 clustere

Pentru a compara 2 dendrograme, în cazul grupării/clasificării ierarhice,


cazul metodei celor mai depărtaţi vecini (legăturii complete) și respectiv metoda
Ward, funcția tanglegram va reprezenta cele 2 dendrograme, una lângă alta, cu
etichetele lor conectate prin linii, astfel:
# Calculul matricei distanțelor
distanta_scalata<-dist(productia_scalata,method="euclidean")
# Calculul clusterelor cu cele două metode: legătura completă și metoda Ward
hclust_complete_1 <- hclust(distanta_scalata, method =
"complete")
hc_subgrup_2 <- hclust(distanta_scalata, method = "ward.D2")
# Crearea celor 2 dendrograme
dendrograma_1 <- as.dendrogram(hclust_complete_1)
dendrograma_2 <- as.dendrogram(hc_subgrup_2)
tanglegram(dendrograma_1, dendrograma_2)

Figura 7.16. Cele două dendrograme, cu etichetele conectate prin linii


Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 25

Calitatea alinierii celor doi arbori poate fi măsurată folosind funcția


entanglement, care ia valori între 1 (rețea completă) și 0 (rețea fără îmbinare).
Un coeficient de îmbinare mai mic corespunde unei clusterizări mai bune.
Putem avea astfel:
dend_list <- dendlist(dendrograma_1, dendrograma_2)
tanglegram(dendrograma_1, dendrograma_2,
highlight_distinct_edges = FALSE, common_subtrees_color_lines
= FALSE, common_subtrees_color_branches = TRUE, main = paste
("entanglement = ", round (entanglement (dend_list), 2)))

Figura 7.17. Evidențierea coeficientului de îmbinare a rețelei

7.4. Determinarea numărului optim de clustere în cazul metodei k-mean


clustering

Indiferent că este vorba de metoda k-mean clustering sau de metoda de


grupare ierarhică34, analistul specifică numărul de clustere de utilizat(fie în avans,
în cazul metodei k-mean clustering, fie pe parcursul efectuării analizei, în cazul
metodei de grupare ierarhică) care, de regulă, ar dori să fie numărul optim de
clustere. Ca urmare, cele mai populare trei metode pentru determinarea numărului
optim de clustere sunt: metoda cotului, metoda siluetei medii și respectiv metoda
statisticii gap.

7.4.1. Metoda cotului

Pentru a întări ideea, să reamintim că procedura de bază din spatele


metodelor de partiționare a clusterelor este să definim numărul optim de clustere,
astfel încât variația totală intracluster (cunoscută sub numele de variație/distanța

34
Aspectele comune ale celor două metode vor fi prezentate aici, urmând ca doar
specificitățile să fie expuse la metoda de grupare ierarhică.

 
26 Analiza datelor în mediul R - teorie şi aplicaţii

totală intraclasă sau suma totală a pătratelor distanțelor intraclasă/intracluster) să


fie minimizată.
Suma totală a pătratelor distanțelor intraclasă/intracluster, wss, măsoară
compactitatea grupării și se dorește ca valoarea acestui indicator, wss, să fie cât
mai mică. Astfel, se poate utiliza următorul algoritm pentru a determina numărul
optim de clustere:
Pasul 1: Se aplică algoritmul de clustering (k-mean clustering sau metoda de
grupare ierarhică) pentru diferite valori ale lui k, cu k luând valori de la 1 la 10.
Pasul 2: Pentru fiecare k, se calculează suma totală a pătratelor distanțelor
intraclasă/intracluster, wss.
Pasul 3: Se trasează diagrama curbei wss, în funcție de numărul de clustere k.
Pasul 4: Localizarea unei curburi (cot) în reprezentarea grafică este considerată un
indicator al numărului optim de clustere.
Se poate implementa acest algoritm în R, în diferite situații, cu următorul cod:
set.seed(2020)
# Calculul valorii lui wss
wss <- function(k) {
kmeans(productia_scalata, k, nstart = 7 )$tot.withinss
}
# Calculul și reprezentarea lui wss pentru k = 1 până la k = 4
k.values <- 1:4
# Extragerea wss pentru clusterele de la 1 la 4
wss_values <- map_dbl(k.values, wss)
plot(k.values, wss_values,
type="b", pch = 20, frame = FALSE,
xlab="Număr de clustere k",
ylab="Valoarea lui wss")

Figura 7.18. Evidențierea numărului optim de clustere, prin


metoda cotului, pentru k de la 1 la 4

sau
set.seed(2020)
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 27

# Calculul valorii lui wss


wss <- function(k) {
kmeans(productia_scalata, k, nstart = 7 )$tot.withinss
}
# Calculul și reprezentarea lui wss pentru k = 1 până la k = 9
k.values <- 1:9
# Extragerea wss pentru clusterele de la 1 la 9
wss_values <- map_dbl(k.values, wss)
plot(k.values, wss_values,
type="b", pch = 20, frame = FALSE,
xlab="Număr de clustere k",
ylab="Valoarea lui wss")

Figura 7.19. Evidențierea numărului optim de clustere, prin metoda


cotului, pentru k de la 1 la 9 și nstart = 7

sau
set.seed(2020)
# Calculul valorii lui wss
wss <- function(k) {
kmeans(productia_scalata, k, nstart = 30)$tot.withinss
}
# Calculul și reprezentarea lui wss pentru k = 1 până la k = 9
k.values <- 1:9
# Extragerea wss pentru clusterele de la 1 la 9
wss_values <- map_dbl(k.values, wss)
plot(k.values, wss_values,
type="b", pch = 20, frame = FALSE,
xlab="Număr de clustere k",
ylab="Valoarea lui wss")

 
28 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 7.20. Evidențierea numărului optim de clustere, prin metoda


cotului, pentru k de la 1 la 9 și nstart = 30

Rezultatele sugerează că 7 este numărul optim de clustere, deoarece pare a


fi cotul/curbura care stabilește acest număr optim de clustere35.
Acest proces de calcul al numărului optim de clustere bazat pe metoda
cotului se poate realiza cu o singură funcție, fviz_nbclust(), astfel:
set.seed(2020)
fviz_nbclust(productia_scalata,kmeans, method="wss",k.max=8)

Figura 7.21. Evidențierea numărului optim de clustere, prin metoda


cotului, utilizând funcția fviz_nbclust()

Rezultatele sugerează similar, că 7 este numărul optim de clustere.

35
Trebuie să nu se piardă din vedere faptul că datele din setul de date pe care se lucrează,
au fost generate în mod arbitrar, tocmai pentru a face discuții cât mai nuanțate.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 29

7.4.2. Metoda siluetei medii

Această metodă măsoară calitatea unui cluster, în sensul că determină cât


de bine este fixat fiecare obiect/individ în clusterul său.
Observație: O lățime medie mare a siluetei indică o aglomerare/clusterizare bună.
Metoda siluetei medii calculează silueta medie a observațiilor pentru
diferite valori ale lui k, numărul optim de clustere, k, fiind cel ce maximizează
silueta medie pe o gamă de valori posibile pentru k. Pentru aceasta, se poate utiliza
funcția silhouette din pachetul cluster pentru a calcula lățimea medie a
siluetei. Următorul cod R calculează silueta medie a observațiilor pentru 2-9
clustere, astfel:
# Calculul funcției siluetei medii pentru k clustere
avg_sil <- function(k) {
km.res <- kmeans(productia_scalata, centers = k, nstart=30)
silueta<-silhouette(km.res$cluster,dist(productia_scalata))
mean(silueta[, 3])
}
# Calculul și reprezentarea grafică a wss pentru k = 2 până la k = 9
k.values <- 2:9
# Extragerea siluetei medii pentru clusterele de la 2 la 9
avg_sil_values <- map_dbl(k.values, avg_sil)
plot(k.values, avg_sil_values,
type = "b", pch = 20, frame = FALSE,
xlab = "Număr de clustere,k",
ylab = "Silueta medie")

Figura 7.21. Evidențierea numărului optim de clustere, prin metoda


siluetei medii, pentru k de la 2 la 9

Rezultatele arată că 6 clustere maximizează valorile medii ale siluetei.


Acest proces de calcul al numărului optim de clustere bazat pe metoda
siluetei medii se poate realiza cu o singură funcție, fviz_nbclust(), astfel:
set.seed(2020)

 
30 Analiza datelor în mediul R - teorie şi aplicaţii

fviz_nbclust(productia_scalata,kmeans,method="silhouette",k.m
ax=8)

Figura 7.22. Evidențierea numărului optim de clustere, prin metoda


siluetei medii, utilizând funcția fviz_nbclust()

Rezultatele arată, de asemenea, că 6 clustere maximizează valorile medie


ale siluetei.

7.4.3. Metoda statisticii gap

Statistica gap (Tibshirani, Walther, Hastie, 2001), este o abordare ce poate


fi aplicată oricărei metode de clustering (adică k-mean clustering sau metode de
grupare ierarhică) și constă în compararea variației totale intracluster pentru diferite
valori ale lui k, cu valori așteptate, în condiții de distribuție nulă a datelor (adică o
distribuție fără clustering evident). Setul de date de referință este generat, de
regulă, folosind simulări Monte Carlo ale procesului de eșantionare.
Pentru a determina numărul optim de clustere cu metoda statisticii gap, se
poate folosi funcția clusGap care furnizează un gap statistic și o eroare standard
pentru o ieșire. Următorul cod R calculează gap-ul statistic și eroarea standard
pentru o ieșire, astfel:
# Calculul statistici gap
set.seed(2020)
gap_statistic<-clusGap(productia_scalata,FUN = kmeans, nstart
= 30,K.max = 8, B = 20)
Clustering k = 1,2,..., K.max (= 8): .. done
Bootstrapping, b = 1,2,..., B (= 20) [one "." per sample]:
.................... 20
# Se printează rezultatul
print(gap_statistic, method = "firstmax")
Clustering Gap statistic ["clusGap"] from call:
clusGap(x = productia_scalata, FUNcluster = kmeans, K.max = 8, B = 20,
nstart = 30)
B=20 simulated reference sets, k = 1..8; spaceH0="scaledPCA"
--> Number of clusters (method 'firstmax'): 1
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 31

logW E.logW gap SE.sim


[1,] 0.68534852 0.48632115 -0.1990274 0.09955556
[2,] 0.34215673 0.05868478 -0.2834720 0.13354447
[3,] 0.07618377 -0.26366092 -0.3398447 0.13332432
[4,] -0.22986170 -0.60946525 -0.3796035 0.16629176
[5,] -0.57363448 -0.94354966 -0.3699152 0.18948015
[6,] -0.94928392 -1.28877775 -0.3394938 0.19795390
[7,] -1.55232984 -1.70638086 -0.1540510 0.22528284
[8,] -2.02514750 -2.27695762 -0.2518101 0.26096081
Rezultatele pot fi vizualizate și cu funcția fviz_gap_stat, care
sugerează, de asemenea, că numărul optim de clustere este 7, așa cum se constată
în continuare:
fviz_gap_stat(gap_statistic)

Figura 7.23. Evidențierea numărului optim de clustere, prin metoda


statisticii gap, utilizând funcția fviz_gap_stat()

Rezultatele arată că un cluster (ceea ce pare ușor de neacceptat) sau că 7


clustere (ceea ce pare mult mai firesc) este numărul optim pentru seria de date pe
care s-a lucrat.
Observație: Pe lângă aceste abordări utilizate frecvent, pachetul NbClust, oferă
30 de alte metode pentru determinarea numărului relevant de clustere.
Așa cum se constată și în cazul metodelor de grupare ierarhică, numărul
optim de clustere ales este unul aproximativ/orientativ, în cazul de față între 5-7, în
funcție și de metoda aleasă.
Formatul simplificat al funcției NbClust() este, astfel:
library("NbClust")
numar_clustere <- NbClust(productia_scalata, distance =
"euclidean", min.nc = 2, max.nc = 6, method = "kmeans")
*** : The Hubert index is a graphical method of determining the number of
clusters.
In the plot of Hubert index, we seek a significant knee that
corresponds to a

 
32 Analiza datelor în mediul R - teorie şi aplicaţii

significant increase of the value of the measure i.e the


significant peak in Hubert
index second differences plot.
*** : The D index is a graphical method of determining the number of
clusters.
In the plot of D index, we seek a significant knee (the
significant peak in Dindex
second differences plot) that corresponds to a significant
increase of the value of
the measure.
***********************************************************
* Among all indices:
* 9 proposed 2 as the best number of clusters
* 3 proposed 3 as the best number of clusters
* 2 proposed 4 as the best number of clusters
* 1 proposed 5 as the best number of clusters
* 9 proposed 6 as the best number of clusters
***** Conclusion *****
* According to the majority rule, the best number of clusters is 2

Figura 7.24. Evidențierea numărului optim de clustere


unde method - reprezintă metoda de analiză, care poate fi single, complete,
average, kmeans, ward.D, ward.D2 și altele.
Ca urmare, avem:
library("factoextra")
fviz_nbclust(numar_clustere)

Figura 7.25. Evidențierea numărului optim de clustere, ca fiind 2


Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 33

Deși surprinzător, alegerea numărului optim de clustere rămâne încă o


problemă pe cât de incitantă, pe atât de spinoasă.

7.4.4. Extragerea rezultatelor

Pentru început, se va porni de la o sinteză R a celor spuse anterior și anume:


# Metoda cotului
set.seed(2020)
fviz_nbclust(productia_scalata,kmeans, method="wss",k.max=8)
+
geom_vline(xintercept = 4, linetype = 2)+
labs(subtitle = "Metoda cotului")

Figura 7.26. Evidențierea numărului optim de clustere, prin metoda


cotului, utilizând funcția fviz_nbclust()
# Metoda Silhouette
fviz_nbclust(productia_scalata,kmeans,method="silhouette",k.m
ax=8)+
labs(subtitle = "Metoda Silhouette")

Figura 7.27. Evidențierea numărului optim de clustere, prin metoda


siluetei medii, utilizând funcția fviz_nbclust()

 
34 Analiza datelor în mediul R - teorie şi aplicaţii

# Metoda statisticii gap 


# nboot = 400 pentru a păstra viteza funcției
fviz_nbclust(productia_scalata, kmeans, method = "gap_stat",
k.max=8, nstart = 30, nboot = 400)+
labs(subtitle = "Metoda statisticii gap")
Clustering k = 1,2,..., K.max (= 8): .. done
Bootstrapping, b = 1,2,..., B (= 400) [one "." per sample]:
.................................................. 50
.................................................. 100
.................................................. 150
.................................................. 200
.................................................. 250
.................................................. 300
.................................................. 350
.................................................. 400

Figura 7.28. Evidențierea numărului optim de clustere, prin metoda


statisticii gap, utilizând funcția fviz_gap_stat()

Majoritatea acestor abordări sugerează că numărul optim de clustere este


între 4 și 7 și deci se poate efectua analiza finală și extrage rezultatele folosind 6
clustere, astfel:
# Calculul k-means clustering pentru k = 6
set.seed(2020)
rezultatul_final <- kmeans(productia_scalata, 6, nstart = 30)
print(rezultatul_final)
K-means clustering with 6 clusters of sizes 1, 2, 2, 2, 2, 1
Cluster means:
munca capital pamant productie
1 0.20 0.3809524 0.58333333 0.43333333
2 0.85 0.0952381 0.33333333 0.66666667
3 0.85 0.6666667 0.91666667 0.80833333
4 0.55 0.5714286 0.08333333 0.41666667
5 0.30 0.9761905 0.41666667 0.08333333
6 0.00 0.2380952 0.08333333 0.00000000
Clustering vector:
1 2 3 4 5 6 7 8 9 10
4 2 5 6 1 2 4 3 3 5
Within cluster sum of squares by cluster:
[1] 0.00000000 0.02314059 0.24573980 0.05091837 0.04891156 0.00000000
(between_SS / total_SS = 90.5 %)
Available components:
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 35

[1] "cluster" "centers" "totss" "withinss"


"tot.withinss"
[6] "betweenss" "size" "iter" "ifault"
De asemenea, se pot vizualiza rezultatele folosind funcția fviz_cluster(),
astfel:
fviz_cluster(rezultatul_final, data = productia_scalata)

Figura 7.29. Evidențierea numărului optim de clustere, prin metoda


statisticii gap, utilizând funcția fviz_cluster()

În final, se pot extrage clusterele și se pot adăuga la datele inițiale pentru a


face câteva statistici descriptive la nivel de cluster, astfel:
productia %>%
mutate(Cluster = rezultatul_final$cluster) %>%
group_by(Cluster) %>%
summarise_all("mean")
# A tibble: 6 x 5
Cluster munca capital pamant productie
<int> <dbl> <dbl> <dbl> <dbl>
1 1 40 18 15 460
2 2 105 12 12 600
3 3 105 24 19 685
4 4 75 22 9 450
5 5 50 30.5 13 250
6 6 20 15 9 200

7.5. Determinarea numărului optim de clustere în cazul metodelor de grupare


ierarhică (Hierarchical Clustering Algorithms)

Așa cum s-a constatat la subpunctul anterior, determinarea numărului de


clustere în cazul metodei de grupare ierarhică, este similară cu cea abordată în
cazul metodei k-mean clustering, unde analistul specifică numărul de clustere de
utilizat(fie în avans, în cazul metodei k-mean clustering, fie pe parcursul efectuării
analizei, în cazul metodei de grupare ierarhică), care, de regulă, ar dori să fie chiar

 
36 Analiza datelor în mediul R - teorie şi aplicaţii

numărul optim de clustere. Ca urmare, cele mai populare trei metode pentru
determinarea numărului optim de clustere și aici sunt, de asemenea: metoda
cotului, metoda siluetei medii și respectiv metoda statisticii gap.

7.5.1. Metoda cotului

Pentru a aplica metoda cotului în cazul metodei de grupare ierarhică, la


procedura aplicată în cazul metodei k-mean clustering, în R trebuie doar să se
schimbe al doilea argument de la nivelul funcției fviz_nbclust, în FUN =
hcut, astfel:
set.seed(2020)
fviz_nbclust(productia_scalata,FUN=hcut,method="wss",k.max=8)

Figura 7.30. Evidențierea numărului optim de clustere, prin metoda


cotului, utilizând funcția fviz_nbclust()

Rezultatele sugerează că 7 este numărul optim de clustere.

7.5.2. Metoda siluetei medii

Pentru a aplica metoda siluetei medii, se va urma un proces similar celui de


la metoda k-mean clustering, astfel:
set.seed(2020)
fviz_nbclust(productia_scalata,FUN=hcut,method="silhouette",k
.max=8)
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 37

Figura 7.31. Evidențierea numărului optim de clustere, prin metoda


siluetei medii, utilizând funcția fviz_nbclust()

Rezultatele arată în acest caz, că 5 clustere maximizează valorile medie ale


siluetei.

7.5.3. Metoda statisticii gap

Pentru a determina numărul optim de clustere cu metoda statisticii gap, se


procedează similar ca în cazul metodei k-mean clustering, cu adaptările de rigoare,
astfel:
set.seed(2020)
gap_statistic<-clusGap(productia_scalata,FUN = hcut, nstart =
30,K.max = 8, B = 20)
Clustering k = 1,2,..., K.max (= 8): .. done
Bootstrapping, b = 1,2,..., B (= 20) [one "." per sample]:
.................... 20
fviz_gap_stat(gap_statistic)

Figura 7.32. Evidențierea numărului optim de clustere, prin metoda


statisticii gap, utilizând funcția fviz_gap_stat()

 
38 Analiza datelor în mediul R - teorie şi aplicaţii

Rezultatele arată că 1 cluster (ceea ce pare ușor de neacceptat) sau că 7


clustere (ceea ce pare mult mai firesc) este numărul optim pentru seria de date pe
care s-a lucrat.

7.6. Alegerea celui mai bun dintre algoritmii de clustering

Alegerea celei mai bune metode de clustering pentru seriile de date pe care
le deținem, poate reprezenta o adevprată piatră de încercare pentru analiști. Totuși,
acest aspect poate fi abordat folosind pachetul clValid, care poate fi utilizat
pentru a compara simultan mai mulți algoritmi de clustering pentru identificarea
celei mai bune abordări de clustering și a numărului optim de clustere.
Pachetul clValid compară algoritmii de clustering folosind două măsuri
de validare a clusterelor și anume:
- o măsură internă, care utilizează informații intrinseci din date,
precum conectivitatea, coeficientul de siluetă și indicele Dunn,
pentru a evalua calitatea grupării;
- o măsură de stabilitate, o variantă specială a măsurii interne, care
evaluează consistența unui rezultat de clustering, comparând-o cu
rezultatele obținute după eliminarea fiecărei coloane în parte.
Ca măsuri de stabilitate a clusterului avem:
- proporția medie de non-suprapunere (APN);
- distanța medie (AD);
- distanța medie între mijloace (ADM);
- valoarea de merit (FOM).
Observație: APN, AD și ADM se bazează pe tabelul de clasificare încrucișată a
grupării originale pentru setul complet de date, în cazul clusteringului bazat pe
eliminarea câte unei coloane.
APN măsoară proporția medie de observații care nu sunt plasate în același
cluster, prin clustering pe baza datelor complete și clustering pe baza datelor cu o
singură coloană eliminată.
AD măsoară distanța medie între observațiile plasate în același grup, în
ambele cazuri (set complet de date și respectiv set cu eliminarea unei coloane).
ADM măsoară distanța medie între centrele de clustere, pentru observațiile
plasate în același cluster în ambele cazuri.
FOM măsoară media varianței intracluster corespunzătoare coloanei
șterse, unde gruparea se bazează pe coloanele rămase.
APN, ADM și FOM iau valori ce variază de la 0 la 1, o valoare mai mică
corespunzând la rezultate de clustering mai consistente. AD ia valori între 0 și
infinit, fiind de asemenea preferate valorile cât mai mici.
Pentru a realiza scopul propus în R, se va folosi funcția clValid(), cu
formatul său specific, adică:
# Se calculează clValid, ca măsură internă
metode_clustering <- c("hierarchical","kmeans","pam")
masuri_interne <- clValid(productia_scalata, nClust = 2:8,
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 39

clMethods = metode_clustering, validation = "internal",


maxitems=600,metric="euclidean",method="average")
# Summary
summary(masuri_interne)
Clustering Methods:
hierarchical kmeans pam
Cluster sizes:
2 3 4 5 6 7 8
Validation Measures:
2 3 4 5 6 7 8
hierarchical Connectivity NA NA NA NA NA NA NA
Dunn 0.5557 0.7036 0.7036 0.6662 0.6662 1.5045 1.0203
Silhouette 0.3125 0.3248 0.2703 0.3282 0.3027 0.3382 0.2281
kmeans Connectivity NA NA NA NA NA NA NA
Dunn 0.5557 0.7036 0.6630 0.6802 0.6802 1.5045 1.0203
Silhouette 0.3125 0.3248 0.2879 0.3693 0.3459 0.3382 0.2281
pam Connectivity NA NA NA NA NA NA NA
Dunn 0.2174 0.5091 0.5777 0.6279 0.6662 1.5045 1.0203
Silhouette 0.2157 0.2558 0.2533 0.2429 0.3027 0.3382 0.2281
Error in which(x == min(x, na.rm = TRUE), arr.ind = TRUE)[1, ] :
subscript out of bounds
In addition: Warning messages:
1: In FUN(array(newX[, i], d.call, dn.call), ...) :
no non-missing arguments to min; returning Inf
2: In min(x, na.rm = TRUE) :
no non-missing arguments to min; returning Inf
sau varianta pentru stability:
# Calculează clValid, măsura de stabilitate
metode_clustering <- c("hierarchical","kmeans","pam")
masuri_stabilitate <- clValid(productia_scalata, nClust =
2:8,clMethods = metode_clustering, validation = "stability",
maxitems=500,metric="euclidean", method="average")
# Summary
summary(masuri_stabilitate)
Clustering Methods:
hierarchical kmeans pam
Cluster sizes:
2 3 4 5 6 7 8
Validation Measures:
2 3 4 5 6 7 8
hierarchical APN 0.1875 0.2000 0.2650 0.2000 0.1000 0.0000 0.0250
AD 0.6848 0.5370 0.4516 0.3613 0.2047 0.0847 0.0608
ADM 0.3141 0.2401 0.2542 0.2469 0.0993 0.0000 0.0158
FOM 0.3154 0.2993 0.3030 0.2803 0.2339 0.1010 0.1033
kmeans APN 0.1375 0.2667 0.2625 0.2000 0.0750 0.0000 0.0250
AD 0.6499 0.5527 0.4626 0.3764 0.2084 0.0847 0.0608
ADM 0.2280 0.2817 0.2739 0.2831 0.1030 0.0000 0.0158
FOM 0.3116 0.3095 0.3141 0.2874 0.2339 0.1010 0.1033
pam APN 0.2458 0.2458 0.2542 0.2000 0.1333 0.0000 0.0250
AD 0.6794 0.5661 0.4614 0.3623 0.2321 0.0847 0.0608
ADM 0.2577 0.2835 0.2761 0.2284 0.1410 0.0000 0.0158
FOM 0.3153 0.3061 0.3141 0.2958 0.2746 0.1010 0.1033
Optimal Scores:
Score Method Clusters
APN 0.0000 hierarchical 7
AD 0.0608 hierarchical 8
ADM 0.0000 hierarchical 7
FOM 0.1010 hierarchical 7
sau similar, dar cu afișarea numai a scorului optim:

 
40 Analiza datelor în mediul R - teorie şi aplicaţii

# Măsuri de stabilitate
metode_clustering <- c("hierarchical","kmeans","pam")
masuri_stabilitate <- clValid(productia_scalata, nClust =
2:8, clMethods = metode_clustering,validation = "stability",
maxitems=500,metric="euclidean", method="average")
# Se afișează numai scorul optim
optimalScores(masuri_stabilitate)
Score Method Clusters
APN 0.00000000 hierarchical 7
AD 0.06076772 hierarchical 8
ADM 0.00000000 hierarchical 7
FOM 0.10103166 hierarchical 7
Se poate observa că gruparea ierarhică cu 7 clustere are cele mai bune
rezultate în fiecare caz (adică, pentru măsurile de conectivitate, Dunn și
Silhouette). Indiferent de algoritmul de clustering, folosind cele trei măsuri,
numărul optim de clustere pare a fi 7.

7.7. Analiza cluster Top 50 melodii Spotify - 2019

7.7.1. Analiza explorativă a bazei de date

(„Fără muzică, viața ar fi o greșeală”, Friedrich Nietzsche)


Este fără îndoială că muzica devine un lucru important al oamenilor din
zilele noastre, deoarece aceștia pot accesa muzica peste tot și oricând. Fiind o
platformă de muzică online, Spotify este una dintre platformele de muzică populară
care sunt cele mai utilizate de oamenii din întreaga lume. În fiecare an, spotify
lansează cele mai populare 50 de melodii ale cântărețului, genului etc. În plus, în
această analiză se doreşte gruparea cele 50 de melodii de top ale anului 2019 în mai
multe categorii pentru a vedea tipul melodiei. Datele au fost preluate de pe
https://www.kaggle.com/leonardopena/top50spotify2019.
În continuare, se vor prezenta pe scurt liniile de cod pentru analiza specifică:
# Citirea şi curăţarea datelor
spotify <- read.csv("top50.csv")
# Privire de ansamblu asupra structurii datelor
nrow(spotify)
[1] 50
str(spotify)
'data.frame': 50 obs. of 14 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ Track.Name : chr "Señorita" "China" "boyfriend (with Social House)"
"Beautiful People (feat. Khalid)" ...
$ Artist.Name : chr "Shawn Mendes" "Anuel AA" "Ariana Grande" "Ed
Sheeran" ...
$ Genre : chr "canadian pop" "reggaeton flow" "dance pop" "pop"
...
$ Beats.Per.Minute: int 117 105 190 93 150 102 180 111 136 135 ...
$ Energy : int 55 81 80 65 65 68 64 68 62 43 ...
$ Danceability : int 76 79 40 64 58 80 75 48 88 70 ...
$ Loudness..dB.. : int -6 -4 -4 -8 -4 -5 -6 -5 -6 -11 ...
$ Liveness : int 8 8 16 8 11 9 7 8 11 10 ...
$ Valence. : int 75 61 70 55 18 84 23 35 64 56 ...
$ Length. : int 191 302 186 198 175 220 131 202 157 194 ...
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 41

$ Acousticness.. : int 4 8 12 12 45 9 2 15 5 33 ...


$ Speechiness. : int 3 9 46 19 7 4 29 9 10 38 ...
$ Popularity : int 79 92 85 86 94 84 92 90 87 95 ...
# Descrierea variabilelor
# Track.Name: Numele piesei (titlul melodiei)
# Artis.Name: Numele artistului (cântărețului)
# Genre: genul piesei
# Beats.Per.Minute: tempo-ul melodiei
# Energy: energia cântecului - cu cât valoarea este mai mare, cu atât
# cântecul este mai energic
# Danceability: Cu cât valoarea este mai mare, cu atât este mai ușor să
# dansezi la acest cântec
# Loudness..dB..: Cu cât valoarea este mai mare, cu atât cântecul este mai
# puternic
# Liveness: Cu cât este mai mare valoarea, cu atât este mai probabil ca
# melodia să fie o înregistrare live
# Valence. : Cu cât valoarea este mai mare, cu atât starea de spirit este
# mai pozitivă pentru melodie
# Length. : Durata melodiei
# Acousticness..: Cu cât valoarea este mai mare, cu atât este mai acustică
# melodia
# Speechiness. : Cu cât este mai mare valoarea, cu atât conține mai mult
# cuvântul rostit
# Popularity: cu cât valoarea este mai mare, cu atât melodia este mai
# populară
Există o variabilă X care nu a fost utilizată în această analiză, așa că trebuie
să o eliminăm mai întâi folosind biblioteca tidyverse. Din fericire, datele noastre
sunt deja în formatul adecvat, deci nu trebuie să convertim niciun formular de date.
library(tidyverse)
spotify <- spotify %>%
select(-X)
# Se verifică dacă lipsește o valoare din matricea
observațiilor
colSums (is.na(spotify))
Track.Name Artist.Name Genre Beats.Per.Minute
0 0 0 0
Energy Danceability Loudness..dB.. Liveness
0 0 0 0
Valence. Length. Acousticness.. Speechiness.
0 0 0 0
Popularity
0
# Analiza exploratorie a bazei de date - determinarea top 10
melodii pe Spotify în 2019
# pentru grafice interactive
install.packages("plotly", dependencies = TRUE)
library(plotly)
# pentru texte atrăgătoare
install.packages("glue", dependencies = TRUE)
library(glue)
top10_song <- spotify %>%
arrange(desc(Popularity)) %>%
head(10) %>%
select(c(Track.Name, Artist.Name, Genre, Popularity,
Length.)) %>%
mutate(mean_length = mean(Length.),

 
42 Analiza datelor în mediul R - teorie şi aplicaţii

text = glue(
"Artist = {Artist.Name}
Genre = {Genre}"
))

plot_top10_song <- ggplot(data = top10_song, aes(x =


reorder(Track.Name, Popularity),
y =
Popularity,
text = text,
label =
Popularity))+
geom_col(aes(fill = Popularity), show.legend = F)+
theme_bw()+
coord_flip()+
theme(axis.text = element_text(size = 12),
axis.title = element_text(size = 12, colour =
"black"),
title = element_text(size = 12, colour = "black"))+
geom_text(aes(label = Popularity), color = "white", size =
6, fontface = "bold", position = position_stack(0.8))+
labs(title = "Top 10 Song on Spotify in 2019",
x = "Song Title",
y = "Popularity Rate",
caption = "Source : Kaggle Dataset")
ggplotly(plot_top10_song, tooltip = "text")

Figura 7.33.

Bad Guy cântat de Billie Eilish cu Genre electropop a fost cea mai
populară piesă redată pe spotify în 2019.
#Determinarea top 3 Genre ale melodiilor top Spotify din 2019
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 43

top3_genre <- spotify %>%


group_by(Genre) %>%
summarise(song = n()) %>%
ungroup() %>%
mutate(song = song/50) %>%
arrange(desc(song)) %>%
head(3)
library(ggplot2)
plot_top3_genre <- ggplot(data = top3_genre, aes(x =
reorder(Genre, song),
y = song,
label =
song))+
geom_col(aes(fill = song), show.legend = FALSE)+
theme_bw()+
coord_flip()+
theme(axis.text = element_text(size = 12),
axis.title = element_text(size = 14, colour =
"black"),
title = element_text(size = 14, colour = "black"))+
geom_text(aes(label = scales::percent(song)), color =
"white", size = 12, fontface = "bold", position =
position_stack(0.7))+
labs(title = "Top 3 Genre of Spotify Most Popular Song
2019",
x = "Genre of Music",
y = "Rate of Genre",
caption = "Source : Kaggle Dataset")
plot_top3_genre

Figura 7.34.

Pe baza graficului de mai sus, știm că 40% din melodiile populare


spotify în 2019 sunt dominate de 3 categorii de gen, în care cel mai popular gen
este Dance Pop (16%), urmat de Pop (14%) și Latin (10%). În timp ce cealaltă
categorie este egală sau mai mică de 4%.
Acest lucru este interesant, deoarece cea mai populară piesă din 2019 are
genul electropop.

 
44 Analiza datelor în mediul R - teorie şi aplicaţii

7.7.2. Selectarea variabilelor

Pe baza afacerii mele, deselectăm mai multe variabile care probabil nu sunt
potrivite pentru această analiză, variabile care nu sunt în format numeric care nu
sunt legate de această clasificare.
spotify_ppt <- spotify %>%
select_if(is.numeric) %>%
# această variabilă nu va fi utilizată, deoarece nu este
# corelată de această clasificare
select(-Popularity)
glimpse(spotify_ppt)
Rows: 50
Columns: 9
$ Beats.Per.Minute <int> 117, 105, 190, 93, 150, 102, 180, 111, 136, 135, 1...
$ Energy <int> 55, 81, 80, 65, 65, 68, 64, 68, 62, 43, 62, 71, 41...
$ Danceability <int> 76, 79, 40, 64, 58, 80, 75, 48, 88, 70, 61, 82, 50...
$ Loudness..dB.. <int> -6, -4, -4, -8, -4, -5, -6, -5, -6, -11, -5, -4, -...
$ Liveness <int> 8, 8, 16, 8, 11, 9, 7, 8, 11, 10, 24, 15, 11, 6, 1...
$ Valence. <int> 75, 61, 70, 55, 18, 84, 23, 35, 64, 56, 24, 38, 45...
$ Length. <int> 191, 302, 186, 198, 175, 220, 131, 202, 157, 194, ...
$ Acousticness.. <int> 4, 8, 12, 12, 45, 9, 2, 15, 5, 33, 60, 28, 75, 7, ...
$ Speechiness. <int> 3, 9, 46, 19, 7, 4, 29, 9, 10, 38, 31, 7, 3, 20, 5...
# Prelucrarea datelor
# Scalarea datelor pentru a obține un PCA util
spotify_scale <- scale(spotify_ppt, center = T, scale = T)
head(spotify_scale)
Beats.Per.Minute Energy Danceability Loudness..dB.. Liveness
[1,] -0.09903428 -0.63659748 0.3872629 -0.1653336 -0.5990121
[2,] -0.48740401 1.19028271 0.6387323 0.8072170 -0.5990121
[3,] 2.26354823 1.12001809 -2.6303701 0.8072170 0.1205220
[4,] -0.87577374 0.06604875 -0.6186148 -1.1378842 -0.5990121
[5,] 0.96898247 0.06604875 -1.1215536 0.8072170 -0.3291868
[6,] -0.58449644 0.27684261 0.7225555 0.3209417 -0.5090703
Valence. Length. Acousticness.. Speechiness.
[1,] 0.91332281 -0.25444591 -0.9560132 -0.8493409
[2,] 0.28653265 2.58124648 -0.7454376 -0.3117834
[3,] 0.68946918 -0.38217980 -0.5348620 3.0031548
[4,] 0.01790829 -0.07561846 -0.5348620 0.5841459
[5,] -1.63860857 -0.66319437 1.2023867 -0.4909692
[6,] 1.31625934 0.48641066 -0.6927937 -0.7597480

7.7.3. K-means clustering

Clusterizarea datelor este o tehnică obișnuită de extragere a datelor pentru


a crea grupuri de date care pot fi identificate ca „date cu unele caracteristici”.

Alegerea Optimum K

Următorul pas în construirea unui cluster K-means este găsirea numărului


optim de cluster pentru modelarea datelor, utilizând funcția kmeansTunning().
RNGkind(sample.kind = "Rounding")
kmeansTunning <- function(data, maxK){
withinall <- NULL
total_k <- NULL
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 45

for (i in 2: maxK){
set.seed(101)
temp <- kmeans(data,i)$tot.withinss
withinall <- append(withinall, temp)
total_k <- append(total_k,i)
}
plot(x = total_k, y = withinall, type = "o", xlab = "Number
of Cluster", ylab = "Total Within")
}
kmeansTunning(spotify_scale, maxK = 7)

Figura 7.35.

Pe baza graficului cotului generat mai sus, numărul optim de cluster este 6.
K-means este un algoritm de grupare care grupează datele pe baza distanței.
Clusterele rezultate sunt declarate a fi optime dacă distanța dintre datele din același
cluster este mică și distanța dintre datele din diferite clustere este mare.

Construirea clusterelor

Odată găsit K-ul optim, se construiesc K-clustere și se stochează ca


spotify_cluster. Totodată, se tilizează set.seed(2020) pentru a
garanta un exemplu reproductibil. Se extrag informații cluster din obiectul K-
means rezultat folosind spotify_cluster$cluster și se adăugă ca o nouă
coloană denumită cluster în setul de date de coffee.
set.seed(2020)
spotify_cluster <- kmeans(spotify_ppt, 6)
spotify_ppt$cluster <- spotify_cluster$cluster
spotify_ppt$cluster <- as.factor(spotify_ppt$cluster)
[1] 1 4 2 6 2 3 5 6 1 2 2 6 6 4 6 6 2 1 1 2 1 5 4 3 2 1 6 6 1 3 6 2 1 6 6 1 2 1
[39] 1 6 6 1 6 2 1 6 2 3 6 6
Levels: 1 2 3 4 5 6

7.7.4. Analiza în componente principale

Analiza în componente principale (PCA) este o procedură statistică care

 
46 Analiza datelor în mediul R - teorie şi aplicaţii

utilizează o transformare ortogonală pentru a converti un set de observații


ale variabilelor posibil corelate (ale căror entități iau diferite valori numerice) într-
un set de valori ale variabilelor liniar necorelate numite componente principale.
Această transformare este definită în așa fel încât prima componentă
principală să aibă varianța cea mai mare posibilă (adică să reprezinte cât mai multă
variabilitate în date posibil) și fiecare componentă următoare are la rândul ei cea
mai mare varianță posibilă sub restricţia că este ortogonală față de componentele
precedente. Vectorii rezultați (fiecare fiind o combinație liniară a variabilelor și
conținând n observații) sunt un set de baze ortogonale necorelate. PCA este sensibil
la scalarea relativă a variabilelor originale.

Construirea componentelor principale

Am pregătit datele la scară pentru a fi utilizate pentru PCA. Apoi, vom


încerca să generăm componenta principală din spotify_ppt. Reamintim cum
folosim FactoMiner library pentru a efectua PCA. Utilizați funcția PCA()
din bibliotecă pentru a genera un PCA și a-l stoca ca pca_spotify.
# pentru PCA
install.packages("FactoMineR", dependencies = TRUE)
library(FactoMineR)
pca_spotify <- PCA(spotify_ppt, quali.sup =10, graph = F,
scale.unit = T)
# grafic
plot.PCA(pca_spotify, choix = "ind", label = "none",
habillage = 10)

Figura 7.36.

# Se verifică rezumatul pca_spotify


Call:
PCA(X = spotify_ppt, scale.unit = T, quali.sup = 10, graph = F)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 47

Variance 2.252 1.578 1.273 1.015 0.898 0.732 0.692


% of var. 25.020 17.532 14.144 11.282 9.982 8.139 7.691
Cumulative % of var. 25.020 42.553 56.697 67.979 77.961 86.100 93.791
Dim.8 Dim.9
Variance 0.335 0.224
% of var. 3.723 2.486
Cumulative % of var. 97.514 100.000
Individuals (the 10 first)
Dist Dim.1 ctr cos2 Dim.2 ctr cos2
1 | 1.886 | 0.154 0.021 0.007 | -0.310 0.122 0.027 |
2 | 3.269 | 2.085 3.860 0.407 | 0.189 0.045 0.003 |
3 | 4.937 | -0.002 0.000 0.000 | 4.103 21.336 0.691 |
4 | 1.874 | -0.689 0.422 0.135 | -0.050 0.003 0.001 |
5 | 2.816 | -0.725 0.467 0.066 | 0.039 0.002 0.000 |
6 | 2.102 | 1.293 1.485 0.378 | -0.314 0.125 0.022 |
7 | 3.624 | -1.589 2.242 0.192 | 2.276 6.565 0.394 |
8 | 2.364 | -0.052 0.002 0.000 | -0.098 0.012 0.002 |
9 | 2.182 | -0.066 0.004 0.001 | 0.394 0.196 0.033 |
10 | 3.905 | -3.226 9.242 0.682 | 1.025 1.333 0.069 |
Dim.3 ctr cos2
1 -1.322 2.745 0.491 |
2 -0.135 0.028 0.002 |
3 2.071 6.738 0.176 |
4 -0.159 0.040 0.007 |
5 1.284 2.589 0.208 |
6 -1.315 2.718 0.392 |
7 -0.457 0.329 0.016 |
8 1.211 2.303 0.262 |
9 -1.789 5.031 0.672 |
10 -0.063 0.006 0.000 |
Variables
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
Beats.Per.Minute | -0.231 2.375 0.053 | 0.840 44.735 0.706 | 0.082 0.522
Energy | 0.845 31.691 0.714 | 0.339 7.303 0.115 | -0.002 0.000
Danceability | 0.126 0.710 0.016 | -0.084 0.451 0.007 | -0.737 42.615
Loudness..dB.. | 0.813 29.325 0.660 | 0.115 0.842 0.013 | 0.151 1.792
Liveness | 0.371 6.127 0.138 | -0.238 3.597 0.057 | 0.578 26.252
Valence. | 0.502 11.180 0.252 | 0.212 2.860 0.045 | -0.406 12.962
Length. | 0.359 5.718 0.129 | 0.009 0.006 0.000 | 0.355 9.896
Acousticness.. | -0.362 5.832 0.131 | -0.277 4.868 0.077 | 0.211 3.505
Speechiness. | -0.398 7.042 0.159 | 0.747 35.339 0.558 | 0.177 2.456
cos2
Beats.Per.Minute 0.007 |
Energy 0.000 |
Danceability 0.542 |
Loudness..dB.. 0.023 |
Liveness 0.334 |
Valence. 0.165 |
Length. 0.126 |
Acousticness.. 0.045 |
Speechiness. 0.031 |
Supplementary categories
Dist Dim.1 cos2 v.test Dim.2 cos2 v.test
cluster_1 | 1.343 | 0.394 0.086 1.088 | -0.086 0.004 -0.283 |
cluster_2 | 1.928 | -1.252 0.422 -3.102 | 1.347 0.489 3.988 |
cluster_3 | 2.310 | 2.042 0.782 2.809 | -0.308 0.018 -0.506 |
cluster_4 | 3.224 | 2.047 0.403 2.412 | 0.802 0.062 1.129 |
cluster_5 | 2.790 | -1.398 0.251 -1.331 | 1.256 0.203 1.429 |
cluster_6 | 1.241 | -0.168 0.018 -0.562 | -1.023 0.680 -4.092 |
Dim.3 cos2 v.test
cluster_1 -1.082 0.649 -3.980 |
cluster_2 0.410 0.045 1.350 |
cluster_3 0.210 0.008 0.384 |

 
48 Analiza datelor în mediul R - teorie şi aplicaţii

cluster_4 -0.012 0.000 -0.018 |


cluster_5 -0.491 0.031 -0.622 |
cluster_6 0.573 0.213 2.551 |
Pe baza rezumatului, presupunând că dacă tolerăm doar nu mai mult de
20% din pierderea informațională, vor exista 6 componente principale (PC-uri) pe
care le-am folosi în această analiză.
O altă implementare excelentă a PCA este vizualizarea datelor de înaltă
dimensiune într-un grafic bidimensional în diferite scopuri, cum ar fi analiza
clusterelor sau detectarea oricăror valori aberante. Pentru a vizualiza PCA, se
utilizează funcția plot.PCA() din pca_spotify. Aceasta va genera un grafic
PCA individual.
plot.PCA(pca_spotify)

Figura 7.37.

Nu există outlieri în setul de date. De asemenea, putem crea un grafic PCA


varaibil care să afișeze informațiile de încărcare variabilă ale PCA, adăugând pur și
simplu choix = "var" în plot.PCA(). Informațiile de încărcare vor fi
reprezentate de lungimea săgeții din centrul coordonatelor. Cu cât săgeata este mai
lungă, cu atât sunt mai mari informațiile de încărcare ale acelor variabile. Cu toate
acestea, este posibil să nu fie o metodă eficientă dacă avem multe caracteristici.
Unele variabile s-ar putea suprapune între ele, făcând astfel imposibil să se
vadă numele variabilelor.
O modalitate alternativă de a extrage informațiile de încărcare este folosind
funcția dimdesc() din pca_spotify. Se stochează rezultatul ca
pca_dimdesc. Inspectați informațiile de încărcare din prima dimensiune/PC
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 49

apelând pca_dimdesc$Dim.1, deoarece prima dimensiune este cea care deține


cele mai multe informații.
pca_dimdesc <- dimdesc(pca_spotify)
pca_dimdesc$Dim.1
$quanti
correlation p.value
Energy 0.8447698 1.244339e-14
Loudness..dB.. 0.8126227 7.751612e-13
Valence. 0.5017403 2.055450e-04
Liveness 0.3714510 7.910044e-03
Length. 0.3588254 1.049896e-02
Acousticness.. -0.3623999 9.700876e-03
Speechiness. -0.3982108 4.182600e-03

$quali
R2 p.value
cluster 0.469864 2.523101e-05

$category
Estimate p.value
cluster=cluster_3 1.764689 0.003875064
cluster=cluster_4 1.769540 0.014255483
cluster=cluster_2 -1.529642 0.001266621

attr(,"class")
[1] "condes" "list "
Energy şi Loudness sunt cele două variabile care contribuie cel maim
ult la PC 1. Este foarte logic ca 16% din totalul melodiilor Top Spotify 2019 să
aibă genul Dance Pop.

7.7.5. Combinarea PCA cu K-Means

plot.PCA (pca_spotify, choix = "var", col.ind = spotify_ppt $


cluster)

Figura 7.38.

 
50 Analiza datelor în mediul R - teorie şi aplicaţii

library(factoextra)
fviz_cluster(spotify_cluster,
data = spotify_ppt[,-10])+
theme_minimal()

Figura 7.39.

Din acest test putem măsura cât de bun este modelul de clustering construit
cu 3 valori:
- suma de pătrate Wihtin (withinss): distanța fiecărei observații până la
centroid pentru fiecare cluster.
- suma sumei de pătrate (totss): distanța fiecărei observații la media
eșantionului global (media datelor globale)
- suma de pătrate inter(între): distanța centroidă a fiecărui cluster până la
media eșantionului global.
spotify_cluster$withinss
[1] 19748.308 25550.545 4186.000 4674.667 1548.500 28079.176
spotify_cluster$totss
[1] 193401.6
spotify_cluster$betweenss
[1] 109614.4
spotify_cluster$betweenss/spotify_cluster$totss
[1] 0.5667708
Pe baza valorii de mai sus, putem vedea că modelul nostru este destul de
bun în gruparea melodiei de top Spotify 2019.
Capitolul 7. Analiza cluster și algoritmi de clustering, în mediul R 51

Rezumarea clusterelor

spotify_ppt %>%
group_by(cluster) %>%
summarise_all("mean")
# A tibble: 6 x 10
cluster Beats.Per.Minute Energy Danceability Loudness..dB.. Liveness Valence.
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 115. 67.8 76.9 -5.54 11.4 71.5
2 2 159. 58.1 68.5 -6.64 11.8 48.2
3 3 96.8 76 73.2 -4 26.5 81.2
4 4 124. 79.7 77.7 -3.33 7.67 65
5 5 167 61.5 72.5 -6 9.5 35.5
6 6 97.8 59.8 67.4 -5.88 18.1 39.9
# ... with 3 more variables: Length. <dbl>, Acousticness.. <dbl>,
# Speechiness. <dbl>
Din vizualizarea graficului, știm că datele au fost grupate în 6 clustere cu
caracteristicile lor distincte. Există 6 grupuri mari de cântece populare pe care
oamenii le aud prin spotify în 2019.
Se constată astfel că, clusterul 1 are ritmuri mari pe minut și dansabilitate.
Așadar, putem spune că clusterul 1 care conține cele mai mari date ale grupării
noastre, este format din melodii optimiste și dansabile cu o durată medie de muzică
de 167 secunde (sub trei minute), care are lungimea cea mai mică comparativ cu
alte clustere.

 
Capitolul 8
Învăţarea supervizată.
Algoritmi de clasificare a datelor, în mediul R
Prof. dr. Stelian STANCU

8.1. Introducere

Algoritmii de clasificare ar putea fi clasificați în general în următoarele:


- clasificatori lineari:
o regresia logistică;
o clasificatorul Naive Bayes;
o discriminantul liniar al lui Fisher;
o SVM-Suport vectori maşină;
 cele mai mici pătrate SVM
- clasificatori cuadratici;
- estimarea nucleului:
o k-cel mai apropiat vecin;
- arborii de decizie:
o random forest;
- rețele neuronale;
- cuantificarea vectorului de învățare.

8.2. Regresia logistică

8.2.1. Regresia logistică binomială

Dacă modelul de regresie liniară y = ax + b, presupune că variabila de


răspuns y este cantitativă, în multe situații, variabila de răspuns este calitativă sau,
cu alte cuvinte, categorială, ca spre exemplu, genul, religia, naţionalitatea etc.
Predicarea unui răspuns calitativ pentru o observație poate fi denumită
clasificarea observației respective, deoarece implică atribuirea observației unei
categorii sau clase. Pe de altă parte, metodele care sunt adesea utilizate pentru
clasificare prezic mai întâi probabilitatea fiecăreia dintre categoriile unei variabile
calitative, ca bază pentru realizarea clasificării.
Regresia liniară nu este capabilă să prezică probabilitatea. Ca urmare,
regresia logistică este o clasificare și nu un algoritm de regresie. Se estimează
valori discrete (valori binare precum 0/1, da/nu, adevărat/fals) pe baza unui set dat
de variabile independente. Pur și simplu, prevede în principiu probabilitatea
apariției unui eveniment prin adaptarea datelor la o funcție logit. Prin urmare, este
cunoscută și sub numele de regresie logit. Valorile obținute vor fi întotdeauna
cuprinse între 0 și 1, deoarece prezice probabilitatea.
2 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 8.1.

Regresia logistică este o instanță a tehnicii de clasificare ce se poate utiliza


pentru a prezice un răspuns calitativ, în sensul că modelează probabilitatea ca o
variabilă categorială să ia una dintre valorile posibil, adică să aparțină unei anumite
categorii, estimând astfel probabilitatea ca variabilă categorială analizată să
aparțină unei anumite categorii.
Spre exemplu, probabilitatea ca variabila categorială genul să se asocieze
cu părul lung poate fi scrisă ca:
Pr (gen = femeie | păr lung)
Valorile lui Pr (gen = femeie | păr lung) (prescurtat ca P(păr lung)) vor varia între 0
și 1. Astfel, pentru orice valoare dată a părului lung, se poate face o predicție
pentru gen.
Fiind dată variabila explicativă X și Y ca variabilă dependentă, problema
care se pune este cum ar trebui să fie modelată relația dintre P(X) = Pr (Y = 1 | X)
și X? Modelul de regresie liniară prezintă aceste probabilități ca:

P(X) = β0 + β1X

Problema la nivelul acestei abordări este că, de fiecare dată când o linie
dreaptă se potrivește cu un răspuns binar care este codat ca 0 sau 1, în principiu,
putem prezice întotdeauna P(X) < 0 pentru unele valori ale lui X și P(X) > 1 pentru
altele. Pentru a evita această situaţie, se poate utiliza funcția logistică pentru a
modela P(X) care oferă ieșiri între 0 și 1 pentru toate valorile lui X:

P(X) = exp(β0 + β1X)/[1+ exp(β0 + β1X)]

Funcția logistică va produce întotdeauna o curbă în formă de S, deci,


indiferent de valoarea lui X, vom obține o predicție sensibilă.
Ecuația de mai sus poate fi, de asemenea, reformulată ca:

P(X)/[1 − P(X)] = exp(β0 + β1X)


Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 3

unde membrul stâng al ultimei egalităţi, P(X)/[1 − P(X)], reprezintă raportul


cotelor și poate lua orice valoare între 0 și ∞. Valorile raportului de cote, apropiate
de 0 și ∞ indică probabilități foarte scăzute și respectiv foarte mari ale lui P(X).
Luând logaritmul ambelor părți din ecuația de mai sus, se obține:

log[P(X)/(1 − P(X))] = β0 + β1X

unde membrul stâng al ultimei egalităţi se numește logit.


Într-un model de regresie logistică, creșterea lui X cu o unitate modifică
logitul cu β0 unităţi, în timp ce cantitatea cu care P(X) se modifică datorită unei
modificări cu o unitate a lui X va depinde de valoarea curentă a lui X. Dar,
indiferent de valoarea lui X, dacă β1 este pozitiv, creșterea X va fi asociată cu
creșterea P(X) , iar dacă β1 este negativ, creșterea lui X va fi asociată cu
descreșterea P(X).
Coeficienții β0 și β1 sunt necunoscuți și trebuie evaluați pe baza datelor de
antrenament disponibile, folosind ca tehnică de optimizare probabilitatea maximă
(maximum likelihood), o tehnică statistică puternică.
Pentru exemplul anterior de clasificare a genului, se caută estimări pentru
β0 și β1, astfel încât conectarea acestor estimări la model, pentru P(X), să dea un
număr apropiat de 1 pentru toți indivizii care sunt de gen feminin și un număr
apropiat de 0 pentru toți indivizii care sunt de gen masculin.
Această intuiție poate fi formalizată folosind o ecuație matematică numită
funcție likelihood (de probabilitate):

L(β0, β1) = P(X) (1 - P(X))

Estimările β0 și β1 sunt alese pentru a maximiza această funcție de


probabilitate. Odată ce coeficienții au fost estimaţi, se poate calcula probabilitatea
de a fi de genfeminin, având în vedere orice caz de a avea păr lung. În general,
probabilitatea maximă(maximum likelihood) este o abordare foarte bună pentru a
analiza modelele neliniare.
Exemplu: Să presupunem că există o sumă la testul de matematică. Poate avea
doar 2 rezultate, nu? Fie îl rezolvi, fie nu (și să nu presupunem puncte pentru
metodă aici). Acum imaginați-vă că vi se oferă o gamă largă de sume în încercarea
de a înțelege ce capitole ați înțeles bine. Rezultatul acestui studiu ar fi ceva de
genul acesta - dacă vi se oferă o problemă bazată pe trigonometrie, aveți 70% șanse
să o rezolvați. Pe de altă parte, dacă este o problemă aritmetică, probabilitatea de a
primi un răspuns este de doar 30%. Aceasta este ceea ce vă oferă Regresia
Logistică.
Dacă ar fi să fac calculele, aș modela șansele jurnalului rezultatului ca o combinație
liniară a variabilelor predictive.
4 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 8.2.

Figura 8.3.

8.2.2. Regresie logistică multinomială

Modelul de regresie logistică multinomială este o extensie simplă a


modelului de regresie logistică binomială, ce poate fi utilizat atunci când variabila
exploratorie are mai mult de două categorii nominale (categoriale şi deci,
neordonate).
În regresia logistică multinomială, variabila exploratorie este codificată
dummy în mai multe variabile 1/0. Există o variabilă pentru toate categoriile, în
afară de una, deci dacă există M categorii, vor exista M – 1 variabile dummy.
Variabila dummy a fiecărei categorii are o valoare de 1 pentru categoria sa și 0
pentru toate celelalte. O categorie, categoria de referință, nu are nevoie de propria
sa variabilă dummy, deoarece este identificată în mod unic prin faptul că toate
celelalte variabile sunt 0.
Regresia logistică mulitnomială estimează astfel un model de regresie
logistică binar separat pentru fiecare dintre acele variabile dummy. Rezultatul este
reprezentat de M − 1 modele de regresie logistică binare. Fiecare model transmite
efectul predictorilor asupra probabilității de succes în acea categorie, în comparație
cu categoria de referință.
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 5

8.2.3. Regresie logistică ordinală

Alături de regresia logistică multinomială, există și regresie logistică


ordinală, care este o altă extensie a regresiei logistice binomiale. Regresia logistică
ordinală este utilizată pentru a prezice variabila dependentă cu categorii multiple
„ordonate” și variabile independente. Cu alte cuvinte, regresie logistică ordinală
este utilizată pentru a facilita interacțiunea variabilelor dependente (având mai
multe niveluri ordonate) cu una sau mai multe variabile independente.
De exemplu, efectuarea unui interviu cu clienții pentru a evalua satisfacția
acestora față de un produs nou lansat pe piaţă, sarcina fiind de a pune o întrebare
respondentului, acesta răspunzând cu satisfăcător sau nesatisfăcător. Pentru a
generaliza răspunsurile, se adăugați niveluri la răspunsurile, cum ar fi Foarte
nesatisfăcător, Nesatisfăcător, Neutru, Satisfăcător, Foarte Satisfăcător. Acest lucru
v-a ajutat la a observa o ordine naturală în categorii.

8.2.4. Regresie logistică în R cu glm

În această secțiune, va fi abordat un exemplu de regresie logistică binară,


cu pachetul ISLR, care vă va oferi setul de date și funcția glm(), care este în
general utilizată pentru a se potrivi liniar generalizat modele, vor fi utilizate pentru
a se potrivi modelului de regresie logistică.
Încărcare date
# Installing Packages  
install.packages("ISLR", dependencies = TRUE)
# Loading package  
library(ISLR)  
Se va lucra cu setul de date Smarket, ce arată rentabilitățile procentuale
zilnice pentru indicele bursier S&P 500 între 2001 și 2005.

Explorarea datelor

Pentru aceasta funcţia names() este utilă pentru a vedea ceea ce este în
cadrul de date, head() este o privire asupra primelor linii, asociată de asemenea
cu funcţia summary().
names(Smarket)
[1] "Year" "Lag1" "Lag2" "Lag3" "Lag4" "Lag5"
[7] "Volume" "Today" "Direction"
head(Smarket)
Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume Today Direction
1 2001 0.381 -0.192 -2.624 -1.055 5.010 1.1913 0.959 Up
2 2001 0.959 0.381 -0.192 -2.624 -1.055 1.2965 1.032 Up
3 2001 1.032 0.959 0.381 -0.192 -2.624 1.4112 -0.623 Down
4 2001 -0.623 1.032 0.959 0.381 -0.192 1.2760 0.614 Up
5 2001 0.614 -0.623 1.032 0.959 0.381 1.2057 0.213 Up
6 2001 0.213 0.614 -0.623 1.032 0.959 1.3491 1.392 Up
summary(Smarket)
Year Lag1 Lag2 Lag3
6 Analiza datelor în mediul R - teorie şi aplicaţii

Min. :2001 Min. :-4.922000 Min. :-4.922000 Min. :-4.922000


1st Qu.:2002 1st Qu.:-0.639500 1st Qu.:-0.639500 1st Qu.:-0.640000
Median :2003 Median : 0.039000 Median : 0.039000 Median : 0.038500
Mean :2003 Mean : 0.003834 Mean : 0.003919 Mean : 0.001716
3rd Qu.:2004 3rd Qu.: 0.596750 3rd Qu.: 0.596750 3rd Qu.: 0.596750
Max. :2005 Max. : 5.733000 Max. : 5.733000 Max. : 5.733000
Lag4 Lag5 Volume Today
Min. :-4.922000 Min. :-4.92200 Min. :0.3561 Min. :-4.922000
1st Qu.:-0.640000 1st Qu.:-0.64000 1st Qu.:1.2574 1st Qu.:-0.639500
Median : 0.038500 Median : 0.03850 Median :1.4229 Median : 0.038500
Mean : 0.001636 Mean : 0.00561 Mean :1.4783 Mean : 0.003138
3rd Qu.: 0.596750 3rd Qu.: 0.59700 3rd Qu.:1.6417 3rd Qu.: 0.596750
Max. : 5.733000 Max. : 5.73300 Max. :3.1525 Max. : 5.733000
Direction
Down:602
Up :648
Funcția summary() oferă un rezumat simplu al fiecărei variabile din cadrul de
date Smarket. Se poate vedea că există o serie de decalaje în Volume, prețul
Today și Direction. Se va folosi Direction ca răspuns, deoarece arată dacă
piața a crescut sau a coborât faţă de ziua precedentă.

Vizualizarea datelor

Vizualizarea datelor este probabil cel mai rapid și mai util mod de a
rezuma și de a afla mai multe despre datele deţinute.
Histogramele oferă o indicație a distribuției unei variabile.
par(mfrow=c(1,8))
for(i in 1:8) {
hist(Smarket[,i], main=names(Smarket)[i])
}

Figura 8.4.
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 7

Este extrem de greu de văzut, dar majoritatea variabilelor prezintă o


distribuție gaussiană sau dublă gaussiană.
Puteți privi distribuirea datelor într-un mod diferit, folosind graficele de tip
boxplot. Caseta surprinde mijlocul datelor, mediana, iar zonă închisă la culoare
arată întinderea rezonabilă a datelor. Orice puncte din afara zonei închise la culoare
sunt candidați buni pentru valori aberante (outlieri).
par(mfrow=c(1,8))
for(i in 1:8) {
boxplot(Smarket[,i], main=names(Smarket)[i])
}

Figura 8.5.

Se poate constata că Lags și Today au o gamă similară. În caz contrar, nu


există niciun semn de valori aberante.
Datele lipsă au un impact mare asupra modelării. Astfel, se poate utiliza un
grafic lipsă pentru a vă face o idee rapidă despre cantitatea de date lipsă din setul
de date. Axa Ox reprezintă variabile/atribute, iar axa Oy reprezintă
indivizi/observaíi. Liniile orizontale indică datele lipsă pentru un individ, blocurile
verticale reprezintă datele lipsă pentru o variabilă.
# Installing Packages  
install.packages("Amelia", dependencies = TRUE)
install.packages("mlbench", dependencies = TRUE)
# Loading package  
library(Amelia)  
8 Analiza datelor în mediul R - teorie şi aplicaţii

library(mlbench)
missmap(Smarket, col=c("blue", "green"), legend=FALSE)

Figura 8.6.

Se constată că nu lipsesc date din acest set de date.

Corelația dintre fiecare pereche de variabile numerice

Aceste corelații perechi pot fi trasate într-un grafic de matrice de corelație


pentru a da o idee despre variabilele care se modifică împreună.
# Installing Packages  
install.packages("corrplot", dependencies = TRUE)
# Loading package  
library(corrplot)
correlations <- cor(Smarket[,1:8])
Year Lag1 Lag2 Lag3 Lag4
Year 1.00000000 0.029699649 0.030596422 0.033194581 0.035688718
Lag1 0.02969965 1.000000000 -0.026294328 -0.010803402 -0.002985911
Lag2 0.03059642 -0.026294328 1.000000000 -0.025896670 -0.010853533
Lag3 0.03319458 -0.010803402 -0.025896670 1.000000000 -0.024051036
Lag4 0.03568872 -0.002985911 -0.010853533 -0.024051036 1.000000000
Lag5 0.02978799 -0.005674606 -0.003557949 -0.018808338 -0.027083641
Volume 0.53900647 0.040909908 -0.043383215 -0.041823686 -0.048414246
Today 0.03009523 -0.026155045 -0.010250033 -0.002447647 -0.006899527
Lag5 Volume Today
Year 0.029787995 0.53900647 0.030095229
Lag1 -0.005674606 0.04090991 -0.026155045
Lag2 -0.003557949 -0.04338321 -0.010250033
Lag3 -0.018808338 -0.04182369 -0.002447647
Lag4 -0.027083641 -0.04841425 -0.006899527
Lag5 1.000000000 -0.02200231 -0.034860083
Volume -0.022002315 1.00000000 0.014591823
Today -0.034860083 0.01459182 1.000000000
corrplot(correlations, method="circle")
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 9

Figura 8.7.

A fost utilizată o reprezentare în puncte în care albastrul reprezintă


corelație pozitivă și roșu reprezintă corelaţia negativă. Cu cât punctul este mai
mare, cu atât este mai intensă corelația. Se poate vedea că matricea este simetrică și
că diagonala este perfect corelată pozitiv, deoarece arată corelația fiecărei variabile
cu ea însăși. Din păcate, niciuna dintre variabile nu este corelată una cu cealaltă.
Pentru a realiza graficul datelor, există o funcție pairs() care trasează
variabilele din Smarket într-o matrice scatterplot. În acest caz, Direction,
răspunsul binar, este indicatorul de culoare:
pairs(Smarket, col=Smarket$Direction)

Figura 8.8.
10 Analiza datelor în mediul R - teorie şi aplicaţii

Se constată că nu există prea multe corelații între variabilele date. Variabila


de clasă este derivată din variabila Today, deci Up și Down par să facă o
diviziune.
Să aruncăm o privire asupra distribuției densității fiecărei variabile
defalcate în funcție de valoarea Direction. La fel ca matricea de diagramă de
dispersie de mai sus, graficul densității pentru Direction poate ajuta la
observarea separării dintre Up și Down. De asemenea, poate ajuta la înțelegerea
suprapunerii valorilor Direction pentru o variabilă.
library(caret)
x <- Smarket[,1:8]
y <- Smarket[,9]
scales <- list(x=list(relation="free"),
y=list(relation="free"))
featurePlot(x=x, y=y, plot="density", scales=scales)

Figura 8.9.

Se poate vedea că valorile pentru Direction se suprapun pentru toate


aceste variabile, ceea ce înseamnă că este greu de prezis Up sau Down, bazându-ne
doar pe una sau două variabile.

Construirea modelului de regresie logistică

Se va folosi funcția glm.fit(), în care primul argument este o formulă


Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 11

R ce indică faptul că Direction este răspunsul, în timp ce variabilele Lag și


Volume sunt predictorii, glm fiind în general utilizat pentru a se potrivi modelelor
liniare generalizate.
Cu toate acestea, în acest caz, trebuie specificat faptul că se doreşte să se
potrivească unui model de regresie logistică. Soluţia este setând argumentul
familiei pe binomial.
# Regresie logistică
glm.fit <- glm(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume, data = Smarket, family = binomial)
Call: glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume, family = binomial, data = Smarket)
Coefficients:
(Intercept) Lag1 Lag2 Lag3 Lag4 Lag5
-0.126000 -0.073074 -0.042301 0.011085 0.009359 0.010313
Volume
0.135441
Degrees of Freedom: 1249 Total (i.e. Null); 1243 Residual
Null Deviance: 1731
Residual Deviance: 1728 AIC: 1742
Se poate face un summary(), care va spune ceva despre potrivire:
summary(glm.fit)
Call:
glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume, family = binomial, data = Smarket)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.446 -1.203 1.065 1.145 1.326
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.126000 0.240736 -0.523 0.601
Lag1 -0.073074 0.050167 -1.457 0.145
Lag2 -0.042301 0.050086 -0.845 0.398
Lag3 0.011085 0.049939 0.222 0.824
Lag4 0.009359 0.049974 0.187 0.851
Lag5 0.010313 0.049511 0.208 0.835
Volume 0.135441 0.158360 0.855 0.392
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1731.2 on 1249 degrees of freedom
Residual deviance: 1727.6 on 1243 degrees of freedom
AIC: 1741.6
Number of Fisher Scoring iterations: 3
După cum se poate vedea, summary(glm.fit) returnează:
- standard errors, z-score şi p-values pe fiecare dintre
coeficienți. Din date, se pare că niciunul dintre coeficienți nu este
semnificativ;
- devianța (devianța doar pentru medie) și devianța reziduală (devianța
pentru modelul cu toți predictorii). Există o diferență foarte mică între
cele două, în situaţia de fapt cu 6 grade de libertate.
Se atribuie rezultatul predict() al glm.fit() la glm.probs(),
cu tipul egal cu răspunsul. Acest lucru va face predicții cu privire la datele de
antrenament pe care le utilizați pentru a se potrivi modelului și va oferi un vector
de probabilități adaptate.
Privind primele 5 probabilități se constată că acestea sunt foarte apropiate de 50%:
12 Analiza datelor în mediul R - teorie şi aplicaţii

glm.probs <- predict(glm.fit,type = "response")


glm.probs[1:5]
1 2 3 4 5
0.5070841 0.4814679 0.4811388 0.5152224 0.5107812
În continuare se va face o predicție dacă piața va crește sau va scădea pe
baza întârzierilor și a altor predictori. Se vor transforma probabilitățile în clasificări
pe baza pragului de 0.5, folosind comanda ifelse().
glm.pred <- ifelse(glm.probs > 0.5, "Up", "Down")
head(glm.pred)
1 2 3 4 5 6
"Up" "Down" "Down" "Up" "Up" "Up"
glm.pred este un vector cu a TRUE și False. Dacă glm.probs este
mai mare de 0,5, glm.pred apelează „TRUE”; în caz contrar, apelează „False”:
În continuare, se atașază cadrul de date Smarket și se crează un tabel de
glm.pred, care reprezintă Up și Down din Direction.
attach(Smarket)
table(glm.pred,Direction)
Direction
glm.pred Down Up
Down 145 141
Up 457 507
mean(glm.pred == Direction)
[1] 0.5216
Din tabel, instanțele de pe diagonale sunt locul în care se obține
clasificarea corectă, iar în afară diagonalelor sunt poziţiile greșite. Se constată că au
fost comise multe greșeli, media dând o proporție de 0,52.

Crearea setului de antrenare și respectiv de testare

Se vor împărți date în set de antrenare și set de testare, astfel:


# Creare set de antrenare şi set de testare
train = Year<2005
glm.fit <- glm(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume,
data = Smarket,
family = binomial,
subset = train)
glm.probs <- predict(glm.fit,
newdata = Smarket[!train,],
type = "response")
glm.pred <- ifelse(glm.probs > 0.5, "Up", "Down")
Să analizăm în detaliu această secvenţă de cod R:
train - este egal cu anul mai mic decât 2005. Pentru anul mai mic decât 2005, se
obține TRUE; în caz contrar, se obține False.
Se apelează modelul glm.fit, cu excepția faptului că subsetul este egal cu
„train”, ceea ce înseamnă că se potrivește doar cu datele din anul mai mic decât
2005.
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 13

În continuare, se utilizează din nou funcția predict() pentru ca


glm.probs să prezică datele rămase în anii mai mare sau egal cu 2005. Pentru
noile date, se foloseşte Smarket, indexat de !train (!train este TRUE dacă
anul este mai mare sau egal cu 2005). Se setează tipul „response” pentru a
prezice probabilitățile. În cele din urmă, se utilizează din nou funcția ifelse()
pentru ca glm.pred să facă variabile Up și Down.
Mai departe, se crează o nouă variabilă pentru a stoca un subset nou pentru
datele de testare, numită Direction.2005. Variabila de răspuns este încă
Direction. Se face un tabel și se calculează media pentru acest nou set de
testare:
Direction.2005 = Smarket$Direction[!train]
table(glm.pred, Direction.2005)
Direction.2005
glm.pred Down Up
Down 77 97
Up 34 44
mean(glm.pred == Direction.2005)
[1] 0.4801587
Se constată că rezultatele sunt mai puţin bune decât cele anterioare.

Rezolvarea suprasolicitării

Este posibil să fi suprasolicitat datele. Pentru a remedia acest lucru, se va


încadra un model mai mic și se vor folosi Lag1, Lag2, Lag3 ca predictori, lăsând
astfel toate celelalte variabile, restul codului R fiind același.
# Fit a smaller model
glm.fit = glm(Direction ~ Lag1 + Lag2 + Lag3, data = Smarket,
family = binomial, subset = train)
glm.probs = predict(glm.fit, newdata = Smarket[!train,], type
= "response")
glm.pred = ifelse(glm.probs > 0.5, "Up", "Down")
table(glm.pred, Direction.2005)
Direction.2005
glm.pred Down Up
Down 39 31
Up 72 110
mean(glm.pred == Direction.2005)
[1] 0.5912698
De data aceasta s-a obţinut o rată de clasificare de 59.12%, deci, mai bună.
Utilizarea modelului mai mic pare să funcționeze mai bine.
În cele din urmă, se va face un summary(glm.fit) pentru glm.fit
pentru a vedea dacă există modificări semnificative.
summary(glm.fit)
Call:
glm(formula = Direction ~ Lag1 + Lag2 + Lag3, family = binomial,
data = Smarket, subset = train)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.338 -1.189 1.072 1.163 1.335
Coefficients:
14 Analiza datelor în mediul R - teorie şi aplicaţii

Estimate Std. Error z value Pr(>|z|)


(Intercept) 0.032230 0.063377 0.509 0.611
Lag1 -0.055523 0.051709 -1.074 0.283
Lag2 -0.044300 0.051674 -0.857 0.391
Lag3 0.008815 0.051495 0.171 0.864
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1383.3 on 997 degrees of freedom
Residual deviance: 1381.4 on 994 degrees of freedom
AIC: 1389.4
Number of Fisher Scoring iterations: 3
Nimic nu a devenit semnificativ, cel puțin valorile p-value sunt mai
bune, indicând o creștere a predicției de performanță.
glm() nu presupune o relație liniară între variabile dependente și cele
independente. Cu toate acestea, presupune o relație liniară între funcția de legătură
și variabilele independente în modelul logit .

8.3. Clasificatorul naiv Bayesian (Naive Bayes)

Naive Bayes este un algoritm de clasificare neliniară supravegheată în


programarea R, ce conţine o familie de clasificatori probabilistici simpli care se
bazează pe aplicarea teoremei lui Baye cu ipoteze puternice de independență
(Naive) între caracteristici sau variabile. Algoritmul Naive Bayes este numit
„Naiv”, deoarece presupune că apariția unei anumite caracteristici este
independentă de apariția altor caracteristici.
Naive Bayes este un algoritm utilizat pe scară largă în analiza
sentimentelor, categorizarea documentelor, filtrarea e-mailurilor de spam etc.
Algoritmul Naive Bayes se bazează pe teorema Bayes, care oferă
probabilitatea condiționată a unui eveniment A, dat fiind un alt eveniment B,
adică:

unde,
P (A | B) - reprezintă probabilitatea condiționată a lui A, fiind dat B;
P (B | A) - reprezintă probabilitatea condițională a lui B, fiind dat A;
P (A) - reprezintă probabilitatea evenimentului A;
P (B) - reprezintă probabilitatea evenimentului B.
Pentru mai mulți predictori, putem formula probabilitatea posterioară
după cum urmează:

P (A | B) = P (B1 | A) * P (B2 | A) * P (B3 | A) * P (B4 | A) ...

Exemplu: Fie un spațiu eșantion: {HH, HT, TH, TT}


unde:
H: reprezintă Cap;
T: reprezntă Pajură.
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 15

P (a doua monedă este Cap = P (A | B)


prima monedă este Pajură) = P (A | B)
= [P (B | A) * P (A)] / P (B)
= [P (prima monedă este Pajură, a doua monedă este Cap) *
P (a doua monedă este Cap)] / P(prima monedă este Pajură)
= [(1/2) * (1/2)] / (1/2) = (1/2) = 0,5
Aplicaţie: Se va folosi setul de date iris, alcătuit din 50 de eșantioane din
fiecare dintre cele 3 specii de iris (setosa, virginica, versicolor) și un
set de date multivariat introdus de statisticianul și biologul britanic Ronald Fisher
în lucrarea sa din 1936, The use of multiple measurements in taxonomic problems.
Au fost măsurate patru trăsături din fiecare eșantion, adică
lungimea(length) și lățimea(width) sepalelor și petalelor. Pe baza combinației
acestor patru trăsături, Fisher a dezvoltat un model liniar discriminant pentru a
distinge speciile una de alta.
# Loading data  
data(iris)  
# Structure  
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1
1 1 1 ...
# Installing Packages  
install.packages("e1071", dependencies = TRUE)
install.packages("caTools", dependencies = TRUE)
install.packages("caret", dependencies = TRUE)
# Loading package  
library(e1071)  
library(caTools)  
library(caret)  
# Splitting data into train  
# and test data  
split <- sample.split(iris, SplitRatio = 0.75)  
train_cl <- subset(iris, split == "TRUE")
head(train_cl)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
test_cl <- subset(iris, split == "FALSE")   
head(test_cl)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
2 4.9 3.0 1.4 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
7 4.6 3.4 1.4 0.3 setosa
16 Analiza datelor în mediul R - teorie şi aplicaţii

10 4.9 3.1 1.5 0.1 setosa


12 4.8 3.4 1.6 0.2 setosa
15 5.8 4.0 1.2 0.2 setosa
# Feature Scaling  
train_scale <- scale(train_cl[, 1:4])
head(train_scale)
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 -0.8952157 1.0214626 -1.311477 -1.290892
3 -1.3510539 0.3487921 -1.366173 -1.290892
4 -1.4650135 0.1245686 -1.256782 -1.290892
6 -0.5533370 1.9183565 -1.147391 -1.032426
8 -1.0091752 0.7972391 -1.256782 -1.290892
9 -1.6929326 -0.3238784 -1.311477 -1.290892
test_scale <- scale(test_cl[, 1:4])  
head(test_scale)
Sepal.Length Sepal.Width Petal.Length Petal.Width
2 -1.1724769 -0.18115482 -1.368268 -1.331479
5 -1.0392409 1.23657852 -1.368268 -1.331479
7 -1.5721850 0.76400074 -1.368268 -1.198331
10 -1.1724769 0.05513407 -1.308735 -1.464627
12 -1.3057129 0.76400074 -1.249202 -1.331479
15 0.0266472 2.18173409 -1.487334 -1.331479 
# Fitting Naive Bayes Model  
# to training dataset  
# Setting Seed
set.seed(2020)  
classifier_cl <- naiveBayes(Species ~ ., data = train_cl)  
classifier_cl   
Naive Bayes Classifier for Discrete Predictors
Call:
naiveBayes.default(x = X, y = Y, laplace = laplace)
A-priori probabilities:
Y
setosa versicolor virginica
0.3333333 0.3333333 0.3333333
Conditional probabilities:
Sepal.Length
Y [,1] [,2]
setosa 4.986667 0.3812261
versicolor 5.950000 0.5556916
virginica 6.720000 0.5903827
Sepal.Width
Y [,1] [,2]
setosa 3.430000 0.3816028
versicolor 2.720000 0.3517444
virginica 2.983333 0.2730206
Petal.Length
Y [,1] [,2]
setosa 1.440000 0.1693802
versicolor 4.283333 0.5239659
virginica 5.670000 0.5784343
Petal.Width
Y [,1] [,2]
setosa 0.2366667 0.1129032
versicolor 1.3100000 0.2171127
virginica 2.0500000 0.2403302 
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 17

Probabilitatea condițională/tă pentru fiecare caracteristică sau variabilă este


creată de model separat. Probabilitățile apriori sunt, de asemenea, calculate, ceea ce
indică distribuția datelor deţinute.
# Predicting on test data'  
y_pred <- predict(classifier_cl, newdata = test_cl)
y_pred
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa setosa setosa setosa
[19] setosa setosa versicolor versicolor versicolor versicolor
[25] versicolor versicolor versicolor versicolor versicolor versicolor
[31] versicolor versicolor versicolor versicolor versicolor versicolor
[37] versicolor versicolor versicolor versicolor virginica virginica
[43] versicolor virginica virginica virginica virginica versicolor
[49] virginica virginica virginica virginica virginica versicolor
[55] virginica virginica virginica virginica virginica virginica
Levels: setosa versicolor virginica   
# Confusion Matrix  
cm <- table(test_cl$Species, y_pred)  
cm
y_pred
setosa versicolor virginica
setosa 20 0 0
versicolor 0 20 0
virginica 0 3 17 
Deci, 20 de setosa sunt clasificate corect ca setosa. Din 23
versicolor, 20 versicolor sunt clasificate corect ca versicolor, iar 3
versicolor sunt clasificate ca virginica. Din 17 virginica, toate 17
sunt corect clasificate ca virginica.
# Model Evauation  
confusionMatrix(cm)
Confusion Matrix and Statistics
y_pred
setosa versicolor virginica
setosa 20 0 0
versicolor 0 20 0
virginica 0 3 17
Overall Statistics
Accuracy : 0.95
95% CI : (0.8608, 0.9896)
No Information Rate : 0.3833
P-Value [Acc > NIR] : < 2.2e-16

Kappa : 0.925
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: setosa Class: versicolor Class: virginica
Sensitivity 1.0000 0.8696 1.0000
Specificity 1.0000 1.0000 0.9302
Pos Pred Value 1.0000 1.0000 0.8500
Neg Pred Value 1.0000 0.9250 1.0000
Prevalence 0.3333 0.3833 0.2833
Detection Rate 0.3333 0.3333 0.2833
Detection Prevalence 0.3333 0.3333 0.3333
Balanced Accuracy 1.0000 0.9348 0.9651 
18 Analiza datelor în mediul R - teorie şi aplicaţii

Modelul a obținut o precizie de 95% cu o valoare p-value foarte


mică(foarte aproape de 0). Cu Sensitivity, Specificity şi Balanced accuracy pecise,
construirea modelului se deduce că a fost una bună.

8.5. Algoritmul K-cei mai apropiaţi vecini (K-nearest Neighbors


Classification)

Algoritmul K-nearest neighbors (KNN) este un algoritm de tip ML


supravegheat, care poate fi utilizat atât pentru clasificare, cât și pentru probleme
predictive de regresie. Cu toate acestea, este utilizat în principal pentru
clasificarea problemelor predictive.
Următoarele două proprietăți ar defini bine KNN:
- algoritm de învățare leneș - KNN este un algoritm de învățare leneș,
deoarece nu are o fază de instruire specializată și folosește toate
datele pentru antrenament în timpul clasificării;
- algoritm de învățare non-parametri, deoarece nu presupune nimic
despre datele subiacente.

8.5.1. Funcționarea algoritmului KNN

Algoritmul celor mai apropiați K-vecini (KNN) utilizează „similitudinea


caracteristicilor” pentru a prezice valorile noilor puncte de date, ceea ce înseamnă
în plus că noului punct de date i se va atribui o valoare bazată pe cât de strâns se
potrivește cu punctele din setul de antrenament.

Exemplu de algoritm KNN

Să luăm în considerare 10 „articole de băut”, care sunt evaluate pe baza a


doi parametri pe o scară de la 1 la 10. Cei doi parametri sunt „dulceața” și
„acidulare”. Aceasta este mai degrabă o evaluare bazată pe percepție și, prin
urmare, poate varia între indivizi. Evaluările pentru câteva articole arată oarecum
ca:

„Dulceața” determină percepția conținutului de zahăr din produse, în timp


ce „acidulare” constată prezența bulelor în băutură datorită conținutului de dioxid
de carbon conţinut. Toate aceste evaluări utilizate se bazează pe percepția
personală și sunt strict relative.
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 19

Figura 8.12.

Din figura anterioară, este clar că am împărțit cele 10 articole în 4 grupuri


și anume „BĂUTURI RECE”, „BĂUTURI CU ENERGIE”, „BĂUTURI DE
SĂNĂTATE” și „BĂUTURI DUR”. Întrebarea aici este, din ce grupă ar face
parte „Maaza”? Acest lucru va fi determinat prin calcularea distanței.
Acum, calcularea distanței dintre „Maaza” și vecinii săi cei mai apropiați
(„ACTIV”, „Vodka”, „Pepsi” și „Monstru”) necesită utilizarea unei formule de
distanță, cea mai populară fiind formula distanței euclidiene, adică cea mai mică
distanță între 2 puncte care pot fi obținute folosind o riglă.

Figura 8.13.

Folosind coordonatele Maaza(8,2) și Vodka(2,1), distanța dintre „Maaza”


și „Vodka” poate fi calculată ca:
dist (Maaza, Vodka) = 6,08
20 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 8.14.

Distanța dintre Maaza și ACTIV fiind cea mai mică, se poate deduce că
Maaza are aceeași natură cu ACTIV, care la rândul său aparține grupului de
băuturi (Health Drinks).
- dacă k = 1, algoritmul consideră cel mai apropiat vecin de Maaza, pe
ACTIV;
- dacă k = 3, algoritmul consideră „3” cei mai apropiați vecini de
Maaza pentru a compara distanțele (ACTIV, Vodka, Monster) -
ACTIV este cel mai apropiat de Maaza.

8.5.2. Aplicaţii

Aplicaţia 1. Folosirea algoritmului K-Near Neighbor pe setul de date iris care


include 150 observaţii și 4 variabile sau atribute, plus o coloană cu eticheta,
Vom folosi setul de date iris pentru a parcurge abordarea ML a acestui
tip de problemă, căutând să prezicem ce specie este o floare prin variabilele
măsurate. Vom parcurge pașii necesari pentru a utiliza algoritmul k-Near
Neighbours pentru a clasifica setul de date. Acest algoritm face predicții de clasă
pe baza atributelor cunoscute ale datelor utilizate pentru a construi modelul - dacă
florile setosa au petale mici, de exemplu, o floare necunoscută cu petale mici va
fi probabil o setosa.
Pentru a face acest lucru, algoritmul găsește cei mai apropiați k vecini ai
fiecărui punct de date necunoscut - adică k puncte de date cunoscute cele mai
apropiate de cel pentru care se fac predicții, unde k este un număr definit ca fiind
cel mai potrivit pentru setul de date. Pentru a face acest lucru, mașina va găsi mai
întâi distanța dintre date, calculând diferența dintre fiecare dintre variabile.
Primul lucru pe care trebuie să-l facem este să ne împărțim datele în două
seturi - setul de antrenare, care va construi modelul și setul de testare, care va
evalua performanța acestuia. Pentru a face acest lucru, trebuie mai întâi să
selectăm aleatoriu ce observații vor intra în fiecare set de date.
Vrem apoi să partiționăm sau să împărțim datele în set de date de
antrenare şi set de testare. Putem face acest lucru folosind
createDataPartition() din pachetul caret, specificând ce vrem să
împărțim (specia din setul nostru de date), ce proporție din date ar trebui să
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 21

alcătuiască fiecare set (0,75 de antrenament și 0,25 în set de test, în acest caz -
veți vedea frecvent între 60 și 80% din datele folosite pentru instruire) și cum ne
dorim rezultatele (în acest exemplu, o matrice, nu o listă):
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
install.packages("class", dependencies = TRUE)
library(class)
install.packages("naivebayes", dependencies = TRUE)
library(naivebayes)
install.packages("data.table", dependencies = TRUE)
library(data.table)
install.packages("psych", dependencies = TRUE)
library(psych)
install.packages("GPArotation", dependencies = TRUE)
library(GPArotation)
# Installing specific Packages  
install.packages("e1071", dependencies = TRUE)  
install.packages("caTools", dependencies = TRUE)  
install.packages("class", dependencies = TRUE)
install.packages("caret", dependencies = TRUE)
install.packages("lattice", dependencies = TRUE)
install.packages("ggplot2", dependencies = TRUE)
# Loading specific package  
library(e1071)  
library(caTools)  
library(class)
library(caret)
library(lattice)
library(ggplot2)

set.seed (2020)
Pasul 1: Se importă setul de date  
# Loading data  
data(iris)  
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1          5.1         3.5          1.4         0.2  setosa 
2          4.9         3.0          1.4         0.2  setosa 
3          4.7         3.2          1.3         0.2  setosa 
4          4.6         3.1          1.5         0.2  setosa 
5          5.0         3.6          1.4         0.2  setosa 
6          5.4         3.9          1.7         0.4  setosa 
Numărul de linii ale setului de date
nrow(iris)
[1] 150
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
22 Analiza datelor în mediul R - teorie şi aplicaţii

$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1


1 ...
iris <- iris %>%
select(-X)
colSums(is.na(iris))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
0 0 0 0 0
Statistici descriptive pentru toate variabilele
summary(iris[1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Pasul 2: Normalizarea datelor
Trebuie normalizat setul de date, astfel încât ieșirea să rămână imparțială.
Deoarece scala fiecărei variabile este diferită, trebuie stabilite ponderi pentru a evita
deplasarea.
Dacă datele nu sunt normalizate, aceasta va duce la un rezultat incorect.
## Se creează funcția de normalizare
normalize <-function(x) {
(x -min(x))/(max(x)-min(x))
}
## Se rulează normalizarea a 4 coloane ale setului de date,
## deoarece acestea sunt predictorii
iris_norm <- as.data.frame(lapply(iris[,c(1:4)], normalize))
head(iris_norm)
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 0.22222222 0.6250000 0.06779661 0.04166667
2 0.16666667 0.4166667 0.06779661 0.04166667
3 0.11111111 0.5000000 0.05084746 0.04166667
4 0.08333333 0.4583333 0.08474576 0.04166667
5 0.19444444 0.6666667 0.06779661 0.04166667
6 0.30555556 0.7916667 0.11864407 0.12500000
Pasul 3: Splitarea datelor
Se aplică algoritmul KNN asupra setului de date de antrenare și rezultatele
sunt verificate pe setul de date de testare. Proporţia alegerii datelor depinde de
cercetător, de data aceasta fiind folosite 25% pentru testare și 75% pentru antrenare.
## Se generează un număr aleator care reprezintă 75% din
## numărul total de linii din setul de date
data_split <- sample(1:nrow(iris_norm), 0.75 *
nrow(iris_norm))
data_split
[1] 28 80 101 111 137 133 144 132 98 103 90 70 79 116 14 126 62 4
[19] 143 40 93 122 5 66 135 47 131 123 84 48 108 3 87 41 115 100
[37] 72 32 42 43 2 138 54 49 102 56 51 6 107 130 96 106 57 8
[55] 26 17 63 97 22 35 117 149 119 86 142 10 55 92 25 88 50 139
[73] 20 140 94 71 61 104 109 27 121 60 65 36 150 19 9 134 30 52
[91] 95 38 83 141 21 105 113 13 69 110 118 73 16 11 67 91 146 46
[109] 129 59 89 64
## Se extrage setul de antrenare
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 23

train <- iris_norm[data_split,]


head(train)
Sepal.Length Sepal.Width Petal.Length Petal.Width
28 0.2500000 0.6250000 0.08474576 0.04166667
80 0.3888889 0.2500000 0.42372881 0.37500000
101 0.5555556 0.5416667 0.84745763 1.00000000
111 0.6111111 0.5000000 0.69491525 0.79166667
137 0.5555556 0.5833333 0.77966102 0.95833333
133 0.5833333 0.3333333 0.77966102 0.87500000
dim(train)
[1] 112 4
## Se extrage setul de testare
test <- iris_norm[-data_split,]
head(test)
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 0.22222222 0.6250000 0.06779661 0.04166667
7 0.08333333 0.5833333 0.06779661 0.08333333
12 0.13888889 0.5833333 0.10169492 0.04166667
15 0.41666667 0.8333333 0.03389831 0.04166667
18 0.22222222 0.6250000 0.06779661 0.08333333
23 0.08333333 0.6666667 0.00000000 0.04166667
dim(test)
[1] 38 4
După obținerea seturilor de date de instruire şi de testare, se crează un
cadru de date(dataframe) separat pentru variabila „Creditabilitate”, astfel încât
rezultatele finale să poată fi comparate cu valorile reale.
## Se extrage coloana a 5-a a setului de date de antrenare,
## deoarece va fi folosit ca argument „cl” în funcția knn
target_category <- iris[data_split,5]
target_category
[1] setosa versicolor virginica virginica virginica virginica
[7] virginica virginica versicolor virginica versicolor versicolor
[13] versicolor virginica setosa virginica versicolor setosa
[19] virginica setosa versicolor virginica setosa versicolor
[25] virginica setosa virginica virginica versicolor setosa
[31] virginica setosa versicolor setosa virginica versicolor
[37] versicolor setosa setosa setosa setosa virginica
[43] versicolor setosa virginica versicolor versicolor setosa
[49] virginica virginica versicolor virginica versicolor setosa
[55] setosa setosa versicolor versicolor setosa setosa
[61] virginica virginica virginica versicolor virginica setosa
[67] versicolor versicolor setosa versicolor setosa virginica
[73] setosa virginica versicolor versicolor versicolor virginica
[79] virginica setosa virginica versicolor versicolor setosa
[85] virginica setosa setosa virginica setosa versicolor
[91] versicolor setosa versicolor virginica setosa virginica
[97] virginica setosa versicolor virginica virginica versicolor
[103] setosa setosa versicolor versicolor virginica setosa
[109] virginica versicolor versicolor versicolor
Levels: setosa versicolor virginica
## Se extrage coloana a 5-a dacă testați setul de date
## pentru a măsura acuratețea
test_category <- iris[-data_split,5]
test_category
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa versicolor versicolor versicolor
24 Analiza datelor în mediul R - teorie şi aplicaţii

[19] versicolor versicolor versicolor versicolor versicolor versicolor


[25] versicolor versicolor versicolor virginica virginica virginica
[31] virginica virginica virginica virginica virginica virginica
[37] virginica virginica
Levels: setosa versicolor virginica
Pasul 4: Realizarea de predicții
În continuare, se va construi un model de învățare automată, folosind
setul de date de instruire. Pentru a utiliza algoritmul KNN pentru a construi un
model, trebuie mai întâi să instalăm pachetul „class” furnizat de R. Acest pachet
are funcția KNN.
## Se încarcă pachetul class
install.packages("class", dependencies = TRUE)
library(class)
## se rulează funcţia knn
test_pred <- knn(train,test,cl=target_category,k=5)
test_pred
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa versicolor versicolor versicolor
[19] versicolor versicolor versicolor versicolor virginica versicolor
[25] versicolor versicolor versicolor virginica virginica versicolor
[31] virginica virginica virginica virginica virginica virginica
[37] virginica virginica
Levels: setosa versicolor virginica
Din rezolvarea de mai sus, se obţin rezultatele clasificării utilizând k = 5,
unde valoarea K este determinată de cercetător.
Apoi, se compară datele reale cu datele de predicție.
df_pred = data.frame (test_category, test_pred)
df_pred
test_category test_pred
1 setosa setosa
2 setosa setosa
3 setosa setosa
4 setosa setosa
5 setosa setosa
6 setosa setosa
7 setosa setosa
8 setosa setosa
9 setosa setosa
10 setosa setosa
11 setosa setosa
12 setosa setosa
13 setosa setosa
14 setosa setosa
15 setosa setosa
16 versicolor versicolor
17 versicolor versicolor
18 versicolor versicolor
19 versicolor versicolor
20 versicolor versicolor
21 versicolor versicolor
22 versicolor versicolor
23 versicolor virginica
24 versicolor versicolor
25 versicolor versicolor
26 versicolor versicolor
27 versicolor versicolor
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 25

28 virginica virginica
29 virginica virginica
30 virginica versicolor
31 virginica virginica
32 virginica virginica
33 virginica virginica
34 virginica virginica
35 virginica virginica
36 virginica virginica
37 virginica virginica
38 virginica virginica
Putem vedea din rezultatul clasificării că există încă unele date care nu se
potrivesc.
Pasul 6: Precizia (Accuracy)
După construirea modelului, putem verifica acuratețea previziunii
folosind matricea de confuzie.
## Se crează matricea de confuzie
table <- table(test_category,test_pred)
table
test_pred
test_category setosa versicolor virginica
setosa 15 0 0
versicolor 0 11 1
virginica 0 1 10
Rezultatele matricei de confuzie sunt date de:
# Se evaluează performanța modelului
install.packages("gmodels", dependencies = TRUE)
library(gmodels)
CrossTable(x=test_category, y=test_pred,prop.chisq = FALSE)
Cell Contents
|-------------------------|
| N |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|

Total Observations in Table: 38

| test_pred
test_category | setosa | versicolor | virginica | Row Total |
--------------|------------|------------|------------|------------|
setosa | 15 | 0 | 0 | 15 |
| 1.000 | 0.000 | 0.000 | 0.395 |
| 1.000 | 0.000 | 0.000 | |
| 0.395 | 0.000 | 0.000 | |
--------------|------------|------------|------------|------------|
versicolor | 0 | 11 | 1 | 12 |
| 0.000 | 0.917 | 0.083 | 0.316 |
| 0.000 | 0.917 | 0.091 | |
| 0.000 | 0.289 | 0.026 | |
--------------|------------|------------|------------|------------|
virginica | 0 | 1 | 10 | 11 |
| 0.000 | 0.091 | 0.909 | 0.289 |
| 0.000 | 0.083 | 0.909 | |
| 0.000 | 0.026 | 0.263 | |
26 Analiza datelor în mediul R - teorie şi aplicaţii

--------------|------------|------------|------------|------------|
Column Total | 15 | 12 | 11 | 38 |
| 0.395 | 0.316 | 0.289 | |
--------------|------------|------------|------------|------------|
Verificarea preciziei
## această funcție împarte predicțiile corecte la numărul
## total de predicții care ne indică cât de precis este
## modelul
accuracy<- function(x){sum(diag(x)/(sum(rowSums(x)))) * 100}
accuracy(table)
[1] 94.73684
Datele testului au constat în 150 de observații, acest caz a obținut valoare
predictivă cu o precizie foarte bună.
# Se potrivește modelul KNN la setul de date de testare  
split <- sample.split(iris, SplitRatio = 0.75)  
train_cl <- subset(iris, split == "TRUE")  
test_cl <- subset(iris, split == "FALSE")   
# Scalarea caracteristicilor  
train_scale <- scale(train_cl[, 1:4])  
test_scale <- scale(test_cl[, 1:4])  
  
# Se potrivește modelul KNN la setul de date de antrenare  
# K = 1  
classifier_knn <- knn(train = train_scale,  
test = test_scale,  
cl = train_cl$Species,  
k = 1)  
classifier_knn
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa setosa setosa setosa
[19] setosa setosa versicolor versicolor versicolor versicolor
[25] versicolor versicolor versicolor versicolor virginica versicolor
[31] versicolor versicolor versicolor virginica versicolor versicolor
[37] versicolor versicolor versicolor versicolor virginica virginica
[43] virginica virginica virginica virginica virginica virginica
[49] virginica virginica virginica virginica virginica versicolor
[55] virginica virginica virginica virginica virginica virginic 
# Matricea de confuzie  
cm <- table(test_cl$Species, classifier_knn)  
cm  
classifier_knn
setosa versicolor virginica
setosa 20 0 0
versicolor 0 18 2
virginica 0 1 19
# Evaluarea modelului - Alegerea lui K
# Se calculează din eșantionul de eroare  
misClassError <- mean(classifier_knn != test_cl$Species)  
print(paste('Accuracy =', 1-misClassError))  
[1] "Accuracy = 0.95"   
# K = 3  
classifier_knn <- knn(train = train_scale,  
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 27

test = test_scale,  
cl = train_cl$Species,  
k = 3)  
misClassError <- mean(classifier_knn != test_cl$Species)  
print(paste('Accuracy =', 1-misClassError))  
[1] "Accuracy = 0.95"
# K = 5  
classifier_knn <- knn(train = train_scale,  
test = test_scale,  
cl = train_cl$Species,  
k = 5)  
misClassError <- mean(classifier_knn != test_cl$Species)  
print(paste('Accuracy =', 1-misClassError))  
[1] "Accuracy = 0.95" 
# K = 7  
classifier_knn <- knn(train = train_scale,  
test = test_scale,  
cl = train_cl$Species,  
k = 7)  
misClassError <- mean(classifier_knn != test_cl$Species)  
print(paste('Accuracy =', 1-misClassError))  
[1] "Accuracy = 0.966666666666667"  
# K = 15  
classifier_knn <- knn(train = train_scale,  
test = test_scale,  
cl = train_cl$Species,  
k = 15)  
misClassError <- mean(classifier_knn != test_cl$Species)  
print(paste('Accuracy =', 1-misClassError))  
[1] "Accuracy = 0.983333333333333"
# K = 19  
classifier_knn <- knn(train = train_scale,  
test = test_scale,  
cl = train_cl$Species,  
k = 19)  
misClassError <- mean(classifier_knn != test_cl$Species)  
print(paste('Accuracy =', 1-misClassError)) 
[1] "Accuracy = 0.966666666666667"
Aplicaţia 2. Folosirea algoritmului K-Near Neighbor pe setul de date spotify
care include 50 observaţii și 10 variabile sau atribute, plus o coloană cu eticheta,
Eticheta, ce conţine valorile 1-....., 2-......, 3-......., 4-...........
Primele 50 de melodii cele mai ascultate din lume după spotify. Acest set
de date conține mai multe variabile despre melodii. Această bază de date conține
50 de melodii, cu 13 variabile.
Informații despre variabile:
Track.Name: numele pistei
Artist.Name: Numele artistului
Genr: genul piesei
Beats.Per.Minute: tempo-ul melodiei.
28 Analiza datelor în mediul R - teorie şi aplicaţii

Energie: Energia unui cântec - cu cât valoarea este mai mare, cu atât este mai
energică. cântec
Danceability: Cu cât valoarea este mai mare, cu atât este mai ușor să dansezi
la acest cântec.
Loudness..dB ..: Cu cât valoarea este mai mare, cu atât cântecul este mai
puternic.
Liveness: Cu cât este mai mare valoarea, cu atât este mai probabil ca melodia
să fie o înregistrare live.
Valence .: Cu cât valoarea este mai mare, cu atât starea de spirit este mai
pozitivă pentru melodie.
Length .: Durata melodiei.
Acousticness ..: Cu cât valoarea este mai mare, cu atât este mai acustică
melodia.
Speechiness: Cu cât este mai mare valoarea, cu atât conține mai mult cuvântul
rostit.
Popularity: cu cât valoarea este mai mare, cu atât este mai populară melodia.
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
install.packages("class", dependencies = TRUE)
library(class)
install.packages("naivebayes", dependencies = TRUE)
library(naivebayes)
install.packages("data.table", dependencies = TRUE)
library(data.table)
install.packages("psych", dependencies = TRUE)
library(psych)
install.packages("GPArotation", dependencies = TRUE)
library(GPArotation)
install.packages("pROC", dependencies = c("Depends",
"Suggests"))
library(pROC)
Pasul 1: Se importă setul de date
spotify <- read.csv("top50_final.csv")
print(spotify)
Track.Name
1 Señorita
2 China
3 boyfriend (with Social House)
4 Beautiful People (feat. Khalid)
5 Goodbyes (Feat. Young Thug)
6 I Don't Care (with Justin Bieber)
7 Ransom
8 How Do You Sleep?
9 Old Town Road - Remix
10 bad guy
11 Callaita
12 Loco Contigo (feat. J. Balvin & Tyga)
13 Someone You Loved
14 Otro Trago - Remix
15 Money In The Grave (Drake ft. Rick Ross)
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 29

16 No Guidance (feat. Drake)


17 LA CANCIÓN
18 Sunflower - Spider-Man: Into the Spider-Verse
19 Lalala
20 Truth Hurts
21 Piece Of Your Heart
22 Panini
23 No Me Conoce - Remix
24 Soltera - Remix
25 bad guy (with Justin Bieber)
26 If I Can't Have You
27 Dance Monkey
28 It's You
29 Con Calma
30 QUE PRETENDES
31 Takeaway
32 7 rings
33 0.958333333333333
34 The London (feat. J. Cole & Travis Scott)
35 Never Really Over
36 Summer Days (feat. Macklemore & Patrick Stump of Fall Out Boy)
37 Otro Trago
38 Antisocial (with Travis Scott)
39 Sucker
40 fuck, i'm lonely (with Anne-Marie) - from “13 Reasons Why: Season 3”
41 Higher Love
42 You Need To Calm Down
43 Shallow
44 Talk
45 Con Altura
46 One Thing Right
47 Te Robaré
48 Happier
49 Call You Mine
50 Cross Me (feat. Chance the Rapper & PnB Rock)
Artist.Name Genre Beats.Per.Minute Energy Danceability
1 Shawn Mendes canadian pop 117 55 76
2 Anuel AA reggaeton flow 105 81 79
3 Ariana Grande dance pop 190 80 40
4 Ed Sheeran pop 93 65 64
5 Post Malone dfw rap 150 65 58
6 Ed Sheeran pop 102 68 80
7 Lil Tecca trap music 180 64 75
8 Sam Smith pop 111 68 48
9 Lil Nas X country rap 136 62 88
10 Billie Eilish electropop 135 43 70
11 Bad Bunny reggaeton 176 62 61
12 DJ Snake dance pop 96 71 82
13 Lewis Capaldi pop 110 41 50
14 Sech panamanian pop 176 79 73
15 Drake canadian hip hop 101 50 83
16 Chris Brown dance pop 93 45 70
17 J Balvin latin 176 65 75
18 Post Malone dfw rap 90 48 76
19 Y2K canadian hip hop 130 39 84
20 Lizzo escape room 158 62 72
21 MEDUZA pop house 124 74 68
22 Lil Nas X country rap 154 59 70
23 Jhay Cortez reggaeton flow 92 79 81
24 Lunay latin 92 78 80
25 Billie Eilish electropop 135 45 67
26 Shawn Mendes canadian pop 124 82 69
30 Analiza datelor în mediul R - teorie şi aplicaţii

27 Tones and I australian pop 98 59 82


28 Ali Gatie canadian hip hop 96 46 73
29 Daddy Yankee latin 94 86 74
30 J Balvin latin 93 79 64
31 The Chainsmokers edm 85 51 29
32 Ariana Grande dance pop 140 32 78
33 Maluma reggaeton 96 71 78
34 Young Thug atl hip hop 98 59 80
35 Katy Perry dance pop 100 88 77
36 Martin Garrix big room 114 72 66
37 Sech panamanian pop 176 70 75
38 Ed Sheeran pop 152 82 72
39 Jonas Brothers boy band 138 73 84
40 Lauv dance pop 95 56 81
41 Kygo edm 104 68 69
42 Taylor Swift dance pop 85 68 77
43 Lady Gaga dance pop 96 39 57
44 Khalid pop 136 40 90
45 ROSALÍA r&b en espanol 98 69 88
46 Marshmello brostep 88 62 66
47 Nicky Jam latin 176 75 67
48 Marshmello brostep 100 79 69
49 The Chainsmokers edm 104 70 59
50 Ed Sheeran pop 95 79 75
Loudness..dB.. Liveness Valence. Length. Acousticness.. Speechiness.
1 -6 8 75 191 4 3
2 -4 8 61 302 8 9
3 -4 16 70 186 12 46
4 -8 8 55 198 12 19
5 -4 11 18 175 45 7
6 -5 9 84 220 9 4
7 -6 7 23 131 2 29
8 -5 8 35 202 15 9
9 -6 11 64 157 5 10
10 -11 10 56 194 33 38
11 -5 24 24 251 60 31
12 -4 15 38 185 28 7
13 -6 11 45 182 75 3
14 -2 6 76 288 7 20
15 -4 12 10 205 10 5
16 -7 16 14 261 12 15
17 -6 11 43 243 15 32
18 -6 7 91 158 56 5
19 -8 14 50 161 18 8
20 -3 12 41 173 11 11
21 -7 7 63 153 4 3
22 -6 12 48 115 34 8
23 -4 9 58 309 14 7
24 -4 44 80 266 36 4
25 -11 12 68 195 25 30
26 -4 13 87 191 49 6
27 -6 18 54 210 69 10
28 -7 19 40 213 37 3
29 -3 6 66 193 11 6
30 -4 36 94 222 3 25
31 -8 10 36 210 12 4
32 -11 9 33 179 59 33
33 -5 9 68 176 22 28
34 -7 13 18 200 2 15
35 -5 32 39 224 19 6
36 -7 14 32 164 18 6
37 -5 11 62 226 14 34
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 31

38 -5 36 91 162 13 5
39 -5 11 95 181 4 6
40 -6 6 68 199 48 7
41 -7 10 40 228 2 3
42 -6 7 73 171 1 5
43 -6 23 32 216 37 3
44 -9 6 35 198 5 13
45 -4 5 75 162 39 12
46 -2 58 44 182 7 5
47 -4 8 80 202 24 6
48 -3 17 67 214 19 5
49 -6 41 50 218 23 3
50 -6 7 61 206 21 12
Popularity
1 79
2 92
3 85
4 86
5 94
6 84
7 92
8 90
9 87
10 95
11 93
12 86
13 88
14 87
15 92
16 82
17 90
18 91
19 88
20 91
21 91
22 91
23 83
24 91
25 89
26 70
27 83
28 89
29 91
30 89
31 84
32 89
33 89
34 89
35 89
36 89
37 91
38 87
39 80
40 78
41 88
42 90
43 87
44 84
45 88
46 88
47 88
48 88
32 Analiza datelor în mediul R - teorie şi aplicaţii

49 88
50 82

Numărul de linii ale setului de date


nrow(spotify)
[1] 50
str(spotify)
'data.frame': 50 obs. of 14 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ Track.Name : chr "Señorita" "China" "boyfriend (with Social House)"
"Beautiful People (feat. Khalid)" ...
$ Artist.Name : chr "Shawn Mendes" "Anuel AA" "Ariana Grande" "Ed
Sheeran" ...
$ Genre : chr "canadian pop" "reggaeton flow" "dance pop" "pop" ...
$ Beats.Per.Minute: int 117 105 190 93 150 102 180 111 136 135 ...
$ Energy : int 55 81 80 65 65 68 64 68 62 43 ...
$ Danceability : int 76 79 40 64 58 80 75 48 88 70 ...
$ Loudness..dB.. : int -6 -4 -4 -8 -4 -5 -6 -5 -6 -11 ...
$ Liveness : int 8 8 16 8 11 9 7 8 11 10 ...
$ Valence. : int 75 61 70 55 18 84 23 35 64 56 ...
$ Length. : int 191 302 186 198 175 220 131 202 157 194 ...
$ Acousticness.. : int 4 8 12 12 45 9 2 15 5 33 ...
$ Speechiness. : int 3 9 46 19 7 4 29 9 10 38 ...
$ Popularity : int 79 92 85 86 94 84 92 90 87 95 ...

spotify <- spotify %>%


select(-X)
colSums(is.na(spotify))
Track.Name Artist.Name Genre Beats.Per.Minute
0 0 0 0
Energy Danceability Loudness..dB.. Liveness
0 0 0 0
Valence. Length. Acousticness.. Speechiness.
0 0 0 0
Popularity
0
Statistici descriptive pentru toate variabilele
summary(spotify[1:13])
Track.Name Artist.Name Genre Beats.Per.Minute
Length:50 Length:50 Length:50 Min. : 85.0
Class :character Class :character Class :character 1st Qu.: 96.0
Mode :character Mode :character Mode :character Median :104.5
Mean :120.1
3rd Qu.:137.5
Max. :190.0
Energy Danceability Loudness..dB.. Liveness
Min. :32.00 Min. :29.00 Min. :-11.00 Min. : 5.00
1st Qu.:55.25 1st Qu.:67.00 1st Qu.: -6.75 1st Qu.: 8.00
Median :66.50 Median :73.50 Median : -6.00 Median :11.00
Mean :64.06 Mean :71.38 Mean : -5.66 Mean :14.66
3rd Qu.:74.75 3rd Qu.:79.75 3rd Qu.: -4.00 3rd Qu.:15.75
Max. :88.00 Max. :90.00 Max. : -2.00 Max. :58.00
Valence. Length. Acousticness.. Speechiness.
Min. :10.00 Min. :115.0 Min. : 1.00 Min. : 3.00
1st Qu.:38.25 1st Qu.:176.8 1st Qu.: 8.25 1st Qu.: 5.00
Median :55.50 Median :198.0 Median :15.00 Median : 7.00
Mean :54.60 Mean :201.0 Mean :22.16 Mean :12.48
3rd Qu.:69.50 3rd Qu.:217.5 3rd Qu.:33.75 3rd Qu.:15.00
Max. :95.00 Max. :309.0 Max. :75.00 Max. :46.00
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 33

Popularity
Min. :70.00
1st Qu.:86.00
Median :88.00
Mean :87.50
3rd Qu.:90.75
Max. :95.00
Pasul 2: Normalizarea datelor
Trebuie normalizat setul de date, astfel încât ieșirea să rămână imparțială.
Deoarece scala fiecărei variabile este diferită, trebuie stabilite ponderi pentru a evita
deplasarea.
Dacă datele nu sunt normalizate, aceasta va duce la un rezultat incorect.
## Se creează funcția de normalizare
normalize <-function(x) {
(x -min(x))/(max(x)-min(x))
}
## Se rulează normalizarea a 10 coloane ale setului de date,
## deoarece acestea sunt predictorii
spotify_norm <- as.data.frame(lapply(spotify[,c(4:13)],
normalize))
head(spotify_norm)
Beats.Per.Minute Energy Danceability Loudness..dB.. Liveness Valence.
1 0.30476190 0.4107143 0.7704918 0.5555556 0.05660377 0.76470588
2 0.19047619 0.8750000 0.8196721 0.7777778 0.05660377 0.60000000
3 1.00000000 0.8571429 0.1803279 0.7777778 0.20754717 0.70588235
4 0.07619048 0.5892857 0.5737705 0.3333333 0.05660377 0.52941176
5 0.61904762 0.5892857 0.4754098 0.7777778 0.11320755 0.09411765
6 0.16190476 0.6428571 0.8360656 0.6666667 0.07547170 0.87058824
Length. Acousticness.. Speechiness. Popularity
1 0.3917526 0.04054054 0.00000000 0.36
2 0.9639175 0.09459459 0.13953488 0.88
3 0.3659794 0.14864865 1.00000000 0.60
4 0.4278351 0.14864865 0.37209302 0.64
5 0.3092784 0.59459459 0.09302326 0.96
6 0.5412371 0.10810811 0.02325581 0.56
Pasul 3: Splitarea datelor
Se aplică algoritmul KNN asupra setului de date de antrenare și rezultatele
sunt verificate pe setul de date de testare. Proporţia alegerii datelor depinde de
cercetător, de data aceasta fiind folosite 25% pentru testare și 75% pentru antrenare.
## Se generează un număr aleatoriu care reprezintă 75% din
## numărul total de linii din setul de date
data_split <- sample(1:nrow(spotify_norm), 0.75 *
nrow(spotify_norm))
data_split
[1] 22 41 43 34 31 26 46 19 5 27 6 47 4 17 13 25 29 3 28 39 10 32 18 50 16
[26] 2 40 37 20 7 38 8 24 49 35 42 9
## Se extrage setul de antrenare
train <- spotify_norm[data_split,]
head(train)
Beats.Per.Minute Energy Danceability Loudness..dB.. Liveness
Valence.
22 0.6571429 0.4821429 0.6721311 0.5555556 0.13207547 0.44705882
41 0.1809524 0.6428571 0.6557377 0.4444444 0.09433962 0.35294118
43 0.1047619 0.1250000 0.4590164 0.5555556 0.33962264 0.25882353
34 Analiza datelor în mediul R - teorie şi aplicaţii

34 0.1238095 0.4821429 0.8360656 0.4444444 0.15094340 0.09411765


31 0.0000000 0.3392857 0.0000000 0.3333333 0.09433962 0.30588235
26 0.3714286 0.8928571 0.6557377 0.7777778 0.15094340 0.90588235
Length. Acousticness.. Speechiness. Popularity
22 0.0000000 0.44594595 0.11627907 0.84
41 0.5824742 0.01351351 0.00000000 0.72
43 0.5206186 0.48648649 0.00000000 0.68
34 0.4381443 0.01351351 0.27906977 0.76
31 0.4896907 0.14864865 0.02325581 0.56
26 0.3917526 0.64864865 0.06976744 0.00
dim(train)
[1] 37 10
## Se extrage setul de testare
test <- spotify_norm[-data_split,]
test
Beats.Per.Minute Energy Danceability Loudness..dB.. Liveness Valence.
1 0.30476190 0.4107143 0.7704918 0.5555556 0.05660377 0.7647059
11 0.86666667 0.5357143 0.5245902 0.6666667 0.35849057 0.1647059
12 0.10476190 0.6964286 0.8688525 0.7777778 0.18867925 0.3294118
14 0.86666667 0.8392857 0.7213115 1.0000000 0.01886792 0.7764706
15 0.15238095 0.3214286 0.8852459 0.7777778 0.13207547 0.0000000
21 0.37142857 0.7500000 0.6393443 0.4444444 0.03773585 0.6235294
23 0.06666667 0.8392857 0.8524590 0.7777778 0.07547170 0.5647059
30 0.07619048 0.8392857 0.5737705 0.7777778 0.58490566 0.9882353
33 0.10476190 0.6964286 0.8032787 0.6666667 0.07547170 0.6823529
36 0.27619048 0.7142857 0.6065574 0.4444444 0.16981132 0.2588235
44 0.48571429 0.1428571 1.0000000 0.2222222 0.01886792 0.2941176
45 0.12380952 0.6607143 0.9672131 0.7777778 0.00000000 0.7647059
48 0.14285714 0.8392857 0.6557377 0.8888889 0.22641509 0.6705882
Length. Acousticness.. Speechiness. Popularity
1 0.3917526 0.04054054 0.00000000 0.36
11 0.7010309 0.79729730 0.65116279 0.92
12 0.3608247 0.36486486 0.09302326 0.64
14 0.8917526 0.08108108 0.39534884 0.68
15 0.4639175 0.12162162 0.04651163 0.88
21 0.1958763 0.04054054 0.00000000 0.84
23 1.0000000 0.17567568 0.09302326 0.52
30 0.5515464 0.02702703 0.51162791 0.76
33 0.3144330 0.28378378 0.58139535 0.76
36 0.2525773 0.22972973 0.06976744 0.76
44 0.4278351 0.05405405 0.23255814 0.56
45 0.2422680 0.51351351 0.20930233 0.72
48 0.5103093 0.24324324 0.04651163 0.72
dim(test)
[1] 13 10
După obținerea seturilor de date de instruire şi de testare, se crează un
cadru de date(dataframe) separat pentru variabila „Creditabilitate”, astfel încât
rezultatele finale să poată fi comparate cu valorile reale.
## Se extrage coloana a 14-a a setului de date de antrenare,
## deoarece va fi folosit ca argument „cl” în funcția knn
target_category <- spotify[data_split,14]
target_category
[1] 1 2 1 2 4 1 3 3 3 3 3 1 3 3 2 3 4 4 4 2 1 1 4 4 2 1 4 4 4 2 2 3 2 4 4 3
2
## Se extrage coloana a 14-a dacă testați setul de date
## pentru a măsura acuratețea
test_category <- spotify[-data_split,14]
test_category
[1] 2 4 4 2 1 4 3 4 4 1 1 3 1
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 35

Pasul 4: Realizarea de predicții


În continuare, se va construi un model de învățare automată, folosind
setul de date de instruire. Pentru a utiliza algoritmul KNN pentru a construi un
model, trebuie mai întâi să instalăm pachetul „class” furnizat de R. Acest pachet
are funcția KNN.
## Se încarcă pachetul class
install.packages("class", dependencies = TRUE)
library(class)
## se rulează funcţia knn
test_pred <- knn(train,test,cl=target_category,k=5)
test_pred
[1] 1 1 3 2 3 2 3 1 1 1 1 1 4
Levels: 1 2 3 4
Din rezolvarea de mai sus, se obţin rezultatele clasificării utilizând k = 5,
unde valoarea K este determinată de cercetător.
Apoi, se compară datele reale cu datele de predicție.
df_pred = data.frame (test_category, test_pred)
df_pred
test_category test_pred
1 2 1
2 4 1
3 4 3
4 2 2
5 1 3
6 4 2
7 3 3
8 4 1
9 4 1
10 1 1
11 1 1
12 3 1
13 1 4
Putem vedea din rezultatul clasificării că există încă unele date care nu se
potrivesc.
Pasul 6: Precizia (Accuracy)
După construirea modelului, putem verifica acuratețea previziunii
folosind matricea de confuzie.
## Se crează matricea de confuzie
table <- table(test_category,test_pred)
table
test_pred
test_category 1 2 3 4
1 2 0 1 1
2 1 1 0 0
3 1 0 1 0
4 3 1 1 0
Rezultatele matricei de confuzie sunt date de:
# Se evaluează performanța modelului
install.packages("gmodels", dependencies = TRUE)
library(gmodels)
CrossTable(x=test_category, y=test_pred,prop.chisq = FALSE)
Cell Contents
|-------------------------|
36 Analiza datelor în mediul R - teorie şi aplicaţii

| N |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
Total Observations in Table: 13
| test_pred
test_category | 1 | 2 | 3 | 4 | Row Total |
--------------|-----------|-----------|-----------|-----------|-----------|
1 | 2 | 0 | 1 | 1 | 4 |
| 0.500 | 0.000 | 0.250 | 0.250 | 0.308 |
| 0.286 | 0.000 | 0.333 | 1.000 | |
| 0.154 | 0.000 | 0.077 | 0.077 | |
--------------|-----------|-----------|-----------|-----------|-----------|
2 | 1 | 1 | 0 | 0 | 2 |
| 0.500 | 0.500 | 0.000 | 0.000 | 0.154 |
| 0.143 | 0.500 | 0.000 | 0.000 | |
| 0.077 | 0.077 | 0.000 | 0.000 | |
--------------|-----------|-----------|-----------|-----------|-----------|
3 | 1 | 0 | 1 | 0 | 2 |
| 0.500 | 0.000 | 0.500 | 0.000 | 0.154 |
| 0.143 | 0.000 | 0.333 | 0.000 | |
| 0.077 | 0.000 | 0.077 | 0.000 | |
--------------|-----------|-----------|-----------|-----------|-----------|
4 | 3 | 1 | 1 | 0 | 5 |
| 0.600 | 0.200 | 0.200 | 0.000 | 0.385 |
| 0.429 | 0.500 | 0.333 | 0.000 | |
| 0.231 | 0.077 | 0.077 | 0.000 | |
--------------|-----------|-----------|-----------|-----------|-----------|
Column Total | 7 | 2 | 3 | 1 | 13 |
| 0.538 | 0.154 | 0.231 | 0.077 | |
--------------|-----------|-----------|-----------|-----------|-----------|
Verificarea preciziei
## această funcție împarte predicțiile corecte la numărul
## total de predicții care ne indică cât de precis este
## modelul
accuracy<- function(x){sum(diag(x)/(sum(rowSums(x)))) * 100}
accuracy(table)
[1] 30.76923
Datele testului au constat în 50 de observații, acest caz a obținut valoare
predictivă cu o precizie redusă.

8.6. Random Forest – ca algoritm de clasificare

Abordarea random forest este clasificarea neliniară supravegheată bayat[


pe algoritmul de regresie. Un random forest este o colecție de arbori de decizie care
specifică categoriile cu probabilitate mult mai mare. Abordarea random forest este
utilizată în cazul abordării arborilor de decizie, deoarece arborii de decizie sunt
lipsiți de acuratețe, iar arborii de decizie prezintă, de asemenea, precizie scăzută în
timpul fazei de testare datorită procesului numit supraadapare. În programarea R,
funcția randomForest() din pachetul randomForest este utilizată pentru a
crea și analiza random forest.

Random forest
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 37

Random forest este un algoritm de învățare automată care folosește o


colecție de arbori de decizie, ce oferă mai multă flexibilitate, precizie și ușurință a
accesului la ieșire. Acest algoritm domină asupra algoritmului arborilor de decizie,
deoarece arborii de decizie oferă o precizie slabă în comparație cu algoritmul
random forest. În cuvinte simple, abordarea pădurilor aleatorii crește performanța
arborilor de decizie. Este unul dintre cei mai buni algoritmi, deoarece poate utiliza
atât tehnici de clasificare, cât și tehnici de regresie. Fiind un algoritm de învățare
supravegheat, random forest folosește metoda de punere în arbori de decizie și, ca
rezultat, mărește precizia modelului de învățare.
Random forest caută cea mai bună caracteristică dintr-un subgrup aleatoriu
de caracteristici care oferă mai mult aleatoriu modelului și rezultă într-un model
mai bun și precis.
Exemplu: Presupunem că un tânăr pe nume Alex vrea să cumpere un tricou de la
un magazin. Vânzătorul îl întreabă mai întâi despre culoarea lui preferată. Acesta
constituie un arbore de decizie bazat pe caracteristica culorii. Mai mult, vânzătorul
întreabă mai multe despre tricou, care ar fi mărimea, tipul de țesătură, tipul
gulerului etc. Mai multe criterii de selectare a unui tricou vor face mai mulți arbori
de decizie în învățarea automată. Împreună, toți arborii de decizie vor constitui o
abordare random forest a selectării unui tricou pe baza multor caracteristici pe care
Alex le va avea în vedere.

Clasificarea

Clasificarea este un mod de a clasifica datele structurate sau nestructurate


în anumite categorii sau clase. Există 8 algoritmi majori de clasificare:
Logistic Regression
 Naive Bayes
 K-Nearest Neighbours
 Decision Trees
 Random Forest
 Artificial Neural Networks
 Support Vector Machine
 Stochastic Gradient Descent
Ca exemple de clasificare din lumea reală pot fi date: poșta electronică
poate fi specificată fie ca spam sau non-spam, deșeurile pot fi specificate ca deșeuri
de hârtie, deșeuri de plastic, deșeuri organice sau deșeuri electronice, o boală poate
fi determinată prin mai multe simptome, analiza sentimentelor, determinarea
genului folosind expresii faciale etc.
Implementarea abordării forestiere aleatorii pentru clasificare:
Sintaxa:
randomForest(formula, data)
unde:
formula: reprezintă formula care descrie modelul care trebuie montat
38 Analiza datelor în mediul R - teorie şi aplicaţii

data: reprezintă cadrul de date care conține variabilele din model


Aplicaţie: Se va folosi învățarea supravegheată asupra setului de date de iris
pentru a clasifica speciile de plante de iris pe baza parametrilor trecuți în funcție.
# Step 1: Instalarea şi încărcarea bibliotecilor necesare
install.packages("randomForest", dependencies = TRUE)
library(randomForest)
install.packages("caTools", dependencies = TRUE)
library(caTools)
# Step 2: Împărțirea datelor în set de antrenare şi set de
# testare 
split <- sample.split(iris, SplitRatio = 0.75)  
split
[1] TRUE TRUE TRUE FALSE FALSE
train <- subset(iris, split == "TRUE")  
test <- subset(iris, split == "FALSE")  
# Step 3: Crearea unui random forest pentru clasificare, pe
# setul de date de testare
set.seed(2020)
classifier_RF = randomForest(x = train[-5],  
y = train$Species,  
ntree = 500)  
classifier_RF
Call:
randomForest(x = train[-5], y = train$Species, ntree = 500)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 2
OOB estimate of error rate: 3.33%
Confusion matrix:
setosa versicolor virginica class.error
setosa 30 0 0 0.00000000
versicolor 0 28 2 0.06666667
virginica 0 1 29 0.03333333
Numărul de arbori este de 500 în model și numărul din variabile încercate
la fiecare împărțire sunt 2. Eroarea de clasificare în setosa este de 0,000 adică
0%, versicolor este 0,066 adică 6,6% și virginica este 0,033 adică 3,3%.
# Step 4: Prezicerea rezultatelor setului de testare
y_pred = predict(classifier_RF, newdata = test[-5])  
# Step 5: Matricea de confuzie
confusion_mtx = table(test[, 5], y_pred)  
confusion_mtx
y_pred
setosa versicolor virginica
setosa 20 0 0
versicolor 0 20 0
virginica 0 5 15
Deci, 20 de setosa sunt clasificate corect ca setosa. Din 25
versicolor, 20 versicolor sunt clasificate corect ca versicolor, iar 5
sunt clasificate ca virginica. În timp ce 15 virginica sunt clasificate corect
ca virginica.
# Step 6: Imprimarea modelului de clasificare
Capitolul 8. Învăţarea supervizată. Algoritmi de clasificare a datelor 39

plot(classifier_RF)  

Figura 8.15.

Rata de eroare este stabilizată odată cu creșterea numărului de arbori decizionali.


# Plot-ul importanţei  
importance(classifier_RF)
MeanDecreaseGini
Sepal.Length 7.097343
Sepal.Width 1.257342
Petal.Length 21.622181
Petal.Width 29.295379
Petal.Width este cea mai importantă caracteristică urmată de
Petal.Length, Sepal.Length și Sepal.Width.
# Step 7: Plot-ul variabilelor importante  
varImpPlot(classifier_RF)  
40 Analiza datelor în mediul R - teorie şi aplicaţii

Figura 8.16.

Graficul arată în mod clar Petal.Width ca cea mai importantă


caracteristică sau variabilă urmată de Petal.Length, Sepal.Length și
Sepal.Width.
Deci, random forest este un algoritm puternic folosit pentru clasificare în
practică.
Clasificatorul naiv Bayesian (Naive Bayes)

- Naive Bayes este un algoritm de clasificare neliniară supravegheată în


programarea R;
- conţine o familie de clasificatori probabilistici simpli care se bazează pe aplicarea
teoremei lui Baye cu ipoteze puternice de independență (Naive) între caracteristici
sau variabile.
- algoritmul Naive Bayes este numit „Naiv”, deoarece presupune că apariția unei
anumite caracteristici este independentă de apariția altor caracteristici.
- Naive Bayes este un algoritm utilizat pe scară largă în analiza sentimentelor,
categorizarea documentelor, filtrarea e-mailurilor de spam etc.
- algoritmul Naive Bayes se bazează pe teorema Bayes, care oferă probabilitatea
condiționată a unui eveniment A, dat fiind un alt eveniment B, adică:

unde,
P (A | B) - reprezintă probabilitatea condiționată a lui A, fiind dat B;
P (B | A) - reprezintă probabilitatea condițională a lui B, fiind dat A;
P (A) - reprezintă probabilitatea evenimentului A;
P (B) - reprezintă probabilitatea evenimentului B.
Pentru mai mulți predictori, putem formula probabilitatea posterioară după cum
urmează:

P (A | B) = P (B1 | A) * P (B2 | A) * P (B3 | A) * P (B4 | A) ...

Exemplu: Fie un spațiu eșantion: {HH, HT, TH, TT}


unde:
H: reprezintă Cap;
T: reprezntă Pajură.
P (a doua monedă este Cap = P (A | B)
prima monedă este Pajură) = P (A | B)
= [P (B | A) * P (A)] / P (B)
= [P (prima monedă este Pajură, a doua monedă este Cap) *
P (a doua monedă este Cap)] / P(prima monedă este Pajură)
= [(1/2) * (1/2)] / (1/2) = (1/2) = 0,5
Aplicaţie: Se va folosi setul de date iris, alcătuit din 50 de eșantioane din fiecare dintre
cele 3 specii de iris (setosa, virginica, versicolor) și un set de date multivariat,
introdus de statisticianul și biologul britanic Ronald Fisher în lucrarea sa din 1936, The use
of multiple measurements in taxonomic problems.
Au fost măsurate patru trăsături din fiecare eșantion, adică lungimea(length) și
lățimea(width) sepalelor și petalelor.
Pe baza combinației acestor patru trăsături, Fisher a dezvoltat un model liniar
discriminant pentru a distinge speciile una de alta.
# Loading data  
data(iris)  
# Structure  
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1
1 1 1 ...
# Installing Packages  
install.packages("e1071", dependencies = TRUE)
install.packages("caTools", dependencies = TRUE)
install.packages("caret", dependencies = TRUE)
# Loading package  
library(e1071)  
library(caTools)  
library(caret)  
# Splitting data into train  
# and test data  
split <- sample.split(iris, SplitRatio = 0.75)  
train_cl <- subset(iris, split == "TRUE")
head(train_cl)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
test_cl <- subset(iris, split == "FALSE")   
head(test_cl)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
2 4.9 3.0 1.4 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
7 4.6 3.4 1.4 0.3 setosa
10 4.9 3.1 1.5 0.1 setosa
12 4.8 3.4 1.6 0.2 setosa
15 5.8 4.0 1.2 0.2 setosa
# Feature Scaling  
train_scale <- scale(train_cl[, 1:4])
head(train_scale)
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 -0.8952157 1.0214626 -1.311477 -1.290892
3 -1.3510539 0.3487921 -1.366173 -1.290892
4 -1.4650135 0.1245686 -1.256782 -1.290892
6 -0.5533370 1.9183565 -1.147391 -1.032426
8 -1.0091752 0.7972391 -1.256782 -1.290892
9 -1.6929326 -0.3238784 -1.311477 -1.290892
test_scale <- scale(test_cl[, 1:4])  
head(test_scale)
Sepal.Length Sepal.Width Petal.Length Petal.Width
2 -1.1724769 -0.18115482 -1.368268 -1.331479
5 -1.0392409 1.23657852 -1.368268 -1.331479
7 -1.5721850 0.76400074 -1.368268 -1.198331
10 -1.1724769 0.05513407 -1.308735 -1.464627
12 -1.3057129 0.76400074 -1.249202 -1.331479
15 0.0266472 2.18173409 -1.487334 -1.331479 
# Fitting Naive Bayes Model  
# to training dataset  
# Setting Seed
set.seed(2020)  
classifier_cl <- naiveBayes(Species ~ ., data = train_cl)  
classifier_cl   
Naive Bayes Classifier for Discrete Predictors
Call:
naiveBayes.default(x = X, y = Y, laplace = laplace)
A-priori probabilities:
Y
setosa versicolor virginica
0.3333333 0.3333333 0.3333333
Conditional probabilities:
Sepal.Length
Y [,1] [,2]
setosa 4.986667 0.3812261
versicolor 5.950000 0.5556916
virginica 6.720000 0.5903827
Sepal.Width
Y [,1] [,2]
setosa 3.430000 0.3816028
versicolor 2.720000 0.3517444
virginica 2.983333 0.2730206
Petal.Length
Y [,1] [,2]
setosa 1.440000 0.1693802
versicolor 4.283333 0.5239659
virginica 5.670000 0.5784343
Petal.Width
Y [,1] [,2]
setosa 0.2366667 0.1129032
versicolor 1.3100000 0.2171127
virginica 2.0500000 0.2403302 
Probabilitatea condițională/tă pentru fiecare caracteristică sau variabilă este creată de
model separat.
Probabilitățile apriori sunt, de asemenea, calculate, ceea ce indică distribuția datelor
deţinute.
# Predicting on test data'  
y_pred <- predict(classifier_cl, newdata = test_cl)
y_pred
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa setosa setosa setosa
[19] setosa setosa versicolor versicolor versicolor versicolor
[25] versicolor versicolor versicolor versicolor versicolor versicolor
[31] versicolor versicolor versicolor versicolor versicolor versicolor
[37] versicolor versicolor versicolor versicolor virginica virginica
[43] versicolor virginica virginica virginica virginica versicolor
[49] virginica virginica virginica virginica virginica versicolor
[55] virginica virginica virginica virginica virginica virginica
Levels: setosa versicolor virginica   
# Confusion Matrix  
cm <- table(test_cl$Species, y_pred)  
cm
y_pred
setosa versicolor virginica
setosa 20 0 0
versicolor 0 20 0
virginica 0 3 17 
Deci, 20 de setosa sunt clasificate corect ca setosa. Din 23 versicolor, 20
versicolor sunt clasificate corect ca versicolor, iar 3 versicolor sunt clasificate
ca virginica. Din 17 virginica, toate 17 sunt corect clasificate ca virginica.
# Model Evauation  
confusionMatrix(cm)
Confusion Matrix and Statistics
y_pred
setosa versicolor virginica
setosa 20 0 0
versicolor 0 20 0
virginica 0 3 17
Overall Statistics
Accuracy : 0.95
95% CI : (0.8608, 0.9896)
No Information Rate : 0.3833
P-Value [Acc > NIR] : < 2.2e-16

Kappa : 0.925
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: setosa Class: versicolor Class: virginica
Sensitivity 1.0000 0.8696 1.0000
Specificity 1.0000 1.0000 0.9302
Pos Pred Value 1.0000 1.0000 0.8500
Neg Pred Value 1.0000 0.9250 1.0000
Prevalence 0.3333 0.3833 0.2833
Detection Rate 0.3333 0.3333 0.2833
Detection Prevalence 0.3333 0.3333 0.3333
Balanced Accuracy 1.0000 0.9348 0.9651 
Modelul a obținut o precizie de 95% cu o valoare p-value foarte mică(foarte aproape
de 0). Cu Sensitivity, Specificity şi Balanced accuracy, construirea
modelului se deduce că a fost una bună.
Capitolul 10
LDA (Linear Discriminant Analysis) și PCA (Principal
Component Analysis), rol în clasificare şi reducere a
dimensionalităţii datelor
Prof. dr. Stelian STANCU

Reducerea dimensionalității joacă un rol important în învățarea automată


(ML), mai ales atunci când se lucrează cu mii de caracteristici.

Figura 10.1.

10.1. LDA ca tehnică de reducere a dimensionalității și totodată un algoritm


de clasificare

LDA (Analiza Discriminant Liniară) este definită ca o tehnică de reducere


a dimensionalității, însă unele opinii susțin ideea că LDA funcționează de fapt și ca
un clasificator liniar.
Pentru a înțelege mai bine aceste definiții, ne propunem un test simplu:
- se aplică LDA pe același set de date de două ori, de fiecare dată
folosind LDA cu un rol diferit;
- se măsoară precizia din ambele abordări, pentru a avea o imagine clară
despre care rol, din cele două, funcționează cel mai bine pentru LDA.

10.1.1. Introducere în LDA

Ideea din spatele LDA este simplă. Matematic vorbind, trebuie să găsim un
nou spațiu al caracteristicilor, astfel încât prin proiectarea datelor să se maximizeze
separabilitatea claselor.
Ca urmare, primul pas este acela de a găsi o modalitate de a măsura
capacitatea de separare a fiecărui nou candidat în spațiul funcțional. Distanța dintre
mijloacele proiectate pentru fiecare clasă ar putea fi una dintre măsuri, însă numai
această distanță nu ar fi o valoare foarte bună, deoarece nu ține cont de răspândirea
datelor.
2 Analiza datelor în mediul R - teorie şi aplicaţii

În 1988, Fisher a propus următoarea soluție: maximizarea funcției care


reprezintă diferența dintre mijloace, normalizată printr-o măsură a variabilității în
cadrul clasei. Propunerea lui Fisher este, practic, maximizarea distanței dintre
media fiecărei clase și minimizarea răspândirii în cadrul clasei. Astfel, au fost
introduse două măsuri: în cadrul clasei (intraclasă) și între clase (interclase).
Introducerea celor două măsuri: intraclasă și interclase este posibilă numai
dacă se presupune că setul de date are o distribuție normală.
Această presupunere poate aduce un dezavantaj, deoarece dacă distribuția
datelor este semnificativ nongaussiană, LDA ar putea să nu funcționeze foarte bine.

Detalii despre cele două experimente

Experimentul propus în continuare constă dintr-o sarcină de clasificare pe


un set de date publice. Practic, setul de date27 conține 846 observații și 18
caracteristici din 3 tipuri diferite de vehicule. Caracteristicile corespund
măsurătorilor fizice ale formei vehiculului, cum ar fi compactitatea, circularitatea și
raza, ca să dăm doar câteva exemple. Setul de date original prezintă observații
referitoare la 4 tipuri de vehicule, urmând a culege date doar din 3 clase, pentru a
putea planifica noul spațiu al caracteristicilor.

10.1.2. Analiza discriminant liniară (LDA) – utilizarea funcţiei lda()

Analiza LDA (Linear Discriminant Analysis) poate fi făcută în R


utilizând funcția lda() din pachetul MASS. LDA este utilizată pentru a
determina mijloacele de grup și, de asemenea, pentru fiecare individ, încearcă să
calculeze probabilitatea ca individul să aparțină unui grup diferit. Prin urmare,
individul respectiv obține cel mai mare scor de probabilitate din acel grup.
Pentru a utiliza funcția lda(), trebuie instalate următoarele pachete:
- pachet MASS pentru funcția lda();
- pachetul tidyverse pentru o mai bună, ușoară manipulare și
vizualizare a datelor;
- pachetul caret pentru un flux de lucru mai bun de învățare
automată.
După instalarea acestor pachete, se pregătesc datele, în sensul că la
început trebuie împărțite datele în set de antrenare și respectiv set de testare.
În continuare, trebuie normalizate datele, prin aceasta variabilele
categoriale sunt eliminate automat. Odată ce datele sunt splitate și pregătite, se
poate începe cu Analiza Discriminant Liniară folosind funcția lda().
La început, algoritmul LDA încearcă să găsească direcțiile care pot
maximiza separarea între clase. Apoi folosește aceste direcții pentru a prezice
clasa fiecărui individ. Aceste direcții sunt cunoscute sub numele de discriminanți
liniari și sunt o combinație liniară a variabilelor predictive.

27
Puteți verifica setul de date aici: https://archive.ics.uci.edu/ml/datasets/Statlog+(Vehicle+Silhouettes)
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 3

10.1.3. Aplicarea funcției lda()pe setul de date "iris"

Înainte de a implementa analiza discriminant liniară, sunt de luat în


considerare următoarele aspecte:
- trebuie inspectate distribuțiile univariate ale fiecărei variabile.
Trebuie să existe distribuţie normală, în caz contrar, se transformă
folosind fie funcțiile log și root pentru distribuția exponențială,
fie metoda Box-Cox;
- trebuie eliminate valorile aberante și apoi se standardizează
variabilele, pentru a face scala comparabilă.
Presupunând că variabila dependentă, adică Y este discretă, LDA
presupune că predictorii sunt distribuiți normal, adică provin din distribuția
gaussiană. Diferite clase au mijloace specifice clasei și covarianță sau varianță
egală.
În pachetul MASS, există funcția lda() pentru calcularea analizei
discriminant liniară, aspect ce va fi prezentat în continuare:
Funcția lda() are următoarele elemente în ieșire:
- posibilitățile anterioare ale grupurilor, adică în fiecare grup proporția
observațiilor de formare;
- grup înseamnă, adică, centrul de greutate al grupului și este utilizat
pentru a arăta într-un grup media fiecărei variabile;
- coeficienții discriminanților liniari, adică combinația liniară a
variabilelor predictive care sunt utilizate pentru a forma regula de
decizie a LDA.
# Analiza discriminant liniară(LDA)
# Pachete necesare pentru prelucrarea datelor
install.packages("MASS", dependencies = TRUE)
library(MASS)
install.packages("tidyverse", dependencies = TRUE)
library(tidyverse)
install.packages("caret", dependencies = TRUE)
library(caret)
install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
install.packages("mvtnorm", dependencies = TRUE)
library(mvtnorm)
install.packages("dplyr", dependencies = TRUE)
library(dplyr)
theme_set(theme_classic())
# Se încarcă datele
data("iris")
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
4 Analiza datelor în mediul R - teorie şi aplicaţii

6 5.4 3.9 1.7 0.4 setosa


# Se splitează datele în set de antrenare(75%) și set de
# testare (25%)
set.seed(2021)
training <- iris$Species %>%
createDataPartition(p = 0.75, list = FALSE)
train <- iris[training, ]
train
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
11 5.4 3.7 1.5 0.2 setosa
12 4.8 3.4 1.6 0.2 setosa
15 5.8 4.0 1.2 0.2 setosa
16 5.7 4.4 1.5 0.4 setosa
17 5.4 3.9 1.3 0.4 setosa
18 5.1 3.5 1.4 0.3 setosa
19 5.7 3.8 1.7 0.3 setosa
20 5.1 3.8 1.5 0.3 setosa
21 5.4 3.4 1.7 0.2 setosa
22 5.1 3.7 1.5 0.4 setosa
23 4.6 3.6 1.0 0.2 setosa
24 5.1 3.3 1.7 0.5 setosa
26 5.0 3.0 1.6 0.2 setosa
27 5.0 3.4 1.6 0.4 setosa
30 4.7 3.2 1.6 0.2 setosa
31 4.8 3.1 1.6 0.2 setosa
35 4.9 3.1 1.5 0.2 setosa
36 5.0 3.2 1.2 0.2 setosa
38 4.9 3.6 1.4 0.1 setosa
39 4.4 3.0 1.3 0.2 setosa
40 5.1 3.4 1.5 0.2 setosa
42 4.5 2.3 1.3 0.3 setosa
43 4.4 3.2 1.3 0.2 setosa
44 5.0 3.5 1.6 0.6 setosa
45 5.1 3.8 1.9 0.4 setosa
46 4.8 3.0 1.4 0.3 setosa
47 5.1 3.8 1.6 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
49 5.3 3.7 1.5 0.2 setosa
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
53 6.9 3.1 4.9 1.5 versicolor
54 5.5 2.3 4.0 1.3 versicolor
55 6.5 2.8 4.6 1.5 versicolor
56 5.7 2.8 4.5 1.3 versicolor
57 6.3 3.3 4.7 1.6 versicolor
58 4.9 2.4 3.3 1.0 versicolor
59 6.6 2.9 4.6 1.3 versicolor
60 5.2 2.7 3.9 1.4 versicolor
61 5.0 2.0 3.5 1.0 versicolor
62 5.9 3.0 4.2 1.5 versicolor
63 6.0 2.2 4.0 1.0 versicolor
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 5

64 6.1 2.9 4.7 1.4 versicolor


65 5.6 2.9 3.6 1.3 versicolor
66 6.7 3.1 4.4 1.4 versicolor
67 5.6 3.0 4.5 1.5 versicolor
68 5.8 2.7 4.1 1.0 versicolor
69 6.2 2.2 4.5 1.5 versicolor
70 5.6 2.5 3.9 1.1 versicolor
72 6.1 2.8 4.0 1.3 versicolor
74 6.1 2.8 4.7 1.2 versicolor
75 6.4 2.9 4.3 1.3 versicolor
77 6.8 2.8 4.8 1.4 versicolor
79 6.0 2.9 4.5 1.5 versicolor
80 5.7 2.6 3.5 1.0 versicolor
81 5.5 2.4 3.8 1.1 versicolor
82 5.5 2.4 3.7 1.0 versicolor
85 5.4 3.0 4.5 1.5 versicolor
87 6.7 3.1 4.7 1.5 versicolor
88 6.3 2.3 4.4 1.3 versicolor
90 5.5 2.5 4.0 1.3 versicolor
92 6.1 3.0 4.6 1.4 versicolor
94 5.0 2.3 3.3 1.0 versicolor
96 5.7 3.0 4.2 1.2 versicolor
98 6.2 2.9 4.3 1.3 versicolor
99 5.1 2.5 3.0 1.1 versicolor
100 5.7 2.8 4.1 1.3 versicolor
101 6.3 3.3 6.0 2.5 virginica
103 7.1 3.0 5.9 2.1 virginica
104 6.3 2.9 5.6 1.8 virginica
105 6.5 3.0 5.8 2.2 virginica
107 4.9 2.5 4.5 1.7 virginica
109 6.7 2.5 5.8 1.8 virginica
110 7.2 3.6 6.1 2.5 virginica
111 6.5 3.2 5.1 2.0 virginica
112 6.4 2.7 5.3 1.9 virginica
113 6.8 3.0 5.5 2.1 virginica
114 5.7 2.5 5.0 2.0 virginica
115 5.8 2.8 5.1 2.4 virginica
116 6.4 3.2 5.3 2.3 virginica
117 6.5 3.0 5.5 1.8 virginica
118 7.7 3.8 6.7 2.2 virginica
119 7.7 2.6 6.9 2.3 virginica
120 6.0 2.2 5.0 1.5 virginica
121 6.9 3.2 5.7 2.3 virginica
122 5.6 2.8 4.9 2.0 virginica
123 7.7 2.8 6.7 2.0 virginica
124 6.3 2.7 4.9 1.8 virginica
125 6.7 3.3 5.7 2.1 virginica
126 7.2 3.2 6.0 1.8 virginica
129 6.4 2.8 5.6 2.1 virginica
130 7.2 3.0 5.8 1.6 virginica
132 7.9 3.8 6.4 2.0 virginica
136 7.7 3.0 6.1 2.3 virginica
137 6.3 3.4 5.6 2.4 virginica
138 6.4 3.1 5.5 1.8 virginica
141 6.7 3.1 5.6 2.4 virginica
142 6.9 3.1 5.1 2.3 virginica
143 5.8 2.7 5.1 1.9 virginica
144 6.8 3.2 5.9 2.3 virginica
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
149 6.2 3.4 5.4 2.3 virginica
6 Analiza datelor în mediul R - teorie şi aplicaţii

150 5.9 3.0 5.1 1.8 virginica


test <- iris[-training, ]
test
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
10 4.9 3.1 1.5 0.1 setosa
13 4.8 3.0 1.4 0.1 setosa
14 4.3 3.0 1.1 0.1 setosa
25 4.8 3.4 1.9 0.2 setosa
28 5.2 3.5 1.5 0.2 setosa
29 5.2 3.4 1.4 0.2 setosa
32 5.4 3.4 1.5 0.4 setosa
33 5.2 4.1 1.5 0.1 setosa
34 5.5 4.2 1.4 0.2 setosa
37 5.5 3.5 1.3 0.2 setosa
41 5.0 3.5 1.3 0.3 setosa
50 5.0 3.3 1.4 0.2 setosa
71 5.9 3.2 4.8 1.8 versicolor
73 6.3 2.5 4.9 1.5 versicolor
76 6.6 3.0 4.4 1.4 versicolor
78 6.7 3.0 5.0 1.7 versicolor
83 5.8 2.7 3.9 1.2 versicolor
84 6.0 2.7 5.1 1.6 versicolor
86 6.0 3.4 4.5 1.6 versicolor
89 5.6 3.0 4.1 1.3 versicolor
91 5.5 2.6 4.4 1.2 versicolor
93 5.8 2.6 4.0 1.2 versicolor
95 5.6 2.7 4.2 1.3 versicolor
97 5.7 2.9 4.2 1.3 versicolor
102 5.8 2.7 5.1 1.9 virginica
106 7.6 3.0 6.6 2.1 virginica
108 7.3 2.9 6.3 1.8 virginica
127 6.2 2.8 4.8 1.8 virginica
128 6.1 3.0 4.9 1.8 virginica
131 7.4 2.8 6.1 1.9 virginica
133 6.4 2.8 5.6 2.2 virginica
134 6.3 2.8 5.1 1.5 virginica
135 6.1 2.6 5.6 1.4 virginica
139 6.0 3.0 4.8 1.8 virginica
140 6.9 3.1 5.4 2.1 virginica
148 6.5 3.0 5.2 2.0 virginica
# Se estimează parametrii de preprocesare
preprocesare.parametri <- train %>%
preProcess(method = c("center", "scale"))
preprocesare.parametri
Created from 114 samples and 5 variables
Pre-processing:
- centered (4)
- ignored (1)
- scaled (4)
# Se transformă datele folosind parametrii estimați
train.transform <- preprocesare.parametri %>% predict(train)
train.transform
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 -0.86804612 0.98424506 -1.33011430 -1.31108271 setosa
2 -1.10309899 -0.12448949 -1.33011430 -1.31108271 setosa
3 -1.33815186 0.31900433 -1.38671491 -1.31108271 setosa
4 -1.45567829 0.09725742 -1.27351369 -1.31108271 setosa
5 -0.98557255 1.20599197 -1.33011430 -1.31108271 setosa
6 -0.51546682 1.87123270 -1.16031248 -1.05204731 setosa
7 -1.45567829 0.76249815 -1.33011430 -1.18156501 setosa
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 7

8 -0.98557255 0.76249815 -1.27351369 -1.31108271 setosa


9 -1.69073116 -0.34623640 -1.33011430 -1.31108271 setosa
11 -0.51546682 1.42773888 -1.27351369 -1.31108271 setosa
12 -1.22062542 0.76249815 -1.21691308 -1.31108271 setosa
15 -0.04536108 2.09297962 -1.44331552 -1.31108271 setosa
16 -0.16288751 2.97996726 -1.27351369 -1.05204731 setosa
17 -0.51546682 1.87123270 -1.38671491 -1.05204731 setosa
18 -0.86804612 0.98424506 -1.33011430 -1.18156501 setosa
19 -0.16288751 1.64948579 -1.16031248 -1.18156501 setosa
20 -0.86804612 1.64948579 -1.27351369 -1.18156501 setosa
21 -0.51546682 0.76249815 -1.16031248 -1.31108271 setosa
22 -0.86804612 1.42773888 -1.27351369 -1.05204731 setosa
23 -1.45567829 1.20599197 -1.55651674 -1.31108271 setosa
24 -0.86804612 0.54075124 -1.16031248 -0.92252960 setosa
26 -0.98557255 -0.12448949 -1.21691308 -1.31108271 setosa
27 -0.98557255 0.76249815 -1.21691308 -1.05204731 setosa
30 -1.33815186 0.31900433 -1.21691308 -1.31108271 setosa
31 -1.22062542 0.09725742 -1.21691308 -1.31108271 setosa
35 -1.10309899 0.09725742 -1.27351369 -1.31108271 setosa
36 -0.98557255 0.31900433 -1.44331552 -1.31108271 setosa
38 -1.10309899 1.20599197 -1.33011430 -1.44060042 setosa
39 -1.69073116 -0.12448949 -1.38671491 -1.31108271 setosa
40 -0.86804612 0.76249815 -1.27351369 -1.31108271 setosa
42 -1.57320472 -1.67671787 -1.38671491 -1.18156501 setosa
43 -1.69073116 0.31900433 -1.38671491 -1.31108271 setosa
44 -0.98557255 0.98424506 -1.21691308 -0.79301190 setosa
45 -0.86804612 1.64948579 -1.04711126 -1.05204731 setosa
46 -1.22062542 -0.12448949 -1.33011430 -1.18156501 setosa
47 -0.86804612 1.64948579 -1.21691308 -1.31108271 setosa
48 -1.45567829 0.31900433 -1.33011430 -1.31108271 setosa
49 -0.63299325 1.42773888 -1.27351369 -1.31108271 setosa
51 1.36495613 0.31900433 0.53770578 0.24312972 versicolor
52 0.65979753 0.31900433 0.42450456 0.37264743 versicolor
53 1.24742970 0.09725742 0.65090700 0.37264743 versicolor
54 -0.39794038 -1.67671787 0.14150152 0.11361202 versicolor
55 0.77732396 -0.56798332 0.48110517 0.37264743 versicolor
56 -0.16288751 -0.56798332 0.42450456 0.11361202 versicolor
57 0.54227109 0.54075124 0.53770578 0.50216513 versicolor
58 -1.10309899 -1.45497096 -0.25470274 -0.27494109 versicolor
59 0.89485039 -0.34623640 0.48110517 0.11361202 versicolor
60 -0.75051969 -0.78973023 0.08490091 0.24312972 versicolor
61 -0.98557255 -2.34195860 -0.14150152 -0.27494109 versicolor
62 0.07216535 -0.12448949 0.25470274 0.37264743 versicolor
63 0.18969179 -1.89846478 0.14150152 -0.27494109 versicolor
64 0.30721822 -0.34623640 0.53770578 0.24312972 versicolor
65 -0.28041395 -0.34623640 -0.08490091 0.11361202 versicolor
66 1.01237683 0.09725742 0.36790396 0.24312972 versicolor
67 -0.28041395 -0.12448949 0.42450456 0.37264743 versicolor
68 -0.04536108 -0.78973023 0.19810213 -0.27494109 versicolor
69 0.42474466 -1.89846478 0.42450456 0.37264743 versicolor
70 -0.28041395 -1.23322405 0.08490091 -0.14542339 versicolor
72 0.30721822 -0.56798332 0.14150152 0.11361202 versicolor
74 0.30721822 -0.56798332 0.53770578 -0.01590568 versicolor
75 0.65979753 -0.34623640 0.31130335 0.11361202 versicolor
77 1.12990326 -0.56798332 0.59430639 0.24312972 versicolor
79 0.18969179 -0.34623640 0.42450456 0.37264743 versicolor
80 -0.16288751 -1.01147714 -0.14150152 -0.27494109 versicolor
81 -0.39794038 -1.45497096 0.02830030 -0.14542339 versicolor
82 -0.39794038 -1.45497096 -0.02830030 -0.27494109 versicolor
85 -0.51546682 -0.12448949 0.42450456 0.37264743 versicolor
87 1.01237683 0.09725742 0.53770578 0.37264743 versicolor
88 0.54227109 -1.67671787 0.36790396 0.11361202 versicolor
8 Analiza datelor în mediul R - teorie şi aplicaţii

90 -0.39794038 -1.23322405 0.14150152 0.11361202 versicolor


92 0.30721822 -0.12448949 0.48110517 0.24312972 versicolor
94 -0.98557255 -1.67671787 -0.25470274 -0.27494109 versicolor
96 -0.16288751 -0.12448949 0.25470274 -0.01590568 versicolor
98 0.42474466 -0.34623640 0.31130335 0.11361202 versicolor
99 -0.86804612 -1.23322405 -0.42450456 -0.14542339 versicolor
100 -0.16288751 -0.56798332 0.19810213 0.11361202 versicolor
101 0.54227109 0.54075124 1.27351369 1.66782446 virginica
103 1.48248256 -0.12448949 1.21691308 1.14975364 virginica
104 0.54227109 -0.34623640 1.04711126 0.76120054 virginica
105 0.77732396 -0.12448949 1.16031248 1.27927135 virginica
107 -1.10309899 -1.23322405 0.42450456 0.63168283 virginica
109 1.01237683 -1.23322405 1.16031248 0.76120054 virginica
110 1.60000900 1.20599197 1.33011430 1.66782446 virginica
111 0.77732396 0.31900433 0.76410822 1.02023594 virginica
112 0.65979753 -0.78973023 0.87730943 0.89071824 virginica
113 1.12990326 -0.12448949 0.99051065 1.14975364 virginica
114 -0.16288751 -1.23322405 0.70750761 1.02023594 virginica
115 -0.04536108 -0.56798332 0.76410822 1.53830675 virginica
116 0.65979753 0.31900433 0.87730943 1.40878905 virginica
117 0.77732396 -0.12448949 0.99051065 0.76120054 virginica
118 2.18764117 1.64948579 1.66971795 1.27927135 virginica
119 2.18764117 -1.01147714 1.78291917 1.40878905 virginica
120 0.18969179 -1.89846478 0.70750761 0.37264743 virginica
121 1.24742970 0.31900433 1.10371187 1.40878905 virginica
122 -0.28041395 -0.56798332 0.65090700 1.02023594 virginica
123 2.18764117 -0.56798332 1.66971795 1.02023594 virginica
124 0.54227109 -0.78973023 0.65090700 0.76120054 virginica
125 1.01237683 0.54075124 1.10371187 1.14975364 virginica
126 1.60000900 0.31900433 1.27351369 0.76120054 virginica
129 0.65979753 -0.56798332 1.04711126 1.14975364 virginica
130 1.60000900 -0.12448949 1.16031248 0.50216513 virginica
132 2.42269404 1.64948579 1.49991613 1.02023594 virginica
136 2.18764117 -0.12448949 1.33011430 1.40878905 virginica
137 0.54227109 0.76249815 1.04711126 1.53830675 virginica
138 0.65979753 0.09725742 0.99051065 0.76120054 virginica
141 1.01237683 0.09725742 1.04711126 1.53830675 virginica
142 1.24742970 0.09725742 0.76410822 1.40878905 virginica
143 -0.04536108 -0.78973023 0.76410822 0.89071824 virginica
144 1.12990326 0.31900433 1.21691308 1.40878905 virginica
145 1.01237683 0.54075124 1.10371187 1.66782446 virginica
146 1.01237683 -0.12448949 0.82070882 1.40878905 virginica
147 0.54227109 -1.23322405 0.70750761 0.89071824 virginica
149 0.42474466 0.76249815 0.93391004 1.40878905 virginica
150 0.07216535 -0.12448949 0.76410822 0.76120054 virginica
test.transform <- preprocesare.parametri %>% predict(test)
test.transform
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
10 -1.10309899 0.09725742 -1.27351369 -1.44060042 setosa
13 -1.22062542 -0.12448949 -1.33011430 -1.44060042 setosa
14 -1.80825759 -0.12448949 -1.49991613 -1.44060042 setosa
25 -1.22062542 0.76249815 -1.04711126 -1.31108271 setosa
28 -0.75051969 0.98424506 -1.27351369 -1.31108271 setosa
29 -0.75051969 0.76249815 -1.33011430 -1.31108271 setosa
32 -0.51546682 0.76249815 -1.27351369 -1.05204731 setosa
33 -0.75051969 2.31472653 -1.27351369 -1.44060042 setosa
34 -0.39794038 2.53647344 -1.33011430 -1.31108271 setosa
37 -0.39794038 0.98424506 -1.38671491 -1.31108271 setosa
41 -0.98557255 0.98424506 -1.38671491 -1.18156501 setosa
50 -0.98557255 0.54075124 -1.33011430 -1.31108271 setosa
71 0.07216535 0.31900433 0.59430639 0.76120054 versicolor
73 0.54227109 -1.23322405 0.65090700 0.37264743 versicolor
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 9

76 0.89485039 -0.12448949 0.36790396 0.24312972 versicolor


78 1.01237683 -0.12448949 0.70750761 0.63168283 versicolor
83 -0.04536108 -0.78973023 0.08490091 -0.01590568 versicolor
84 0.18969179 -0.78973023 0.76410822 0.50216513 versicolor
86 0.18969179 0.76249815 0.42450456 0.50216513 versicolor
89 -0.28041395 -0.12448949 0.19810213 0.11361202 versicolor
91 -0.39794038 -1.01147714 0.36790396 -0.01590568 versicolor
93 -0.04536108 -1.01147714 0.14150152 -0.01590568 versicolor
95 -0.28041395 -0.78973023 0.25470274 0.11361202 versicolor
97 -0.16288751 -0.34623640 0.25470274 0.11361202 versicolor
102 -0.04536108 -0.78973023 0.76410822 0.89071824 virginica
106 2.07011474 -0.12448949 1.61311734 1.14975364 virginica
108 1.71753543 -0.34623640 1.44331552 0.76120054 virginica
127 0.42474466 -0.56798332 0.59430639 0.76120054 virginica
128 0.30721822 -0.12448949 0.65090700 0.76120054 virginica
131 1.83506187 -0.56798332 1.33011430 0.89071824 virginica
133 0.65979753 -0.56798332 1.04711126 1.27927135 virginica
134 0.54227109 -0.56798332 0.76410822 0.37264743 virginica
135 0.30721822 -1.01147714 1.04711126 0.24312972 virginica
139 0.18969179 -0.12448949 0.59430639 0.76120054 virginica
140 1.24742970 0.09725742 0.93391004 1.14975364 virginica
148 0.77732396 -0.12448949 0.82070882 1.02023594 virginica
# Construirea modelului
model <- lda(Species~., data = train.transform)
model
Call:
lda(Species ~ ., data = train.transform)
Prior probabilities of groups:
setosa versicolor virginica
0.3333333 0.3333333 0.3333333
Group means:
Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa -1.0010366 0.8091817 -1.2898981 -1.2292821
versicolor 0.1061862 -0.6963631 0.2532132 0.1067953
virginica 0.8948504 -0.1128186 1.0366848 1.1224868
Coefficients of linear discriminants:
LD1 LD2
Sepal.Length 0.7805465 -0.1639997
Sepal.Width 0.7032728 0.9572818
Petal.Length -4.1964746 -1.7934728
Petal.Width -2.3047392 2.4159796
Proportion of trace:
LD1 LD2
0.9888 0.0112
# Efectuarea de predictii
predictions <- model %>% predict(test.transform)
predictions
$class
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] virginica versicolor versicolor versicolor versicolor virginica
[19] versicolor versicolor versicolor versicolor versicolor versicolor
[25] virginica virginica virginica virginica virginica virginica
[31] virginica versicolor virginica virginica virginica virginica
Levels: setosa versicolor virginica
$posterior
setosa versicolor virginica
10 1.000000e+00 2.293457e-20 1.241296e-44
13 1.000000e+00 2.816418e-20 1.395294e-44
14 1.000000e+00 1.486888e-21 4.140633e-46
25 1.000000e+00 5.895676e-17 4.067580e-39
10 Analiza datelor în mediul R - teorie şi aplicaţii

28 1.000000e+00 1.821714e-23 3.178978e-48


29 1.000000e+00 9.353997e-24 9.520132e-49
32 1.000000e+00 3.037182e-21 1.268724e-44
33 1.000000e+00 3.545654e-29 8.731894e-56
34 1.000000e+00 4.956191e-31 5.149541e-58
37 1.000000e+00 1.024473e-26 7.011350e-53
41 1.000000e+00 1.023050e-23 4.182892e-48
50 1.000000e+00 3.132196e-22 1.176139e-46
71 5.668190e-31 1.738714e-01 8.261286e-01
73 7.252786e-32 8.789179e-01 1.210821e-01
76 1.908586e-20 9.999933e-01 6.742108e-06
78 7.662945e-30 7.666036e-01 2.333964e-01
83 2.789046e-18 9.999998e-01 1.896266e-07
84 1.151401e-35 9.239607e-02 9.076039e-01
86 6.437792e-23 9.979805e-01 2.019471e-03
89 5.897013e-20 9.999942e-01 5.751607e-06
91 1.807520e-25 9.998773e-01 1.226680e-04
93 4.178566e-20 9.999993e-01 7.294709e-07
95 2.577743e-23 9.999504e-01 4.963940e-05
97 2.112953e-21 9.999859e-01 1.409774e-05
102 1.753412e-42 1.673153e-04 9.998327e-01
106 4.043479e-55 3.418287e-08 1.000000e+00
108 1.124011e-47 2.469748e-05 9.999753e-01
127 5.282604e-33 1.391405e-01 8.608595e-01
128 3.938846e-33 8.254191e-02 9.174581e-01
131 5.151555e-47 2.720450e-05 9.999728e-01
133 3.890925e-51 1.357433e-07 9.999999e-01
134 1.002601e-31 7.871636e-01 2.128364e-01
135 1.558998e-39 3.621900e-02 9.637810e-01
139 2.919381e-32 1.283306e-01 8.716694e-01
140 1.341746e-40 1.797259e-04 9.998203e-01
148 5.289213e-39 8.179039e-04 9.991821e-01
$x
LD1 LD2
10 7.8718546 -0.92243840
13 7.8616942 -1.01392673
14 8.1155890 -0.61302026
25 6.9993689 -0.35947570
28 8.4723489 0.18174796
29 8.5539233 0.07098532
32 7.9028609 0.55674932
33 9.7065448 1.14248156
34 10.0767164 1.71135671
37 9.2225994 0.32694835
41 8.4654207 0.73623200
50 8.2145051 -0.10274035
71 -3.9676849 1.06671459
73 -4.0343949 -1.53655067
76 -1.4933280 -0.33835603
78 -3.7222448 -0.02796385
83 -0.9104283 -0.93925046
84 -4.7712529 -0.94429035
86 -2.2544748 1.15069955
89 -1.3996028 -0.15399017
91 -2.5291965 -1.60126008
93 -1.3038999 -1.25303640
95 -2.1049715 -0.89232468
97 -1.7013396 -0.48705041
102 -5.8502362 0.03299464
106 -7.8910176 -0.57397046
108 -6.7140880 -1.36262327
127 -4.3162747 0.15979453
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 11

128 -4.3336354 0.50210576


131 -6.6017603 -1.07823644
133 -7.2270072 0.56080124
134 -4.0415953 -1.10275111
135 -5.4260727 -2.30922145
139 -4.1878472 0.62289171
140 -5.5269367 0.99136375
148 -5.2762741 0.74629785
# Precizia modelului
mean(predictions$class==test.transform$Species)
[1] 0.9166667
model <- lda(Species~., data = train.transform)
model
Call:
lda(Species ~ ., data = train.transform)
Prior probabilities of groups:
setosa versicolor virginica
0.3333333 0.3333333 0.3333333
Group means:
Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa -1.0010366 0.8091817 -1.2898981 -1.2292821
versicolor 0.1061862 -0.6963631 0.2532132 0.1067953
virginica 0.8948504 -0.1128186 1.0366848 1.1224868

Coefficients of linear discriminants:


LD1 LD2
Sepal.Length 0.7805465 -0.1639997
Sepal.Width 0.7032728 0.9572818
Petal.Length -4.1964746 -1.7934728
Petal.Width -2.3047392 2.4159796
Proportion of trace:
LD1 LD2
0.9888 0.0112
Aplicații ale LDA:
- în sistemul de recunoaștere a feței, LDA este utilizat pentru a genera
un număr mai redus și mai ușor de gestionat înainte de clasificare.
- în sistemul de identificare a clienților, LDA ajută la identificarea și
alegerea caracteristicilor care pot fi utilizate pentru a descrie
caracteristicile unui grup de clienți care pot cumpăra un anumit
articol sau produs dintr-un centru comercial.
- în domeniul științei medicale, LDA ajută la identificarea
caracteristicilor diferitelor boli și la clasificarea acestora ca ușoare
sau moderate sau severe pe baza simptomelor pacientului.

Reprezentarea grafică a ieșirii

Vom aborda reprezentarea grafică pe două seturi de date fictive. Pentru


aceasta, vom folosi funcția ggplot() din pachetul ggplot2 pentru a trasa
rezultatele sau rezultatele obținute din lda().
Exemplu:
# Reprezentarea grafică a ieșirii
library(ggplot2)
library(MASS)
12 Analiza datelor în mediul R - teorie şi aplicaţii

library(mvtnorm)
# Matricea de covarianță pentru un eșantion gaussian
# bivariat aleatoriu
var_covar = matrix(data = c(1.5, 0.4, 0.4, 1.5), nrow = 2)
var_covar
[,1] [,2]
[1,] 1.5 0.4
[2,] 0.4 1.5
# Eșantioane gaussiene bivariate aleatorii pentru clasa X1
X1 <- rmvnorm(400, mean = c(5, 5), sigma = var_covar)
head(X1)
[,1] [,2]
[1,] 3.788421 3.323329
[2,] 5.392619 4.199976
[3,] 5.289240 4.534126
[4,] 5.618388 4.613576
[5,] 3.540396 5.072415
[6,] 6.989838 5.449686
# Eșantioane gaussiene bivariate aleatorii pentru clasa X2
X2 <- rmvnorm(600, mean = c(3, 3), sigma = var_covar)
head(X2)
[,1] [,2]
[1,] 3.009785 3.377403
[2,] 3.168620 3.383941
[3,] 3.701800 3.338689
[4,] 4.137066 4.700223
[5,] 3.048850 3.815695
[6,] 3.226221 2.207136
# Exemple pentru variabila dependentă
Y <- c(rep(1, 400), rep(-1, 600))
head(Y)
[1] 1 1 1 1 1 1
# Combinarea variabilelor independente și dependentă într-un
# cadru de date
dataset <- as.data.frame(cbind(rbind(X1, X2), Y))
head(dataset)
V1 V2 Y
1 3.788421 3.323329 1
2 5.392619 4.199976 1
3 5.289240 4.534126 1
4 5.618388 4.613576 1
5 3.540396 5.072415 1
6 6.989838 5.449686 1
colnames(dataset) <- c("X1", "X2", "Y")
dataset$Y <- as.character(dataset$Y)
head(dataset$Y)
[1] "1" "1" "1" "1" "1" "1"
# Trasarea eşantioanelor de mai sus și colorarea după
# etichetele clasei
ggplot(data = dataset) + geom_point(aes(X1, X2, color = Y))
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 13

Figura 10.2.

10.1.4. LDA ca algoritm de clasificare

Așa cum am menționat anterior, vom aplica LDA pe același set de date de
două ori, dar cu rol diferit de fiecare dată. În prima abordare, LDA va funcționa ca
și clasificator și apoi se va reduce dimensionalitatea setului de date, pentru ca în a
doua abordare, să se apeleze la o rețea neuronală care va avea rolul de clasificare,
rezultatele ambelor abordări urmând a fi comparate ulterior.
În limbajul R, LDA ca și clasificator presupune după cum urmează:
- prezentarea prin linii de cod R a modului de încărcare a setului de date
https://archive.ics.uci.edu/ml/datasets/Statlog+(Vehicle+Silhouettes) și
filtrarea doar a liniilor din clasele bus, opel și van.
library(dplyr)
data_raw = read.csv(/"../dataset vehicle.csv", stringsAsFactor =
FALSE )
#data = data_raw
data = data_raw %>% filter( class == "bus" | class == "opel" |
class == "van" )
- liniile de cod R pentru scalarea setului de date, utilizând tehnica
standard:
print( "... scaling dataset ..." )
maxs = apply( data[,1:18], 2, max )
mins = apply( data[,1:18], 2, min )
14 Analiza datelor în mediul R - teorie şi aplicaţii

dataset = as.data.frame( scale( data[,1:18], center = mins,


scale = maxs - mins ) )
dataset = cbind( dataset, "class" = data$class )
- liniile de cod R pentru împărțirea setului de date în set de
antrenare/instruire și respectiv set de testare/validare, cu proporția din
datele deținute de 60% pentru antrenare/instruire, respectiv 40% pentru
testare/validare.
index = sample(1:nrow(dataset),round(nrow(dataset)*0.6) ,replace
= FALSE )
X_train = dataset[ index, ]
test = dataset[ -index, ]
- întrucât în aplicațiile viitoare, se va lucra cu pachetul MASS, se va trece
la instalarea lui:
library(MASS)
- pe baza datelor deținute, folosind biblioteca MASS din R, se va aplica
LDA pe setul de date de instruire/antrenare:
model = lda( class ~ ., data = X_train )
LDA este modelată folosind biblioteca MASS din R, aducând un cuplu de
parametri de model, cum ar fi probabilitățile anterioare ale grupurilor, mediile de
grup și coeficienții de discriminare liniară. Cel mai important rezultat sunt totuși
coeficienții, adică acele valori care descriu noul spațiu de caracteristici în care vor
fi proiectate datele.
- se reprezintă grafic LDA:
projected_data = as.matrix( X_train[, 1:18] ) %*% model$scaling
plot( projected_data, col = X_train[,19], pch = 19 )
LDA reduce dimensionalitatea de la numărul inițial de caracteristici, n, la n
- 1, unde C este numărul de clase. În acest caz, avem 3 clase, prin urmare, noul
spațiu al caracteristicilor va avea doar 2 caracteristici. Imaginea sugerată mai sus
este figura noului spațiu de caracteristici. Cu cele două caracteristici, putem vedea
noua poziție a datelor, existând câteva puncte care se suprapun între cele trei clase,
dar, în general, setul de date este destul de separabil.
- se scriu liniile de cod R pentru testarea modelului, la nivelul LDA:
X_test = test[, !( names( test ) %in% c( "class" ) ) ]
model.results = predict( model, X_test )
- se scriu liniile de cod R pentru măsurarea exactității(accuracy)
modelului obținut, la nivelul LDA:
# Results - Confusion Matrix
library(caret)
t = table( model.results$class, test$class )
print( confusionMatrix( t ) )
Ultima parte a acestei prime abordări a constat în aplicarea modelului de
testare, la nivelul LDA și totodată în măsurarea rezultatelor acestuia. După cum se
poate observa, LDA a atins aproximativ 95% din precizia de clasificator, ceea ce
este un rezultat foarte bun. LDA proiectează practic datele într-un nou spațiu de
caracteristici liniare, în mod evident clasificatorul va atinge o precizie ridicată dacă
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 15

datele sunt liniar separabile. Acum că am constatat gradul de exactitate al


funcționării LDA ca și clasificator, vom trece să verificăm a doua abordare.

10.1.5. LDA ca tehnică de reducere a dimensionalității

Analiza discriminant liniară funcționează, de asemenea, ca o tehnică de


reducere a dimensionalității, însemnând că reduce numărul de dimensiuni de la
numărul iniţial, la numărul de caracteristici n - 1 în care n este numărul de clase. În
acest exemplu, avem 3 clase și 18 caracteristici, LDA va reduce numărul de
caracteristici de la 18 caracteristici la doar 2 caracteristici. După reducere va fi
aplicată sarcina de clasificare, cu ajutorul modelului bazat pe rețel neuronale,
procedura fiind aproape aceeași cu cea anterioară. În limbajul R, LDA ca tehnică
de reducere a dimensionalității presupune după cum urmează:
- scrierea liniilor de cod R ce vor permite folosirea coeficienților de
discriminare liniară deja definiți în faza de antrenare/instruire
anterioară, pentru a proiecta setul de date de antrenare/instruire în noul
spațiu de caracteristici, acest nou spațiu va fi noul set de date de
antrenare/instruire:
new_X_train = as.matrix( X_train[,1:18] ) %*% model$scaling
new_X_train = as.data.frame( new_X_train )
new_X_train$class = X_train$class
- scrierea liniilor de cod R, în contextual unei probleme de clasificare cu
mai multe clase, ce vor permite folosirea coeficienților de discriminare
liniară deja definiți anterior, dar separat pentru liniile din clasele bus,
opel și van:
# Multi-Class -> Transforming The Labels
print( "... transforming labels ..." )
new_X_train = cbind( new_X_train, bus = new_X_train$class ==
"bus" )
new_X_train = cbind( new_X_train, opel = new_X_train$class ==
"opel" )
new_X_train = cbind( new_X_train, van = new_X_train$class ==
"van" )
new_X_train = new_X_train[, !( names( new_X_train ) %in% c(
"class" ) ) ]
- scrierea liniilor de cod R care să transforme setul de date, pentru a putea
folosi modelul de rețea neuronală ca o problemă de clasificare cu mai
multe clase. Modificarea constă în crearea de noi coloane pentru fiecare
etichetă cu valorile True sau False. De exemplu, toate exemplele de la opel
vor primi valoarea True sub coloana opel și False în coloanele cu etichete
altfel. Prin urmare, setul de date este pregătit pentru modelul cu mai multe
clase:
library(neuralnet)
n = names(new_X_train)
f = as.formula( "opel+van+bus ~ LD1+LD2" )
16 Analiza datelor în mediul R - teorie şi aplicaţii

nn = neuralnet( f, new_X_train, hidden = 3, linear.output =


FALSE, lifesign = "full", threshold = 0.02, stepmax = 1e6 )
Modelul de rețea neuronală obținut este foarte simplu, având doar 3 straturi
ascunse, pragul de eroare medie pătrată de 0,02 și numărul maxim de epoci este 1e6.
- reprezintarea grafică a rețelei:
projected_data = as.matrix( X_train[, 1:18] ) %*% model$scaling
plot(projected_data, col = X_train[,19], pch = 19 )
- scrierea liniilor de cod R care să aplice rețeaua neuronală pe noul set de
date (adică cel de testare) și să se verifice dacă se pot obține rezultate mai
bune.
Observație: Setul de date de testare va fi același utilizat în abordarea
anterioară.
X_test = as.matrix( test[,1:18] ) %*% model$scaling
nn.results = compute( nn, X_test )
- scrierea liniilor de cod R care să pună în evidență rezultatele aplicării
modelului:
print( "... resulting ..." )
idx = apply( nn.results$net.result, c(1), function( x ){
which( x == max( x ) ) } )
- scrierea liniilor de cod R care să pună în evidență predicția pe baza
modelului realizat:
predictions = c( "opel", "van", "bus")[idx]
- scrierea liniilor de cod R care să pună în evidență matricea de confuzie la
nivelul modelului realizat:
library( caret )
t = table( predictions, test$class )
print( confusionMatrix( t ) )
Așa cum se constată din rezultatele rulării, modelul rețelei neuronale ales în
acest al doilea caz a atins aproximativ 93% din precizia aplicată asupra setului de date
cu dimensiunea redusă. Acest rezultat este deci foarte aproape de rezultatul obținut la
prima abordare, fiind astfel un argument cu privire la care este cel mai bun mod de lucru
pentru LDA.

10.1.6. Rezultate comparative obținute din cele două abordări

O primă remarcă este aceea că ambele rezultate sunt destul de apropiate, din
punct de vedere al exactității, indicând astfel faptul că LDA funcționează foarte bine în
ambele roluri, adică atât ca o tehnică de reducere a dimensionalității, cât și ca un
clasificator liniar. Rezumând, decizia de alegere a modurilor LDA va depinde de setul
de date avut la dispoziție, astfel:
- dacă LDA poate fi separat liniar ca și clasificator este o soluție rapidă, cu
rezultate foarte bune;
- dacă caracteristica setului de date este neliniară, LDA va fi un instrument în
plus ce poate fi aplicat peste setul de date, pentru a încerca să
îmbunătățească rezultatele sau să faciliteze munca clasificatorului
posterior.
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 17

Există și calea în care se pot combina PCA și LDA, ambele pentru reducerea
dimensionalității. În primul rând, PCA acționează reducând caracteristicile prin variația
sa, apoi LDA aplică reducerea dimensionalității liniare și, în sfârșit, este efectuat un
model de clasificare peste acest set modificat de date.

10.2. PCA ca tehnică de reducere a dimensionalității și totodată un algoritm


de clasificare

Analiza în componente principale (PCA) este unul dintre algoritmii de


vârf în reducerea dimensionalității, nefiind greu de înțeles și de utilizat în proiecte
reale. Această tehnică, pe lângă faptul că facilitează munca de prelucrare a
caracteristicilor, ajută la îmbunătățirea rezultatelor clasificatorului, așa cum vom
constata în cele ce urmează.

10.2.1. Introducere în PCA

Am abordat deja aspect ale reducerii dimensionalității. Acest subiect este unul
dintre cele mai interesante, întrucât este important să găsim algoritmi capabili să reducă
numărul de caracteristici, alegându-le pe cele mai importante care să fie încă
reprezintativ pentru întregul set de date.
În continuare vom folosind o analiză în componente principale (PCA) pentru a
încerca o îmbunătățire a performanțelor de clasificare a setului de date de la nivelul unei
rețele neuronale. Înainte de a merge direct la codurile R, se impune o discuție despre
algoritmii de reducere a dimensionalității. Există doi algoritmi principali pentru
reducerea dimensionalității: analiza discriminant liniară (LDA) și respective analiza în
componente principale (PCA).
Diferența de bază între aceste două metode este că LDA folosește informațiile
la nivelul claselor, pentru a găsi noi caracteristici care să permit maximizarea
separabilitatății, în timp ce PCA folosește variația fiecărei caracteristici pentru a face
același lucru. În acest context, LDA poate fi considerat un algoritm de învățare
supravegheată, în timp ce PCA este un algoritm de învățare nesupravegheată.

10.2.2. PCA ca algoritm de clasificare

Ideea din spatele PCA este pur și simplu de a găsi un set de axe de dimensiuni
reduse, care să rezume datele deținute. În limbajul R, PCA ca algoritm de clasificare
presupune după cum urmează:
- pentru început vom presupune că avem o bază de date compusă dintr-un
set de proprietăți ale unui lot de mașini. Aceste proprietăți descriu fiecare
mașină după dimensiune, culoare, circularitate, compactitate, rază, numărul
de scaune, număr de uși, dimensiunea portbagajului etc.
- se va urmări să se elimine aceste redundanțe și să descrie fiecare
autovehicul cu mai puține proprietăți. Cu toate acestea, multe dintre aceste
caracteristici vor măsura proprietățile asociate și astfel vor fi redundante.
18 Analiza datelor în mediul R - teorie şi aplicaţii

Prin urmare, trebuie să eliminăm aceste redundanțe și să descriem fiecare


autovehicul cu mai puține proprietăți. Aceasta este exact ceea ce urmărește
să facă PCA.
- vom resupune că numărul de roți reprezintă o caracteristică a mașinilor și
autobuzelor și vom analiza variația acestei proprietăți. În contextul dat,
aproape fiecare exemplu din ambele clase (mașini și autobuze) are patru
roți, deci putem spune că această caracteristică are o variație scăzută (de la
patru până la șase roți sau mai multe la unele dintre autobuze), astfel că
această caracteristică va face autobuzul și mașinile să arate la fel, dar de
fapt sunt destul de diferite unele de altele.
- vom resupune înălțimea ca fiind o caracteristică a mașinilor și autobuzelor
și vom analiza și variația acestei proprietăți. În contextual dat, înălțimea ca
o caracteristică pentru mașini și autobuze, este o caracteristică ce are valori
diferite pentru aceasta, variația având o gamă foarte bună de la cea mai
joasă până la cea mai înaltă. Ca urmare, înălțimea acestor vehicule este o
proprietate bună pentru a le separa.
Reamintim că PCA nu ține cont de informații despre clase, ci doar să analizeze
variația fiecărei caracteristici, deoarece este rezonabil a presupune că aceste
caracteristici care prezintă o varianță ridicată au mai multe șanse să aibă o divizare bună
între clase.
Adesea, oamenii ajung să greșească în gândirea că PCA selectează unele
caracteristici din setul de date și le elimină pe altele. Algoritmul construiește de fapt un
set nou de proprietăți bazat pe combinarea celor vechi. Matematic vorbind, PCA
realizează o transformare liniară, mutând setul original de caracteristici într-un spațiu
nou, compus din componente principale. Aceste caracteristici noi nu au niciun sens real
pentru noi, doar algebraic. Prin urmare, se poate crede că odată combinând caracteristici
liniare, se pot găsi noi caracteristici. Cu toate acestea, încă se crede că algoritmii de
învățare automată (ML) sunt un panaceu.

10.2.3. Structura spațiului componentelor principale

În noul spațiu de caracteristici căutăm câteva proprietăți care diferă puternic


între clase. Așa cum am arătat în exemplele anterioare, unele proprietăți care prezintă o
variație scăzută nu sunt utile, acestea făcând ca exemplele să arate la fel.
Pe de altă parte, PCA caută proprietăți care să prezinte cât mai multe variații
între clase, pentru a construi spațiul principal al componentelor.
Algoritmul folosește conceptele de matrice de varianță, matrice de covarianță,
eigenvector și perechi de valori proprii, pentru a efectua PCA, furnizând un set de
vectori proprii și respectiv valorile proprii ale acestora.
Valorile proprii și vectorii proprii au următoarele roluri:
- vectorii proprii, reprezintă noul set de axe ale spațiului componentelor
principale;
- valorile proprii, poartă informațiile despre cantitatea de varianță pe care o
are fiecare eigenvector.
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 19

Ca urmare, pentru a reduce dimensiunea setului de date, vom alege acei vectori
proprii care au mai multă varianță și îi eliminăm pe cei cu varianța mai mică. Pe măsură
ce urmăm exemplul de mai jos, va fi din ce în ce mai clar cum funcționează PCA.

10.2.4. Coduri R în spațiul componentelor principale

În continuare vor fi prezentați pașii de aplicare a procesul de clasificare într-


o PCA, utilizând linii de cod R.
- întrucât în aplicațiile viitoare se va lucra cu pachetul dplyr, se va
trece la instalarea lui:
library(dplyr)
- se va analiza dacă PCA îmbunătățește sau nu rezultatele în procesul de
clasificare. Pentru a verifica acest lucru, strategia adoptată în continuare
este de a aplica o rețea neuronală pe un set de date28 și a vedea rezultatele
obținute.
- se va efectua PCA înainte de clasificare și se va aplica aceeași rețea
neuronală pe noul set de date, urmând a compara rezultatele obținute.
Acest set de date stochează unele măsuri de 4 siluete ale vehiculelor în scopul
clasificării, fiind compus din 946 de observații și 18 caracteristici/ atribute, toate valorile
fiind numerice29.
Rețeaua neuronală va fi un Perceptron MultiLayer cu patru noduri/neuroni pe
startul ascuns și un neuron de ieșire, fiecare cu funcție sigmoidă ca funcție de activare,
iar caracteristicile PCA vor proveni dintr-un pachet R.
- pe baza datelor anterioare se vor scrie liniile de cod R care să permită
încărcarea setului de date. În primul rând, va fi pregătit setul de date pentru
clasificarea binară. Astfel, se vor selecta exemple doar din două clase,
pentru a realiza o clasificare binară. Vom utiliza cele două clase deja
specificate, bus și saab. Clasa saab va fi etichetată ca fiind clasa 0, iar
clasa bus va fi etichetată ca fiind clasa 1. Pentru aceasta avem
următoarele linii de cod R:
data = read.csv( "../dataset/vehicle.csv", stringsAsFactor =
FALSE )
- se vor scrie liniile de cod R care să permită care să permită transformarea
setului de date:
dataset = data %>%
filter( class == "bus" | class == "saab" ) %>%
transform( class = ifelse( class == "saab", 0, 1 ) )
dataset = as.data.frame(sapply(dataset, as.numeric))
- se vor scrie liniile de cod R care să permită separarea setului initial de
date în set de antrenare/instruire și respectiv set de testare/validare, cu o

28
Setul de date este originar din depozitul de învățare automată UCI, numit setul de date
„Statlog (Silhouettes Vehicle)”.
29
Pentru mai multe detalii se poate verifica link-ul:
https://archive.ics.uci.edu/ml/datasets/Statlog+ (Vehicle+Silhouettes).
20 Analiza datelor în mediul R - teorie şi aplicaţii

distribuție procentuală de 60%, respectiv 40% din totalul observațiilor


clasei, implementând în linii de cod R.
index = sample( 1:nrow( dataset ), nrow( dataset ) * 0.6,
replace = FALSE )
trainset = dataset[ index, ]
test = dataset[ -index, ]
testset = test %>% select( -class )
sau ultimele două linii de cod R pot fi substituite cu:
testset = dataset[ -index, ]
- se vor scrie liniile de cod R care să permită construirea unei rețele
neuronale, folosind toate caracteristicile simultan:
library( neuralnet )
print( "... training ..." )
n = names( trainset )
f = as.formula( paste( "class ~", paste( n[!n %in% "class"],
collapse = "+" ) ) )
nn = neuralnet( f, trainset, hidden = 4, linear.output = FALSE,
threshold = 0.01 )
- se vor scrie liniile de cod R care să permită reprezintarea grafică a rețelei
neuronale astfel construită:
plot( nn, rep = "best" )

Figura 10.3. Rețea Neurală MultiLayer-Perceptron

- se vor scrie liniile de cod R care să aplice rețeaua neuronală pe noul set de
date (adică pe cel de testare) și să se verifice dacă se pot obține rezultate
mai bune.
Observație: Setul de date de testare va fi același utilizat în abordarea
anterioară.
nn.results = compute( nn, testset )
- se vor scrie liniile de cod R care să pună în evidență rezultatele aplicării
modelului:
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 21

results = data.frame( actual = test$class, prediction = round(


nn.results$net.result ) )
- se vor scrie liniile de cod R care să pună în evidență matricea de confuzie
la nivelul modelului realizat:
library( caret )
t = table( results )
print( confusionMatrix( t ) )
Așa cum se va constata, modelul rețelei neuronale ales în acest al doilea caz a
atins aproximativ 54% din precizia aplicată asupra setului de date cu dimensiunea
redusă. Acest rezultat este deci foarte aproape de rezultatul obținut la prima abordare,
fiind astfel un argument cu privire la care este cel mai bun mod de lucru pentru PCA.
- pe baza rezultatelor anterior obținute, în continuare vor fi prezentate
semnificația și rolului matricei de confuzie. Pentru început trebuie spus că
matricea de confuzie arată câte observații au fost clasificate corect și câte
nu și anume:
o diagonala principală arată exemplele clasificate corect;
o diagonala secundară prezintă clasificarea greșită.
- pe baza rezultatelor anterior obținute, în continuare vor fi prezentate pe
larg semnificația și rolului matricei de confuzie. În acest prim rezultat,
clasificatorul se arată foarte confuz, deoarece a clasificat corect aproape
toate exemplele din clasa saab, dar a clasificat de asemenea cele mai
multe exemple din clasa bus ca și clasă saab.
Consolidând aceste rezultate, putem vedea că valoarea exactității este în jur de
50%, cee ace este un rezultat cu adevărat prost pentru sarcina de clasificare.
Clasificatorul are în esență o probabilitate de 50% de a clasifica un nou exemplu în clasa
saab și de 50% în clasa bus. Analog, rețeaua neuronală e ca și cum s-ar arunca o
monedă pentru fiecare nou exemplu pentru a alege în ce clasă ar trebui să se găsească o
nouă unitate. În continuare vom analiza dacă PCA ne poate ajuta în acest demers.
Efectuând analiza în componente principale pe setul de date, vom obține
vectorii proprii și valorile proprii. Într-un mod practic, se constată cu ușurință că funcția
prcomp din pachetul R oferă un set de valori proprii deja sortate în ordine
descrescătoare, cee ace înseamnă că prima componentă este aceea cu cea mai mare
varianță, a doua componentă este eigenvectorul cu a doua cea mai mare varianță și așa
mai departe.
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență modul în care se aleg vectorii proprii care corespund valorilor
proprii. Funcția prcomp din pachetele implicite pentru statistici ce
realizează PCA, returnează toate valorile proprii și vectori proprii necesari.
# Dimensionality Reduction, PCA
pca_trainset = trainset %>% select( -class )
pca_testset = testset
pca = prcomp( pca_trainset, scale = T )
sau echivalent, pentru penultima linie:
pca_testset = testset %>% select( -class )
22 Analiza datelor în mediul R - teorie şi aplicaţii

- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună


în evidență modul de calcul al varianței și respectiv procentul de varianță al
fiecărei caracteristici în parte.
pr_var = ( pca$sdev )^2
prop_varex = pr_var / sum( pr_var )
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență reprezentarea grafică a procentului de varianță al fiecărei
caracteristici:
plot( prop_varex, xlab = "Principal Component",
ylab = "Proportion of Variance Explained", type = "b" )
Reprezentarea grafică vă arată procentul de varianță al fiecărei caracteristici:
prima componentă are cea mai mare varianță, o valoare în jur de 50%, în timp ce a 8-a
componentă este în jur de 0% din varianță. Deci, ar trebui să luăm primele opt
componente.
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență reprezentarea grafică a sumei cumulate a varianței.
plot( cumsum( prop_varex ), xlab = "Principal Component", ylab =
"Cumulative Proportion of Variance Explained",type= "b")
Reprezentarea grafică vă arată o altă perspectivă a variației, deși suma
cumulativă pe toată variația, se poate constata că primele opt valori proprii corespund
aproximativ la 98% din toată varianța.
- pe baza rezultatelor anterior obținute, se vor interpreta amănunțit
rezultatele de la aplicațiile anterioare.
Într-adevăr, faptul că primele opt valori proprii corespund aproximativ la 98%
din toată varianța este un număr destul de bun, cee ace înseamnă că se pierd doar 2% din
informații. Cel mai mare beneficiu este că se trece dintr-un spațiu cu optsprezece
caracteristici în altul, cu doar opt caracteristici care pierd doar 2% din informație.
Aceasta este în definitiv puterea reducerii dimensionalității.
Acum că deja cunoaștem numărul de caracteristici care vor compune noul
spațiu, creăm noul set de date și apoi modelăm din nou rețeaua neurală și verificăm dacă
obținem rezultate mai bune.
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență crearea noului set de date atât de antrenare/instruire cât și de
testare/validare:
train = data.frame( class = trainset$class, pca$x )
t = as.data.frame( predict( pca, newdata = pca_testset ) )
new_trainset = train[, 1:9]
new_testset = t[, 1:8]
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență construirea noii rețele neuronale:
library( neuralnet )
n = names( new_trainset )
f = as.formula( paste( "class ~", paste( n[!n %in% "class" ],
collapse = "+" ) ) )
nn = neuralnet( f, new_trainset, hidden = 4, linear.output =
FALSE, threshold=0.01 )
Capitolul 10. Linear Discriminant Analysis și Principal Component Analysis 23

- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună


în evidență reprezentarea grafică a noii rețele neuronale:
plot( nn, rep = "best" )

Figura 10.4. Rețeaua neuronală cu noul set de date

- pe baza rezultatelor anterior obținute, se va scrie codul R care să aplice


rețeaua neuronală pe noul set de date (adică pe cele de testare) și să se
verifice dacă se pot obține rezultate mai bune.
Observație: Setul de date de testare va fi același utilizat în abordarea anterioară.
Ideea este să aplicăm rețeaua neuronală pe noul set de date și să verificăm dacă
putem obține rezultate mai bune. Setul de date de testare, așa cum s-a specificat, va fi
același utilizat în abordarea anterioară.
Ca urmare, avem următoarele linii de cod R:
nn.results = compute( nn, new_testset)
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență rezultatele aplicării modelului:
results = data.frame( actual = test$class,prediction = round(
nn.results$net.result ) )
- pe baza rezultatelor anterior obținute, se va scrie codul R care să pună
în evidență matricea de confuzie la nivelul modelului realizat.
library( caret )
t = table( results )
print( confusionMatrix( t ) )
- pe baza rezultatelor anterior obținute, se vor interpreta rezultatele la
nivelul modelului realizat.
Dispunem de rezultate mai bune și anume, matricea de confuzie arată de
această dată că rezultate sunt foarte bune, rețeaua neuronală realizează mai puține
clasificări greșite în ambele clase. Aceasta se constată din faptul că valorile
diagonalei principale și, de asemenea, valoarea de precizie fiind în jur de 95%.
Se deduce astfel că acest clasificator are 95% șanse de a clasifica corect
o nouă observație. După cum am menționat anterior, există disponibile și alte
tehnici de reducere a dimensionalității, cum ar fi analiza discriminantă liniară,
analiza factorială, Isomap și variațiile sale. Ideea de bază este de a explora
24 Analiza datelor în mediul R - teorie şi aplicaţii

avantajele și dezavantajele fiecăreia și să se verifice rezultatele la nivel individual


și combinat.

S-ar putea să vă placă și