Revisión y Validación de Datos Consolidados (GEIH)

Author

Daniel Molina, Alic Barandica

Published

August 29, 2024

Nota: Para realizar la validación de datos es recomendable haber seguido previamente la Guia: Pegado de la GEIH o tener la base de datos completa de la GEIH descargada.

Preparación de para la validación

# Instalar y cargar el paquete 'data.table' si aún no está instalado
# install.packages("data.table")
library(data.table)

# Importar la base de datos consolidada
data <- fread("C:/data-exploration/geih_complete.csv")

# Asegúrate de que la función 'merge_month()' esté disponible en tu entorno
# Puedes definir o cargar la función según sea necesario
  • Instalar y Cargar Paquete:

    • Si aún no has instalado el paquete data.table, descomenta y ejecuta la línea install.packages("data.table").

    • Luego, carga el paquete con library(data.table). Esto es necesario para usar la función fread() para importar datos.

  • Importar Datos:

    • La función fread() de data.table se utiliza para leer archivos CSV de manera eficiente. Aquí, el archivo geih_complete.csv se importa y se asigna a la variable data.

    • Asegúrate de que la ruta especificada "C:/data-exploration/geih_complete.csv" sea correcta para tu dispositivo. Puedes verificar tu directorio de trabajo actual con getwd() y ajustar la ruta según sea necesario.

  • Preparativos Adicionales:

    • Asegúrate de que la función merge_month() haya sido definida previamente como se indico en la guia sobre el pegado de la GEIH, ya que es necesaria para las operaciones posteriores. Define o carga esta función según sea necesario.

1. Función para verificar la estructura de los datos verify_variables()

La función verify_variables() se utiliza para asegurar la consistencia en la estructura de los datos a través de diferentes meses. Su objetivo es garantizar que las columnas presentes en los datos de cada mes coincidan con las columnas de un conjunto de datos consolidado

base_dir <- file.path(getwd(), "datos")

months <- list.dirs(path = base_dir, full.names = FALSE, recursive = FALSE)

verify_variables <- function() {

  for (month in months) {
  
  month_data <- merge_month(month)
  
  if (all(names(month_data) %in% names(data))) {
    print(paste("Todas las variables presentes en", month, "están presentes en los datos consolidados"))
  } else {
    print(paste("Existen variables presentes en", month, "que no se encuentran presentes en los datos consolidados"))
  }
  
  } 
}

verify_variables()

1.1 Definir el directorio base

base_dir <- file.path(getwd(), "datos")

La variable base_dir almacena la ruta hacia un subdirectorio llamado “datos” dentro del directorio de trabajo actual, obtenido mediante getwd(). La función file.path() se encarga de construir la ruta de forma segura y correcta, adaptándose automáticamente al sistema operativo, lo que asegura la portabilidad del código al manejar los separadores de ruta apropiados.

1.2 Listar los subdirectorios

months <- list.dirs(path = base_dir, full.names = FALSE, recursive = FALSE)

En esta línea, se utiliza la función list.dirs() para crear una lista de subdirectorios contenidos en el directorio especificado por base_dir. El argumento path = base_dir indica que se listarán los directorios dentro del directorio base definido anteriormente. full.names = FALSE significa que los nombres de los directorios se devolverán como nombres simples (sin incluir la ruta completa), mientras que recursive = FALSE especifica que solo se listarán los subdirectorios de nivel superior, es decir, no se explorarán subdirectorios dentro de otros subdirectorios. El resultado es una lista de nombres de directorios de nivel superior en la carpeta datos, que representa probablemente los datos organizados por meses.

1.3 Definición de la función

