DISTRIBUCIONES DE FRECUENCIAS

TALLER 1

Autor/a
Afiliación

Julian Barreto, Gabriel Molina & Erick Jan

Fecha de publicación

19 de octubre de 2025

Logo Universidad del Tolima
Ver código
# Verificar, instalar y activar el paquete "tidyverse"
if (!require(tidyverse)) {
  install.packages("tidyverse")
}
library(tidyverse)

# Verificar, instalar y activar el paquete "kableExtra"
if (!require(kableExtra)) {
  install.packages("kableExtra")
}
library(kableExtra)

# Verificar, instalar y activar el paquete "readxl"
if (!require(readxl)) {
  install.packages("readxl")
}
library(readxl)

1 .INTRODUCCION

Contexto y Motivación

En el análisis estadístico, uno de los desafíos fundamentales consiste en transformar grandes volúmenes de datos brutos en información comprensible y utilizable. Cuando un investigador se enfrenta a conjuntos de datos con decenas, cientos o miles de observaciones, la simple enumeración de valores individuales resulta impráctica y poco informativa. Es aquí donde la distribución de frecuencias emerge como una herramienta esencial de la estadística descriptiva.

La distribución de frecuencias constituye el primer paso sistemático en el proceso de análisis de datos, permitiendo organizar, resumir y presentar información de manera que revele patrones, tendencias y características estructurales que permanecerían ocultas en los datos sin procesar.

Definición Conceptual

Una distribución de frecuencias es una organización tabular que muestra cómo se distribuyen las observaciones de una variable a lo largo de diferentes categorías o intervalos de clase. Formalmente, si consideramos una variable X con n observaciones (x₁, x₂, …, xₙ), la distribución de frecuencias es una función que asigna a cada valor o clase de valores el número de veces que aparece en el conjunto de datos.

1.1 Objeto de Estudio

El propósito fundamental de construir una distribución de frecuencias es triple:

Primero, condensar la información mediante agrupación sistemática, reduciendo la complejidad sin perder las características esenciales de los datos.

Segundo, facilitar la identificación visual de patrones de concentración, dispersión, simetría y valores atípicos en la distribución.

Tercero, proporcionar la base estructural necesaria para el cálculo de medidas estadísticas descriptivas (tendencia central, dispersión, forma) y para la construcción de representaciones gráficas (histogramas, polígonos de frecuencia, ojivas).

1.2 Estructura Fundamental

Una distribución de frecuencias completa incorpora varios tipos de frecuencias, cada una con propiedades matemáticas específicas y utilidades interpretativas diferenciadas:

1.2.1 Frecuencia Absoluta (fᵢ)

Representa el conteo directo de observaciones en cada clase: f_i = \#\{x_j : x_j \in C_i\}

con la propiedad fundamental: \sum_{i=1}^{k} f_i = n

1.2.2 Frecuencia Relativa (hᵢ)

Expresa la proporción que representa cada clase respecto al total: h_i = \frac{f_i}{n}

satisfaciendo que: \sum_{i=1}^{k} h_i = 1

Frecuencia Acumulada (Fᵢ) Acumula progresivamente las frecuencias absolutas: F_i = \sum_{j=1}^{i} f_j

Frecuencia Relativa Acumulada (Hᵢ) Proporciona la función de distribución empírica: H_i = \frac{F_i}{n}

Tipos según la Naturaleza de la Variable

La construcción de una distribución de frecuencias debe adaptarse a la naturaleza de la variable bajo estudio:

Variables Cualitativas: Se enumeran las categorías con sus respectivas frecuencias sin orden particular (nominales) o con ordenamiento natural (ordinales).

Variables Cuantitativas Discretas: Cuando los valores posibles son numerables, se listan todos los valores observados con sus frecuencias correspondientes.

Variables Cuantitativas Continuas: Requieren la creación de intervalos de clase, ya que teóricamente pueden tomar infinitos valores en un rango continuo. Esto implica decisiones metodológicas sobre el número de clases (k) y la amplitud de cada intervalo (c).

1.3 Consideraciones Metodológicas Preliminares

