#install.packages(c("ggcorrplot", "readxl", "dplyr", "tidyverse", "Amelia", "janitor", "magrittr", "ggplot2", "pastecs", "nortest","psych", "skimr", "gridExtra"))
library(gridExtra)
library(psych)
library(ggcorrplot)
## Cargando paquete requerido: ggplot2
## 
## Adjuntando el paquete: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
library(readxl)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ✔ readr     2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%()   masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter()  masks stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(Amelia)
## Cargando paquete requerido: Rcpp
## ## 
## ## Amelia II: Multiple Imputation
## ## (Version 1.8.2, built: 2024-04-10)
## ## Copyright (C) 2005-2024 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##
library(janitor)
## 
## Adjuntando el paquete: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(magrittr)
## 
## Adjuntando el paquete: 'magrittr'
## 
## The following object is masked from 'package:purrr':
## 
##     set_names
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
library(ggplot2)
library(dplyr)
library(pastecs)
## 
## Adjuntando el paquete: 'pastecs'
## 
## The following object is masked from 'package:magrittr':
## 
##     extract
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## The following objects are masked from 'package:dplyr':
## 
##     first, last
library(nortest)
library(skimr)

Contexto y Objetivos

El censo “Colombianos registrados en el exterior” proporciona un conjunto de datos sobre los ciudadanos colombianos que se han registrado en consulados y embajadas fuera de Colombia. Estos datos incluyen detalles demográficos como edad, género, y ubicación de residencia en el extranjero. El propósito principal es entender la distribución de los colombianos en el exterior, lo que puede ayudar en la planificación de políticas y servicios consulares.

¿Qué hay en este conjunto de Datos?

Este estudio incluye las siguientes variables

Claro, aquí te presento los ítems de Studio con los nombres de las variables en negrilla:

  1. País: Indica el país de residencia de la persona. Cuando no se tienen datos registrados se presenta el texto “(NO REGISTRA)”.
  2. Código ISO país: ISO del país de residencia. Cuando no se tienen datos registrados se presenta el texto “(NO REGISTRA)”.
  3. Oficina de registro: Consulado donde la persona realizó su registro consular. Cuando no se tienen datos registrados se presenta el texto “(NO REGISTRA)”.
  4. Grupo edad: Grupo basado en la edad, como “Primera infancia” (0-5 años) o “Adulto Mayor” (60+).
  5. Edad (años): Edad de la persona, con -1 indicando datos faltantes.
  6. Área Conocimiento: Área de conocimiento, con “(NO REGISTRA)” si falta.
  7. Sub Área Conocimiento: Subárea específica, con “(NO REGISTRA)” si falta.
  8. Nivel Académico: Nivel educativo, con “(NO REGISTRA)” si falta.
  9. Estado civil: Estado civil, con “(NO REGISTRA)” si falta.
  10. Género: Género de la persona, con “(DESCONOCIDO)” si falta.
  11. Etnia de la persona: Etnia, con “(NO REGISTRA)” si falta.
  12. Estatura (CM): Estatura en centímetros, con -1 indicando datos faltantes.
  13. Localización: Localización geográfica del ciudadano según el país de residencia.
  14. Cantidad de personas: Número de personas que cumplen con las condiciones demográficas especificadas.

Objetivos del estudio

Analizar las características demográficas y educativas de ciudadanos colombianos en el exterior, con el fin de identificar patrones de residencia, nivel académico, estado civil, género, etnia y área de conocimiento, así como la calidad y completitud de los datos registrados en los consulados.

Importar Datos

Data <- read.csv('colombianos_exterior.csv')
# Renombrar columnas con caracteres especiales
names(Data) <- c("País", "Código.ISO.Pais", "Oficina.de.registro", "Grupo.edad", "Edad", 
                    "Area.Conocimiento", "Sub.Area.Conocimiento", "Nivel.Académico", 
                    "Estado.civil", "Género", "Etnia.de.la.persona", "Estatura", 
                    "Localización", "Cantidad.de.personas")
