Introducción

El presente documento tiene como objetivo realizar una exploración inicial y una transformación de variables de una base de datos relacionada con resultados educativos y laborales de diferentes programas académicos e instituciones.

Durante el ejercicio se realizará la importación de la información, la exploración de sus dimensiones y nombres, la identificación de los tipos de variables almacenados por R y diferentes procesos de transformación y codificación.

Además, se utilizarán elementos de Markdown para organizar y presentar la información de manera clara.

Importación de la base de datos

La base de datos se encuentra almacenada en un archivo de Excel. Para realizar la importación se utiliza el paquete readxl, específicamente la función read_excel().

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

La base se importa desde el archivo de Excel y se utiliza la hoja denominada Sheet1.

base <- read_excel(
  "C:/Users/PC/Downloads/college_major_career_outcomes_2026.xlsx",
  sheet = "Sheet1"
)

La base contiene información relacionada con instituciones educativas, programas académicos, ingresos, endeudamiento, ocupaciones y diferentes indicadores de resultados laborales.

Exploración inicial de la base de datos

Primeras cinco observaciones

La función head() permite visualizar las primeras observaciones de la base de datos.

head(base, 5)
## # A tibble: 5 × 72
##   program_id   unitid opeid6 institution_name institution_control is_main_campus
##   <chr>         <dbl>  <dbl> <chr>            <chr>                        <dbl>
## 1 opeid031505…     NA  31505 A - Technical C… Private, for-profit              1
## 2 opeid031505…     NA  31505 A - Technical C… Private, for-profit              1
## 3 opeid031505…     NA  31505 A - Technical C… Private, for-profit              1
## 4 493868-12.0… 493868  42833 A Better U Beau… Private, for-profit              1
## 5 177834-13.0… 177834   2477 A T Still Unive… Private, nonprofit               1
## # ℹ 66 more variables: institution_city <chr>, institution_state <chr>,
## #   institution_region <chr>, institution_latitude <dbl>,
## #   institution_longitude <dbl>, institution_is_hbcu <dbl>,
## #   institution_admission_rate <dbl>, institution_avg_sat <dbl>,
## #   institution_undergrad_enrollment <dbl>,
## #   institution_tuition_in_state_usd <dbl>,
## #   institution_tuition_out_state_us <dbl>, cip_code_4digit <dbl>, …

Últimas cinco observaciones

La función tail() permite visualizar las últimas observaciones de la base.

tail(base, 5)
## # A tibble: 5 × 72
##   program_id   unitid opeid6 institution_name institution_control is_main_campus
##   <chr>         <dbl>  <dbl> <chr>            <chr>                        <dbl>
## 1 496520-51.3… 496520  42955 Zen Shiatsu Chi… Private, for-profit              1
## 2 495101-51.3… 495101  42753 Zion Massage Co… Private, for-profit              1
## 3 496423-12.0… 496423  43003 Zorganics Insti… Private, for-profit              1
## 4 496423-51.3… 496423  43003 Zorganics Insti… Private, for-profit              1
## 5 opeid039163…     NA  39163 eClips School o… Private, for-profit              1
## # ℹ 66 more variables: institution_city <chr>, institution_state <chr>,
## #   institution_region <chr>, institution_latitude <dbl>,
## #   institution_longitude <dbl>, institution_is_hbcu <dbl>,
## #   institution_admission_rate <dbl>, institution_avg_sat <dbl>,
## #   institution_undergrad_enrollment <dbl>,
## #   institution_tuition_in_state_usd <dbl>,
## #   institution_tuition_out_state_us <dbl>, cip_code_4digit <dbl>, …

Nombres de las variables

La función names() permite identificar las variables que conforman la base de datos.

