Punto 1: Introducción

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

Calidad de los datos

• ¿Qué variables tiene la base y de qué tipo son?

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 ...
• ¿Hay valores faltantes? ¿En qué variables?

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
• ¿Hay valores “raros” (salarios muy bajos/altos, años negativos, etc.)

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

Descripción de los Datos

• ¿Cuál es el salario promedio, mediano y la dispersión en toda la muestra?
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
• ¿Cómo se ve la distribución del salario? (histograma/densidad)
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()

Comparaciones por grupos

• ¿Cómo cambian salario promedio/mediano por rango?

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

• ¿Cómo cambian por disciplina?

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

• ¿Dentro de cada rango, hay diferencias por sexo?

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

Relación experiencia–salario

• ¿Qué relación parece haber entre salario y años desde PhD?

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()
• ¿Qué relación parece haber entre salario y años de servicio?

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

• ¿Se ve igual esa relación si separas por rango (facetas) o por disciplina?

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

Punto 2: Introducción

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

Preparación y limpieza

• ¿La fecha está en formato fecha? Si no, ¿cómo la conviertes?

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" ...
¿Hay edades faltantes o fuera de rango? ¿Cómo las detectas?

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
• ¿Cuántos registros totales hay?

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

Perfil demográfico

• ¿Cómo es la distribución de edades? (histograma)
hist(CovidMuestra$Edad,
     breaks = 20,
     col = "#4E79A7",
     main = "Distribucion de edades",
     xlab = "Edad")

• ¿Cómo cambia la distribución de edad por sexo? (facetas)

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

• ¿Cuál es la edad promedio/mediana por sexo?
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

Concentración territorial

• ¿Cuáles son los Top 10 departamentos (o municipios) por número de registros?
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
• ¿Cómo se ve esa comparación en un gráfico claro (barras ordenadas)?
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))
• Elige un departamento y mira: ¿cuáles son sus Top 10 municipios?
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

Evolución en el tiempo

• Agrega por mes (o semana): ¿cómo varía el número de registros con el tiempo?

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

• ¿La tendencia mensual cambia si separas por sexo?

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

• Identifica visualmente: ¿hay picos? ¿en qué meses?

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