dim(D)
## NULL
summary(Data)
##      País           Código.ISO.Pais    Oficina.de.registro  Grupo.edad       
##  Length:782250      Length:782250      Length:782250       Length:782250     
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##       Edad        Area.Conocimiento  Sub.Area.Conocimiento Nivel.Académico   
##  Min.   : -1.00   Length:782250      Length:782250         Length:782250     
##  1st Qu.: 34.00   Class :character   Class :character      Class :character  
##  Median : 44.00   Mode  :character   Mode  :character      Mode  :character  
##  Mean   : 45.79                                                              
##  3rd Qu.: 57.00                                                              
##  Max.   :140.00                                                              
##  Estado.civil          Género          Etnia.de.la.persona   Estatura        
##  Length:782250      Length:782250      Length:782250       Length:782250     
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##  Localización       Cantidad.de.personas
##  Length:782250      Min.   :  1.000     
##  Class :character   1st Qu.:  1.000     
##  Mode  :character   Median :  1.000     
##                     Mean   :  1.983     
##                     3rd Qu.:  1.000     
##                     Max.   :408.000
str(Data)
## 'data.frame':    782250 obs. of  14 variables:
##  $ País                 : chr  "ALEMANIA" "ESPAÑA" "CANADA" "VENEZUELA" ...
##  $ Código.ISO.Pais      : chr  "DEU" "ESP" "CAN" "VEN" ...
##  $ Oficina.de.registro  : chr  "C. BERLIN" "C. BARCELONA" "C. MONTREAL" "C. MARACAIBO" ...
##  $ Grupo.edad           : chr  "ADULTO" "ADULTO" "ADULTO" "ADULTO MAYOR" ...
##  $ Edad                 : int  35 36 35 91 51 35 12 58 45 14 ...
##  $ Area.Conocimiento    : chr  "CIENCIAS SOCIALES Y HUMANAS" "NO INDICA" "CIENCIAS SOCIALES Y HUMANAS" "CIENCIAS SOCIALES Y HUMANAS" ...
##  $ Sub.Area.Conocimiento: chr  "CIENCIA POLÍTICA Y/O RELACIONES INTERNACIONALES" "NO INDICA" "GEOGRAFÍA O HISTORIA" "DERECHO Y AFINES" ...
##  $ Nivel.Académico      : chr  "PREGRADO - PROFESIONAL" "POSTGRADO - MAESTRIA" "NO INDICA" "NO INDICA" ...
##  $ Estado.civil         : chr  "SOLTERO" "SOLTERO" "SOLTERO" "SOLTERO" ...
##  $ Género               : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ Etnia.de.la.persona  : chr  "NINGUNA" "OTRO" "OTRO" "NINGUNA" ...
##  $ Estatura             : chr  "-1" "165" "-1" "-1" ...
##  $ Localización         : chr  "(51.165691, 10.451526)" "(40.463667, -3.74922)" "(56.130366, -106.346771)" "(6.42375, -66.58973)" ...
##  $ Cantidad.de.personas : int  1 1 1 1 1 1 1 1 1 1 ...

Se observa que inicialmente se tienen 12/14 variables cualitativas y 2/14 cuantitativas, sin embargo, si observamos la variable estatura sabemos que la naturaleza de sus datos es cuantitativa, y esta siendo detectada como una variable cualitativa, por lo tanto se designará manualmente.

Mapa de Datos crudos

missmap(Data, main="Mapa de Datos Faltantes en Datos crudos")

Procesamiento de los datos

