DISTRIBUCIONES DE FRECUENCIAS

TALLER

Autor/a
Afiliación

Maria Alejandra Lasso Reyes
Angie Tatiana Giraldo Lozano
Paula Natalia Vera Agudelo

Fecha de publicación

5 de abril de 2026

Logo Universidad del Tolima

1 .Cargar paquetes

Ver código
ipak <- function(pkg){
  
  # Definir repositorio CRAN (evita el error del mirror)
  options(repos = c(CRAN = "https://cloud.r-project.org"))
  
  # Identificar paquetes instalados
  installed <- rownames(installed.packages())
  
  # Identificar paquetes faltantes
  new.pkg <- setdiff(pkg, installed)
  
  # Instalar paquetes faltantes
  if(length(new.pkg) > 0){
    install.packages(new.pkg, dependencies = TRUE)
  }
  
  # Cargar paquetes sin mostrar mensajes
  invisible(lapply(pkg, function(p){
    suppressPackageStartupMessages(
      library(p, character.only = TRUE)
    )
  }))
}

# Crear la lista de los paquetes a utilizar
packages <- c("tidyverse", "kableExtra", "psych", "readxl")

# Instalar y cargar los paquetes del listado anterior
ipak(packages)

2 .Introducción

Distribución de Frecuencias

Concepto

Una distribución de frecuencias es una herramienta estadística, generalmente una tabla o gráfico, que organiza un conjunto de datos mostrando cómo se distribuyen según sus frecuencias (número de veces que ocurre cada valor). Facilita la interpretación de datos al resumir información, ya sea de forma agrupada (intervalos) o no agrupada

Formalmente, si se tiene un conjunto de datos:

X={x_1, x_2, x_3, \dots , x_n}

la distribución de frecuencias permite identificar cuántas veces aparece cada valor o intervalo dentro del conjunto de datos.

Las distribuciones de frecuencias se utilizan para:

  • Resumir grandes volúmenes de datos
  • Identificar patrones en los datos
  • Facilitar la construcción de gráficos estadísticos
  • Calcular medidas estadísticas (media, varianza, etc.)

Elementos de una Distribución de Frecuencias

Una tabla de distribución de frecuencias generalmente contiene los siguientes elementos:

Elemento Descripción
Clase o categoría Valores o intervalos de la variable
Frecuencia absoluta Número de veces que aparece un valor
Frecuencia relativa Proporción del total
Frecuencia acumulada Suma progresiva de frecuencias
Marca de clase Punto medio del intervalo

Frecuencia Absoluta

La frecuencia absoluta indica cuántas veces aparece un valor o categoría en el conjunto de datos.

Se denota por: f_i

donde:

    1. representa la categoría o clase
  • (f_i) es el número de observaciones en esa categoría

La suma de todas las frecuencias absolutas es igual al tamaño de la muestra:

\sum_{i=1}^{k} f_i = n

donde:

    1. = número de clases
    1. = número total de observaciones

Frecuencia Relativa

La frecuencia relativa representa la proporción de datos que pertenecen a una categoría.

h_i = \frac{f_i}{n}

donde:

  • (h_i) = frecuencia relativa
  • (f_i) = frecuencia absoluta
  • (n) = total de observaciones

La suma de todas las frecuencias relativas es:

\sum_{i=1}^{k} h_i = 1

Si se expresa en porcentaje:

h_{i}(\%) = \frac{f_{i}}{n} \times 100

Frecuencia Acumulada

La frecuencia acumulada corresponde a la suma progresiva de las frecuencias absolutas hasta una clase determinada.

F_i = \sum_{j=1}^{i} f_j

Propiedades:

F_k = n

La frecuencia acumulada permite responder preguntas como:

  • ¿Cuántos datos son menores o iguales que cierto valor?

Frecuencia Relativa Acumulada

La frecuencia relativa acumulada se obtiene acumulando las frecuencias relativas:

H_i = \sum_{j=1}^{i} h_j

También puede calcularse como:

H_i = \frac{F_i}{n}

Propiedad:

H_k = 1

Distribución de Frecuencias para Datos Agrupados

Cuando el conjunto de datos es grande, se agrupan en intervalos o clases.

Un intervalo se define como:

(L_i, L_s)

donde:

  • (Li) = límite inferior
  • (Ls) = límite superior

Número de Clases (Regla de Sturges)

Para determinar el número adecuado de clases se usa frecuentemente la regla de Sturges:

k = 1 + 3.322 \log\_{10}(n)

donde:

    1. = número de clases
    1. = tamaño de la muestra

Amplitud de Clase

La amplitud de clase es el tamaño de cada intervalo.

A = \frac{R}{k}

donde:

    1. = rango de los datos
    1. = número de clases

El rango se calcula como:

R = X\_{max} - X\_{min}

Marca de Clase

La marca de clase es el punto medio del intervalo y se utiliza para cálculos estadísticos.

x_i = \frac{L_i + L_s}{2}

Representaciones Gráficas

A partir de una distribución de frecuencias se pueden construir:

  • Histograma
  • Polígono de frecuencias
  • Ojiva (frecuencia acumulada)
  • Gráfico de barras
  • Gráfico circular

Estas representaciones permiten visualizar la estructura de los datos y su distribución.

3 .Bajar dataset

