공정 데이터 기반 품질 영향 요인 분석 및 인사이트 도출
제조 현장에서의 공정 데이터를 기반으로 품질에 대한 주요 영향 요인을 분석하고, 그에 대한 인사이트를 도출하는 방법을 살펴봅니다.
1. 실습 개요
- 실습 주제: 사출 성형 공정 데이터를 활용한 품질(불량 발생) 주요 영향 요인 규명 및 개선 인사이트 도출
- 실습 목적:
- 시계열 센서 데이터와 공정 이벤트(4M/품질) 데이터를 결합(Join)하는 방식을 이해한다.
- 단순 통계 및 탐색적 데이터 분석(EDA)을 통해 불량과 상관관계가 높은 공정 파라미터를 발굴한다.
- 현장에 적용 가능한 ‘데이터 기반 공정 최적화 조건(Recipe)’을 도출하고 의사결정 보고서를 작성한다.
2. 실습 준비물 및 환경
- 실습 도구: Python (Google Colab) 또는 Excel (선택 가능)
- 필수 라이브러리 (Python 진행 시):
pandas,numpy,matplotlib,seaborn - 제공 데이터 세트 (2개 CSV 파일):
sensor_timeseries.csv(1초 단위 설비 센서 수집 데이터)production_logs.csv(Lot 단위 생산/품질 및 4M 데이터)
3. 실습 데이터 세트 구조
sensor_timeseries.csv(Level 1~2 시계열 센서)
| 컬럼명 | 데이터 타입 | 설명 | 비고 |
|---|---|---|---|
| timestamp | Datetime | 센서 측정 시각 (1초 간격) | YYYY-MM-DD HH:MM:SS |
| machine_id | String | 설비 식별자 | 예: 'PRESS_01' |
| temp_nozzle | Float | 노즐 온도 (℃) | 정상 범위: 220 ~ 240 |
| pressure_injection | Float | 사출 압력 (bar) | 정상 범위: 80 ~ 100 |
| cooling_time | Float | 냉각 시간 (sec) | 설정값 |
production_logs.csv(Level 3 공정/품질 맥락 데이터)
| 컬럼명 | 데이터 타입 | 설명 | 비고 |
|---|---|---|---|
| lot_id | String | 로트 식별자 | Key 역할 (예: 'LOT_2026_01') |
| start_time | Datetime | 해당 Lot 작업 시작 시각 | Time Window 조인용 |
| end_time | Datetime | 해당 Lot 작업 종료 시각 | Time Window 조인용 |
| worker_id | String | 작업자 ID (Man) | A / B / C 조 |
| material_batch | String | 원자재 롯데 번호 (Material) | Raw_MAT_X / Y |
| defect_status | String/Int | 품질 결과 | '0': 양품, '1': 불량 (수축/치수 불량) |
- Dataset 생성하기
#//file: "data_gen.py" from datetime import datetime, timedelta import numpy as np import pandas as pd # 랜덤 시드 고정 (재현성 확보) np.random.seed(42) # ========================================== # 1. production_logs.csv 생성 (100개 Lot) # ========================================== num_lots = 100 start_base_time = datetime(2026, 3, 1, 8, 0, 0) # 2026년 3월 1일 오전 8시 시작 lots_data = [] current_time = start_base_time workers = ['Worker_A', 'Worker_B', 'Worker_C'] materials = ['Raw_MAT_X', 'Raw_MAT_Y'] for i in range(1, num_lots + 1): lot_id = f'LOT_2026_{i:03d}' duration_minutes = np.random.randint(12, 18) # Lot당 약 12~17분 소요 end_time = current_time + timedelta(minutes=duration_minutes) worker = np.random.choice(workers, p=[0.4, 0.3, 0.3]) material = np.random.choice(materials, p=[0.6, 0.4]) lots_data.append({ 'lot_id': lot_id, 'start_time': current_time.strftime('%Y-%m-%d %H:%M:%S'), 'end_time': end_time.strftime('%Y-%m-%d %H:%M:%S'), 'worker_id': worker, 'material_batch': material, 'defect_status': 0, # 기본값 }) current_time = end_time + timedelta(seconds=10) # Lot 간 10초 휴지시간 df_lots = pd.DataFrame(lots_data) # ========================================== # 2. sensor_timeseries.csv 생성 (lot_id 매핑 추가) # ========================================== sensor_rows = [] defect_lot_ids = [] for idx, row in df_lots.iterrows(): lot_start = datetime.strptime(row['start_time'], '%Y-%m-%d %H:%M:%S') lot_end = datetime.strptime(row['end_time'], '%Y-%m-%d %H:%M:%S') # 의도적 불량 패턴 주입: Worker_B 이면서 Raw_MAT_Y 사용할 때 40% 확률로 이상 발생 is_anomaly = False if row['worker_id'] == 'Worker_B' and row['material_batch'] == 'Raw_MAT_Y': if np.random.rand() < 0.4: # 40% 확률로 수정 is_anomaly = True defect_lot_ids.append(row['lot_id']) elif np.random.rand() < 0.05: # 그 외 일반 로트 5% 확률 불량 is_anomaly = True defect_lot_ids.append(row['lot_id']) # 1초 간격 센서 데이터 생성 t = lot_start while t <= lot_end: if is_anomaly: temp_nozzle = np.round(np.random.normal(215.0, 1.8), 2) pressure_inj = np.round(np.random.normal(82.0, 3.5), 2) else: temp_nozzle = np.round(np.random.normal(230.0, 1.2), 2) pressure_inj = np.round(np.random.normal(90.0, 2.0), 2) cooling_time = 15.0 sensor_rows.append({ 'timestamp': t.strftime('%Y-%m-%d %H:%M:%S'), 'machine_id': 'PRESS_01', 'lot_id': row['lot_id'], # ★ Orange3에서 쉬운 그룹화를 위해 lot_id 추가 'temp_nozzle': temp_nozzle, 'pressure_injection': pressure_inj, # 컬럼명 명확화 'cooling_time': cooling_time, # 컬럼명 명확화 }) t += timedelta(seconds=1) df_sensor = pd.DataFrame(sensor_rows) # ========================================== # 3. 불량 여부 업데이트 및 저장 # ========================================== df_lots['defect_status'] = df_lots['lot_id'].apply( lambda x: 1 if x in defect_lot_ids else 0 ) df_sensor.to_csv('sensor_timeseries.csv', index=False, encoding='utf-8-sig') df_lots.to_csv('production_logs.csv', index=False, encoding='utf-8-sig') print('올바른 컬럼명이 반영된 2개의 실습 데이터 파일이 재생성되었습니다!')
4. 단계별 실습 진행 과정
- [1단계] 데이터 전처리 및 융합 (Data Join & Aggregation)
- 목표:
- 서로 다른 주기를 가진 시계열 센서 데이터와 Lot 품질 데이터를 결합하여 ‘분석용 데이터 마트(Data Mart)’ 생성
- 실습 수행 내용:
production_logs의start_time과end_time사이 구간(Time Window)에 해당하는sensor_timeseries데이터를 필터링- sensor_timeseries: 1초마다 수집되는 수만 건의 센서 데이터 (노즐 온도, 사출 압력 등)
- production_logs: 1개 Lot(제품 묶음) 생산할 때 시작/종료 시간과 품질 결과만 적힌 데이터 (수십~수백 건)
- 해당 구간 동안의 센서 데이터 통계량(평균값
mean, 최대값max, 표준편차std) 계산 - 계산된 센서 통계 수치를
production_logs의 해당lot_id행에 조인(Join)
-
결과 코드 예시 (Python):
# Lot별 센서 데이터 평균 집계 후 조인 lot_summary = [] for idx, row in production_logs.iterrows(): # Time Window 필터링 mask = (sensor_df['timestamp'] >= row['start_time']) & (sensor_df['timestamp'] <= row['end_time']) sub_sensor = sensor_df[mask] # 집계값 생성 lot_summary.append({ 'lot_id': row['lot_id'], 'temp_avg': sub_sensor['temp_nozzle'].mean(), 'pressure_avg': sub_sensor['pressure_injection'].mean(), 'cooling_avg': sub_sensor['cooling_time'].mean() }) # 데이터 마트 완성 data_mart = pd.merge(production_logs, pd.DataFrame(lot_summary), on='lot_id') -
Orange3
Orange3를 이용한 분석 과정의 예시 (Source: SkyLectures / AiDALab)
- 목표:
- [2단계] 탐색적 데이터 분석 (EDA) 및 변수 간 상관관계 파악
- 목표:
- 양품(
0)과 불량(1) 발생 집단 간에 어떤 공정 파라미터가 유의미한 차이를 보이는지 확인
- 양품(
- 실습 수행 내용:
- 요약 통계 비교: 양품/불량 그룹별
temp_avg,pressure_avg의 평균 및 표준편차 비교 - 상관관계 분석: 주요 변수 간 Correlation Matrix(상관계수 히트맵) 작성
- 시각화 (Boxplot / Distribution plot): *
temp_avg분포와defect_status관계 시각화
- 요약 통계 비교: 양품/불량 그룹별
worker_id(작업자) 및material_batch(원자재)별 불량 발생 비율(Cross-tabulation) 비교
- 목표:
- [3단계] 현장 문제 원인(Root-Cause) 규명 및 패턴 발견
- 목표:
- 데이터 분석 결과를 도메인 관점으로 해석하여 진짜 원인을 추론
- 실습 가이드 포인트 (데이터 속 숨겨진 패턴 예시):
- 패턴 A (물리 변수):
- 불량이 발생한 Lot들은 공통적으로
temp_avg가 215℃ 이하로 떨어진 구간에서 집중 발생함 (노즐 온도 저하 ➔ 수지 용융 불량 ➔ 치수 불량)
- 불량이 발생한 Lot들은 공통적으로
- 패턴 B (4M 변수):
- 특정 원자재 롯데(
Raw_MAT_Y)가 투입될 때 노즐 온도가 쉽게 하락하는 경향이 관찰됨 (원자재별 점성 차이 존재)
- 특정 원자재 롯데(
- 패턴 A (물리 변수):
- 목표:
- [4단계] 최적 공정 레시피 및 도출 인사이트 정리
- 목표:
- 단순 현상 파악에 그치지 않고,
- 현장에 적용 가능한 개선 가이드라인(Prescriptive Insight)을 작성
- 목표:
5. 결과물
-
[결과물 양식] 공정 개선 분석 및 인사이트 보고서
공정 개선 분석 및 인사이트 보고서
- 문제 데이터 요약
- 총 분석 대상 Lot 수:
N건 (양품:N건, 불량:N건 / 불량률:X%) - 주요 불량 유형: 사출 수축 및 치수 불량
- 총 분석 대상 Lot 수:
- 주요 데이터 분석 결과
- 결과 1 (핵심 인자 발굴):
- 사출 노즐 온도가 불량에 가장 결정적인 영향을 미침 (상관계수 r = -0.72) - 결과 2 (임계값 발견):
- 노즐 온도가 218℃ 미만으로 떨어지는 순간, 불량 발생률이 1.2%에서 18.5%로 급증함 - 결과 3 (4M 연계 분석):
Worker_B작업조 가동 시 및Raw_MAT_Y자재 투입 시 노즐 온도가 설정값 대비 크게 흔들림(Variability 상승)을 확인
- 현장 적용 개선 인사이트 및 액션 플랜
- [설비 제어 및 Interlock 설정]:
- 사출 노즐 온도 하한 관리 기준(LSL)을 기존 210℃에서 220℃로 상향 조정
- 온도가 218℃ 이하로 내려갈 경우, 설비가 자동 정지(Interlock)되고 알람이 발생하도록 PLC 조건 수정 - [표준 작업 가이드(SOP) 개정]:
Raw_MAT_Y자재 투입 시 예열 시간을 기존 15분에서 25분으로 연장하는 표준 작업 지침 업데이트 - [기대 효과 (ROI Estimate)]:- 노즐 온도 이탈 방지를 통해 전체 불량률 2.5% 🡪 0.6% 수준으로 감소 예상 (연간 약 N,000만 원 손실 절감)
- 문제 데이터 요약