ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

精益六西格玛+Python:家电总装线效率优化实战

精益六西格玛+Python:家电总装线效率优化实战 做精益改善这么多年我越来越觉得一个尴尬的现实是很多IE工程师和六西格玛黑带不是不会分析而是被数据整理卡住了。尤其是家电这类大规模流水线制造MES系统、扫码枪、PLC、手工报表各出一份数据格式对不上、时间对不齐、口径还不统一光是把这些数据拉齐就耗掉大半天真正用来分析问题的时间反而没多少。这篇文章记录的是我近期做的一个Day18实战项目——把精益六西格玛的DMAIC方法论和Python数据分析结合起来针对一家家电企业的总装产线做效率优化。整个过程走下来我最大的感受是精益六西格玛负责提供思考框架Python负责处理数据规模两者配合才能真正做到用数据说话而不是用感觉开会。如果你也是做制造、质量、精益相关工作的或者正在学习六西格玛但被数据计算搞得头大这篇内容应该能给你一些可以直接落地的思路。1. 家电工厂的效率问题为什么必须用Python来解1.1 从一次产线会议说起三张表对不上账事情起因是这家家电企业的空调外机总装线连续三周UPPH下滑IE主管拉着我开会对策会。会上他们摆了三份数据MES系统导出的报工记录、品质部门的直通率日报、产线手工填写的停线记录。结果三份数据对不上——MES显示当天产量3200台品质日报说一次合格数2980台手工停线记录却只记了两次停机总时长40分钟。但按产量推算产线当天至少损失了近两个小时的有效产出。这种账对不上的情况在家电工厂太常见了。MES记录的是完工节点扫码枪记录的是关键件绑定时间手工报表则完全依赖线长记不记得住。三套数据各有各的缺失各有各的错误但谁也没办法拍胸脯说自己那份是对的。传统的精益做法是先核对数据但靠Excel手工核对几千条记录能对到崩溃。这时候Python的价值就出来了——它不是一个分析工具而是一个数据拉通工具先把三套数据的账对上后面才有资格谈分析。1.2 精益六西格玛负责方向Python负责算力精益六西格玛的核心方法论是DMAIC也就是定义、测量、分析、改进、控制这五个阶段。这套方法论本身不复杂复杂的是测量和分析这两个阶段对数据的要求。举一个非常实际的例子计算线平衡率需要每个工位的实际作业时间。传统做法是IE拿秒表去现场掐掐20个循环求平均值。但一条总装线有35个工位每个工位要测20个循环这就意味着700组数据一个IE至少要蹲在现场一整天而且秒表测出来的数据天然会漏掉员工停顿、取料、等待等波动。而PLC和MES系统其实一直在记录每台产品路过每个工位的时间戳。用Python从系统里直接拉取这些时间戳就能反推出每一个工位对每一台产品的实际处理时间而且是全量数据、无观察者效应。这700组数据用Python几秒钟就算完了还能顺便画出分布图。所以我的结论很明确精益六西格玛告诉你该测哪些指标Python告诉你这些指标怎么高效算出来。1.3 本次项目的产线基本情况在展开具体技术细节之前先交代一下这次项目的背景方便你对照理解。这是一条空调外机总装线一共35个工位涉及的工序包括压缩机安装、管路焊接、电气接线、抽真空、冷媒充注、性能检测、包装下线。节拍设计值是28秒/台两班制生产白班和夜班各10小时。正常状态下一天产量大约2400到2500台。产品型号大概有8个平均每天换型2到3次每次换型换工装、调参数、首件确认。从历史数据看换型期间的产出损失一直比较严重但具体损失多少、哪个环节最耗时没人说得准——因为换型记录都是纸质登记数据没有结构化。这些情况综合起来正好适合用Python做一次系统性的数据梳理和效率诊断。2. 数据底座搭建从MES、扫码枪、Excel堆里拉出一张能用的表2.1 家电产线常见的原始数据源长什么样做数字化效率分析的第一步不是写代码而是搞清楚手头有哪些数据。家电工厂普遍能拿到的数据源大概分四类我整理了一个表格数据源记录内容常见格式典型问题MES系统报工记录、完工数、不良数CSV导出、数据库时间戳粒度粗多为工位级扫码枪/PDA关键件条码、过站时间Excel、数据库时间格式混乱漏扫率高PLC/传感器设备运行状态、循环时间数据库、OPC字段是英文代码需对照表手工报表停线原因、换型时间、异常描述Excel、纸质主观记录口径不一致以这个项目为例MES是主力数据源每天大概产生两万条左右的产品过站记录每一条包含产品序列号、工序代码、完工时间、操作工编号和检验结果。扫码枪数据补充了关键件的装配时间精度比MES高因为它是动作触发。手工报表则记录了停线的起止时间和原因描述。问题在于这三类数据的时间粒度完全不同。MES是分钟级的扫码枪是秒级的手工报表可能只精确到10分钟。整合的第一步就是把它们统一到同一个时间基准上。2.2 pandas数据清洗的完整流程数据清洗是所有分析工作的前置条件也是我用Python做得最多、最枯燥但最不能跳过的环节。直接贴一段实际用过的清洗代码框架你在自己项目里可以照着改import pandas as pd import numpy as np # 读取MES报工数据 mes_df pd.read_csv(mes_report.csv, encodinggbk) # 读取扫码枪过站数据 scan_df pd.read_excel(scan_station.xlsx) # 读取手工停线记录 stop_df pd.read_excel(manual_stop.xlsx) # 1. 统一列名 mes_df.columns [serial_no, station_code, finish_time, operator, result] scan_df.columns [serial_no, station_code, scan_time, component_code] # 2. 时间字段统一转为datetime类型 mes_df[finish_time] pd.to_datetime(mes_df[finish_time]) scan_df[scan_time] pd.to_datetime(scan_df[scan_time]) # 3. 排序后计算相邻工位时间差 mes_df mes_df.sort_values([serial_no, finish_time]) mes_df[prev_time] mes_df.groupby(serial_no)[finish_time].shift(1) mes_df[station_ct] (mes_df[finish_time] - mes_df[prev_time]).dt.total_seconds() # 4. 清洗异常节拍负值和超过10分钟的视为异常 mes_df mes_df[(mes_df[station_ct] 0) (mes_df[station_ct] 600)]这里特别强调几个容易翻车的细节第一编码问题。从国产MES导出的CSV很多是GBK编码直接用pd.read_csv读会乱码必须在参数里指定encodinggbk。第二时间字段格式不统一。有的导出是2024-05-18 08:32:15有的是2024/5/18 8:32还有的Excel单元格存成了文本。全部用pd.to_datetime()统一转换遇到报错用errorscoerce让非法值变成NaT后面再统一处理。第三序列号可能有重复扫码。扫码枪经常出现连续扫两次的情况如果不先去重后面算节拍就会多出一堆间隔几秒的幽灵记录。这个清洗过程我前后跑了三遍才把数据对齐主要原因就是一开始没意识到扫码枪有重复记录导致节拍数据偏小。后来加了一步scan_df scan_df.drop_duplicates(subset[serial_no, station_code])问题才算解决。2.3 班次归属一个看似简单却容易算错的维度生产效率分析离不开班次维度因为白班和夜班的人员构成、管理状态、设备状态都不同。但班次归属的划分有个隐蔽的坑跨天班次。这家企业白班是早上8点到晚上8点夜班是晚上8点到第二天早上8点。如果直接用日期字段分组夜班前4小时的产量会被错误地归到前一天的白班名下测算结果就完全失真了。处理跨天班次的标准做法是生成一个班次开始时间字段然后按偏移后的时间归属。我用的是这样的逻辑# 将时间偏移12小时让夜班归到同一天 shifted_time mes_df[finish_time] - pd.Timedelta(hours12) # 提取班次日期 mes_df[shift_date] shifted_time.dt.date # 根据原始小时数判断班次 mes_df[shift] np.where( (mes_df[finish_time].dt.hour 8) (mes_df[finish_time].dt.hour 20), 白班, 夜班 )这个偏移12小时的技巧来自我之前做跨班次报表的经验一开始我也是直接dt.date去分结果夜班产量总是对不上后来才发现是跨天问题。做这一步还顺便发现了数据里的另一个问题手工停线记录的起止时间经常出现开始时间晚于结束时间的荒唐情况查了一下是夜班人员跨天填写时日期写错。这种问题靠人眼很难逐条发现但用Python做一次时间逻辑校验就能批量筛出来。3. 核心效率指标OEE、UPPH、直通率的Python算法实现3.1 OEE计算三层指标拆开算不能只算一个总数设备综合效率是家电工厂每天都在提的指标但我发现很多现场管理人员对OEE的理解是模糊的经常把设备稼动率当成OEE。其实OEE是三个指标的乘积任何一层偏低都会拉低整体数值。用Python计算OEE逻辑可以拆成四步# 假设从PLC系统拿到了计划内时间和停机记录 plan_time 10 * 3600 # 计划运行时间10小时 downtime 45 * 60 # 非计划停机45分钟 ideal_ct 28 # 理论节拍28秒/台 total_output 1200 # 实际产出数量 scrap_count 25 # 不良数量一次检验不合格 # 时间开动率 run_time plan_time - downtime availability run_time / plan_time # 性能开动率 theoretical_output run_time / ideal_ct performance total_output / theoretical_output # 合格率 quality (total_output - scrap_count) / total_output # OEE oee availability * performance * quality这个例子算出来OEE 0.875 × 0.933 × 0.979 0.799也就是约80%。家电行业总装线的OEE能做到80%以上算不错但关键在于——你到底是哪一层拖了后腿。有的线是可用率低设备老停机有的线是性能开动率低节拍跑不到设计值还有的是合格率在掉。只有拆开算改善方向才会清晰。这次项目里我单独跑了一个月的PLC数据算OEE发现这条线的可用率其实有91%但性能开动率只有84%——问题不是停机多而是产线实际节拍比设计节拍慢了接近10%。这个结论直接改变了后续改善的重心从抓设备停机转向抓节拍损失。3.2 UPPH计算口径不清算出来的数就是自欺欺人UPPH是Unit Per Person Per Hour的缩写翻译成人话就是每人每小时产出多少台。这个指标在电子制造和家电行业用得非常多因为能直观反映人员效率。但UPPH特别容易算错的点是人员数的口径。应该是直接作业人员还是包括线外辅助人员包括不包括组长换型期间的人员怎么算我的处理方式是把口径写死在代码里并且把人员配置单独做成一个配置文件方便摊销# 班次产出与人员配置 shift_output mes_df.groupby([shift_date, shift]).size() headcount_config { (2024-05-18, 白班): {direct: 42, indirect: 6}, (2024-05-18, 夜班): {direct: 40, indirect: 6}, # ... 每天一个配置 } # 计算UPPH for (date, shift), output in shift_output.items(): hc headcount_config.get((date, shift)) if hc is None: continue working_hours 10 # 每班出勤10小时 upph output / ((hc[direct] hc[indirect]) * working_hours) print(f{date} {shift}: UPPH {upph:.2f})千万别小看这个口径问题。之前这家企业的UPPH报表总是看起来不错原因就是他们把检查工、物料员全部排除在分母之外而且每天出勤人数按满编算实际出勤率只有92%。我调整口径后真实的UPPH比报表值低了约8%管理层的反应是数据是不是算错了——但往往数据没错是过去的算法太乐观了。3.3 直通率追踪首检之外还要看整条链直通率又叫一次通过率指的是产品从第一道工序到最后一道工序不经过返修直接合格的比例。家电行业很多工厂只看最终成品检验合格率忽略了中间工序的返修损失。实际上一台外机焊漏一次再补焊虽然最终检验还是合格但工时已经浪费了。Python计算直通率的思路是按产品序列号串联各工序的检验结果如果任何一道工序的不良标记为返修或不合格这台产品就不算一次通过# 按产品序列号聚合工序结果 result_pivot result_df.pivot_table( indexserial_no, columnsstation_code, valuesresult, aggfuncfirst ) # 定义直通所有记录都合格 ftt_mask (result_pivot PASS).all(axis1) ftt_rate ftt_mask.mean() # 按关键工序筛选不良来源 fail_by_station result_df[result_df[result] ! PASS].groupby(station_code).size()算出直通率之后发现一个有意思的现象整线直通率只有91%但单工序合格率基本都在98%以上。问题就出在工序太多——35个工位每个工位98%的合格率乘下来就只有约49%了。当然实际没那么夸张因为有返修和检测工序的拦截但这个乘法的逻辑是成立的工位越多整线直通率越低改善任何一个工位的质量问题都会放大到整线收益。这个分析直接让管理层重新认识到与其把精力放在提升最终包装工序的检验效率不如把资源投入到焊接和冷媒充注这两个高不良工序上。4. 瓶颈定位用Python找出真正拖着产线的那几个工位4.1 节拍堆积画出每个工位的堵车现场做完基础指标接下来是分析阶段的重头戏——找到瓶颈工位。家电总装线是连续流水线节拍不均衡的话快的工位会被慢的工位堵住在制品堆积整体产出就上不去。我用的第一个可视化工具是工位节拍箱线图把所有工位的单台处理时间画成箱线图一眼就能看出哪个工位的分布偏高、离散度大import matplotlib.pyplot as plt # station_ct 是前面算好的每台产品在每个工位的处理时长 plt.figure(figsize(16, 8)) ct_data [mes_df.loc[mes_df[station_code] s, station_ct] for s in station_order] plt.boxplot(ct_data, labelsstation_order, vertTrue, showfliersFalse) plt.xticks(rotation90) plt.axhline(28, colorr, linestyle--, linewidth1.5, label设计节拍28s) plt.ylabel(工位处理时间 (秒)) plt.title(各工位节拍分布) plt.legend() plt.tight_layout() plt.savefig(station_ct_boxplot.png, dpi150)画出来之后问题非常明显性能检测工位的处理时间中位数在42秒左右比设计节拍28秒高出整整14秒。这还不是最糟的——它的分布尾巴很长有些产品要耗时80秒以上说明存在明显的批次性波动。值得留意的还有一个细节抽真空工位的中位数只有24秒看似比设计值还快但它的分布特别宽从10秒到50秒都有说明作业不稳定有间歇性等待。4.2 瓶颈判定不是所有慢工位都算瓶颈很多初学IE的人会拿处理时间最长的工位来定义瓶颈这是不准确的。在流水线上瓶颈应该定义为限制产线整体产出速度的工位。判断依据不能只看统计数据还要看它前面是否积压、后面是否饥饿。我用Python做了两个指标来辅助判断一是在制品堆积程度。如果某个工位前面总是排着很多产品说明下游消化速度比上游慢这就是瓶颈的典型信号。二是工位忙闲率。统计每个工位在整个班次里有产品在处理的时间占比越接近100%说明越忙也就越可能是瓶颈。# 统计各工位忙闲率有处理记录的时间比例 busy_ratio {} for station in station_order: station_data mes_df[mes_df[station_code] station] # 将每台产品的处理时间累加 total_busy station_data[station_ct].sum() busy_ratio[station] total_busy / (10 * 3600 - downtime)性能检测工位的忙闲率是97%而它前面的电气接线工位忙闲率只有76%。这就说明电气接线经常等料因为上游的性能检测消耗不掉那么多产品。反过来看性能检测前面积压了大量在制品操作工位之间堆满了待检的外机。4.3 用控制图区分特殊原因和普通原因找到瓶颈工位之后下一步要判断它的性能波动是稳定存在的普通原因还是偶尔发生的特殊原因。这个判断直接影响改善策略——普通原因需要系统级改善特殊原因则需要现场排查。我选择用单值移动极差控制图I-MR图来分析性能检测工位每个班次的平均节拍。Python里没有现成的控制图库我用的是最基础的计算逻辑# 计算每日性能检测工位的平均处理时间 daily_avg perf_data.groupby(shift_date)[station_ct].mean() # 移动极差 mr daily_avg.diff().abs() # 中心线与控制限 center daily_avg.mean() avg_mr mr.mean() ucl center 2.66 * avg_mr lcl center - 2.66 * avg_mr控制图画出来之后发现有两个班次的平均节拍明显超出UCL对应的日期正好是换型后首班。结合手工记录对照确认是新型号首件调试时参数设置不合理导致检测程序重复运行。这两个特殊原因点剔掉之后剩下班次的平均节拍稳定在40秒左右说明检测工位本身慢是这个产线的系统性问题需要重点改善。这一步的价值在于避免你把个别异常班次当成普遍问题去改或者把系统性问题当成偶发问题来处理。5. 改善方案验证瓶颈突破之后用数据闭环确认收益5.1 针对瓶颈工位的改善方向快速换型只是其中一环瓶颈定位到性能检测工位之后我组织了一次现场观察发现影响检测节拍的因素主要有三个第一检测程序的启动参数是操作工手动输入的8个型号的参数各不相同经常输错导致重复检测。第二检测设备的夹具有两类换型号时需要手动更换耗时约3分钟。第三检测完成后的信息标注动作需要贴标、扫码、手写记录三个步骤操作繁琐。针对这三个问题改善措施分别是给PLC加参数调用库扫码自动调取检测参数设计快换夹具结构把换型动作从3分钟压缩到30秒内把贴标和扫码合并到同一个工位动作中减少转身和等待。这里特别说明一下以上三个措施是结合现场工艺和结构设计提出的不一定适用于所有产线但思路是通用的——瓶颈改善从减少动作浪费和减少换型时间入手投入小、见效快。5.2 改善前后的显著性检验平均值涨了不代表改善有效改善措施执行了两周之后我重新拉了一批数据对比改善前后性能检测工位的平均节拍和整线UPPH。光看平均值改善后节拍从42秒降到了35秒看着确实是提升了。但做数据的人不能只看平均值——样本量、波动、偶然性都可能造成假象。我用了配对样本t检验来验证改善前后差异的显著性from scipy import stats # 改善前后的班次均节拍按班次日配对 before [42.1, 43.5, 41.8, 44.2, 42.8, 43.0] after [35.2, 34.8, 36.1, 35.7, 34.9, 35.5] t_stat, p_value stats.ttest_rel(after, before) print(ft统计量 {t_stat:.3f}, p值 {p_value:.4f}) # 输出p值 0.05差异显著p值小于0.05说明改善前后的差异有统计学意义不是随机波动造成的。这一步在精益六西格玛项目里非常重要——很多改善项目做完之后凭感觉说提升了但经不起统计检验后续复盘时很难说服别人。5.3 线平衡率的变化瓶颈改善后有没有产生新瓶颈突破一个瓶颈之后要立刻检查有没有形成新的瓶颈。线平衡率的公式是线平衡率 所有工位节拍之和 / (瓶颈节拍 × 工位数量)我用改善后的数据重新计算改善前35个工位节拍总和是1050秒瓶颈节拍42秒线平衡率 1050 / (42 × 35) 71.4%。改善后性能检测工位节拍降到35秒新的瓶颈变成了冷媒充注工位的38秒。总节拍变成1035秒线平衡率 1035 / (38 × 35) 77.8%。虽然整体提升了但新的瓶颈暴露出来了。这个发现让我意识到精益改善不是一次性的而是一个持续迭代的过程。每突破一个瓶颈产线平衡就变化一次必须持续跟踪。顺手用Python画了一张改善前后的工位节拍对比图放在给管理层的汇报材料里比任何文字都直观。6. 整个项目踩过的坑和值得坚持的做法6.1 数据口径比代码bug更容易翻车的坑这个项目里最难的不是写代码而是跟各个部门对齐什么算一次合格什么算停机什么算换型耗时。同一件事生产、品质、设备三个部门定义完全不同。举个例子停机在生产部门眼里是产线停止超过5分钟才算设备部门则认为只要设备不动作就算。这两个口径算出来的时间开动率可能差5个百分点。我在项目初期就踩了这个坑第一版OEE算出来偏低后来逐个部门确认口径才发现问题。我的经验是**在写任何分析代码之前先花半天时间和各部门负责人确认指标的计算口径并形成一份文字文档。**代码写错了可以改口径对不齐就像地基歪了越盖越危险。6.2 现场确认数据给出方向但答案在现场Python分析再漂亮也不能替代现场观察。我记得分析报告显示性能检测工位是瓶颈后我在现场蹲了一个上午发现了一个数据看不到的现象检测设备有双工位但操作工习惯只使用单边工位另一边的机械臂一直闲置。问了一下才知道之前有一次双工位同时运行时机械臂出现过一次故障刮擦操作工心理上有顾虑就再也不敢两边同时使用了。这种人的因素是数据很难捕捉到的但它对效率的影响甚至超过了设备本身的能力限制。所以做完数据分析后一定要去现场验证跟操作工聊一聊。数据告诉你哪里有问题现场告诉你为什么有问题。6.3 把分析代码沉淀成可复用的模块这个项目整体跑完之后我把数据清洗、指标计算、控制图、显著性检验这些功能封装成了一套函数库留下了参数化配置的接口。这样后续做其他产线的分析时只需要改配置文件里的工位列表、节拍设计值、班次时间代码可以直接复用。这个习惯帮我在第二个月做另一条冰箱产线的时候省了大量时间从数据导到出报告只用了一天半。如果你是做制造业数据分析的强烈建议从一开始就用函数封装和配置文件管理别把每个项目都写成一次性脚本。6.4 改善闭环的最后一个关键把控制限下发给现场DMAIC的最后一个阶段是控制这一步在工厂里最容易被忽略。很多改善项目做完、报告写完、发个邮件就结束了过两个月再看问题又回来了。我把改善后的性能检测工位节拍控制图直接接到车间的大屏看板上每天自动更新。控制上限设为38秒如果连续三个班次的平均节拍超过控制限系统会自动给IE工程师和线长推送预警消息。这样不需要人工去查数据异常自然会被系统发现。提示数字化改善项目的最终交付物不应该是一份分析报告而应该是一套能持续监测、自动报警的机制。否则改善成果只是当期有效很难长期维持。整个过程做下来我对精益六西格玛和Python的结合有了更深的理解。传统精益项目的数据分析靠Excel数据量一上来就显得力不从心而Python不仅让计算更高效还能让分析过程更可复现、结果更可信。如果你正在做制造业效率改善方向的工作与其纠结学不学Python不如直接拿一条产线的数据试试。踩过几个坑、跑通一次完整流程收获会比看十篇文章都大。
返回列表