#Convertir la variable Estatura de caracter a numérico
Data$Estatura <- as.numeric(Data$Estatura)
## Warning: NAs introducidos por coerción
NewData <- Data
summary(NewData)
##      País           Código.ISO.Pais    Oficina.de.registro  Grupo.edad       
##  Length:782250      Length:782250      Length:782250       Length:782250     
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##       Edad        Area.Conocimiento  Sub.Area.Conocimiento Nivel.Académico   
##  Min.   : -1.00   Length:782250      Length:782250         Length:782250     
##  1st Qu.: 34.00   Class :character   Class :character      Class :character  
##  Median : 44.00   Mode  :character   Mode  :character      Mode  :character  
##  Mean   : 45.79                                                              
##  3rd Qu.: 57.00                                                              
##  Max.   :140.00                                                              
##                                                                              
##  Estado.civil          Género          Etnia.de.la.persona    Estatura     
##  Length:782250      Length:782250      Length:782250       Min.   : -1.00  
##  Class :character   Class :character   Class :character    1st Qu.: -1.00  
##  Mode  :character   Mode  :character   Mode  :character    Median : -1.00  
##                                                            Mean   : 58.58  
##                                                            3rd Qu.:160.00  
##                                                            Max.   :860.00  
##                                                            NA's   :3       
##  Localización       Cantidad.de.personas
##  Length:782250      Min.   :  1.000     
##  Class :character   1st Qu.:  1.000     
##  Mode  :character   Median :  1.000     
##                     Mean   :  1.983     
##                     3rd Qu.:  1.000     
##                     Max.   :408.000     
## 
str(NewData)
## 'data.frame':    782250 obs. of  14 variables:
##  $ País                 : chr  "ALEMANIA" "ESPAÑA" "CANADA" "VENEZUELA" ...
##  $ Código.ISO.Pais      : chr  "DEU" "ESP" "CAN" "VEN" ...
##  $ Oficina.de.registro  : chr  "C. BERLIN" "C. BARCELONA" "C. MONTREAL" "C. MARACAIBO" ...
##  $ Grupo.edad           : chr  "ADULTO" "ADULTO" "ADULTO" "ADULTO MAYOR" ...
##  $ Edad                 : int  35 36 35 91 51 35 12 58 45 14 ...
##  $ Area.Conocimiento    : chr  "CIENCIAS SOCIALES Y HUMANAS" "NO INDICA" "CIENCIAS SOCIALES Y HUMANAS" "CIENCIAS SOCIALES Y HUMANAS" ...
##  $ Sub.Area.Conocimiento: chr  "CIENCIA POLÍTICA Y/O RELACIONES INTERNACIONALES" "NO INDICA" "GEOGRAFÍA O HISTORIA" "DERECHO Y AFINES" ...
##  $ Nivel.Académico      : chr  "PREGRADO - PROFESIONAL" "POSTGRADO - MAESTRIA" "NO INDICA" "NO INDICA" ...
##  $ Estado.civil         : chr  "SOLTERO" "SOLTERO" "SOLTERO" "SOLTERO" ...
##  $ Género               : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ Etnia.de.la.persona  : chr  "NINGUNA" "OTRO" "OTRO" "NINGUNA" ...
##  $ Estatura             : num  -1 165 -1 -1 169 -1 -1 -1 -1 -1 ...
##  $ Localización         : chr  "(51.165691, 10.451526)" "(40.463667, -3.74922)" "(56.130366, -106.346771)" "(6.42375, -66.58973)" ...
##  $ Cantidad.de.personas : int  1 1 1 1 1 1 1 1 1 1 ...
DataNA <- NewData

DataNA$Estatura[DataNA$Estatura==-1]<-NA
DataNA$Estatura[DataNA$Estatura>270]<-NA
DataNA$Estatura[DataNA$Estatura<35]<-NA

DataNA$Edad[DataNA$Edad==-1]<-NA
DataNA$Edad[DataNA$Edad>121]<-NA

# Reemplazar '(NO REGISTRA)' con NA en las columnas especificadas
columns_to_replace <- c("País", "Código.ISO.Pais", "Oficina.de.registro", "Area.Conocimiento", "Sub.Area.Conocimiento", "Nivel.Académico", "Estado.civil", "Etnia.de.la.persona")
DataNA[columns_to_replace] <- lapply(DataNA[columns_to_replace], function(x) {
  x[x == '(NO REGISTRA)'] <- NA
  return(x)
})

DataNA$Género[DataNA$Género=='DESCONOCIDO']<-NA
# Calcular el número de NA por columna
na_counts <- sapply(DataNA, function(x) sum(is.na(x)))

# Calcular el número total de datos por columna
total_values <- sapply(DataNA, function(x) length(x))

# Calcular el porcentaje de NA por columna con respecto al total de datos en esa columna
na_percentages_per_column <- (na_counts / total_values) * 100

# Calcular el número total de datos en todo el data frame
total_data_in_dataframe <- length(unlist(DataNA))