La construcción de una distribución de frecuencias para variables continuas requiere determinar:

Número de clases (k): Tradicionalmente se utiliza la Regla de Sturges: k = 1 + 3.322 \log_{10}(n)

Amplitud de clase (c): c = \frac{R}{k} = \frac{x_{máx} - x_{mín}}{k}

Marca de clase (xᵢ): Punto representativo del intervalo: x_i = \frac{L_{i-1} + L_i}{2}

Relevancia en el Proceso Estadístico

La distribución de frecuencias no es un fin en sí misma, sino un medio que facilita:

  • El cálculo de estadísticos descriptivos mediante fórmulas ponderadas
  • La construcción de representaciones gráficas que comunican eficazmente los hallazgos
  • La identificación preliminar de la forma distribucional de los datos (normalidad, asimetría, curtosis)
  • La base para inferencias estadísticas posteriores

Limitaciones y Precauciones

Es importante reconocer que al agrupar datos en una distribución de frecuencias se produce inevitablemente una pérdida de información individual. La elección del número de intervalos es inherentemente arbitraria y puede influir en la interpretación de los resultados. Intervalos muy amplios pueden ocultar variabilidad importante, mientras que intervalos excesivamente estrechos pueden fragmentar innecesariamente los datos.

Además, la distribución de frecuencias asume que todas las observaciones dentro de un intervalo pueden representarse por su marca de clase, lo cual introduce un error de agrupamiento en los cálculos subsecuentes.

Objetivo de este Estudio

En las secciones siguientes, desarrollaremos formalmente cada componente de la distribución de frecuencias, presentaremos las fórmulas matemáticas exactas para su construcción y cálculo, examinaremos las propiedades teóricas que garantizan su consistencia interna, y demostraremos cómo utilizarla para derivar medidas estadísticas descriptivas. Este desarrollo proporcionará las herramientas conceptuales y computacionales necesarias para el análisis riguroso de datos en contextos aplicados.

2 .DISTRIBUCIONES DE FRECUENCIAS

Ver código
set.seed(123)
color <- sample(c("Azul", "Rojo", "Verde", "Naranja"),
                size = 70, replace = TRUE)
table(color)
color
   Azul Naranja    Rojo   Verde 
     22      11      16      21 

2.1 .Variable cualitativa nominal

Ver código
tibble(Color = color) %>% 
  group_by(Color) %>% 
  summarise(fi = n()) %>%
  mutate(hi = round(fi/sum(fi), 4), 
         Porcentaje = paste0(hi*100, "%")) %>% 
  knitr::kable(
    col.names = c("Color", "fi", "hi",
                  "Porcentaje"), align = c("l", "c", "c", "c")
  )
Color fi hi Porcentaje
Azul 22 0.3143 31.43%
Naranja 11 0.1571 15.71%
Rojo 16 0.2286 22.86%
Verde 21 0.3000 30%

Tabla con colores

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