Base de datos DEPORTES

4 .Leer del dataset

Ver código
Deporte <- read_excel("deporte.xlsx")

5 .Conocer el dataset

  • Mostrar algunas filas del dataset
Ver código
head(Deporte)
# A tibble: 6 × 13
  GENERO   DEPORTE ESCOLARIDAD DESEMPEÑO PRACTICAS  EDAD  PESO LESIONES ESTATURA
  <chr>    <chr>   <chr>       <chr>         <dbl> <dbl> <dbl>    <dbl>    <dbl>
1 Masculi… Fútbol  Posgrado    Medio             5    44    56        2      180
2 Masculi… Voleib… Pregrado    Medio             5    59    66        1      152
3 Femenino Gimnas… Posgrado    Alto              4    27    57        2      157
4 Masculi… Nataci… Secundaria  Alto              3    44    54        3      167
5 Femenino Nataci… Posgrado    Medio             4    59    73        0      189
6 Masculi… Nataci… Pregrado    Bajo              2    58    59        1      188
# ℹ 4 more variables: BORG <dbl>, EVA <dbl>, CINTURA <dbl>, CADERA <dbl>
  • Número de variables
Ver código
Deporte %>% names %>% length()
[1] 13
  • Nombre de las variables
Ver código
names(Deporte)
 [1] "GENERO"      "DEPORTE"     "ESCOLARIDAD" "DESEMPEÑO"   "PRACTICAS"  
 [6] "EDAD"        "PESO"        "LESIONES"    "ESTATURA"    "BORG"       
[11] "EVA"         "CINTURA"     "CADERA"     
  • Estructura de las variables
Ver código
glimpse(Deporte)
Rows: 200
Columns: 13
$ GENERO      <chr> "Masculino", "Masculino", "Femenino", "Masculino", "Femeni…
$ DEPORTE     <chr> "Fútbol", "Voleibol", "Gimnasia", "Natación", "Natación", …
$ ESCOLARIDAD <chr> "Posgrado", "Pregrado", "Posgrado", "Secundaria", "Posgrad…
$ DESEMPEÑO   <chr> "Medio", "Medio", "Alto", "Alto", "Medio", "Bajo", "Bajo",…
$ PRACTICAS   <dbl> 5, 5, 4, 3, 4, 2, 4, 5, 6, 1, 7, 3, 2, 7, 5, 2, 4, 2, 7, 5…
$ EDAD        <dbl> 44, 59, 27, 44, 59, 58, 21, 40, 54, 46, 35, 54, 38, 38, 53…
$ PESO        <dbl> 56, 66, 57, 54, 73, 59, 69, 55, 65, 69, 56, 53, 54, 80, 59…
$ LESIONES    <dbl> 2, 1, 2, 3, 0, 1, 0, 0, 0, 3, 2, 2, 0, 2, 2, 1, 3, 0, 1, 1…
$ ESTATURA    <dbl> 180, 152, 157, 167, 189, 188, 169, 185, 166, 155, 150, 187…
$ BORG        <dbl> 5, 3, 2, 6, 1, 7, 10, 5, 9, 6, 7, 10, 8, 0, 1, 0, 9, 3, 7,…
$ EVA         <dbl> 0, 4, 2, 4, 2, 2, 4, 2, 2, 4, 1, 0, 4, 1, 1, 3, 0, 5, 5, 4…
$ CINTURA     <dbl> 120, 139, 143, 120, 74, 143, 116, 97, 74, 93, 122, 71, 112…
$ CADERA      <dbl> 88, 94, 90, 99, 94, 89, 95, 95, 92, 95, 87, 109, 102, 88, …
  • Transformar las variables

Las variables de la base de datos se clasifican y transforman según su naturaleza estadística.

5.1 Variables cualitativas nominales

Son variables categóricas sin orden entre sus categorías.

Ver código
# GENERO
Deporte$GENERO <- factor(Deporte$GENERO,
                          levels = c("Femenino", "Masculino"))

# DEPORTE
Deporte$DEPORTE <- factor(Deporte$DEPORTE,
                           levels = c("Atletismo", "Baloncesto", "Fútbol",
                                      "Gimnasia", "Natación", "Tenis", "Voleibol"))

5.2 Variables cualitativas ordinales

Son variables categóricas con orden entre sus categorías.

Ver código
# ESCOLARIDAD (de menor a mayor nivel educativo)
Deporte$ESCOLARIDAD <- factor(Deporte$ESCOLARIDAD,
                               levels  = c("Primaria", "Secundaria",
                                           "Pregrado", "Posgrado"),
                               ordered = TRUE)

# DESEMPEÑO (de menor a mayor nivel)
Deporte$DESEMPEÑO <- factor(Deporte$DESEMPEÑO,
                             levels  = c("Bajo", "Medio", "Alto"),
                             ordered = TRUE)

5.3 Variable cuantitativa discreta

Toma valores enteros y contables.

Ver código
# PRACTICAS
Deporte$PRACTICAS <- as.integer(Deporte$PRACTICAS)

# LESIONES
Deporte$LESIONES <- as.integer(Deporte$LESIONES)

# BORG
Deporte$BORG <- as.integer(Deporte$BORG)

# EVA
Deporte$EVA <- as.integer(Deporte$EVA)