verify_variables <- function() {

Aquí se define una nueva función llamada verify_variables. Esta función no toma ningún argumento y su propósito es verificar que las variables (columnas) en los datos de cada mes coincidan con las variables en la data consolidada.

1.4 Iteración sobre los Meses

for (month in months) {

Se utiliza un bucle for para iterar sobre cada mes en el vector months. En cada iteración, la variable month tomará el valor de uno de los meses, por ejemplo, "enero", "febrero", etc.

1.5 Obtener Datos del Mes

month_data <- merge_month(month)

Dentro del bucle, se llama a la función merge_month() con el nombre del mes actual como argumento. Esta función debería devolver un data frame que contiene los datos para el mes especificado. El resultado se guarda en la variable month_data.

1.6 Comparación de Nombres de Columnas

if (all(names(month_data) %in% names(data))) {

Se verifica si todos los nombres de las columnas en month_data están presentes en names(data), que es un vector con los nombres de las columnas en la data consolidada. La función names() obtiene los nombres de las columnas de un data frame, y %in% verifica si cada nombre de columna de month_data está en el conjunto de nombres de columnas de data. La función all() asegura que la condición sea verdadera para todas las columnas.

1.7 Mensaje de Resultados

print(paste("Todas las variables presentes en", month, "están presentes en los datos consolidados"))

Si todas las columnas de month_data están presentes en la data consolidada, se imprime un mensaje indicando que las variables son las mismas que las del mes actual.

print(paste("Existen variables presentes en", month, "que no se encuentran presentes en los datos consolidados"))

Si alguna columna de month_data no está en la data consolidada, se imprime un mensaje indicando que las variables no son las mismas que las del mes actual.

1.8 Llamada a la Función

verify_variables()

Finalmente, la función verify_variables() es llamada para ejecutar la verificación. Esto dispara la ejecución del bucle for y la verificación de columnas para cada mes especificado en el vector months.

1.9 Retorno de la función

[1] "Todas las variables presentes en abril están presentes en los datos consolidados"
[1] "Todas las variables presentes en enero están presentes en los datos consolidados"
[1] "Todas las variables presentes en febrero están presentes en los datos consolidados"
[1] "Todas las variables presentes en junio están presentes en los datos consolidados"
[1] "Todas las variables presentes en marzo están presentes en los datos consolidados"
[1] "Todas las variables presentes en mayo están presentes en los datos consolidados"

2. Función para el conteo de registros observations()

La función observations() asegura la consistencia en el número de observaciones a lo largo de un conjunto de datos de diferentes meses.

observations <- function() {

  total_obs <- 0
  
  for (month in months) {
    month_data <- merge_month(month)
    total_obs <- total_obs + nrow(month_data)
  }
  
  if (total_obs == nrow(data)) { 
    print("El número de observaciones es correcto") 
  } else { 
      print("El número de observaciones no es correcto") 
  } 
}


observations()

2.1 Definición de la función

observations <- function() {

Aquí se define una nueva función llamada observations(). Esta función no recibe ningún argumento y su objetivo es verificar si el número total de observaciones en la data consolidada coincide con la suma de las observaciones de cada mes.

2.2 Inicialización del contador de observaciones

total_obs <- 0

Se inicializa una variable llamada total_obs con el valor 0. Esta variable se utilizará para acumular el total de observaciones de todos los meses.

2.3 Iteración sobre los meses

for (month in months) {

Se utiliza un bucle for para iterar sobre cada mes en el vector months. En cada iteración, la variable month toma el valor de uno de los meses por ejemplo, "enero", "febrero", etc..

2.4 Obtener datos del mes iterado

month_data <- merge_month(month)

Dentro del bucle, se llama a la función merge_month() con el nombre del mes actual como argumento. Esta función debería devolver un data frame que contiene los datos para el mes especificado. El resultado se guarda en la variable month_data.

2.5 Contar y acumular observaciones

total_obs <- total_obs + nrow(month_data)

Se cuenta el número de filas (observaciones) en month_data utilizando nrow(month_data) y se suma al contador total_obs. Esta operación se repite para cada mes, acumulando el total de observaciones.

2.6 Verificación del número de observaciones

if (total_obs == nrow(data)) {

Una vez que se ha acumulado el total de observaciones para todos los meses, se compara este total con el número de filas en la data consolidada (usando nrow(data)). La función nrow() obtiene el número de filas en un dataframe o data table.

2.7 Mensajes de resultado

print("El número de observaciones es correcto")

Si el total de observaciones calculado coincide con el número de filas en la data consolidada, se imprime el mensaje "El número de observaciones es correcto".

print("El número de observaciones no es correcto")

Si el total de observaciones calculado no coincide con el número de filas en la data consolidada, se imprime el mensaje "El número de observaciones no es correcto".

2.8 Llamada a la Función

observations()

Finalmente, se llama a la funciónobservations() para ejecutar el código y realizar la verificación del número total de observaciones.

2.9 Retorno de la función

[1] "El número de observaciones es correcto"

3. Función para verificar duplicados duplicate()

La función observations() asegura la consistencia en el número de observaciones a lo largo de un conjunto de datos de diferentes meses.

duplicate <- function(data) {

  duplicate <- data[duplicated(data)]

  # Verifica si hay filas duplicadas 
  if (nrow(duplicate) == 0) { 
    print("No hay duplicados por fila") 
  } else { 
    print("Hay duplicados por fila") 
  } 
}

duplicate(data)

3.1 Definición de la Función

duplicados <- function(data) {

Esta línea define una nueva función llamada duplicate. La función toma un argumento data, que representa el conjunto de datos en el cual se quiere verificar la presencia de filas duplicadas.

3.2 Identificación de filas duplicadas

duplicate <- data[duplicated(data)]

En esta línea, se utiliza la función duplicated(data) para identificar las filas duplicadas en el conjunto de datos data. La función duplicated() devuelve un vector lógico del mismo largo que data, donde cada elemento es TRUE si la fila correspondiente es un duplicado de una fila anterior y FALSE en caso contrario. Al utilizar este vector lógico para indexar data, se obtienen todas las filas duplicadas y se almacenan en un nuevo dataframe llamado duplicate.

3.3 Verificación de la presencia de duplicados

if (nrow(duplicado) == 0) {

Esta línea de código verifica si el número de filas en el data frame duplicate es igual a 0 utilizando la función nrow(), que cuenta el número de filas. Sinrow(duplicado) es 0, significa que no se encontraron filas duplicadas en el conjunto de datos original data.

3.4 Retorno de mensajes de resultados

print("No hay duplicados por fila")

Si la verificación anterior es verdadera (es decir, no hay duplicados), se imprime un mensaje indicando que"No hay duplicados por fila". Esto confirma que todas las filas del conjunto de datos son únicas.

print("Hay duplicados por fila")

Si la verificación es falsa (es decir, hay al menos una fila duplicada), se imprime un mensaje indicando que "Hay duplicados por fila". Esto señala que el conjunto de datos contiene duplicados y que es necesario manejarlos para asegurar la integridad de los datos.

3.5 Llamada a la función

duplicate(data)

Finalmente, se llama a la función duplicate() pasando como argumento el conjunto de datos data. Esta llamada ejecuta la función y realiza la verificación de duplicados en el conjunto de datos proporcionado.

3.5 Retorno de la función

[1] "No hay duplicados por fila"

4. Función para validar la completitud de los datos en las variables clave missing_values()

La función duplicate() se utiliza para verificar la existencia de filas duplicadas en un conjunto de datos específico.

missing_values <- function(data, ...) {
  data[, lapply(.SD, function(x) sum(is.na(x))), .SDcols = c(...)] 
}

missing_values(data, "DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR", "FEX_C18")

4.1 Definición de la función

missing_values <- function(data, ...) {

Esta línea define una nueva función llamada missing_values. La función toma un argumento data, que es el conjunto de datos a analizar, y un argumento variable ... que permite pasar múltiples nombres de columnas. Estos nombres de columnas representan las variables en las que se desea verificar la presencia de valores faltantes NA.

4.2 Aplicación de una función para contar valores faltantes

data[, lapply(.SD, function(x) sum(is.na(x))), .SDcols = c(...)]

Esta línea utiliza la sintaxis de data.table para contar los valores faltantes en las columnas especificadas. A continuación se desglosa cómo funciona esta línea:

  • data[, ...]: Esto indica que se está aplicando una operación a data. La coma antes del paréntesis indica que se están seleccionando columnas específicas o realizando operaciones en columnas, sin modificar filas.

  • lapply(.SD, function(x) sum(is.na(x))): Aquí se utiliza lapply() para aplicar una función a cada columna especificada. .SD (Subset of Data) es una característica de data.table que representa las columnas especificadas en .SDcols. La función anónima function(x) sum(is.na(x)) cuenta el número de valores NA en cada columna al aplicar is.na(x) para identificar valores faltantes y sum() para contar cuántos de esos valores existen.

  • .SDcols = c(...): Esta parte especifica las columnas en las que se aplicará la función. c(...) indica que las columnas serán las proporcionadas como argumentos variables a la funciónmissing_values(). Esto permite flexibilidad para verificar diferentes columnas según sea necesario.

4.3 Llamada a la función para identificar valores faltantes

missing_values(data, "DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR", "FEX_C18")

Aquí se llama a la función missing_values() pasando el conjunto de datos data y una lista de nombres de columnas: "DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR", y "FEX_C18". Esta llamada a la función genera una tabla que muestra el número de valores faltantes en cada una de estas columnas.

4.4 Retorno de la función

Lo que se espera es que las variables seleccionadas (variables clave) no tengan ningún valor nulo.

      DIRECTORIO SECUENCIA_P ORDEN HOGAR FEX_C18
          <int>       <int> <int> <int>   <int>
            0           0     0     0       0

5. Verificación de Variables con Sufijos select_suffix()

La función select_suffix() permite seleccionar y mostrar columnas de un data.table que terminan en los sufijos especificados. Si no se encuentran columnas con los sufijos proporcionados, la función informa al usuario.

select_suffix <- function(data, sufijos = "x") {
  
  regex_pattern <- paste0("\\.(", paste(sufijos, collapse = "|"), ")$")
  
  matching_cols <- grep(regex_pattern, names(data), value = TRUE)
  
  if (length(matching_cols) > 0) {
    result <- data[, ..matching_cols]
    print(result)
  } else {
    print(paste0("No hay variables que terminen en ", paste(sufijos, collapse = ", ")))
  }
}

select_suffix(data, c("x", "y", "z"))

5.1 Definición de la Función

select_suffix <- function(data, sufijos = "x") {

select_suffix: Define una función que toma dos argumentos:

  • data: Un data.table del que se seleccionarán las columnas.

  • sufijos: Un vector de sufijos para buscar en los nombres de las columnas. El valor predeterminado es "x".

5.2 Crear Patrón de Búsqueda

regex_pattern <- paste0("\\.(", paste(sufijos, collapse = "|"), ")$")

regex_pattern: Construye un patrón de expresión regular para buscar columnas cuyos nombres terminen con los sufijos especificados.

  • paste(sufijos, collapse = "|"): Une los sufijos en una cadena separada por el símbolo |, que en las expresiones regulares actúa como “o”. Por ejemplo, si sufijos es c("x", "y"), el patrón será \\.("x|y")$.

  • paste0("\\.(", ..., ")$"): Añade el prefijo \\. (para coincidir con un punto literal) y el sufijo $ (para indicar el final del nombre de la columna).

5.3 Buscar Columnas que Coincidan con el Patrón

matching_cols <- grep(regex_pattern, names(data), value = TRUE)

matching_cols: Utiliza grep() para buscar nombres de columnas en data que coincidan con el patrón.

  • regex_pattern: El patrón de búsqueda creado anteriormente.

  • names(data): Obtiene los nombres de las columnas de data.

  • value = TRUE: Devuelve los nombres de las columnas que coinciden con el patrón.

5.4 Verificar la Presencia de Columnas Coincidentes

if (length(matching_cols) > 0) {

if (length(matching_cols) > 0): Verifica si se encontraron columnas que coinciden con el patrón. length(matching_cols) devuelve el número de columnas encontradas.

5.5 Mostrar las Columnas Coincidentes

result <- data[, ..matching_cols]
print(result)
  • result: Selecciona las columnas coincidentes del data.table y las almacena en result.

  • print(result): Muestra las columnas coincidentes.

5.6 Mostrar Mensaje si No Se Encontraron Coincidencias

print(paste0("No hay variables que terminen en ", paste(sufijos, collapse = ", ")))
  • print(paste0(...)): Imprime un mensaje indicando que no se encontraron columnas que terminen con los sufijos especificados.

5.7 Ejemplo de Uso de la Función

select_suffix(data, c("x", "y", "z"))

select_suffix(data, c("x", "y", "z")): Llama a la función select_suffix() con data y los sufijos c("x", "y", "z") para buscar y mostrar las columnas que terminan en estos sufijos.

5.8 Retorno de la función

[1] "No hay variables que terminen en x, y, z"

6. Funcion para la validación de contenido content_validation()

La función content_validation``() se utiliza para verificar la consistencia de los datos entre un conjunto de datos mensual específico y un conjunto de datos consolidado.

content_validation <- function(data, month, by_col, ...) { 
  months_dictionary <- list( 
    "enero" = 1, 
    "febrero" = 2, 
    "marzo" = 3, 
    "abril" = 4, 
    "mayo" = 5, 
    "junio" = 6, 
    "julio" = 7, 
    "agosto" = 8, 
    "septiembre" = 9, 
    "octubre" = 10, 
    "noviembre" = 11, 
    "diciembre" = 12 
  )

  month_data <- merge_month(month) 

  total_complete_data <- month_data[, lapply(.SD, function(x) sum(x, na.rm = TRUE)), .SDcols = c(...), by = by_col] 
  total_month_data <- data[MES == months_dictionary[[month]], lapply(.SD, function(x) sum(x, na.rm = TRUE)), .SDcols = c(...), by = by_col]
  
  if (all(total_complete_data == total_month_data)) { 
    print("El contenido coincide") 
  } else { 
    print("El contenido no coincide") 
  } 
} 

content_validation(data, "marzo", "DPTO", c("OCI", "P7360", "P9460"))

6.1 Definición de la función

validacion <- function(data, month, by_col, ...) {

Esta línea define una nueva función llamada content_validation() La función toma cuatro argumentos:

  • data: El conjunto de datos consolidado en el que se verificará la consistencia.

  • month: El mes específico que se quiere validar.

  • by_col: La columna por la cual se agruparán los datos para la comparación.

  • ...: Un argumento variable que permite especificar múltiples columnas para las cuales se sumarán los valores durante la validación.

6.2 Creación de un diccionario de meses

months_dictionary <- list( 
  "enero" = 1, 
  "febrero" = 2, 
  "marzo" = 3, 
  "abril" = 4, 
  "mayo" = 5, 
  "junio" = 6, 
  "julio" = 7, 
  "agosto" = 8, 
  "septiembre" = 9, 
  "octubre" = 10, 
  "noviembre" = 11, 
  "diciembre" = 12 
)

Aquí se crea una lista llamada months_dictionary que asocia nombres de meses con sus correspondientes números de mes. Esta lista facilita la conversión del nombre del mes proporcionado en el argumento month a su número de mes equivalente.

6.3 Obtención de los datos del mes específico

month_data <- merge_month(month)

Se llama a la función merge_month() con el nombre del mes especificado en month para obtener los datos correspondientes a ese mes. El resultado es un data frame llamado month_data que contiene la información para el mes actual.

6.4 Cálculo de resultados por mes

total_complete_data <- month_data[, lapply(.SD, function(x) sum(x, na.rm = TRUE)), .SDcols = c(...), by = by_col]
  • .SD: Es un data table subset que contiene solo las columnas especificadas en .SDcols.

  • lapply(.SD, function(x) sum(x, na.rm = TRUE)): Aplica una función a cada columna en .SD. La función cuenta la suma de los valores en cada columna, ignorando los valores NA.

  • .SDcols = c(...): Especifica las columnas a las cuales aplicar la función. c(...) permite pasar múltiples nombres de columnas.

  • by = by_col: Agrupa los resultados por la columna especificada en by_col.

El resultado, total_complete_data, es un data frame con la suma de valores para cada columna especificada, agrupado por la columna de agrupamiento en month_data.

6.5 Cálculo de resultados en el conjunto de datos consolidado

total_month_data <- data[MES == months_dictionary[[month]], lapply(.SD, function(x) sum(x, na.rm = TRUE)), .SDcols = c(...), by = by_col]
  • data[MES == months_dictionary[[month]]]: Filtra el conjunto de datos consolidado data para seleccionar solo las filas correspondientes al mes especificado. El número del mes se obtiene del months_dictionary.

  • El cálculo realizado es similar al de total_complete_data: se suman los valores en las columnas especificadas, agrupados por la columna by_col.

6.6 Comparación de resultados y mensajes de resultado

if (all(total_complete_data == total_month_data)) { 
  print("El contenido coincide") 
} else { 
  print("El contenido no coincide") 
}
  • all(total_complete_data == total_month_data): Compara si todos los valores en total_complete_data son iguales a los valores en total_month_data La función all() devuelve TRUE si todas las comparaciones son verdaderas.

  • print("El contenido coincide"): Si todos los valores coinciden, se imprime este mensaje.

  • print("El contenido no coincide"): Si hay alguna discrepancia entre total_complete_data y total_month_data, se imprime este mensaje

6.7 Llamada a la función para validación

content_validation(data, "marzo", "DPTO", c("OCI", "P7360", "P9460"))
  • data: Conjunto de datos consolidado.

  • marzo: Mes que se quiere validar.

  • DPTO: Columna por la cual se agruparán los datos.

  • c("OCI", "P7360", "P9460"): Columnas para las cuales se sumarán los valores durante la validación.

Esta llamada a la función ejecuta la validación para el mes de marzo, comparando los resultados de las sumas en el conjunto de datos del mes específico con los resultados en el conjunto de datos consolidado.

6.8 Retorno de la función

[1] "El contenido coincide"

Apéndice

Función verify_variables()

La función verify_variables() se utiliza para garantizar la consistencia en la estructura de los datos a lo largo del tiempo. Itera a través de los datos de cada mes, verifica si las columnas en los datos de cada mes coinciden con las de un conjunto de datos consolidado, y proporciona retroalimentación sobre cualquier discrepancia encontrada. Esto es crucial para asegurar que el análisis posterior sea consistente y preciso, evitando errores debido a diferencias en la estructura de los datos.

Función observations()

La función observations() asegura la consistencia en el número de observaciones a lo largo de un conjunto de datos de diferentes meses. Al sumar el número de observaciones de cada mes y compararlo con el número de observaciones en el conjunto de datos consolidado, esta función ayuda a identificar posibles pérdidas o duplicaciones de datos. Este proceso es esencial para mantener la integridad de los datos en análisis longitudinales, donde las inconsistencias en el número de observaciones podrían afectar la validez de los resultados.

Función duplicate()

La función duplicate() se utiliza para verificar la existencia de filas duplicadas en un conjunto de datos específico. Primero, identifica todas las filas duplicadas y las almacena en un nuevo data frame. Luego, verifica si hay o no filas duplicadas al comprobar el número de filas en el data frame de duplicados. Dependiendo del resultado, se imprime un mensaje para informar al usuario si hay duplicados en las filas o si todas las filas son únicas. Detectar y manejar duplicados es crucial en análisis de datos para evitar sesgos y asegurar que los resultados reflejen con precisión la realidad del fenómeno estudiado..

Función missing_values()

La función missing_values() se utiliza para evaluar la completitud de datos en un conjunto específico de columnas dentro de un data frame. Al contar el número de valores faltantes NA en cada columna especificada, esta función ayuda a identificar problemas de calidad de datos, como la presencia de registros incompletos. Tener columnas clave con valores faltantes puede afectar negativamente los análisis posteriores, por lo que esta función es útil para realizar una limpieza de datos inicial y asegurar que las columnas esenciales estén completas antes de proceder con análisis más detallados

Función select_suffix()

La función select_suffix() permite seleccionar y mostrar columnas de un data.table que terminan en los sufijos especificados. Si no se encuentran columnas con los sufijos proporcionados, la función informa al usuario. Esto facilita la identificación y el análisis de columnas específicas en un conjunto de datos.

Función content_validation()

La función content_validation() se utiliza para verificar la consistencia de los datos entre un conjunto de datos mensual específico y un conjunto de datos consolidado. Primero, obtiene los datos del mes especificado y calcula las sumas de ciertas columnas agrupadas por una columna clave. Luego, realiza el mismo cálculo en el conjunto de datos consolidado para el mes correspondiente y compara los resultados. Esta función es esencial para asegurar que los datos de los meses individuales coincidan con los datos en el conjunto consolidado, garantizando así la integridad y precisión de los datos en el análisis.

Contáctanos

Te invitamos a explorar el proyecto completo, con todas su guias indicaciones y demás ¡Solo visita el repositorio del Proyecto!

Daniel Molina: GitHub - LinkedIn

Alic Barandica: GitHub - LinkedIn