tibble(Color = color) %>% 
  group_by(Color) %>% 
  summarise(fi = n()) %>%
  mutate(hi = round(fi / sum(fi), 4), 
         Porcentaje = paste0(hi * 100, "%")) %>%
  knitr::kable(
    col.names = c("Color", "fi", "hi", "Porcentaje"), 
    align = c("l", "c", "c", "c")
  ) %>%
  kable_styling(full_width = F, bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  row_spec(0, bold = T, color = "white", background = "#6A8DFF") %>% # Encabezado con fondo verde
  column_spec(1, background = "#f2f2f2") %>% # Columna de colores con fondo gris claro
  column_spec(2, color = "#A64DFF") %>% # Columna 'fi' en color azul
  column_spec(3, color = "#FA8072") %>% # Columna 'hi' en color naranja
  column_spec(4, color = "#339CFF")     # Columna 'Porcentaje' en color verde
Color fi hi Porcentaje
Azul 22 0.3143 31.43%
Naranja 11 0.1571 15.71%
Rojo 16 0.2286 22.86%
Verde 21 0.3000 30%

Tabla para variable cualitativa del paquete palmerpenguins

Ver código
palmerpenguins::penguins %>% drop_na() %>%
  group_by(species) %>% 
  summarise(fi = n()) %>% 
  mutate(
    hi = round(fi/sum(fi),4), 
    Porcentaje = paste0(hi*100, "%")) %>% 
  knitr::kable(
    col.names = c("Especie", "$f_i$", "$h_i$",
                  "Porcentaje"), align = c("l", "r", "r", "r")
  )
Especie f_i h_i Porcentaje
Adelie 146 0.4384 43.84%
Chinstrap 68 0.2042 20.42%
Gentoo 119 0.3574 35.74%

2.2 .Variable cualitativa ordinal

Ver código
set.seed(456)
servicio <- sample(
  c("E", "B", "R", "M"),
  size = 350, replace = TRUE)
table(servicio)
servicio
  B   E   M   R 
 85 103  85  77 
Ver código
servicio <- factor(
  servicio,
  labels = c("Mala", "Regular", "Buena", "Excelente"),
  levels = c("M", "R", "B", "E"),
  ordered = TRUE
)
table(servicio)
servicio
     Mala   Regular     Buena Excelente 
       85        77        85       103 
Ver código
servicio[1:10]
 [1] Excelente Excelente Regular   Buena     Excelente Mala      Regular  
 [8] Excelente Buena     Regular  
Levels: Mala < Regular < Buena < Excelente
Ver código
tibble(Servicio = servicio) %>% 
  group_by(Servicio) %>% 
  summarise(fi = n()) %>%
  #arrange(desc(Servicio)) %>% 
  mutate(
    hi = round(fi/sum(fi), 4), 
    Porcentaje = paste0(hi*100, "%"),
    Fi = cumsum(fi),
    Hi = cumsum(hi)
  ) %>% 
  knitr::kable(
    col.names = c("Calificación", "$f_i$", "$h_i$",
                  "Porcentaje", "$F_i$", "$H_i$"), align = c("l", "r", "r", "r", "r", "r")
  )
Calificación f_i h_i Porcentaje F_i H_i
Mala 85 0.2429 24.29% 85 0.2429
Regular 77 0.2200 22% 162 0.4629
Buena 85 0.2429 24.29% 247 0.7058
Excelente 103 0.2943 29.43% 350 1.0001

Diagrama de barras

Ver código
library(ggplot2)

# Datos simulados
datos_servicio <- data.frame(
  Servicio = c("Bueno", "Excelente", "Regular", "Malo"),
  fi = c(58, 74, 55, 63)
)

# Cálculo de porcentajes
datos_servicio$Percentage <- (datos_servicio$fi / sum(datos_servicio$fi)) * 100

# Gráfico de barras horizontales con porcentajes
ggplot(datos_servicio, aes(x = fi, y = reorder(Servicio, fi))) +
  geom_bar(stat = "identity", fill = "royalblue") +
  labs(
    title = "Distribución de Calificaciones del Servicio",
    x = "Frecuencia Absoluta (fi)",
    y = "Calificación del Servicio"
  ) +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), hjust = -0.1) +
  theme_minimal()

Interpretación: En el análisis de frecuencias de la variable Servicio, se observó que la calificación “Bueno” predominó con un 23.0% de las observaciones, seguida de “Excelente” y “Regular”, cada una representando el 26.67%. La calificación “Malo” fue la menos frecuente, con un 16.67% del total de observaciones. La distribución acumulada muestra que el 83.34% de las evaluaciones se concentran en las tres primeras categorías, lo que indica una tendencia general hacia evaluaciones positivas y regulares del servicio, con una menor incidencia de opiniones negativas. Este análisis sugiere una percepción mayormente favorable del servicio, con pocas observaciones en el extremo negativo.

2.3 .Variable cuantitativa discreta

Ver código
set.seed(987)
personas <- round(rnorm(600, mean = 5, sd = 1))
table(personas)
personas
  2   3   4   5   6   7   8 
  3  31 150 218 149  44   5 