5.4 Variables cuantitativas continuas

  • Pueden tomar cualquier valor dentro de un rango.
Ver código
Deporte$EDAD     <- as.numeric(Deporte$EDAD)
Deporte$PESO     <- as.numeric(Deporte$PESO)
Deporte$ESTATURA <- as.numeric(Deporte$ESTATURA)
Deporte$CINTURA  <- as.numeric(Deporte$CINTURA)
Deporte$CADERA   <- as.numeric(Deporte$CADERA)
  • Verificación de las transformaciones
Ver código
str(Deporte)
tibble [200 × 13] (S3: tbl_df/tbl/data.frame)
 $ GENERO     : Factor w/ 2 levels "Femenino","Masculino": 2 2 1 2 1 2 1 2 2 2 ...
 $ DEPORTE    : Factor w/ 7 levels "Atletismo","Baloncesto",..: 3 7 4 5 5 5 1 5 5 2 ...
 $ ESCOLARIDAD: Ord.factor w/ 4 levels "Primaria"<"Secundaria"<..: 4 3 4 2 4 3 3 3 2 3 ...
 $ DESEMPEÑO  : Ord.factor w/ 3 levels "Bajo"<"Medio"<..: 2 2 3 3 2 1 1 1 2 2 ...
 $ PRACTICAS  : int [1:200] 5 5 4 3 4 2 4 5 6 1 ...
 $ EDAD       : num [1:200] 44 59 27 44 59 58 21 40 54 46 ...
 $ PESO       : num [1:200] 56 66 57 54 73 59 69 55 65 69 ...
 $ LESIONES   : int [1:200] 2 1 2 3 0 1 0 0 0 3 ...
 $ ESTATURA   : num [1:200] 180 152 157 167 189 188 169 185 166 155 ...
 $ BORG       : int [1:200] 5 3 2 6 1 7 10 5 9 6 ...
 $ EVA        : int [1:200] 0 4 2 4 2 2 4 2 2 4 ...
 $ CINTURA    : num [1:200] 120 139 143 120 74 143 116 97 74 93 ...
 $ CADERA     : num [1:200] 88 94 90 99 94 89 95 95 92 95 ...
Ver código
summary(Deporte)
       GENERO          DEPORTE       ESCOLARIDAD DESEMPEÑO    PRACTICAS   
 Femenino : 93   Atletismo :25   Primaria  :44   Bajo :67   Min.   :1.00  
 Masculino:107   Baloncesto:36   Secundaria:47   Medio:61   1st Qu.:2.00  
                 Fútbol    :31   Pregrado  :53   Alto :72   Median :4.00  
                 Gimnasia  :26   Posgrado  :56              Mean   :4.15  
                 Natación  :32                              3rd Qu.:6.00  
                 Tenis     :22                              Max.   :7.00  
                 Voleibol  :28                                            
      EDAD            PESO          LESIONES        ESTATURA    
 Min.   :18.00   Min.   :48.00   Min.   :0.000   Min.   :150.0  
 1st Qu.:30.00   1st Qu.:57.00   1st Qu.:0.000   1st Qu.:159.0  
 Median :40.00   Median :63.00   Median :2.000   Median :168.5  
 Mean   :39.95   Mean   :64.04   Mean   :1.445   Mean   :168.6  
 3rd Qu.:49.25   3rd Qu.:71.00   3rd Qu.:2.000   3rd Qu.:178.2  
 Max.   :60.00   Max.   :80.00   Max.   :3.000   Max.   :190.0  
                                                                
      BORG             EVA          CINTURA          CADERA      
 Min.   : 0.000   Min.   :0.00   Min.   : 70.0   Min.   : 85.00  
 1st Qu.: 3.000   1st Qu.:1.00   1st Qu.: 94.0   1st Qu.: 91.00  
 Median : 5.000   Median :2.00   Median :113.0   Median : 96.00  
 Mean   : 5.175   Mean   :2.53   Mean   :111.4   Mean   : 96.53  
 3rd Qu.: 8.000   3rd Qu.:4.00   3rd Qu.:131.0   3rd Qu.:102.00  
 Max.   :10.000   Max.   :5.00   Max.   :150.0   Max.   :110.00  
                                                                 
  • Nueva estructura de las variables
Ver código
glimpse(Deporte)
Rows: 200
Columns: 13
$ GENERO      <fct> Masculino, Masculino, Femenino, Masculino, Femenino, Mascu…
$ DEPORTE     <fct> Fútbol, Voleibol, Gimnasia, Natación, Natación, Natación, …
$ ESCOLARIDAD <ord> Posgrado, Pregrado, Posgrado, Secundaria, Posgrado, Pregra…
$ DESEMPEÑO   <ord> Medio, Medio, Alto, Alto, Medio, Bajo, Bajo, Bajo, Medio, …
$ PRACTICAS   <int> 5, 5, 4, 3, 4, 2, 4, 5, 6, 1, 7, 3, 2, 7, 5, 2, 4, 2, 7, 5…
$ EDAD        <dbl> 44, 59, 27, 44, 59, 58, 21, 40, 54, 46, 35, 54, 38, 38, 53…
$ PESO        <dbl> 56, 66, 57, 54, 73, 59, 69, 55, 65, 69, 56, 53, 54, 80, 59…
$ LESIONES    <int> 2, 1, 2, 3, 0, 1, 0, 0, 0, 3, 2, 2, 0, 2, 2, 1, 3, 0, 1, 1…
$ ESTATURA    <dbl> 180, 152, 157, 167, 189, 188, 169, 185, 166, 155, 150, 187…
$ BORG        <int> 5, 3, 2, 6, 1, 7, 10, 5, 9, 6, 7, 10, 8, 0, 1, 0, 9, 3, 7,…
$ EVA         <int> 0, 4, 2, 4, 2, 2, 4, 2, 2, 4, 1, 0, 4, 1, 1, 3, 0, 5, 5, 4…
$ CINTURA     <dbl> 120, 139, 143, 120, 74, 143, 116, 97, 74, 93, 122, 71, 112…
$ CADERA      <dbl> 88, 94, 90, 99, 94, 89, 95, 95, 92, 95, 87, 109, 102, 88, …

