Line Production Analysis Report

Introduction

This report presents an analysis of production performance across three production sites of Ahuja Radios:
- Sunwood
- Royal Industries
- Sigma Technologies

The goal is to evaluate productivity, utilization, and the impact of recommended improvements.
The analysis is based on production data (monthly outputs, cycle times, workforce, and utilization).


#
# Internship Project - Line Production Analysis 
# Author: Rijul Bajaj
#
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.2
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
# Monthly output and capacity

df<-data.frame(
  site = c("Sunwood", "Royal Industries","Sigma Technologies"),
  avg_monthly_output=c(9000,14000,13500),    # units/month
  monthly_capacity=c(15000,16000,15000),  # capacity/month
  shift_hours=c(200,220,210)      # Total hours per month
)

df<-df %>%
  mutate(
    units_per_hour = avg_monthly_output/shift_hours,
    utilization_pct = avg_monthly_output/monthly_capacity
  )
df
##                 site avg_monthly_output monthly_capacity shift_hours
## 1            Sunwood               9000            15000         200
## 2   Royal Industries              14000            16000         220
## 3 Sigma Technologies              13500            15000         210
##   units_per_hour utilization_pct
## 1       45.00000           0.600
## 2       63.63636           0.875
## 3       64.28571           0.900

Productivity and Utilization (Before)

# Visual Representation
# Monthly Output By Site
ggplot(df,aes(site,avg_monthly_output))+
  geom_col(fill="skyblue")+
  labs(title = "Monthly Output By Site",y = "Units per Month", x = NULL)+
  theme_minimal()+
  theme(axis.text.x = element_text(angle=90,vjust = 0.5,hjust = 1))+
  coord_cartesian(ylim=c(0,16000))

# Utilization By Site
ggplot(df,aes(site,utilization_pct))+
  geom_col(fill="lightgreen")+
  labs(title = "Utilization By Site",y = "Utlization", x = NULL)+
  geom_text(aes(label =percent(utilization_pct,accuracy=0.1)),
            vjust=-0.3,size=3)+
  scale_y_continuous(labels = percent,limits = c(0,1.2))+
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90,vjust = 0.5,hjust = 1)) +
  coord_cartesian(ylim=c(0,1))

# Scatterplot: Output VS Units per Hour
ggplot(df,aes(units_per_hour,avg_monthly_output,label=site))+
  geom_point(size=3)+
  geom_text(hjust=-0.1,vjust=0.5,size=3)+
  labs(title = "Output VS Productivity",x="Units Per Hour",y="Monthly Output")+
  coord_cartesian(xlim=c(35,80),ylim = c(5000,15000))+
  theme_minimal()

# Bar Chart: Distribution of Productivity

ggplot(df, aes(x = site, y = units_per_hour)) +
  geom_col(fill = "violet") +
  labs(
    title = "Productivity (Units/Hour) by Site",
    x = "Production Site",
    y = "Units per Hour"
  ) +
  coord_cartesian(ylim = c(0, 80)) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

Improvements Applied

Based on production line observations and utilization levels, the following improvement assumptions were applied to simulate an after scenario:

These assumptions were used to project the after monthly output, productivity, and utilization figures presented in the following analysis.

# AFTER IMPROVEMENT SCENARIO

# Assumed improvements from recommendations (tune as needed)
# Sunwood: +20% (tracking + movers + staggered/rotating lines)
# Royal:   +7%  (live tracking + tighter QA discipline)
# Sigma:   +5%  (already efficient; small balancing + tracking)
improve_pct<-c(0.2,0.07,0.05)

output_after<-round(df$avg_monthly_output*(1+improve_pct))    # Computing After outputs
output_after<-pmin(output_after,df$monthly_capacity)   # can't exceed capacity

units_per_hour_after<-output_after/df$shift_hours   # Computing productivity and utilization AFTER
utilization_after_pct<-(output_after/df$monthly_capacity)

Comparison Table: Before vs After

# BEFORE & AFTER Comparison table

