Sunteți pe pagina 1din 30

Academia de Studii Economice din Bucuresti Baze de Date Suport pentru Afaceri

Analiza Multidimensionala a Datelor

Masterand: Tomescu Christiana-Maria


Cuprins
1. Analiza corespondentelor
2. Regresia logistica
3. Arbori de clasificare
4. Anexe
1. Analiza corespondentelor

Sursa chestionarului: https://insights.stackoverflow.com/survey/2020/

Analizam raspunsurile respondentilor din 10 tari - Anglia, Statele Unite, Belgia,


Canada,Rusia,China,Italia, Franta, Germania, Australie - referitor la cat de des
invata un limbaj de programare nou.

Numarul cel mai mare de respondenti este din Statele Unite, anume 11.353 persoane.

Din totalul de 25.955 de persoane care au raspuns din cele 10 tari, 8220 invata un limbaj de
programare nou odata la cateva luni, 9974 odata pe an, 7144 odata la cativa ani si doar 617
odata la 10 ani.
Mai jos, vom folosi analiza corespondentelor pentru a reprezenta informatia din tabelele
prezentate anterior.

- In coloanele k=1 si k=2 regasim coordonatele principale ale punctelor.

-In coloana cor regasim contributia axei principale la inertia unui anumit punct.

-Coloana mass ne arata cati respondenti exista pentru fiecare frecventa de invatare a unui nou
limbaj.

-In coloana ctr este calculate contributia absoluta la inertie a unui anumit punct.

Avem nevoie de 3 dimensiuni pentru a prelua 100% din varianta totala : prima axa explica
78.5% din inertia totala, cea de-a doua 18.5%, iar ultima 3%. Valoarea inertiei totale este
0.005120. Cea mai mare contributie o are China, de 45%, iar mai mult de jumatate din
developeri invata un limbaj de programare nou odata pe an (51.4%).

Prima frecventa (evry) , a treia (oncy) si a patra (oncv) se coreleaza puternic cu prima axa, in
timp ce a doua coreleaza cu cea de-a doua axa (oncd). Belgia,Franta,Rusia,Anglia, Statele
Unite coreleaza cu prima axa , iar Australia, Canada,China, Germania,Italia coreleaza cu cea
de-a doua axa.
Asocierea dintre tari si raspunsuri este redata prin graficul de mai jos. Pirma axa explica
78.5% din varianta totala, iar a doua 18.5%. Categoria Every Few Months este pozitionata
mai in stanga fata de restul, iar China ocupa o pozitie aproape izolata fata de celelalte tari
,deci distinctia facuta de respondentia chinezi este mare.
Verificam bonitatea modelului:

Validitatea modelului este data de p-value (trebuie sa fie < 0.05)

p-value=6.045e-16, deci modelul este valid.

Se obtin valorile proprii:

Observam 3 dimensiuni, preluand 100% din varianta totala. Prima explica 78.52%, a doua
18.46%, iar ultima 3.01%.
Observam ca prima dimensiune contribuie cel mai mult la varianta totala, in timp ce a doua si
a treia considerabil mai putin.

2. Regresia logistica

Variabila dependenta va reflecta probabilitatea unui angajat de a pleca din


compania in care lucreaza, in functie de cat de satisfacut este la locul de munca.

Variabilele pe care le testam pentru a identifica factorii ce influenteaza posibila


plecare a unui individ dintr-o companie sunt: Age, JobSeek,JobSat.
Volumul total al esantionului este de 36.294 (se regasesc mai sus impartirile, in functie de
gradul de satisfactie la locul de munca).

Au fost selectati angajatii peste 18 ani si impartiti pe intervale , anume 18-25, 26-30, 30-45 si
45+ .

Putem deduce ca varsta minima a unui respondent este de 18 ani, jumatate din respondenti au
o varsta mai mica de 30 ani. 75% au varsta mai mica de 36 ani, in timp ce doar 25% au peste.

Facand un plot, ne putem da seama ca cei mai multi respondenti se incadreaza in pirmele
doua categorii de varsta.
In imaginile de mai jos, putem observa impartirea respondetilor pe categorii de varsta.
Prin definirea variabilei target, WannaQuit, scopul nostru este de a incadra respondentia intr-
o categorie: cei care vor sa plece din firma in viitor (1) si cei care nu vor sa plece (0).
Urmarim frecventa unor variabile in functie de variabila cea noua, WannaQuit, pe
care am stabilit-o, cu ajutorul tabelelor de mai jos:
Se poate observa faptul ca cei mai multi respondenti, aflati in jurul varstei de 30 de ani, sunt
satisfacuti cu jobul pe care il au prezent si nu doresc sa plece, insa sunt deschisi catre
oportunitati noi.

