Estadística y Probabilidad 1
Universidad de la Sabana
read.csv(“C:/Users/TU_USUARIO/Desktop/Historico_calificaciones.csv”, sep=“;”)
Objetivo y Alcance
Objetivo
Aplicar las herramientas de análisis descriptivo vistas en clase
Alcance: Este cuaderno busca combinar la teoría de manera general con ejercicios prácticos que permitan el entendimiento de herramientas de descripción de datos
2+2
## [1] 4
Importación de librerías y funciones útiles
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.1.6
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ 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
##
## Adjuntando el paquete: 'gridExtra'
##
## The following object is masked from 'package:dplyr':
##
## combine
options(pillar.width = Inf)
# 📌 Función para calcular estadísticas descriptivas útiles
calcular_estadisticas <- function(data, grupo, variable){
data %>%
group_by(!!sym(grupo)) %>%
summarise(
MEAN = mean(.data[[variable]]),
MEDIAN = median(.data[[variable]]),
SD = sd(.data[[variable]]),
VAR = var(.data[[variable]]),
CV = (SD / MEAN) * 100,
MIN = min(.data[[variable]]),
P25 = quantile(.data[[variable]], 0.25),
P75 = quantile(.data[[variable]], 0.75),
MAX = max(.data[[variable]])
) %>%
ungroup()
}
# 📌 Función para generar Boxplots e Histogramas con Densidad
generar_graficos <- function(data, grupo, variables) {
plots <- list() # Lista para almacenar los gráficos
for (var in variables) {
# 📊 Boxplot
boxplot <- ggplot(data, aes(x = .data[[grupo]], y = .data[[var]], fill = .data[[grupo]])) +
geom_boxplot() +
labs(title = paste("Boxplot de", var, "por", grupo), x = grupo, y = var) +
theme_minimal()
# 📊 Histograma con Densidad
histograma <- ggplot(data, aes(x = .data[[var]], fill = .data[[grupo]], color = .data[[grupo]])) +
geom_histogram(aes(y = ..density..), alpha = 0.5, position = "identity", bins = 30) + # Histograma normalizado
geom_density(alpha = 0.7) + # Línea de densidad
labs(title = paste("Histograma y Densidad de", var, "por", grupo), x = var, y = "Densidad") +
theme_minimal()
# 📌 Guardar gráficos en la lista
plots[[paste0("boxplot_", var)]] <- boxplot
plots[[paste0("histograma_", var)]] <- histograma
}
# 📌 Mostrar los gráficos en una cuadrícula (2 columnas)
grid.arrange(grobs = plots, ncol = 2)
}Herramientas de estadística descriptiva
Utilice los datos del histórico de calificaciones del profesor Jorge Garcia, para responder las siguientes preguntas:
Punto 0
Importe la tabla “Historico_calificaciones.csv” que contiene la información de las calificaciones de los estudiantes que han visto alguna materia con el docente.
# Importe acá los datos
Historico_calificaciones <- read.csv("Historico_calificaciones.csv", sep=";")
head(Historico_calificaciones)## ESTUDIANTE GRUPO CARRERA GENERO CALIF_FINAL
## 1 1 A INGENIERIA INFORMATICA M 3.8
## 2 2 A ADMINISTRACION DE EMPRESAS M 4.1
## 3 3 A INGENIERIA INFORMATICA M 3.5
## 4 4 A ADMINISTRACION DE EMPRESAS M 2.5
## 5 5 A ADMON DE MERCADEO Y LOGIST INT F 2.0
## 6 6 A INGENIERIA INFORMATICA M 4.0
Punto 1
Clasifique las variables de la tabla según su tipo y escala.
- ESTUDIANTE: Cuantitativa discreta
- GRUPO: Cualitativa nominal
- CARRERA: Cualitativa nominal
- GENERO: Cualitativa nominal
- CALIF_FINAL: Cuantitativa continua
Punto 2
Calcule estadísticos de centralidad, localización y dispersión, con el fin de realizar un completo análisis para todos los estudiantes que han visto clase con el profesor. ¿Cómo considera el desempeño de los estudiantes en estos cursos, teniendo en cuenta las estadísticas encontradas? Análisis Punto 2 La calificación final presenta una media de 3.5984 y una mediana de 3.8, lo que sugiere un desempeño general bueno/moderado, con la mediana ligeramente superior a la media (posible influencia de algunos valores bajos). En términos de localización, el 50% de las calificaciones se concentra entre Q1 = 3.2 y Q3 = 4.175 (IQR = 0.975), indicando que la mayoría de estudiantes se ubica en un rango relativamente estable. La dispersión es moderada, con desviación estándar de 0.8341 y coeficiente de variación de 23.18%. Sin embargo, el mínimo es 0.0 y el máximo 5.0, lo que evidencia presencia de casos extremos (muy bajos) que pueden afectar el promedio. En general, el desempeño es favorable, aunque conviene revisar los casos con calificaciones muy bajas.
# Asegurar que CALIF_FINAL sea numérica (por si llega como texto)
Historico_calificaciones$CALIF_FINAL <- as.numeric(Historico_calificaciones$CALIF_FINAL)
# Estadísticos: centralidad, localización y dispersión
resumen_general <- Historico_calificaciones %>%
summarise(
n = n(),
media = mean(CALIF_FINAL, na.rm = TRUE),
mediana = median(CALIF_FINAL, na.rm = TRUE),
min = min(CALIF_FINAL, na.rm = TRUE),
q1 = quantile(CALIF_FINAL, 0.25, na.rm = TRUE),
q2 = quantile(CALIF_FINAL, 0.50, na.rm = TRUE),
q3 = quantile(CALIF_FINAL, 0.75, na.rm = TRUE),
max = max(CALIF_FINAL, na.rm = TRUE),
rango = max - min,
varianza = var(CALIF_FINAL, na.rm = TRUE),
desviacion_estandar = sd(CALIF_FINAL, na.rm = TRUE),
iqr = IQR(CALIF_FINAL, na.rm = TRUE),
cv_porcentaje = (sd(CALIF_FINAL, na.rm = TRUE) / mean(CALIF_FINAL, na.rm = TRUE)) * 100
)
resumen_general## n media mediana min q1 q2 q3 max rango varianza desviacion_estandar
## 1 250 3.5984 3.8 0 3.2 3.8 4.175 5 5 0.6956601 0.8340624
## iqr cv_porcentaje
## 1 0.975 23.1787
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.200 3.800 3.598 4.175 5.000
Punto 3
Grafique un boxplot y un histograma para las calificaciones de todos los estudiantes y análicelo apropiadamente Análisis Punto 3 Observando el histograma en forma general se ve que la distribución tiene una forma asimétrica. La mayoría de las barras se concentran en la parte derecha del gráfico (calificaciones altas), con una cola que se extiende hacia la izquierda (calificaciones bajas). La mayor frecuencia de estudiantes se encuentra en los intervalos de 3.5 a 4.0 y 4.0 a 4.5, con aproximadamente 45-50 estudiantes en cada uno de estos rangos. Esto indica que la mayoría de los estudiantes obtiene calificaciones entre 3.5 y 4.5. Ahora en cuanto a los rangos de calificación están estos, esto guiándose por la grafica: Calificaciones muy bajas (0.0 a 1.0): aproximadamente 5 estudiantes. Calificaciones bajas (1.0 a 2.0): aproximadamente 10 estudiantes. Calificaciones medio-bajas (2.0 a 3.0): aproximadamente 20 estudiantes. Calificaciones medio-altas (3.0 a 4.0): aproximadamente 90 estudiantes. Calificaciones altas (4.0 a 5.0): aproximadamente 60 estudiantes. Por ultimo , se observan frecuencias muy bajas en los extremos izquierdos (0.0 a 1.0), lo que coincide con los outliers identificados en el boxplot.
#Punto 3
boxplot <- ggplot(Historico_calificaciones, aes(y = CALIF_FINAL)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Boxplot de Calificaciones Finales",
y = "Calificación Final") +
theme_minimal()
histograma <- ggplot(Historico_calificaciones, aes(x = CALIF_FINAL)) +
geom_histogram(bins = 15, fill = "lightgreen", color = "black") +
labs(title = "Histograma de Calificaciones Finales",
x = "Calificación Final",
y = "Frecuencia") +
theme_minimal()
# Mostrar ambos juntos
grid.arrange(boxplot, histograma, ncol = 2)Punto 4
Calcule las mismas estadísticas diferenciando por la variable Grupo. Existe alguna diferencia en las calificaciones a través de los diferentes Grupos? Que tan consistentes son las calificaciones para los 4 grupos? Respuestas Punto 4 Existen diferencias en las calificaciones claras, el mejor rendimiento se obtuvo en los grupos F y G con media = 3.93, el peor rendimiento fue el grupo A con media = 3.32 y la diferencia entre estos fue de 0.61 puntos ,una brecha enorme en la escala de 0 a 5.Esto significa que el grupo al que pertenece un estudiante sí influye en su nota final. No es lo mismo estar en el Grupo F que en el Grupo A. Las calificaciónes concistentes fueron (CV < 16%):El grupo F con (13.3%), grupo C con (14.6%) y grupo D con (15.1%) (estos los consideramos homogéneos). Despues (CV 16-25%):Esta el grupo E con (17.3%), grupo H con (17.3%), grupo G con (21.4%), grupo B con (22.2%) y grupo A con (23.3%) (En estos hay variedad, pero dentro de lo esperable). Por ultimo (CV > 40%):Esta el grupo I con (45.7%) Este se nos hace preocupante por ser tan alto en porcentaje pues en este grupo hay estudiantes con 0.0 y otros con 5.0.
#Punto 4
#Estadísticas por grupo:
resumen_grupo <- Historico_calificaciones %>%
group_by(GRUPO) %>%
summarise(
n = n(),
media = mean(CALIF_FINAL, na.rm = TRUE),
mediana = median(CALIF_FINAL, na.rm = TRUE),
min = min(CALIF_FINAL, na.rm = TRUE),
q1 = quantile(CALIF_FINAL, 0.25, na.rm = TRUE),
q3 = quantile(CALIF_FINAL, 0.75, na.rm = TRUE),
max = max(CALIF_FINAL, na.rm = TRUE),
varianza = var(CALIF_FINAL, na.rm = TRUE),
desviacion_estandar = sd(CALIF_FINAL, na.rm = TRUE),
cv_porcentaje = (sd(CALIF_FINAL, na.rm = TRUE) / mean(CALIF_FINAL, na.rm = TRUE)) * 100
)
resumen_grupo## # A tibble: 9 × 11
## GRUPO n media mediana min q1 q3 max varianza desviacion_estandar
## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 A 32 3.32 3.4 1.7 2.7 3.85 4.6 0.596 0.772
## 2 B 31 3.40 3.4 1.2 3 3.85 5 0.573 0.757
## 3 C 32 3.74 3.8 2.5 3.4 4.12 4.9 0.297 0.545
## 4 D 28 3.69 3.55 2.7 3.3 4.12 4.9 0.309 0.556
## 5 E 16 3.68 3.85 1.9 3.38 4.03 4.3 0.404 0.636
## 6 F 30 3.93 3.95 3 3.6 4.2 5 0.272 0.522
## 7 G 23 3.93 4.2 1.1 3.95 4.4 4.8 0.706 0.840
## 8 H 28 3.47 3.3 2.6 2.9 3.92 4.5 0.359 0.599
## 9 I 30 3.35 3.8 0 2.47 4.57 5 2.34 1.53
## cv_porcentaje
## <dbl>
## 1 23.3
## 2 22.2
## 3 14.6
## 4 15.1
## 5 17.3
## 6 13.3
## 7 21.4
## 8 17.3
## 9 45.7
Punto 5
Realice boxplots e histogramas para la calificación final del estudiante, diferenciado por el Grupo y realice un análisis apropiado ANALISIS PUNTO 5: A partir de los boxplots se identifican contrastes en los valores centrales y en la amplitud de las calificaciones entre los diferentes grupos. Mientras algunos grupos alcanzan promedios más altos, otros presentan una mayor dispersión en sus notas, lo que refleja diferencias en el comportamiento académico. Por su parte, el histograma muestra que la mayoría de las calificaciones se agrupa en el intervalo aproximado entre 3.0 y 4.5; sin embargo, la distribución no es idéntica para todos los grupos. Esto sugiere que el desempeño académico varía según el grupo, tanto en términos de promedio como de estabilidad de los resultados.
#Punto 5
estadisticas_grupo <- calcular_estadisticas(Historico_calificaciones, "GRUPO", "CALIF_FINAL")
estadisticas_grupo## # A tibble: 9 × 10
## GRUPO MEAN MEDIAN SD VAR CV MIN P25 P75 MAX
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 A 3.32 3.4 0.772 0.596 23.3 1.7 2.7 3.85 4.6
## 2 B 3.40 3.4 0.757 0.573 22.2 1.2 3 3.85 5
## 3 C 3.74 3.8 0.545 0.297 14.6 2.5 3.4 4.12 4.9
## 4 D 3.69 3.55 0.556 0.309 15.1 2.7 3.3 4.12 4.9
## 5 E 3.68 3.85 0.636 0.404 17.3 1.9 3.38 4.03 4.3
## 6 F 3.93 3.95 0.522 0.272 13.3 3 3.6 4.2 5
## 7 G 3.93 4.2 0.840 0.706 21.4 1.1 3.95 4.4 4.8
## 8 H 3.47 3.3 0.599 0.359 17.3 2.6 2.9 3.92 4.5
## 9 I 3.35 3.8 1.53 2.34 45.7 0 2.47 4.57 5
# Boxplots e histogramas por GRUPO
generar_graficos(Historico_calificaciones, "GRUPO", c("CALIF_FINAL"))## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Punto 6
Calcule las mismas estadísticas diferenciando por la variable Genero. Existe alguna diferencia en las calificaciones a través de los diferentes géneros? Que tan consistentes son las calificaciones en este caso? Respuestas PUNTO 6: Al analizar las calificaciones finales según el género, se evidencia que los valores promedio de hombres y mujeres son prácticamente equivalentes, lo que sugiere que no hay diferencias relevantes en el desempeño académico atribuibles al género. Asimismo, la variabilidad de las notas es similar en ambos grupos, indicando un nivel comparable de consistencia en los resultados. En términos generales, el desempeño académico de los estudiantes no muestra dependencia del género.
#Punto 6
estadisticas_genero <- calcular_estadisticas(Historico_calificaciones, "GENERO", "CALIF_FINAL")
estadisticas_genero## # A tibble: 2 × 10
## GENERO MEAN MEDIAN SD VAR CV MIN P25 P75 MAX
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 F 3.59 3.7 0.934 0.872 26.0 0.5 3.1 4.3 5
## 2 M 3.60 3.8 0.785 0.616 21.8 0 3.2 4.1 5
# Boxplots e histogramas por GÉNERO
generar_graficos(Historico_calificaciones, "GENERO", c("CALIF_FINAL"))Punto 7
Realice boxplots e histogramas para la calificación final del estudiante, diferenciado por el Genero y realice un análisis apropiado Punto 7 Analisis:El histograma muestra que la mayoría de las calificaciones de hombres y mujeres se ubican entre 3.0 y 4.5, con una distribución aproximadamente normal. Los hombres presentan una media y mediana ligeramente superiores (≈3.8) frente a las mujeres (≈3.6–3.7), además de una mayor concentración entre 3.5 y 4.2. Las mujeres evidencian mayor dispersión en sus resultados. El boxplot confirma que la variabilidad es mayor en mujeres (IQR más amplio), mientras que los hombres tienen notas más concentradas alrededor del promedio. Ambos grupos presentan algunos valores atípicos bajos, pero en general las diferencias no parecen visualmente significativas.
## 'data.frame': 250 obs. of 5 variables:
## $ ESTUDIANTE : int 1 2 3 4 5 6 7 8 9 10 ...
## $ GRUPO : chr "A" "A" "A" "A" ...
## $ CARRERA : chr "INGENIERIA INFORMATICA" "ADMINISTRACION DE EMPRESAS" "INGENIERIA INFORMATICA" "ADMINISTRACION DE EMPRESAS" ...
## $ GENERO : chr "M" "M" "M" "M" ...
## $ CALIF_FINAL: num 3.8 4.1 3.5 2.5 2 4 2.6 4 2.5 3.4 ...
# Convertir a numérico ANTES de usar ggplot
datos$CALIF_FINAL <- as.numeric(datos$CALIF_FINAL)
# Verificar
str(datos)## 'data.frame': 250 obs. of 5 variables:
## $ ESTUDIANTE : int 1 2 3 4 5 6 7 8 9 10 ...
## $ GRUPO : chr "A" "A" "A" "A" ...
## $ CARRERA : chr "INGENIERIA INFORMATICA" "ADMINISTRACION DE EMPRESAS" "INGENIERIA INFORMATICA" "ADMINISTRACION DE EMPRESAS" ...
## $ GENERO : chr "M" "M" "M" "M" ...
## $ CALIF_FINAL: num 3.8 4.1 3.5 2.5 2 4 2.6 4 2.5 3.4 ...
# Histograma
ggplot(datos, aes(x = CALIF_FINAL, fill = GENERO)) +
geom_histogram(alpha = 0.6, position = "identity", bins = 10) +
theme_minimal()# Boxplot
ggplot(datos, aes(x = GENERO, y = CALIF_FINAL, fill = GENERO)) +
geom_boxplot() +
theme_minimal()Punto 8
Calcule tablas de frecuencia para las variables de Calificaciones (utilizando \(k=5\)) y de género usando la función que se encuentra a continuación:
tablaFrecuencias <- function(x, k = NULL, incluirExtremos = TRUE) {
# Validación inicial de datos
if (is.null(x)) {
stop("El vector de datos no puede estar vacío")
}
# Determinar si la variable es numérica o categórica
if (is.numeric(x)) {
# Manejo de variables numéricas
if (is.null(k)) {
k <- min(ceiling(sqrt(length(x))), 10) # Regla de Sturges simplificada
}
# Crear intervalos
cortes <- cut(x, breaks = k, right = FALSE, include.lowest = incluirExtremos)
limites <- seq(min(x), max(x), length.out = length(unique(cortes)) + 1)
# Calcular marca de clase
marcaClase <- (limites[1:(length(limites)-1)] + limites[2:length(limites)]) / 2
# Calcular frecuencias
intervalos <- levels(cortes)
frecAbsoluta <- as.vector(table(cortes))
frecRelativa <- round(frecAbsoluta / length(x), 4)
frecAcumulada <- cumsum(frecAbsoluta)
frecRelAcumulada <- cumsum(frecRelativa)
# Crear tabla de resultados
tabla <- data.frame(
Intervalo = intervalos,
MarcaClase = marcaClase,
FrecuenciaAbsoluta = frecAbsoluta,
FrecuenciaRelativa = frecRelativa,
FrecuenciaAcumulada = frecAcumulada,
FrecuenciaRelAcumulada = frecRelAcumulada
)
} else {
# Manejo de variables categóricas
frecAbsoluta <- table(x)
frecRelativa <- round(prop.table(frecAbsoluta), 4)
frecAcumulada <- cumsum(frecAbsoluta)
frecRelAcumulada <- cumsum(frecRelativa)
# Crear tabla de resultados
tabla <- data.frame(
Categoria = names(frecAbsoluta),
FrecuenciaAbsoluta = as.vector(frecAbsoluta),
FrecuenciaRelativa = as.vector(frecRelativa),
FrecuenciaAcumulada = frecAcumulada,
FrecuenciaRelAcumulada = frecRelAcumulada
)
}
return(tabla)
}
# Ejemplos de uso:
# Para datos numéricos:
#datos_num <- c(1, 2, 2, 3, 3, 3, 4, 4, 5)
#tablaFrecuencias(datos_num, k = 5)
# Para datos categóricos:
#datos_cat <- factor(c("A", "B", "B", "C", "C", "C"))
#tablaFrecuencias(datos_cat)¿Qué puede analizar de estas tablas de frecuencia? Punto 8: Análisis tabla frecuencias Calificaciones: Al usar k=5, verás rangos (ej. [1.5, 2.2), [2.2, 2.9), etc.). Si la Frecuencia Absoluta es mayor en los rangos superiores a 3.0, el curso va por buen camino. Género: En tus datos hay una presencia mayoritaria de hombres (M). Es importante notar esto porque los resultados del promedio general están más influenciados por el desempeño masculino debido al tamaño de la muestra.
Punto 9
¿Qué conclusiones podría dar a cerca del desempeño de los estudiantes que han visto el curso con el profesor? Conclusiones: 1.El promedio de las notas tiende a estar por encima de 3.0, lo que indica un rendimiento satisfactorio en general. Sin embargo, existe una dispersión considerable (notas desde 1.5 hasta 5.0). 2.No parece haber una brecha de género significativa en el rendimiento, lo que habla bien de la equidad en el proceso de evaluación del profesor Garcia. 3.La mayoría de los estudiantes se encuentran en el rango intermedio-alto, pero hay un grupo pequeño que está quedando atrás con notas inferiores a 2.5.
¿Qué recomendaciones le daría tanto a los estudiantes como al docente? Recomendaciones: Al Docente: Dado que hay una dispersión notable, el deberia implementar tutorías de refuerzo para el grupo que se encuentra en los dos primeros intervalos de la tabla de frecuencias. A los Estudiantes: Aquellos en carreras de Ingeniería deberían formar grupos de estudio con otras carreras, aprovechando que las notas más altas están distribuidas en diferentes facultades.