setwd(“SABER 11/Saber_11__2019-2_20240824.csv”)

install.packages("tidyverse")
## Warning: package 'tidyverse' is in use and will not be installed
library(tidyverse)
datos <- read_csv("SABER 11/Saber_11__2019-2_20240824.csv")
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
## Rows: 546212 Columns: 82
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (61): ESTU_TIPODOCUMENTO, ESTU_NACIONALIDAD, ESTU_GENERO, ESTU_FECHANACI...
## dbl (21): PERIODO, COLE_COD_DANE_ESTABLECIMIENTO, COLE_COD_DANE_SEDE, PUNT_L...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
spec(datos)
## cols(
##   ESTU_TIPODOCUMENTO = col_character(),
##   ESTU_NACIONALIDAD = col_character(),
##   ESTU_GENERO = col_character(),
##   ESTU_FECHANACIMIENTO = col_character(),
##   PERIODO = col_double(),
##   ESTU_CONSECUTIVO = col_character(),
##   ESTU_ESTUDIANTE = col_character(),
##   ESTU_TIENEETNIA = col_character(),
##   ESTU_PAIS_RESIDE = col_character(),
##   ESTU_ETNIA = col_character(),
##   ESTU_DEPTO_RESIDE = col_character(),
##   ESTU_COD_RESIDE_DEPTO = col_character(),
##   ESTU_MCPIO_RESIDE = col_character(),
##   ESTU_COD_RESIDE_MCPIO = col_character(),
##   FAMI_ESTRATOVIVIENDA = col_character(),
##   FAMI_PERSONASHOGAR = col_character(),
##   FAMI_CUARTOSHOGAR = col_character(),
##   FAMI_EDUCACIONPADRE = col_character(),
##   FAMI_EDUCACIONMADRE = col_character(),
##   FAMI_TRABAJOLABORPADRE = col_character(),
##   FAMI_TRABAJOLABORMADRE = col_character(),
##   FAMI_TIENEINTERNET = col_character(),
##   FAMI_TIENESERVICIOTV = col_character(),
##   FAMI_TIENECOMPUTADOR = col_character(),
##   FAMI_TIENELAVADORA = col_character(),
##   FAMI_TIENEHORNOMICROOGAS = col_character(),
##   FAMI_TIENEAUTOMOVIL = col_character(),
##   FAMI_TIENEMOTOCICLETA = col_character(),
##   FAMI_TIENECONSOLAVIDEOJUEGOS = col_character(),
##   FAMI_NUMLIBROS = col_character(),
##   FAMI_COMELECHEDERIVADOS = col_character(),
##   FAMI_COMECARNEPESCADOHUEVO = col_character(),
##   FAMI_COMECEREALFRUTOSLEGUMBRE = col_character(),
##   FAMI_SITUACIONECONOMICA = col_character(),
##   ESTU_DEDICACIONLECTURADIARIA = col_character(),
##   ESTU_DEDICACIONINTERNET = col_character(),
##   ESTU_HORASSEMANATRABAJA = col_character(),
##   ESTU_TIPOREMUNERACION = col_character(),
##   COLE_CODIGO_ICFES = col_character(),
##   COLE_COD_DANE_ESTABLECIMIENTO = col_double(),
##   COLE_NOMBRE_ESTABLECIMIENTO = col_character(),
##   COLE_GENERO = col_character(),
##   COLE_NATURALEZA = col_character(),
##   COLE_CALENDARIO = col_character(),
##   COLE_BILINGUE = col_character(),
##   COLE_CARACTER = col_character(),
##   COLE_COD_DANE_SEDE = col_double(),
##   COLE_NOMBRE_SEDE = col_character(),
##   COLE_SEDE_PRINCIPAL = col_character(),
##   COLE_AREA_UBICACION = col_character(),
##   COLE_JORNADA = col_character(),
##   COLE_COD_MCPIO_UBICACION = col_character(),
##   COLE_MCPIO_UBICACION = col_character(),
##   COLE_COD_DEPTO_UBICACION = col_character(),
##   COLE_DEPTO_UBICACION = col_character(),
##   ESTU_PRIVADO_LIBERTAD = col_character(),
##   ESTU_COD_MCPIO_PRESENTACION = col_character(),
##   ESTU_MCPIO_PRESENTACION = col_character(),
##   ESTU_DEPTO_PRESENTACION = col_character(),
##   ESTU_COD_DEPTO_PRESENTACION = col_character(),
##   PUNT_LECTURA_CRITICA = col_double(),
##   PERCENTIL_LECTURA_CRITICA = col_double(),
##   DESEMP_LECTURA_CRITICA = col_double(),
##   PUNT_MATEMATICAS = col_double(),
##   PERCENTIL_MATEMATICAS = col_double(),
##   DESEMP_MATEMATICAS = col_double(),
##   PUNT_C_NATURALES = col_double(),
##   PERCENTIL_C_NATURALES = col_double(),
##   DESEMP_C_NATURALES = col_double(),
##   PUNT_SOCIALES_CIUDADANAS = col_double(),
##   PERCENTIL_SOCIALES_CIUDADANAS = col_double(),
##   DESEMP_SOCIALES_CIUDADANAS = col_double(),
##   PUNT_INGLES = col_double(),
##   PERCENTIL_INGLES = col_double(),
##   DESEMP_INGLES = col_character(),
##   PUNT_GLOBAL = col_double(),
##   PERCENTIL_GLOBAL = col_double(),
##   ESTU_INSE_INDIVIDUAL = col_character(),
##   ESTU_NSE_INDIVIDUAL = col_double(),
##   ESTU_NSE_ESTABLECIMIENTO = col_double(),
##   ESTU_ESTADOINVESTIGACION = col_character(),
##   `ESTU_GENERACION-E` = col_character()
## )
dim(datos)
## [1] 546212     82