Modelul de regresie logistica:

model1<-glm (WannaQuit ~ Age+JobSeek+PurchaseWhat,

data=DateRegresie,

family = "binomial", maxit = 100)

In screenshot-ul de mai jos, avem rezultatele estimarii unui model de regresie logistica:
Rezultatul prezentat reda informatii referitoare la influenta pe care o au factorii analizati
asupra probabilitatii ca un angajat sa plece din companie.

Folosindu-ne de informatiile de pe ultimele randuri ale tabelului, putem estima bonitatea


modelului. Sunt puse in comparatie modelul nul cu cel complet (33726) si modelul complet
cu cel current (30131). Valorile cat mai mici indica modele cu atat mai bune.
Prin logaritmarea modelului, obtinem urmatorul output:

Cea mai mare probabilitate sa plece o au care nu au influenta in decizia de cumparare a


licentelor la ei in companie.
Curba ROC si AUC

Curba ROC (Receiver Operating Characteristics) este o curbă bidimensională care prezintă
grafic valorile perechi ale sensibilităţii (axa OY, rata adevărat pozitivilor) şi specificităţii (axa OX,
(1-Sp) = rata falşi pozitivilor) şi permitând astfel evaluarea unui semn/test diagnostic. 1

Aria de sub curba Roc este de 100%, deci am obtinut un clasificator bun.

http://romedinf2019.umfcluj.ro/index.php?option=com_k2&view=item&id=1318:l05romcs&Itemid=249&lang
=ro
3. Arbori de clasificare

Transformam cele 2 variabile pe care vrem sa le folosim : NEWOvertime si OrgSize.

Variabila NEWOvertime – Cei mai multi programatori fac overtime-uri de maxim 1-2 ori pe
luna.

Variabila OrgSize -Observam ca cei mai multi oameni lucreaza in organizatii cu 20-99 de
angajati.

Construirea arborelui de clasificare

arbore1 <- rpart(WannaQuit ~ Age1 + JobSeek + OrgSize1 + NEWOvertime1,


data=DateRegresie, method="class", minsplit = 2, cp=-1, minbucket = 1,
maxdepth=5)

summary(arbore1) – analizam rezultatele cross-validation:


Afisarea rezultatelor pentru cross-validation- plotcp(arbore1)
- Arborele prin functia prp

prp(arbore1, type=2, extra=106, under=TRUE, fallen.leaves=FALSE, box.palette = "BuPu",


tweak = 1)

- Arborele prin functia fancyRpartPlot


fancyRpartPlot(arbore1, palettes="PuOr",type = 2, leaf.round = 3, tweak = 3.5)
-Dupa aplicarea functiei prune

- Vizualizarea regulilor de decizie


4. Anexe

# Pachete -----------------------------------------------------------------

pacheteBDSA <- c("knitr", "rmarkdown", "RColorBrewer", "scales", "tidyverse",


"plyr", "dplyr", "ggplot2", "gganimate", "Rmisc", "Hmisc",
"randomForest", "rattle", "rpart.plot", "caret", "gmodels",
"PresenceAbsence", "R", "ca", "plot", "ROSE", "devtools",
"rpart", "readxl", "ellipsis", "gridExtra", "ca","wordcloud",
"radarchart", "tidytext", "tidyr", "textdata", "evaluate")

# Instalare pachete

# Incarcare pachete
sapply(pacheteBDSA, library, character.only =T)

library(plyr);
library(dplyr);
install.packages("readr")
library(readr)

# seturile de date ------------------------------------------------------


setwd
getw()
dir()

# Citire date -------------------------------------------------------------

Data2020 <- read.csv("survey_results_public.csv", header=TRUE, sep=";")


dim(Data2020)
View(Data2020)
head(Data2020)
glimpse(Data2020)

# Import fisierul cu descriera variabilelor (schimba separatorul daca este cazul)


vb_desc <- read.csv("survey_results_schema.csv", header=TRUE, sep=";")
dim(vb_desc)
View(vb_desc)

# Pastram doar variabilele de interes


