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

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

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:

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 pip

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>

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:

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

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
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 () 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:

  • : 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_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     
## 
  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_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] 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_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

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

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

Exploración de graficos en R pt1

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

  1. Diagrama de dispersión: es una representación gráfica que permite analizar la relación entre dos variables cuantitativas al ubicar los datos como puntos en un plano cartesiano. En este tipo de gráfico se puede identificar si existe una correlación positiva, negativa o nula entre las variables, así como la intensidad de dicha relación. También es útil para detectar tendencias generales, patrones de comportamiento y posibles valores atípicos. En el caso de tu base de datos, al comparar la productividad real con la productividad objetivo, el diagrama de dispersión ayuda a visualizar qué tan alineados están los resultados obtenidos frente a las metas propuestas.
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.

  1. Grafico de violin: es una herramienta útil porque permite analizar y comparar la distribución de la productividad real entre los departamentos de sweing y finishing. A diferencia de un gráfico de barras o un simple boxplot, este tipo de visualización muestra no solo la mediana y los cuartiles, sino también la forma de la distribución de los datos, evidenciando si la productividad se concentra en ciertos valores o si presenta variaciones amplias. De esta manera, resulta más claro identificar diferencias entre los departamentos, ya que se puede observar tanto el nivel promedio de productividad como la dispersión y posibles patrones particulares en cada área de trabajo.undef
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.

  1. Boxplot: Es una herramienta gráfica que se utiliza para resumir y analizar la distribución de una variable numérica, mostrando de manera clara su mediana, los cuartiles y la dispersión de los datos. Además, permite identificar rápidamente la presencia de valores atípicos que se alejan del comportamiento general. Gracias a esta representación, es posible comparar grupos o categorías y detectar diferencias en la variabilidad y tendencia central, lo que lo convierte en un recurso muy útil para analizar la homogeneidad de los datos y resaltar patrones que no serían tan evidentes en medidas numéricas simples.
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 $

  1. Grafico de barras apiladas: sirve para mostrar la composición de un total y la proporción de sus componentes dentro de cada categoría principal
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.

Estadisticos descriptivos:

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.

Herramientas estadisticas:

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

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_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 :)

Exploración de graficos en R pt2

  1. Grafico 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_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.

  1. Grafico de barras de frecuencias:
  • GRAFICO DE BARRAS FRECUENCIA DE REGISTROS POR DEPARTAMENTO
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).

  • GRAFICO DE BARRAS FRECUENCIA DE REGISTRO POR CUATRIMESTRE
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

  • GRAFICO DE BARRAS FRECUENCIA DE REGISTRO POR DIA DE LA SEMANA
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.

  • GRAFICO DE BARRAS FRECUENCIA DE REGISTRO POR EQUIPO
# 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.

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

Analisis de Productividad real por departamento:

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

  • Diagrama de dispersion entre horas extras trabajas y productividad real
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.

1. 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_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.

Analisis de horas extra por dia de la semana:

1. 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_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))

1.2 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_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()

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

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

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

  • 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

1. Hipótesis sobre Parámetros Individuales (Población Completa)

Hipótesis 1: Productividad Promedio

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

Hipótesis 2: Tiempo de Tareas

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

2. Hipótesis sobre Subpoblación (Equipos Grandes)

Hipótesis 3: Equipos con Más de 40 Trabajadores

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

3. Hipótesis de Comparación entre Dos Poblaciones

Hipótesis 4: Productividad entre Departamentos

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

Hipótesis 5: Tiempo de Tareas entre Trimestres

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