names(base)
##  [1] "program_id"                       "unitid"                          
##  [3] "opeid6"                           "institution_name"                
##  [5] "institution_control"              "is_main_campus"                  
##  [7] "institution_city"                 "institution_state"               
##  [9] "institution_region"               "institution_latitude"            
## [11] "institution_longitude"            "institution_is_hbcu"             
## [13] "institution_admission_rate"       "institution_avg_sat"             
## [15] "institution_undergrad_enrollment" "institution_tuition_in_state_usd"
## [17] "institution_tuition_out_state_us" "cip_code_4digit"                 
## [19] "cip_title"                        "cip_family_code"                 
## [21] "cip_family_title"                 "credential_level"                
## [23] "credential_name"                  "distance_education"              
## [25] "awards_year1"                     "awards_year2"                    
## [27] "outcomes_shared_across_campuses"  "median_earnings_4yr_usd"         
## [29] "earnings_cohort_size_4yr"         "national_median_earnings_4yr_usd"
## [31] "national_p25_earnings_4yr_usd"    "national_p75_earnings_4yr_usd"   
## [33] "earnings_vs_national_pct"         "median_earnings_1yr_usd"         
## [35] "earnings_cohort_size_1yr"         "median_earnings_5yr_usd"         
## [37] "earnings_cohort_size_5yr"         "not_working_count_5yr"           
## [39] "count_above_hs_threshold_5yr"     "count_working_in_state_5yr"      
## [41] "median_debt_usd"                  "debt_borrower_count"             
## [43] "median_monthly_payment_usd"       "earnings_growth_pct_1yr_to_5yr"  
## [45] "earnings_trajectory_category"     "debt_to_earnings_1yr"            
## [47] "debt_to_earnings_4yr"             "payment_to_income_pct_1yr"       
## [49] "pct_above_hs_threshold_5yr"       "pct_working_5yr"                 
## [51] "pct_working_in_state_5yr"         "linked_occupations_count"        
## [53] "linked_occupations_in_bls"        "largest_linked_occupation"       
## [55] "largest_linked_occupation_soc"    "occupation_typical_entry_educati"
## [57] "occupation_employment_2024_thous" "occupation_growth_pct_2024_34"   
## [59] "occupation_growth_pct_max"        "occupation_annual_openings_thous"
## [61] "occupation_median_wage_2024_usd"  "linked_occupations_in_onet"      
## [63] "occupations_using_ai_software"    "ai_software_occupation_share"    
## [65] "expert_system_occupation_share"   "ai_tools_max_per_occupation"     
## [67] "hot_technologies_mean_per_occupa" "ai_tool_examples"                
## [69] "earnings_4yr_status"              "earnings_1yr_status"             
## [71] "earnings_5yr_status"              "debt_status"

Dimensiones de la base

La función dim() permite conocer el número de filas y columnas de la base.

dim(base)
## [1] 227980     72

Clase general de la base

La función class() permite identificar cómo está almacenado el objeto completo en R.

class(base)
## [1] "tbl_df"     "tbl"        "data.frame"

Análisis de la estructura de las variables

La función str() permite conocer la estructura interna de la base y observar cómo R almacenó cada variable.

Debido al tamaño de la base, se utiliza list.len = 72 para mostrar las variables sin necesidad de imprimir las observaciones completas.

