UNIVERSIDAD AUTONÓMA DE NUEVO
LEÓN
FACULTAD DE CIENCIAS BIOLOGICAS
BIOESTADÍSTICA
CIUDAD UNIVERSITARIA, SAN NICOLÁS DE LOS GARZA, NUEVO LEÓN
07 DE SEPTIEMBRE DEL 2025
TAREA 1
# 1. COMENTARIOS: VARIABLES DE BASE_EJERCICIO_INTRO.XLSX (SIN INCLUIR Id)
# Estas son las variables presentes en el archivo original, despues de la limpieza:
#
# 1. edad: Variable numerica. Edad de los sujetos en anos.
# 2. sexo: Variable categorica (Factor). 'M' para masculino, 'F' para femenino.
# 3. peso: Variable numerica. Peso de los sujetos en kilogramos (kg).
# 4. altura: Variable numerica. Altura de los sujetos en centimetros (cm).
# 5. imc: Variable numerica. Indice de Masa Corporal (calculado).
# 6. fumador: Variable categorica (Factor). 'Si' o 'No' indica si la persona fuma.
# 7. presion_sis: Variable numerica. Presion Arterial Sistolica (mmHg).
# 8. glucosa: Variable numerica. Nivel de glucosa en ayunas (mg/dL).
# 9. actividad: Variable categorica (Factor). Nivel de actividad fisica reportado (e.g., 'Bajo',
'Medio', 'Alto').
# PRIMERA SECCION: INTRODUCCION A COMANDOS BASICOS (Datos diferentes al PDF)
# A. Operaciones Basicas y Objetos
# Comando para asignar un valor a una variable (objeto).
# Aqui almacenamos el numero de pacientes estudiados.
num_pacientes <- 75
# Comando para hacer una operacion matematica basica con el objeto.
# Calculamos el 10% del total de pacientes para proyectar el tamano de la muestra.
muestra_proyectada <- num_pacientes * 0.10
print(muestra_proyectada) # Imprime el resultado de la operacion.
# Asignar una cadena de texto a un objeto para identificar un estudio.
# Esto es util para etiquetar graficos o reportes.
nombre_estudio <- "Estudio de Metabolismo UFPS"
# B. Vectores (Colecciones de Datos)
# Crear un vector numerico con la edad de 5 pacientes diferentes a los del PDF.
# Usamos 'c()' para combinar los valores.
edades_muestra <- c(35, 42, 28, 61, 55)
# Crear un vector de caracteres (texto) para el grupo de tratamiento de esos 5 pacientes.
# Los nombres o strings siempre deben ir entre comillas.
grupo_tratamiento <- c("Dieta A", "Control", "Dieta B", "Dieta A", "Dieta B")
# Crear un vector logico (TRUE/FALSE) que indique si tuvieron efectos secundarios.
# TRUE es 'Si', FALSE es 'No'.
efectos_secundarios <- c(FALSE, FALSE, TRUE, FALSE, TRUE)
# Operaciones con vectores: Sumar 5 anos a todas las edades del vector (simulacion).
# R aplica la operacion a cada elemento del vector (vectorizacion).
edades_proyectadas <- edades_muestra + 5
print(edades_proyectadas)
# Extraer el segundo y cuarto elemento del vector de edades.
# Usamos corchetes '[ ]' para acceder a posiciones especificas.
edad_interes <- edades_muestra[c(2, 4)]
print(edad_interes)
# SEGUNDA SECCION: LEER DATOS DESDE UN ARCHIVO (Usando base_limpia.csv)
# Comando para leer un archivo CSV (formato de tabla separado por comas).
# header=TRUE indica que la primera fila del archivo contiene los nombres de las columnas.
# sep="," indica que el separador de columnas es una coma.
datos_bio <- [Link]("base_limpia.csv", header=TRUE, sep=",")
# Inspeccionar los datos: Muestra la estructura interna de los objetos (tipo de datos).
# Esto es fundamental para verificar que R ha leido correctamente las variables.
str(datos_bio) # Muestra si son 'num', 'int', o 'chr'.
# Inspeccionar los datos: Muestra las primeras 6 filas de la tabla de datos.
# Es un chequeo rapido para asegurar que los datos se cargaron como se esperaba.
head(datos_bio)
# TERCERA SECCION: MANIPULACION Y ANALISIS DE DATOS (Usando variables de base_limpia.csv)
# A. Subsets (Subconjuntos)
# Crear un subconjunto de datos que solo incluya a los sujetos que 'fuman' ('Si').
# Se usa el operador '==' para la condicion de igualdad.
fumadores_activos <- subset(datos_bio, fumador == "Si")
print(paste("Numero de fumadores activos:", nrow(fumadores_activos)))
# Crear un subconjunto de datos con sujetos mayores a 40 anos (edad > 40).
# Usamos el operador '>' (mayor que) para la condicion.
adultos_mayores <- subset(datos_bio, edad > 40)
print(paste("Numero de sujetos mayores de 40 anos:", nrow(adultos_mayores)))
### B. Tablas de Frecuencia
# Crear una tabla de frecuencias para la variable 'sexo'.
# La funcion 'table()' cuenta cuantas veces aparece cada categoria.
tabla_sexo <- table(datos_bio$sexo)
print("Tabla de frecuencias para la variable Sexo:")
print(tabla_sexo)
# Crear una tabla de frecuencias relativas (porcentajes) para 'actividad'.
# La funcion '[Link]()' convierte las frecuencias absolutas en proporciones.
# Multiplicamos por 100 para obtener el porcentaje.
tabla_actividad_relativa <- [Link](table(datos_bio$actividad)) * 100
print("Tabla de frecuencias relativas (%) para la variable Actividad:")
print(round(tabla_actividad_relativa, 2)) # Redondeamos a 2 decimales para mejor lectura
# C. Medidas Descriptivas
# Obtener un resumen estadistico (Minimo, Maximo, Mediana, Media, Cuartiles) de la variable
'glucosa'.
# Esto proporciona una vista rapida de la distribucion central y dispersion.
print("Resumen estadistico de la Glucosa:")
summary(datos_bio$glucosa)
# Calcular la media (promedio) de la Presion Arterial Sistolica ('presion_sis').
# Usamos el simbolo '$' para especificar una columna dentro del data frame.
media_presion <- mean(datos_bio$presion_sis)
print(paste("Media de la Presion Sistolica:", round(media_presion, 2), "mmHg"))
# Calcular la Desviacion Estandar (sd) del 'peso'.
# Esto indica la dispersion de los datos alrededor de la media.
desv_std_peso <- sd(datos_bio$peso)
print(paste("Desviacion Estandar del Peso:", round(desv_std_peso, 2), "kg"))
### D. Graficos
# Crear un histograma de la variable 'imc' (numerica) para ver su distribucion.
# El histograma muestra la forma de la distribucion de una variable continua.
hist(datos_bio$imc,
main = "Distribucion del Indice de Masa Corporal (IMC)",
xlab = "IMC (kg/m2)",
ylab = "Frecuencia de Sujetos",
col = "#a7c957", # Color verde claro para las barras
border = "white")
# Crear un diagrama de barras (barplot) para la variable categorica 'sexo'.
# El grafico de barras se usa para variables discretas o categoricas.
barplot(tabla_sexo,
main = "Frecuencia de Sujetos por Sexo",
xlab = "Sexo",
ylab = "Numero de Sujetos",
col = c("#538686", "#c38c8c")) # Colores distintos para M y F
TAREA 2
# 0. CONFIGURACION INICIAL Y CARGA DE DATOS
# 0.1 Cargar el archivo CSV de la base de datos limpia de la Tarea 1.
# El archivo debe estar delimitado por comas (sep=",") y tener encabezados (header=TRUE).
datos_bio <- [Link]("base_tarea_1_2025 (1).xlsx - [Link]", header = TRUE, sep = ",")
# 0.2 Inspeccionar la estructura de los datos para confirmar que se cargaron bien.
# Esto es vital para saber que variables son categoricas y cuales numericas.
str(datos_bio)
# 0.3 Inspeccionar las primeras filas.
head(datos_bio)
# SECCION I: VARIABLES CUALITATIVAS O CATEGORICAS
# Variable elegida para este ejemplo: FUMADOR (Categorica)
### 1. Tablas de Frecuencias (FUMADOR)
# 1.1 Frecuencias absolutas: Se usa table() para contar cuantas veces aparece cada categoria.
tabla_abs_fumador <- table(datos_bio$FUMADOR)
print("Tabla de Frecuencias Absolutas (FUMADOR):")
print(tabla_abs_fumador)
# 1.2 Frecuencias relativas (Proporciones): Se usa [Link]() sobre la tabla absoluta.
tabla_rel_fumador <- [Link](tabla_abs_fumador)
print("Tabla de Frecuencias Relativas (Proporciones):")
print(tabla_rel_fumador)
# 1.3 Frecuencias relativas porcentuales: Multiplicamos las relativas por 100 y redondeamos.
tabla_perc_fumador <- round(tabla_rel_fumador * 100, 2)
print("Tabla de Frecuencias Porcentuales (FUMADOR):")
print(tabla_perc_fumador)
# 2. Exportar Tablas (Requisito de la Tarea)
# 2.1 Crear un Data Frame final con las tres frecuencias para exportacion.
tabla_final_fumador <- [Link](
Categoria = names(tabla_abs_fumador), # Nombres de las categorias (e.g., 'Si', 'No')
Frecuencia_Absoluta = [Link](tabla_abs_fumador), # Frecuencias de conteo
Frecuencia_Relativa = tabla_rel_fumador, # Proporciones
Frecuencia_Porcentual = tabla_perc_fumador # Porcentajes
)
# 2.2 Exportar la tabla final como archivo CSV.
# [Link]=FALSE evita escribir los numeros de fila de R en el archivo.
[Link](tabla_final_fumador, "tabla_frecuencia_FUMADOR.csv", [Link] = FALSE)
# NOTA: Este archivo CSV se debe subir a Teams.
# 3. Grafico de Barras (Barplot)
# 3.1 Abrir el dispositivo grafico PNG para guardar la imagen.
# Guardamos el grafico con un nombre especifico y dimensiones adecuadas.
png(filename = "grafico_barras_FUMADOR.png", width = 800, height = 600)
# 3.2 Generar el grafico de barras: Muestra la distribucion de las categorias.
barplot(tabla_abs_fumador,
main = "Frecuencia Absoluta de Habito Fumador", # Titulo del grafico
xlab = "Habito de Fumar", # Etiqueta del eje X
ylab = "Numero de Sujetos (Frecuencia Absoluta)",# Etiqueta del eje Y
col = c("#538686", "#c38c8c"), # Colores para las barras (uno por categoria)
border = "black") # Borde de las barras
# 3.3 Cerrar el dispositivo grafico (!CRUCIAL para guardar el archivo!).
[Link]()
# 4. Grafico Circular (Pie Chart)
# 4.1 Abrir el dispositivo grafico JPEG para guardar la imagen.
jpeg(filename = "grafico_circular_FUMADOR.jpeg", width = 800, height = 600)
# 4.2 Crear etiquetas con los porcentajes para el grafico circular.
etiquetas_pie <- paste(names(tabla_perc_fumador), " (", tabla_perc_fumador, "%)", sep="")
# 4.3 Generar el grafico circular: Util para mostrar la proporcion de un total.
pie(tabla_abs_fumador,
labels = etiquetas_pie, # Usamos las etiquetas con porcentaje
main = "Distribucion Porcentual del Habito Fumador",
col = c("gold", "lightgreen")) # Colores para las porciones
# 4.4 Cerrar el dispositivo grafico.
[Link]()
# SECCION II: VARIABLES CUANTITATIVAS O NUMERICAS
# Variable elegida para este ejemplo: IMC (Indice de Masa Corporal - Numerica Continua)
### 1. Histograma
# 1.1 Abrir el dispositivo grafico TIFF para guardar la imagen.
tiff(filename = "histograma_IMC.tiff", width = 800, height = 600)
# 1.2 Generar el histograma: Muestra la distribucion y forma de la variable continua.
hist(datos_bio$IMC,
main = "Distribucion del Indice de Masa Corporal (IMC)", # Titulo
xlab = "IMC (kg/m2)", # Etiqueta del eje X
ylab = "Frecuencia de Casos", # Etiqueta del eje Y
col = "#90ee90", # Color verde claro para las barras
border = "darkgreen", # Borde de las barras
breaks = 10) # Definir el numero de 'cajas' o 'bins' para la agrupacion
# 1.3 Cerrar el dispositivo grafico.
[Link]()
### 2. Diagrama de Cajas y Bigotes (Boxplot)
# 2.1 Abrir el dispositivo grafico PNG para guardar la imagen.
png(filename = "boxplot_IMC_por_SEXO.png", width = 800, height = 600)
# 2.2 Generar el Boxplot: Muestra la mediana, cuartiles, dispersion y valores atipicos.
# Aqui comparamos la distribucion del IMC en funcion de la variable categorica SEXO.
boxplot(datos_bio$IMC ~ datos_bio$SEXO,
main = "Diagrama de Cajas del IMC por Sexo", # Titulo
xlab = "Sexo", # Etiqueta del eje X (variable categorica)
ylab = "Indice de Masa Corporal (IMC)", # Etiqueta del eje Y (variable numerica)
col = c("lightblue", "pink"), # Colores para las cajas
border = "darkblue")
# 2.3 Cerrar el dispositivo grafico.
[Link]()
TAREA 3
> library(readxl)
> base_tarea_1_2025_1_ <- read_excel("base_tarea_1_2025 (1).xlsx",
+ sheet = "Hoja1")
> View(base_tarea_1_2025_1_)
>
>
> # 1. CARGA DE LIBRERÍAS
> # library(readxl) # Ya ejecutada
> # [Link]("e1071") # Si no está instalada, descomentar y correr.
> library(e1071) # Necesario para asimetría y curtosis.
>
> # 2. ASIGNACIÓN DE DATOS Y CORRECCIÓN DE NOMBRES
> # Usamos el data frame que se cargó correctamente (base_tarea_1_2025_1_)
> datos_analisis <- base_tarea_1_2025_1_
>
> # 2.1 Verificar que los nombres de las columnas sean correctos y asignarlos a variables simples.
> Estatura_var <- datos_analisis$Estatura
> Prom_fcb_var <- datos_analisis$Prom_fcb
> Tipo_sangre_var <- datos_analisis$Tipo_sangre
>
> # 2.2 Función para calcular la Moda
> get_mode <- function(v) {
+ uniqv <- unique(v)
+ uniqv[[Link](tabulate(match(v, uniqv)))]
+}
>
>
>
> # PARTE A: ANÁLISIS DE LA VARIABLE ESTATURA
>
>
> cat("\n--- RESULTADOS PARA ESTATURA ---\n")
--- RESULTADOS PARA ESTATURA ---
>
> # 3.1 Medidas de Tendencia Central y Posición
> media_est <- mean(Estatura_var)
> mediana_est <- median(Estatura_var)
> cuartiles_est <- quantile(Estatura_var, probs = c(0.25, 0.50, 0.75))
> moda_est <- get_mode(Estatura_var)
>
> cat("Media Aritmética: ", round(media_est, 3), "\n")
Media Aritmética: 1.65
> cat("Mediana: ", round(mediana_est, 3), "\n")
Mediana: 1.65
> cat("Moda: ", moda_est, "\n")
Moda: 1.6
> cat("Cuartiles (25%, 50%, 75%):\n")
Cuartiles (25%, 50%, 75%):
> print(round(cuartiles_est, 3))
25% 50% 75%
1.58 1.65 1.72
>
> ### 3.2 Medidas de Dispersión
> varianza_est <- var(Estatura_var)
> de_est <- sd(Estatura_var)
> cv_est <- (de_est / media_est) * 100
> ri_est <- IQR(Estatura_var)
>
> cat("Varianza: ", round(varianza_est, 5), "\n")
Varianza: 0.0087
> cat("Desviación Estándar (DE): ", round(de_est, 3), "\n")
Desviación Estándar (DE): 0.093
> cat("Coeficiente de Variación (CV): ", round(cv_est, 3), "%\n")
Coeficiente de Variación (CV): 5.653 %
> cat("Rango Intercuartílico (RI): ", round(ri_est, 3), "\n")
Rango Intercuartílico (RI): 0.14
>
> ### 3.3 Medidas de Forma
> asimetria_est <- skewness(Estatura_var)
> curtosis_est <- kurtosis(Estatura_var)
>
> cat("Asimetría (Skewness): ", round(asimetria_est, 3), "\n")
Asimetría (Skewness): 0.103
> cat("Curtosis (Kurtosis de Exceso): ", round(curtosis_est, 3), "\n")
Curtosis (Kurtosis de Exceso): -0.467
>
>
> # 3.4 Percentil 60%
> percentil_60_est <- quantile(Estatura_var, probs = 0.60)
> cat("\nPercentil 60%: ", round(percentil_60_est, 3), "\n")
Percentil 60%: 1.68
> cat("Interp. P60: El 60% de los sujetos tiene una estatura igual o menor a ",
+ round(percentil_60_est, 3), "m.\n")
Interp. P60: El 60% de los sujetos tiene una estatura igual o menor a 1.68 m.
>
> # 3.5 Valores Atípicos
> boxplot(Estatura_var,
+ main = "Boxplot de la Estatura",
+ ylab = "Estatura (m)",
+ col = "#8c9fb6",
+ border = "darkblue")
>
>
> [Image of a box plot in R for the variable 'Estatura', showing the median, quartiles, and any
potential outlier points outside the whiskers.]
Error: unexpected '[' in "["
> # 1. CARGA DE LIBRERÍAS
> # library(readxl) # Ya ejecutada
> # [Link]("e1071") # Si no está instalada, descomentar y correr.
> library(e1071) # Necesario para asimetría y curtosis.
> # 2. ASIGNACIÓN DE DATOS Y CORRECCIÓN DE NOMBRES
> # Usamos el data frame que se cargó correctamente (base_tarea_1_2025_1_)
> datos_analisis <- base_tarea_1_2025_1_
> # 2.1 Verificar que los nombres de las columnas sean correctos y asignarlos a variables simples.
> Estatura_var <- datos_analisis$Estatura
> Prom_fcb_var <- datos_analisis$Prom_fcb
> Tipo_sangre_var <- datos_analisis$Tipo_sangre
> # 2.2 Función para calcular la Moda
> get_mode <- function(v) {
+ uniqv <- unique(v)
+ uniqv[[Link](tabulate(match(v, uniqv)))]
+ }
> cat("\n--- RESULTADOS PARA ESTATURA ---\n")
--- RESULTADOS PARA ESTATURA ---
> # 3.1 Medidas de Tendencia Central y Posición
> media_est <- mean(Estatura_var)
> mediana_est <- median(Estatura_var)
> cuartiles_est <- quantile(Estatura_var, probs = c(0.25, 0.50, 0.75))
> moda_est <- get_mode(Estatura_var)
> cat("Media Aritmética: ", round(media_est, 3), "\n")
Media Aritmética: 1.65
> cat("Mediana: ", round(mediana_est, 3), "\n")
Mediana: 1.65
> cat("Moda: ", moda_est, "\n")
Moda: 1.6
> cat("Cuartiles (25%, 50%, 75%):\n")
Cuartiles (25%, 50%, 75%):
> print(round(cuartiles_est, 3))
25% 50% 75%
1.58 1.65 1.72
> ### 3.2 Medidas de Dispersión
> varianza_est <- var(Estatura_var)
> de_est <- sd(Estatura_var)
> cv_est <- (de_est / media_est) * 100
> ri_est <- IQR(Estatura_var)
> cat("Varianza: ", round(varianza_est, 5), "\n")
Varianza: 0.0087
> cat("Desviación Estándar (DE): ", round(de_est, 3), "\n")
Desviación Estándar (DE): 0.093
> cat("Coeficiente de Variación (CV): ", round(cv_est, 3), "%\n")
Coeficiente de Variación (CV): 5.653 %
> cat("Rango Intercuartílico (RI): ", round(ri_est, 3), "\n")
Rango Intercuartílico (RI): 0.14
> ### 3.3 Medidas de Forma
> asimetria_est <- skewness(Estatura_var)
> curtosis_est <- kurtosis(Estatura_var)
> cat("Asimetría (Skewness): ", round(asimetria_est, 3), "\n")
Asimetría (Skewness): 0.103
> cat("Curtosis (Kurtosis de Exceso): ", round(curtosis_est, 3), "\n")
Curtosis (Kurtosis de Exceso): -0.467
> # 3.4 Percentil 60%
> percentil_60_est <- quantile(Estatura_var, probs = 0.60)
> cat("\nPercentil 60%: ", round(percentil_60_est, 3), "\n")
Percentil 60%: 1.68
> cat("Interp. P60: El 60% de los sujetos tiene una estatura igual o menor a ",
+ round(percentil_60_est, 3), "m.\n")
Interp. P60: El 60% de los sujetos tiene una estatura igual o menor a 1.68 m.
> # 3.5 Valores Atípicos
> boxplot(Estatura_var,
+ main = "Boxplot de la Estatura",
+ ylab = "Estatura (m)",
+ col = "#8c9fb6",
+ border = "darkblue")
> [Image of a box plot in R for the variable 'Estatura', showing the median, quartiles, and any
potential outlier points outside the whiskers.]
Error: unexpected '[' in "["
> Q1_est <- cuartiles_est["25%"]
> Q3_est <- cuartiles_est["75%"]
> LI_est <- Q1_est - 1.5 * ri_est
> LS_est <- Q3_est + 1.5 * ri_est
> outliers_est <- Estatura_var[Estatura_var < LI_est | Estatura_var > LS_est]
> [Image of a box plot in R for the variable 'Estatura', showing the median, quartiles, and any
potential outlier points outside the whiskers.]
Error: unexpected '[' in "["
> Q1_est <- cuartiles_est["25%"]
> Q3_est <- cuartiles_est["75%"]
> LI_est <- Q1_est - 1.5 * ri_est
> LS_est <- Q3_est + 1.5 * ri_est
> outliers_est <- Estatura_var[Estatura_var < LI_est | Estatura_var > LS_est]
> if (length(outliers_est) > 0) {
+ cat("\nLa variable Estatura SÍ tiene valores atípicos (Outliers): ", round(outliers_est, 3), "\n")
+ } else {
+ cat("\nLa variable Estatura NO tiene valores atípicos.\n")
+}
La variable Estatura NO tiene valores atípicos.
> # 3.6 Análisis de Asimetría y Curtosis
> cat("\n--- Análisis de Forma (Estatura) ---\n")
--- Análisis de Forma (Estatura) ---
> # Asimetría:
> if (abs(asimetria_est) < 0.2) {
+ asimetria_desc <- "Prácticamente Simétrica."
+ } else if (asimetria_est > 0) {
+ asimetria_desc <- "Asimetría Positiva (sesgo a la derecha)."
+ } else {
+ asimetria_desc <- "Asimetría Negativa (sesgo a la izquierda)."
+}
> cat("Asimetría (", round(asimetria_est, 3), "): ", asimetria_desc, "\n")
Asimetría ( 0.103 ): Prácticamente Simétrica.
> # Curtosis:
> if (curtosis_est > 0) {
+ curtosis_desc <- "Leptocúrtica (más picuda que la normal, curtosis > 0)."
+ } else if (curtosis_est < 0) {
+ curtosis_desc <- "Platicúrtica (más aplanada que la normal, curtosis < 0)."
+ } else {
+ curtosis_desc <- "Mesocúrtica (similar a la normal, curtosis ≈ 0)."
+}
> cat("Curtosis (", round(curtosis_est, 3), "): ", curtosis_desc, "\n")
Curtosis ( -0.467 ): Platicúrtica (más aplanada que la normal, curtosis < 0).
> # Gráfico para Asimetría y Curtosis (Histograma)
> hist(Estatura_var,
+ main = "Histograma de Estatura con Curva Normal",
+ xlab = "Estatura (m)",
+ freq = FALSE,
+ col = "#e0ffff",
+ border = "black")
> lines(density(Estatura_var), col = "red", lwd = 2)
> curve(dnorm(x, mean = media_est, sd = de_est),
+ col = "blue", lwd = 2, add = TRUE)
> legend("topright",
+ legend = c("Densidad Real", "Distribución Normal"),
+ col = c("red", "blue"), lty = 1, lwd = 2)
> cat("\n\n--- RESULTADOS PARA PROMEDIO DE CALIFICACIÓN (Prom_fcb) ---\n")
--- RESULTADOS PARA PROMEDIO DE CALIFICACIÓN (Prom_fcb) ---
> # 4.1 Medidas de Tendencia Central y Posición
> media_prom <- mean(Prom_fcb_var)
> mediana_prom <- median(Prom_fcb_var)
> cuartiles_prom <- quantile(Prom_fcb_var, probs = c(0.25, 0.50, 0.75))
> moda_prom <- get_mode(Prom_fcb_var)
> cat("Media Aritmética: ", round(media_prom, 3), "\n")
Media Aritmética: 85.842
> cat("Mediana: ", round(mediana_prom, 3), "\n")
Mediana: 85.6
> cat("Moda: ", moda_prom, "\n")
Moda: 80
> cat("Cuartiles (25%, 50%, 75%):\n")
Cuartiles (25%, 50%, 75%):
> print(round(cuartiles_prom, 3))
25% 50% 75%
81.00 85.60 89.75
> # 4.2 Medidas de Dispersión
> varianza_prom <- var(Prom_fcb_var)
> de_prom <- sd(Prom_fcb_var)
> cv_prom <- (de_prom / media_prom) * 100
> ri_prom <- IQR(Prom_fcb_var)
> cat("Varianza: ", round(varianza_prom, 3), "\n")
Varianza: 38.556
> cat("Desviación Estándar (DE): ", round(de_prom, 3), "\n")
Desviación Estándar (DE): 6.209
> cat("Coeficiente de Variación (CV): ", round(cv_prom, 3), "%\n")
Coeficiente de Variación (CV): 7.233 %
> cat("Rango Intercuartílico (RI): ", round(ri_prom, 3), "\n")
Rango Intercuartílico (RI): 8.75
> # 4.3 Medidas de Forma
> asimetria_prom <- skewness(Prom_fcb_var)
> curtosis_prom <- kurtosis(Prom_fcb_var)
> cat("Asimetría (Skewness): ", round(asimetria_prom, 3), "\n")
Asimetría (Skewness): -0.1
> cat("Curtosis (Kurtosis de Exceso): ", round(curtosis_prom, 3), "\n")
Curtosis (Kurtosis de Exceso): -0.358
> # 4.4 Percentil 75%
> percentil_75_prom <- quantile(Prom_fcb_var, probs = 0.75)
> cat("\nPercentil 75% (Q3): ", round(percentil_75_prom, 3), "\n")
Percentil 75% (Q3): 89.75
> cat("Interp. P75: El 75% de los sujetos tiene un promedio de calificación igual o menor a ",
+ round(percentil_75_prom, 3), ".\n")
Interp. P75: El 75% de los sujetos tiene un promedio de calificación igual o menor a 89.75 .
> # 4.5 Valores Atípicos
> boxplot(Prom_fcb_var,
+ main = "Boxplot de Promedio de Calificación",
+ ylab = "Promedio",
+ col = "#f08080",
+ border = "darkred")
> Q1_prom <- cuartiles_prom["25%"]
> Q3_prom <- cuartiles_prom["75%"]
> LI_prom <- Q1_prom - 1.5 * ri_prom
> LS_prom <- Q3_prom + 1.5 * ri_prom
> outliers_prom <- Prom_fcb_var[Prom_fcb_var < LI_prom | Prom_fcb_var > LS_prom]
> if (length(outliers_prom) > 0) {
+ cat("\nLa variable Promedio de Calificación SÍ tiene valores atípicos (Outliers): ",
round(outliers_prom, 3), "\n")
+ } else {
+ cat("\nLa variable Promedio de Calificación NO tiene valores atípicos.\n")
+}
La variable Promedio de Calificación NO tiene valores atípicos.
> # 4.6 Análisis de Asimetría y Curtosis
> cat("\n--- Análisis de Forma (Prom_fcb) ---\n")
--- Análisis de Forma (Prom_fcb) ---
> # Asimetría:
> if (abs(asimetria_prom) < 0.2) {
+ asimetria_desc_prom <- "Prácticamente Simétrica."
+ } else if (asimetria_prom > 0) {
+ asimetria_desc_prom <- "Asimetría Positiva (sesgo a la derecha)."
+ } else {
+ asimetria_desc_prom <- "Asimetría Negativa (sesgo a la izquierda)."
+}
> cat("Asimetría (", round(asimetria_prom, 3), "): ", asimetria_desc_prom, "\n")
Asimetría ( -0.1 ): Prácticamente Simétrica.
> # Curtosis:
> if (curtosis_prom > 0) {
+ curtosis_desc_prom <- "Leptocúrtica (más picuda que la normal, curtosis > 0)."
+ } else if (curtosis_prom < 0) {
+ curtosis_desc_prom <- "Platicúrtica (más aplanada que la normal, curtosis < 0)."
+ } else {
+ curtosis_desc_prom <- "Mesocúrtica (similar a la normal, curtosis ≈ 0)."
+}
> cat("Curtosis (", round(curtosis_prom, 3), "): ", curtosis_desc_prom, "\n")
Curtosis ( -0.358 ): Platicúrtica (más aplanada que la normal, curtosis < 0).
> # Gráfico para Asimetría y Curtosis (Histograma)
> hist(Prom_fcb_var,
+ main = "Histograma de Promedio de Calificación con Curva Normal",
+ xlab = "Promedio de Calificación",
+ freq = FALSE,
+ col = "#fffacd",
+ border = "black")
> lines(density(Prom_fcb_var), col = "red", lwd = 2)
> curve(dnorm(x, mean = media_prom, sd = de_prom),
+ col = "blue", lwd = 2, add = TRUE)
> legend("topleft",
+ legend = c("Densidad Real", "Distribución Normal"),
+ col = c("red", "blue"), lty = 1, lwd = 2)
> cat("\n\n--- PARTE C: COMPARACIÓN Y RESUMEN ---\n")
--- PARTE C: COMPARACIÓN Y RESUMEN ---
> # 5. ¿Cuál de las dos variables muestra mayor variación?
> cv_est <- round(cv_est, 3)
> cv_prom <- round(cv_prom, 3)
> cat("\nCoeficiente de Variación (CV) - Mide la variación relativa:\n")
Coeficiente de Variación (CV) - Mide la variación relativa:
> cat("CV Estatura: ", cv_est, "%\n")
CV Estatura: 5.653 %
> cat("CV Promedio de Calificación: ", cv_prom, "%\n")
CV Promedio de Calificación: 7.233 %
> if (cv_est > cv_prom) {
+ cat("Respuesta: La variable ESTATURA (", cv_est, "%) muestra MAYOR variación relativa que
Prom_fcb (", cv_prom, "%).\n")
+ } else if (cv_prom > cv_est) {
+ cat("Respuesta: La variable PROMEDIO DE CALIFICACIÓN (", cv_prom, "%) muestra MAYOR
variación relativa que Estatura (", cv_est, "%).\n")
+ } else {
+ cat("Respuesta: Ambas variables muestran una variación similar.\n")
+}
Respuesta: La variable PROMEDIO DE CALIFICACIÓN ( 7.233 %) muestra MAYOR variación relativa
que Estatura ( 5.653 %).
> # 6. Selección de Estadísticos Básicos para Descripción
> cat("\nSelección de Estadísticos Descriptivos (Media/DE vs. Mediana/RI):\n")
Selección de Estadísticos Descriptivos (Media/DE vs. Mediana/RI):
> # Estatura
> cat("Estatura (Asimetría:", round(asimetria_est, 3), ", Atípicos:", length(outliers_est), "):\n")
Estatura (Asimetría: 0.103 , Atípicos: 0 ):
> # Criterio: Si es simétrica y sin atípicos, usar Media y DE. De lo contrario, Mediana y RI.
> if (abs(asimetria_est) < 0.2 && length(outliers_est) == 0) {
+ cat(" Media y DE. Justificación: Distribución **simétrica** y **sin atípicos**; la Media representa
bien el centro.\n")
+ } else {
+ cat(" Mediana y RI. Justificación: La presencia de **asimetría** (o atípicos) hace que la Mediana
y el RI sean estimadores **más robustos**.\n")
+}
Media y DE. Justificación: Distribución **simétrica** y **sin atípicos**; la Media representa bien el
centro.
> # Prom_fcb
> cat("Prom_fcb (Asimetría:", round(asimetria_prom, 3), ", Atípicos:", length(outliers_prom),
"):\n")
Prom_fcb (Asimetría: -0.1 , Atípicos: 0 ):
> # 6. Selección de Estadísticos Básicos para Descripción
> cat("\nSelección de Estadísticos Descriptivos (Media/DE vs. Mediana/RI):\n")
Selección de Estadísticos Descriptivos (Media/DE vs. Mediana/RI):
> # Estatura
> cat("Estatura (Asimetría:", round(asimetria_est, 3), ", Atípicos:", length(outliers_est), "):\n")
Estatura (Asimetría: 0.103 , Atípicos: 0 ):
> # Criterio: Si es simétrica y sin atípicos, usar Media y DE. De lo contrario, Mediana y RI.
> if (abs(asimetria_est) < 0.2 && length(outliers_est) == 0) {
+ cat(" Media y DE. Justificación: Distribución **simétrica** y **sin atípicos**; la Media representa
bien el centro.\n")
+ } else {
+ cat(" Mediana y RI. Justificación: La presencia de **asimetría** (o atípicos) hace que la Mediana
y el RI sean estimadores **más robustos**.\n")
+}
Media y DE. Justificación: Distribución **simétrica** y **sin atípicos**; la Media representa bien el
centro.
> # Prom_fcb
> cat("Prom_fcb (Asimetría:", round(asimetria_prom, 3), ", Atípicos:", length(outliers_prom),
"):\n")
Prom_fcb (Asimetría: -0.1 , Atípicos: 0 ):
> if (abs(asimetria_prom) < 0.2 && length(outliers_prom) == 0) {
+ cat(" Media y DE. Justificación: Distribución **simétrica** y **sin atípicos**; la Media representa
bien el centro.\n")
+ } else {
+ cat(" Mediana y RI. Justificación: La presencia de **asimetría** (o atípicos) hace que la Mediana
y el RI sean estimadores **más robustos**.\n")
+}
Media y DE. Justificación: Distribución **simétrica** y **sin atípicos**; la Media representa bien el
centro.
> cat("\n\n--- PARTE D: ANÁLISIS DE TIPO DE SANGRE ---\n")
--- PARTE D: ANÁLISIS DE TIPO DE SANGRE ---
> # Frecuencias Absolutas (conteo):
> tabla_abs_sangre <- table(Tipo_sangre_var)
> cat("Tabla de Frecuencias Absolutas (Tipo de Sangre):\n")
Tabla de Frecuencias Absolutas (Tipo de Sangre):
> print(tabla_abs_sangre)
Tipo_sangre_var
A- A+ AB AB+ B- B+ NA O- o+ O+
2 14 1 4 1 7 1 11 2 42
> # Frecuencias Relativas (proporciones):
> tabla_prop_sangre <- [Link](tabla_abs_sangre)
> cat("\nTabla de Proporciones (Tipo de Sangre):\n")
Tabla de Proporciones (Tipo de Sangre):
> print(round(tabla_prop_sangre * 100, 2)) # Mostramos en porcentaje.
Tipo_sangre_var
A- A+ AB AB+ B- B+ NA O- o+ O+
2.35 16.47 1.18 4.71 1.18 8.24 1.18 12.94 2.35 49.41
> # 8. Gráfico (Gráfico de Barras)
> # El gráfico de barras es el indicado para variables categóricas.
> barplot(tabla_abs_sangre,
+ main = "Frecuencia de Tipos de Sangre",
+ xlab = "Tipo de Sangre",
+ ylab = "Frecuencia Absoluta",
+ col = c("#ADD8E6", "#FFB6C1", "#90EE90", "#F08080", "#E6E6FA"),
+ border = "black")