Reemplazar ‘-’ por NA en toda la base de datos

datos[] <- lapply(datos, function(x) {if (is.character(x)) {x[x == "-"] <- NA}
  return(x)})

#Filtramos por las 2 ciudades en las cuales nos enfocaremos

barranquilla_datos <- filter(datos, ESTU_MCPIO_RESIDE == "BARRANQUILLA")
cartagena_datos <- filter(datos, ESTU_MCPIO_RESIDE == "CARTAGENA DE INDIAS")
#FUNCION PARA VARIABLES NUMERICAS : ESTADISTICAS CAJA BIGOTES
estadistica_numerica_boxplot <- function(data, variable) {
  # Verificar que la base de datos y la variable existan
  if (is.null(data) || !variable %in% names(data)) {
    stop("La base de datos es NULL o la variable no existe en la base de datos.")
  }
  
  # Extraer la variable
  var_data <- data[[variable]]
  
  # Eliminar NA para evitar problemas en cálculos
  var_data <- na.omit(var_data)
  
  # Calcular estadísticas básicas
  stats <- list(
    Media = mean(var_data),
    Mediana = median(var_data),
    Varianza = var(var_data),
    Desviacion = sd(var_data),
    Minimo = min(var_data),
    Maximo = max(var_data),
    Cuartiles = quantile(var_data, probs = c(0.25, 0.5, 0.75)),
    Percentiles = quantile(var_data, probs = c(0.01, 0.99))
  )
  
  # Mostrar estadísticas
  print(stats)
  
  # Crear el boxplot
  plot <- ggplot(data, aes(x = factor(1), y = var_data)) +
    geom_boxplot() +
    labs(title = paste("Boxplot de", variable),
         x = "Variable",
         y = variable) +
    theme_minimal()
  
  # Mostrar el gráfico
  print(plot)
}
#FUNCION PARA VARIABLES CATEG0RICAS : ESTADISTICAS BARRAS

estadistica_categorica_barr <- function(data, variable) {
# Calcular frecuencia de cada categoría
freq_table <- table(data[[variable]])

# Convertir a dataframe para ggplot
df_freq <- as.data.frame(freq_table)
colnames(df_freq) <- c("Category", "Frequency")

# Calcular moda
moda <- names(freq_table)[which.max(freq_table)]

# Calcular estadísticas básicas
stats <- list(
  Total = sum(freq_table),
  Moda = moda,
  Frequencies = freq_table
)

# Mostrar estadísticas
print(stats)

# Crear el gráfico de barras
plot <- ggplot(df_freq, aes(x = Category, y = Frequency, fill = Category)) +
  geom_bar(stat = "identity") +
  labs(title = paste("Distribución de", variable),
       x = "Categoría",
       y = "Frecuencia") +
  theme_minimal()

# Mostrar el gráfico
print(plot)
}

#GRAFICA VARIABLE CATEGORICA COMPARADA CON EL PUNTAJE GLOBAL