Ver código
tibble(Personas = personas) %>% 
  group_by(Personas) %>% 
  summarise(fi = n()) %>%
  mutate(
    hi = round(fi/sum(fi), 4), 
    Porcentaje = paste0(hi*100, "%"),
    Fi = cumsum(fi),
    Hi = cumsum(hi)
  ) %>% 
  knitr::kable(
    col.names = c("Personas", "$f_i$", "$h_i$",
                  "Porcentaje", "$F_i$", "$H_i$"), align = c("l", "r", "r", "r", "r", "r")
  )
Personas f_i h_i Porcentaje F_i H_i
2 3 0.0050 0.5% 3 0.0050
3 31 0.0517 5.17% 34 0.0567
4 150 0.2500 25% 184 0.3067
5 218 0.3633 36.33% 402 0.6700
6 149 0.2483 24.83% 551 0.9183
7 44 0.0733 7.33% 595 0.9916
8 5 0.0083 0.83% 600 0.9999

2.3.1 .Variable cuantitativa discreta con totales

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

# Añadir la fila de totales, dejando Fi y Hi vacíos
totales <- tibble(
  Personas = "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("Personas", "$f_i$", "$h_i$", "Porcentaje", "$F_i$", "$H_i$"), 
    align = c("l", "r", "r", "r", "r", "r")
  )
Personas f_i h_i Porcentaje F_i H_i
2 3 0.0050 0.5% 3 0.005
3 31 0.0517 5.17% 34 0.0567
4 150 0.2500 25% 184 0.3067
5 218 0.3633 36.33% 402 0.67
6 149 0.2483 24.83% 551 0.9183
7 44 0.0733 7.33% 595 0.9916
8 5 0.0083 0.83% 600 0.9999
Total 600 0.9999 99.99%
Ver código
## .*Variable cuantitativa continua*
Ver código
set.seed(555)
peso <- round(rnorm(200, mean = 60, sd = 5), 1)
min(peso)
[1] 44.4
Ver código
max(peso)
[1] 77.1
Ver código
diff(range(peso))
[1] 32.7
Ver código
1+log2(200)
[1] 8.643856
Ver código
1+3.322*log10(200)
[1] 8.644022
Ver código
32.7/9
[1] 3.633333
Ver código
3.7*9
[1] 33.3
Ver código
33.3-32.7
[1] 0.6

Número de intervalos: 9

Nuevo mínimo: 44.1

Nuevo máximo: 77.4

Ver código
interv = cut(x = peso, breaks = seq(44.1, 77.4, by = 3.7)
             , include.lowest = TRUE)
tibble(Peso = interv) %>% 
  group_by(Peso) %>% 
  summarise(fi = n()) %>% 
  mutate(mi = seq(45.95, 75.55, by = 3.7)) %>% 
  relocate(Peso, mi, fi) %>% 
  mutate(
    hi = fi/sum(fi),
    Fi = cumsum(fi),
    Hi = cumsum(hi)
  ) %>% 
  knitr::kable(
    col.names = c("Peso", "mi", "fi", "hi",
                  "Fi", "Hi"), align = c("c", "c", "c", "c", "c", "c")
  ) %>% 
  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.1,47.8] 45.95 1 0.005 1 0.005
(47.8,51.5] 49.65 5 0.025 6 0.030
(51.5,55.2] 53.35 28 0.140 34 0.170
(55.2,58.9] 57.05 42 0.210 76 0.380
(58.9,62.6] 60.75 64 0.320 140 0.700
(62.6,66.3] 64.45 41 0.205 181 0.905
(66.3,70] 68.15 12 0.060 193 0.965
(70,73.7] 71.85 6 0.030 199 0.995
(73.7,77.4] 75.55 1 0.005 200 1.000

2.4 .Variable cuantitativa continua con totales

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

interv = cut(x = peso, breaks = seq(44.1, 77.4, by = 3.7), include.lowest = TRUE)

tabla <- tibble(Peso = interv) %>% 
  group_by(Peso) %>% 
  summarise(fi = n()) %>% 
  mutate(hi = fi / sum(fi)) %>% 
  mutate(
    mi = seq(45.95, 75.55, by = 3.7) %>% 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.1,47.8] 45.95 1 0.005 1 0.005
