VALENTINA MORENO RODRIGUEZ
JUAN DIEGO GARAY
KEVIN TOCUA

PROBABILIDAD Y ESTADISTICA 1

UNIVERSIDAD DEL ROSARIO

Introducción a R

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)

Como ya habiamos cargado la base de datos “garments_worker_productivity” podemos empezar

Base de Datos de Productividad Textil

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

library(readr)
garments_worker_productivity_limpio <- read_csv("garments_worker_productivity_limpio.csv")
## Rows: 1197 Columns: 15
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (4): date, quarter, department, day
## dbl (11): team, targeted_productivity, smv, wip, over_time, incentive, idle_...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(garments_worker_productivity_limpio)
head(garments_worker_productivity_limpio,10) #Vemos las primeras 10 filas
## # A tibble: 10 × 15
##    date     quarter  department day       team targeted_productivity   smv   wip
##    <chr>    <chr>    <chr>      <chr>    <dbl>                 <dbl> <dbl> <dbl>
##  1 1/1/2015 Quarter1 sewing     Thursday     8                  0.8  26.2   1108
##  2 1/1/2015 Quarter1 finishing  Thursday     1                  0.75  3.94    NA
##  3 1/1/2015 Quarter1 sewing     Thursday    11                  0.8  11.4    968
##  4 1/1/2015 Quarter1 sewing     Thursday    12                  0.8  11.4    968
##  5 1/1/2015 Quarter1 sewing     Thursday     6                  0.8  25.9   1170
##  6 1/1/2015 Quarter1 sewing     Thursday     7                  0.8  25.9    984
##  7 1/1/2015 Quarter1 finishing  Thursday     2                  0.75  3.94    NA
##  8 1/1/2015 Quarter1 sewing     Thursday     3                  0.75 28.1    795
##  9 1/1/2015 Quarter1 sewing     Thursday     2                  0.75 19.9    733
## 10 1/1/2015 Quarter1 sewing     Thursday     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>
tail(garments_worker_productivity_limpio) #Vemos las últimas 6 filas
## # A tibble: 6 × 15
##   date      quarter  department day       team targeted_productivity   smv   wip
##   <chr>     <chr>    <chr>      <chr>    <dbl>                 <dbl> <dbl> <dbl>
## 1 3/11/2015 Quarter2 sewing     Wednesd…     7                  0.65  30.5   935
## 2 3/11/2015 Quarter2 finishing  Wednesd…    10                  0.75   2.9    NA
## 3 3/11/2015 Quarter2 finishing  Wednesd…     8                  0.7    3.9    NA
## 4 3/11/2015 Quarter2 finishing  Wednesd…     7                  0.65   3.9    NA
## 5 3/11/2015 Quarter2 finishing  Wednesd…     9                  0.75   2.9    NA
## 6 3/11/2015 Quarter2 finishing  Wednesd…     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:

Variables de Identificación y Temporalidad

  • 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.).

Variables Organizacionales

  • 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.

Variables de Producción

  • 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.

Variables de Tiempo Inactivo

  • idle_time: Tiempo de inactividad registrado (en minutos).

  • idle_men: Número de trabajadores que estuvieron inactivos durante el día

Operador pipe

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")

y luego cargarla

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 pipe %>% de la siguiente manera

garments_worker_productivity_limpio %>% head(10)
## # A tibble: 10 × 15
##    date     quarter  department day       team targeted_productivity   smv   wip
##    <chr>    <chr>    <chr>      <chr>    <dbl>                 <dbl> <dbl> <dbl>
##  1 1/1/2015 Quarter1 sewing     Thursday     8                  0.8  26.2   1108
##  2 1/1/2015 Quarter1 finishing  Thursday     1                  0.75  3.94    NA
##  3 1/1/2015 Quarter1 sewing     Thursday    11                  0.8  11.4    968
##  4 1/1/2015 Quarter1 sewing     Thursday    12                  0.8  11.4    968
##  5 1/1/2015 Quarter1 sewing     Thursday     6                  0.8  25.9   1170
##  6 1/1/2015 Quarter1 sewing     Thursday     7                  0.8  25.9    984
##  7 1/1/2015 Quarter1 finishing  Thursday     2                  0.75  3.94    NA
##  8 1/1/2015 Quarter1 sewing     Thursday     3                  0.75 28.1    795
##  9 1/1/2015 Quarter1 sewing     Thursday     2                  0.75 19.9    733
## 10 1/1/2015 Quarter1 sewing     Thursday     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>