# Calcular el porcentaje de NA en cada columna con respecto al total de datos en toda la muestra
na_percentages_total <- (na_counts / total_data_in_dataframe) * 100

# Crear un data frame con el número y porcentaje de NA por columna
na_summary <- data.frame(
  Variable = names(na_counts),
  NA_Count = na_counts,
  Total_Values = total_values,
  NA_Percentage_Per_Column = na_percentages_per_column,
  NA_Percentage_Total = na_percentages_total
)

# Convertir las columnas numéricas a formato decimal
na_summary$NA_Count <- format(na_summary$NA_Count, scientific = FALSE)
na_summary$Total_Values <- format(na_summary$Total_Values, scientific = FALSE)
na_summary$NA_Percentage_Per_Column <- format(na_summary$NA_Percentage_Per_Column, scientific = FALSE)
na_summary$NA_Percentage_Total <- format(na_summary$NA_Percentage_Total, scientific = FALSE)

# Ordenar el data frame por porcentaje total de NA en orden descendente
na_summary <- na_summary[order(-as.numeric(na_summary$NA_Percentage_Total)), ]

# Ver el resumen
print(na_summary)
##                                    Variable NA_Count Total_Values
## Estatura                           Estatura   500420       782250
## Género                               Género     1613       782250
## Edad                                   Edad     1043       782250
## Area.Conocimiento         Area.Conocimiento      713       782250
## Sub.Area.Conocimiento Sub.Area.Conocimiento      713       782250
## Nivel.Académico             Nivel.Académico      713       782250
## Código.ISO.Pais             Código.ISO.Pais        4       782250
## País                                   País        0       782250
## Oficina.de.registro     Oficina.de.registro        0       782250
## Grupo.edad                       Grupo.edad        0       782250
## Estado.civil                   Estado.civil        0       782250
## Etnia.de.la.persona     Etnia.de.la.persona        0       782250
## Localización                   Localización        0       782250
## Cantidad.de.personas   Cantidad.de.personas        0       782250
##                       NA_Percentage_Per_Column NA_Percentage_Total
## Estatura                         63.9718759987       4.56941971419
## Género                            0.2062000639       0.01472857599
## Edad                              0.1333333333       0.00952380952
## Area.Conocimiento                 0.0911473314       0.00651052367
## Sub.Area.Conocimiento             0.0911473314       0.00651052367
## Nivel.Académico                   0.0911473314       0.00651052367
## Código.ISO.Pais                   0.0005113455       0.00003652468
## País                              0.0000000000       0.00000000000
## Oficina.de.registro               0.0000000000       0.00000000000
## Grupo.edad                        0.0000000000       0.00000000000
## Estado.civil                      0.0000000000       0.00000000000
## Etnia.de.la.persona               0.0000000000       0.00000000000
## Localización                      0.0000000000       0.00000000000
## Cantidad.de.personas              0.0000000000       0.00000000000

Mapa de datos semiprocesados

missmap(DataNA, main="Mapa de Datos Faltantes semiprocesados")

Tomando en cuenta los cálculos hechos anteriormente, se puede observar que con más exactitud el procentaje NA’s es del 4.61%

Pruebas de Normalidad

clean_data <- na.omit(DataNA$Estatura)

# Realizar la prueba de normalidad (Lilliefors)
resultado_prueba <- lillie.test(clean_data)

print(resultado_prueba)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  clean_data
## D = 0.094772, p-value < 2.2e-16
# Nivel de significancia
nivel_significancia <- 0.05

# Evaluar la hipótesis
if (!is.na(resultado_prueba$p.value) && resultado_prueba$p.value < nivel_significancia) {
  print("Se rechaza la hipótesis nula, lo que sugiere que la variable Estatura no sigue una distribución normal.")
} else {
  print("No se rechaza la hipótesis nula, lo que sugiere que la variable Estatura sigue una distribución normal.")
}
## [1] "Se rechaza la hipótesis nula, lo que sugiere que la variable Estatura no sigue una distribución normal."
# Configurar el área de gráficos para mostrar 1 fila y 3 columnas
par(mfrow = c(1, 3)) 

