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