Distribuciones de Frecuencias

taller1

Autor/a
Afiliación

Jeisson Javier Manjarres Martinez

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)

[@tidyverse; @kableExtra; @psych; @readxl]

2 .Introducción

Distribución de Frecuencias

Concepto

Una distribución de frecuencias es una forma de organizar, resumir y presentar datos estadísticos mediante tablas que muestran el número de observaciones que pertenecen a cada categoría o intervalo de una variable.

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 el Dataset

Base de datos Deportistas encuestados

4 .Leer el 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>
  • Numero de variables
Ver código
deporte %>% names %>% length()
[1] 13
  • Nombres 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
Ver código
deporte$GENERO <- as.factor(deporte$GENERO)
deporte$DEPORTE <- as.factor(deporte$DEPORTE)

deporte$ESCOLARIDAD <- factor(deporte$ESCOLARIDAD, 
                        levels = c("Primaria", "Secundaria", "Pregrado", "Posgrado"), ordered = TRUE)


deporte$DESEMPEÑO <- factor(deporte$DESEMPEÑO, 
                         levels = c("Bajo", "Medio", "Alto"), ordered = TRUE)
  • 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   <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, …

6 .Tablas y Graficas

6.1 .Variable Nominal

Advertencia

La variable nominal tiene solo frecuencia absoluta, relativa y porcentaje

Análisis de frecuencias del género de los 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 GENERO
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 genero de los encuestados", 
       x = "Genero", 
       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 GENERO
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 genero de los encuestados") +
  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 tabla muestra la distribución de una muestra de 200 personas según su género:

En esta muestra hay más hombres que mujeres, aunque la diferencia no es muy grande: aproximadamente 54 de cada 100 personas son hombres y aproximadamente 46 de cada 100 son mujeres

Es una distribución bastante equilibrada, pero con ligera mayoría masculina.


6.2 .Variable Ordinal

Tip

La variable ordinal tiene los cuatro tipos de frecuencias

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

Ver código
# Crear la tabla original
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 Fucion, 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("Nivel Escolaridad", "fi", "hi", "Porcentaje", "Fi", "Hi"), 
    align = c("l", "c", "c", "c", "c", "c")
  )
Nivel 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 DEPORTE
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 = "Nivel de 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 tabla muestra la distribución del nivel de escolaridad en una muestra de 200 personas, evidenciando que existe una mayor concentración en niveles educativos superiores. En particular, el 28% de los individuos cuenta con estudios de posgrado, seguido del 26.5% con pregrado, lo que indica que más de la mitad de la población (54.5%) ha alcanzado educación superior. Por otro lado, el 23.5% tiene nivel de secundaria y el 22% solo primaria, representando en conjunto el 45.5% con educación básica o media. Además, la frecuencia acumulada permite observar que el 72% de la muestra ha alcanzado hasta pregrado, mientras que el total se completa con quienes poseen posgrado. En general, estos resultados sugieren que la población analizada presenta un nivel educativo relativamente alto, con predominio de estudios superiores.


6.3 .Variable Discreta

Advertencia

La variable discreta tiene los cuatro tipos de frecuencias

Distribución de frecuencias de los encuestados según el número de prácticas en el deporte

Ver código
# Crear la tabla original
tabla <- tibble(Practicas = deporte$PRACTICAS) %>% 
  group_by(Practicas) %>% 
  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(
  Practicas = as.character(Practicas),
  Fi = as.character(Fi),
  Hi = as.character(Hi)
)

# Añadir la fila de totales, dejando Fi y Hi vacíos
totales <- tibble(
  Practicas = "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("N Practicas", "fi", "hi", "Porcentaje", "Fi", "Hi"), 
    align = c("l", "r", "r", "r", "r", "r")
  )
N Practicas fi hi Porcentaje Fi Hi
1 27 0.135 13.5% 27 0.135
2 26 0.130 13% 53 0.265
3 22 0.110 11% 75 0.375
4 33 0.165 16.5% 108 0.54
5 29 0.145 14.5% 137 0.685
6 33 0.165 16.5% 170 0.85
7 30 0.150 15% 200 1
Total 200 1.000 100%
Ver código
# valores de la variable
x <- c(1, 2, 3, 4, 5, 6, 7)
# f.m.p.
fx <- c(0.135, 0.130, 0.110, 0.165, 0.145, 0.165, 0.150)

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