variablecategorica_vs_ptglobal <- function(data, categorical_var) {
  # Verificar que la variable categórica existe en el dataset
  if (!(categorical_var %in% names(data))) {
    stop("La variable categórica no se encuentra en el dataset.")
  }
  
  # Filtrar los datos para excluir NA en la variable categórica y el puntaje global
  filtered_data <- data %>%
    filter(!is.na(.data[[categorical_var]]), !is.na(PUNT_GLOBAL))
  
  # Agrupar por la variable categórica y calcular la media del puntaje global
  summary_data <- filtered_data %>%
    group_by_at(categorical_var) %>%
    summarise(mean_punt_global = mean(PUNT_GLOBAL, na.rm = TRUE))
  
  # Crear el gráfico de barras
  plot <- ggplot(summary_data, aes(x = reorder(!!sym(categorical_var), mean_punt_global), y = mean_punt_global)) +
    geom_bar(stat = "identity", fill = "skyblue") +
    labs(title = paste("Puntaje Global por", categorical_var),
         x = categorical_var,
         y = "Media del Puntaje Global") +
    theme_minimal() +
    coord_flip()  # Opcional: para mejor visualización si hay muchas categorías
  
  # Mostrar el gráfico
  print(plot)
}

#COMPARACION DE VARIABLES CATEGORICAS POR CIUDAD

compare_two_cities_categorical <- function(city1_data, city2_data, variable, city1_name = "Ciudad 1", city2_name = "Ciudad 2", position = "stack") {
  # Crear un dataframe combinado con las 2 ciudades
  combined_data <- rbind(
    data.frame(Ciudad = city1_name, Categoria = city1_data[[variable]]),
    data.frame(Ciudad = city2_name, Categoria = city2_data[[variable]])
  )
  
  # Eliminar NA
  combined_data <- na.omit(combined_data)
  
  # Convertir la variable categórica en un factor
  combined_data$Categoria <- as.factor(combined_data$Categoria)
  
  # Crear el gráfico de barras
  plot <- ggplot(combined_data, aes(x = Ciudad, fill = Categoria)) +
    geom_bar(position = position) +
    labs(title = paste("Distribución de", variable, "entre", city1_name, "y", city2_name),
         y = "Frecuencia",
         x = "Ciudad") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
  
  # Mostrar el gráfico
  print(plot)
}

#Comparacion entre ciudades variable categorica PROPORCIONAL

compare_two_cities_categorical_proportions <- function(city1_data, city2_data, variable, city1_name = "Ciudad 1", city2_name = "Ciudad 2", position = "stack") {
  # Crear un dataframe combinado con las 2 ciudades
  combined_data <- rbind(
    data.frame(Ciudad = city1_name, Categoria = city1_data[[variable]]),
    data.frame(Ciudad = city2_name, Categoria = city2_data[[variable]])
  )
  
  # Eliminar NA
  combined_data <- na.omit(combined_data)
  
  # Convertir la variable categórica en un factor
  combined_data$Categoria <- as.factor(combined_data$Categoria)
  
  # Calcular proporciones
  proportion_data <- combined_data %>%
    group_by(Ciudad, Categoria) %>%
    summarise(Count = n(), .groups = 'drop') %>%
    group_by(Ciudad) %>%
    mutate(Proporcion = Count / sum(Count)) %>%
    ungroup()
  
  # Crear el gráfico de barras
  plot <- ggplot(proportion_data, aes(x = Ciudad, y = Proporcion, fill = Categoria)) +
    geom_bar(stat = "identity", position = position) +
    labs(title = paste("Distribución Proporcional de", variable, "entre", city1_name, "y", city2_name),
         y = "Proporción",
         x = "Ciudad") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
  
  # Mostrar el gráfico
  print(plot)
}

#Grafico comparando 2 ciudades variable numerica

compare_two_cities_violin <- function(city1_data, city2_data, variable, city1_name = "Ciudad 1", city2_name = "Ciudad 2") {
  # Crear un dataframe combinado con las 2 ciudades
  combined_data <- rbind(
    data.frame(Ciudad = city1_name, Valor = city1_data[[variable]]),
    data.frame(Ciudad = city2_name, Valor = city2_data[[variable]])
  )
  
  # Eliminar NA
  combined_data <- na.omit(combined_data)
  
  # Crear el gráfico de violín
  plot <- ggplot(combined_data, aes(x = Ciudad, y = Valor, fill = Ciudad)) +
    geom_violin(trim = FALSE, alpha = 0.5) +  # Gráfico de violín para mostrar la distribución
    geom_jitter(width = 0.2, alpha = 0.3) +   # Agrega puntos dispersos para ver datos individuales
    labs(title = paste("Distribución de", variable, "entre", city1_name, "y", city2_name),
         y = variable,
         x = "Ciudad") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
  
  # Mostrar el gráfico
  print(plot)
}