(47.8,51.5] 49.65 5 0.025 6 0.03
(51.5,55.2] 53.35 28 0.140 34 0.17
(55.2,58.9] 57.05 42 0.210 76 0.38
(58.9,62.6] 60.75 64 0.320 140 0.7
(62.6,66.3] 64.45 41 0.205 181 0.905
(66.3,70] 68.15 12 0.060 193 0.965
(70,73.7] 71.85 6 0.030 199 0.995
(73.7,77.4] 75.55 1 0.005 200 1
Total 200 1.000

3 .Tablas de frecuencias con Dataset

3.1 .Leer el dataset

1.En formato xlsx

Ver código
library(readxl)
empleo <- read_excel("empleo.xlsx")

2.En formato cvs

Ver código
library(readxl)
empleo_1 <- read.csv("empleo.csv")

3.2 .Conocer el dataset

Ver código
head(empleo)
# A tibble: 6 × 10
  SEXO       EDAD EDUCACION FUNCION  SALARIO SERVICIO EXPERIENCIA ESTADO   HIJOS
  <chr>     <dbl>     <dbl> <chr>      <dbl>    <dbl>       <dbl> <chr>    <dbl>
1 Masculino    49        15 Gerencia   57000     8.17       12    Unión L…     0
2 Masculino    43        16 Oficina    40200     8.17        3    Casado       3
3 Femenino     71        12 Oficina    21450     8.17       31.8  Unión L…     0
4 Femenino     54         8 Oficina    21900     8.17       15.8  Casado       3
5 Masculino    46        15 Oficina    45000     8.17       11.5  Soltero      4
6 Masculino    42        15 Oficina    32100     8.17        5.58 Viudo        0
# ℹ 1 more variable: ESTRATO <chr>
Ver código
glimpse(empleo)
Rows: 500
Columns: 10
$ SEXO        <chr> "Masculino", "Masculino", "Femenino", "Femenino", "Masculi…
$ EDAD        <dbl> 49, 43, 71, 54, 46, 42, 45, 35, 55, 55, 51, 35, 40, 52, 38…
$ EDUCACION   <dbl> 15, 16, 12, 8, 15, 15, 15, 12, 15, 12, 16, 8, 15, 15, 12, …
$ FUNCION     <chr> "Gerencia", "Oficina", "Oficina", "Oficina", "Oficina", "O…
$ SALARIO     <dbl> 57000, 40200, 21450, 21900, 45000, 32100, 36000, 21900, 27…
$ SERVICIO    <dbl> 8.166667, 8.166667, 8.166667, 8.166667, 8.166667, 8.166667…
$ EXPERIENCIA <dbl> 12.000000, 3.000000, 31.750000, 15.833333, 11.500000, 5.58…
$ ESTADO      <chr> "Unión Libre", "Casado", "Unión Libre", "Casado", "Soltero…
$ HIJOS       <dbl> 0, 3, 0, 3, 4, 0, 1, 1, 1, 0, 1, 2, 4, 4, 3, 2, 2, 0, 4, 4…
$ ESTRATO     <chr> "Alto", "Medio", "Medio", "Medio", "Medio", "Bajo", "Bajo"…
Ver código
str(empleo)
tibble [500 × 10] (S3: tbl_df/tbl/data.frame)
 $ SEXO       : chr [1:500] "Masculino" "Masculino" "Femenino" "Femenino" ...
 $ EDAD       : num [1:500] 49 43 71 54 46 42 45 35 55 55 ...
 $ EDUCACION  : num [1:500] 15 16 12 8 15 15 15 12 15 12 ...
 $ FUNCION    : chr [1:500] "Gerencia" "Oficina" "Oficina" "Oficina" ...
 $ SALARIO    : num [1:500] 57000 40200 21450 21900 45000 ...
 $ SERVICIO   : num [1:500] 8.17 8.17 8.17 8.17 8.17 ...
 $ EXPERIENCIA: num [1:500] 12 3 31.8 15.8 11.5 ...
 $ ESTADO     : chr [1:500] "Unión Libre" "Casado" "Unión Libre" "Casado" ...
 $ HIJOS      : num [1:500] 0 3 0 3 4 0 1 1 1 0 ...
 $ ESTRATO    : chr [1:500] "Alto" "Medio" "Medio" "Medio" ...
