Como primera instancia, importamos la base que escogimos para el trabajo que se extrajo de https://www.kaggle.com/datasets/debayank2024/ai-impact-on-jobs-and-salaries-2020-2026/data?select=data_dictionary.md
library(readxl)
Base <- read_excel("C:/Users/cespe/OneDrive/Documentos/Base_Imp.xlsx")
Con los siguientes códigos podremos hacer un análisis preliminar de los datos. Respectivamente, sirven para visualizar los primeros registros de la base, los últimos registros, los nombres de las columnas, las dimensiones de la base y el tipo de dato.
head(Base)
## # A tibble: 6 × 17
## work_year experience_level employment_type job_title salary salary_currency
## <dbl> <chr> <chr> <chr> <dbl> <chr>
## 1 2025 EX FT Head of Data 348516 USD
## 2 2025 EX FT Head of Data 232344 USD
## 3 2025 SE FT Data Scient… 145400 USD
## 4 2025 SE FT Data Scient… 81600 USD
## 5 2025 MI FT Engineer 160000 USD
## 6 2025 MI FT Engineer 140000 USD
## # ℹ 11 more variables: salary_in_usd <dbl>, employee_residence <chr>,
## # remote_ratio <dbl>, company_location <chr>, company_size <chr>,
## # experience_level_label <chr>, employment_type_label <chr>, work_mode <chr>,
## # salary_outlier_flag <chr>, role_family <chr>, isco_group_hint <chr>
tail(Base)
## # A tibble: 6 × 17
## work_year experience_level employment_type job_title salary salary_currency
## <dbl> <chr> <chr> <chr> <dbl> <chr>
## 1 2021 SE FT Data Specia… 1.65e5 USD
## 2 2020 SE FT Data Scient… 4.12e5 USD
## 3 2021 MI FT Principal D… 1.51e5 USD
## 4 2020 EN FT Data Scient… 1.05e5 USD
## 5 2020 EN CT Business Da… 1 e5 USD
## 6 2021 SE FT Data Scient… 7 e6 INR
## # ℹ 11 more variables: salary_in_usd <dbl>, employee_residence <chr>,
## # remote_ratio <dbl>, company_location <chr>, company_size <chr>,
## # experience_level_label <chr>, employment_type_label <chr>, work_mode <chr>,
## # salary_outlier_flag <chr>, role_family <chr>, isco_group_hint <chr>
names(Base)
## [1] "work_year" "experience_level" "employment_type"
## [4] "job_title" "salary" "salary_currency"
## [7] "salary_in_usd" "employee_residence" "remote_ratio"
## [10] "company_location" "company_size" "experience_level_label"
## [13] "employment_type_label" "work_mode" "salary_outlier_flag"
## [16] "role_family" "isco_group_hint"
dim(Base)
## [1] 71913 17
class(Base$work_year)
## [1] "numeric"
class(Base$salary_outlier_flag)
## [1] "character"
class(Base$experience_level)
## [1] "character"
Sabemos ahora con el dim() que la base tiene 71.913 registros y 17 variables.
str(Base)
## tibble [71,913 × 17] (S3: tbl_df/tbl/data.frame)
## $ work_year : num [1:71913] 2025 2025 2025 2025 2025 ...
## $ experience_level : chr [1:71913] "EX" "EX" "SE" "SE" ...
## $ employment_type : chr [1:71913] "FT" "FT" "FT" "FT" ...
## $ job_title : chr [1:71913] "Head of Data" "Head of Data" "Data Scientist" "Data Scientist" ...
## $ salary : num [1:71913] 348516 232344 145400 81600 160000 ...
## $ salary_currency : chr [1:71913] "USD" "USD" "USD" "USD" ...
## $ salary_in_usd : num [1:71913] 348516 232344 145400 81600 160000 ...
## $ employee_residence : chr [1:71913] "US" "US" "US" "US" ...
## $ remote_ratio : num [1:71913] 0 0 0 0 100 100 100 100 100 100 ...
## $ company_location : chr [1:71913] "US" "US" "US" "US" ...
## $ company_size : chr [1:71913] "M" "M" "M" "M" ...
## $ experience_level_label: chr [1:71913] "Executive-level" "Executive-level" "Senior-level" "Senior-level" ...
## $ employment_type_label : chr [1:71913] "Full-time" "Full-time" "Full-time" "Full-time" ...
## $ work_mode : chr [1:71913] "On-site" "On-site" "On-site" "On-site" ...
## $ salary_outlier_flag : chr [1:71913] "True" "False" "False" "False" ...
## $ role_family : chr [1:71913] "Analytics Manager" "Analytics Manager" "Data Scientist" "Data Scientist" ...
## $ isco_group_hint : chr [1:71913] "Information and communications technology service managers" "Information and communications technology service managers" "Mathematicians, actuaries and statisticians" "Mathematicians, actuaries and statisticians" ...
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
glimpse(Base)
## Rows: 71,913
## Columns: 17
## $ work_year <dbl> 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025,…
## $ experience_level <chr> "EX", "EX", "SE", "SE", "MI", "MI", "SE", "SE",…
## $ employment_type <chr> "FT", "FT", "FT", "FT", "FT", "FT", "FT", "FT",…
## $ job_title <chr> "Head of Data", "Head of Data", "Data Scientist…
## $ salary <dbl> 348516, 232344, 145400, 81600, 160000, 140000, …
## $ salary_currency <chr> "USD", "USD", "USD", "USD", "USD", "USD", "USD"…
## $ salary_in_usd <dbl> 348516, 232344, 145400, 81600, 160000, 140000, …
## $ employee_residence <chr> "US", "US", "US", "US", "US", "US", "US", "US",…
## $ remote_ratio <dbl> 0, 0, 0, 0, 100, 100, 100, 100, 100, 100, 0, 0,…
## $ company_location <chr> "US", "US", "US", "US", "US", "US", "US", "US",…
## $ company_size <chr> "M", "M", "M", "M", "M", "M", "M", "M", "M", "M…
## $ experience_level_label <chr> "Executive-level", "Executive-level", "Senior-l…
## $ employment_type_label <chr> "Full-time", "Full-time", "Full-time", "Full-ti…
## $ work_mode <chr> "On-site", "On-site", "On-site", "On-site", "Re…
## $ salary_outlier_flag <chr> "True", "False", "False", "False", "False", "Fa…
## $ role_family <chr> "Analytics Manager", "Analytics Manager", "Data…
## $ isco_group_hint <chr> "Information and communications technology serv…
Con el código anterior pudimos observar cómo R está clasificando el tipo de dato de cada variable de la base. El tipo de almacenamiento de R no siempre coincide con el tipo estadístico de la variable. Por ejemplo, en esta base, la variable salary_outlier_flag tiene registros lógicos (TRUE, FALSE) y R los está almacenando como character.
| employment_type_label | Codificación |
|---|---|
| Full-time | 1 |
| Part-time | 2 |
| Contract | 3 |
| Freelance | 4 |
| experience_level_label | Codificación |
|---|---|
| Executive-level | 5 |
| Senior-level | 6 |
| Mid-level | 7 |
| Entry-level | 8 |
En el código, lo hacemos así:
Base$employment_type_cod <- ifelse(Base$employment_type_label == "Full-time", 1,
ifelse(Base$employment_type_label == "Part-time", 2,
ifelse(Base$employment_type_label == "Contract", 3,
ifelse(Base$employment_type_label == "Freelance", 4, NA))))
Var1 <- Base[, c("employment_type_label", "employment_type_cod")]
Base$experience_level_cod <- ifelse(Base$experience_level_label == "Executive-level", 5,
ifelse(Base$experience_level_label == "Senior-level", 6,
ifelse(Base$experience_level_label == "Mid-level", 7,
ifelse(Base$experience_level_label == "Entry-level", 8, NA))))
Var2 <- Base[, c("experience_level_label", "experience_level_cod")]
Base$employment_type_cod <- factor(Base$employment_type_cod)
levels(Base$employment_type_cod)
## [1] "1" "2" "3" "4"
Base$experience_level_cod <- factor(Base$experience_level_cod)
levels(Base$experience_level_cod)
## [1] "5" "6" "7" "8"
En este apartado se seleccionan dos variables categóricas de la base de datos y se convierten al tipo factor.
Antes de realizar la transformación, se observan los valores diferentes que contiene la variable:
unique(Base$work_mode)
## [1] "On-site" "Remote" "Hybrid"
class(Base$work_mode)
## [1] "character"
R almacena esta variable como tipo character, debido a que sus registros están escritos como texto.
Base$work_mode_factor <- factor(Base$work_mode)
La función factor() toma los diferentes valores encontrados en work_mode y los reconoce como categorías de una variable cualitativa.
WorkMode <- Base[, c("work_mode" , "work_mode_factor")]
head(WorkMode, 10)
## # A tibble: 10 × 2
## work_mode work_mode_factor
## <chr> <fct>
## 1 On-site On-site
## 2 On-site On-site
## 3 On-site On-site
## 4 On-site On-site
## 5 Remote Remote
## 6 Remote Remote
## 7 Remote Remote
## 8 Remote Remote
## 9 Remote Remote
## 10 Remote Remote
Finalmente, se verifica el tipo de dato de la nueva variable y sus categorás:
class(Base$work_mode_factor)
## [1] "factor"
levels(Base$work_mode_factor)
## [1] "Hybrid" "On-site" "Remote"
La segunda variable seleccionada es role_family, la cual clasifica los registros según la familia ocupacional asociada al cargo.
Primero, se observan los diferentes registros presentes en la variable:
unique(Base$role_family)
## [1] "Analytics Manager" "Data Scientist" "Other / Unclassified"
## [4] "AI Engineer" "Data Analyst" "Computer Vision"
## [7] "Data Engineer" "ML Engineer" "Research Scientist"
## [10] "AI Architect" "NLP"
class(Base$role_family)
## [1] "character"
Ahora se crea una nueva variable denominada role_family_factor:
Base$role_family_factor <- factor(Base$role_family)
Con esta instrucción, R identifica cada una de las familias ocupacionales como una categoría perteneciente a un factor.
RoleFamily <- Base[, c("role_family", "role_family_factor")]
head(RoleFamily, 10)
## # A tibble: 10 × 2
## role_family role_family_factor
## <chr> <fct>
## 1 Analytics Manager Analytics Manager
## 2 Analytics Manager Analytics Manager
## 3 Data Scientist Data Scientist
## 4 Data Scientist Data Scientist
## 5 Other / Unclassified Other / Unclassified
## 6 Other / Unclassified Other / Unclassified
## 7 Other / Unclassified Other / Unclassified
## 8 Other / Unclassified Other / Unclassified
## 9 AI Engineer AI Engineer
## 10 AI Engineer AI Engineer
class(Base$role_family_factor)
## [1] "factor"
levels(Base$role_family_factor)
## [1] "AI Architect" "AI Engineer" "Analytics Manager"
## [4] "Computer Vision" "Data Analyst" "Data Engineer"
## [7] "Data Scientist" "ML Engineer" "NLP"
## [10] "Other / Unclassified" "Research Scientist"
Se analizarán las categorías o niveles de dos variables categóricas mediante las funciones class(), str() y levels().
Para realizar el ejercicio se seleccionaron las variables:
salary_outlier_flag: indica si un registro salarial fue identificado o no como un valor atípico.
isco_group_hint: clasifica las ocupaciones de acuerdo con un grupo ocupacional de referencia.
Para poder utilizar la función levels() es necesario que las variables sean reconocidas por R como factores. Por esta razón, se crearán nuevas versiones de ambas variables sin modificar las columnas originales.
Para salary_outlier_flag
Convertimos a factor a salary_outlier_flag
Base$salary_outlier_factor <- factor(Base$salary_outlier_flag)
class(Base$salary_outlier_factor)
## [1] "factor"
La función class() permite conocer el tipo de objeto que R asignó a la variable. Para este caso “Factor”
str(Base$salary_outlier_factor)
## Factor w/ 2 levels "False","True": 2 1 1 1 1 1 1 1 1 1 ...
La función str() permite observar de manera resumida cómo R almacena internamente la variable.
Al tratarse de un factor, R indicará que la variable posee dos niveles. Además, mostrará la representación interna utilizada para almacenar cada categoría.
levels(Base$salary_outlier_factor)
## [1] "False" "True"
La función levels() muestra directamente cuáles son las categorías reconocidas por R dentro del factor.
En este caso se observan las dos categorías de la variable. “False” , “True”
Con table analizamos cuantos registros pertenecen a cada categoria
table(Base$salary_outlier_factor)
##
## False True
## 70159 1754
Para isco_group_hint
Convertimos a factor isco_group_hint
Base$isco_group_factor <- factor(Base$isco_group_hint)
class(Base$isco_group_factor)
## [1] "factor"
Con esto verificamos que la transformacion fue hecha de forma correcta
str(Base$isco_group_factor)
## Factor w/ 5 levels "Business services and administration managers",..: 2 2 3 3 NA NA NA NA 5 5 ...
En este caso str nos muestra que la cariable contiene 5 categorias, lo que indica que el factor posee 5 niveles
levels(Base$isco_group_factor)
## [1] "Business services and administration managers"
## [2] "Information and communications technology service managers"
## [3] "Mathematicians, actuaries and statisticians"
## [4] "Physical and earth science professionals"
## [5] "Software and applications developers"
Levels nos muestra los nombres completos de las cinco categorias. Asi se puede comprobar que cada una quedo almacenada como un nivel diferente del factor
Usamos table para observar la distribucion de los registros
table(Base$isco_group_factor)
##
## Business services and administration managers
## 8335
## Information and communications technology service managers
## 495
## Mathematicians, actuaries and statisticians
## 7216
## Physical and earth science professionals
## 2852
## Software and applications developers
## 12475
Para este ejercicio se seleccionó la variable company_size, que representa el tamaño de la empresa asociada a cada registro.
Esta variable contiene tres categorías:
S: tamaño pequeño.
M: tamaño mediano.
L: tamaño grande.
Por lo tanto, es posible establecer el siguiente orden natural:
\[ S < M < L \]
unique(Base$company_size)
## [1] "M" "L" "S"
Comprobamos las categorias existentes dentro de la variable
class(Base$company_size)
## [1] "character"
Se observa que R la reconoce como tipo character.
Base$company_size_ordered <- factor(
Base$company_size,
levels = c("S", "M", "L"),
ordered = TRUE
)
En este codigo utilizamos la funcion factor() y ademas se establece un orden jerarquico en las categorias :
S < M < L
Ademas el codigo le indica a R que las categorias corresponden a un factor ordenado
CompanySize <- Base[, c("company_size", "company_size_ordered")]
head(CompanySize, 10)
## # A tibble: 10 × 2
## company_size company_size_ordered
## <chr> <ord>
## 1 M M
## 2 M M
## 3 M M
## 4 M M
## 5 M M
## 6 M M
## 7 M M
## 8 M M
## 9 M M
## 10 M M
Observamos la comparacion de las dos variables y verificamos visualmente la transformacion
class(Base$company_size_ordered)
## [1] "ordered" "factor"
Observamos “ordered” “factor”. R reconove la variable como un factor y ademas que sus categorias tienen un orden
table(Base$company_size_ordered)
##
## S M L
## 215 70110 1588