El objetivo de esta PEC1 es la introducción al lenguaje R y iniciación al análisis y tratamiento estadístico de un conjunto de datos. A lo largo de la práctica se utilizarán diferentes conjuntos de datos, algunos provenientes de fuentes externas y otros propios del entorno RStudio. En particular, será necesario acceder a los siguientes conjuntos de datos:
El sitio web https://www.kaggle.com/ dispone de conjuntos de datos (datasets) de libre acceso y descarga, previa validación del usuario. En esta PEC1 trabajaremos con los datos de la atención médica y diagnósticos de pacientes: https://www.kaggle.com/datasets/prasad22/healthcare-dataset. Adjunto al enunciado, está disponible el archivo healthcare_dataset.csv.
Conjunto de datos sobre el trabajo remoto y la salud mental que pueden descargarse en el siguiente enlace: Remote Work & Mental Health (kaggle.com)
Conjunto de datos bacteria del paquete MASS de Rstudio que trabaja datos de tests acerca de la presencia de la bacteria H en pacientes.
El objetivo de esta sección es conocer la sintaxis en R para importar y exportar diferentes tipos de archivos de datos y cómo visualizarlos desde Rstudio, así como acceder a conjuntos de datos de diferentes fuentes y entornos.
Esta primera parte corresponde al paso inicial de un estudio de análisis de datos, iniciando por el trabajo de preparación del propio conjunto de datos.
Resolved las siguientes cuestiones, mostrando las instrucciones de código utilizadas, así como el resultado de la ejecución de dicho código.
1.1. Importad los datos del archivo healthcare_dataset.csv correspondiente a los datos de atención médica a pacientes. Guardad estos datos en un data frame llamado healthcare y mostrad los 10 primeros y últimos registros del conjunto de datos.
healthcare <- read.csv("D:\\Bioinformàtica i Bioestadística\\Programari per a l'anàlisi de dades\\healthcare_dataset.csv", header = TRUE, sep = ",")
head(healthcare)
tail(healthcare)
1.2. A partir del conjunto datos definido, healthcare, describid las características del conjunto de datos como el nombre de las variables, el tipo de datos, el tamaño de la muestra, y prospección de valores nulos. Además, valorad qué tipo de estudio, gráficos, etc… podréis realizar en función del tipo de variables.
#summary(healthcare)
names(healthcare)
## [1] "Name" "Age" "Gender"
## [4] "Blood.Type" "Medical.Condition" "Date.of.Admission"
## [7] "Doctor" "Hospital" "Insurance.Provider"
## [10] "Billing.Amount" "Room.Number" "Admission.Type"
## [13] "Discharge.Date" "Medication" "Test.Results"
str (healthcare)
## 'data.frame': 55500 obs. of 15 variables:
## $ Name : chr "Bobby JacksOn" "LesLie TErRy" "DaNnY sMitH" "andrEw waTtS" ...
## $ Age : int 30 62 76 28 43 36 21 20 82 58 ...
## $ Gender : chr "Male" "Male" "Female" "Female" ...
## $ Blood.Type : chr "B-" "A+" "A-" "O+" ...
## $ Medical.Condition : chr "Cancer" "Obesity" "Obesity" "Diabetes" ...
## $ Date.of.Admission : chr "2024-01-31" "2019-08-20" "2022-09-22" "2020-11-18" ...
## $ Doctor : chr "Matthew Smith" "Samantha Davies" "Tiffany Mitchell" "Kevin Wells" ...
## $ Hospital : chr "Sons and Miller" "Kim Inc" "Cook PLC" "Hernandez Rogers and Vang," ...
## $ Insurance.Provider: chr "Blue Cross" "Medicare" "Aetna" "Medicare" ...
## $ Billing.Amount : num 18856 33643 27955 37910 14238 ...
## $ Room.Number : int 328 265 205 450 458 389 389 277 316 249 ...
## $ Admission.Type : chr "Urgent" "Emergency" "Emergency" "Elective" ...
## $ Discharge.Date : chr "2024-02-02" "2019-08-26" "2022-10-07" "2020-12-18" ...
## $ Medication : chr "Paracetamol" "Ibuprofen" "Aspirin" "Ibuprofen" ...
## $ Test.Results : chr "Normal" "Inconclusive" "Normal" "Abnormal" ...
colSums(is.na(healthcare)) #així veiem si hi ha NA en alguna columna i no veure un output difñicil d'interpretar
## Name Age Gender Blood.Type
## 0 0 0 0
## Medical.Condition Date.of.Admission Doctor Hospital
## 0 0 0 0
## Insurance.Provider Billing.Amount Room.Number Admission.Type
## 0 0 0 0
## Discharge.Date Medication Test.Results
## 0 0 0
is.null(healthcare)
## [1] FALSE
Amb aquest tipus de dades (55500 obs. of 15 variables) podriem, a part d’obtenir els estadístics descriptius de les diferents variables, p. e. frecuencies de gènere, tipus sanguini, % dels pacients en cada hospital, mitjana d’edat o del gast (billing amount). També podriem mirar el temps que passen els pacients en l’hospital, ja que tenim la data d’entrada i sortida. Relacions entre l’edat i la quantitat pagada (diagrama de dispersió), comparar grups de gènere per exemple o tipus d’admissio amb altres variables, com ara el cost (billing amount). Gràfics de barres per poder visualitzar diferències entre, p. e. el gènere i la condició per la qual ha estat ingressat el pacient. També podría gerse una anàlisi de regressió per veure si pot fer-se alguna predicció entre, per exemple, els costos amb l’edat o la condició mèdica.
L’apartat on més se li podria treure és en les anàlisis estadístiques. Podria veure’s si hi ha diferències estadísticament significatives entre diferents grups. Una comú categorització és per sexe, i veure si les diferències presents entre aquests dos i una altra variable. També podria veure’s les relacions (si és que són presents) entre els valors de diferents variables.
A partir del conjunto de datos bacteria del paquete MASS de Rstudio, se pide:
2.1. En base a las cuestiones trabajadas al ejercicio anterior, mostrad la información más relevante de la estructura de este conjunto de datos. Sugerid y justificad alguna acción a realizar sobre dicho conjunto de datos (transformación o categorización de alguna de las variables, eliminación de algún tipo de datos,…)
library(MASS)
data("bacteria")
summary(bacteria)
## y ap hilo week ID trt
## n: 43 a:124 hi:122 Min. : 0.000 X03 : 5 placebo:96
## y:177 p: 96 lo: 98 1st Qu.: 2.000 X04 : 5 drug :62
## Median : 4.000 X05 : 5 drug+ :62
## Mean : 4.455 X07 : 5
## 3rd Qu.: 6.000 X08 : 5
## Max. :11.000 X09 : 5
## (Other):190
str (bacteria)
## 'data.frame': 220 obs. of 6 variables:
## $ y : Factor w/ 2 levels "n","y": 2 2 2 2 2 2 1 2 2 2 ...
## $ ap : Factor w/ 2 levels "a","p": 2 2 2 2 1 1 1 1 1 1 ...
## $ hilo: Factor w/ 2 levels "hi","lo": 1 1 1 1 1 1 1 1 2 2 ...
## $ week: int 0 2 4 11 0 2 6 11 0 2 ...
## $ ID : Factor w/ 50 levels "X01","X02","X03",..: 1 1 1 1 2 2 2 2 3 3 ...
## $ trt : Factor w/ 3 levels "placebo","drug",..: 1 1 1 1 3 3 3 3 2 2 ...
dim(bacteria)
## [1] 220 6
colSums(is.na(bacteria))
## y ap hilo week ID trt
## 0 0 0 0 0 0
head(bacteria)
?bacteria
## starting httpd help server ... fet
Tenim un conjunt de dades amb 220 registres i 6 columnes (variables). Amb la comanda str també veiem què tenim en cada variable i quin tipus de dates tenim a cada una. No tenim valors NA.
Veiem que la variable y categòrica entre n o y, podríem canviar-ho a 0/1 o “no”/“yes” facilitant la visualitzacio de la presència o no de bacteris: (en aquest cas a “yes”/“no”
bacteria$y <- factor(bacteria$y, levels = c('y','n'), labels = c("Yes", "No"))
Sabem que “week” fa referència a un moment de la setmana on s’ha fet un test concret. Per tant, serà una variable factorial (categòrica) i no numèrica:
bacteria$week <- factor(bacteria$week)
str(bacteria)
## 'data.frame': 220 obs. of 6 variables:
## $ y : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 1 1 1 ...
## $ ap : Factor w/ 2 levels "a","p": 2 2 2 2 1 1 1 1 1 1 ...
## $ hilo: Factor w/ 2 levels "hi","lo": 1 1 1 1 1 1 1 1 2 2 ...
## $ week: Factor w/ 5 levels "0","2","4","6",..: 1 2 3 5 1 2 4 5 1 2 ...
## $ ID : Factor w/ 50 levels "X01","X02","X03",..: 1 1 1 1 2 2 2 2 3 3 ...
## $ trt : Factor w/ 3 levels "placebo","drug",..: 1 1 1 1 3 3 3 3 2 2 ...
Podriem fer més canvis depenent dels anàlisis que ens interessaria, però de moment no en farem més. Si calgués podríem eliminar també columnes si les consideressim irrellevants. Sempre és millor intentar conservar el dataset net amb totes les variables i anar creant objectes amb els subdatasets que vulguem.
2.2. Exportad el data frame bacteria a un archivo en formato *.csv especificando la ubicación del archivo. Recordad que para acceder al conjunto de datos es necesario instalar el paquete MASS. Como referencia, podéis consultar el LAB1.
write.csv("bacteria", file="D:\\Bioinformàtica i Bioestadística\\Programari per a l'anàlisi de dades\\bacteria.csv", row.names = FALSE)
Exploración del entorno Rstudio y paquetes asociados. En base al ejercicio anterior, seleccionad un paquete de Rstudio y un conjunto de datos específico. Justificad la elección del dataset correspondiente (temática, diversidad de tipos de variables, tipos de estudios a realizar, …) y mostrad la información más relevante de la estructura del dataset escogido.
Buscant diferents oaquets de RStudio i conjunts de dades, triaré del paquet survival, el conjunt cancer (NCCTG Lung Cancer Data: Survival in patients with advanced lung cancer from the North Central Cancer Treatment Group. Performance scores rate how well the patient can perform usual daily activities.)
#install.packages("survival")
library(survival)
??survival
data(cancer, package="survival")
head(lung)
str(lung)
## 'data.frame': 228 obs. of 10 variables:
## $ inst : num 3 3 3 5 1 12 7 11 1 7 ...
## $ time : num 306 455 1010 210 883 ...
## $ status : num 2 2 1 2 2 1 2 2 2 2 ...
## $ age : num 74 68 56 57 60 74 68 71 53 61 ...
## $ sex : num 1 1 1 1 1 1 2 2 1 1 ...
## $ ph.ecog : num 1 0 0 1 0 1 2 2 1 2 ...
## $ ph.karno : num 90 90 90 90 100 50 70 60 70 70 ...
## $ pat.karno: num 100 90 90 60 90 80 60 80 80 70 ...
## $ meal.cal : num 1175 1225 NA 1150 NA ...
## $ wt.loss : num NA 15 15 11 0 0 10 1 16 34 ...
Veig que en cancer hi ha diferents df, però treballare nomes amb lung. Hi ha molts tipus de variables, tant numèriques com categòriques. Al ser un dataset tipus biomèdic, podem fer anàlisis de supervivència, comparar diferents grups i veure què pot ser informació rellevant per a la millora del coneixement en aquest aspecte.
Serien necessaris processos anteriors, ja que podem veure valors NA,
variables categòriques que RStudio ha guardat com numperiques (per
exemple el sexe).
El objetivo de esta sección es obtener información sobre un determinado conjunto de datos realizando operaciones y consultas diversas.
Considerando el data frame healthcare, anteriormente definido, resolved las siguientes cuestiones:
4.1. (0,5 puntos) Definid dos data frame de acuerdo a la variable Gender para los valores Male y Female, posteriormente, exportad ambos data frame en dos archivos healthcare_f.csv y healthcare_m.csv.
healthcare_f <- healthcare[healthcare$Gender=="Female",]
healthcare_m <- healthcare[healthcare$Gender=="Male",]
write.csv(healthcare_f, file="D:\\Bioinformàtica i Bioestadística\\Programari per a l'anàlisi de dades\\healthcare_f.csv")
write.csv(healthcare_m, file="D:\\Bioinformàtica i Bioestadística\\Programari per a l'anàlisi de dades\\healthcare_m.csv")
4.2. (0,5 puntos) Calculad la media de edad de los hombres cuyo tipo de sangre (Blood.Type) sea AB+ y, por otra parte, mostrad la información de la condición médica (Medical.Condition), la medicación asignada (Medication) y el resultado del test realizado (Test.Results).
# filtrar per homes AB+
healthcare_m_abp <- subset(healthcare, Gender == "Male" & Blood.Type == "AB+")
# calcul de la mitjama d'edat del subset anterior
mean_age_m_abp <- mean(healthcare_m_abp$Age, na.rm = TRUE)
print(mean_age_m_abp)
## [1] 51.15531
# seleccionar columnes: Medical.Condition, Medication i Test.Results
info_m_abp <- healthcare_m_abp[, c("Medical.Condition", "Medication", "Test.Results")]
head(info_m_abp)
4.3. (0,5 puntos) Definid una variable, healthcare_maxb, que guarde las características del paciente o pacientes, que registren el máximo valor en la factura pagada en el hospital.
# recordar treure NA si es que n'hi ha amb na.rm = TRUE, tot i que ho hem mirat al exercici 1, per tant no ho posaré
healthcare_maxb <- healthcare[healthcare$Billing.Amount == max(healthcare$Billing.Amount), ]
#només 1, el màxim? o és un rang?
healthcare_maxb
4.4. (0,5 puntos) Definid un data frame, TestAbn, que muestre los datos de los pacientes cuya edad sea inferior a la media de edades y cuyo resultado de Test sea ‘Abnormal’. Mostrad cuantas veces aparecen en el listado anterior, cada una de las condiciones médicas. Comentad los resultados.
mean(healthcare$Age)
## [1] 51.53946
# pacients amb edad menor a la mitjana
test_media_inferior <- healthcare[healthcare$Age < mean(healthcare$Age), ]
# pacients amb resultat del Test 'Abnormal'
TestAbn <- test_media_inferior[test_media_inferior$Test.Results == "Abnormal",]
head(TestAbn)
# frequencia de cada condició en TestAbn
medical_condition_counts <- table(TestAbn$Medical.Condition)
head(medical_condition_counts)
##
## Arthritis Asthma Cancer Diabetes Hypertension Obesity
## 1602 1465 1526 1573 1429 1587
Estem mirant pacients que tinguin una edat per sota la mitjana del dataframe sencer (mitjana de 51.53946). El resultat “Abnormal” ens indica que del test, els resultats no són els esperats en una persona sana, per tant, estarà afectat (ens assegurarem que és un pacient malalt). D’aquesta manera, mirem quines són les malalties més comuns. Mirem que és artritis la més freqüent, seguida de l’obesitat, diabetis, cancer, asma i finalment hipertensió.
4.5. (0,5 puntos) Definid una matriz, healthcare_matrix, que muestre las columnas Gender, Medical.Condition, Medication y Test.Results. En qué casos sería conveniente utilizar una estructura de tipo matriz en lugar de un data frame?
gender <- as.character(healthcare$Gender)
medical_condition <- as.character(healthcare$Medical.Condition)
medication <- as.character(healthcare$Medication)
test_results <- as.character(healthcare$Test.Results)
# matriu combinant les columnes anteriors
healthcare_matrix <- cbind(gender, medical_condition, medication, test_results)
head(healthcare_matrix)
## gender medical_condition medication test_results
## [1,] "Male" "Cancer" "Paracetamol" "Normal"
## [2,] "Male" "Obesity" "Ibuprofen" "Inconclusive"
## [3,] "Female" "Obesity" "Aspirin" "Normal"
## [4,] "Female" "Diabetes" "Ibuprofen" "Abnormal"
## [5,] "Female" "Cancer" "Penicillin" "Abnormal"
## [6,] "Male" "Asthma" "Ibuprofen" "Normal"
Farem servir una matriu en els següents casos
Homogeneitat de les dades: tenim dades del mateix tipus (ja siguin numèriques o caràcters).
Operacions: en el cas que ens interessés operar amb matrius o amb expressions algebraiques (que es poden transformar en matrius) ens és molt més sensill guardar les dades com a matriu i no dataframe.
Simplificació: si tenim un conjunt ded ades molt homogeni i senzill és més eficient computacionalment guardar-los en matrius.
4.6. (1 punto) En base a las cuestiones realizadas anteriormente, añadid una nueva cuestión de prospección del conjunto de datos. Por ejemplo, algunas sugerencias serían realizar la comparación de grupos sanguíneos y condición médica en función del género, o calcular la media del importe de la factura según la dolencia (condición médica), etc.
Faré dues prospeccions:
Comparar els grups sanguinis i condició mèdica:
Voldrem veure si hi ha diferències en la freqüència de grups sanguinis i la condició mèdica (possible associació entre aquestes dues).
# taula de freqüències de Blood.Type per Medical.Condition
blood_condition_table <- table(healthcare$Blood.Type, healthcare$Medical.Condition)
print(blood_condition_table)
##
## Arthritis Asthma Cancer Diabetes Hypertension Obesity
## A- 1153 1173 1134 1167 1199 1143
## A+ 1116 1135 1185 1213 1128 1179
## AB- 1192 1134 1198 1139 1125 1157
## AB+ 1130 1189 1112 1173 1215 1128
## B- 1169 1119 1144 1151 1173 1188
## B+ 1201 1108 1196 1188 1103 1149
## O- 1149 1154 1150 1122 1145 1157
## O+ 1198 1173 1108 1151 1157 1130
library(ggplot2)
# faré anar un df per fer la gràfica, oer tant:
blood_condition_df <- as.data.frame(blood_condition_table)
colnames(blood_condition_df) <- c("Blood.Type", "Medical.Condition", "Frequency")
# gràfic de barres apilat
ggplot(blood_condition_df, aes(x = Medical.Condition, y = Frequency, fill = Blood.Type)) +
geom_bar(stat = "identity") +
labs(title = "Distribució del Grup Sanguini segons condició mèdica",
x = "Condició mèdica",
y = "Freqüencia") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Mirar la distribució de l’edat segons el gènere i la condició mèdica:
Permet veure possibles associacions en la prevalença de condicions segons l’edat i sexe.
# calcul de la mitjana i la desviació estàndar de l'edat agrupat per condició i gènere
age_summary <- aggregate(Age ~ Gender + Medical.Condition,
data = healthcare,
FUN = function(x) c(mean = mean(x, na.rm = TRUE), sd = sd(x)))
# separar columnes
age_summary <- do.call(data.frame, age_summary)
names(age_summary) <- c("Gender", "Medical.Condition", "Mean_Age", "SD_Age")
print(age_summary)
## Gender Medical.Condition Mean_Age SD_Age
## 1 Female Arthritis 51.41763 19.66333
## 2 Male Arthritis 51.71506 19.58351
## 3 Female Asthma 51.65561 19.80021
## 4 Male Asthma 51.49741 19.62615
## 5 Female Cancer 51.33703 19.61502
## 6 Male Cancer 51.77946 19.70283
## 7 Female Diabetes 51.56912 19.55328
## 8 Male Diabetes 51.53922 19.29819
## 9 Female Hypertension 52.14636 19.86309
## 10 Male Hypertension 51.33930 19.42752
## 11 Female Obesity 51.35028 19.52622
## 12 Male Obesity 51.12996 19.57257
# boxplot de la distribució d'edad segons gènere i condició
library(ggplot2)
ggplot(healthcare, aes(x = Medical.Condition, y = Age, fill = Gender)) +
geom_boxplot() +
labs(title = "Distribució de l'edad segons gènere y condició mèdica",
x = "Condició mèdica",
y = "Edat") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
El objetivo de esta sección es estudiar los conceptos relacionados con estadística descriptiva en R y realizar diferentes tipos de gráficos con Rstudio. En esta sección trabajaremos con un conjunto de datos sobre el trabajo remoto y la salud mental que pueden descargarse en el siguiente enlace: https://www.kaggle.com/datasets/waqi786/remote-work-and-mental-health? resource=download&select=Impact_of_Remote_Work_on_Mental_Health.csv. El archivo también aparece adjunto al enunciado de esta PEC1.
5.1. (0,5 puntos) A partir del conjunto de datos citado, importad el archivo a un data frame remote_mental y mostrad las características del conjunto de datos. Posteriormente, calculad los estadísticos descriptivos más relevantes y comentad los resultados.
remote_mental <- read.csv("D:\\Bioinformàtica i Bioestadística\\Programari per a l'anàlisi de dades\\Impact_of_Remote_Work_on_Mental_Health.csv")
head(remote_mental)
5.2. (0,5 puntos) Realizad un diagrama de cajas sobre las variables Age y Hours_Worked_Per_Week. ¿Qué se puede extraer de este gráfico?
library(ggplot2)
boxplot(remote_mental$Age,
main = "Diagrama de caixes d'edat",
ylab = "Edat",
col = "blue")
boxplot(remote_mental$Hours_Worked_Per_Week,
main = "Diagrama de caixes de las hores treballades/setmana",
ylab = "Hores treballades/semana",
col = "coral")
Aquestes caixes ens permeten veure diferents coses:
Mitjana i rang: podem veure la línia que es troba a dins la caixa marcant on es troba la mitjana (aprox 40 en edat i una mica menys de 40 en hores treballades/setmana). Podem veure els rangs dels quartils 1 (Q1) i 3 (Q3) on es troba la majoria de registres del nostre dataframe (entre 50 i 30 de l’edat o les hores treballades/setmana)
Outliers: són valors molt diferents als de la majoria del dataframe, valors atípics. Aquestos es trobarien per sota o per sobre dels rangs marcats i sería un punt per outlier. No en tenim cap en el nostre dataframe.
Distribució: podem fer-nos a la idea d’on es troba la majoria de la nostra població i per tant si hi ha o no simetria per veure si és distribució normal o algun altre tipus. En el nostre cas sembla ser que és simetric. Es podria veure també en un histograma molt més fàcilment.
5.3.(0,5 puntos) Realizad la matriz de correlación del conjunto de datos remote_mental y valorad la viabilidad de realizar un modelo de regresión sobre un conjunto de variables definido.
# una regressió usa variables numèriques:
vars_numeriques <- remote_mental[, sapply(remote_mental, is.numeric)]
# matriu de correlació
matr_corr <- cor(vars_numeriques, use = "complete.obs")
print(matr_corr)
## Age Years_of_Experience
## Age 1.000000000 -0.004479608
## Years_of_Experience -0.004479608 1.000000000
## Hours_Worked_Per_Week -0.001352237 -0.018536813
## Number_of_Virtual_Meetings 0.003617222 0.019043356
## Work_Life_Balance_Rating 0.017697485 0.001698464
## Social_Isolation_Rating -0.024991733 0.001690778
## Company_Support_for_Remote_Work 0.023672611 0.007240216
## Hours_Worked_Per_Week
## Age -0.0013522369
## Years_of_Experience -0.0185368126
## Hours_Worked_Per_Week 1.0000000000
## Number_of_Virtual_Meetings -0.0046087247
## Work_Life_Balance_Rating 0.0008197413
## Social_Isolation_Rating -0.0050062894
## Company_Support_for_Remote_Work 0.0052928279
## Number_of_Virtual_Meetings
## Age 0.0036172216
## Years_of_Experience 0.0190433557
## Hours_Worked_Per_Week -0.0046087247
## Number_of_Virtual_Meetings 1.0000000000
## Work_Life_Balance_Rating 0.0072854353
## Social_Isolation_Rating -0.0002063948
## Company_Support_for_Remote_Work -0.0043733003
## Work_Life_Balance_Rating
## Age 0.0176974851
## Years_of_Experience 0.0016984637
## Hours_Worked_Per_Week 0.0008197413
## Number_of_Virtual_Meetings 0.0072854353
## Work_Life_Balance_Rating 1.0000000000
## Social_Isolation_Rating -0.0046259333
## Company_Support_for_Remote_Work -0.0129128387
## Social_Isolation_Rating
## Age -0.0249917334
## Years_of_Experience 0.0016907775
## Hours_Worked_Per_Week -0.0050062894
## Number_of_Virtual_Meetings -0.0002063948
## Work_Life_Balance_Rating -0.0046259333
## Social_Isolation_Rating 1.0000000000
## Company_Support_for_Remote_Work 0.0176591193
## Company_Support_for_Remote_Work
## Age 0.023672611
## Years_of_Experience 0.007240216
## Hours_Worked_Per_Week 0.005292828
## Number_of_Virtual_Meetings -0.004373300
## Work_Life_Balance_Rating -0.012912839
## Social_Isolation_Rating 0.017659119
## Company_Support_for_Remote_Work 1.000000000
#install.packages("corrplot")
library(corrplot)
## corrplot 0.95 loaded
corrplot(matr_corr, method = "color", type = "upper",
tl.cex = 0.8, title = "Matriu de correlació")
Amb la gràfica podem veure millor si hi ha correlació entre variables o no. En aques cas no tenim cap correlació significativa, per tant, si no hi ha correlació de variables, no tindria sentit fer una anàlisi de regressió ja que, si no hi ha correlació, indica que les variables són independents entre elles (per fer una regressió necessitem que almenys dues variables tinguin algun tipus de relació entre elles).
A partir del conjunto de datos remote_mental trabajado en el apartado anterior:
6.1. (1 punto) Mostrad las tablas de frecuencias relativas y absolutas de las variables Job_Role y Mental_Health_Condition. Representad también una tabla de frecuencias relativas cruzadas y explicad qué conclusiones se podrían obtener de la relación entre ambas variables.
# 1r fare les taules de freq abs
# Job_Role
job_role_freq_abs <- table(remote_mental$Job_Role)
print(job_role_freq_abs)
##
## Data Scientist Designer HR Marketing
## 696 723 716 683
## Project Manager Sales Software Engineer
## 738 733 711
# Mental_Health_Condition
mental_health_freq_abs <- table(remote_mental$Mental_Health_Condition)
print(mental_health_freq_abs)
##
## Anxiety Burnout Depression None
## 1278 1280 1246 1196
# ara fare les freq relatives
# freq rel Job_Role
job_role_freq_rel <- prop.table(job_role_freq_abs)
print(job_role_freq_rel)
##
## Data Scientist Designer HR Marketing
## 0.1392 0.1446 0.1432 0.1366
## Project Manager Sales Software Engineer
## 0.1476 0.1466 0.1422
# Freq rel Mental_Health_Condition
mental_health_freq_rel <- prop.table(mental_health_freq_abs)
print(mental_health_freq_rel)
##
## Anxiety Burnout Depression None
## 0.2556 0.2560 0.2492 0.2392
# finalment les taules amb les freq creuades
# freq abs creuades
cross_table_abs <- table(remote_mental$Job_Role, remote_mental$Mental_Health_Condition)
print(cross_table_abs)
##
## Anxiety Burnout Depression None
## Data Scientist 169 225 167 135
## Designer 175 175 184 189
## HR 184 194 185 153
## Marketing 170 158 143 212
## Project Manager 205 181 190 162
## Sales 197 174 186 176
## Software Engineer 178 173 191 169
# freq rel creuades
cross_table_rel <- prop.table(cross_table_abs, margin = 1) # Calcula la frecuencia relativa por fila
print(cross_table_rel)
##
## Anxiety Burnout Depression None
## Data Scientist 0.2428161 0.3232759 0.2399425 0.1939655
## Designer 0.2420470 0.2420470 0.2544952 0.2614108
## HR 0.2569832 0.2709497 0.2583799 0.2136872
## Marketing 0.2489019 0.2313324 0.2093704 0.3103953
## Project Manager 0.2777778 0.2452575 0.2574526 0.2195122
## Sales 0.2687585 0.2373806 0.2537517 0.2401091
## Software Engineer 0.2503516 0.2433193 0.2686357 0.2376934
Freqüències absolutes:
Job Role: les feines més comunes són “Project Manager” (738) i “Designer” (723) i la menys freqüent és “Marketing” (683).
Mental Health Condition: la condició que es repeteix més és el “Burnout” (1280), seguida d’ansietat i depressió (1278 i 1246, respectivament).
Freqüències relatives:
Job Role: aquí també podem veure quines són les professions més comunes, però és més interessant veure que cada professió té una freqüència entre el 0.1366 i 0.1476 (13.66% i 14.76%), que són bastant homogènies.
Mental Health Condition: veiem que un 0.256 (25.6%) són de “Burnout” i ansietat, seguides de molt a prop de la depressió o cap.
Freqüències creuades:
Absolutes: podem veure en cada professió el nº de casos de cada condiciño mental, és interessant si volem quantificar, però no per comparar i veure de forma més clara quines condicions mentals sofreixen més en cada posició.
Relatives: aquñi podem començar a veure més coses interessants. Segons la professió veurem quina condició mental és més freqüent, indicant que podria haver algun tipus de relació entre la feina i la salut mental dels treballadors. Per exemple, veiem que en “Data Scientists, hi ha un major % de”Burnouts”, en “Designer” cap condició, en HR (human resources) també “Burnout”, en Marketing cap, “Project Manager” tenen major incidència d’ansietat, en “Sales” també i en Software Engineer major incidència de depressió.
Les taules de freqüències creuades relatives ens permet veure de forma més clara quines condicions mentals són més freqüents en cada tipus de feina, i, per tant, poder veure si hi ha algun tipus de mesura aplicable per millorar la qualitat de vida dels treballadors i, per ende, menor nº de baixes i millor producció/servei. També cal dir que aquests percentatges són relativament similars, és nomès per veure una mica com es distribueix, però per saber si hi ha o no diferències significatives, implicaria l’ús d’altres anàlisis.
6.2. (0,5 puntos) Realizad un histograma de la variable Hours_Worked_Per_Week, un diagrama de barras de la variable Mental_Health_Condition, y combinad los gráficos anteriores en una representación gráfica común. Podéis utilizar la función layout() y utilizad diversos recursos visuales para su representación.
layout(matrix(c(1, 2), nrow = 1, byrow = TRUE)) #2 gràfics en 1 imatge
colors <- c("blue", "red", "green", "yellow")
hist(remote_mental$Hours_Worked_Per_Week,
main = "Hores treballades/setmana",
xlab = "Hores treballades",
ylab = "Freqüència",
col = "blue",
border = "white")
barplot(table(remote_mental$Mental_Health_Condition),
main = "Condicions de salut mental",
xlab = "Condició",
ylab = "Freqüència",
col = colors,
border = "white")
par(mar = c(5, 5, 4, 2) + 0.1)
6.3. (0,5 puntos) Utilizando el paquete de gráficos ggplot2, realizad un gráfico de tipo qplot de la variable Job_Role y Hours_Worked_Per_Week. Utilizad diversos recursos visuales para su representación y comentad los resultados. Por otra parte, realizad la representación de otras variables, utilizando otro tipos de gráficos, por ejemplo, ggplot() y el paquete tydiverse.
qplot(data = remote_mental,
x = Job_Role,
y = Hours_Worked_Per_Week,
geom = "boxplot",
fill = Job_Role) +
labs(title = "Horas treballades/setmana segons el lloc de feina",
x = "Lloc de feina",
y = "Hores treballades/setmana") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3")
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
ggplot(data = remote_mental, aes(x = Mental_Health_Condition, fill = Mental_Health_Condition)) +
geom_bar() +
labs(title = "Distribució condicions de salud mental",
x = "Condició de salud mental",
y = "Freqüència") +
theme_minimal() +
scale_fill_manual(values = c("lightblue", "lightcoral", "lightgreen", "purple")) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
En la 1ª imatge veiem un qplot de les hores treballades/setmana per professió. Sembla que la mitjana és relativament similar, a excepció del “Data Scientist”, “Designer” i “HR” (una mica més per sota dels 40h/setmana).
La següent imatge és una representació de la freqüència de les condicions de salut mental, veient que l’absència d’aquestes és lo menys freqüent.
# Creo una categòrica amb 3 categories, com que va de 0 a 5, parteixo del 1 al 2 mala relació vida-feina, 3 és mitjana i 4-5 bona relació
remote_mental$Balance_Category <- cut(remote_mental$Work_Life_Balance_Rating,
breaks = c(1, 2, 4, 5),
labels = c("Mala","Mitjana", "Bona"))
# Gráfica de barres apilades per professió
ggplot(data = remote_mental, aes(x = Job_Role, fill = Balance_Category)) +
geom_bar(position = "fill") +
labs(title = "Proporció de qualificació de l'equil·libri vida-feina segons professió",
x = "Professió",
y = "Proporció") +
scale_fill_brewer(palette = "Spectral") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
En aquest gràfic he volgut fer una representació diferent. Com tenim un dataset amb una variable que qualifica l’equilibri entre vida personal i feina he volgut mirar com ho qualifiquen segons la professió. Veiem que he creat 3 categories, baixa, mitjana i bona. En totes les profesions hi ha una freqüència majoritaria en puntuació de 3 sobre 5 (mitjana), Algunes poden tenir una mica menys de bon equil·libri segons aquesta puntuació. No podriem concluir que alguna de les feines presenta un pitjor balanç entre vida-feina, totes presenten una distribució similar.