str(base, list.len = 72, vec.len = 1)
## tibble [227,980 × 72] (S3: tbl_df/tbl/data.frame)
##  $ program_id                      : chr [1:227980] "opeid031505-51.07-1" ...
##  $ unitid                          : num [1:227980] NA NA ...
##  $ opeid6                          : num [1:227980] 31505 ...
##  $ institution_name                : chr [1:227980] "A - Technical College" ...
##  $ institution_control             : chr [1:227980] "Private, for-profit" ...
##  $ is_main_campus                  : num [1:227980] 1 1 ...
##  $ institution_city                : chr [1:227980] NA ...
##  $ institution_state               : chr [1:227980] NA ...
##  $ institution_region              : chr [1:227980] NA ...
##  $ institution_latitude            : num [1:227980] NA NA ...
##  $ institution_longitude           : num [1:227980] NA NA ...
##  $ institution_is_hbcu             : num [1:227980] NA NA ...
##  $ institution_admission_rate      : num [1:227980] NA NA ...
##  $ institution_avg_sat             : num [1:227980] NA NA ...
##  $ institution_undergrad_enrollment: num [1:227980] NA NA ...
##  $ institution_tuition_in_state_usd: num [1:227980] NA NA ...
##  $ institution_tuition_out_state_us: num [1:227980] NA NA ...
##  $ cip_code_4digit                 : num [1:227980] 51.1 ...
##  $ cip_title                       : chr [1:227980] "Health and Medical Administrative Services" ...
##  $ cip_family_code                 : num [1:227980] 51 51 ...
##  $ cip_family_title                : chr [1:227980] "Health Professions and Related Programs" ...
##  $ credential_level                : num [1:227980] 1 1 ...
##  $ credential_name                 : chr [1:227980] "Undergraduate Certificate or Diploma" ...
##  $ distance_education              : chr [1:227980] "Not reported to IPEDS" ...
##  $ awards_year1                    : num [1:227980] NA NA ...
##  $ awards_year2                    : num [1:227980] NA NA ...
##  $ outcomes_shared_across_campuses : num [1:227980] 0 0 ...
##  $ median_earnings_4yr_usd         : num [1:227980] 33231 ...
##  $ earnings_cohort_size_4yr        : num [1:227980] 161 NA ...
##  $ national_median_earnings_4yr_usd: num [1:227980] 35447 ...
##  $ national_p25_earnings_4yr_usd   : num [1:227980] 21575 ...
##  $ national_p75_earnings_4yr_usd   : num [1:227980] 46852 ...
##  $ earnings_vs_national_pct        : num [1:227980] -6.3 ...
##  $ median_earnings_1yr_usd         : num [1:227980] 20765 ...
##  $ earnings_cohort_size_1yr        : num [1:227980] 112 NA ...
##  $ median_earnings_5yr_usd         : num [1:227980] 26061 ...
##  $ earnings_cohort_size_5yr        : num [1:227980] 84 NA ...
##  $ not_working_count_5yr           : num [1:227980] 10 NA ...
##  $ count_above_hs_threshold_5yr    : num [1:227980] 33 NA ...
##  $ count_working_in_state_5yr      : num [1:227980] 79 NA ...
##  $ median_debt_usd                 : num [1:227980] 9087 ...
##  $ debt_borrower_count             : num [1:227980] NA NA ...
##  $ median_monthly_payment_usd      : num [1:227980] 96 NA ...
##  $ earnings_growth_pct_1yr_to_5yr  : num [1:227980] 25.5 NA ...
##  $ earnings_trajectory_category    : chr [1:227980] "steady" ...
##  $ debt_to_earnings_1yr            : num [1:227980] 0.438 ...
##  $ debt_to_earnings_4yr            : num [1:227980] 0.273 ...
##  $ payment_to_income_pct_1yr       : num [1:227980] 5.55 ...
##  $ pct_above_hs_threshold_5yr      : num [1:227980] 39.3 ...
##  $ pct_working_5yr                 : num [1:227980] 89.4 ...
##  $ pct_working_in_state_5yr        : num [1:227980] 94 NA ...
##  $ linked_occupations_count        : num [1:227980] 19 2 ...
##  $ linked_occupations_in_bls       : num [1:227980] 19 2 ...
##  $ largest_linked_occupation       : chr [1:227980] "First-line supervisors of office and administrative support workers" ...
##  $ largest_linked_occupation_soc   : chr [1:227980] "43-1011" ...
##  $ occupation_typical_entry_educati: chr [1:227980] "Bachelor's degree" ...
##  $ occupation_employment_2024_thous: num [1:227980] 8161 ...
##  $ occupation_growth_pct_2024_34   : num [1:227980] 4.89 ...
##  $ occupation_growth_pct_max       : num [1:227980] 28.5 ...
##  $ occupation_annual_openings_thous: num [1:227980] 730 ...
##  $ occupation_median_wage_2024_usd : num [1:227980] 82269 ...
##  $ linked_occupations_in_onet      : num [1:227980] 19 2 ...
##  $ occupations_using_ai_software   : num [1:227980] 1 0 ...
##  $ ai_software_occupation_share    : num [1:227980] 0.053 ...
##  $ expert_system_occupation_share  : num [1:227980] 0.368 ...
##  $ ai_tools_max_per_occupation     : num [1:227980] 1 0 ...
##  $ hot_technologies_mean_per_occupa: num [1:227980] 32 ...
##  $ ai_tool_examples                : chr [1:227980] "OpenAI ChatGPT" ...
##  $ earnings_4yr_status             : chr [1:227980] "reported" ...
##  $ earnings_1yr_status             : chr [1:227980] "reported" ...
##  $ earnings_5yr_status             : chr [1:227980] "reported" ...
##  $ debt_status                     : chr [1:227980] "reported" ...