# Crear el gráfico QQ para la variable Estatura
qqnorm(DataNA$Estatura, main = "QQ Plot para la variable Estatura")
qqline(DataNA$Estatura, col = "red", lwd = 2)

# Crear el gráfico QQ para la variable Edad
qqnorm(DataNA$Edad, main = "QQ Plot para la variable Edad")
qqline(DataNA$Edad, col = "red", lwd = 2)

# Crear el gráfico QQ para la Cantidad de personas
qqnorm(DataNA$Cantidad.de.personas, main = "QQ Plot para la Cantidad de personas")
qqline(DataNA$Cantidad.de.personas, col = "red", lwd = 2)

# Restablecer la configuración de gráficos a la predeterminada (opcional)
par(mfrow = c(1, 1))
# Definir la función para aplicar el test Lilliefors
lilliefors_test <- function(x) {
  # Eliminar NA antes de realizar la prueba
  clean_data <- na.omit(x)
  # Aplicar el test Lilliefors y extraer el p-value
  result <- lillie.test(clean_data)
  return(result$p.value)
}

# Aplicar la prueba de Lilliefors a todas las variables numéricas
normality_tests <- DataNA %>%
  summarise(across(where(is.numeric), ~ lilliefors_test(.x))) %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "P-Value")

# Agregar una columna indicando si los datos son normales o no
normality_tests <- normality_tests %>%
  mutate(Normal = ifelse(`P-Value` < 0.05, "No", "Sí"))

# Mostrar los resultados
print(normality_tests)
## # A tibble: 3 × 3
##   Variable             `P-Value` Normal
##   <chr>                    <dbl> <chr> 
## 1 Edad                         0 No    
## 2 Estatura                     0 No    
## 3 Cantidad.de.personas         0 No

Basandonos en los resultados de la Prueba de normalidad Lilliefors para las variables que los datos no son normales, por lo que que se decide reemplazar los NA’s con la mediana y, en las variables cualitativas por la moda.

Datos Limpios

rellenar_con_mediana <- function(x) {
  x[is.na(x)] <- median(x, na.rm = TRUE)
  return(x)
}

# Función para calcular la moda
calcular_moda <- function(x) {
  uniq_vals <- unique(na.omit(x))
  uniq_vals[which.max(tabulate(match(x, uniq_vals)))]
}

# Función para rellenar NA en variables cualitativas con la moda
rellenar_con_moda <- function(x) {
  moda <- calcular_moda(x)
  x[is.na(x)] <- moda
  return(x)
}
DataNA <- DataNA %>%
  mutate(across(where(is.numeric), rellenar_con_mediana)) %>%
  mutate(across(where(is.character), rellenar_con_moda)) %>%
  mutate(across(where(is.factor), ~ as.character(.) %>% rellenar_con_moda() %>% as.factor()))

Visualización de datos limpios