Variables Estadísticas en el Dataset de Productividad Textil

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:

1. Variables Cuantitativas (numéricas)

  • 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).

2. Variables Cualitativas (categóricas)

  • 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).

Nota importante!

Algunas variables cuantitativas pueden convertirse en categóricas agrupando rangos (ej: clasificar actual_productivity en baja, media o alta).

Tipos de variables en R

Volviendo a los datos, veamos su estructura y dimensión:

garments_worker_productivity_limpio%>% str() #veamos su estructura y dimensión:
## spc_tbl_ [1,197 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ date                 : chr [1:1197] "1/1/2015" "1/1/2015" "1/1/2015" "1/1/2015" ...
##  $ 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_character(),
##   ..   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>
garments_worker_productivity_limpio %>% 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

garments_worker_productivity_limpio %>% 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_limpio[,c("quarter", "department", "day", "team", "no_of_style_change")] <- 
  lapply(garments_worker_productivity_limpio[,c("quarter", "department", "day", "team", "no_of_style_change")], as.factor)

veamos de nuevo la estructura

garments_worker_productivity_limpio%>% str()
## spc_tbl_ [1,197 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ date                 : chr [1:1197] "1/1/2015" "1/1/2015" "1/1/2015" "1/1/2015" ...
##  $ 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_character(),
##   ..   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(). Por ejemplo,

garments_worker_productivity_limpio %>% 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_limpio %>% count(department)
## # A tibble: 2 × 2
##   department     n
##   <fct>      <int>
## 1 finishing    506
## 2 sewing       691
  • Tratamiento de datos faltantes, limpieza y codificacion: Después de un proceso inicial y análisis se incluyen valores faltantes como la variable Wip que presenta varios valores ausentes, por ende se decide si agregarlos o eliminarlos según proporción y relevancia al caso; En cuanto a limpieza se identifican esos errores o inconsistencias en variables numéricas y categóricas. Es decir depuramos los datos acá hay algo importante y es que se corrígela existencia de dos departamentos “Finishing” quitándole un espacio al principio de algunas, por otro lado se modifica la escritura “sweing” a “sewing” esto permite claridad en lo que se esta tratando sin repetir datos, por ultimo también como hacemos modificaciones es importante verificar la calidad esto con el fin de que se garantice que la información no se comprometa en los resultado que vaya a arrojar el estudio, ni influyan en sesgar los resultados por lo que con R studio se fue enfático al momento de hacer el cargue y visualización del CSV y comparar posteriormente de depurar.
unique(garments_worker_productivity_limpio$department)
## [1] sewing    finishing
## Levels: finishing sewing

Estadística descriptiva (variables escalares)

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.

  1. 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
