En una base de la universidad. Para cada profesor hay información del salario, su rango académico (por ejemplo assistant/associate/full), disciplina/departamento, sexo, y medidas de experiencia (años desde PhD, años de servicio). El decano quiere entender patrones generales antes de tomar decisiones (promociones, contratación, equidad salarial).
| rank | discipline | yrs.since.phd | yrs.service | sex | salary |
|---|---|---|---|---|---|
| Prof | B | 19.5 | 18 | Male | 139750 |
| Prof | B | 20.0 | 16 | Male | 173200 |
| AsstProf | B | 4.0 | 3 | Male | 79750 |
| Prof | B | 45.0 | 39 | Male | 115000 |
| Prof | B | 40.0 | 41 | Male | 141500 |
| AssocProf | B | 6.0 | 6 | Male | 97000 |
La Tabla tiene 6 Variables, 3 de tipo Character y 3 de tipo Numero.
str(Salaries)
## tibble [397 × 6] (S3: tbl_df/tbl/data.frame)
## $ rank : chr [1:397] "Prof" "Prof" "AsstProf" "Prof" ...
## $ discipline : chr [1:397] "B" "B" "B" "B" ...
## $ yrs.since.phd: num [1:397] 19.5 20 4 45 40 6 30 45 21 18 ...
## $ yrs.service : num [1:397] 18 16 3 39 41 6 23 45 20 18 ...
## $ sex : chr [1:397] "Male" "Male" "Male" "Male" ...
## $ salary : num [1:397] 139750 173200 79750 115000 141500 ...
R/ No tiene valores faltantes en ninguna variable
colSums(is.na(Salaries))
## rank discipline yrs.since.phd yrs.service sex
## 0 0 0 0 0
## salary
## 0
R/ Se identifican valores atípicos en dos variables. En la variable años de servicio se observa la presencia de valores extremos, dado que el valor máximo alcanza los 60 años, mientras que la media es de aproximadamente 17 años. Asimismo, en la variable salario, el boxplot evidencia la existencia de tres valores atípicos.
kable(summary(Salaries))
| rank | discipline | yrs.since.phd | yrs.service | sex | salary | |
|---|---|---|---|---|---|---|
| Length:397 | Length:397 | Min. : 1.00 | Min. : 0.00 | Length:397 | Min. : 57800 | |
| Class :character | Class :character | 1st Qu.:12.00 | 1st Qu.: 7.00 | Class :character | 1st Qu.: 91000 | |
| Mode :character | Mode :character | Median :21.00 | Median :16.00 | Mode :character | Median :107300 | |
| NA | NA | Mean :22.32 | Mean :17.61 | NA | Mean :113706 | |
| NA | NA | 3rd Qu.:32.00 | 3rd Qu.:27.00 | NA | 3rd Qu.:134185 | |
| NA | NA | Max. :56.00 | Max. :60.00 | NA | Max. :231545 |
par(mfrow = c(1, 3))
boxplot(Salaries$yrs.since.phd, main = "Años desde PhD",col = "#4E79A7")
boxplot(Salaries$yrs.service, main = "Años de servicio",col = "#59A14F")
boxplot(Salaries$salary, main = "Salario", col = "#F28E2B")
Salaries %>%
summarise(
promedio = mean(salary),
mediana = median(salary),
sd = sd(salary),
minimo = min(salary),
maximo = max(salary)
)%>%
kable()
| promedio | mediana | sd | minimo | maximo |
|---|---|---|---|---|
| 113706.5 | 107300 | 30289.04 | 57800 | 231545 |
ggplot(Salaries, aes(x = salary)) +
geom_histogram(bins = 30, fill = "#4E79A7", color = "white") +
labs(title = "Distribucion del salario",
x = "Salario", y = "Frecuencia")+theme_classic()
ggplot(Salaries, aes(x = salary)) +
geom_density(fill = "#F28E2B") +
labs(title = "Densidad del salario")+theme_classic()
R/ El salario promedio y mediano es mayor en los profesores titulares, seguido por los asociados y, finalmente, por los asistentes.
Salaries %>%
group_by(rank) %>%
summarise(
promedio = mean(salary),
mediana = median(salary)
)%>%
kable()
| rank | promedio | mediana |
|---|---|---|
| AssocProf | 93876.44 | 95626.5 |
| AsstProf | 80775.99 | 79800.0 |
| Prof | 126772.11 | 123321.5 |
ggplot(Salaries, aes(x = rank, y = salary,fill = rank)) +
geom_boxplot() +
scale_fill_manual(values = c("#4E79A7", "#F28E2B","#59A14F")) +
labs(title = "Salario por rango academico")+theme_classic()
R/ Al comparar los salarios por disciplina, se observa que tanto el salario promedio como el salario mediano son mayores en la disciplina B en comparación con la disciplina A.
Salaries %>%
group_by(discipline) %>%
summarise(
promedio = mean(salary),
mediana = median(salary)
)%>%
kable()
| discipline | promedio | mediana |
|---|---|---|
| A | 108548.4 | 104350.0 |
| B | 118028.7 | 113018.5 |
ggplot(Salaries, aes(x = discipline, y = salary, fill = discipline)) +
geom_boxplot() +
scale_fill_manual(values = c("#4E79A7", "#F28E2B")) +
labs(title = "Salario por Disciplina")+ theme_classic()
R/ Al analizar el salario por rango académico y sexo, se observan diferencias salariales entre hombres y mujeres dentro de cada rango. En general, los hombres presentan salarios promedio y medianos ligeramente superiores a los de las mujeres, aunque estas diferencias no son homogéneas en todos los rangos.
Salaries %>%
group_by(rank, sex) %>%
summarise(
promedio = mean(salary),
mediana = median(salary),
.groups = "drop"
)%>%
kable()
| rank | sex | promedio | mediana |
|---|---|---|---|
| AssocProf | Female | 88512.80 | 90556.5 |
| AssocProf | Male | 94869.70 | 95626.5 |
| AsstProf | Female | 78049.91 | 77000.0 |
| AsstProf | Male | 81311.46 | 80182.0 |
| Prof | Female | 121967.61 | 120257.5 |
| Prof | Male | 127120.82 | 123996.0 |
ggplot(Salaries, aes(x = sex, y = salary, fill = sex)) +
geom_boxplot() +
facet_wrap(~ rank) +
labs(title = "Salario por sexo dentro de cada rango")+theme_classic()
R/ Se observa una relación positiva entre el salario y los años transcurridos desde la obtención del PhD. En general, a mayor experiencia académica, mayores niveles salariales, aunque la relación no es perfectamente lineal y presenta dispersión
ggplot(Salaries, aes(x = yrs.since.phd, y = salary)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Salario vs anos desde PhD")+theme_classic()
R/ El análisis entre salario y años de servicio al igual que la anterior grafica muestra una relación positiva: los docentes con mayor tiempo de servicio suelen percibir salarios más altos. Sin embargo, se observa una dispersión considerable, lo que indica que el salario no depende únicamente de los años de servicio.
ggplot(Salaries, aes(x = yrs.service, y = salary)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Salario vs anos de servicio")+
theme_classic( )
R/ En la primera gráfica se observa que la relación entre experiencia y salario varía según el rango académico. Para los profesores asociados y profesores titulares, la tendencia tiende a ser negativa, mientras que en el caso de los profesores asistentes tiende a ser positiva
En la segunda gráfica, que incorpora la variable disciplina, se mantiene la relación positiva entre experiencia y salario al analizar por rango y disciplina. Sin embargo, el rango académico genera diferencias salariales más marcadas. Además, se evidencia que la disciplina B presenta salarios más altos que la disciplina A para niveles similares de experiencia.
par(mfrow = c(2, 2))
ggplot(Salaries, aes(x = yrs.service, y = salary)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~ rank) +
labs(title = "Relacion experiencia-salario por rango")+theme_classic()
ggplot(Salaries, aes(x = yrs.service, y = salary)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~ discipline) +
labs(title = "Relacion experiencia-salario por disciplina")+
theme_classic()
En una muestra de registros asociados a COVID (o vigilancia epidemiológica) se incluye variables como fecha, edad, sexo, y ubicación (departamento/municipio). La Secretaría de Salud quiere una lectura rápida: ¿qué grupos aparecen más?, ¿en qué territorios se concentra?, ¿cómo cambia con el tiempo?
| Divipola | Departamento | Municipio | Edad | Sexo | Fecha |
|---|---|---|---|---|---|
| 76 | VALLE | CALI | 25 | M | 2020-05-30 |
| 11 | BOGOTA | BOGOTA | 20 | F | 2020-09-02 |
| 15 | BOYACA | GUATEQUE | 37 | M | 2021-06-22 |
| 11 | BOGOTA | BOGOTA | 29 | M | 2020-12-22 |
| 05 | ANTIOQUIA | MEDELLIN | 27 | F | 2020-09-22 |
| 76 | VALLE | CALI | 62 | M | 2021-01-24 |
La fecha no esta en formato Fecha
CovidMuestra <- read_excel("CovidMuestra.xlsx")
str(CovidMuestra)
## tibble [1,500 × 6] (S3: tbl_df/tbl/data.frame)
## $ Divipola : chr [1:1500] "76" "11" "15" "11" ...
## $ Departamento: chr [1:1500] "VALLE" "BOGOTA" "BOYACA" "BOGOTA" ...
## $ Municipio : chr [1:1500] "CALI" "BOGOTA" "GUATEQUE" "BOGOTA" ...
## $ Edad : num [1:1500] 25 20 37 29 27 62 13 39 43 59 ...
## $ Sexo : chr [1:1500] "M" "F" "M" "M" ...
## $ Fecha : chr [1:1500] "2020-05-30" "2020-09-02" "2021-06-22" "2020-12-22" ...
y se ajusta con el siguiente codigo:
CovidMuestra$Fecha <- as.Date(CovidMuestra$Fecha)
str(CovidMuestra)
## tibble [1,500 × 6] (S3: tbl_df/tbl/data.frame)
## $ Divipola : chr [1:1500] "76" "11" "15" "11" ...
## $ Departamento: chr [1:1500] "VALLE" "BOGOTA" "BOYACA" "BOGOTA" ...
## $ Municipio : chr [1:1500] "CALI" "BOGOTA" "GUATEQUE" "BOGOTA" ...
## $ Edad : num [1:1500] 25 20 37 29 27 62 13 39 43 59 ...
## $ Sexo : chr [1:1500] "M" "F" "M" "M" ...
## $ Fecha : Date[1:1500], format: "2020-05-30" "2020-09-02" ...
R/ No tiene valores faltantes y los valores estan dentro del rango debido a que el maximo es 96 y el minimo es 1
sum(is.na(CovidMuestra$edad))
## [1] 0
min(CovidMuestra$Edad)
## [1] 1
max(CovidMuestra$Edad)
## [1] 96
R/ el data set cuenta con 1.500 filas y 6 columnas para un totald e 9000 registros
nrow(CovidMuestra)
## [1] 1500
ncol(CovidMuestra)
## [1] 6
nrow(CovidMuestra)* ncol(CovidMuestra)
## [1] 9000
hist(CovidMuestra$Edad,
breaks = 20,
col = "#4E79A7",
main = "Distribucion de edades",
xlab = "Edad")
La distribución de edades por sexo muestra que la mayoría de los registros se concentran entre los 20 y 40 años. A partir de los 60 años, la frecuencia disminuye de manera progresiva. Aunque se observan ligeras variaciones en algunos rangos, las curvas de distribución para hombres y mujeres presentan patrones similares, sin evidenciar diferencias significativas entre ambos sexos.
library(ggplot2)
ggplot(CovidMuestra, aes(x = Edad, fill = Sexo)) +
geom_histogram(
position = "identity",
alpha = 0.6,
bin = 20,
color = "white"
) +
scale_fill_manual(values = c("M" = "#00BFC4",
"F" = "#F8766D")) +
labs(
title = "Distribucion de edad por sexo",
x = "Edad",
y = "Frecuencia",
fill = "Sexo"
) +
theme_classic()
CovidMuestra %>%
group_by(Sexo) %>%
summarise(
promedio = mean(Edad),
mediana = median(Edad),
) %>%
kable()
| Sexo | promedio | mediana |
|---|---|---|
| F | 41.07286 | 39.0 |
| M | 37.80114 | 35.5 |
top_deptos <- CovidMuestra %>%
count(Departamento, sort = TRUE) %>%
slice_head(n = 10)%>%
kable()
top_deptos
| Departamento | n |
|---|---|
| BOGOTA | 506 |
| ANTIOQUIA | 238 |
| VALLE | 122 |
| CUNDINAMARCA | 101 |
| SANTANDER | 72 |
| NORTE SANTANDER | 41 |
| BOYACA | 33 |
| CORDOBA | 33 |
| HUILA | 32 |
| TOLIMA | 32 |
library(dplyr)
library(ggplot2)
library(scales)
plotdata <- CovidMuestra %>%
count(Departamento) %>%
mutate(
pct = n / sum(n),
pctlabel = paste0(round(pct*100, 1), "%")
) %>%
arrange(desc(pct)) %>%
slice_head(n = 10)
ggplot(plotdata,
aes(x = reorder(Departamento, -pct),
y = pct)) +
geom_bar(stat = "identity",
fill = "#F28E2B",
color = "white") +
geom_text(
aes(label = pctlabel),
vjust = -0.2,
size = 3
) +
scale_y_continuous(labels = percent) +
labs(
x = "Departamento",
y = "Porcentaje",
title = "Top 10 departamentos por porcentaje de registros"
) +
theme_classic() + theme(axis.text.x = element_text(size = 6 , angle = 45, hjust = 1))
CovidMuestra %>%
filter(Departamento == "VALLE") %>%
count(Municipio, sort = TRUE) %>%
slice_head(n = 10)%>%
kable()
| Municipio | n |
|---|---|
| CALI | 84 |
| TULUA | 7 |
| CARTAGO | 5 |
| PALMIRA | 5 |
| EL CERRITO | 4 |
| BUGA | 3 |
| YUMBO | 3 |
| BUENAVENTURA | 2 |
| CANDELARIA | 2 |
| FLORIDA | 2 |
R/ los registros tienden aumentar hasta junio de 2021 donde alcanza su pico maximo y disminuye el numero de registros.
library(dplyr)
library(ggplot2)
registros_mes <- CovidMuestra%>%
group_by(Mes = format(Fecha, "%Y-%m")) %>%
summarise(Conteo = n())
ggplot(registros_mes, aes(x = Mes, y = Conteo, group = 1)) +
geom_line(color = "#4E79A7") +
geom_point() +
labs(title = "Numero de registros por mes",
x = "Mes", y = "Numero de registros") +
theme_classic() + theme(axis.text.x = element_text(size = 6 , angle = 45, hjust = 1))
R/ la tendencia es la misma a pesar que las mujeres evidencian mayores registros de casos en el pico.
registros_mes_sexo <- CovidMuestra %>%
group_by(Mes = format(Fecha, "%Y-%m"), Sexo) %>%
summarise(Conteo = n(), .groups = "drop")
ggplot(registros_mes_sexo, aes(x = Mes, y = Conteo, color = Sexo, group = Sexo)) +
geom_line() +
geom_point() +
labs(title = "Numero de registros por mes segun sexo",
x = "Mes", y = "Numero de registros") +
theme_classic() + theme(axis.text.x = element_text(size = 6 , angle = 45, hjust = 1))+
scale_color_manual(values = c("M" = "#00BFC4","F" = "#F8766D"))
R/ Podemos evidenciar Picos en los meses: Agosto 2020 = 110 enero 2021 = 142 Junio 2021 = 295
ggplot(registros_mes, aes(x = Mes, y = Conteo)) +
geom_line(color = "darkred") +
geom_point(size = 2) +
labs(title = "Picos en numero de registros por mes", x = "Mes", y = "Numero de registros") +
geom_text(aes(label = Conteo), vjust = -1, color = "black", size = 2)+
theme_classic()+theme(axis.text.x = element_text(size = 6 , angle = 45, hjust = 1))