PEC 1

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:

  1. 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.

  2. Conjunto de datos sobre el trabajo remoto y la salud mental que pueden descargarse en el siguiente enlace: Remote Work & Mental Health (kaggle.com)

  3. Conjunto de datos bacteria del paquete MASS de Rstudio que trabaja datos de tests acerca de la presencia de la bacteria H en pacientes.

Sección 1. Importación, exportación y gestión de datos (3 puntos)

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.

Ejercicio 1(1 punto)

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.

Ejercicio 2(1 punto)

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)

Ejercicio 3(1 punto)

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).

Sección 2: Análisis básico del conjunto de datos (3,5 puntos)

El objetivo de esta sección es obtener información sobre un determinado conjunto de datos realizando operaciones y consultas diversas.

Ejercicio 4

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

  1. Homogeneitat de les dades: tenim dades del mateix tipus (ja siguin numèriques o caràcters).

  2. 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.

  3. 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:

  1. 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))

  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))

Sección 3: Estadística descriptiva y gráficos (3,5 puntos)

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.

Ejercicio 5(1,5 puntos)

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).

Ejercicio 6(2 puntos)

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.