summary(DataNA)
##      País           Código.ISO.Pais    Oficina.de.registro  Grupo.edad       
##  Length:782250      Length:782250      Length:782250       Length:782250     
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##       Edad        Area.Conocimiento  Sub.Area.Conocimiento Nivel.Académico   
##  Min.   :  0.00   Length:782250      Length:782250         Length:782250     
##  1st Qu.: 34.00   Class :character   Class :character      Class :character  
##  Median : 44.00   Mode  :character   Mode  :character      Mode  :character  
##  Mean   : 45.85                                                              
##  3rd Qu.: 57.00                                                              
##  Max.   :119.00                                                              
##  Estado.civil          Género          Etnia.de.la.persona    Estatura    
##  Length:782250      Length:782250      Length:782250       Min.   : 35.0  
##  Class :character   Class :character   Class :character    1st Qu.:165.0  
##  Mode  :character   Mode  :character   Mode  :character    Median :165.0  
##                                                            Mean   :164.8  
##                                                            3rd Qu.:165.0  
##                                                            Max.   :270.0  
##  Localización       Cantidad.de.personas
##  Length:782250      Min.   :  1.000     
##  Class :character   1st Qu.:  1.000     
##  Mode  :character   Median :  1.000     
##                     Mean   :  1.983     
##                     3rd Qu.:  1.000     
##                     Max.   :408.000
str(DataNA)
## 'data.frame':    782250 obs. of  14 variables:
##  $ País                 : chr  "ALEMANIA" "ESPAÑA" "CANADA" "VENEZUELA" ...
##  $ Código.ISO.Pais      : chr  "DEU" "ESP" "CAN" "VEN" ...
##  $ Oficina.de.registro  : chr  "C. BERLIN" "C. BARCELONA" "C. MONTREAL" "C. MARACAIBO" ...
##  $ Grupo.edad           : chr  "ADULTO" "ADULTO" "ADULTO" "ADULTO MAYOR" ...
##  $ Edad                 : int  35 36 35 91 51 35 12 58 45 14 ...
##  $ Area.Conocimiento    : chr  "CIENCIAS SOCIALES Y HUMANAS" "NO INDICA" "CIENCIAS SOCIALES Y HUMANAS" "CIENCIAS SOCIALES Y HUMANAS" ...
##  $ Sub.Area.Conocimiento: chr  "CIENCIA POLÍTICA Y/O RELACIONES INTERNACIONALES" "NO INDICA" "GEOGRAFÍA O HISTORIA" "DERECHO Y AFINES" ...
##  $ Nivel.Académico      : chr  "PREGRADO - PROFESIONAL" "POSTGRADO - MAESTRIA" "NO INDICA" "NO INDICA" ...
##  $ Estado.civil         : chr  "SOLTERO" "SOLTERO" "SOLTERO" "SOLTERO" ...
##  $ Género               : chr  "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
##  $ Etnia.de.la.persona  : chr  "NINGUNA" "OTRO" "OTRO" "NINGUNA" ...
##  $ Estatura             : num  165 165 165 165 169 165 165 165 165 165 ...
##  $ Localización         : chr  "(51.165691, 10.451526)" "(40.463667, -3.74922)" "(56.130366, -106.346771)" "(6.42375, -66.58973)" ...
##  $ Cantidad.de.personas : num  1 1 1 1 1 1 1 1 1 1 ...

Mapa de datos limpios

# Verificar que no haya NA en el nuevo dataframe
missmap(DataNA, main="Mapa de Datos Faltantes")

Ver si se normalizó la variable

# Configurar el área de gráficos para mostrar 1 fila y 3 columnas
par(mfrow = c(1, 3)) 

# Crear el gráfico QQ para la variable Estatura
qqnorm(DataNA$Estatura, main = "QQ Plot para la variable Estatura")
qqline(DataNA$Estatura, col = "red", lwd = 2)

# Crear el gráfico QQ para la variable Edad
qqnorm(DataNA$Edad, main = "QQ Plot para la variable Edad")
qqline(DataNA$Edad, col = "red", lwd = 2)

# Crear el gráfico QQ para la Cantidad de personas
qqnorm(DataNA$Cantidad.de.personas, main = "QQ Plot para la Cantidad de personas")
qqline(DataNA$Cantidad.de.personas, col = "red", lwd = 2)

# Restablecer la configuración de gráficos a la predeterminada (opcional)
par(mfrow = c(1, 1))
# Eliminar los NA de la columna Estatura (antes de la limpieza)
estatura <- na.omit(Data$Estatura)

# Graficar el histograma
hist(estatura, breaks = 30, probability = TRUE, main = "Histograma con Curva Normal", xlab = "Estatura", col = "lightblue")

# Agregar la curva de densidad de los datos
lines(density(estatura), col = "red", lwd = 2)

# Calcular la media y desviación estándar de los datos
mean_estatura <- mean(estatura)
sd_estatura <- sd(estatura)

# Crear la secuencia de valores para la curva normal
x <- seq(min(estatura), max(estatura), length = 100)

# Agregar la curva de la distribución normal teórica
y <- dnorm(x, mean = mean_estatura, sd = sd_estatura)
lines(x, y, col = "blue", lwd = 2)

# Eliminar los NA de la columna Estatura (después de la limpieza)
estatura <- na.omit(DataNA$Estatura)

# Graficar el histograma
hist(estatura, breaks = 30, probability = TRUE, main = "Histograma con Curva Normal", xlab = "Estatura", col = "lightblue")