comparison<-df %>%
  transmute(
    site,
    output_before = avg_monthly_output,
    output_after = output_after,
    capacity = monthly_capacity,
    hours_month = shift_hours,
    units_per_hour_before = round(units_per_hour,2),
    units_per_hour_after = round(units_per_hour_after,2),
    utilization_pct_before = round(100*utilization_pct,1),
    utilization_pct_after = round(100*utilization_after_pct,1)
    
  )
comparison
##                 site output_before output_after capacity hours_month
## 1            Sunwood          9000        10800    15000         200
## 2   Royal Industries         14000        14980    16000         220
## 3 Sigma Technologies         13500        14175    15000         210
##   units_per_hour_before units_per_hour_after utilization_pct_before
## 1                 45.00                54.00                   60.0
## 2                 63.64                68.09                   87.5
## 3                 64.29                67.50                   90.0
##   utilization_pct_after
## 1                  72.0
## 2                  93.6
## 3                  94.5

Grouped Bar: Monthly Output (Before vs After)

# PLOTS: BEFORE vs AFTER
# Grouped Bar: monthly output (Before vs After)
df_out <- rbind(
  data.frame(site = df$site, group = "Before", output = df$avg_monthly_output),
  data.frame(site = df$site, group = "After",  output = output_after)
)
ggplot(df_out,aes(site,output,fill=group))+
  geom_col(position = "dodge")+
  geom_text(aes(label=output),
            position = position_dodge(0.9),vjust = -0.4, size = 3)+
  scale_fill_manual(values = c(Before="lightblue",After="steelblue"))+
  labs(title = "Monthly Output By Site (Before and After)",
       y="Units Per Month",x=NULL,fill=NULL)+
  coord_cartesian(ylim=c(0,16000))+
  theme_minimal()+
  theme(axis.text.x = element_text(angle=90,vjust=0.5,hjust=1))

Grouped Bar: Utilization % (Before vs After)

# Grouped Bar: Utilization % (Before vs After)
df_util<- rbind(
  data_frame(site=df$site,group="Before",value=df$utilization_pct),
  data.frame(site=df$site,group="After",value=output_after/df$monthly_capacity)
)
## Warning: `data_frame()` was deprecated in tibble 1.1.0.
## ℹ Please use `tibble()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
ggplot(df_util,aes(site,value,fill=group))+
  geom_col(position="dodge")+
  geom_text(aes(label=percent(value,accuracy = 0.1)),
            position=position_dodge(width = 0.9),vjust=-0.4,size=3)+
  scale_y_continuous(labels=percent,limits = c(0,1.2))+
  scale_fill_manual(values = c(Before="palegreen",After="darkgreen"))+
  labs(title = "Utilization By Site (Before and After)",
       y="Utilization",x=NULL,fill=NULL)+
  theme_minimal()+
  theme(axis.text.x=element_text(angle=90,vjust = 0.5,hjust=1))+
  coord_cartesian(ylim=c(0,1))

Scatter: Output vs Units/Hour (Before vs After)

# Scatter: Output vs Units/Hour (Before vs After)
df_all<-rbind(
  data.frame(
    site=df$site,
    group="Before",
    units_per_hour=df$units_per_hour,
    avg_monthly_output=df$avg_monthly_output),
  data.frame(
    site=df$site,
    group="After",
    units_per_hour=units_per_hour_after,
    avg_monthly_output=output_after))
df_all$group<-factor(df_all$group,levels=c("Before","After"))
ggplot(df_all,aes(units_per_hour,avg_monthly_output,
                  color=group,shape=group,label=site))+
  geom_line(aes(group = site,linetype = "dostdash",color="black"))+
  geom_point(size=3)+
  geom_text(aes(label=site),
            hjust=-0.1,vjust=0.5,size=3)+
  scale_color_manual(values = c(Before="tomato",After="royalblue"))+
  labs(title = "Output VS Productivity (Before and After)",
       y="Monthly Output", x="Units Per Hour",color=NULL,shape=NULL)+
  coord_cartesian(xlim = c(45,80),ylim=c(0,16000))+
  theme_minimal()