1 Base de datos: “IA Generativa y empleos: Un índice global refinado de exposición ocupacional”.

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

1.1 Exploración inicial

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.

1.2 ¿Cómo R almacenó las 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.

1.3 Codificación numérica a variables No codificadas numéricamente

  • Codificamos la variable employment_type_label, que son el tipo de empleo y se compone de los siguientes registros, y en la columna siguiente, se puede ver cómo se va a codificar:
employment_type_label Codificación
Full-time 1
Part-time 2
Contract 3
Freelance 4
  • Codificamos la variable experience_level_label, que contiene en sus registros el nivel de experiencia de cada trabajador, de la siguiente manera:
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"
  • Con los objetos Var1 y Var2 se podrá visualizar solamente las dos columnas con todos los registros que cumplen las condiciones establecidas. Por la cantidad de registros no mostramos Var1 y Var2 explícitamente pero luego de correr el código, transformamos el tipo de dato de employment_type_cod y experience_level_cod en factor que expresa esos números como categorías y verificamos cuáles son esas categorías con levels().

1.4 Conversion de variables categóricas a factor

En este apartado se seleccionan dos variables categóricas de la base de datos y se convierten al tipo factor.

  1. Conversión de la variable work_mode

Antes de realizar la transformación, se observan los valores diferentes que contiene la variable:

unique(Base$work_mode)
## [1] "On-site" "Remote"  "Hybrid"
  • También podemos verificar cómo está almacenada originalmente:
class(Base$work_mode)
## [1] "character"

R almacena esta variable como tipo character, debido a que sus registros están escritos como texto.

  • A continuación, se crea una nueva variable denominada work_mode_factor, conservando sin modificaciones la variable original:
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.

  • Comprobamos
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
  • De esta manera observamos que los valores de la variable no cambian en su forma visible; cambia es la manera en que R los almacena e interpreta.

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"
  1. Conversión de la variable role_family

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"
  • Antes de realizar la transformación se verifica cómo R almacena originalmente la variable:
class(Base$role_family)
## [1] "character"
  • Al igual que work_mode, esta variable se encuentra inicialmente almacenada como tipo 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.

  • Visualizamos:
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
  • Se verifica la transformación
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"

1.5 Muestre sus categorías o niveles con funciones como class(), str(), levels().

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)
  • Verificación de la clase con class()
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”

  • Análisis de la estructura con str()
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.

  • Identificación de los niveles con levels()
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)
  • Verificación de la clase con class()
class(Base$isco_group_factor)
## [1] "factor"

Con esto verificamos que la transformacion fue hecha de forma correcta

  • Análisis de la estructura con str()
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

  • Identificación de los niveles con levels()
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

1.6 Variable categórica de orden natural a factor ordenado.

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 \]

  • Exploramos la variable
unique(Base$company_size)
## [1] "M" "L" "S"

Comprobamos las categorias existentes dentro de la variable

  • Verificamos el tipo de la variable
class(Base$company_size)
## [1] "character"

Se observa que R la reconoce como tipo character.

  • Creamos el Factor Ordenado
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

  • Visualizamos
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

  • Comprobamos el factor ordenado con class
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

  • Visualizamos la distribucion de las categorias de la nueva variable
table(Base$company_size_ordered)
## 
##     S     M     L 
##   215 70110  1588