# Gráfico con ggplot2
ggplot(df, aes(x = x, y = fx)) +
  geom_point(shape = 18, color = "red") +
  geom_segment(aes(xend = x, yend = 0), size = 1, color = "blue") +
  labs(x = "N Practicas", 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
df <- tibble(
  x = c(1, 2, 3, 4, 5, 6, 7),
  Hi = c(0.135, 0.265, 0.375, 0.54, 0.685, 0.85, 1)
)

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

La tabla presenta la distribución del número de prácticas realizadas por una muestra de 200 personas, mostrando una distribución relativamente equilibrada entre las diferentes categorías. Se observa que los valores con mayor frecuencia son 4 y 6 prácticas, cada uno con un 16.5% de los casos, lo que indica que estos son los niveles más comunes. Por otro lado, el menor porcentaje corresponde a 3 prácticas, con un 11%. En general, la mayoría de los porcentajes oscila entre el 13% y el 16.5%, lo que sugiere que no existe una concentración muy marcada en un solo número de prácticas. Asimismo, la frecuencia acumulada muestra que el 54% de las personas ha realizado hasta 4 prácticas, mientras que el 85% ha realizado hasta 6, y el total alcanza el 100% con 7 prácticas. En conjunto, estos resultados reflejan una distribución bastante homogénea, con una ligera tendencia hacia valores intermedios y altos en el número de prácticas realizadas.


6.4 .Variable Continua

Importante

La variable continua se tabula con intervalos


Generación de intervalos EDAD

Ver código
Min <- min(deporte$EDAD)
Min
[1] 18
Ver código
Max <- max(deporte$EDAD)
Max
[1] 60
Ver código
R <- Max-Min
R
[1] 42
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] 5
Ver código
RC <- A*m
RC
[1] 45
Precaución

La 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] 3
Ver código
Xmin <- Min-4
Xmin
[1] 14
Ver código
Xmax <- Max+4
Xmax
[1] 64
Importante

La 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 usuarios encuestados

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

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

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

tabla <- tibble(Edad = interv) %>% 
  group_by(Edad) %>% 
  summarise(fi = n()) %>% 
  mutate(hi = fi / sum(fi)) %>% 
  mutate(
    mi = seq(m1, by = A, length.out = n()) %>% as.character(),
  Fi = cumsum(fi) %>% as.character(),
  Hi = cumsum(fi / sum(fi)) %>% as.character()
  ) %>% 
  relocate(Edad, mi, fi)
  

