Ejercicio 1:
- Seleccionar un data set de los datasets de R o de GitHub (ver nota)
library(datasets)
library(tidyverse)
library(DT)
library(carData)
library(skimr)
library(funModeling)
library(dplyr)
library(mice)El salario académico de nueve meses de 2008-09 para profesores asistentes, profesores asociados y catedráticos en una universidad de EE.UU.
Los datos se recogieron como parte del esfuerzo continuo de la administración de la universidad para controlar las diferencias salariales entre los miembros del profesorado masculino y femenino.
Un marco de datos con 397 observaciones sobre las siguientes 6 variables.
rankun factor con niveles AssocProf AsstProf Profdisciplineun factor con niveles A (departamentos “teóricos”) o B (departamentos “aplicados”).yrs.since.phd: años desde el doctoradoyrs.service: años de servicio.sex: un factor con niveles Mujer Hombresalary:salario de nueve meses, en dólares
DT::datatable(Salaries)df1=Salaries`
Ejercicio 2
El mismo debe contener mínimo 100 observaciones, mínimo 3 variables numéricas, mínimo tres variables categóricas y mínimo 5% de datos ausentes (NA)
- La base de datos no tiene valores perdidos, vamos a agregar
NAsaleatoriamente en cada una de las columnas (5%) como se muestra a continuación
set.seed(123)
df2=df1 %>% mutate(rank= replace(rank, sample(row_number(),
size = ceiling(0.05 * n()),
replace = FALSE), NA) )
df2=df2 %>% mutate(discipline=replace(discipline, sample(row_number(),
size = ceiling(0.05 * n()),
replace = FALSE), NA) )
df2=df2 %>% mutate(yrs.since.phd=replace(yrs.since.phd, sample(row_number(),
size = ceiling(0.05 * n()),
replace = FALSE), NA) )
df2=df2 %>% mutate(yrs.service=replace(yrs.service, sample(row_number(),
size = ceiling(0.05 * n()),
replace = FALSE), NA) )
df2=df2 %>% mutate(sex=replace(sex, sample(row_number(),
size = ceiling(0.05 * n()),
replace = FALSE), NA) )
df2=df2 %>% mutate(salary=replace(salary, sample(row_number(),
size = ceiling(0.05 * n()),
replace = FALSE), NA) )DT::datatable(df2)sum(is.na(df2))## [1] 120
- En total en el dataframe hay 120 datos faltantes.
colSums(is.na(df2))## rank discipline yrs.since.phd yrs.service sex
## 20 20 20 20 20
## salary
## 20
En cada una de las columnas hay 20 datos faltantes.
skim(df2)| Name | df2 |
| Number of rows | 397 |
| Number of columns | 6 |
| _______________________ | |
| Column type frequency: | |
| factor | 3 |
| numeric | 3 |
| ________________________ | |
| Group variables | None |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| rank | 20 | 0.95 | FALSE | 3 | Pro: 253, Ass: 63, Ass: 61 |
| discipline | 20 | 0.95 | FALSE | 2 | B: 208, A: 169 |
| sex | 20 | 0.95 | FALSE | 2 | Mal: 342, Fem: 35 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| yrs.since.phd | 20 | 0.95 | 22.36 | 12.88 | 1 | 12 | 21 | 32 | 56 | ▇▇▆▅▁ |
| yrs.service | 20 | 0.95 | 17.48 | 12.94 | 0 | 7 | 16 | 26 | 60 | ▇▅▃▂▁ |
| salary | 20 | 0.95 | 113746.41 | 30447.14 | 57800 | 91000 | 107200 | 134550 | 231545 | ▅▇▅▂▁ |
Ejercicio 3
Imputar datos para una variable categórica empleando la moda
Se considera la siguiente función
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}df3=df2getmode(df3$rank)## [1] Prof
## Levels: AsstProf AssocProf Prof
- La moda es “Prof”
df3$rank<-as.character(df3$rank)df3$rank<-ifelse(is.na(df3$rank),getmode(df3$rank),df3$rank)DT::datatable(df3)colSums(is.na(df3))## rank discipline yrs.since.phd yrs.service sex
## 0 20 20 20 20
## salary
## 20
- Podemos observar que ya no hay valores nulos en la variable
rank
Ejercicio 4
Imputar datos para otra variable categórica con cadenas de texto
df3$sex<- as.character(df3$sex) En los NAs de la variable sex los vamos a sustituir por la el texto Sexo_deconocido
df3=df3 %>% mutate(sex = replace_na(sex, "Sexo_desconocido"))
DT::datatable(df3)Ejercicio 5
colnames(df3)## [1] "rank" "discipline" "yrs.since.phd" "yrs.service"
## [5] "sex" "salary"
Hacer dos imputaciones con el paquete mice
columns <- c("yrs.since.phd", "yrs.service")
imputed_data <- mice(df3[,names(df3) %in% columns],m = 1,
maxit = 1, method = "mean",seed = 2018,print=F)
complete.data <- mice::complete(imputed_data)- Reescribiendo las variables imputadas
base1<-df3
base1$yrs.since.phd <- complete.data$yrs.since.phd
base1$yrs.service <- complete.data$yrs.service
DT::datatable(base1)xyplot(imputed_data,yrs.since.phd ~yrs.service)par(mfrow=c(1,2))
plot(density(df3$yrs.since.phd,na.rm = T),col=2,main="yrs.since.phd")
lines(density(complete.data$yrs.since.phd),col=3)
plot(density(df3$yrs.service,na.rm = T),col=2,main="yrs.service")
lines(density(complete.data$yrs.service),col=3)Ejercicio 6
Convertir la tercera variable categórica en numérica
La variable restante es la variable discipline
library(caret) # contiene la función dummyVars
library(fastDummies)disci_dummie=dummy_cols(Salaries, select_columns = c("discipline")) %>%
select(-c("discipline"))
DT::datatable(disci_dummie)Ejercicio 7
Discretizar una de las variables