6 .Tablas y gráficas

6.1 .Variable nominal

Tabla No 1: Análisis de frecuencias del género en los deportistas encuestados

Ver código
# Crear la tabla original
tabla <- tibble(GENERO = Deporte$GENERO) %>% 
  group_by(GENERO) %>% 
  summarise(fi = n()) %>%
  mutate(
    hi = round(fi/sum(fi), 4), 
    Porcentaje = paste0(hi*100, "%"),)

# Convertir las columnas a character para evitar conflictos
tabla <- tabla %>% mutate(
  GENERO = as.character(GENERO))

# Añadir la fila de totales
totales <- tibble(
  GENERO = "Total",
  fi = sum(tabla$fi),
  hi = round(sum(tabla$hi), 4),
  Porcentaje = paste0(round(sum(tabla$hi) * 100, 2), "%"))

# Combinar la tabla con los totales
tabla_final <- bind_rows(tabla, totales)

# Mostrar la tabla final con kable
tabla_final %>% 
  knitr::kable(
    col.names = c("genero", "$f_i$", "$h_i$", "Porcentaje"), 
    align = c("l", "c", "c", "c"))
genero f_i h_i Porcentaje
Femenino 93 0.465 46.5%
Masculino 107 0.535 53.5%
Total 200 1.000 100%
Ver código
# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
library(readxl)


# Calcular los porcentajes de cada categoría en la variable Género
GENERO_counts <- Deporte %>%
  dplyr::count(GENERO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras
ggplot(GENERO_counts, aes(x = GENERO, y = porcentaje, fill = GENERO)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribución porcentual del género", 
       x = "Género", 
       y = "Porcentaje") +
  theme_minimal() +
  theme(legend.position = "none") +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            vjust = -0.5, 
            color = "black", 
            size = 3.5)

Ver código
# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
library(readxl)



# Calcular los porcentajes de cada categoría en la variable Género
GENERO_counts <- Deporte %>%
  dplyr::count(GENERO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama circular
ggplot(GENERO_counts, aes(x = "", y = porcentaje, fill = GENERO)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  labs(title = "Distribución porcentual del género") +
  theme_minimal() +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        panel.grid = element_blank(),
        axis.text.x = element_blank()) +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            position = position_stack(vjust = 0.5), 
            color = "white", 
            size = 4)

La muestra está compuesta por 200 deportistas, de los cuales 107 (53.5%) son hombres y 93 (46.5%) son mujeres.

Se observa una ligera predominancia del género masculino en la muestra, con una diferencia de 7 puntos porcentuales respecto al femenino. Sin embargo, la distribución es relativamente equilibrada, lo que permite considerar que ambos géneros están adecuadamente representados en el estudio.

La composición de la muestra presenta una participación casi equitativa entre hombres y mujeres, aunque con una leve mayoría masculina. Esta distribución favorece el análisis comparativo por género y aporta validez en términos de representatividad para estudios relacionados con población deportiva.


6.2 .Variable Ordinal

Distribución de frecuencias de los encuestados según su nivel de escolaridad

Ver código
tabla <- tibble(ESCOLARIDAD = Deporte$ESCOLARIDAD) %>% 
  group_by(ESCOLARIDAD) %>% 
  summarise(fi = n()) %>%
  mutate(
    hi = round(fi/sum(fi), 4), 
    Porcentaje = paste0(hi*100, "%"),
    Fi = cumsum(fi),
    Hi = cumsum(hi)
  )

# Convertir las columnas Funcion, Fi, y Hi a character para evitar conflictos
tabla <- tabla %>% mutate(
  ESCOLARIDAD = as.character(ESCOLARIDAD),
  Fi = as.character(Fi),
  Hi = as.character(Hi)
)

# Añadir la fila de totales, dejando Fi y Hi vacíos
totales <- tibble(
  ESCOLARIDAD = "Total",
  fi = sum(tabla$fi),
  hi = round(sum(tabla$hi), 4),
  Porcentaje = paste0(round(sum(tabla$hi) * 100, 2), "%"),
  Fi = "",  # Puedes dejar en blanco o usar un valor numérico
  Hi = ""   # Puedes dejar en blanco o usar un valor numérico
)

# Combinar la tabla con los totales
tabla_final <- bind_rows(tabla, totales)