#Grafico de pastel por porcentaje

plot_pie_chart <- function(data, variable) {
  # Verificar que la base de datos no sea NULL y contenga la variable
  if (is.null(data) || !variable %in% names(data)) {
    stop("La base de datos es NULL o la variable no existe en la base de datos.")
  }
  
  # Asegurarse de que la variable categórica esté en formato factor y eliminar NA
  data <- data %>%
    filter(!is.na(.[[variable]]))
  
  data[[variable]] <- as.factor(data[[variable]])
  
  # Calcular la frecuencia de cada categoría
  category_counts <- data %>%
    group_by(Categoria = .[[variable]]) %>%
    summarise(Count = n(), .groups = 'drop') %>%
    mutate(Proporcion = Count / sum(Count),
           Porcentaje = Proporcion * 100)
  
  # Crear el gráfico de pastel
  plot <- ggplot(category_counts, aes(x = "", y = Proporcion, fill = Categoria)) +
    geom_bar(width = 1, stat = "identity") +
    coord_polar(theta = "y") +
    labs(title = paste("Distribución de", variable, "en la Ciudad"),
         y = "Proporción") +
    theme_void() +
    theme(legend.title = element_blank()) +
    geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
              position = position_stack(vjust = 0.5))
  
  # Mostrar el gráfico
  print(plot)
}

Función para graficar la distribución de una variable

grafica_distribucion <- function(data, variable) {
  # Asegurarse de que la variable existe en el dataframe
  if (!(variable %in% names(data))) {
    stop("La variable especificada no se encuentra en el dataframe.")
  }
  
  # Crear el gráfico
  plot <- ggplot(data, aes(x = !!sym(variable))) +
    geom_histogram(aes(y = ..density..), bins = 30, fill = "blue", color = "black", alpha = 0.7) +
    geom_density(color = "red", size = 1) +
    labs(title = paste("Distribución de", variable),
         x = variable,
         y = "Densidad") +
    theme_minimal()
  
  # Mostrar el gráfico
  print(plot)
}

Ejemplo de uso con una variable, por ejemplo “PUNT_GLOBAL”

grafica_distribucion(ciudades_datos, “PUNT_GLOBAL”)


#APLICACION FUNCIONES

#PUNTAJE GLOBAL