mean(garments_worker_productivity_limpio$actual_productivity)
## [1] 0.7350911
median(garments_worker_productivity_limpio$actual_productivity)
## [1] 0.7733333
mean(garments_worker_productivity_limpio$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 () alcanza 0.72 (sobre un máximo de 1.0), siendo 0.80 el valor más frecuente (Moda) y 0.75 la mediana (Me). Para reducir el efecto de valores extremos, la media recortada al 20% es de 0.73, lo que indica una distribución ligeramente asimétrica hacia valores bajos.

Notación estadística:

  • : Media muestral (usada aquí, pues los datos representan una muestra de producción)

  • μ: Media poblacional (no aplica en este caso)

  1. Posición Dividen una distribución de frecuencias o conjunto de datos en partes iguales (en términos de proporción contenida en cada parte). Además permiten localizar la distribución de los datos sobre el eje horizontal.

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_limpio$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 revela que el 25% de los equipos de producción textiles operan con 23 trabajadores o menos, mientras que los equipos con más de 31 trabajadores pertenecen al cuartil superior (25% de equipos más grandes). Esto indica una distribución heterogénea en el tamaño de los equipos, donde la mayoría (50% central) trabaja con entre 24 y 31 operarios.

quantile(garments_worker_productivity_limpio$no_of_workers, c(0.1,0.26,0.78))
## 10% 26% 78% 
##   8   9  57

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_limpio %>% select(team) %>% 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
##       team    
##  2      :109  
##  8      :109  
##  1      :105  
##  4      :105  
##  9      :104  
##  10     :100  
##  (Other):565
garments_worker_productivity_limpio %>% select(wip) %>% summary()
##       wip         
##  Min.   :    7.0  
##  1st Qu.:  774.5  
##  Median : 1039.0  
##  Mean   : 1190.5  
##  3rd Qu.: 1252.5  
##  Max.   :23122.0  
##  NA's   :506

Puede aplicarse al conjunto completo y se obtiene el resumen de todas las columnas

garments_worker_productivity_limpio %>% summary() #se obtiene el resumen de todas las columnas
##      date               quarter        department         day     
##  Length:1197        Quarter1:360   finishing:506   Monday   :199  
##  Class :character   Quarter2:335   sewing   :691   Saturday :187  
##  Mode  :character   Quarter3:210                   Sunday   :203  
##                     Quarter4:248                   Thursday :199  
##                     Quarter5: 44                   Tuesday  :201  
##                                                    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     
## 

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.

  1. Dispersión Cuantifican la variabilidad de los datos y determinan qué tan alejada está la distribución de los datos con respecto a un punto de referencia como, por ejemplo, la media.
  • 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_limpio$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_limpio$team)
## [1] 6

esto 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_limpio$no_of_workers)
## [1] 492.7373

La varianza de 492.7373 en el número de trabajadores por equipo indica una alta variabilidad en los tamaños de los equipos de producción. Esto significa que la cantidad de trabajadores difiere significativamente entre equipos, con una desviación típica de aproximadamente ±22 trabajadores respecto al promedio.

sd(garments_worker_productivity_limpio$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_limpio$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_limpio$incentive)
## [1] 297.2775

La función describe() del paquete psych hace un resumen descriptivo más amplio de una variable escalar:

describe(garments_worker_productivity_limpio$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

Gráficos descriptivos (variables escalares)

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
Tabla_frec <- fdt(garments_worker_productivity_limpio$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
  1. Histograma es una representación gráfica de la distribución de frecuencias de una variable en la que se observan comportamientos de forma, dispersión y tendencia central.
    En el paquete básico que trae R está la función 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 tidyverse
garments_worker_productivity_limpio  %>% ggplot(aes(x = actual_productivity)) +
  geom_histogram(fill = "#FF9AA2", color = "#FFDAC1", bins = 30) +
  ggtitle("Histograma de Productividad Real") +
  labs(x = "Productividad Real", y = "Frecuencia") +
  theme_minimal()

ggplot(garments_worker_productivity_limpio, aes(x = no_of_workers, y = ..density..)) +
  geom_histogram(fill = "#B5EAD7",  # Verde menta
                 color = "black",
                 bins = 15) +
  geom_line(aes(x = no_of_workers,
                y = dnorm(no_of_workers, 
                          mean(no_of_workers, na.rm = TRUE), 
                          sd(no_of_workers, na.rm = TRUE))),
            color = "#8338EC",      # Púrpura
            linewidth = 1.2) +
  ggtitle("Distribución del Número de Trabajadores") +
  labs(x = "Número de trabajadores", y = "Densidad") +
  theme_minimal()
## 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.

Este gráfico muestra la distribución del número de trabajadores por equipo mediante un histograma azul claro superpuesto con una curva normal morada. Compara los datos reales con una distribución teórica normal, usando la media y desviación estándar reales.

garments_worker_productivity_limpio %>%
  ggplot(aes(x = actual_productivity, y = ..density..)) +
  geom_histogram(
    fill = "#4DB8D5",
    color = "black",
    bins = 15,
    alpha = 0.7
  ) +
  geom_line(
    aes(
      x = actual_productivity,
      y = dnorm(actual_productivity,
                mean(actual_productivity, na.rm = TRUE),
                sd(actual_productivity, na.rm = TRUE))
    ),
    color = "#E74C3C",
    linewidth = 1.2
  ) +
  ggtitle("Distribución de Productividad por Departamento") +
  labs(x = "Productividad Real", y = "Densidad") +
  facet_wrap(~department) +  # department es categórico, pero el eje X es numérico
  theme_minimal()

Este gráfico de densidad compara la distribución de la productividad real entre los departamentos de producción textil mediante histogramas y curvas normales. Cada panel muestra un departamento diferente, donde las barras azules transparentes representan la frecuencia real de los niveles de productividad, agrupados en 15 intervalos, mientras que la línea roja traza la curva de distribución normal teórica calculada a partir de la media y desviación estándar de cada departamento. 

# Estadísticos descriptivos
summary(garments_worker_productivity_limpio$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_limpio$actual_productivity) / mean(garments_worker_productivity_limpio$actual_productivity)
cv
## [1] 0.2373691
diagrama_productividad <- boxplot(garments_worker_productivity_limpio$actual_productivity, horizontal = TRUE)

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 $

head(diagrama_productividad$out, 20)
##  [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
diagrama_productividad$stats
##           [,1]
## [1,] 0.3504167
## [2,] 0.6503071
## [3,] 0.7733333
## [4,] 0.8502525
## [5,] 1.1204375

Con la función length() es posible contar la cantidad de outliers detectados

length(diagrama_productividad$out)
## [1] 54

Estadística/Analisís descriptiva (variables cualitativas)

(variables cualitativas)

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_limpio$department)
Tabla_Departamento
## 
## finishing    sewing 
##       506       691

El departamento de “finishing” (acabados) aparece registrado 506 veces y 691 para “sweing” (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 “sweing” (costura) concentra 57.73% del total.

round(prop.table(Tabla_Departamento), digits=4)
## 
## finishing    sewing 
##    0.4227    0.5773

El gráfico de barras muestra la distribución de registros de productividad por trimestre, donde cada barra vertical en tono azul claro representa la cantidad de equipos o mediciones realizadas en cada periodo. El eje X muestra los trimestres (Quarter1, Quarter2, etc.) con las etiquetas ligeramente inclinadas para mejor visualización, mientras el eje Y indica el conteo absoluto de registros.

garments_worker_productivity_limpio %>% 
  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))

garments_worker_productivity_limpio %>% 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(
  read.csv("garments_worker_productivity_limpio.csv") %>%
    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" = "#A8DADC", "sewing" = "#FBC4AB"))

Observaciones 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).

garments_worker_productivity_limpio %>%  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
ggplot(
  read.csv("garments_worker_productivity_limpio.csv") %>%
    count(quarter),
  aes(x = quarter, y = n, fill = quarter)
) +
  geom_bar(stat = "identity", width = 0.7, alpha = 0.7) +
  labs(
    title = "Frecuencia de registros por cuatrimestre",
    x = "Cuatrimestre",
    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")
  ) +
  scale_fill_manual(values = c(
    "Quarter1" = "#F4A6A6",
    "Quarter2" = "#A9CCE3",
    "Quarter3" = "#ABEBC6",
    "Quarter4" = "#D2B4DE",
    "Quarter5" = "#F9E79F"
  ))

Observaciones: 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

