#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)
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.
Este estudio incluye las siguientes variables
Claro, aquí te presento los ítems de Studio con los nombres de las variables en negrilla:
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.
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.
missmap(Data, main="Mapa de Datos Faltantes en Datos crudos")
#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
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%
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.
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()))
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 ...
# 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))
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