Data2020<-Data2020 %>%
select(c(Respondent, MainBranch, Hobbyist,Age, Age1stCode,CompFreq,
CompTotal, Country, CurrencyDesc, CurrencySymbol,DatabaseWorkedWith,DevType,
EdLevel,Employment,
Gender,JobSat,JobSeek,LanguageWorkedWith,MiscTechWorkedWith,

NEWCollabToolsWorkedWith,NEWDevOpsImpt,NEWJobHunt,,NEWJobHuntResearch,NEWL
earn,

NEWOffTopic,NEWOnboardGood,NEWOvertime,NEWPurchaseResearch,NEWPurpleLink,NE
WSOSites,NEWStuck,
OpSys,OrgSize,PurchaseWhat, Sexuality,SOAccount,SOComm,SOPartFreq))

dim(Data2020)
# 38 variabile pastrate in analiza
View(Data2020)

# face o sumarizare (ca un count())


table(Data2020$MainBranch)

#Analizam raspunsurile respondentilor din 10 tari referitor la cat de des invata un limbaj de
programare nou.

countries<- c("United Kingdom","United States","Belgium","Canada","Russian


Federation","China","Italy", "France","Germany","Australia")

DateTari <- Data2020%>% filter(Country %in% countries)


dim (DateTari)

#Analizam cele 2 observatii alese, tara si frecventa invatarii unui limbaj nou de programare
table(DateTari$NEWLearn)
attach(DateTari)
tc_apl02<-table(Country,NEWLearn)
margin.table(tc_apl02,1)
margin.table(tc_apl02,2)
prop.table(tc_apl02)

view(tc_apl02)

#se ruleaza problema de analiza a coresp folosind "ca" install.packages("ca",dependencies =


T)
library(ca)
corespondente_NEWLearn<-ca(tc_apl02)
summary(corespondente_NEWLearn)

chisq.test(tc_apl02)

install.packages("tidyverse")
install.packages('useful')
library(useful)
library(ggplot2)

quartz()
plot(corespondente_NEWLearn, lines=c(FALSE,F))

install.packages("FactoMineR")
install.packages("factoextra")
library(FactoMineR)
library(factoextra)
res.ca <- CA(tc_apl02,graph = FALSE)
summary(res.ca)

eig.val <-get_eigenvalue(res.ca)
eig.val

fviz_screeplot(res.ca,addTabels=TRUE, ylim=c(0,50))

#2

DateRegresie<-Data2020 %>% filter(!is.na(JobSeek))


dim(DateRegresie)

DateRegresie$JobSat1<-factor(DateRegresie$JobSat)
table(DateRegresie$JobSat,DateRegresie$JobSat1)
DateRegresie<-DateRegresie%>%
filter(!is.na(JobSat))
dim(DateRegresie)

DateRegresie<-DateRegresie %>%
filter(Age>=18)
dim(DateRegresie)
DateRegresie %>%

filter(!is.na(Age)) %>%
ggplot(aes(Age)) +
geom_density(color = "white", fill="steelblue", adjust=5) + labs(x = "Age",
y="Densitate",
caption = ) +
ggtitle("Varsta") + theme_gray(base_size = 12)

summary(DateRegresie$Age)

DateRegresie <- DateRegresie %>%


mutate(Age1 = as.factor(case_when(Age <= 25 ~ "18-25",
Age <= 30 ~ "26-30", Age <= 40 ~ "30-45", Age > 45 ~ "45+")))
table(DateRegresie$Age1)
table(DateRegresie$Age, DateRegresie$Age1)

~WannaQuit
dim(DateRegresie)
summary(DateRegresie)
View(DateRegresie)
DateRegresie<- DateRegresie %>%
mutate(WannaQuit = as.factor (case_when (JobSat1 == "Very dissatisfied" ~ 1,
JobSat1 == "Slightly dissatisfied" ~ 1, JobSat1== "Slightly satisfied"
~0,
JobSat1=="Very satisfied" ~0) ))
DateRegresie <- DateRegresie %>% filter(!is.na(WannaQuit))
attach(DateRegresie)
table(DateRegresie$WannaQuit)

table(DateRegresie$Age, DateRegresie$WannaQuit)
table(DateRegresie$JobSat1, DateRegresie$WannaQuit)
table(DateRegresie$JobSat, DateRegresie$WannaQuit)
table(DateRegresie$JobSeek, DateRegresie$WannaQuit)

