PROBABILIDAD Y ESTADISTICA 1
UNIVERSIDAD DEL ROSARIO
R es un conjunto integrado de programas para manipulación de datos, cálculos, gráficos y análisis estadísticos. Un paquete de R es una colección de funciones y datasets (conjuntos de datos) desarrollados por la comunidad y puestos al servicio de los usuarios del software.
Instalar un paquete desde RStudio (o Google Colab) se puede hacer corriendo la función install.packages() en un bloque de código. Por ejemplo,
#install.packages("psych")
Una vez instalado el paquete, es necesario cargarlo en la sesión actual
library(psych)
library(readr)
garments_worker_productivity_clean <- read_csv("C:/Users/valentina felipe/Desktop/garments_worker_productivity_clean.csv",
col_types = cols(date = col_date(format = "%m/%d/%Y")))
View(garments_worker_productivity_clean)
Luego de cargar la base de datos podemos empezar a trabajar en nuestro archivo
Nota Importante:
Este conjunto de datos registra el desempeño operativo de una fábrica de confecciones durante el primer trimestre de 2015. Contiene métricas clave como: productividad real vs. esperada, horas extras, incentivos y tiempos de inactividad, desglosadas por departamento (costura/acabado), equipo de trabajo y día de la semana. Los datos permiten analizar patrones de eficiencia, impacto de incentivos en el rendimiento y variaciones por turnos o temporadas. Originalmente utilizada para optimizar procesos productivos, esta base depurada conserva 1,197 registros con variables numéricas y categóricas estandarizadas. Ideal para identificar cuellos de botella y mejores prácticas en manufactura textil.
Una vez cargado el conjunto de datos, con los comandos head() y tail() se puede hacer una breve inspección del dataset
Exploracion Basica de R
Nota Al comenzar la exploración de un conjunto de datos, uno de los primeros pasos es realizar y analizar el resumen de variables para detectar problemas de calidad y tratarlos antes de hacer cálculos más específicos.
La función head() en RStudio sirve para mostrar las
primeras filas de un objeto de datos
head(garments_worker_productivity_clean,10) #Vemos las primeras 10 filas
## # A tibble: 10 × 15
## date quarter department day team targeted_productivity smv wip
## <date> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2015-01-01 Quarter1 sewing Thurs… 8 0.8 26.2 1108
## 2 2015-01-01 Quarter1 finishing Thurs… 1 0.75 3.94 NA
## 3 2015-01-01 Quarter1 sewing Thurs… 11 0.8 11.4 968
## 4 2015-01-01 Quarter1 sewing Thurs… 12 0.8 11.4 968
## 5 2015-01-01 Quarter1 sewing Thurs… 6 0.8 25.9 1170
## 6 2015-01-01 Quarter1 sewing Thurs… 7 0.8 25.9 984
## 7 2015-01-01 Quarter1 finishing Thurs… 2 0.75 3.94 NA
## 8 2015-01-01 Quarter1 sewing Thurs… 3 0.75 28.1 795
## 9 2015-01-01 Quarter1 sewing Thurs… 2 0.75 19.9 733
## 10 2015-01-01 Quarter1 sewing Thurs… 1 0.75 28.1 681
## # ℹ 7 more variables: over_time <dbl>, incentive <dbl>, idle_time <dbl>,
## # idle_men <dbl>, no_of_style_change <dbl>, no_of_workers <dbl>,
## # actual_productivity <dbl>
La función tail() en R Studio se usa para obtener las
últimas N filas o elementos de un objeto como un vector, matriz o marco
de datos
tail(garments_worker_productivity_clean) #Vemos las últimas 6 filas
## # A tibble: 6 × 15
## date quarter department day team targeted_productivity smv wip
## <date> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2015-03-11 Quarter2 sewing Wednes… 7 0.65 30.5 935
## 2 2015-03-11 Quarter2 finishing Wednes… 10 0.75 2.9 NA
## 3 2015-03-11 Quarter2 finishing Wednes… 8 0.7 3.9 NA
## 4 2015-03-11 Quarter2 finishing Wednes… 7 0.65 3.9 NA
## 5 2015-03-11 Quarter2 finishing Wednes… 9 0.75 2.9 NA
## 6 2015-03-11 Quarter2 finishing Wednes… 6 0.7 2.9 NA
## # ℹ 7 more variables: over_time <dbl>, incentive <dbl>, idle_time <dbl>,
## # idle_men <dbl>, no_of_style_change <dbl>, no_of_workers <dbl>,
## # actual_productivity <dbl>
Diccionario de variables
Una breve descripción de cada una de las variables en el dataset se
presenta a continuación:
date: Fecha de registro de los datos en formato MM/DD/AAAA.
quarter: Trimestre del año al que pertenece el registro (Quarter1 a Quarter5).
day: Día de la semana en que se registraron los datos (Monday, Tuesday, etc.).
department: Departamento de trabajo (sweing/costura o finishing/acabados).
team: Número identificador del equipo de trabajo (valores del 1 al 12).
no_of_workers: Número de trabajadores en el equipo ese día.
targeted_productivity: Productividad objetivo establecida para el equipo (valores entre 0.35 y 0.8).
actual_productivity: Productividad real alcanzada por el equipo (valores entre 0.34 y 1.1).
smv: Standard Minute Value - tiempo asignado para completar una tarea específica.
wip: Work in Progress - cantidad de trabajo pendiente al inicio del día (puede estar vacío).
over_time: Horas extras trabajadas por el equipo.
incentive: Incentivo monetario otorgado al equipo (en unidades monetarias).
no_of_style_change: Número de cambios de estilo realizados durante el día.
idle_time: Tiempo de inactividad registrado (en minutos).
idle_men: Número de trabajadores que estuvieron inactivos durante el día
La librería tidyverse es un metapaquete diseñado para
una óptima manipulación de grandes conjuntos de datos. Primero debemos
instalarla
#install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.0.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%() masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
El paquete funciona mediante el
operador pip %>% de la siguiente manera
garments_worker_productivity_clean %>% head(10)
## # A tibble: 10 × 15
## date quarter department day team targeted_productivity smv wip
## <date> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2015-01-01 Quarter1 sewing Thurs… 8 0.8 26.2 1108
## 2 2015-01-01 Quarter1 finishing Thurs… 1 0.75 3.94 NA
## 3 2015-01-01 Quarter1 sewing Thurs… 11 0.8 11.4 968
## 4 2015-01-01 Quarter1 sewing Thurs… 12 0.8 11.4 968
## 5 2015-01-01 Quarter1 sewing Thurs… 6 0.8 25.9 1170
## 6 2015-01-01 Quarter1 sewing Thurs… 7 0.8 25.9 984
## 7 2015-01-01 Quarter1 finishing Thurs… 2 0.75 3.94 NA
## 8 2015-01-01 Quarter1 sewing Thurs… 3 0.75 28.1 795
## 9 2015-01-01 Quarter1 sewing Thurs… 2 0.75 19.9 733
## 10 2015-01-01 Quarter1 sewing Thurs… 1 0.75 28.1 681
## # ℹ 7 more variables: over_time <dbl>, incentive <dbl>, idle_time <dbl>,
## # idle_men <dbl>, no_of_style_change <dbl>, no_of_workers <dbl>,
## # actual_productivity <dbl>
Una variable estadística es cualquier característica medida en el estudio que puede variar entre registros. En este dataset, las variables se clasifican en:
Discretas: Toman valores enteros específicos
(ej: no_of_workers,
no_of_style_change).
Continuas: Pueden tomar cualquier valor en un
rango (ej: targeted_productivity,
actual_productivity,
smv,
over_time,
incentive).
Nominales: Sin orden inherente (ej:
department - “sweing” o “finishing”,
day - días de la semana).
Ordinales: Con un orden lógico (ej:
quarter - Quarter1 a Quarter5).
Algunas variables cuantitativas pueden convertirse en categóricas
agrupando rangos (ej: clasificar
actual_productivity en baja, media o
alta).
Volviendo a los datos, veamos su estructura y dimensión:
la función str(), que sirve para mostrar de forma
compacta la estructura interna de cualquier objeto de R, como vectores,
listas o data frames, revelando su tipo de datos, dimensiones y valores
iniciales.
garments_worker_productivity_clean %>% str() #veamos su estructura y dimensión:
## spc_tbl_ [1,197 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ date : Date[1:1197], format: "2015-01-01" "2015-01-01" ...
## $ quarter : chr [1:1197] "Quarter1" "Quarter1" "Quarter1" "Quarter1" ...
## $ department : chr [1:1197] "sewing" "finishing" "sewing" "sewing" ...
## $ day : chr [1:1197] "Thursday" "Thursday" "Thursday" "Thursday" ...
## $ team : num [1:1197] 8 1 11 12 6 7 2 3 2 1 ...
## $ targeted_productivity: num [1:1197] 0.8 0.75 0.8 0.8 0.8 0.8 0.75 0.75 0.75 0.75 ...
## $ smv : num [1:1197] 26.16 3.94 11.41 11.41 25.9 ...
## $ wip : num [1:1197] 1108 NA 968 968 1170 ...
## $ over_time : num [1:1197] 7080 960 3660 3660 1920 6720 960 6900 6000 6900 ...
## $ incentive : num [1:1197] 98 0 50 50 50 38 0 45 34 45 ...
## $ idle_time : num [1:1197] 0 0 0 0 0 0 0 0 0 0 ...
## $ idle_men : num [1:1197] 0 0 0 0 0 0 0 0 0 0 ...
## $ no_of_style_change : num [1:1197] 0 0 0 0 0 0 0 0 0 0 ...
## $ no_of_workers : num [1:1197] 59 8 30.5 30.5 56 56 8 57.5 55 57.5 ...
## $ actual_productivity : num [1:1197] 0.941 0.886 0.801 0.801 0.8 ...
## - attr(*, "spec")=
## .. cols(
## .. date = col_date(format = "%m/%d/%Y"),
## .. quarter = col_character(),
## .. department = col_character(),
## .. day = col_character(),
## .. team = col_double(),
## .. targeted_productivity = col_double(),
## .. smv = col_double(),
## .. wip = col_double(),
## .. over_time = col_double(),
## .. incentive = col_double(),
## .. idle_time = col_double(),
## .. idle_men = col_double(),
## .. no_of_style_change = col_double(),
## .. no_of_workers = col_double(),
## .. actual_productivity = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
La función dim() en R se usa para obtener o establecer
las dimensiones de un objeto como una matriz, un array o un data frame.
Si la aplicas a un objeto, te devuelve un vector con el número de filas
y columnas.
garments_worker_productivity_clean %>% dim() #Número de filas y número de columnas
## [1] 1197 15
El conjunto tiene la información de 1197 pacientes dividida en 15 variables de las cuales Department, Date y day no son escalares
Para que las variables tipo character se puedan tratar como variables cualitativas es necesario convertirlas en factores y, para ello, veamos primero los nombres de las variables
La función colnames() en R se usa tanto para obtener
como para establecer los nombres de las columnas de un objeto similar a
una matriz, como un data frame.
garments_worker_productivity_clean %>% colnames() #veamos primero los nombres de las variables
## [1] "date" "quarter" "department"
## [4] "day" "team" "targeted_productivity"
## [7] "smv" "wip" "over_time"
## [10] "incentive" "idle_time" "idle_men"
## [13] "no_of_style_change" "no_of_workers" "actual_productivity"
de manera más eficiente con el comando lapply vamos a
convertirlas en factores
garments_worker_productivity_clean[,c("quarter", "department", "day", "team", "no_of_style_change")] <-
lapply(garments_worker_productivity_clean[,c("quarter", "department", "day", "team", "no_of_style_change")], as.factor)
garments_worker_productivity_clean%>% str()
## spc_tbl_ [1,197 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ date : Date[1:1197], format: "2015-01-01" "2015-01-01" ...
## $ quarter : Factor w/ 5 levels "Quarter1","Quarter2",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ department : Factor w/ 2 levels "finishing","sewing": 2 1 2 2 2 2 1 2 2 2 ...
## $ day : Factor w/ 6 levels "Monday","Saturday",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ team : Factor w/ 12 levels "1","2","3","4",..: 8 1 11 12 6 7 2 3 2 1 ...
## $ targeted_productivity: num [1:1197] 0.8 0.75 0.8 0.8 0.8 0.8 0.75 0.75 0.75 0.75 ...
## $ smv : num [1:1197] 26.16 3.94 11.41 11.41 25.9 ...
## $ wip : num [1:1197] 1108 NA 968 968 1170 ...
## $ over_time : num [1:1197] 7080 960 3660 3660 1920 6720 960 6900 6000 6900 ...
## $ incentive : num [1:1197] 98 0 50 50 50 38 0 45 34 45 ...
## $ idle_time : num [1:1197] 0 0 0 0 0 0 0 0 0 0 ...
## $ idle_men : num [1:1197] 0 0 0 0 0 0 0 0 0 0 ...
## $ no_of_style_change : Factor w/ 3 levels "0","1","2": 1 1 1 1 1 1 1 1 1 1 ...
## $ no_of_workers : num [1:1197] 59 8 30.5 30.5 56 56 8 57.5 55 57.5 ...
## $ actual_productivity : num [1:1197] 0.941 0.886 0.801 0.801 0.8 ...
## - attr(*, "spec")=
## .. cols(
## .. date = col_date(format = "%m/%d/%Y"),
## .. quarter = col_character(),
## .. department = col_character(),
## .. day = col_character(),
## .. team = col_double(),
## .. targeted_productivity = col_double(),
## .. smv = col_double(),
## .. wip = col_double(),
## .. over_time = col_double(),
## .. incentive = col_double(),
## .. idle_time = col_double(),
## .. idle_men = col_double(),
## .. no_of_style_change = col_double(),
## .. no_of_workers = col_double(),
## .. actual_productivity = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Para ver los niveles de una variable tipo factor se usa la
función distinct(). La función distinct() en R, del paquete
dplyr, se utiliza para identificar y devolver filas únicas de un marco
de datos, eliminando duplicados según las columnas especificadas
garments_worker_productivity_clean %>% distinct(day)
## # A tibble: 6 × 1
## day
## <fct>
## 1 Thursday
## 2 Saturday
## 3 Sunday
## 4 Monday
## 5 Tuesday
## 6 Wednesday
Si, además, queremos contar cuántos registros hay de cada categoría,
podemos usar la función count()
garments_worker_productivity_clean %>% count(department)
## # A tibble: 2 × 2
## department n
## <fct> <int>
## 1 finishing 506
## 2 sewing 691
Gracias a la función count pudimos observar que la variable departamento tiene dos areas acabado con 506 elementos y costura con 691 elementos dando asi los 1.197 elementos totales
La función unique() en R se usa para eliminar elementos duplicados de un vector, una matriz o un marco de datos, devolviendo un objeto con solo los valores únicos que contiene el objeto de entrada.
unique(garments_worker_productivity_clean$department)
## [1] sewing finishing
## Levels: finishing sewing
Un estadígrafo es una medida numérica que se calcula sobre un conjunto de datos y sirve para resumir la información contenida en el mismo. Hay cuatro clases de estadígrafos: tendencia central, posición, dispersión y forma.
Tendencia central Describen la forma en la que
los datos se agrupan hacia el centro de la distribución. Las más
importantes son: media, mediana y moda.
Algunas observaciones:
Sobre la media:
La media es única para cualquier conjunto de datos y tiene la misma unidad de medida de estos. Es conocida comúnmente como el promedio.
No necesariamente es uno de los valores del conjunto.
Es muy sensible a datos atípicos (valores extemos).
Al ordenar los datos, la mediana es el valor ubicado en la posición central. Es decir, es el dato que deja el 50% de los datos por encima y 50% por debajo.
No es susceptible ante la presencia de valores extremos. (Medida robusta).
La mediana siempre es única.
Puede o no ser un valor dentro del conjunto de datos.
La moda corresponde al dato con mayor frecuencia absoluta (el que más se repite). No necesariamente es única. Si un conjunto de datos tiene una única moda entonces se denomina unimodal. Si la moda se alcanza en dos valores diferentes, el conjunto recibe el nombre de bimodal. Si hay 3 o más modas, los datos se referencian como multimodales.
No es una medida de tendencia central de único valor.
No se afecta por valores extremos.
Siempre es un valor del conjunto de datos.
Las funciones mean(), median() y
mfv() de R realizan estos cálculos. Para usar el comando de
la moda es necesario instalar el paquete modeest
#install.packages("modeest")
library(modeest)
## Registered S3 method overwritten by 'rmutil':
## method from
## plot.residuals psych
mfv(garments_worker_productivity_clean$actual_productivity)
## [1] 0.800402
median(garments_worker_productivity_clean$actual_productivity)
## [1] 0.7733333
mean(garments_worker_productivity_clean$actual_productivity, trim = 0.2)
## [1] 0.7587779
Análisis de Productividad en la Industria Textil
En el sector de confecciones, la productividad real promedio (X̄) alcanza 0.72 (sobre un máximo de 1.0), siendo 0.80 el valor más frecuente (Moda) y 0.77 la mediana (Me). Para reducir el efecto de valores extremos, la media recortada al 20% es de 0.75, lo que indica una distribución ligeramente asimétrica hacia valores bajos.
Notación estadística:
X̄: Media muestral (usada aquí, pues los datos representan una muestra de producción)
μ: Media poblacional (no aplica en este caso)
y se calculan con la función quantile() que, además,
proporciona los valores mínimo y máximo del conjunto.
quantile(garments_worker_productivity_clean$no_of_workers) #proporciona los valores mínimo y máximo del conjunto.
## 0% 25% 50% 75% 100%
## 2 9 34 57 89
El análisis de cuartiles muestra que el tamaño de los equipos varía entre 2 y 89 operarios. El 25% de los equipos tiene 9 trabajadores o menos, mientras que la mediana se ubica en 34, lo que significa que la mitad de los equipos trabaja con 34 operarios o menos. Por otro lado, el 25% de los equipos más grandes cuenta con 57 trabajadores o más. En conjunto, el 50% central de los equipos se concentra entre 9 y 57 operarios, lo que evidencia una distribución heterogénea en el tamaño de los grupos de trabajo.
quantile(garments_worker_productivity_clean$no_of_workers, c(0.1,0.26,0.78))
## 10% 26% 78%
## 8 9 57
El análisis de los percentiles muestra que el 10% de los equipos más pequeños cuenta con 8 trabajadores o menos. En el percentil 26, los equipos alcanzan 9 operarios, lo que evidencia que una gran proporción de grupos se concentra en tamaños reducidos. Sin embargo, en el percentil 78 los equipos ya cuentan con 57 trabajadores, lo que refleja la presencia de grupos mucho más grandes. Esto pone en evidencia una distribución desigual en el tamaño de los equipos, donde predominan los pequeños, pero existen también conjuntos de gran magnitud que amplían la dispersión general.
El comando summary() calcula simultáneamente la media,
los cuartiles, el máximo y el mínimo de las variables escalares y la
frecuencia por categoría de las variables categóricas
garments_worker_productivity_clean %>% summary() #calcula simultáneamente la media, los cuartiles, el máximo y el mínimo de las variables escalares y la frecuencia por categoría de las variables categóricas
## date quarter department day
## Min. :2015-01-01 Quarter1:360 finishing:506 Monday :199
## 1st Qu.:2015-01-18 Quarter2:335 sewing :691 Saturday :187
## Median :2015-02-03 Quarter3:210 Sunday :203
## Mean :2015-02-04 Quarter4:248 Thursday :199
## 3rd Qu.:2015-02-23 Quarter5: 44 Tuesday :201
## Max. :2015-03-11 Wednesday:208
##
## team targeted_productivity smv wip
## 2 :109 Min. :0.0700 Min. : 2.90 Min. : 7.0
## 8 :109 1st Qu.:0.7000 1st Qu.: 3.94 1st Qu.: 774.5
## 1 :105 Median :0.7500 Median :15.26 Median : 1039.0
## 4 :105 Mean :0.7296 Mean :15.06 Mean : 1190.5
## 9 :104 3rd Qu.:0.8000 3rd Qu.:24.26 3rd Qu.: 1252.5
## 10 :100 Max. :0.8000 Max. :54.56 Max. :23122.0
## (Other):565 NA's :506
## over_time incentive idle_time idle_men
## Min. : 0 Min. : 0.00 Min. : 0.0000 Min. : 0.0000
## 1st Qu.: 1440 1st Qu.: 0.00 1st Qu.: 0.0000 1st Qu.: 0.0000
## Median : 3960 Median : 0.00 Median : 0.0000 Median : 0.0000
## Mean : 4567 Mean : 38.21 Mean : 0.7302 Mean : 0.3693
## 3rd Qu.: 6960 3rd Qu.: 50.00 3rd Qu.: 0.0000 3rd Qu.: 0.0000
## Max. :25920 Max. :3600.00 Max. :300.0000 Max. :45.0000
##
## no_of_style_change no_of_workers actual_productivity
## 0:1050 Min. : 2.00 Min. :0.2337
## 1: 114 1st Qu.: 9.00 1st Qu.:0.6503
## 2: 33 Median :34.00 Median :0.7733
## Mean :34.61 Mean :0.7351
## 3rd Qu.:57.00 3rd Qu.:0.8503
## Max. :89.00 Max. :1.1204
##
Rango Es la diferencia entre el máximo y el
mínimo de los datos y cuantifica la extensión total del conjunto. En R,
la función range() da los valores del máximo y del
mínimo
Rango=max−min
range(garments_worker_productivity_clean$incentive)
## [1] 0 3600
Rango intercuartílico Se define como el espacio que ocupa el 50% central de la distribución de los datos y se calcula como
IQR=RIC=Q3−Q1IQR=RIC=Q3−Q1
Es una medida robusta ante la presencia de datos atípicos y suele emplearse como medida de dispersión cuando la medida de tendencia central escogida es la mediana.
IQR(garments_worker_productivity_clean$team)
## [1] 6esto nos muestra la Distribución de equipos: El 50% central de los equipos de producción (entre el Q1 y Q3) está distribuido en un rango de 6 equipos numéricos (ej: si Q1=Equipo3 y Q3=Equipo9, la diferencia es 6).
var(garments_worker_productivity_clean$smv)
## [1] 119.754
La varianza de 119.754 en la columna smv indica que los tiempos estándar en minutos para realizar las tareas presentan una alta dispersión respecto a su promedio. Esto significa que existen procesos muy diferentes entre sí: algunos requieren pocos minutos, mientras que otros demandan mucho más tiempo. En otras palabras, los valores de smv no son homogéneos, sino que reflejan la diversidad en la complejidad y duración de las operaciones dentro de la producción textil.
sd(garments_worker_productivity_clean$actual_productivity)
## [1] 0.1744879
La desviación estándar de 0.174 en la productividad real (actual_productivity) muestra que los equipos textiles operan con una consistencia notable. Esto significa que la mayoría de los equipos (alrededor del 68%) mantienen niveles de productividad entre 0.55 y 0.89 cuando consideramos el promedio de 0.72.
skew(garments_worker_productivity_clean$no_of_workers)
## [1] -0.1114598
El sesgo de -0.11 en el número de trabajadores por equipo indica una distribución casi simétrica, con una ligera tendencia a tener más equipos grandes que pequeños. Esto muestra que la asignación de personal es bastante equilibrada en la fábrica, sin equipos extremos que distorsionen la distribución. El valor cercano a cero permite analizar estos datos sin necesidad de ajustes estadísticos complejos.
kurtosi(garments_worker_productivity_clean$incentive)
## [1] 297.2775
La función curtosis en R calcula la curtosis de un conjunto de datos, una medida estadística que describe la forma de la distribución de los datos, especialmente la de las colas.
La función describe() del
paquete psych hace un resumen descriptivo más amplio de una
variable escalar:
describe(garments_worker_productivity_clean$team, IQR=TRUE, quant = c(.25, .5, .75))
## vars n mean sd median trimmed mad min max range skew kurtosis se IQR
## X1* 1 1197 6.43 3.46 6 6.42 4.45 1 12 11 0.01 -1.23 0.1 6
## Q0.25 Q0.5 Q0.75
## X1* 3 6 9
Distribución de frecuencias. Es la agrupación de
datos en categorías mutuamente excluyentes que indica el número de
observaciones en cada categoría o clase. Construir la tabla de
frecuencias requiere la función fdt() del paquete
fdth
#install.packages("fdth")
library(fdth)
##
## Adjuntando el paquete: 'fdth'
## The following object is masked from 'package:modeest':
##
## mfv
## The following objects are masked from 'package:stats':
##
## sd, var
La “función Sturge R” se refiere a la Regla de Sturges, una fórmula estadística para determinar el número óptimo de intervalos o clases en una tabla de frecuencias, calculada como 1 + logaritmo en base 2 del número total de datos
Tabla_frec <- fdt(garments_worker_productivity_clean$actual_productivity, breaks = "Sturges") #Se emplea el método de Sturges para calcular la cantidad de clases (bins)
Tabla_frec
## Class limits f rf rf(%) cf cf(%)
## [0.2314,0.3064) 29 0.02 2.42 29 2.42
## [0.3064,0.3814) 44 0.04 3.68 73 6.10
## [0.3814,0.4564) 39 0.03 3.26 112 9.36
## [0.4564,0.5315) 50 0.04 4.18 162 13.53
## [0.5315,0.6065) 84 0.07 7.02 246 20.55
## [0.6065,0.6815) 100 0.08 8.35 346 28.91
## [0.6815,0.7565) 239 0.20 19.97 585 48.87
## [0.7565,0.8316) 275 0.23 22.97 860 71.85
## [0.8316,0.9066) 173 0.14 14.45 1033 86.30
## [0.9066,0.9816) 110 0.09 9.19 1143 95.49
## [0.9816,1.057) 48 0.04 4.01 1191 99.50
## [1.057,1.132) 6 0.01 0.50 1197 100.00
hist() que
permite trazar el histograma del conjunto de datos; sin embargo, aquí
vamos a usar el entorno gráfico de R que provee el
paquete ggplot2 incluido en tidyversegarments_worker_productivity_clean %>% ggplot(aes(x = actual_productivity)) +
geom_histogram(fill = "#FF1E56", color = "#28E4C9", bins = 30) +
ggtitle("Histograma de Productividad Real") +
labs(x = "Productividad Real", y = "Frecuencia") +
theme_minimal()
Analisis: El histograma refleja una distribución asimétrica positiva, con mayor concentración de observaciones entre 0.7 y 0.9, mientras que la cola derecha es más larga, lo que indica la presencia de algunos valores altos que desplazan la media hacia la derecha respecto a la mediana y la moda; en términos probabilísticos, la mayor probabilidad de ocurrencia se encuentra en el rango central, mientras que los valores extremos tienen baja frecuencia pero aumentan la dispersión de los datos.
ggplot(garments_worker_productivity_clean,
aes(x = targeted_productivity, y = actual_productivity)) +
# nube de puntos
geom_point(color = "#FF0054", alpha = 0.6, size = 3) +
# línea identidad (meta cumplida: y = x)
geom_abline(intercept = 0, slope = 1, color = "#3A86FF", linetype = "dashed", size = 1) +
# suavizado para ver tendencia
geom_smooth(method = "lm", se = FALSE, color = "#FFBE0B", size = 1.2) +
labs(title = "Productividad Real vs Productividad Objetivo",
x = "Productividad Objetivo",
y = "Productividad Real") +
theme_minimal(base_size = 14) +
theme(plot.title = element_text(face = "bold", hjust = 0.5))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
Analisis: El gráfico de dispersión muestra la relación entre la productividad real y la productividad objetivo de los trabajadores, donde cada punto representa una observación. La línea discontinua azul corresponde a la referencia ideal en la que la productividad real es igual a la objetivo, es decir, cuando se cumple exactamente la meta establecida. Se observa que la mayoría de los puntos se encuentran por debajo de esta línea, lo que indica que en general los trabajadores no alcanzan las metas propuestas. Sin embargo, algunos pocos puntos superan la referencia, evidenciando casos donde la productividad real estuvo por encima de lo esperado. La línea amarilla de tendencia confirma que, aunque existe relación positiva entre ambas variables, el desempeño real tiende a ser menor que el objetivo, lo cual resalta la brecha entre lo planificado y lo ejecutado en la producción.
ggplot(garments_worker_productivity_clean,
aes(x = department, y = actual_productivity, fill = department)) +
geom_violin(trim = FALSE, alpha = 0.8) +
geom_boxplot(width = 0.1, fill = "white", color = "black", outlier.color = "red") +
scale_fill_manual(values = c("sweing" = "#FF6B6B", # Rojo coral
"finishing" = "#4ECDC4")) + # Verde turquesa
labs(title = "Distribución de la Productividad por Departamento",
x = "Departamento",
y = "Productividad Real") +
theme_minimal(base_size = 14) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5))
Analisis: Se observa que en el área de sweing la productividad presenta una mayor concentración cercana a valores altos, con una mediana más elevada y menos dispersión hacia valores bajos, lo que indica un mejor desempeño general. En contraste, en el departamento de finishing la productividad está más concentrada en niveles medios y bajos, con mayor variabilidad y presencia de valores atípicos que evidencian diferencias significativas en el rendimiento de algunos equipos. Esto sugiere que, en términos generales, sweing tiende a mantener una productividad más consistente y cercana a la meta, mientras que finishing presenta un comportamiento más irregular.
ggplot(garments_worker_productivity_clean,
aes(x = quarter, y = actual_productivity, fill = quarter)) +
geom_boxplot(outlier.colour = "darkred", outlier.shape = 18, outlier.size = 2,
notch = TRUE, notchwidth = 0.6) +
scale_fill_brewer(palette = "Set2") + # Paleta de colores vivos
labs(title = "Boxplot de Productividad Real por Trimestre",
x = "Trimestre",
y = "Productividad Real") +
theme_minimal(base_size = 14) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "none")
Analisis: Se observa que, en general, los valores centrales de la productividad se mantienen alrededor de 0.7 a 0.8, aunque con algunas variaciones según el trimestre. El Quarter 5 destaca con una mediana más alta y una dispersión mayor, lo que indica un mejor rendimiento, aunque también una mayor variabilidad en los datos. En contraste, los Quarter 3 y Quarter 4 presentan medianas más bajas y un rango intercuartílico más amplio, reflejando mayor inestabilidad en la productividad. Asimismo, en todos los trimestres se identifican valores atípicos hacia la parte baja, lo que indica la existencia de periodos con productividades considerablemente inferiores al comportamiento típico. En conjunto, el análisis revela que aunque la productividad se mantiene estable en la mayoría de los trimestres, existen diferencias relevantes en la dispersión y rendimiento, siendo el quinto trimestre el de mayor desempeño general.
diagrama_productividad <- boxplot(garments_worker_productivity_clean$actual_productivity, horizontal = TRUE)
Analisis: El espacio entre la mediana (línea gruesa
dentro de la caja) y el mínimo es más pequeño que entre la mediana y el
máximo; es decir, el primer 50% de los datos es menos disperso (más
agrupado) que el segundo. Dentro de la caja, la división está más cerca
del borde inferior (cuartil 1) que del superior (cuartil 3) y, por
tanto, se concluye que el primer 25% central de los datos es menos
disperso que el segundo 25% central. Además, es claro que la cola
derecha (superior) es más larga que la izquierda (inferior) de donde se
infiere que los datos tienen asimetría positiva.
Por otro lado, en la cola derecha hay presencia de datos atípicos (son
bolitas) y para inspeccionarlos es necesario explorar el elemento en el
que se guardó el boxplot con el símbolo $
ggplot(garments_worker_productivity_clean, aes(department, fill=quarter)) + geom_bar() + theme(axis.text.x = element_text(angle=30))
Analisis: Este gráfico de barras apiladas muestra la distribución de equipos de trabajo según su departamento (eje X) y su composición por trimestres (relleno de colores). Cada barra vertical representa un departamento (“sweing” o “finishing”), dividida en segmentos coloreados que indican cuántos equipos pertenecen a cada trimestre (Quarter1, Quarter2, etc.). El ángulo de 30° en las etiquetas del eje X mejora la legibilidad. Esta visualización permite identificar simultáneamente: 1) La proporción general de equipos entre departamentos (altura total de las barras), 2) Cómo se distribuyen temporalmente los equipos dentro de cada departamento (proporción de colores en cada barra), y 3) Posibles patrones estacionales entre trimestres al comparar los segmentos de color horizontalmente. El gráfico revela de un vistazo si la asignación de equipos por departamento varía significativamente entre periodos o si se mantiene constante.
Los estadísticos descriptivos en R sirven para resumir, organizar y visualizar datos, proporcionando una comprensión inicial de los patrones y la distribución de un conjunto de datos.
summary() de la base R para obtener un resumen general
(mínimo, máximo, cuartiles, media) de datos
summary(garments_worker_productivity_clean$actual_productivity)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.2337 0.6503 0.7733 0.7351 0.8503 1.1204
cv <- sd(garments_worker_productivity_clean$actual_productivity) / mean(garments_worker_productivity_clean$actual_productivity)
cv
## [1] 0.2373691
El coeficiente de variación obtenido es de aproximadamente 0.24, lo que significa que la desviación estándar representa cerca del 24% del promedio de la productividad real. Este valor indica que existe una variabilidad moderada en el desempeño de los equipos: aunque no todos alcanzan el mismo nivel de productividad, las diferencias no son tan extremas como para señalar una inestabilidad fuerte. En términos prácticos, los equipos muestran un comportamiento relativamente homogéneo, con cierta dispersión alrededor de la media, lo que refleja que la mayoría trabaja en un rango cercano al promedio de productividad establecido.
En R, “stats” se refiere al paquete
base stats, que es una colección integrada de
herramientas estadísticas de propósito general, incluyendo pruebas de
hipótesis, análisis de regresión, y funciones para distribuciones
estadísticas, o también puede referirse a la función
boxplot.stats(), que extrae información
estadística para crear gráficos de caja, como los cuartiles y los
valores atípicos.
diagrama_productividad$stats
## [,1]
## [1,] 0.3504167
## [2,] 0.6503071
## [3,] 0.7733333
## [4,] 0.8502525
## [5,] 1.1204375
Los resultados muestran que la productividad mínima observada es de aproximadamente 0.35, mientras que la máxima llega a 1.12. El primer cuartil (Q1 = 0.65) indica que el 25% de los valores de productividad están por debajo de ese nivel. La mediana (0.77) refleja el valor central de la distribución, mostrando que la mitad de los trabajadores tienen productividades menores y la otra mitad mayores a este valor. Por su parte, el tercer cuartil (Q3 = 0.85) señala que el 75% de los datos se encuentran por debajo de este umbral. En conjunto, estos valores muestran que la productividad real está relativamente concentrada entre 0.65 y 0.85, con pocos valores extremos que alcanzan hasta 1.12. Esto sugiere una distribución relativamente estable, con tendencia a concentrarse en valores medios-altos de productividad.
Con la función length() es posible contar la cantidad de
outliers detectados
length(diagrama_productividad$out)
## [1] 54
En nuestra base de datos tenemos 54 datos atipicos, vamos a investigar la naturaleza de estos
# Ver los valores de los outliers
diagrama_productividad$out
## [1] 0.3458333 0.3301136 0.3499514 0.2337055 0.3379735 0.2462500 0.3502065
## [8] 0.3500313 0.3323593 0.3112075 0.2473160 0.3138528 0.2357955 0.3502184
## [15] 0.3274074 0.3499895 0.2611742 0.3295455 0.3500670 0.2853333 0.2593750
## [22] 0.2869846 0.3141667 0.2953077 0.2803333 0.2609788 0.3503017 0.3503017
## [29] 0.2720000 0.3503017 0.2380417 0.2870417 0.2830545 0.3299649 0.2580000
## [36] 0.3021173 0.3281316 0.3035745 0.2565000 0.2513993 0.2494167 0.3075015
## [43] 0.2839583 0.3250000 0.2682143 0.2718750 0.2718750 0.3423611 0.3093333
## [50] 0.3027704 0.3321465 0.2636938 0.2718750 0.2640625
1.Analisis univariado variables categóricas
En el caso cualitativo la cantidad de cálculos que se pueden hacer se
reduce a hallar las frecuencias absolutas y relativas de las categorías
de la variable. Para construir la tabla de frecuencias se emplea la
función table() del paquete básico de R.
Tabla_Departamento <- table(garments_worker_productivity_clean$department)
Tabla_Departamento
##
## finishing sewing
## 506 691
El departamento de “finishing” (acabados) aparece registrado 506 veces y 691 para “sewing” (costura). Esto revela una distribución desigual, donde el área de costura tiene casi el triple de equipos que cada versión del departamento de acabados.
Para construir la tabla de frecuencias relativas (porcentaje) se usa
la función prop.table() aplicada sobre una tabla de
frecuencias absolutas:
prop.table(Tabla_Departamento)
##
## finishing sewing
## 0.4227235 0.5772765
El departamento de “finishing” (acabados) representa 42.27%, mientras que “sewing” (costura) concentra 57.73% del total.
round(prop.table(Tabla_Departamento), digits=4)
##
## finishing sewing
## 0.4227 0.5773
Se redondea a 4 digitos como aprendimos en clase :)
garments_worker_productivity_clean %>%
ggplot(aes(x = quarter)) +
geom_bar(color = "black", fill = "lightblue") +
ggtitle("Distribución por Trimestre") +
labs(x = "Trimestre", y = "Conteo") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 30, size = 8))
Analisis: Se observa una organización temporal de 5 periodos consecutivos (Quarter 1 a Quarter 5) que permite analizar la evolución de los conteos a lo largo de aproximadamente un año y tres meses, donde los patrones de distribución revelan tendencias estacionales o cíclicas en los datos de productividad, mostrando potencialmente trimestres con mayores o menores frecuencias que podrían estar asociados a factores como demanda estacional, implementación de mejoras operativas o condiciones específicas de cada periodo, proporcionando así una visión clara del comportamiento temporal de la variable analizada.
garments_worker_productivity_clean %>% count(department)
## # A tibble: 2 × 2
## department n
## <fct> <int>
## 1 finishing 506
## 2 sewing 691
Esta diferencia sugiere que la actividad de producción está más concentrada en procesos de costura, posiblemente por la complejidad, duración o volumen de trabajo que requieren esas tareas.
ggplot(
garments_worker_productivity_clean%>% count(department),
aes(x = department, y = n, fill = department)
) +
geom_bar(stat = "identity", width = 0.7, alpha = 0.6) +
labs(
title = "Frecuencia de registros por departamento",
x = "Departamento",
y = "Frecuencia"
) +
theme_minimal() +
theme(
text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, face = "bold")
) +
scale_fill_manual(values = c("finishing" = "#FA8DAD", "sewing" = "#EFBC4A"))
Analisis: Department La mayoría de los registros (57.4%) corresponde al departamento de costura (sewing), mientras que el 42.6% restante es del área de acabado (finishing).
library(readr)
library(dplyr)
library(ggplot2)
df <- garments_worker_productivity_clean
df <- df %>%
mutate(quarter = factor(quarter, levels = c("Quarter1","Quarter2","Quarter3","Quarter4","Quarter5")))
df_counts <- df %>% count(quarter)
ggplot(df_counts, aes(x = quarter, y = n, fill = quarter)) +
geom_col(width = 0.7, alpha = 0.85) + # geom_col es más explícito para valores ya resumidos
scale_fill_manual(values = c(
"Quarter1" = "#F4A6A6",
"Quarter2" = "#A9CCE3",
"Quarter3" = "#ABEBC6",
"Quarter4" = "#D2B4DE",
"Quarter5" = "#F9E79F"
)) +
labs(
title = "Frecuencia de registros por cuatrimestre",
x = "Cuatrimestre",
y = "Frecuencia"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.title.x = element_text(face = "bold"),
legend.position = "none"
)
la función count() (normalmente del paquete dplyr) se
usa para contar el número de filas en una tabla de datos o el número de
ocurrencias de combinaciones únicas de variables dentro de un conjunto
de datos
garments_worker_productivity_clean %>% count(quarter)
## # A tibble: 5 × 2
## quarter n
## <fct> <int>
## 1 Quarter1 360
## 2 Quarter2 335
## 3 Quarter3 210
## 4 Quarter4 248
## 5 Quarter5 44
Analisis: El primer (Quarter1) y segundo (Quarter2)
cuatrimestres concentran más del 60% de los registros, lo cual indica
una mayor actividad durante la primera mitad del periodo observado. Esto
podría deberse a una planificación intensiva al inicio del
cicloproductivo o a una estacionalidad de la demanda
library(ggplot2)
library(dplyr)
library(readr)
# Cargar los datos
df <- garments_worker_productivity_clean
# Verificar la columna de días
print("Valores únicos en la columna de días:")
## [1] "Valores únicos en la columna de días:"
unique(df$day)
## [1] Thursday Saturday Sunday Monday Tuesday Wednesday
## Levels: Monday Saturday Sunday Thursday Tuesday Wednesday
# Crear la gráfica de frecuencia por día de la semana
df %>%
count(day) %>%
ggplot(aes(x = factor(day, levels = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")),
y = n, fill = day)) +
geom_bar(stat = "identity", width = 0.7, alpha = 0.8) +
labs(
title = "Frecuencia de registros por día de la semana",
x = "Día",
y = "Frecuencia"
) +
theme_minimal() +
theme(
text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.title.x = element_text(face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1) # Rotar etiquetas si es necesario
) +
scale_fill_manual(values = c(
"Monday" = "#FF6B9D", # Rosa vibrante
"Tuesday" = "#FF9F68", # Coral/naranja suave
"Wednesday" = "#FF6BCD", # Rosa fucsia
"Thursday" = "#D46BFF", # Púrpura vibrante
"Friday" = "#FF6B8B", # Rosa rojizo
"Saturday" = "#FF8F6B", # Salmón
"Sunday" = "#E75480"
))
garments_worker_productivity_clean %>% count(day)
## # A tibble: 6 × 2
## day n
## <fct> <int>
## 1 Monday 199
## 2 Saturday 187
## 3 Sunday 203
## 4 Thursday 199
## 5 Tuesday 201
## 6 Wednesday 208
Analisis: Los registros están distribuidos de manera bastante uniforme entre los días de la semana, lo que sugiere que el ritmo de trabajo se mantiene estable a lo largo de toda la semana laboral. Se evidencia una ligera mayor actividad los miércoles.
# Cargar los datos
df <- garments_worker_productivity_clean
# Crear gráfica de frecuencia por equipo con colores femeninos vibrantes
df %>%
count(team) %>%
ggplot(aes(x = factor(team), y = n, fill = factor(team))) +
geom_bar(stat = "identity", width = 0.7, alpha = 0.9) +
labs(
title = "Frecuencia de registros por equipo",
x = "Equipo",
y = "Frecuencia"
) +
theme_minimal() +
theme(
text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, face = "bold", color = "#E75480", size = 14),
axis.title.x = element_text(face = "bold", color = "#D44D7F"),
axis.title.y = element_text(face = "bold", color = "#D44D7F"),
panel.grid.major = element_line(color = "#F8BBD9", linewidth = 0.1),
panel.grid.minor = element_blank()
) +
scale_fill_manual(values = c(
"#FF6B9D", "#FF9F68", "#FF6BCD", "#D46BFF", "#FF6B8B",
"#FF8F6B", "#E75480", "#FF1493", "#FF69B4", "#DA70D6",
"#BA55D3", "#9370DB"
)) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1)))
garments_worker_productivity_clean %>% count(team)
## # A tibble: 12 × 2
## team n
## <fct> <int>
## 1 1 105
## 2 2 109
## 3 3 95
## 4 4 105
## 5 5 93
## 6 6 94
## 7 7 96
## 8 8 109
## 9 9 104
## 10 10 100
## 11 11 88
## 12 12 99
Analisis: La variable team muestra cuántos registros corresponden a cada equipo de trabajo. Hay una distribución desigual: algunos equipos aparecen con mayor frecuencia, lo cual puede estar relacionado con su tamaño, disponibilidad o carga de producción.
En esta sección se analiza la relación entre variables categóricas (como department y day) y variables cuantitativas (actual_productivity y over_time). Se presentan estadígrafos de tendencia central, dispersión, forma y posición, así como gráficos que permiten visualizar la distribución y variabilidad segmentada por categorías.3.36
# Paleta de colores
colores_femeninos <- c("#FF6B9D", "#FF9F68", "#FF6BCD", "#D46BFF", "#FF6B8B",
"#FF8F6B", "#E75480", "#FF1493", "#FF69B4", "#DA70D6")
p1 <- garments_worker_productivity_clean %>%
ggplot(aes(x = smv, y = actual_productivity, color = department)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(method = "lm", se = TRUE, alpha = 0.2) +
labs(title = "SMV vs Productividad Real por Departamento",
x = "Standard Minute Value (SMV)",
y = "Productividad Real",
color = "Departamento") +
scale_color_manual(values = colores_femeninos[1:2]) +
theme_minimal() +
theme(plot.title = element_text(face = "bold", color = "#7B2CBF"),
legend.position = "top")
p1
## `geom_smooth()` using formula = 'y ~ x'
Analisis: se observa una relación inversa o negativa entre ambas variables, donde a medida que aumenta el tiempo asignado para completar las tareas (SMV), la productividad real tiende a disminuir, evidenciando que los equipos son más eficientes en operaciones con tiempos estandarizados más bajos, mientras que las tareas que requieren más tiempo presentan menores niveles de productividad, posiblemente debido a mayor complejidad, procesos menos optimizados o factores operativos que impactan el rendimiento.
p2 <- garments_worker_productivity_clean %>%
ggplot(aes(x = department, y = actual_productivity, fill = department)) +
geom_boxplot(alpha = 0.8, outlier.color = "#FF1493", outlier.size = 2) +
labs(title = "Distribución de Productividad por Departamento",
x = "Departamento",
y = "Productividad Actual") +
scale_fill_manual(values = colores_femeninos[1:2]) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold", color = "#D44D7F"),
axis.text = element_text(color = "#333333"))
p2
Analisis: se observa que el departamento de costura (sewing) presenta una mediana de productividad notablemente más alta y una distribución general más elevada en comparación con el departamento de acabados (finishing), evidenciando diferencias significativas en el desempeño operativo entre ambas áreas. La dispersión de datos en el departamento de acabados muestra una variabilidad ligeramente mayor, con valores atípicos en el rango inferior, lo que sugiere posibles inconsistencia en los procesos o factores específicos que afectan negativamente su productividad.
p3 <- garments_worker_productivity_clean %>%
group_by(department) %>%
summarise(total_horas_extras = sum(over_time, na.rm = TRUE)) %>%
ggplot(aes(x = "", y = total_horas_extras, fill = department)) +
geom_bar(stat = "identity", width = 1, alpha = 0.8) +
coord_polar("y", start = 0) +
labs(title = "Distribución de Horas Extras por Departamento",
fill = "Departamento") +
scale_fill_manual(values = colores_femeninos[1:2]) +
theme_void() +
theme(plot.title = element_text(face = "bold", color = "#7B2CBF", hjust = 0.5),
legend.position = "bottom") +
geom_text(aes(label = paste0(round(total_horas_extras/sum(total_horas_extras)*100, 1), "%")),
position = position_stack(vjust = 0.5), color = "white", fontface = "bold")
p3
Analisis: Se observa una desproporción significativa en la carga de trabajo suplementaria entre los departamentos, donde el departamento de costura (sewing) concentra el 82.3% del total de horas extras, mientras que el departamento de acabados (finishing) representa apenas el 17.7%. Esta marcada diferencia indica que el departamento de costura enfrenta una demanda de producción sustancialmente mayor que requiere tiempo adicional constante, posiblemente debido a una mayor carga de órdenes, procesos más complejos o requerimientos de tiempo más extensos en sus operaciones. La distribución tan desigual sugiere la necesidad de evaluar la asignación de recursos, redistribuir cargas de trabajo o implementar estrategias de optimización en el departamento de costura para equilibrar la demanda y reducir la dependencia de horas extras, lo que podría impactar positivamente en los costos laborales y el bienestar de los trabajadores.
ggplot( garments_worker_productivity_clean,
aes(x = quarter, fill = department)
) +
geom_bar(position = "fill", width = 0.7) +
labs(
title = "Proporción de departamentos por cuatrimestre",
x = "Cuatrimestre",
y = "Proporción"
) +
theme_minimal() +
theme(
text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.title.x = element_text(face = "bold")
) +
scale_fill_manual(values = c("finishing" = "#69C3A5", "sewing" = "#F5A488")) +
scale_y_continuous(labels = scales::percent_format())
Analisis: se observa una distribución consistentemente desigual entre los departamentos de costura (sewing) y acabados (finishing) a lo largo de los cinco trimestres analizados, donde el departamento de costura mantiene una representación significativamente mayor en todos los periodos. Esta disparidad constante sugiere que la estructura operativa de la planta está persistentemente sesgada hacia las operaciones de costura, lo que podría indicar una mayor capacidad instalada, más personal asignado o una cartera de producción más amplia para este departamento. La estabilidad en esta distribución trimestral refleja una planificación organizacional consistente sin cambios drásticos en la asignación de recursos entre departamentos durante el periodo estudiado, aunque también plantea la necesidad de evaluar si esta distribución optimiza realmente la capacidad productiva total o si existe potencial para rebalancear recursos hacia el departamento de acabados para mejorar el flujo general de producción.
ggplot( garments_worker_productivity_clean,
aes(x = over_time, y = actual_productivity)
) +
geom_point(color = "pink", alpha = 0.6) +
geom_smooth(method = "lm", color = "red", se = FALSE) +
labs(
title = "Relación entre Horas Extra y Productividad Real",
x = "Horas Extra",
y = "Productividad Real"
) +
theme_minimal() +
theme(
text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold")
)
## `geom_smooth()` using formula = 'y ~ x'
Analisis: La gráfica revela una relación no lineal entre horas extra y productividad: inicialmente las horas extra generan ganancias marginales de productividad, pero tras un punto crítico (aproximadamente 10,000-15,000 horas) se observa rendimientos decrecientes, sugiriendo fatiga laboral o saturación de capacidad. Los datos muestran que existe un óptimo operativo donde las horas extra maximizan la productividad, pero beyond este punto, el agotamiento del equipo y posibles cuellos de botella en otros procesos limitan los beneficios adicionales. Esto indica que simplemente aumentar horas extra no garantiza mayor productividad, sino que debe buscarse un equilibrio con la eficiencia operativa y capacidad instalada.
media_target <- mean(garments_worker_productivity_clean$targeted_productivity, na.rm = TRUE)
sd_target <- sd(garments_worker_productivity_clean$targeted_productivity, na.rm = TRUE)
cv_target <- (sd_target / media_target) * 100
print(paste("Coeficiente de Variación de Productividad Objetivo:", round(cv_target, 2), "%"))
## [1] "Coeficiente de Variación de Productividad Objetivo: 13.42 %"
Analisis: El Coeficiente de Variación del 13.42% en la productividad objetivo indica una variabilidad moderada-baja en las metas establecidas para los equipos. Esto sugiere que la gerencia está definiendo objetivos relativamente consistentes y estandarizados, sin grandes disparidades entre los diferentes equipos o periodos.
Contextualizacion: Se estudia cómo varía la productividad alcanzada según el área de trabajo: Estadígrafos destacados: La media y mediana son mayores en el área de sweing, indicando un rendimiento general más alto; Adicionalmente, la desviación estándar y la varianza también son más elevadas en sweing, lo cual refleja mayor dispersión. El rango intercuartílico (IQR) y la curtosis son más pronunciados en sweing, lo que sugiere presencia de extremos o comportamientos atípicos. Observaciones: El departamento de costura muestra una productividad más alta y dispersa, con varios valores extremos. En cambio, el de acabado tiene menor productividad y mayor concentración de datos.
ggplot(garments_worker_productivity_clean, aes(x = actual_productivity, y = department, fill = department)) +
geom_boxplot() +
labs(title = "Boxplot de Productividad Real por Departamento",
x = "Productividad Real",
y = "Departamento") +
theme_minimal()
ggplot(
garments_worker_productivity_clean,
aes(x = over_time, y = actual_productivity, color = as.factor(team))
) +
geom_point(alpha = 0.7, size = 2) +
labs(
title = "Relación entre horas extra y productividad",
x = "Horas extra (over_time)",
y = "Productividad real (actual_productivity)",
color = "Equipo"
) +
theme_minimal() +
theme(
text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold")
)
Analisis: El diagrama de dispersión entre las horas extra trabajadas y la productividad real sugiere que no hay una relación claramente lineal entre ambas variables. De hecho, se observan muchos casos donde altos niveles de horas extra (over_time) se asocian con productividades más bajas, lo cual podría indicar fatiga o ineficiencia por sobrecarga. Algunos equipos (coloreados) muestran agrupamientos distintos, lo cual puede revelar diferencias en cómo gestionan el tiempo adicional.
Esta gráfica muestra la distribución de la productividad real por departamento, a través de histogramas acompañados de curvas de densidad. En el caso del departamento de “sweing”, la mayoría de los valores se concentran entre 0.7 y 0.9, lo cual sugiere que, a pesar de los outliers, la productividad de muchos trabajadores está dentro de un rango aceptable. Llama la atención que aparecen dos paneles con el nombre “finishing”, lo cual podría deberse a una inconsistencia en el etiquetado de los datos. Aun así, en ambos se observa una productividad más uniforme, aunque con ciertas diferencias en la forma de la distribución.
ggplot(garments_worker_productivity_clean, aes(x = actual_productivity)) +
geom_histogram(aes(y = ..density..), fill = "green", color = "gray", bins = 30, alpha = 0.6) +
geom_density(color = "blue", lines = 1) +
facet_wrap(~department, scales = "free_y") +
labs(
title = "Distribución de Productividad Real por Departamento",
x = "Productividad Real",
y = "Frecuencia"
) +
theme_minimal()
## Warning in geom_density(color = "blue", lines = 1): Ignoring unknown
## parameters: `lines`
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
En esta gráfica se analiza la distribución de las horas extra
(over_time) trabajadas durante la semana. La mayoría de los
días presentan distribuciones similares, con medianas estables y rangos
intercuartílicos relativamente estrechos. Sin embargo, el jueves se
destaca por la presencia de un valor atípico extremo que supera las
25,000 horas, lo cual podría tratarse de un error en la base de datos o
de un evento específico con una carga de trabajo inusualmente alta. Esta
gráfica sugiere que, aunque las horas extra están presentes todos los
días, su distribución general es consistente salvo por algunas
excepciones aisladas.
ggplot(garments_worker_productivity_clean, aes(x = day, y = over_time, fill = day)) +
geom_boxplot(alpha = 0.6) +
scale_fill_brewer(palette = "Pastel1") + # Colores suaves
labs(
title = "Boxplot de Horas Extra por Día de la Semana",
x = "",
y = "Horas extra"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Esta visualización muestra la relación entre las horas extra y la productividad real, separada por día de la semana. Cada punto representa un trabajador, y el objetivo es identificar si existe algún tipo de correlación entre trabajar más horas y obtener una mayor productividad. En general, no se observa una relación clara entre las variables: tanto los trabajadores que hacen pocas como los que hacen muchas horas extra pueden tener niveles de productividad bajos, medios o altos. Esto podría indicar que las horas adicionales no garantizan un aumento en la eficiencia, y que otros factores influyen en el desempeño diario.
ggplot(garments_worker_productivity_clean , aes(x = over_time, y = actual_productivity)) +
geom_point(color = "pink", alpha = 0.5) +
facet_wrap(~day, scales = "free_x") +
labs(
title = "Relación entre Horas Extra y Productividad por Día",
x = "Horas extra",
y = "Productividad Real"
) +
theme_minimal()
Finalmente, se presenta la distribución de las horas extra por día mediante histogramas con curvas de densidad. En casi todos los casos, los datos están sesgados hacia la derecha, lo que significa que la mayoría de los trabajadores realiza pocas horas extra, mientras que unos pocos concentran valores significativamente altos. Este patrón se mantiene en todos los días, aunque los jueves y sábados parecen tener más frecuencia de jornadas largas. Esta gráfica resalta la desigual distribución del trabajo adicional y sugiere que el uso de horas extra no es uniforme entre los empleados ni entre los días de la semana.
ggplot(garments_worker_productivity_clean, aes(x = over_time)) +
geom_histogram(aes(y = ..density..), fill = "#FF9F68", color = "black", bins = 30, alpha = 0.5) +
geom_density(color = "#FF1493", linewidth = 1) +
facet_wrap(~day, scales = "free_y") +
labs(
title = "Distribución de Horas Extra por Día",
x = "Horas extra",
y = "Frecuencia"
) +
theme_minimal()
Hipótesis parámetros individuales sobre toda la población
Media poblacional: Se desea evaluar si la productividad promedio de los equipos textiles es igual a un valor de referencia “0.75” se utilizó como un estándar operativo razonable, ya que representa una productividad del 75%. Esto podría interpretarse como el nivel esperado o deseado por la gerencia para que los equipos sean considerados eficientes y se cumpla un objetivo organizacional en términos de productividad.
● H₀: μ = 0.75 (La productividad media real de los equipos es
igual a 0.75)
● H₁: μ ≠ 0.75 (La productividad media real de los equipos es diferente de 0.75)
# Cargar datos
library(readr)
garments_worker_productivity_clean <- garments_worker_productivity_clean
View(garments_worker_productivity_clean)
# Extraer la variable de interés
prod <- garments_worker_productivity_clean$actual_productivity
# Estadísticas descriptivas
media_muestral <- mean(prod, na.rm = TRUE)
desviacion <- sd(prod, na.rm = TRUE)
n <- sum(!is.na(prod))
# Mostrar resultados previos a la prueba
cat("Media muestral:", round(media_muestral, 3), "\n")
## Media muestral: 0.735
cat("Desviación estándar:", round(desviacion, 3), "\n")
## Desviación estándar: 0.174
cat("n:", n, "\n")
## n: 1197
# Prueba t para una muestra
t.test(prod, mu = 0.75)
##
## One Sample t-test
##
## data: prod
## t = -2.9562, df = 1196, p-value = 0.003176
## alternative hypothesis: true mean is not equal to 0.75
## 95 percent confidence interval:
## 0.7251963 0.7449859
## sample estimates:
## mean of x
## 0.7350911
Con base en los datos de productividad real de 1197 equipos (TLC) se
asume normalidad; Se obtuvo una media muestral de 0.7351 y una
desviación estándar muestral de 0.1745. Se calculó un intervalo de
confianza del 95% para la media poblacional de la siguiente forma: Como
el valor-p obtenido en la prueba (p = 0.0032) es menor que el nivel de
significancia del 5% (α = 0.05), se rechaza la hipótesis nula.
Por lo tanto, se concluye que la productividad promedio real de los equipos textiles es significativamente diferente de 0.75. Esto implica que, estadísticamente, el estándar del 75% propuesto no representa adecuadamente el desempeño promedio actual de los equipos, y podría requerirse una revisión de los parámetros de referencia o de las condiciones de operación para alinearlos con la realidad observada.
Proporción poblacional: Se estima que un 60% de los equipos alcanza una productividad igual o superior a 0.70. Se desea contrastar esta proporción. “El valor 0.60 se escogió ya que es una meta especifica de eficiencia deseada por la gerencia, en la que se busca que al menos el 0.60 de los equipos mantengan una productividad igual o mayor, es un mínimo aceptable de operación.
● H₀: π = 0.60 (El 60% de los equipos tiene una productividad real mayor o igual a 0.70)
prop.test(x=832, n = 1197, p = 0.6, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: 832 out of 1197, null probability 0.6
## X-squared = 44.684, df = 1, p-value = 2.315e-11
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
## 0.6679745 0.7208995
## sample estimates:
## p
## 0.695071
Como el valor-p obtenido en la prueba (p = 1.892e-11) es menor que el nivel de significancia del 5% (α = 0.05), se rechaza la hipótesis nula. Se concluye entonces que el porcentaje de equipos con una productividad real mayor o igual a 0.70 es significativamente diferente al 60% planteado como referencia. En particular, los datos muestran que la proporción real observada es aproximadamente 69.5%, lo cual supera la expectativa mínima de desempeño establecida por la gerencia. Esto indica un resultado positivo, ya que una mayor proporción de equipos está alcanzando niveles de productividad considerados adecuados u óptimos dentro del contexto operativo de la organización
Planteamiento: “El porcentaje de productividad real promedio de toda la planta es mayor al 65%”
media_productividad <- mean(garments_worker_productivity_clean$actual_productivity, na.rm = TRUE)
test_hipotesis <- t.test(garments_worker_productivity_clean$actual_productivity,
mu = 0.65, alternative = "greater")
print(paste("Productividad promedio:", round(media_productividad * 100, 2), "%"))
## [1] "Productividad promedio: 73.51 %"
print(test_hipotesis)
##
## One Sample t-test
##
## data: garments_worker_productivity_clean$actual_productivity
## t = 16.872, df = 1196, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 0.65
## 95 percent confidence interval:
## 0.7267891 Inf
## sample estimates:
## mean of x
## 0.7350911
Planteamiento: “El tiempo estándar (SMV) promedio por tarea es mayor a 25 minutos”
media_smv <- mean(garments_worker_productivity_clean$smv, na.rm = TRUE)
test_smv <- t.test(garments_worker_productivity_clean$smv,
mu = 25, alternative = "greater")
print(paste("SMV promedio:", round(media_smv, 2), "minutos"))
## [1] "SMV promedio: 15.06 minutos"
print(test_smv)
##
## One Sample t-test
##
## data: garments_worker_productivity_clean$smv
## t = -31.419, df = 1196, p-value = 1
## alternative hypothesis: true mean is greater than 25
## 95 percent confidence interval:
## 14.5415 Inf
## sample estimates:
## mean of x
## 15.06217
Planteamiento: “Más del 70% de los equipos con más de 40 trabajadores logran su objetivo de productividad”
equipos_grandes <- garments_worker_productivity_clean %>%
filter(no_of_workers > 40) %>%
mutate(cumple_objetivo = ifelse(actual_productivity >= targeted_productivity, 1, 0))
proporcion_cumple <- mean(equipos_grandes$cumple_objetivo, na.rm = TRUE)
n_equipos_grandes <- nrow(equipos_grandes)
test_proporcion <- prop.test(x = sum(equipos_grandes$cumple_objetivo, na.rm = TRUE),
n = n_equipos_grandes,
p = 0.70, alternative = "greater")
print(paste("Equipos grandes que cumplen objetivo:", round(proporcion_cumple * 100, 2), "%"))
## [1] "Equipos grandes que cumplen objetivo: 80.88 %"
print(test_proporcion)
##
## 1-sample proportions test with continuity correction
##
## data: sum(equipos_grandes$cumple_objetivo, na.rm = TRUE) out of n_equipos_grandes, null probability 0.7
## X-squared = 31.598, df = 1, p-value = 9.482e-09
## alternative hypothesis: true p is greater than 0.7
## 95 percent confidence interval:
## 0.7793237 1.0000000
## sample estimates:
## p
## 0.8087719
Planteamiento: “Existe diferencia significativa en la productividad real entre los departamentos de sewing y finishing”
productividad_sewing <- garments_worker_productivity_clean %>%
filter(department == "sewing") %>%
pull(actual_productivity)
productividad_finishing <- garments_worker_productivity_clean %>%
filter(department == "finishing") %>%
pull(actual_productivity)
test_departamentos <- t.test(productividad_sewing, productividad_finishing,
alternative = "two.sided")
print(paste("Productividad Sewing:", round(mean(productividad_sewing, na.rm = TRUE) * 100, 2), "%"))
## [1] "Productividad Sewing: 72.2 %"
print(paste("Productividad Finishing:", round(mean(productividad_finishing, na.rm = TRUE) * 100, 2), "%"))
## [1] "Productividad Finishing: 75.3 %"
print(test_departamentos)
##
## Welch Two Sample t-test
##
## data: productividad_sewing and productividad_finishing
## t = -2.9314, df = 926.17, p-value = 0.003458
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.05165005 -0.01022522
## sample estimates:
## mean of x mean of y
## 0.7220130 0.7529507
Planteamiento: “Existen diferencias significativas en el tiempo estándar (SMV) entre los diferentes trimestres”
# Código para demostración
anova_trimestres <- aov(smv ~ quarter, data = garments_worker_productivity_clean)
summary(anova_trimestres)
## Df Sum Sq Mean Sq F value Pr(>F)
## quarter 4 232 57.93 0.483 0.748
## Residuals 1192 142994 119.96
# Si ANOVA es significativo, hacer comparaciones por pares
if(summary(anova_trimestres)[[1]][["Pr(>F)"]][1] < 0.05) {
tukey_result <- TukeyHSD(anova_trimestres)
print("Diferencias entre trimestres (Tukey):")
print(tukey_result)
}