La exploración de la estructura permite identificar variables almacenadas como numéricas, caracteres y otros tipos de datos. Esta información es importante porque el tipo de almacenamiento determina las operaciones y transformaciones que se pueden realizar posteriormente.

Identificación de variables no numéricas

A partir de la exploración inicial se identifican variables que no están almacenadas numéricamente. Para este ejercicio se seleccionan:

Estas variables contienen categorías expresadas mediante texto.

Variable institution_control

La variable institution_control identifica el tipo de control de la institución educativa.

Primero se revisan sus categorías:

table(base$institution_control, useNA = "ifany")
## 
##             Foreign Private, for-profit  Private, nonprofit              Public 
##                4662               13479               72513              137326

La variable presenta categorías como Public, Private, nonprofit, Private, for-profit y Foreign.

Codificación numérica de institution_control

Para realizar la codificación se asignan números a las diferentes categorías.

base$institution_control_cod <- match(
  base$institution_control,
  c(
    "Public",
    "Private, nonprofit",
    "Private, for-profit",
    "Foreign"
  )
)

La correspondencia utilizada es:

Código Categoría
1 Public
2 Private, nonprofit
3 Private, for-profit
4 Foreign

La nueva variable se denomina institution_control_cod.

Podemos comprobar el resultado mediante:

table(
  base$institution_control,
  base$institution_control_cod,
  useNA = "ifany"
)
##                      
##                            1      2      3      4
##   Foreign                  0      0      0   4662
##   Private, for-profit      0      0  13479      0
##   Private, nonprofit       0  72513      0      0
##   Public              137326      0      0      0

Codificación numérica de una segunda variable

La segunda variable seleccionada es distance_education, relacionada con la modalidad de educación a distancia.

Primero se observan sus categorías:

table(base$distance_education, useNA = "ifany")
## 
##  All credentials fully online   No credentials fully online 
##                         23380                        158101 
##         Not reported to IPEDS Some credentials fully online 
##                         28906                         17593

Posteriormente se realiza una codificación numérica.

base$distance_education_cod <- match(
  base$distance_education,
  c(
    "No credentials fully online",
    "Not reported to IPEDS",
    "All credentials fully online",
    "Some credentials fully online"
  )
)

La codificación utilizada es:

Código Categoría
1 No credentials fully online
2 Not reported to IPEDS
3 All credentials fully online
4 Some credentials fully online

La transformación puede comprobarse mediante:

table(
  base$distance_education,
  base$distance_education_cod,
  useNA = "ifany"
)
##                                
##                                      1      2      3      4
##   All credentials fully online       0      0  23380      0
##   No credentials fully online   158101      0      0      0
##   Not reported to IPEDS              0  28906      0      0
##   Some credentials fully online      0      0      0  17593

Conversión de variables categóricas a factor

En R, las variables categóricas pueden almacenarse como factores. Los factores son útiles para representar variables que contienen un conjunto definido de categorías.

Para este ejercicio se seleccionan las variables institution_control e institution_region.

institution_control como factor

Se crea una nueva variable denominada institution_control_factor.

base$institution_control_factor <- factor(
  base$institution_control
)

Se puede comprobar su clase mediante:

class(base$institution_control_factor)
## [1] "factor"

También se pueden consultar sus niveles:

levels(base$institution_control_factor)
## [1] "Foreign"             "Private, for-profit" "Private, nonprofit" 
## [4] "Public"

La estructura de la variable se puede observar mediante:

str(base$institution_control_factor)
##  Factor w/ 4 levels "Foreign","Private, for-profit",..: 2 2 2 2 3 3 3 3 3 3 ...

institution_region como factor

La variable institution_region contiene información sobre la región en la que se encuentra la institución.

Se transforma a factor:

base$institution_region_factor <- factor(
  base$institution_region
)

Se comprueba su clase:

class(base$institution_region_factor)
## [1] "factor"

Se muestran sus niveles:

levels(base$institution_region_factor)
##  [1] "Far West"             "Great Lakes"          "Mid East"            
##  [4] "New England"          "Outlying Areas"       "Plains"              
##  [7] "Rocky Mountains"      "Southeast"            "Southwest"           
## [10] "U.S. Service Schools"

Finalmente, se puede revisar su estructura:

str(base$institution_region_factor)
##  Factor w/ 10 levels "Far West","Great Lakes",..: NA NA NA 9 6 6 6 6 6 6 ...