# Agregar la curva de densidad de los datos
lines(density(estatura), col = "red", lwd = 2)

# Calcular la media y desviación estándar de los datos
mean_estatura <- mean(estatura)
sd_estatura <- sd(estatura)

# Crear la secuencia de valores para la curva normal
x <- seq(min(estatura), max(estatura), length = 100)

# Agregar la curva de la distribución normal teórica
y <- dnorm(x, mean = mean_estatura, sd = sd_estatura)
lines(x, y, col = "blue", lwd = 2)

# Configurar la disposición de las gráficas en una fila y dos columnas
par(mfrow = c(1, 2))

# Primera gráfica (antes de la limpieza)
# Eliminar los NA de la columna Estatura (antes de la limpieza)
estatura_antes <- na.omit(Data$Estatura)

# Graficar el histograma
hist(estatura_antes, breaks = 30, probability = TRUE, main = "Antes de la Limpieza", xlab = "Estatura", col = "lightblue")

# Agregar la curva de densidad de los datos
#lines(density(estatura_antes), col = "red", lwd = 2)

# Calcular la media y desviación estándar de los datos
mean_estatura_antes <- mean(estatura_antes)
sd_estatura_antes <- sd(estatura_antes)

# Crear la secuencia de valores para la curva normal
x_antes <- seq(min(estatura_antes), max(estatura_antes), length = 100)

# Agregar la curva de la distribución normal teórica
y_antes <- dnorm(x_antes, mean = mean_estatura_antes, sd = sd_estatura_antes)
lines(x_antes, y_antes, col = "blue", lwd = 2)

# Segunda gráfica (después de la limpieza)
# Eliminar los NA de la columna Estatura (después de la limpieza)
estatura_despues <- na.omit(DataNA$Estatura)

# Graficar el histograma
hist(estatura_despues, breaks = 30, probability = TRUE, main = "Después de la Limpieza", xlab = "Estatura", col = "lightblue")

# Agregar la curva de densidad de los datos
#lines(density(estatura_despues), col = "red", lwd = 2)

# Calcular la media y desviación estándar de los datos
mean_estatura_despues <- mean(estatura_despues)
sd_estatura_despues <- sd(estatura_despues)

# Crear la secuencia de valores para la curva normal
x_despues <- seq(min(estatura_despues), max(estatura_despues), length = 100)

# Agregar la curva de la distribución normal teórica
y_despues <- dnorm(x_despues, mean = mean_estatura_despues, sd = sd_estatura_despues)
lines(x_despues, y_despues, col = "blue", lwd = 2)

# Restablecer la disposición de las gráficas a una única por ventana
par(mfrow = c(1, 1))

Normalización de los datos

En la normalización de datos solo se tomarán en cuenta las variables Edad y Cantidad de personas, ya que debido al alto porcentaje de datos irregulares en la variable estatura, se ha decidio sacarla del estudio. Veamos entonces el comportamiento de las variables Edad y Cantidad de personas.

# Configurar la disposición de las gráficas en una fila y dos columnas
par(mfrow = c(1, 2))

# Eliminar los NA de la columna Edad
estatura_antes <- na.omit(Data$Edad)

# Graficar el histograma
hist(estatura_antes, breaks = 30, probability = TRUE, main = "Distribución Edad", xlab = "Edad", col = "lightblue")

# Agregar la curva de densidad de los datos
#lines(density(estatura_antes), col = "red", lwd = 2)

# Calcular la media y desviación estándar de los datos
mean_estatura_antes <- mean(estatura_antes)
sd_estatura_antes <- sd(estatura_antes)

# Crear la secuencia de valores para la curva normal
x_antes <- seq(min(estatura_antes), max(estatura_antes), length = 100)

# Agregar la curva de la distribución normal teórica
y_antes <- dnorm(x_antes, mean = mean_estatura_antes, sd = sd_estatura_antes)
lines(x_antes, y_antes, col = "blue", lwd = 2)






# Eliminar los NA de la columna cantidad de personas
estatura_despues <- na.omit(DataNA$Cantidad.de.personas)

# Graficar el histograma
hist(estatura_despues, breaks = 30, probability = TRUE, main = "Distribución Cantidad de personas", xlab = "Cantidad de personas", col = "lightblue")