Ver código
empleo %>% names %>% length
[1] 10
Ver código
names(empleo)
 [1] "SEXO"        "EDAD"        "EDUCACION"   "FUNCION"     "SALARIO"    
 [6] "SERVICIO"    "EXPERIENCIA" "ESTADO"      "HIJOS"       "ESTRATO"    

-Transformar variables

Ver código
empleo <- empleo %>%
  mutate(FUNCION = parse_factor(FUNCION, 
                                levels= c('Servicios Generales', 'Oficina', 'Gerencia'), ordered = T)) %>%
  mutate(ESTRATO = parse_factor(ESTRATO, 
                                levels= c('Bajo', 'Medio', 'Alto'), ordered = T))
Ver código
glimpse(empleo)
Rows: 500
Columns: 10
$ SEXO        <chr> "Masculino", "Masculino", "Femenino", "Femenino", "Masculi…
$ EDAD        <dbl> 49, 43, 71, 54, 46, 42, 45, 35, 55, 55, 51, 35, 40, 52, 38…
$ EDUCACION   <dbl> 15, 16, 12, 8, 15, 15, 15, 12, 15, 12, 16, 8, 15, 15, 12, …
$ FUNCION     <ord> Gerencia, Oficina, Oficina, Oficina, Oficina, Oficina, Ofi…
$ SALARIO     <dbl> 57000, 40200, 21450, 21900, 45000, 32100, 36000, 21900, 27…
$ SERVICIO    <dbl> 8.166667, 8.166667, 8.166667, 8.166667, 8.166667, 8.166667…
$ EXPERIENCIA <dbl> 12.000000, 3.000000, 31.750000, 15.833333, 11.500000, 5.58…
$ ESTADO      <chr> "Unión Libre", "Casado", "Unión Libre", "Casado", "Soltero…
$ HIJOS       <dbl> 0, 3, 0, 3, 4, 0, 1, 1, 1, 0, 1, 2, 4, 4, 3, 2, 2, 0, 4, 4…
$ ESTRATO     <ord> Alto, Medio, Medio, Medio, Medio, Bajo, Bajo, Medio, Medio…
Ver código
class(empleo$FUNCION)
[1] "ordered" "factor" 
Ver código
# Ver niveles de una variable ordinal (factor ordenado)
levels(empleo$FUNCION)
[1] "Servicios Generales" "Oficina"             "Gerencia"           

-Tabla de frecuencia variable ESTADO

Ver código
table(empleo$ESTADO)

     Casado    Separado     Soltero Unión Libre       Viudo 
         95         104         105          93         103 
Ver código
tibble(Estado = empleo$ESTADO) %>% 
  group_by(Estado) %>% 
  summarise(fi = n()) %>% 
  mutate(
    hi = round(fi/sum(fi), 4), 
    Porcentaje = paste0(hi*100, "%")) %>% 
  knitr::kable(
    col.names = c("Estado", "$f_i$", "$h_i$",
                  "Porcentaje"), align = c("l", "r", "r", "r")
  )
Estado f_i h_i Porcentaje
Casado 95 0.190 19%
Separado 104 0.208 20.8%
Soltero 105 0.210 21%
Unión Libre 93 0.186 18.6%
Viudo 103 0.206 20.6%
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
estado_counts <- empleo %>%
  dplyr::count(ESTADO) %>%
  mutate(porcentaje = n / sum(n) * 100)

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