# Mostrar la tabla final con kable
tabla_final %>% 
  knitr::kable(
    col.names = c("Escolaridad", "fi", "hi", "Porcentaje", "Fi", "Hi"), 
    align = c("l", "c", "c", "c", "c", "c")
  )
Escolaridad fi hi Porcentaje Fi Hi
Primaria 44 0.220 22% 44 0.22
Secundaria 47 0.235 23.5% 91 0.455
Pregrado 53 0.265 26.5% 144 0.72
Posgrado 56 0.280 28% 200 1
Total 200 1.000 100%
Ver código
# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
library(readxl)


# Calcular los porcentajes de cada categoría en la variable ESTADO
escolaridad_counts <- Deporte %>%
  dplyr::count(ESCOLARIDAD) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras
ggplot(escolaridad_counts, aes(x = ESCOLARIDAD, y = porcentaje, fill = ESCOLARIDAD)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribución porcentual del nivel de escolaridad", 
       x = "Escolaridad", 
       y = "Porcentaje") +
  theme_minimal() +
  theme(legend.position = "none") +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            vjust = -0.5, 
            color = "black", 
            size = 3.5)

La distribución del nivel de escolaridad en la muestra de 200 deportistas muestra que el posgrado es el nivel más frecuente, con un 28% (n=56), seguido del pregrado (26.5%; n=53).

En menor proporción se encuentran los niveles de secundaria (23.5%; n=47) y primaria (22%; n=44), evidenciando una participación también significativa de deportistas con niveles educativos básicos.

Los datos reflejan una distribución progresiva y relativamente equilibrada entre los distintos niveles educativos, aunque con una ligera concentración en niveles superiores (pregrado y posgrado), que en conjunto representan el 54.5% de la muestra.

Asimismo, la frecuencia acumulada muestra que el 72% de los participantes cuenta al menos con estudios de pregrado, lo que sugiere un alto nivel educativo predominante dentro de la población analizada.

La muestra presenta una diversidad en los niveles de escolaridad, con predominio de formación superior. Este aspecto puede ser relevante al momento de analizar variables asociadas como el conocimiento sobre prevención de lesiones, adherencia a programas de entrenamiento o estilos de vida, aportando valor interpretativo a los resultados del estudio.

6.3 .Variable Discreta

Distribución de frecuencias de las lesiones presentadas por los deportistas en el último semestre

Ver código
# Crear la tabla original
tabla <- tibble(LESIONES = Deporte$LESIONES) %>% 
  group_by(LESIONES) %>% 
  summarise(fi = n()) %>%
  mutate(
    hi = round(fi/sum(fi), 4), 
    Porcentaje = paste0(hi*100, "%"),
    Fi = cumsum(fi),
    Hi = cumsum(hi)
  )

# Convertir las columnas Personas, Fi, y Hi a character para evitar conflictos
tabla <- tabla %>% mutate(
  LESIONES = as.character(LESIONES),
  Fi = as.character(Fi),
  Hi = as.character(Hi)
)

# Añadir la fila de totales, dejando Fi y Hi vacíos
totales <- tibble(
  LESIONES = "Total",
  fi = sum(tabla$fi),
  hi = round(sum(tabla$hi), 2),
  Porcentaje = paste0(round(sum(tabla$hi) * 100, 2), "%"),
  Fi = "",  # Puedes dejar en blanco o usar un valor numérico
  Hi = ""   # Puedes dejar en blanco o usar un valor numérico
)

# Combinar la tabla con los totales
tabla_final <- bind_rows(tabla, totales)

# Mostrar la tabla final con kable
tabla_final %>% 
  knitr::kable(
    col.names = c("Lesiones", "fi", "hi", "Porcentaje", "Fi", "Hi"), 
    align = c("l", "r", "r", "r", "r", "r")
  )
Lesiones fi hi Porcentaje Fi Hi
0 56 0.280 28% 56 0.28
1 42 0.210 21% 98 0.49
2 59 0.295 29.5% 157 0.785
3 43 0.215 21.5% 200 1
Total 200 1.000 100%
Ver código
# valores de la variable
x <- c(0, 1, 2, 3)
# f.m.p.
fx <- c(0.280, 0.210, 0.295, 0.215)

# Crear un dataframe con los datos
df <- data.frame(x = x, fx = fx)

library(ggplot2)

ggplot(df, aes(x = x, y = fx)) +
  geom_point(shape = 4 , color = "red") +
  geom_segment(aes(xend = x, yend = 0), linewidth = 1, color = "blue") +
  labs(x = "Lesiones", y = "Porcentaje", title = "Diagrama de bastones") +
  theme_minimal() +
  geom_text(aes(label = fx), vjust = -0.5)

Ver código
# Cargar librerías
library(ggplot2)
library(tibble)

# Crear datos
library(tibble)

df <- tibble(
  x = c(0, 1, 2, 3),
  fx = c(0.28, 0.49, 0.785, 1)
)

# Gráfica de función de distribución acumulada
ggplot(df, aes(x = x, y = fx)) +
  geom_step(color = "#2C3E50", size = 1.2) +        # línea escalonada (CDF)
  geom_point(color = "#E74C3C", size = 3) +         # puntos
  scale_x_continuous(breaks = df$x, limits = c(0,3)) +
  scale_y_continuous(limits = c(0, 1)) +
  labs(
    title = "Función de Distribución Acumulada (FDA)",
    x = "Variable",
    y = "Frecuencia relativa acumulada (Hi)"
  ) +
  theme_minimal(base_size = 4) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    panel.grid.minor = element_blank()
  )