summary(DateRegresie$WannaQuit)
DateRegresie <-DateRegresie %>% filter(!is.na(WannaQuit))
summary(DateRegresie$Age)
DateRegresie <-DateRegresie %>%
filter(!is.na(Age))
summary(DateRegresie$JobSat1)
summary(DateRegresie %>% select(c(WannaQuit,Age,JobSat1,JobSeek)))

model1<-glm (WannaQuit ~ Age+JobSeek+PurchaseWhat,


data=DateRegresie,
family = "binomial", maxit = 100)
summary(model1)

exp(coef(model1))

install.packages('arm')
pred1 <- predict(model1, type = "response")
summary(pred1)
y_pred_num1 <- ifelse(pred1 > 0.5, 1, 0)
table(y_pred_num1)

y_pred1 <- factor(y_pred_num1, labels = c(0,1))


y_act1 <- DateRegresie$WannaQuit
mean(y_pred1 == y_act1 , na.rm = T)
?performance
?prediction

library(R)

pred<-prediction(pred1, y_act1)
class(pred)
class(DateRegresie)
View(pred)

summary(pred)
quartz()
pred%>% performance(measure = "tpr", x.measure = "fpr") %>% plot(colorize =T, lwd=7)

AUCLog1=performance(pred, measure = "auc")@y.values[[1]]


cat("AUC: ",AUCLog1,"\n")

?rpart
table(DateRegresie$NEWOvertime)
DateRegresie$NEWOvertime1<-factor(DateRegresie$NEWOvertime,
labels=c("NSD","SD","SS","VD","VS"))
table(DateRegresie$NEWOvertime,DateRegresie$NEWOvertime1)

DateRegresie$OrgSize1<-factor(DateRegresie$OrgSize, labels=c("LAA") )
table(DateRegresie$OrgSize,DateRegresie$OrgSize1)
library(rpart)
library(rpart.plot)
arbore1 <- rpart(WannaQuit ~ Age1 + JobSeek + OrgSize1 + NEWOvertime1,
data=DateRegresie, method="class", minsplit = 2, cp=-1, minbucket = 1,
maxdepth=5)

printcp(arbore1)
plotcp(arbore1)
summary(arbore1)

# Varianta 1)
#reprezentarea grafica a arborelui complet prin functia "prp"
quartz()
prp(arbore1, type=2, extra=106, under=TRUE, fallen.leaves=FALSE, box.palette = "BuPu",
tweak = 1)
library(rattle)
library(rpart)
library(rpart.plot)
library(RColorBrewer)

# Varianta 2)
??fancyRpartPlot
quartz()
fancyRpartPlot(arbore1, palettes="PuOr",type = 2, leaf.round = 3, tweak = 3.5)
?rpart
plotcp(arbore1)

arboref <- prune(arbore1, cp=0.0013)


quartz()
prp(arboref,type=2,extra=106, under=TRUE, fallen.leaves=FALSE,box.palette =
"BuPu",tweak = 1.2)
summary(arboref)
# Sau metoda de vizualizare a arboerului de clasificare prin FancyRPlot
fancyRpartPlot(arboref, palettes="YlOrBr",type = 2, leaf.round = 3, tweak = 1.2) # type=4
arata detaliat ramura "No"
#plot nr 6
?rpart.plot::prp
??fancyRpartPlot
# Vizualizarea regulilor de decizie
View(rpart.rules(arboref, extra = 4, cover = TRUE))

# AUC Value Decision Tree


pred_tree <- predict(arboref, DateRegresie, type = "prob")
class(pred_tree) # rezultatul obtinut este o matrice in care coloana 0 face referire la
probabilitatea clasei dont wannaquit
head(pred_tree) # in timp ce coloana 1 arata probabilitatea clasei wannaquit.

install.packages("p")
library("p")
auc(DateRegresie$WannaQuit, pred_tree[,"1"])
# grafic curba .
y_pred_num <- ifelse(pred_tree > 0.5, 1, 0)
y_pred <- factor(y_pred_num, levels = c(0, 1))
y_actual <- DateRegresie$WannaQuit
# Reprezentam grafic curba
prediction(pred_tree[,2], y_actual) %>%
performance(measure = "tpr", x.measure = "fpr") %>%
plot(col ='chartreuse3', lwd=3, lty=1, main="AUC Classification Tree Model")
# Adaugam legenda pe grafic
legend("bottomright", legend=c("Classification Tree", "Baseline (AUC 50%)"),
col=c("chartreuse3", "black"), lty=1:2, cex=1)

S-ar putea să vă placă și