garments_worker_productivity_limpio %>%  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
ggplot(
  read.csv("garments_worker_productivity_limpio.csv") %>%
    count(day) %>%
    mutate(day = factor(day, levels = c("Monday", "Tuesday", "Wednesday", "Thursday", "Saturday", "Sunday"))),
  aes(x = day, 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")
  ) +
  scale_fill_manual(values = c(
    "Monday" = "#E8F8F5",
    "Tuesday" = "#58D68D",
    "Wednesday" = "#239B56",
    "Thursday" = "#82E0AA",
    "Saturday" = "#A9DFBF",
    "Sunday" = "#A3E4D7"
  ))

Observaciones: 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.

garments_worker_productivity_limpio %>%  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
ggplot(
  read.csv("garments_worker_productivity_limpio.csv") %>%
    count(team),
  aes(x = factor(team), y = n)
) +
  geom_bar(stat = "identity", width = 0.7, fill = "#7EC8E3", 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"),
    axis.title.x = element_text(face = "bold"))

Observaciones: 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.

ggplot(garments_worker_productivity_limpio, aes(department, fill=quarter)) + geom_bar() + theme(axis.text.x = element_text(angle=30))

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.

Análisis Descriptivo Bivariado Entre Variables Categóricas y Cuantitativas :

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.

ggplot(
  read.csv("garments_worker_productivity_limpio.csv"),
  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())

ggplot(
  read.csv("garments_worker_productivity_limpio.csv"),
  aes(x = quarter, fill = department)
) +
  geom_bar(position = "stack", width = 0.7) +
  labs(
  title = "Distribución de departamentos por cuatrimestre",
    x = "Cuatrimestre",
    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")
  ) +
  scale_fill_manual(values = c("finishing" = "#69C3A5", "sewing" = "#F5A488"))

Observaciones: El análisis cruzado muestra que el departamento de costura (sewing) mantiene una presencia dominante en todos los cuatrimestres, particularmente en el primero y segundo. Esto refuerza la idea de que este departamento lidera la producción en las fases iniciales del ciclo. La proporción entre departamentos se mantiene relativamente constante, sin indicios fuertes de rotación estacional entre áreas

ggplot(
  read.csv("garments_worker_productivity_limpio.csv"),
  aes(x = over_time, y = actual_productivity)
) +
  geom_point(color = "black", alpha = 0.6) +
  geom_smooth(method = "lm", color = "blue", 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'

cor(garments_worker_productivity_limpio$over_time, garments_worker_productivity_limpio$actual_productivity, use = "complete.obs")
## [1] -0.05420584

Observaciones: Existe una correlación negativa de -0.35 entre las horas extra y la productividad real. Este valor sugiere una relación inversa débil: a mayor tiempo extra, tiende a disminuir la productividad. El gráfico de dispersión confirma esta relación con una nube descendente. Esto podría deberse a fatiga acumulada o sobrecarga en los turnos con más horas.

media_target <- mean(garments_worker_productivity_limpio$targeted_productivity, na.rm = TRUE)
sd_target <- sd(garments_worker_productivity_limpio$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 %"

1. Productividad real (actual_productivity) por departamento (department) 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_limpio, 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(
  read.csv("garments_worker_productivity_limpio.csv"),
  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")
  )

Observaciones: 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.

Análisis correlación: Hay correlación lineal negativa débil y se infiere que, a medida de que aumentan horas extras la productividad disminuye ligeramente. Por lo tanto no la tenemos en cuenta ya que no afecta la investigación

cor(garments_worker_productivity_limpio$over_time, garments_worker_productivity_limpio$actual_productivity, use = "complete.obs")
## [1] -0.05420584

1. Boxplot de Productividad Real por Departamento

El boxplot presenta la distribución de la productividad real (actual_productivity) en los distintos departamentos. Cada caja representa el rango intercuartílico y la línea central indica la mediana. Se observa que el departamento de “sweing” tiene una mayor concentración de valores bajos y una gran cantidad de valores atípicos (outliers) por debajo de 0.6, lo que sugiere una variabilidad considerable en la productividad de este grupo. Por su parte, los departamentos de “finishing” muestran distribuciones más centradas y con menor presencia de valores extremos, lo que podría indicar una mayor consistencia en el desempeño de sus trabajadores.

ggplot(garments_worker_productivity_limpio, aes(x = actual_productivity)) +
  geom_histogram(aes(y = ..density..), fill = "orange", color = "black", bins = 30, alpha = 0.6) +
  geom_density(color = "brown", 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 = "brown", lines = 1): Ignoring unknown
## parameters: `lines`

2. Histograma de Productividad Real por Departamento

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_limpio, 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))

3. Boxplot de Horas Extra por Día de la Semana

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_limpio, aes(x = over_time, y = actual_productivity)) +
  geom_point(color = "orange", 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()

4. Dispersión entre Horas Extra y Productividad por Día

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_limpio, aes(x = over_time)) +
  geom_histogram(aes(y = ..density..), fill = "olivedrab3", color = "black", bins = 30, alpha = 0.5) +
  geom_density(color = "darkgreen", 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()

5. Histograma de Horas Extra por Día

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.

Planteamiento de las hipótesis:

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
datos <- read.csv("garments_worker_productivity_limpio.csv")

# Extraer la variable de interés
prod <- datos$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)

  • H₁: π ≠ 0.60 (El porcentaje de equipos que alcanza al menos 0.70 de productividad es distinto de 60% )
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