# Agregar la curva de densidad de los datos
#lines(density(estatura_despues), col = "red", lwd = 2)


# Calcular la media y desviación estándar de los datos
mean_estatura_despues <- mean(estatura_despues)
sd_estatura_despues <- sd(estatura_despues)

# Crear la secuencia de valores para la curva normal
x_despues <- seq(min(estatura_despues), max(estatura_despues), length = 100)

# Agregar la curva de la distribución normal teórica
y_despues <- dnorm(x_despues, mean = mean_estatura_despues, sd = sd_estatura_despues)
lines(x_despues, y_despues, col = "blue", lwd = 2)

# Restablecer la disposición de las gráficas a una única por ventana
par(mfrow = c(1, 1))
clean_data <- na.omit(DataNA$Edad)

# Realizar la prueba de normalidad (Lilliefors)
resultado_prueba <- lillie.test(clean_data)

print(resultado_prueba)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  clean_data
## D = 0.061798, p-value < 2.2e-16
clean_data <- na.omit(DataNA$Cantidad.de.personas)

# Realizar la prueba de normalidad (Lilliefors)
resultado_prueba <- lillie.test(clean_data)

print(resultado_prueba)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  clean_data
## D = 0.43425, p-value < 2.2e-16
# Aplicar la transformación logarítmica a la columna Edad (sumar 1 para evitar problemas con log(0))
DataNA$Transf_Log <- log(DataNA$Edad + 1)

# Configurar el área de gráficos para mostrar dos histogramas lado a lado
par(mfrow = c(1, 2))  

# Graficar el histograma original de la variable Edad
hist(DataNA$Edad, main = "Histograma Original", xlab = "Edad", col = "lightblue", breaks = 20)

# Graficar el histograma de la variable transformada logarítmicamente
hist(DataNA$Transf_Log, main = "Histograma Transformado (Log)", xlab = "Edad Transformada", col = "lightgreen", breaks = 20)

# Restaurar configuración de gráficos a una sola ventana (opcional)
par(mfrow = c(1, 1))
# Aplicar la prueba de Lilliefors a la variable original Edad
lilliefors_original <- lillie.test(DataNA$Edad)

# Aplicar la prueba de Lilliefors a la variable transformada Transf_Log
lilliefors_transf_log <- lillie.test(DataNA$Transf_Log)

# Imprimir los resultados de la prueba
print(lilliefors_original)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  DataNA$Edad
## D = 0.061798, p-value < 2.2e-16
print(lilliefors_transf_log)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  DataNA$Transf_Log
## D = 0.061128, p-value < 2.2e-16

La transformación logarítmica no ha logrado mejorar el ajuste a una distribución normal para la variable edad.

# Aplicar la transformación logarítmica a la columna Edad (sumar 1 para evitar problemas con log(0))
DataNA$Transf_Log <- log(DataNA$Cantidad.de.personas + 1)

# Configurar el área de gráficos para mostrar dos histogramas lado a lado
par(mfrow = c(1, 2))  

# Graficar el histograma original de la variable Edad
hist(DataNA$Cantidad.de.personas, main = "Histograma Original", xlab = "Cantidad.de.personas", col = "lightblue", breaks = 20)

# Graficar el histograma de la variable transformada logarítmicamente
hist(DataNA$Transf_Log, main = "Histograma Transformado (Log)", xlab = "Cantidad.de.personas transformada", col = "lightgreen", breaks = 20)

# Restaurar configuración de gráficos a una sola ventana (opcional)
par(mfrow = c(1, 1))
# Aplicar la prueba de Lilliefors a la variable original Cantidad.de.personas
lilliefors_original <- lillie.test(DataNA$Cantidad.de.personas)

# Aplicar la prueba de Lilliefors a la variable transformada Transf_Log
lilliefors_transf_log <- lillie.test(DataNA$Transf_Log)

# Imprimir los resultados de la prueba
print(lilliefors_original)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  DataNA$Cantidad.de.personas
## D = 0.43425, p-value < 2.2e-16
print(lilliefors_transf_log)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  DataNA$Transf_Log
## D = 0.44585, p-value < 2.2e-16