``` r
estadistica_numerica_boxplot(barranquilla_datos, "PUNT_GLOBAL")
## $Media
## [1] 248.7109
## 
## $Mediana
## [1] 245
## 
## $Varianza
## [1] 2927.063
## 
## $Desviacion
## [1] 54.10234
## 
## $Minimo
## [1] 80
## 
## $Maximo
## [1] 437
## 
## $Cuartiles
## 25% 50% 75% 
## 207 245 288 
## 
## $Percentiles
##     1%    99% 
## 148.00 371.24

grafica_distribucion(barranquilla_datos, "PUNT_GLOBAL")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

estadistica_numerica_boxplot(cartagena_datos, "PUNT_GLOBAL")
## $Media
## [1] 236.1468
## 
## $Mediana
## [1] 230
## 
## $Varianza
## [1] 2856.757
## 
## $Desviacion
## [1] 53.44863
## 
## $Minimo
## [1] 88
## 
## $Maximo
## [1] 475
## 
## $Cuartiles
## 25% 50% 75% 
## 195 230 273 
## 
## $Percentiles
##  1% 99% 
## 145 367

grafica_distribucion(cartagena_datos, "PUNT_GLOBAL")

compare_two_cities_violin(barranquilla_datos, cartagena_datos, "PUNT_GLOBAL", city1_name = "Barranquilla", city2_name = "Cartagena")

#INFORMACION VARIABLE CATEGORICA POR CIUDAD

estadistica_categorica_barr(barranquilla_datos, "FAMI_NUMLIBROS")
## $Total
## [1] 15721
## 
## $Moda
## [1] "0 A 10 LIBROS"
## 
## $Frequencies
## 
##     0 A 10 LIBROS    11 A 25 LIBROS   26 A 100 LIBROS MÁS DE 100 LIBROS 
##              6389              5135              3231               966

estadistica_categorica_barr(cartagena_datos, "FAMI_NUMLIBROS")
## $Total
## [1] 12136
## 
## $Moda
## [1] "0 A 10 LIBROS"
## 
## $Frequencies
## 
##     0 A 10 LIBROS    11 A 25 LIBROS   26 A 100 LIBROS MÁS DE 100 LIBROS 
##              5325              3864              2205               742

estadistica_categorica_barr(barranquilla_datos, "ESTU_DEDICACIONINTERNET")
## $Total
## [1] 16061
## 
## $Moda
## [1] "Entre 1 y 3 horas"
## 
## $Frequencies
## 
##    30 minutos o menos     Entre 1 y 3 horas Entre 30 y 60 minutos 
##                  2175                  5204                  4068 
##        Más de 3 horas    No Navega Internet 
##                  4105                   509

estadistica_categorica_barr(cartagena_datos, "ESTU_DEDICACIONINTERNET")
## $Total
## [1] 12353
## 
## $Moda
## [1] "Entre 1 y 3 horas"
## 
## $Frequencies
## 
##    30 minutos o menos     Entre 1 y 3 horas Entre 30 y 60 minutos 
##                  2014                  3903                  3175 
##        Más de 3 horas    No Navega Internet 
##                  2738                   523

estadistica_categorica_barr(barranquilla_datos, "ESTU_DEDICACIONLECTURADIARIA")
## $Total
## [1] 16093
## 
## $Moda
## [1] "30 minutos o menos"
## 
## $Frequencies
## 
##         30 minutos o menos          Entre 1 y 2 horas 
##                       5657                       1978 
##      Entre 30 y 60 minutos             Más de 2 horas 
##                       4482                       1058 
## No leo por entretenimiento 
##                       2918

estadistica_categorica_barr(cartagena_datos, "ESTU_DEDICACIONLECTURADIARIA")
## $Total
## [1] 12377
## 
## $Moda
## [1] "30 minutos o menos"
## 
## $Frequencies
## 
##         30 minutos o menos          Entre 1 y 2 horas 
##                       4531                       1529 
##      Entre 30 y 60 minutos             Más de 2 horas 
##                       3446                        714 
## No leo por entretenimiento 
##                       2157

plot_pie_chart(barranquilla_datos, "FAMI_TIENEINTERNET" )

plot_pie_chart(cartagena_datos, "FAMI_TIENEINTERNET" )

plot_pie_chart(barranquilla_datos, "FAMI_SITUACIONECONOMICA")

plot_pie_chart(cartagena_datos, "FAMI_SITUACIONECONOMICA")

#COMPARACIONES POR CIUDAD CON EL PUNTAJE GLOBAL

variablecategorica_vs_ptglobal(barranquilla_datos, "ESTU_DEDICACIONINTERNET")

variablecategorica_vs_ptglobal(cartagena_datos, "ESTU_DEDICACIONINTERNET")

variablecategorica_vs_ptglobal(barranquilla_datos, "ESTU_DEDICACIONLECTURADIARIA")

variablecategorica_vs_ptglobal(cartagena_datos, "ESTU_DEDICACIONLECTURADIARIA")

variablecategorica_vs_ptglobal(barranquilla_datos, "FAMI_ESTRATOVIVIENDA")

variablecategorica_vs_ptglobal(cartagena_datos, "FAMI_ESTRATOVIVIENDA")

#COMPARACIONES CATEGORICAS ENTRE CIUDADES

compare_two_cities_categorical(barranquilla_datos, cartagena_datos, "FAMI_ESTRATOVIVIENDA", city1_name = "Barranquilla", city2_name = "Cartagena", position = "stack")

compare_two_cities_categorical(barranquilla_datos, cartagena_datos, "FAMI_TIENEINTERNET", city1_name = "Barranquilla", city2_name = "Cartagena", position = "stack")

compare_two_cities_categorical(barranquilla_datos, cartagena_datos, "FAMI_SITUACIONECONOMICA", city1_name = "Barranquilla", city2_name = "Cartagena", position = "stack")

compare_two_cities_categorical(barranquilla_datos, cartagena_datos, "ESTU_DEDICACIONINTERNET", city1_name = "Barranquilla", city2_name = "Cartagena", position = "stack")

compare_two_cities_categorical(barranquilla_datos, cartagena_datos, "ESTU_DEDICACIONLECTURADIARIA", city1_name = "Barranquilla", city2_name = "Cartagena", position = "stack")


## R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:


``` r
summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00