Conversión de una variable categórica a factor ordenado

Una variable categórica que presenta un orden natural en esta base es earnings_trajectory_category.

Esta variable clasifica la trayectoria de los ingresos mediante categorías como:

Para representar este orden se crea un factor ordenado.

base$earnings_trajectory_ordered <- factor(
  base$earnings_trajectory_category,
  levels = c(
    "declining",
    "slow",
    "steady",
    "steep"
  ),
  ordered = TRUE
)

La variable tiene ahora un orden establecido desde una trayectoria de ingresos decreciente hasta una trayectoria de crecimiento más pronunciado.

Comprobación del factor ordenado

Primero se comprueba la clase:

class(base$earnings_trajectory_ordered)
## [1] "ordered" "factor"

Luego se muestran sus niveles:

levels(base$earnings_trajectory_ordered)
## [1] "declining" "slow"      "steady"    "steep"

También se puede observar su estructura:

str(base$earnings_trajectory_ordered)
##  Ord.factor w/ 4 levels "declining"<"slow"<..: 3 NA NA NA NA 4 NA NA NA NA ...

Finalmente, se observa la distribución de las categorías:

table(base$earnings_trajectory_ordered, useNA = "ifany")
## 
## declining      slow    steady     steep      <NA> 
##      2264      7899     11878     17080    188859

Comparación de las variables originales y transformadas

Para observar las transformaciones realizadas, se presentan algunas variables originales junto con sus respectivas variables transformadas.

head(
  base[
    ,
    c(
      "institution_control",
      "institution_control_cod",
      "distance_education",
      "distance_education_cod",
      "institution_region",
      "institution_region_factor",
      "earnings_trajectory_category",
      "earnings_trajectory_ordered"
    )
  ],
  10
)
## # A tibble: 10 × 8
##    institution_control institution_control_cod distance_education          
##    <chr>                                 <int> <chr>                       
##  1 Private, for-profit                       3 Not reported to IPEDS       
##  2 Private, for-profit                       3 Not reported to IPEDS       
##  3 Private, for-profit                       3 Not reported to IPEDS       
##  4 Private, for-profit                       3 No credentials fully online 
##  5 Private, nonprofit                        2 All credentials fully online
##  6 Private, nonprofit                        2 All credentials fully online
##  7 Private, nonprofit                        2 All credentials fully online
##  8 Private, nonprofit                        2 No credentials fully online 
##  9 Private, nonprofit                        2 Not reported to IPEDS       
## 10 Private, nonprofit                        2 All credentials fully online
## # ℹ 5 more variables: distance_education_cod <int>, institution_region <chr>,
## #   institution_region_factor <fct>, earnings_trajectory_category <chr>,
## #   earnings_trajectory_ordered <ord>

Resumen de las transformaciones realizadas

Durante el ejercicio se realizaron las siguientes actividades:

  1. Se importó la base de datos desde un archivo Excel utilizando el paquete readxl.
  2. Se realizó una exploración inicial mediante head(), tail(), names(), dim() y class().
  3. Se utilizó str() para analizar la forma en que R almacenó las variables.
  4. Se codificaron numéricamente las variables institution_control y distance_education.
  5. Se transformaron institution_control e institution_region a variables de tipo factor.
  6. Se creó un factor ordenado a partir de earnings_trajectory_category.

Tabla de variables transformadas

Variable original Transformación Tipo resultante
institution_control Codificación numérica Numérica
distance_education Codificación numérica Numérica
institution_control Conversión a factor Factor
institution_region Conversión a factor Factor
earnings_trajectory_category Factor ordenado Ordered factor

Conclusiones

La exploración inicial permitió identificar las principales características de la base de datos y conocer la forma en que R almacena sus variables.

Las funciones head(), tail(), names(), dim() y class() permitieron realizar una primera revisión de la información, mientras que str() permitió analizar con mayor detalle los tipos de datos presentes.

La codificación numérica permitió transformar dos variables originalmente almacenadas como texto en variables representadas mediante códigos numéricos. También se transformaron dos variables categóricas a factores, permitiendo identificar de manera explícita sus categorías mediante la función levels().

Finalmente, se utilizó un factor ordenado para representar la variable earnings_trajectory_category, estableciendo una secuencia entre las diferentes categorías de trayectoria de ingresos.