Diagrama de sectores

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
estado_counts <- empleo %>%
  dplyr::count(ESTADO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama circular
ggplot(estado_counts, aes(x = "", y = porcentaje, fill = ESTADO)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  labs(title = "Distribución porcentual del Estado civil") +
  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)

Tabla de contigencia o cruzada

Frecuencias absolutas

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



# Crear una tabla de contingencia con EDUCACION y ESTRATO
table_FUNCION_ESTRATO <- table(empleo$FUNCION, empleo$ESTRATO)

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

# 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_FUNCION_ESTRATO), 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 EDUCACION vs ESTRATO de los trabajadores") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center") %>%
  row_spec(nrow(table_df), bold = T, color = "white", background = "royalblue")  # Resaltar solo la fila de Totales
Tabla de Frecuencias absolutas de EDUCACION vs ESTRATO de los trabajadores
Bajo Medio Alto Total
Servicios Generales 5 11 11 27
Oficina 121 149 115 385
Gerencia 34 24 30 88
Total 160 184 156 500

Frecuencias relativas

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


# Crear una tabla de contingencia con FUNCION y ESTRATO
table_FUNCION_ESTRATO <- table(empleo$FUNCION, empleo$ESTRATO)

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

# 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 FUNCION vs ESTRATO de los trabajadores") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center") %>%
  row_spec(nrow(table_df), bold = T, color = "white", background = "royalblue")  # Resaltar solo la fila de Totales
Tabla de Frecuencias Relativas de FUNCION vs ESTRATO de los trabajadores
Bajo Medio Alto Total
Servicios Generales 0.010 0.022 0.022 0.054
Oficina 0.242 0.298 0.230 0.770
Gerencia 0.068 0.048 0.060 0.176
Total 0.320 0.368 0.312 1.000

Diagrama de barras conjuntas

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

# Calcular los porcentajes de cada categoría de ESTRATO dentro de cada ESTADO
data_porcentaje <- empleo %>%
  count(ESTADO, ESTRATO) %>%
  group_by(ESTADO) %>%
  mutate(porcentaje = n / sum(n) * 100)

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

Diagrama de barras apiladas vertical

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


# Calcular los porcentajes de cada categoría de ESTRATO dentro de cada ESTADO
data_porcentaje <- empleo %>%
  count(ESTADO, ESTRATO) %>%
  group_by(ESTADO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras apiladas con porcentajes
ggplot(data_porcentaje, aes(x = ESTADO, y = porcentaje, fill = ESTRATO)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(title = "Distribución porcentual de Estrato por Estado Civil",
       x = "Estado Civil",
       y = "Porcentaje",
       fill = "Estrato") +
  theme_minimal() +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            position = position_stack(vjust = 0.5), 
            color = "white",
            size = 3)

Diagrama de barras apiladas horizontal

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


# Calcular los porcentajes de cada categoría de ESTRATO dentro de cada ESTADO
data_porcentaje <- empleo %>%
  count(ESTADO, ESTRATO) %>%
  group_by(ESTADO) %>%
  mutate(porcentaje = n / sum(n) * 100)

# Crear el diagrama de barras apiladas en forma horizontal con porcentajes
ggplot(data_porcentaje, aes(x = ESTADO, y = porcentaje, fill = ESTRATO)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(title = "Distribución porcentual de Estrato por Estado Civil",
       x = "Estado Civil",
       y = "Porcentaje",
       fill = "Estrato") +
  theme_minimal() +
  geom_text(aes(label = sprintf("%.1f%%", porcentaje)), 
            position = position_stack(vjust = 0.5), 
            color = "white",
            size = 3) +
  coord_flip()

Histograma de frecuencias

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



# Crear el histograma de la variable EDAD
ggplot(empleo, aes(x = EDAD)) +
  geom_histogram(binwidth = 5, color = "black", fill = "royalblue") +
  labs(title = "Distribución de la Edad",
       x = "Edad",
       y = "Frecuencia") +
  theme_minimal()

Histograma de frecuencias con densidad

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



# Crear el histograma de la variable EDAD con la curva de densidad
ggplot(empleo, aes(x = EDAD)) +
  geom_histogram(aes(y = ..density..), binwidth = 5, color = "black", fill = "purple") +
  geom_density(alpha = 0.4, fill = "royalblue") +
  labs(title = "Distribución de la Edad con Curva de Densidad",
       x = "Edad",
       y = "Densidad") +
  theme_minimal()