La distribución de lesiones en la muestra de 200 deportistas muestra que la categoría más frecuente corresponde a quienes han sufrido 2 lesiones (29.5%; n=59), seguida por aquellos que no presentan lesiones (28%; n=56).

En cuanto a las demás categorías, el 21.5% (n=43) reporta 3 lesiones, mientras que el 21% (n=42) ha presentado 1 lesión, evidenciando una distribución relativamente equilibrada.

El análisis de frecuencias acumuladas indica que:

El 49% de los deportistas ha presentado máximo 1 lesión. El 78.5% ha tenido hasta 2 lesiones. La totalidad de la muestra (100%) se concentra hasta 3 lesiones.

Esto permite observar que, aunque existe una proporción importante sin lesiones, la mayoría de los deportistas ha experimentado al menos un evento lesivo.

En conjunto, los resultados evidencian una alta prevalencia de lesiones (72%), con una tendencia hacia la acumulación de eventos (más de la mitad presenta dos o más lesiones). El análisis acumulado refuerza la necesidad de implementar estrategias de prevención y control, orientadas a reducir tanto la incidencia como la recurrencia de lesiones en la población deportiva.

6.4 .Variable Continua

Generación de intervalos

Ver código
Min <- min(Deporte$PESO)
Min
[1] 48
Ver código
Max <- max(Deporte$PESO)
Max
[1] 80
Ver código
R <- Max-Min
R
[1] 32
Ver código
m <- ceiling(1 + 3.322*log10(nrow(Deporte
                                  )))
m
[1] 9
Ver código
A <- ceiling((R/m) * 1) / 1
A
[1] 4
Ver código
RC <- A*m
RC
[1] 36
PrecauciónLa amplitud debe tener tanto decimales como lo tienen los datos originales. Si tiene un decimal la fórmula se multiplica y se divide por 10. Si tiene dos decimales la fórmula se multiplica y se divide por 100 y así sucesivamente
Ver código
D <- RC-R
D
[1] 4
Ver código
Xmin <- Min-4
Xmin
[1] 44
Ver código
Xmax <- Max+4
Xmax
[1] 84
ImportanteLa diferencia se debe dividir en dos números lo más equitativos de tal manera que estos números tengan tantos decimales como los datos originales. Al mínimo se le resta uno de los números y al máximo se le suma el otro


Distribución de frecuencias de la edad de los deportistas encuestados

Ver código
library(dplyr)
library(kableExtra)

m1 <- (Xmin+(Xmin+A))/2

interv = cut(x = Deporte$PESO, breaks = seq(Xmin, Xmax, by = A), include.lowest = TRUE)

tabla <- tibble(PESO = interv) %>% 
  group_by(PESO) %>% 
  summarise(fi = n()) %>% 
  mutate(hi = fi / sum(fi)) %>% 
  mutate(
    mi = seq(m1, m1+(m-1)*A, by = A) %>% as.character(),  # Convertir `mi` a carácter
    Fi = cumsum(fi) %>% as.character(),                   # Convertir `Fi` a carácter
    Hi = cumsum(fi / sum(fi)) %>% as.character()          # Convertir `Hi` a carácter
  ) %>% 
  relocate(PESO, mi, fi)
  

# Agregar la fila total con casillas en blanco
tabla <- tabla %>% 
  add_row(PESO = "Total", mi = "", fi = sum(tabla$fi), hi = sum(tabla$hi), Fi = "", Hi = "")

# Generar la tabla con knitr::kable y agregar título
tabla %>% 
  knitr::kable(
    col.names = c("peso", "mi", "fi", "hi", "Fi", "Hi"), 
    align = c("l", "r", "r", "r", "r", "r")
  ) %>% 
  kableExtra::kable_styling(full_width = FALSE) %>% 
  kableExtra::add_header_above(c("Distribuciones de frecuencias para la variable peso" = 6))
Distribuciones de frecuencias para la variable peso
peso mi fi hi Fi Hi
[44,48] 46 6 0.030 6 0.03
(48,52] 50 18 0.090 24 0.12
(52,56] 54 22 0.110 46 0.23
(56,60] 58 36 0.180 82 0.41
(60,64] 62 24 0.120 106 0.53
(64,68] 66 22 0.110 128 0.64
(68,72] 70 33 0.165 161 0.805
(72,76] 74 14 0.070 175 0.875
(76,80] 78 25 0.125 200 1
Total 200 1.000
Ver código
library(ggplot2)

# Crear base de datos
PESO <- data.frame(
  li = c(44, 48, 52, 56, 60, 64, 68, 72, 76),
  ls = c(48, 52, 56, 60, 64, 68, 72, 76, 80),
  mi = c(46, 50, 54, 58, 62, 66, 70, 74, 78),
  fi = c(6, 18, 22, 36, 24, 22, 33, 14, 25)
)

