PROBABILIDAD Y ESTADISTICA 1
UNIVERSIDAD DEL ROSARIO
R es un conjunto integrado de programas para manipulación de datos, cálculos, gráficos y análisis estadísticos. Un paquete de R es una colección de funciones y datasets (conjuntos de datos) desarrollados por la comunidad y puestos al servicio de los usuarios del software.
Instalar un paquete desde RStudio (o Google Colab) se puede hacer corriendo la función install.packages() en un bloque de código. Por ejemplo,
#install.packages("psych")
Una vez instalado el paquete, es necesario cargarlo en la sesión actual
library(psych)
library(readr)
garments_worker_productivity_limpio <- read_csv("C:/Users/valentina felipe/Desktop/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.
Como ya habiamos cargado la base de datos “garments_worker_productivity” podemos empezar
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
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:
date: Fecha de registro de los datos en formato MM/DD/AAAA.
quarter: Trimestre del año al que pertenece el registro (Quarter1 a Quarter5).
day: Día de la semana en que se registraron los datos (Monday, Tuesday, etc.).
department: Departamento de trabajo (sweing/costura o finishing/acabados).
team: Número identificador del equipo de trabajo (valores del 1 al 12).
no_of_workers: Número de trabajadores en el equipo ese día.
targeted_productivity: Productividad objetivo establecida para el equipo (valores entre 0.35 y 0.8).
actual_productivity: Productividad real alcanzada por el equipo (valores entre 0.34 y 1.1).
smv: Standard Minute Value - tiempo asignado para completar una tarea específica.
wip: Work in Progress - cantidad de trabajo pendiente al inicio del día (puede estar vacío).
over_time: Horas extras trabajadas por el equipo.
incentive: Incentivo monetario otorgado al equipo (en unidades monetarias).
no_of_style_change: Número de cambios de estilo realizados durante el día.
idle_time: Tiempo de inactividad registrado (en minutos).
idle_men: Número de trabajadores que estuvieron inactivos durante el día
La librería tidyverse es un metapaquete diseñado para
una óptima manipulación de grandes conjuntos de datos. Primero debemos
instalarla
#install.packages("tidyverse")
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>
Una variable estadística es cualquier característica medida en el estudio que puede variar entre registros. En este dataset, las variables se clasifican en:
Discretas: Toman valores enteros específicos
(ej: no_of_workers,
no_of_style_change).
Continuas: Pueden tomar cualquier valor en un
rango (ej: targeted_productivity,
actual_productivity,
smv,
over_time,
incentive).
Nominales: Sin orden inherente (ej:
department - “sweing” o “finishing”,
day - días de la semana).
Ordinales: Con un orden lógico (ej:
quarter - Quarter1 a Quarter5).
Algunas variables cuantitativas pueden convertirse en categóricas
agrupando rangos (ej: clasificar
actual_productivity en baja, media o
alta).
Volviendo a los datos, veamos su estructura y dimensión:
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
unique(garments_worker_productivity_limpio$department)
## [1] sewing finishing
## Levels: finishing sewing
Un estadígrafo es una medida numérica que se calcula sobre un conjunto de datos y sirve para resumir la información contenida en el mismo. Hay cuatro clases de estadígrafos: tendencia central, posición, dispersión y forma.
Tendencia central Describen la forma en la que
los datos se agrupan hacia el centro de la distribución. Las más
importantes son: media, mediana y moda.
Algunas observaciones:
Sobre la media:
La media es única para cualquier conjunto de datos y tiene la misma unidad de medida de estos. Es conocida comúnmente como el promedio.
No necesariamente es uno de los valores del conjunto.
Es muy sensible a datos atípicos (valores extemos).
Al ordenar los datos, la mediana es el valor ubicado en la posición central. Es decir, es el dato que deja el 50% de los datos por encima y 50% por debajo.
No es susceptible ante la presencia de valores extremos. (Medida robusta).
La mediana siempre es única.
Puede o no ser un valor dentro del conjunto de datos.
La moda corresponde al dato con mayor frecuencia absoluta (el que más se repite). No necesariamente es única. Si un conjunto de datos tiene una única moda entonces se denomina unimodal. Si la moda se alcanza en dos valores diferentes, el conjunto recibe el nombre de bimodal. Si hay 3 o más modas, los datos se referencian como multimodales.
No es una medida de tendencia central de único valor.
No se afecta por valores extremos.
Siempre es un valor del conjunto de datos.
Las funciones mean(), median() y
mfv() de R realizan estos cálculos. Para usar el comando de
la moda es necesario instalar el paquete modeest
#install.packages("modeest")
library(modeest)
## Registered S3 method overwritten by 'rmutil':
## method from
## plot.residuals psych
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 (X̄) 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:
X̄: Media muestral (usada aquí, pues los datos representan una muestra de producción)
μ: Media poblacional (no aplica en este caso)
y se calculan con la función quantile() que, además,
proporciona los valores mínimo y máximo del conjunto.
quantile(garments_worker_productivity_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.
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
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
hist() que
permite trazar el histograma del conjunto de datos; sin embargo, aquí
vamos a usar el entorno gráfico de R que provee el
paquete ggplot2 incluido en tidyversegarments_worker_productivity_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
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.
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.
g1 <- ggplot(garments_worker_productivity_limpio, aes(x = actual_productivity)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "skyblue", color = "black", alpha = 0.7) +
stat_function(fun = dnorm,
args = list(mean = mean(garments_worker_productivity_limpio$actual_productivity),
sd = sd(garments_worker_productivity_limpio$actual_productivity)),
color = "red", size = 1) +
labs(title = "Distribucion de Productividad Real", x = "Productividad Real", y = "Densidad") +
theme_minimal()
## 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.
print(g1)
g2 <- ggplot(garments_worker_productivity_limpio, aes(y = actual_productivity)) +
geom_boxplot(fill = "lightgreen", alpha = 0.5) +
labs(title = "Boxplot de Productividad Real", y = "Productividad Real") +
theme_minimal()
print(g2)
Observaciones: La productividad real tiene una media de 0.72 y mediana de 0.76, lo cual sugiere ligera asimetría negativa. El coeficiente de variación es de aproximadamente 20%, lo que indica una dispersión moderada en relación con la media. El histograma muestra una distribución ligeramente sesgada a la izquierda. Esta variable no parece seguir una distribución normal, lo cual se refuerza con la asimetría negativa de -0.63 y curtosis menor que 3. El boxplot evidencia algunos valores atípicos hacia la izquierda
ggplot(garments_worker_productivity_limpio, aes(x = targeted_productivity)) +
geom_histogram(binwidth = 0.02, fill = "lightgreen", color = "darkgreen") +
labs(title = "Distribucion de la productividad objetivo",
x = "Productividad Objetivo",
y = "Frecuencia") +
theme_minimal(base_size = 14)
Observaciones: La productividad objetivo está fuertemente concentrada en 0.75, lo cual se evidencia en un pico muy marcado en el histograma. Esto indica que la meta de producción es prácticamente uniforme para la mayoría de los equipos. La distribución presenta asimetría negativa (cola hacia la izquierda), debido a algunos pocos registros con metas considerablemente más bajas. El coeficiente de variación (CV) es relativamente bajo, y al ser menor al 20 %, se puede inferir que los valores están cercanos a la media.
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
# Mostrar el resultado redondeado
cv_texto <- paste("Coeficiente de Variacion de Productividad Objetivo:", round(cv_target, 2), "%")
print(cv_texto)
## [1] "Coeficiente de Variacion de Productividad Objetivo: 13.42 %"
# Figura 5: Boxplot de tiempo de inactividad
g5 <- ggplot(garments_worker_productivity_limpio, aes(x = "", y = idle_time)) +
geom_boxplot(fill = "lightgray", outlier.color = "red", outlier.shape = 16) +
labs(title = "Boxplot del tiempo de inactividad",
x = "",
y = "Idle time") +
theme_minimal(base_size = 14)
# Mostrar boxplot
print(g5)
Observaciones: Esta variable muestra una distribución fuertemente asimétrica positiva: la mayoría de los registros tienen tiempos de inactividad bajos, pero existen casos extremos que elevan la media. El CV es muy alto (> 2), lo cual indica gran dispersión relativa. Esto podría estar relacionado con interrupciones puntuales en el flujo de producción.
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 = "Distribucion 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
library(readr)
garments_worker_productivity_limpio <- read_csv("C:/Users/valentina felipe/Desktop/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)
# Extraer la variable de interés
prod <- garments_worker_productivity_limpio$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.695071Como 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
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
# Leer el archivo CSV
library(readr)
garments_worker_productivity_limpio <- read_csv("C:/Users/valentina felipe/Desktop/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)
# Ver las primeras filas
head(garments_worker_productivity_limpio)
## # A tibble: 6 × 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 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>
# Filtrar subpoblación: equipos del departamento "sewing"
sewing <- subset(garments_worker_productivity_limpio, 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(garments_worker_productivity_limpio, department == "sewing")$actual_productivity
finishing <- subset(garments_worker_productivity_limpio, 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(garments_worker_productivity_limpio, department == "sewing")$actual_productivity
finishing <- subset(garments_worker_productivity_limpio, 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.
El análisis de regresión lineal es una técnica estadística que permite explorar y cuantificar la relación entre una variable dependiente y una o más variables independientes. Su objetivo principal es construir un modelo que explique cómo varía una variable en función de otra, a partir de una recta de mejor ajuste. En el caso de nuestra base de datos, este análisis nos permite evaluar cómo ciertos factores, como los incentivos laborales, influyen sobre la productividad real de los trabajadores en una línea de producción. A través del modelo ajustado, es posible no solo entender esta relación, sino también hacer predicciones y tomar decisiones basadas en evidencia cuantitativa.
# Cargar paquetes necesarios
library(ggplot2)
# Leer los datos
garments_worker_productivity_limpio <- read_csv("C:/Users/valentina felipe/Desktop/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)
# Asegurar que no hay NA en las columnas que vamos a usar es decir incentive e actual_productivity
garments_worker_productivity_limpio <- na.omit(garments_worker_productivity_limpio[, c("actual_productivity", "incentive")])
# Filtrar datos con incentivos razonables ya que estaba dando graficas raras por nuestros datos ser tan dispersos entre ellos
data_filtrada <- subset(garments_worker_productivity_limpio, incentive < 200)
# Nuevo gráfico sin outliers
ggplot(data_filtrada, aes(x = actual_productivity, y = incentive)) +
geom_point(alpha = 0.6, color = "darkgreen") +
geom_smooth(method = "lm", se = TRUE, color = "red", fill = "orange") +
labs(
title = "Productividad Real vs Incentivo ",
x = "Productividad Real",
y = "Incentivo Laboral"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# Modelo de regresión lineal simple
regresion1 <- lm(actual_productivity ~ incentive, data = garments_worker_productivity_limpio)
# Resumen del modelo
summary(regresion1)
##
## Call:
## lm(formula = actual_productivity ~ incentive, data = garments_worker_productivity_limpio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.54788 -0.08366 0.03694 0.11276 0.38853
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.319e-01 5.172e-03 141.515 < 2e-16 ***
## incentive 8.337e-05 3.142e-05 2.654 0.00807 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.174 on 1195 degrees of freedom
## Multiple R-squared: 0.005858, Adjusted R-squared: 0.005026
## F-statistic: 7.042 on 1 and 1195 DF, p-value: 0.00807
En este análisis se realizó una regresión lineal simple para evaluar la relación entre la variable independiente actual_productivity y la variable dependiente incentive. Primero, se representaron gráficamente los datos mediante un diagrama de dispersión, lo que permitió visualizar una posible relación lineal entre ambas variables. Luego, se ajustó el modelo con la función lm() de R, y se obtuvo un resumen estadístico que incluye los coeficientes estimados, el valor de R², los errores estándar y los niveles de significancia. Estos resultados permiten interpretar en qué medida el incentivo laboral influye en la productividad real de los trabajadores.
El análisis de regresión lineal múltiple es una técnica estadística que permite examinar la relación entre una variable dependiente y dos o más variables independientes. A diferencia de la regresión simple, este enfoque considera múltiples factores simultáneamente, lo que brinda una comprensión más completa del fenómeno estudiado. En el contexto de nuestra base de datos, esta metodología permite analizar cómo distintas variables como los incentivos laborales, el número de trabajadores o las horas extra influyen conjuntamente en la productividad real, facilitando una interpretación más precisa y útil para la toma de decisiones.
# Cargar datos
df <- read.csv("garments_worker_productivity_limpio.csv")
# Crear modelo de regresión lineal múltiple
modelo_multiple <- lm(actual_productivity ~ incentive + no_of_workers + wip + idle_time + idle_men + over_time, data = df)
summary(modelo_multiple)
##
## Call:
## lm(formula = actual_productivity ~ incentive + no_of_workers +
## wip + idle_time + idle_men + over_time, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.34846 -0.02695 0.01125 0.04095 0.29551
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.799e-01 1.962e-02 29.553 < 2e-16 ***
## incentive 4.461e-03 1.275e-04 35.000 < 2e-16 ***
## no_of_workers -2.420e-04 3.862e-04 -0.627 0.5311
## wip -3.844e-07 1.870e-06 -0.206 0.8372
## idle_time 5.126e-04 2.450e-04 2.092 0.0368 *
## idle_men -5.326e-03 9.802e-04 -5.433 7.71e-08 ***
## over_time -6.204e-06 1.282e-06 -4.840 1.61e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.08894 on 684 degrees of freedom
## (506 observations deleted due to missingness)
## Multiple R-squared: 0.6727, Adjusted R-squared: 0.6698
## F-statistic: 234.3 on 6 and 684 DF, p-value: < 2.2e-16
En el presente análisis se construyó un modelo de regresión lineal
múltiple con el objetivo de explicar la productividad real de los
trabajadores (actual_productivity) a partir de diversas
variables cuantitativas disponibles en la base de datos, tales como el
incentivo laboral, número de trabajadores, trabajo en proceso
(wip), tiempo ocioso, número de trabajadores ociosos e
incluso las horas extra trabajadas. Este tipo de modelo permite evaluar
el efecto simultáneo de varias variables sobre la variable de interés,
brindando una visión más completa y realista del fenómeno. A través del
resumen del modelo, se analizan los coeficientes estimados, su
significancia estadística (valor p), el ajuste general del
modelo (mediante el R²) y se identifican las variables que tienen un
impacto significativo sobre la productividad. Este enfoque estadístico
no solo permite identificar relaciones relevantes, sino que también
contribuye a la toma de decisiones basada en datos dentro del contexto
organizacional.
# Cargar librerías necesarias
library(car)
## Cargando paquete requerido: carData
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
## The following object is masked from 'package:psych':
##
## logit
library(tidyverse)
# Cargar datos
df <- read.csv("garments_worker_productivity_limpio.csv")
# Crear modelo de regresión lineal múltiple
modelo_multiple <- lm(actual_productivity ~ incentive + no_of_workers + wip + idle_time + idle_men + over_time, data = df)
# Gráficos de componentes + residuos
crPlots(modelo_multiple)
En la imagen se presentan los Component + Residual Plots (también conocidos como partial residual plots) que permiten analizar la relación individual entre cada variable independiente y la variable dependiente, manteniendo constantes las demás variables del modelo de regresión lineal múltiple. Cada gráfico muestra cómo se comportan los residuos del modelo respecto a una de las variables predictoras, añadiendo la contribución parcial de dicha variable. La línea azul representa la tendencia ajustada y ayuda a visualizar si existe una relación lineal, no lineal o ausencia de relación. Estas gráficas son útiles para diagnosticar si cada predictor tiene una relación lineal adecuada con la variable respuesta y si el modelo múltiple está correctamente especificado.