# Agregar la fila total con casillas en blanco
tabla <- tabla %>% 
  add_row(Edad = "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("Edad", "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 Edad" = 6))
Distribuciones de frecuencias para la variable Edad
Edad mi fi hi Fi Hi
[14,19] 16.5 6 0.030 6 0.03
(19,24] 21.5 18 0.090 24 0.12
(24,29] 26.5 24 0.120 48 0.24
(29,34] 31.5 25 0.125 73 0.365
(34,39] 36.5 23 0.115 96 0.48
(39,44] 41.5 24 0.120 120 0.6
(44,49] 46.5 30 0.150 150 0.75
(49,54] 51.5 24 0.120 174 0.87
(54,59] 56.5 21 0.105 195 0.975
(59,64] 61.5 5 0.025 200 1
Total 200 1.000
Ver código
# Librerías
library(ggplot2)

# Dataframe (tus datos)
edad <- data.frame(
  li = c(26, 31, 36, 41, 46, 51, 56, 61, 66, 71),
  ls = c(31, 36, 41, 46, 51, 56, 61, 66, 71, 76),
  fi = c(29, 127, 143, 33, 33, 36, 34, 32, 31, 2)
)

# Histograma real con intervalos
ggplot(edad) +
  geom_rect(aes(
    xmin = li,
    xmax = ls,
    ymin = 0,
    ymax = fi
  ),
  fill = "steelblue",
  color = "black"
  ) +
  labs(
    title = "Histograma de la edad de los trabajadores",
    x = "Edad",
    y = "Frecuencia"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

Ver código
library(dplyr)
library(ggplot2)
library(tibble)

edad <- tibble(
  li = c(26, 31, 36, 41, 46, 51, 56, 61, 66, 71),
  ls = c(31, 36, 41, 46, 51, 56, 61, 66, 71, 76),
  fi = c(29, 127, 143, 33, 33, 36, 34, 32, 31, 2)
)

# Calcular acumuladas
edad <- edad %>% 
  mutate(
    Fi = cumsum(fi),
    Hi = Fi / sum(fi)
  )

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

Ver código
# Librerías
library(dplyr)

edad <- data.frame(
  mi = c(28.5, 33.5, 38.5, 43.5, 48.5, 53.5, 58.5, 63.5, 68.5, 73.5),
  fi = c(29, 127, 143, 33, 33, 36, 34, 32, 31, 2)
)

edad_expandida <- edad %>%
  slice(rep(1:n(), fi))

dens <- density(edad_expandida$mi)

plot(dens,
     main = "Densidad",
     xlab = "Edad",
     ylab = "Densidad",
     col = "red",
     lwd = 2)

polygon(dens, col = rgb(1, 0, 0, 0.5), border = "red")

La tabla muestra la distribución de frecuencias de la variable “Edad” para un total de 200 personas, organizada en intervalos de amplitud 5 años. Se observa que las edades se concentran principalmente en los rangos intermedios, especialmente entre 29 y 49 años, donde se acumula la mayor proporción de individuos. El intervalo con mayor frecuencia absoluta es (44,49], con 30 personas (15%), seguido por varios intervalos cercanos con valores similares, lo que sugiere una distribución relativamente equilibrada en la adultez media. La frecuencia acumulada indica que el 75% de la muestra tiene 49 años o menos, y casi el 98% no supera los 59 años. En contraste, los extremos (edades más jóvenes de 14 a 19 y mayores de 59 a 64) presentan muy baja representación. En conjunto, la distribución es aproximadamente simétrica pero con ligera concentración en edades adultas, lo que sugiere que la población analizada está mayormente compuesta por personas de mediana edad.


6.5 .Tablas de contingencia

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



# Crear una tabla de contingencia con DEPORTE y DESEMPEÑO
table_deporte_desempeño <- table(deporte$DEPORTE, deporte$DESEMPEÑO)

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

# 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_deporte_desempeño), 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 DEPORTE vs DESEMPEÑO de los encuestados") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center") %>%
  row_spec(nrow(table_df), bold = T, color = "white", background = "blue")  # Resaltar solo la fila de Totales
Tabla de Frecuencias absolutas de DEPORTE vs DESEMPEÑO de los encuestados
Bajo Medio Alto Total
Atletismo 9 4 12 25
Baloncesto 13 11 12 36
Fútbol 10 12 9 31
Gimnasia 8 9 9 26
Natación 12 8 12 32
Tenis 8 7 7 22
Voleibol 7 10 11 28
Total 67 61 72 200
Ver código
# Cargar las bibliotecas necesarias
library(dplyr)
library(readxl)
library(kableExtra)


# Crear una tabla de contingencia con DEPORTE y DESEMPEÑO
table_deporte_desempeño <- table(deporte$DEPORTE, deporte$DESEMPEÑO)

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

# 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 DEPORTE vs DESEMPEÑO de los encuestados") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center") %>%
  row_spec(nrow(table_df), bold = T, color = "white", background = "blue")  # Resaltar solo la fila de Totales
Tabla de Frecuencias Relativas de DEPORTE vs DESEMPEÑO de los encuestados
Bajo Medio Alto Total
Atletismo 0.045 0.020 0.060 0.125
Baloncesto 0.065 0.055 0.060 0.180
Fútbol 0.050 0.060 0.045 0.155
Gimnasia 0.040 0.045 0.045 0.130
Natación 0.060 0.040 0.060 0.160
Tenis 0.040 0.035 0.035 0.110
Voleibol 0.035 0.050 0.055 0.140
Total 0.335 0.305 0.360 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 NIVEL DE ESCOLARIDAD
data_porcentaje <- deporte %>%
  count(ESCOLARIDAD, DESEMPEÑO) %>%
  group_by(ESCOLARIDAD) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras conjuntas con porcentajes
ggplot(data_porcentaje, aes(x = ESCOLARIDAD, y = porcentaje, fill = DESEMPEÑO)) +
  geom_bar(stat = "identity", position = "dodge") +  # Usar "stack" si deseas barras apiladas
  labs(title = "Distribución porcentual del desempeño por el nivel de escolaridad",
       x = "Nivel de Escolaridad",
       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 NIVEL DE ESCOLARIDAD
data_porcentaje <- deporte %>%
  count(ESCOLARIDAD, DESEMPEÑO) %>%
  group_by(ESCOLARIDAD) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras apiladas con porcentajes
ggplot(data_porcentaje, aes(x = ESCOLARIDAD, y = porcentaje, fill = DESEMPEÑO)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(title = "Distribución porcentual del desempeño por el nivel de escolaridad",
       x = "Nivel de Escolaridad",
       y = "Porcentaje",
       fill = "Desempeño") +
  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 NIVEL DE ESCOLARIDAD
data_porcentaje <- deporte %>%
  count(ESCOLARIDAD, DESEMPEÑO) %>%
  group_by(ESCOLARIDAD) %>%
  mutate(porcentaje = n / sum(n) * 100)

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

La tabla presenta una distribución de 200 personas según el deporte practicado y el nivel (bajo, medio y alto). En términos generales, el nivel alto es el más frecuente con 72 personas, seguido del nivel bajo con 67 y el nivel medio con 61, lo que sugiere una ligera inclinación hacia desempeños más altos. Por deporte, baloncesto es el que reúne mayor número de participantes (36), seguido de natación (32) y fútbol (31), mientras que tenis tiene la menor cantidad (22). En cuanto a los niveles dentro de cada disciplina, se observa que atletismo y natación destacan en el nivel alto, fútbol se concentra más en el nivel medio, y voleibol también muestra una tendencia hacia el nivel alto. Gimnasia presenta una distribución bastante equilibrada entre los tres niveles. En conjunto, los datos reflejan una participación relativamente diversa entre deportes, con una leve predominancia de niveles altos en la población analizada.