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, que fueron proporcionados por el Ministerio De Relaciones Exteriores, 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
PaĆs: Indica el paĆs de residencia de la persona. Cuando no se tienen datos registrados se presenta el texto ā(NO REGISTRA)ā.
Código ISO paĆs: ISO del paĆs de residencia. Cuando no se tienen datos registrados se presenta el texto ā(NO REGISTRA)ā.
Oficina de registro: Consulado donde la persona realizó su registro consular. Cuando no se tienen datos registrados se presenta el texto ā(NO REGISTRA)ā.
Grupo edad: Grupo basado en la edad, como āPrimera infanciaā (0-5 aƱos) o āAdulto Mayorā (60+).
Edad (aƱos): Edad de la persona, con -1 indicando datos faltantes.
Ćrea Conocimiento: Ćrea de conocimiento, con ā(NO REGISTRA)ā si falta.
Sub Ćrea Conocimiento: SubĆ”rea especĆfica, con ā(NO REGISTRA)ā si falta.
Nivel AcadĆ©mico: Nivel educativo, con ā(NO REGISTRA)ā si falta.
Estado civil: Estado civil, con ā(NO REGISTRA)ā si falta.
GĆ©nero: GĆ©nero de la persona, con ā(DESCONOCIDO)ā si falta.
Etnia de la persona: Etnia, con ā(NO REGISTRA)ā si falta.
Estatura (CM): Estatura en centĆmetros, con -1 indicando datos faltantes.
Localización: Localización geogrĆ”fica del ciudadano segĆŗn el paĆs de residencia.
Cantidad de personas: Número de personas que cumplen con las condiciones demogrÔficas especificadas.
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.
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)
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 Min. : -1
## Class :character Class :character Class :character 1st Qu.: -1
## Mode :character Mode :character Mode :character Median : -1
## Mean : 59
## 3rd Qu.: 160
## Max. :163163
## 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 : int -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 ...
missmap(Data, main="Mapa de Datos Faltantes en Datos crudos")
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.
#Convertir la variable Estatura de caracter a numƩrico
Data$Estatura <- as.numeric(Data$Estatura)
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
## Class :character Class :character Class :character 1st Qu.: -1
## Mode :character Mode :character Mode :character Median : -1
## Mean : 59
## 3rd Qu.: 160
## Max. :163163
## 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")
En este estudio, necesitamos verificar si nuestros datos siguen una distribución normal. Como no conocemos la media ni la desviación estÔndar de la población, la prueba de Lilliefors es ideal porque permite evaluar la normalidad sin asumir estos parÔmetros.
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
clean_data_Edad <- na.omit(DataNA$Edad)
# Realizar la prueba de normalidad (Lilliefors)
resultado_prueba_Edad <- lillie.test(clean_data_Edad)
print(resultado_prueba_Edad)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: clean_data_Edad
## D = 0.061182, 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."
# Evaluar la hipótesis
if (!is.na(resultado_prueba_Edad$p.value) && resultado_prueba_Edad$p.value < nivel_significancia) {
print("Se rechaza la hipótesis nula, lo que sugiere que la variable Edad no sigue una distribución normal.")
} else {
print("No se rechaza la hipótesis nula, lo que sugiere que la variable Edad sigue una distribución normal.")
}
## [1] "Se rechaza la hipótesis nula, lo que sugiere que la variable Edad 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
# Función para rellenar variables cuantitativas con la mediana
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()))
names(DataNA)
## [1] "PaĆs" "Código.ISO.Pais" "Oficina.de.registro"
## [4] "Grupo.edad" "Edad" "Area.Conocimiento"
## [7] "Sub.Area.Conocimiento" "Nivel.AcadƩmico" "Estado.civil"
## [10] "GƩnero" "Etnia.de.la.persona" "Estatura"
## [13] "Localización" "Cantidad.de.personas"
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 ...
dim(DataNA)
## [1] 782250 14
# Verificar que no haya NA en el nuevo dataframe
missmap(DataNA, main="Mapa de Datos Faltantes")
# 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))
Se ralizara la normalizacion de los datos mediante transformacion logaritmica. 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
# 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
Notamos que la transformación logarĆtmica no ha logrado mejorar el ajuste a una distribución normal para ninguna de las variables.
#install.packages("kableExtra")
#install.packages("ggthemes")
#install.packages("plotly")
#install.packages("tidyverse")
#install.packages("broom")
library(kableExtra)
##
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library(ggplot2)
library(dplyr)
library(gridExtra)
library(ggthemes)
library(plotly)
##
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(tidyverse)
library(broom)
#Analisis Univariado.
# NĆŗmero de paĆses Ćŗnicos
num_paises <- length(unique(DataNA$PaĆs))
print(paste("El numero total de paises es:" , num_paises))
## [1] "El numero total de paises es: 193"
Ya la cantidad de paises que se encuentran en la base de datos es numerosa, no se verƔ bien en un grƔfico, por lo tanto solo visualizaremos el top 20.
Pais (Top 20).
# Filtrar los datos para los 10 paĆses con mĆ”s registros
top_10_paises <- DataNA %>%
count(PaĆs) %>%
top_n(10, n) %>%
pull(PaĆs)
Data_top10 <- DataNA %>%
filter(PaĆs %in% top_10_paises)
#Filtrar los top 3 paĆses
top_3_paises <- DataNA %>%
count(PaĆs) %>%
top_n(3, n) %>%
pull(PaĆs)
Data_top3 <- DataNA %>%
filter(PaĆs %in% top_3_paises)
# Calcular frecuencias de paĆses
pais_frecuencia <- DataNA %>%
group_by(PaĆs) %>%
summarise(Frecuencia = n()) %>%
arrange(desc(Frecuencia))
# Filtrar los top 20 paĆses
top_20_paises <- pais_frecuencia %>% top_n(20, wt = Frecuencia)
# GrĆ”fico de barras ordenadas para los top 20 paĆses
ggplot(top_20_paises, aes(x = reorder(PaĆs, -Frecuencia), y = Frecuencia)) +
geom_bar(stat = "identity", fill = "#3FA0FFFF") +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 10)) +
labs(title = "Top 20 PaĆses con MĆ”s Colombianos Registrados", x = "PaĆs", y = "Cantidad")
# GrĆ”fico de barras ordenadas para los top 20 paĆses con escala logarĆtmica en Y
ggplot(top_20_paises, aes(x = reorder(PaĆs, -Frecuencia), y = Frecuencia)) +
geom_bar(stat = "identity", fill = "#3FA0FFFF") +
scale_y_log10() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 10)) +
labs(title = "Top 20 PaĆses con MĆ”s Colombianos Registrados (Escala LogarĆtmica)",
x = "PaĆs", y = "Cantidad (log10)")
Pais(Top 3).
# Obtener el top 3 de paĆses
top_3_paises <- pais_frecuencia %>% top_n(3, wt = Frecuencia)
# Mostrar el top 3
print(top_3_paises)
## # A tibble: 3 Ć 2
## PaĆs Frecuencia
## <chr> <int>
## 1 ESTADOS UNIDOS 215007
## 2 ESPAĆA 147742
## 3 VENEZUELA 105125
#Hice grƔfico de barras, pero no se si quieran uno circular.
ggplot(top_3_paises, aes(x = reorder(PaĆs, -Frecuencia), y = Frecuencia)) +
geom_bar(stat = "identity", fill = "#3FA0FFFF") + # Color azul personalizado
geom_text(aes(label = Frecuencia), vjust = -0.3) + # Etiquetas encima de las barras
labs(title = "Top 3 PaĆses con MĆ”s Colombianos Registrados",
x = "PaĆs",
y = "Cantidad") +
theme_minimal() + # Tema minimalista
theme(plot.title = element_text(hjust = 0.5), # Centrar el tĆtulo
axis.text.x = element_text(angle = 45, hjust = 1)) # Rotar las etiquetas del eje x
Grupos de edad (Total).
tabla_edad <- DataNA %>%
group_by(Grupo.edad) %>%
summarise(Frecuencia = n()) %>%
mutate(Porcentaje = round((Frecuencia / sum(Frecuencia)) * 100, 2))
# Mostrar la tabla usando kableExtra
kable(tabla_edad, col.names = c("Grupo de Edad", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Grupo de Edad") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped","bordered", "responsive", "hover", "condensed"))
| Grupo de Edad | Frecuencia | Porcentaje (%) |
|---|---|---|
| ADOLESCENTE | 9780 | 1.25 |
| ADULTO | 533179 | 68.16 |
| ADULTO JOVEN | 68714 | 8.78 |
| ADULTO MAYOR | 159445 | 20.38 |
| DESCONOCIDO | 1018 | 0.13 |
| INFANTE | 7238 | 0.93 |
| PRIMERA INFANCIA | 2876 | 0.37 |
Grafico Barras Grupo Edad.
#Grafico de Barras
ggplot(DataNA, aes(x = Grupo.edad)) +
geom_bar(fill = "#3FA0FFFF", color = "black") + # Color de las barras y bordes
labs(
title = "Distribución por Grupo de Edad",
x = "Grupo de Edad",
y = "Cantidad"
) +
theme_minimal() + # Tema mƔs limpio
theme(
axis.text.x = element_text(angle = 45, hjust = 1), # Ćngulo del texto en el eje x
plot.title = element_text(hjust = 0.5) # Centrar el tĆtulo
)
Grupos de edad (Top 3). Tabla top 3.
# Crear la tabla de frecuencias y porcentajes por grupo de edad para los top 3 paĆses
tabla_gedad_top3 <- Data_top3 %>%
group_by(Grupo.edad) %>%
summarise(Frecuencia = n()) %>%
mutate(Porcentaje = round((Frecuencia / sum(Frecuencia)) * 100, 2))
# Mostrar la tabla usando kableExtra
kable(tabla_gedad_top3, col.names = c("Grupo de Edad", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Grupo de Edad en el Top 3 de PaĆses") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "bordered", "responsive", "hover", "condensed"))
| Grupo de Edad | Frecuencia | Porcentaje (%) |
|---|---|---|
| ADOLESCENTE | 4904 | 1.05 |
| ADULTO | 303180 | 64.80 |
| ADULTO JOVEN | 38677 | 8.27 |
| ADULTO MAYOR | 115624 | 24.71 |
| DESCONOCIDO | 607 | 0.13 |
| INFANTE | 3520 | 0.75 |
| PRIMERA INFANCIA | 1362 | 0.29 |
Grafico de Barras.
# Paso 1: Encontrar los 3 paĆses con la mayor cantidad de personas
top_countries <- DataNA %>%
group_by(PaĆs) %>%
summarise(Total_Personas = sum(Cantidad.de.personas, na.rm = TRUE)) %>%
top_n(3, Total_Personas) %>%
pull(PaĆs)
# Paso 2: Filtrar los datos para estos paĆses
Data_top3 <- DataNA %>%
filter(PaĆs %in% top_countries)
# Tabla
ggplot(Data_top3, aes(x = Grupo.edad, fill = PaĆs)) +
geom_bar(position = "dodge", stat = "count") +
labs(title = "Distribución por Edad en los Top 3 PaĆses",
x = "Grupo de Edad",
y = "Cantidad de Personas") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16),
axis.title = element_text(size = 14),
axis.text.x = element_text(angle = 45, hjust = 1), # Rotar las etiquetas del eje x 45 grados
legend.position = "right" # Colocar la leyenda a la derecha
)
Edad (Total).
# Resumen estadĆstico de la variable Edad en el conjunto de datos completo
resumen_edad_total <- DataNA %>%
summarise(
Minimo = min(Edad, na.rm = TRUE),
Primer_Cuartil = quantile(Edad, 0.25, na.rm = TRUE),
Mediana = median(Edad, na.rm = TRUE),
Media = mean(Edad, na.rm = TRUE),
Tercer_Cuartil = quantile(Edad, 0.75, na.rm = TRUE),
Maximo = max(Edad, na.rm = TRUE),
Desviacion_Estandar = sd(Edad, na.rm = TRUE)
)
# Mostrar el resumen estadĆstico
print(resumen_edad_total)
## Minimo Primer_Cuartil Mediana Media Tercer_Cuartil Maximo
## 1 0 34 44 45.84603 57 119
## Desviacion_Estandar
## 1 16.07107
# Histograma de la variable Edad en el conjunto de datos completo
ggplot(DataNA, aes(x = Edad)) +
geom_histogram(binwidth = 5, fill = "#3FA0FFFF", color = "black") +
labs(
title = "Distribución de la Edad (Total)",
x = "Edad (aƱos)",
y = "Frecuencia"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12)
)
# Boxplot horizontal para la variable Edad en el conjunto de datos completo
ggplot(DataNA, aes(x = Edad)) +
geom_boxplot(fill = "#3FA0FFFF", color = "black", outlier.color = "red", outlier.shape = 16, outlier.size = 2) +
labs(
title = "Distribución de la Edad",
x = "Edad (aƱos)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.text.x = element_text(size = 10),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
)
Edad (Top 3).
# Resumen estadĆstico de la variable Edad en el top 3 de paĆses
resumen_edad_top <- Data_top3 %>%
summarise(
Minimo = min(Edad, na.rm = TRUE),
Primer_Cuartil = quantile(Edad, 0.25, na.rm = TRUE),
Mediana = median(Edad, na.rm = TRUE),
Media = mean(Edad, na.rm = TRUE),
Tercer_Cuartil = quantile(Edad, 0.75, na.rm = TRUE),
Maximo = max(Edad, na.rm = TRUE),
Desviacion_Estandar = sd(Edad, na.rm = TRUE)
)
# Mostrar el resumen estadĆstico
print(resumen_edad_top)
## Minimo Primer_Cuartil Mediana Media Tercer_Cuartil Maximo
## 1 0 35 46 47.7773 59 119
## Desviacion_Estandar
## 1 16.65299
# Histograma de la variable Edad en el top 3 de paĆses
ggplot(Data_top3, aes(x = Edad)) +
geom_histogram(binwidth = 5, fill = "#3FA0FFFF", color = "black") +
labs(
title = "Distribución de la Edad en el Top 3 de PaĆses",
x = "Edad (aƱos)",
y = "Frecuencia"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12)
)
# Boxplot horizontal para la variable Edad en el top 3 de paĆses
ggplot(Data_top3, aes(x = Edad)) +
geom_boxplot(fill = "#3FA0FFFF", color = "black", outlier.color = "red", outlier.shape = 16, outlier.size = 2) +
labs(
title = "Distribución de la Edad en el Top 3 de PaĆses",
x = "Edad (aƱos)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.text.x = element_text(size = 10),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
)
Ćrea de Conocimiento (Total).
# Calcular la tabla de frecuencia y porcentaje
tabla_area_conocimiento <- DataNA %>%
group_by(Area.Conocimiento) %>%
summarise(
Frecuencia = n(),
Porcentaje = round((n() / nrow(DataNA)) * 100, 2)
) %>%
arrange(desc(Frecuencia))
# Mostrar la tabla de frecuencia y porcentaje con kable
kable(tabla_area_conocimiento, col.names = c("Ćrea de Conocimiento", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Ćrea de Conocimiento") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, bold = TRUE, width = "15em") %>%
column_spec(2, width = "5em") %>%
column_spec(3, width = "5em")
| Ćrea de Conocimiento | Frecuencia | Porcentaje (%) |
|---|---|---|
| NO INDICA | 209936 | 26.84 |
| NINGUNA | 190204 | 24.31 |
| INGENIERĆA, ARQUITECTURA Y AFINES | 95939 | 12.26 |
| ECONOMĆA, ADMINISTRACIĆN CONTADURIA Y AFINES | 88555 | 11.32 |
| CIENCIAS SOCIALES Y HUMANAS | 60682 | 7.76 |
| CIENCIAS DE LA SALUD | 60672 | 7.76 |
| BELLAS ARTES | 28818 | 3.68 |
| CIENCIAS DE LA EDUCACIĆN | 23230 | 2.97 |
| MATEMĆTICAS Y CIENCIAS NATURALES | 10962 | 1.40 |
| AGRONOMĆA, VETERINARIA Y AFINES | 5047 | 0.65 |
| COCINA Y CULINARIA | 3588 | 0.46 |
| AGRONOMĆA, VETERINARIA Y ZOOTECNIA | 2725 | 0.35 |
| AVIACIĆN | 1892 | 0.24 |
# GrƔfico de barras
ggplot(DataNA, aes(x = reorder(Area.Conocimiento, -table(Area.Conocimiento)[Area.Conocimiento]), y = ..count..)) +
geom_bar(fill = "#3FA0FFFF", color = "black") +
theme_minimal() +
labs(title = "Distribución por Ćrea de Conocimiento",
x = "Ćrea de Conocimiento",
y = "Cantidad") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ā¹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Ćrea de Conocimiento (Top 3).
tabla_area_conocimiento <- Data_top3 %>%
group_by(Area.Conocimiento) %>%
summarise(
Frecuencia = n(),
Porcentaje = round((n() / nrow(Data_top3)) * 100, 2)
) %>%
arrange(desc(Frecuencia))
# Mostrar la tabla de frecuencia y porcentaje con kable
kable(tabla_area_conocimiento, col.names = c("Ćrea de Conocimiento", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Ćrea de Conocimiento en los Top 3 PaĆses") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, bold = TRUE, width = "15em") %>%
column_spec(2, width = "5em") %>%
column_spec(3, width = "5em")
| Ćrea de Conocimiento | Frecuencia | Porcentaje (%) |
|---|---|---|
| NO INDICA | 131154 | 28.03 |
| NINGUNA | 113581 | 24.28 |
| INGENIERĆA, ARQUITECTURA Y AFINES | 53161 | 11.36 |
| ECONOMĆA, ADMINISTRACIĆN CONTADURIA Y AFINES | 52203 | 11.16 |
| CIENCIAS DE LA SALUD | 38959 | 8.33 |
| CIENCIAS SOCIALES Y HUMANAS | 34744 | 7.43 |
| BELLAS ARTES | 16262 | 3.48 |
| CIENCIAS DE LA EDUCACIĆN | 14666 | 3.13 |
| MATEMĆTICAS Y CIENCIAS NATURALES | 5166 | 1.10 |
| AGRONOMĆA, VETERINARIA Y AFINES | 2701 | 0.58 |
| COCINA Y CULINARIA | 2301 | 0.49 |
| AGRONOMĆA, VETERINARIA Y ZOOTECNIA | 1705 | 0.36 |
| AVIACIĆN | 1271 | 0.27 |
# GrƔfico de barras
ggplot(Data_top3, aes(x = reorder(Area.Conocimiento, -table(Area.Conocimiento)[Area.Conocimiento]), y = ..count..)) +
geom_bar(fill = "#3FA0FFFF", color = "black") +
theme_minimal() +
labs(title = "Distribución por Ćrea de Conocimiento",
x = "Ćrea de Conocimiento",
y = "Cantidad") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
)
Nivel AcadƩmico (Total). Tabla.
# Calcular la tabla de frecuencia
tabla_frecuencia <- DataNA %>%
group_by(Nivel.AcadƩmico) %>%
summarise(
Frecuencia = n(),
Porcentaje = round((n() / nrow(DataNA)) * 100, 2)
) %>%
arrange(desc(Frecuencia))
# Mostrar la tabla de frecuencia con kable
kable(tabla_frecuencia, col.names = c("Nivel AcadƩmico", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Nivel Académico") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, bold = TRUE, width = "15em") %>%
column_spec(2, width = "5em") %>%
column_spec(3, width = "5em")
| Nivel AcadƩmico | Frecuencia | Porcentaje (%) |
|---|---|---|
| NO INDICA | 272179 | 34.79 |
| BACHILLERATO | 148056 | 18.93 |
| PREGRADO - PROFESIONAL | 137517 | 17.58 |
| PRIMARIA | 65411 | 8.36 |
| PREGRADO - TĆCNICO PROFESIONAL | 52792 | 6.75 |
| POSTGRADO - MAESTRIA | 32865 | 4.20 |
| PREGRADO - TECNOLĆGICO | 28101 | 3.59 |
| POSTGRADO - ESPECIALIZACIĆN | 20619 | 2.64 |
| NINGUNO | 17062 | 2.18 |
| POSTGRADO - DOCTORADO | 7468 | 0.95 |
| SIN PROFESIĆN | 180 | 0.02 |
Barras apilado.
# Definir la paleta de colores
paleta_colores <- c(
"NINGUNO" = "#FFAD72FF",
"SIN PROFESIĆN" = "#F76D5EFF",
"PRIMARIA" = "#FFE099FF",
"BACHILLERATO" = "#FFFFBFFF",
"PREGRADO - TĆCNICO PROFESIONAL" = "#E0FFFFFF",
"PREGRADO - TECNOLĆGICO" = "#AAF7FFFF",
"PREGRADO - PROFESIONAL" = "#72D9FFFF",
"POSTGRADO - MAESTRIA" = "#3FA0FFFF",
"POSTGRADO - ESPECIALIZACIĆN" = "#264DFFFF",
"POSTGRADO - DOCTORADO" = "#290AD8FF",
"NO INDICA" = "#A50021FF"
)
# Ordenar los niveles acadƩmicos de menor a mayor
DataNA <- DataNA %>%
mutate(Nivel.AcadƩmico = factor(Nivel.AcadƩmico,
levels = c("NO INDICA","NINGUNO", "SIN PROFESIĆN",
"PRIMARIA", "BACHILLERATO",
"PREGRADO - TĆCNICO PROFESIONAL",
"PREGRADO - TECNOLĆGICO",
"PREGRADO - PROFESIONAL",
"POSTGRADO - MAESTRIA",
"POSTGRADO - ESPECIALIZACIĆN",
"POSTGRADO - DOCTORADO")))
ggplot(DataNA, aes(x = "", fill = Nivel.AcadƩmico)) +
geom_bar(width = 1, stat = "count") +
scale_fill_manual(values = paleta_colores) + # Aplicar la paleta de colores
labs(title = "Distribución por Nivel Académico",
x = "",
y = "Cantidad",
fill = "Nivel AcadƩmico") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
axis.text.y = element_text(size = 10),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
)
Nivel AcadƩmico (Top 3). Tabla.
# Calcular la tabla de frecuencia
tabla_frecuencia <- Data_top3 %>%
group_by(Nivel.AcadƩmico) %>%
summarise(
Frecuencia = n(),
Porcentaje = round((n() / nrow(Data_top3)) * 100, 2)
) %>%
arrange(desc(Frecuencia))
# Mostrar la tabla de frecuencia con kable
kable(tabla_frecuencia, col.names = c("Nivel AcadƩmico", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Nivel Académico") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, bold = TRUE, width = "15em") %>%
column_spec(2, width = "5em") %>%
column_spec(3, width = "5em")
| Nivel AcadƩmico | Frecuencia | Porcentaje (%) |
|---|---|---|
| NO INDICA | 148262 | 31.69 |
| BACHILLERATO | 94906 | 20.28 |
| PREGRADO - PROFESIONAL | 81721 | 17.47 |
| PRIMARIA | 46345 | 9.91 |
| PREGRADO - TĆCNICO PROFESIONAL | 36950 | 7.90 |
| PREGRADO - TECNOLĆGICO | 19290 | 4.12 |
| POSTGRADO - MAESTRIA | 14915 | 3.19 |
| NINGUNO | 11764 | 2.51 |
| POSTGRADO - ESPECIALIZACIĆN | 9825 | 2.10 |
| POSTGRADO - DOCTORADO | 3762 | 0.80 |
| SIN PROFESIĆN | 134 | 0.03 |
Apilado.
# Ordenar los niveles acadƩmicos de menor a mayor
Data_top3 <- Data_top3 %>%
mutate(Nivel.AcadƩmico = factor(Nivel.AcadƩmico,
levels = c("NO INDICA","NINGUNO", "SIN PROFESIĆN",
"PRIMARIA", "BACHILLERATO",
"PREGRADO - TĆCNICO PROFESIONAL",
"PREGRADO - TECNOLĆGICO",
"PREGRADO - PROFESIONAL",
"POSTGRADO - MAESTRIA",
"POSTGRADO - ESPECIALIZACIĆN",
"POSTGRADO - DOCTORADO")))
ggplot(Data_top3, aes(PaĆs, fill = Nivel.AcadĆ©mico)) +
geom_bar( stat = "count") +
scale_fill_manual(values = paleta_colores) + # Aplicar la paleta de colores
labs(title = "Distribución por Nivel Académico",
x = "",
y = "Cantidad",
fill = "Nivel AcadƩmico") +
theme_bw() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
axis.text.y = element_text(size = 10),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
)
Estado Civil (Total). Tabla.
# Tabla de frecuencia y porcentaje para Estado Civil
tabla_estado_civil <- DataNA%>%
group_by(Estado.civil) %>%
summarise(
Frecuencia = n(),
Porcentaje = round((n() / nrow(DataNA)) * 100, 2)
) %>%
arrange(desc(Frecuencia))
# Mostrar la tabla usando kable
kable(tabla_estado_civil, col.names = c("Estado Civil", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Estado Civil") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, bold = TRUE, width = "15em") %>%
column_spec(2, width = "5em") %>%
column_spec(3, width = "5em")
| Estado Civil | Frecuencia | Porcentaje (%) |
|---|---|---|
| SOLTERO | 325863 | 41.66 |
| CASADO | 265168 | 33.90 |
| UNION_LIBRE | 65410 | 8.36 |
| DESCONOCIDO | 56712 | 7.25 |
| DIVORCIADO | 48731 | 6.23 |
| VIUDO | 17310 | 2.21 |
| SEPARADO_MATRIMONIO | 2042 | 0.26 |
| SEPARADO_UNION_LIBRE | 1014 | 0.13 |
# GrƔfico de barras
ggplot(DataNA, aes(x = reorder(Estado.civil, -table(Estado.civil)[Estado.civil]))) +
geom_bar(fill = "#3FA0FFFF", color = "black") +
theme_minimal() +
labs(title = "Distribución por Estado Civil (Total)",
x = "Estado Civil",
y = "Cantidad") +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
axis.text.y = element_text(size = 10)
)
Estado Civil (Top 3).
# GrĆ”fico de barras para Estado Civil en el top 3 de paĆses
ggplot(Data_top3, aes(x = reorder(Estado.civil, -table(Estado.civil)[Estado.civil]), fill = PaĆs)) +
geom_bar(position = "dodge", color = "black") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
labs(title = "Distribución por Estado Civil en el Top 3 de PaĆses",
x = "Estado Civil",
y = "Cantidad",
fill = "PaĆs") +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
axis.text.y = element_text(size = 10),
legend.position = "top"
)
GƩnero (Total).
# Tabla de frecuencia y porcentaje para GƩnero
tabla_genero <- DataNA %>%
group_by(GƩnero) %>%
summarise(
Frecuencia = n(),
Porcentaje = round((n() / nrow(DataNA)) * 100, 2)
) %>%
arrange(desc(Frecuencia))
# Mostrar la tabla usando kable
kable(tabla_genero, col.names = c("GƩnero", "Frecuencia", "Porcentaje (%)"),
caption = "Distribución por Género") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
column_spec(1, bold = TRUE, width = "15em") %>%
column_spec(2, width = "5em") %>%
column_spec(3, width = "5em")
| GƩnero | Frecuencia | Porcentaje (%) |
|---|---|---|
| FEMENINO | 432511 | 55.29 |
| MASCULINO | 349732 | 44.71 |
| NO_BINARIO | 7 | 0.00 |
# GrƔfico de barras
ggplot(DataNA, aes(x = GƩnero)) +
geom_bar() +
labs(title = "Distribución por Género", x = "Género", y = "Cantidad")
# Calcular frecuencias y porcentajes
data_summary <- DataNA %>%
group_by(GƩnero) %>%
summarise(Frecuencia = n()) %>%
mutate(Porcentaje = round((Frecuencia / sum(Frecuencia)) * 100, 2))
# Crear el grƔfico de pastel
fig <- plot_ly(data_summary,
labels = ~GƩnero,
values = ~Frecuencia,
type = 'pie',
textinfo = 'label+percent',
marker = list(colors = c("#DD75D3FF", "#7E8CF3FF", "#719F47FF")),
showlegend = TRUE) %>%
layout(title = 'Distribución por Género',
xaxis = list(showgrid = TRUE, zeroline = TRUE),
yaxis = list(showgrid = TRUE, zeroline = TRUE))
# Mostrar el grƔfico
fig
GƩnero (Top 3).
# GrĆ”fico de barras apiladas para GĆ©nero en el top 3 de paĆses
ggplot(Data_top3, aes(x = reorder(GĆ©nero, -table(GĆ©nero)[GĆ©nero]), fill = PaĆs)) +
geom_bar(position = "dodge", color = "black") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
labs(title = "Distribución por GĆ©nero en el Top 3 de PaĆses",
x = "GƩnero",
y = "Cantidad",
fill = "PaĆs") +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "top"
)
Etnia de la Persona (Total).
# Tabla de frecuencia
table(DataNA$Etnia.de.la.persona)
##
## AFRODESCENDIENTE GITANO
## 17162 422
## INDĆGENA NINGUNA
## 3503 394827
## OTRO PALENQUERO DE SAN BASILIO
## 323110 149
## RAIZAL DEL ARCHIPIELAGO DE SAN ANDRES SIN ETNIA REGISTRADA
## 435 42642
# GrƔfico de barras horizontal para Etnia
ggplot(DataNA, aes(x = reorder(Etnia.de.la.persona, -table(Etnia.de.la.persona)[Etnia.de.la.persona]))) +
geom_bar(fill = "#719F47FF", color = "black") +
theme_minimal() +
labs(title = "Distribución por Etnia de la Persona",
x = "Cantidad",
y = "Etnia") +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10)
) +
coord_flip() # Voltear para una lectura mƔs fƔcil
Etnia de la Persona (Top 3).
# GrĆ”fico de barras apiladas horizontal para Etnia en el top 3 de paĆses
ggplot(Data_top3, aes(x = reorder(Etnia.de.la.persona, -table(Etnia.de.la.persona)[Etnia.de.la.persona]), fill = PaĆs)) +
geom_bar(position = "dodge", color = "black") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
labs(title = "Distribución por Etnia en el Top 3 de PaĆses",
x = "Etnia",
y = "Cantidad",
fill = "PaĆs") +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.x = element_text(face = "bold", size = 12),
axis.title.y = element_text(face = "bold", size = 12),
axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
legend.position = "top"
) +
coord_flip() # Voltear para una lectura mƔs fƔcil
#Analisis Multivariado. Relación entre Género y Nivel Académico Esto estÔ pendiente, no confio en el resultado, me parece que tenemos un falso positivo, Error tipo 1, plis soluciones. Hipótesis: Existen diferencias significativas en el nivel académico alcanzado entre géneros.
# Tabla de contingencia
tabla_genero_academico <- table(DataNA$GƩnero, DataNA$Nivel.AcadƩmico)
print(tabla_genero_academico)
##
## NO INDICA NINGUNO SIN PROFESIĆN PRIMARIA BACHILLERATO
## FEMENINO 149409 8994 104 34677 80586
## MASCULINO 122770 8068 76 30734 67466
## NO_BINARIO 0 0 0 0 4
##
## PREGRADO - TĆCNICO PROFESIONAL PREGRADO - TECNOLĆGICO
## FEMENINO 30344 15355
## MASCULINO 22448 12746
## NO_BINARIO 0 0
##
## PREGRADO - PROFESIONAL POSTGRADO - MAESTRIA
## FEMENINO 79390 18353
## MASCULINO 58125 14511
## NO_BINARIO 2 1
##
## POSTGRADO - ESPECIALIZACIĆN POSTGRADO - DOCTORADO
## FEMENINO 11890 3409
## MASCULINO 8729 4059
## NO_BINARIO 0 0
# Prueba de Chi-cuadrado
prueba_chi_genero_academico <- chisq.test(tabla_genero_academico)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
prueba_chi_genero_academico
##
## Pearson's Chi-squared test
##
## data: tabla_genero_academico
## X-squared = 1027.3, df = 20, p-value < 2.2e-16
# Verificar conteos esperados
prueba_chi_genero_academico$expected
##
## NO INDICA NINGUNO SIN PROFESIĆN PRIMARIA BACHILLERATO
## FEMENINO 1.504895e+05 9433.6883119 99.523144775 3.616616e+04 81861.104015
## MASCULINO 1.216871e+05 7628.1590080 80.475244487 2.924426e+04 66193.571099
## NO_BINARIO 2.435606e+00 0.1526801 0.001610738 5.853333e-01 1.324886
##
## PREGRADO - TĆCNICO PROFESIONAL PREGRADO - TECNOLĆGICO
## FEMENINO 2.918903e+04 1.553722e+04
## MASCULINO 2.360250e+04 1.256353e+04
## NO_BINARIO 4.724116e-01 2.514631e-01
##
## PREGRADO - PROFESIONAL POSTGRADO - MAESTRIA
## FEMENINO 76034.023889 18171.267517
## MASCULINO 61481.745534 14693.438389
## NO_BINARIO 1.230577 0.294094
##
## POSTGRADO - ESPECIALIZACIĆN POSTGRADO - DOCTORADO
## FEMENINO 1.140038e+04 4.129105e+03
## MASCULINO 9.218439e+03 3.338828e+03
## NO_BINARIO 1.845101e-01 6.682774e-02
# Visualización
ggplot(DataNA, aes(x = Nivel.AcadƩmico, fill = GƩnero)) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("#DD75D3FF", "#7E8CF3FF", "#719F47FF")) +
labs(title = "Distribución del Nivel Académico por Género",
x = "Nivel AcadƩmico",
y = "Cantidad") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Relación entre PaĆs y Ćrea de Conocimiento Hipótesis: Ciertos paĆses tienen una mayor concentración de personas en determinadas Ć”reas de conocimiento.
# Tabla de contingencia
tabla_pais_area <- table(Data_top10$PaĆs, Data_top10$Area.Conocimiento)
# Prueba de Chi-cuadrado
prueba_chi_pais_area <- chisq.test(tabla_pais_area)
prueba_chi_pais_area
##
## Pearson's Chi-squared test
##
## data: tabla_pais_area
## X-squared = 66389, df = 108, p-value < 2.2e-16
# Visualización
ggplot(Data_top10, aes(x = Area.Conocimiento, fill = PaĆs)) +
geom_bar(position = "dodge") +
labs(title = "Distribución del Ćrea de Conocimiento por PaĆs (Top 10 PaĆses)",
x = "Ćrea de Conocimiento",
y = "Cantidad") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
#Esto es para ver el top 3
# Tabla de contingencia top 3
tabla_pais_area <- table(Data_top3$PaĆs, Data_top3$Area.Conocimiento)
# Prueba de Chi-cuadrado
prueba_chi_pais_area <- chisq.test(tabla_pais_area)
prueba_chi_pais_area
##
## Pearson's Chi-squared test
##
## data: tabla_pais_area
## X-squared = 40736, df = 24, p-value < 2.2e-16
# Visualización
ggplot(Data_top3, aes(x = Area.Conocimiento, fill = PaĆs)) +
geom_bar(position = "dodge") +
labs(title = "Distribución del Ćrea de Conocimiento por PaĆs (Top 3 PaĆses)",
x = "Ćrea de Conocimiento",
y = "Cantidad") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Relación entre PaĆs y GĆ©nero (Top 10 PaĆses) Hipótesis: Existen diferencias significativas en la proporción de gĆ©nero entre los top 10 paĆses.
# Tabla de contingencia
tabla_pais_genero <- table(DataNA$PaĆs, DataNA$GĆ©nero)
# Prueba de Chi-cuadrado
prueba_chi_pais_genero <- chisq.test(tabla_pais_genero)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
prueba_chi_pais_genero
##
## Pearson's Chi-squared test
##
## data: tabla_pais_genero
## X-squared = 4057.7, df = 384, p-value < 2.2e-16
# Visualización
ggplot(Data_top10, aes(x = PaĆs, fill = GĆ©nero)) +
geom_bar(position = "dodge") +
labs(title = "Distribución de GĆ©nero por PaĆs",
x = "PaĆs",
y = "Cantidad") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Relación entre Edad y Nivel Académico Hipótesis: El nivel académico tiende a aumentar con la edad.
# ANOVA para comparar la Edad media entre los diferentes Niveles AcadƩmicos
anova_edad_nivel <- aov(Edad ~ Nivel.AcadƩmico, data = DataNA)
summary(anova_edad_nivel)
## Df Sum Sq Mean Sq F value Pr(>F)
## Nivel.AcadƩmico 10 3614823 361482 1425 <2e-16 ***
## Residuals 782239 198423985 254
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Realizar el test post-hoc de Tukey
tukey_result <- TukeyHSD(anova_edad_nivel)
# Mostrar los resultados
print(tukey_result)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Edad ~ Nivel.AcadƩmico, data = DataNA)
##
## $Nivel.AcadƩmico
## diff
## NINGUNO-NO INDICA -3.76008382
## SIN PROFESIĆN-NO INDICA 0.78900903
## PRIMARIA-NO INDICA 5.54508506
## BACHILLERATO-NO INDICA 2.66873337
## PREGRADO - TĆCNICO PROFESIONAL-NO INDICA -2.10136493
## PREGRADO - TECNOLĆGICO-NO INDICA -2.08067058
## PREGRADO - PROFESIONAL-NO INDICA -0.40639760
## POSTGRADO - MAESTRIA-NO INDICA -2.01739089
## POSTGRADO - ESPECIALIZACIĆN-NO INDICA 0.57727228
## POSTGRADO - DOCTORADO-NO INDICA 1.75408372
## SIN PROFESIĆN-NINGUNO 4.54909285
## PRIMARIA-NINGUNO 9.30516888
## BACHILLERATO-NINGUNO 6.42881719
## PREGRADO - TĆCNICO PROFESIONAL-NINGUNO 1.65871889
## PREGRADO - TECNOLĆGICO-NINGUNO 1.67941324
## PREGRADO - PROFESIONAL-NINGUNO 3.35368622
## POSTGRADO - MAESTRIA-NINGUNO 1.74269293
## POSTGRADO - ESPECIALIZACIĆN-NINGUNO 4.33735610
## POSTGRADO - DOCTORADO-NINGUNO 5.51416754
## PRIMARIA-SIN PROFESIĆN 4.75607603
## BACHILLERATO-SIN PROFESIĆN 1.87972434
## PREGRADO - TĆCNICO PROFESIONAL-SIN PROFESIĆN -2.89037396
## PREGRADO - TECNOLĆGICO-SIN PROFESIĆN -2.86967961
## PREGRADO - PROFESIONAL-SIN PROFESIĆN -1.19540663
## POSTGRADO - MAESTRIA-SIN PROFESIĆN -2.80639992
## POSTGRADO - ESPECIALIZACIĆN-SIN PROFESIĆN -0.21173675
## POSTGRADO - DOCTORADO-SIN PROFESIĆN 0.96507469
## BACHILLERATO-PRIMARIA -2.87635169
## PREGRADO - TĆCNICO PROFESIONAL-PRIMARIA -7.64644999
## PREGRADO - TECNOLĆGICO-PRIMARIA -7.62575563
## PREGRADO - PROFESIONAL-PRIMARIA -5.95148265
## POSTGRADO - MAESTRIA-PRIMARIA -7.56247594
## POSTGRADO - ESPECIALIZACIĆN-PRIMARIA -4.96781277
## POSTGRADO - DOCTORADO-PRIMARIA -3.79100134
## PREGRADO - TĆCNICO PROFESIONAL-BACHILLERATO -4.77009830
## PREGRADO - TECNOLĆGICO-BACHILLERATO -4.74940395
## PREGRADO - PROFESIONAL-BACHILLERATO -3.07513097
## POSTGRADO - MAESTRIA-BACHILLERATO -4.68612426
## POSTGRADO - ESPECIALIZACIĆN-BACHILLERATO -2.09146109
## POSTGRADO - DOCTORADO-BACHILLERATO -0.91464965
## PREGRADO - TECNOLĆGICO-PREGRADO - TĆCNICO PROFESIONAL 0.02069435
## PREGRADO - PROFESIONAL-PREGRADO - TĆCNICO PROFESIONAL 1.69496733
## POSTGRADO - MAESTRIA-PREGRADO - TĆCNICO PROFESIONAL 0.08397404
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - TĆCNICO PROFESIONAL 2.67863721
## POSTGRADO - DOCTORADO-PREGRADO - TĆCNICO PROFESIONAL 3.85544865
## PREGRADO - PROFESIONAL-PREGRADO - TECNOLĆGICO 1.67427298
## POSTGRADO - MAESTRIA-PREGRADO - TECNOLĆGICO 0.06327969
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - TECNOLĆGICO 2.65794286
## POSTGRADO - DOCTORADO-PREGRADO - TECNOLĆGICO 3.83475430
## POSTGRADO - MAESTRIA-PREGRADO - PROFESIONAL -1.61099329
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - PROFESIONAL 0.98366988
## POSTGRADO - DOCTORADO-PREGRADO - PROFESIONAL 2.16048132
## POSTGRADO - ESPECIALIZACIĆN-POSTGRADO - MAESTRIA 2.59466317
## POSTGRADO - DOCTORADO-POSTGRADO - MAESTRIA 3.77147461
## POSTGRADO - DOCTORADO-POSTGRADO - ESPECIALIZACIĆN 1.17681144
## lwr
## NINGUNO-NO INDICA -4.1646497
## SIN PROFESIĆN-NO INDICA -3.0331513
## PRIMARIA-NO INDICA 5.3218596
## BACHILLERATO-NO INDICA 2.5031917
## PREGRADO - TĆCNICO PROFESIONAL-NO INDICA -2.3451530
## PREGRADO - TECNOLĆGICO-NO INDICA -2.4018714
## PREGRADO - PROFESIONAL-NO INDICA -0.5759980
## POSTGRADO - MAESTRIA-NO INDICA -2.3167474
## POSTGRADO - ESPECIALIZACIĆN-NO INDICA 0.2069972
## POSTGRADO - DOCTORADO-NO INDICA 1.1528031
## SIN PROFESIĆN-NINGUNO 0.7080939
## PRIMARIA-NINGUNO 8.8644952
## BACHILLERATO-NINGUNO 6.0143684
## PREGRADO - TĆCNICO PROFESIONAL-NINGUNO 1.2072808
## PREGRADO - TECNOLĆGICO-NINGUNO 1.1818857
## PREGRADO - PROFESIONAL-NINGUNO 2.9375997
## POSTGRADO - MAESTRIA-NINGUNO 1.2589802
## POSTGRADO - ESPECIALIZACIĆN-NINGUNO 3.8068211
## POSTGRADO - DOCTORADO-NINGUNO 4.8028996
## PRIMARIA-SIN PROFESIĆN 0.9299253
## BACHILLERATO-SIN PROFESIĆN -1.9434947
## PREGRADO - TĆCNICO PROFESIONAL-SIN PROFESIĆN -6.7177794
## PREGRADO - TECNOLĆGICO-SIN PROFESIĆN -6.7027945
## PREGRADO - PROFESIONAL-SIN PROFESIĆN -5.0188035
## POSTGRADO - MAESTRIA-SIN PROFESIĆN -6.6377461
## POSTGRADO - ESPECIALIZACIĆN-SIN PROFESIĆN -4.0492754
## POSTGRADO - DOCTORADO-SIN PROFESIĆN -2.9015954
## BACHILLERATO-PRIMARIA -3.1170253
## PREGRADO - TĆCNICO PROFESIONAL-PRIMARIA -7.9463707
## PREGRADO - TECNOLĆGICO-PRIMARIA -7.9913917
## PREGRADO - PROFESIONAL-PRIMARIA -6.1949658
## POSTGRADO - MAESTRIA-PRIMARIA -7.9090796
## POSTGRADO - ESPECIALIZACIĆN-PRIMARIA -5.3772312
## POSTGRADO - DOCTORADO-PRIMARIA -4.4171468
## PREGRADO - TĆCNICO PROFESIONAL-BACHILLERATO -5.0299576
## PREGRADO - TECNOLĆGICO-BACHILLERATO -5.0829668
## PREGRADO - PROFESIONAL-BACHILLERATO -3.2671167
## POSTGRADO - MAESTRIA-BACHILLERATO -4.9987079
## POSTGRADO - ESPECIALIZACIĆN-BACHILLERATO -2.4725095
## POSTGRADO - DOCTORADO-BACHILLERATO -1.5226238
## PREGRADO - TECNOLĆGICO-PREGRADO - TĆCNICO PROFESIONAL -0.3578459
## PREGRADO - PROFESIONAL-PREGRADO - TĆCNICO PROFESIONAL 1.4325038
## POSTGRADO - MAESTRIA-PREGRADO - TĆCNICO PROFESIONAL -0.2762164
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - TĆCNICO PROFESIONAL 2.2576545
## POSTGRADO - DOCTORADO-PREGRADO - TĆCNICO PROFESIONAL 3.2216812
## PREGRADO - PROFESIONAL-PREGRADO - TECNOLĆGICO 1.3386774
## POSTGRADO - MAESTRIA-PREGRADO - TECNOLĆGICO -0.3532229
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - TECNOLĆGICO 2.1878750
## POSTGRADO - DOCTORADO-PREGRADO - TECNOLĆGICO 3.1673725
## POSTGRADO - MAESTRIA-PREGRADO - PROFESIONAL -1.9257452
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - PROFESIONAL 0.6008408
## POSTGRADO - DOCTORADO-PREGRADO - PROFESIONAL 1.5513895
## POSTGRADO - ESPECIALIZACIĆN-POSTGRADO - MAESTRIA 2.1392423
## POSTGRADO - DOCTORADO-POSTGRADO - MAESTRIA 3.1143271
## POSTGRADO - DOCTORADO-POSTGRADO - ESPECIALIZACIĆN 0.4844732
## upr p adj
## NINGUNO-NO INDICA -3.3555179 0.0000000
## SIN PROFESIĆN-NO INDICA 4.6111693 0.9998816
## PRIMARIA-NO INDICA 5.7683105 0.0000000
## BACHILLERATO-NO INDICA 2.8342751 0.0000000
## PREGRADO - TĆCNICO PROFESIONAL-NO INDICA -1.8575768 0.0000000
## PREGRADO - TECNOLĆGICO-NO INDICA -1.7594698 0.0000000
## PREGRADO - PROFESIONAL-NO INDICA -0.2367972 0.0000000
## POSTGRADO - MAESTRIA-NO INDICA -1.7180344 0.0000000
## POSTGRADO - ESPECIALIZACIĆN-NO INDICA 0.9475474 0.0000281
## POSTGRADO - DOCTORADO-NO INDICA 2.3553643 0.0000000
## SIN PROFESIĆN-NINGUNO 8.3900918 0.0064707
## PRIMARIA-NINGUNO 9.7458426 0.0000000
## BACHILLERATO-NINGUNO 6.8432659 0.0000000
## PREGRADO - TĆCNICO PROFESIONAL-NINGUNO 2.1101570 0.0000000
## PREGRADO - TECNOLĆGICO-NINGUNO 2.1769408 0.0000000
## PREGRADO - PROFESIONAL-NINGUNO 3.7697728 0.0000000
## POSTGRADO - MAESTRIA-NINGUNO 2.2264057 0.0000000
## POSTGRADO - ESPECIALIZACIĆN-NINGUNO 4.8678911 0.0000000
## POSTGRADO - DOCTORADO-NINGUNO 6.2254355 0.0000000
## PRIMARIA-SIN PROFESIĆN 8.5822267 0.0030753
## BACHILLERATO-SIN PROFESIĆN 5.7029433 0.8900507
## PREGRADO - TĆCNICO PROFESIONAL-SIN PROFESIĆN 0.9370314 0.3467236
## PREGRADO - TECNOLĆGICO-SIN PROFESIĆN 0.9634352 0.3601346
## PREGRADO - PROFESIONAL-SIN PROFESIĆN 2.6279903 0.9956032
## POSTGRADO - MAESTRIA-SIN PROFESIĆN 1.0249463 0.3943778
## POSTGRADO - ESPECIALIZACIĆN-SIN PROFESIĆN 3.6258019 1.0000000
## POSTGRADO - DOCTORADO-SIN PROFESIĆN 4.8317448 0.9993490
## BACHILLERATO-PRIMARIA -2.6356780 0.0000000
## PREGRADO - TĆCNICO PROFESIONAL-PRIMARIA -7.3465293 0.0000000
## PREGRADO - TECNOLĆGICO-PRIMARIA -7.2601196 0.0000000
## PREGRADO - PROFESIONAL-PRIMARIA -5.7079995 0.0000000
## POSTGRADO - MAESTRIA-PRIMARIA -7.2158723 0.0000000
## POSTGRADO - ESPECIALIZACIĆN-PRIMARIA -4.5583944 0.0000000
## POSTGRADO - DOCTORADO-PRIMARIA -3.1648559 0.0000000
## PREGRADO - TĆCNICO PROFESIONAL-BACHILLERATO -4.5102390 0.0000000
## PREGRADO - TECNOLĆGICO-BACHILLERATO -4.4158411 0.0000000
## PREGRADO - PROFESIONAL-BACHILLERATO -2.8831452 0.0000000
## POSTGRADO - MAESTRIA-BACHILLERATO -4.3735406 0.0000000
## POSTGRADO - ESPECIALIZACIĆN-BACHILLERATO -1.7104127 0.0000000
## POSTGRADO - DOCTORADO-BACHILLERATO -0.3066755 0.0000684
## PREGRADO - TECNOLĆGICO-PREGRADO - TĆCNICO PROFESIONAL 0.3992347 1.0000000
## PREGRADO - PROFESIONAL-PREGRADO - TĆCNICO PROFESIONAL 1.9574309 0.0000000
## POSTGRADO - MAESTRIA-PREGRADO - TĆCNICO PROFESIONAL 0.4441645 0.9996441
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - TĆCNICO PROFESIONAL 3.0996200 0.0000000
## POSTGRADO - DOCTORADO-PREGRADO - TĆCNICO PROFESIONAL 4.4892161 0.0000000
## PREGRADO - PROFESIONAL-PREGRADO - TECNOLĆGICO 2.0098686 0.0000000
## POSTGRADO - MAESTRIA-PREGRADO - TECNOLĆGICO 0.4797823 0.9999933
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - TECNOLĆGICO 3.1280107 0.0000000
## POSTGRADO - DOCTORADO-PREGRADO - TECNOLĆGICO 4.5021361 0.0000000
## POSTGRADO - MAESTRIA-PREGRADO - PROFESIONAL -1.2962413 0.0000000
## POSTGRADO - ESPECIALIZACIĆN-PREGRADO - PROFESIONAL 1.3664990 0.0000000
## POSTGRADO - DOCTORADO-PREGRADO - PROFESIONAL 2.7695732 0.0000000
## POSTGRADO - ESPECIALIZACIĆN-POSTGRADO - MAESTRIA 3.0500840 0.0000000
## POSTGRADO - DOCTORADO-POSTGRADO - MAESTRIA 4.4286221 0.0000000
## POSTGRADO - DOCTORADO-POSTGRADO - ESPECIALIZACIĆN 1.8691497 0.0000024
# Visualización
ggplot(DataNA, aes(x = Nivel.AcadƩmico, y = Edad)) +
geom_boxplot() +
coord_flip() +
labs(title = "Distribución de la Edad por Nivel Académico",
x = "Nivel AcadƩmico",
y = "Edad (aƱos)")
Relación entre PaĆs, Estado Civil, y GĆ©nero Hipótesis: Existen diferencias significativas en el estado civil segĆŗn el gĆ©nero y el paĆs.
# Visualización
ggplot(Data_top3, aes(x = Estado.civil, fill = GƩnero)) +
geom_bar(position = "dodge") +
facet_wrap(~PaĆs) +
labs(title = "Estado Civil por GĆ©nero y PaĆs",
x = "Estado Civil",
y = "Cantidad") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Iterar sobre los paĆses para realizar la prueba de Chi-cuadrado
resultados <- Data_top3 %>%
group_by(PaĆs) %>%
summarise(Chi2 = list(chisq.test(table(GƩnero, Estado.civil))$p.value))
## Warning: There were 2 warnings in `summarise()`.
## The first warning was:
## ⹠In argument: `Chi2 = list(chisq.test(table(Género, Estado.civil))$p.value)`.
## ā¹ In group 1: `PaĆs = "ESPAĆA"`.
## Caused by warning in `stats::chisq.test()`:
## ! Chi-squared approximation may be incorrect
## ā¹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
# Mostrar los resultados
kable(resultados, col.names = c("PaĆs", "P-valor Chi-cuadrado"),
caption = "Prueba de Chi-cuadrado por PaĆs para la relación entre GĆ©nero y Estado Civil")
| PaĆs | P-valor Chi-cuadrado |
|---|---|
| ESPAĆA | 0 |
| ESTADOS UNIDOS | 0 |
| VENEZUELA | 8.096083e-108 |
Relación entre Edad y Estado Civil Hipótesis: La edad tiene un impacto significativo en el estado civil de las personas.
# ANOVA para comparar la Edad media entre los diferentes Estados Civiles
anova_edad_estado_civil <- aov(Edad ~ Estado.civil, data = DataNA)
summary(anova_edad_estado_civil)
## Df Sum Sq Mean Sq F value Pr(>F)
## Estado.civil 7 33110324 4730046 21903 <2e-16 ***
## Residuals 782242 168928484 216
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Visualización
ggplot(DataNA, aes(x = Estado.civil, y = Edad)) +
geom_boxplot() +
coord_flip() +
labs(title = "Distribución de la Edad por Estado Civil",
x = "Estado Civil",
y = "Edad (aƱos)")
#library(ggplot2)
Vamos a realizar una prueba de chi cuadrado entre las variables pais
y etnia, para ver si hay una realcion significativa entre ambas,
con:
Ho: No existe una asocion entre las variables etnia y pais de
residencia.
H1: Hay una relacion significativa entre las varibales.
tabla_contingencia <- table(DataNA$PaĆs, DataNA$Etnia.de.la.persona)
resultado_chi <- chisq.test(tabla_contingencia)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
print(resultado_chi)
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 50607, df = 1344, p-value < 2.2e-16
En este caso nos da un P-Valor extremadamente pequeƱo, lo que sugiere
que debemos rechazar nuestra hipotesis nula de que no existe asociacion
significativa entre ambas varibles. Y aceptar que en realidad si la
hay.
Sin embargo R nos arroja una advertencia donde nos dice que la
aproximacion del Chi Cuadrado podria ser incorrecto, esto es debido a
que exiten celdas en nuestra tabla de contingencia que tienen
frecuencias esperadas muy bajas, esto entorpece la aproximacion, y es
usual en tablas de contingencias tan grandes como esta, en la que se
manejan tantos paises y tantas etnias, por lo que hay un gran numero de
combinaciones posibles.
if (resultado_chi$p.value < 0.05) {
print("Existe una asociación significativa entre el paĆs de residencia y la etnia.")
} else {
print("No se encuentra una asociación significativa entre el paĆs de residencia y la etnia.")
}
## [1] "Existe una asociación significativa entre el paĆs de residencia y la etnia."
#Para manejar el problema anteriormente presentado se decidio hacer una simulacion de Monte Carlo, la cual es util cuando las supociciones del chi cuadrado tradicional no se cumplen, por ejemplo en este caso que la tabla de contingencia es bastante grande y hay celdas con frecuencias bastante bajas.
# Prueba de Chi-cuadrado con simulación de Monte Carlo
resultado_chi_mc <- chisq.test(tabla_contingencia, simulate.p.value = TRUE, B = 10000)
# Ver los resultados
print(resultado_chi_mc)
##
## Pearson's Chi-squared test with simulated p-value (based on 10000
## replicates)
##
## data: tabla_contingencia
## X-squared = 50607, df = NA, p-value = 9.999e-05
En este caso volvemos a observar que el P-Valor es extremadamente pequeño, lo que indica que es muy improbable observar una asocioación tan fuerte por azar. Y confirmamos que efectivamente existe una relacion significata entre el pais de residencia y la etnia.
#Ahora veamos si existe una relación entre el paĆs y el area de conocimiento.
tabla_contingencia_area <- table(DataNA$PaĆs, DataNA$Area.Conocimiento)
resultado_chiq <- chisq.test(tabla_contingencia_area)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
print(resultado_chiq)
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia_area
## X-squared = 97150, df = 2304, p-value < 2.2e-16
En este caso nos estÔ ocurriendo exactamento lo mismo que la vez pasada, asi que realizaremos la misma simulación de Monte Carlo.
chisq.test(tabla_contingencia_area, simulate.p.value = TRUE, B = 10000)
##
## Pearson's Chi-squared test with simulated p-value (based on 10000
## replicates)
##
## data: tabla_contingencia_area
## X-squared = 97150, df = NA, p-value = 9.999e-05
Con este P-valor pequeƱo tambiƩn rechazamos la Hipotesis nula, lo que
sugiere que la relacion entre area de conocimiento y pais de residencia
tambien es significativa.
Veamos ciencias basicas en alemania:
ciencias_basicas <- subset(DataNA, Area.Conocimiento == "MATEMĆTICAS Y CIENCIAS NATURALES" & PaĆs == "ALEMANIA")
tabla_ciencias_basicas <- table(ciencias_basicas$Sub.Area.Conocimiento)
print(tabla_ciencias_basicas)
##
## BIOLOGĆA, MICROBIOLOGĆA Y AFINES FĆSICA
## 197 97
## GEOLOGĆA MATEMĆTICAS, ESTADĆSTICA Y AFINES
## 45 77
## OTROS PROGRAMAS DE CIENCIAS NATURALES QUĆMICA Y AFINES
## 57 90
resultado_chi_ciencias <- chisq.test(tabla_ciencias_basicas)
#Imprimir los resultados de la prueba
print(resultado_chi_ciencias)
##
## Chi-squared test for given probabilities
##
## data: tabla_ciencias_basicas
## X-squared = 156.58, df = 5, p-value < 2.2e-16
Con este P-valor podemos afirmar que hay una relación significativa entre ir a Alemania y estudiar un programa relacionado a las ciencias Basicas.
A continuación un Grafico de barras que nos muestra las frecuencias de cada uno, donde podemos ver que Sub Areas como Biologia , Microbiologia y areas afines tienen mayor relevancia en Alemania.
df_ciencias_basicas <- as.data.frame(tabla_ciencias_basicas)
colnames(df_ciencias_basicas) <- c("Sub.Area.Conocimiento", "Conteo")
# Crear el grƔfico de barras
ggplot(df_ciencias_basicas, aes(x = Sub.Area.Conocimiento, y = Conteo, fill = Sub.Area.Conocimiento)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Distribución de SubÔreas de Conocimiento en Ciencias BÔsicas (Alemania)",
x = "SubƔrea de Conocimiento",
y = "NĆŗmero de Personas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
A continuacion se hace un kruskal wallis para Edad y Etnia
#Prueba de Kruskal Wallis
kruskal_test = kruskal.test(DataNA$Edad ~ DataNA$Etnia.de.la.persona)
print(kruskal_test)
##
## Kruskal-Wallis rank sum test
##
## data: DataNA$Edad by DataNA$Etnia.de.la.persona
## Kruskal-Wallis chi-squared = 2069.2, df = 7, p-value < 2.2e-16
# Crear un boxplot utilizando ggplot2
ggplot(Data, aes(x = Etnia.de.la.persona, y = Edad, fill = Etnia.de.la.persona)) +
geom_boxplot() +
labs(x = "Etnia", y = "Edad", title = "Distribución de la Edad por Etnia") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3")