# Graficar histograma (usando geom_col porque son datos agrupados)
ggplot(PESO, aes(x = mi, y = fi)) +
  geom_col(width = 5, fill = "steelblue", color = "black") +
  labs(
    title = "Histograma del peso de los deportistas encuestados",
    x = "Peso",
    y = "Frecuencia"
  ) +
  theme_minimal()

Ver código
library(ggplot2)

# Crear el dataframe según tu tabla
PESO <- data.frame(
  li = c(44, 48, 52, 56, 60, 64, 68, 72, 76),
  ls = c(48, 52, 56, 60, 64, 68, 72, 76, 80),
  Hi = c(0.03, 0.12, 0.23, 0.41, 0.53, 0.64, 0.805, 0.875, 1.00)
)

# Graficar la ojiva
ggplot(PESO, aes(x = ls, y = Hi)) +
  geom_line(color = "blue", size = 1) +
  geom_point(color = "red", size = 2) +
  labs(
    title = "Ojiva del peso de los deportistas",
    x = "Peso (límite superior del intervalo)",
    y = "Frecuencia acumulada relativa"
  ) +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

library(ggplot2) library(dplyr)

Ver código
# Datos agrupados

PESO <- data.frame( mi = c(46, 50, 54, 58, 62, 66, 70, 74, 78), fi = c(6, 18, 22, 36, 24, 22, 33, 14, 25) )

# Expandir los datos (aproximación)

peso_expandido <- PESO %>%  slice(rep(1:n(), fi))

# Gráfico de densidad

ggplot(peso_expandido, aes(x = mi)) + geom_density(fill = "steelblue", alpha = 0.5, size = 1) + labs( title = "Densidad del peso de los deportistas", x = "Peso", y = "Densidad" ) + theme_minimal()

La distribución del peso en la muestra de 200 deportistas muestra una mayor concentración en los intervalos intermedios. En particular, el rango de 56 a 60 kg presenta la mayor frecuencia (18%), seguido por los intervalos de 68 a 72 kg (16.5%) y 60 a 64 kg (12%).

En los intervalos superiores, como 72 a 76 kg (7%) y 76 a 80 kg (12.5%), se observa una menor proporción de individuos, lo que indica una disminución progresiva hacia los valores más altos.

La forma de la distribución sugiere una tendencia unimodal, con mayor concentración en valores medios y una dispersión moderada hacia ambos extremos. Además, la frecuencia acumulada indica que aproximadamente el 80.5% de los deportistas pesa hasta 72 kg, lo que evidencia que la mayoría de la población se encuentra en rangos de peso medio.

Los resultados evidencian que el peso de los deportistas se distribuye principalmente en rangos intermedios, con una menor representación en los extremos. Esta tendencia sugiere una población relativamente homogénea en términos de peso corporal, lo cual puede ser relevante al analizar variables como el rendimiento deportivo o la incidencia de lesiones.


6.5 .Tablas de contingencia

Ver código
# Cargar las bibliotecas necesarias
library(dplyr)
library(readxl)
library(kableExtra)



# Crear una tabla de contingencia con genero y escolaridad
table_Genero_Escolaridad <- table(Deporte$GENERO, Deporte$ESCOLARIDAD)

# Convertir la tabla a un data frame para facilitar el manejo de datos
table_df <- as.data.frame.matrix(table_Genero_Escolaridad)

# Calcular los totales de frecuencia absoluta (Total)
table_df$Total <- rowSums(table_df)  # Totales por fila
total_fi <- sum(table_df$Total)      # Total general

# Añadir una fila de totales al final de la tabla
table_df <- rbind(table_df, Total = c(colSums(table_Genero_Escolaridad), total_fi))

# Mostrar la tabla con kableExtra, aplicando color solo a la fila de Totales
table_df %>%
  kable("html", caption = "Tabla de Frecuencias absolutas de GENERO vs ESCOLARIDAD de los deportistas") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center") %>%
  row_spec(nrow(table_df), bold = T, color = "white", background = "darkblue")  # Resaltar solo la fila de Totales
Tabla de Frecuencias absolutas de GENERO vs ESCOLARIDAD de los deportistas
Primaria Secundaria Pregrado Posgrado Total
Femenino 18 21 25 29 93
Masculino 26 26 28 27 107
Total 44 47 53 56 200
Ver código
# Cargar las bibliotecas necesarias
library(dplyr)
library(readxl)
library(kableExtra)


# Crear una tabla de contingencia con GENERO Y DEPORTE
table_ <- table(Deporte$GENERO, Deporte$ESCOLARIDAD)

# Convertir la tabla a un data frame para facilitar el manejo de datos
table_df <- as.data.frame.matrix(table_Genero_Escolaridad)

# Calcular el total general para las frecuencias relativas
total_fi <- sum(table_df)  # Total general para todas las celdas

# Calcular las frecuencias relativas
table_df <- table_df / total_fi  # Dividir cada valor por el total general para obtener la frecuencia relativa

# Calcular los totales de frecuencia relativa por fila y columna
table_df$Total <- rowSums(table_df)  # Totales por fila (frecuencias relativas)
total_column <- colSums(table_df)  # Totales por columna (frecuencias relativas)

# Añadir una fila de totales al final de la tabla
table_df <- rbind(table_df, Total = total_column)