Desviación estándar (𝜎) en una subpoblación

Subpoblación: Equipos del departamento Sewing : ¿La variabilidad en la productividad real dentro del área de costura es igual a 0.18? Dentro de el proceso de costura al situarnos en Bangladesh hablamos de estándares de la industria asiática que bien se sabe es una economía de volumen, esto implica que una variación se definen márgenes aceptables de variabilidad en la productividad aceptable que no implique afectaciones económicas o que en la practica el mercado no cubra los costos de producción.

●        H₀ (Hipótesis nula): 𝜎 = 0.18
 (La desviación estándar de la productividad en el departamento “sewing” es igual a 0.18)

H₁ (Hipótesis alternativa): 𝜎 ≠ 0.18
 (La desviación estándar de la productividad en el departamento “sewing” es diferente de 0.18
 

# Cargar base de datos
datos <- read.csv("garments_worker_productivity_limpio.csv")

# Filtrar subpoblación: equipos del departamento "sewing"
sewing <- subset(datos, department == "sewing")$actual_productivity

# Parámetros de la muestra
n <- length(sewing)                  # Tamaño muestral
gl <- n - 1                          # Grados de libertad
s2 <- var(sewing)                   # Varianza muestral
s <- sd(sewing)                     # Desviación estándar muestral
sigma0 <- 0.18                      # Valor hipotético de sigma

# Estadístico Chi-cuadrado
chi_cuadrado <- gl * s2 / sigma0^2

# Valor-p (prueba bilateral)
p_valor <- 2 * min(
  pchisq(chi_cuadrado, df = gl),
  1 - pchisq(chi_cuadrado, df = gl)
)

# Intervalo de confianza para la varianza (al 95%)
li_var <- gl * s2 / qchisq(1 - 0.025, df = gl)
ls_var <- gl * s2 / qchisq(0.025, df = gl)

# Intervalo de confianza para la desviación estándar
li_sd <- sqrt(li_var)
ls_sd <- sqrt(ls_var)

# Mostrar resultados
cat(
  "n:", n,
  " Desviación estándar muestral:", round(s, 4),
  " Varianza muestral:", round(s2, 4),
  " Estadístico Chi-cuadrado:", round(chi_cuadrado, 4),
  " p-valor:", format.pval(p_valor, digits = 5),
  " IC 95% para desviación estándar: (", round(li_sd, 7), ",", round(ls_sd, 7), ")\n"
)
## n: 691  Desviación estándar muestral: 0.1548  Varianza muestral: 0.024  Estadístico Chi-cuadrado: 510.2206  p-valor: 1.0389e-07  IC 95% para desviación estándar: ( 0.1470315 , 0.1634068 )

Diferencia de medias (𝜇ₓ − 𝜇ᵧ)

●        X: Equipos del departamento sewing

●        Y: Equipos del departamento finishing

¿Existe diferencia significativa en la productividad promedio entre los dos departamentos?

●        H₀: 𝜇ₓ − 𝜇ᵧ = 0 (No hay diferencia en la productividad media entre sewing y finishing)

●       
H₁: 𝜇ₓ − 𝜇ᵧ > 0
((La productividad promedio en sewing es mayor que en finishing))

Como ambos grupos son n > 500 aplicamos TLC  (n>30), son independientes Department, H0: las varianzas son iguales       vs       H1: las varianzas son diferentes usamos F test inicialmente

# Filtrar datos por departamento
sewing <- subset(garments_worker_productivity_limpio, department == "sewing")$actual_productivity
finishing <- subset(garments_worker_productivity_limpio, department == "finishing")$actual_productivity

# Prueba F para comparar varianzas (cola derecha: var(sewing) < var(finishing))
var.test(sewing, finishing, alternative = "less")
## 
##  F test to compare two variances
## 
## data:  sewing and finishing
## F = 0.6172, num df = 690, denom df = 505, p-value = 2.136e-09
## alternative hypothesis: true ratio of variances is less than 1
## 95 percent confidence interval:
##  0.0000000 0.7067692
## sample estimates:
## ratio of variances 
##          0.6172043

Como el valor-p = 4.27e-09 es menor que 0.05, se rechaza la hipótesis nula de igualdad de varianzas.VE = FALSE

# Filtrar los datos por departamento
sewing <- subset(datos, department == "sewing")$actual_productivity
finishing <- subset(datos, department == "finishing")$actual_productivity

# Prueba de hipótesis: t-test para diferencia de medias con hipótesis unilateral (sewing > finishing)
t.test(sewing, finishing, alternative = "greater", var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  sewing and finishing
## t = -2.9314, df = 926.17, p-value = 0.9983
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  -0.04831471         Inf
## sample estimates:
## mean of x mean of y 
## 0.7220130 0.7529507

Como el valor-p obtenido en la prueba (p = 0.9983) es mayor que el nivel de significancia del 5% (α = 0.05), no se rechaza la hipótesis nula. Se concluye entonces que no existe evidencia estadística suficiente para afirmar que la productividad promedio del departamento “sewing” es mayor que la del departamento “finishing”.

En realidad, los datos muestran que el promedio en “sewing” (0.722) es menor al de “finishing” (0.753), y el intervalo de confianza del 95% para la diferencia de medias  Como el intervalo está completamente por debajo de cero, se sugiere que, si hay una diferencia, sería a favor del departamento finishing, aunque esta no fue la hipótesis alternativa originalmente planteada

Comparación de varianzas (𝜎ₓ² vs. 𝜎ᵧ²)

●        X: Departamento sewing

●        Y: Departamento finishing

¿La dispersión de la productividad varía entre departamentos?

●        H₀: 𝜎ₓ² = 𝜎ᵧ² Las varianzas de productividad en sewing y finishing son iguales)

●        (H₁: 𝜎ₓ² < 𝜎ᵧ² (Las varianzas de productividad de finishing son mayores que la de sewing)

●        H0: las varianzas son iguales       vs       H1: las varianzas son diferentes

# Filtrar los datos por departamento
sewing <- subset(datos, department == "sewing")$actual_productivity
finishing <- subset(datos, department == "finishing")$actual_productivity

# Prueba de hipótesis: t-test para diferencia de medias con hipótesis unilateral (sewing > finishing)
t.test(sewing, finishing, alternative = "greater", var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  sewing and finishing
## t = -2.9314, df = 926.17, p-value = 0.9983
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  -0.04831471         Inf
## sample estimates:
## mean of x mean of y 
## 0.7220130 0.7529507

Como el P-valor de prueba F = 4.271 e-09 podemos concluir que a una significancia alfa=0.05 rechazo Ho por lo que concluyo que las Varianzas difieren una de la otra, Por lo tanto podemos usar prueba T clásica Var_Equal False

Como el valor-p obtenido en la prueba = 2.136e-09) es mucho menor que el nivel de significancia del 5% (α = 0.05 se rechaza la hipótesis nula. Por lo tanto, se concluye ue la varianza de la productividad en el departamento finishing es significativamente mayor que en sewing. Esto indica que la productividad de los equipos en finishing presenta una dispersión considerablemente más alta, lo que puede estar reflejando mayor variabilidad en el desempeño, menor estandarización de procesos o diferencias más marcadas entre equipos dentro del departamento.