# Mostrar la tabla con kableExtra, aplicando color solo a la fila de Totales
table_df %>%
  kable("html", caption = "Tabla de Frecuencias Relativas de GÉNERO vs ESCOLARIDAD de los deportistas") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center") %>%
  row_spec(nrow(table_df), bold = T, color = "white", background = "darkblue")  # Resaltar solo la fila de Totales
Tabla de Frecuencias Relativas de GÉNERO vs ESCOLARIDAD de los deportistas
Primaria Secundaria Pregrado Posgrado Total
Femenino 0.09 0.105 0.125 0.145 0.465
Masculino 0.13 0.130 0.140 0.135 0.535
Total 0.22 0.235 0.265 0.280 1.000
Ver código
# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
library(readxl)

# Calcular los porcentajes de cada categoría de desempeño dentro de cada deporte
data_porcentaje <- Deporte %>%
  count(DEPORTE, DESEMPEÑO) %>%
  group_by(DEPORTE) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras conjuntas con porcentajes
ggplot(data_porcentaje, aes(x = DEPORTE, y = porcentaje, fill = DESEMPEÑO)) +
  geom_bar(stat = "identity", position = "dodge") +  # Usar "stack" si deseas barras apiladas
  labs(title = "Distribución porcentual de Desempeño por Deporte",
       x = "Deporte",
       y = "Porcentaje",
       fill = "Desempeño") +
  theme_minimal() +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            position = position_dodge(0.9), 
            vjust = -0.5, 
            size = 3)

Ver código
# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
library(readxl)


# Calcular los porcentajes de cada categoría de DESEMPEÑO dentro de cada DEPORTE
data_porcentaje <- Deporte %>%
  count(DESEMPEÑO, DEPORTE) %>%
  group_by(DESEMPEÑO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras apiladas con porcentajes
ggplot(data_porcentaje, aes(x = DESEMPEÑO, y = porcentaje, fill = DEPORTE)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(title = "Distribución porcentual de desempeño por Deporte",
       x = "Desempeño",
       y = "Porcentaje",
       fill = "Deporte") +
  theme_minimal() +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            position = position_stack(vjust = 0.5), 
            color = "white",
            size = 3)

Ver código
# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
library(readxl)


# Calcular los porcentajes de cada categoría de Desempeño dentro de cada Deporte
data_porcentaje <- Deporte %>%
  count(DESEMPEÑO, DEPORTE) %>%
  group_by(DESEMPEÑO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras apiladas en forma horizontal con porcentajes
ggplot(data_porcentaje, aes(x = DESEMPEÑO, y = porcentaje, fill = DEPORTE)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(title = "Distribución porcentual de desempeño deporte",
       x = "Desempeño",
       y = "Porcentaje",
       fill = "Deporte") +
  theme_minimal() +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            position = position_stack(vjust = 0.5), 
            color = "white",
            size = 3) +
  coord_flip()

La tabla de contingencia evidencia una distribución de frecuencias relativas entre el género y el nivel de escolaridad que, aunque aparentemente equilibrada, revela matices importantes en la composición de la muestra.

En el caso del género femenino, se observa una mayor concentración en niveles educativos superiores, particularmente en posgrado (14.5%), seguido de pregrado (12.5%). Este patrón sugiere una tendencia hacia una mayor cualificación académica en las mujeres dentro de la muestra. En contraste, su participación disminuye progresivamente en niveles inferiores como secundaria (10.5%) y primaria (9%).

Por su parte, el género masculino presenta una distribución más homogénea entre los diferentes niveles educativos, con una ligera predominancia en pregrado (14%) y valores muy similares en secundaria (13%), primaria (13%) y posgrado (13.5%). Esto indica una mayor dispersión educativa en comparación con el grupo femenino.

Por otra parte, se hace la interpretación de la distribución del desempeño según el deporte

La gráfica muestra la distribución porcentual del nivel de desempeño (bajo, medio y alto) en función de las distintas disciplinas deportivas, evidenciando una variabilidad importante entre deportes.

En el nivel de desempeño bajo, se observa una mayor participación del baloncesto (19.4%) y la natación (17.9%), seguidos por el fútbol (14.9%). En contraste, deportes como el voleibol (10.4%) y la gimnasia (11.9%) presentan menores proporciones en este nivel.

Para el desempeño medio, el fútbol (19.7%) y el baloncesto (18%) destacan como los deportes más representativos, mientras que el atletismo (6.6%) muestra la menor proporción, lo que podría indicar una menor concentración de deportistas en niveles intermedios dentro de esta disciplina.

En el nivel de desempeño alto, se observa una distribución más equilibrada, aunque con mayor representación en atletismo (16.7%), natación (16.7%) y voleibol (15.3%), lo que sugiere una tendencia hacia mejores niveles de rendimiento en estas disciplinas.

6.6 Referencias

Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. «Welcome to the tidyverse» 4: 1686. https://doi.org/10.21105/joss.01686. Wickham, Hadley, y Jennifer Bryan. 2025. «readxl: Read Excel Files». https://doi.org/10.32614/CRAN.package.readxl. William Revelle. 2025. «psych: Procedures for Psychological, Psychometric, and Personality Research». https://CRAN.R-project.org/package=psych. Zhu, Hao. 2024. «kableExtra: Construct Complex Table with ’kable’ and Pipe Syntax». https://doi.org/10.32614/CRAN.package.kableExtra. :::