오늘 한 일
클로드한테 TIL 부탁해보앗다
TIL — IPQC/AOI 일별 분석, 그리고 데이터 청소의 연속
오늘 한 일 한 줄 요약
03번 노트북에서 "월 단위로는 안 보이던 패턴을 일 단위로 잡아보자"는 목표로 1~3단계 분석을 끝까지 돌렸고, 그 과정에서 데이터 결함을 4번이나 마주쳤다. 마지막엔 결과를 PPT로 정리해서 팀 보고용으로 만들었다.
핵심 질문
"FAIL률과 FAI 치수 이탈이 시간에 따라 변화하는가?"
이걸 확인하려고 1단계(일별 FAIL률) → 2단계(FAI 치수 이탈) → 3단계(사출 조건 변화)까지 순서대로 짚어나갔다.
1단계: 일별 FAIL률 — 생각보다 명확한 추세가 있었다
- 일별로 쪼개서 보니 2026년 1월부터 FAIL률이 통계적으로 유의하게 증가(Mann-Kendall, p<0.0001)했다.
- pymannkendall 패키지 설치가 자꾸 꼬여서, 결국 numpy/scipy로 Mann-Kendall 검정을 직접 구현했다. pymannkendall 결과랑 똑같이 나오는 걸 검증하고 나니 오히려 패키지 의존성 없이 더 깔끔해졌다.
- 요일별로는 월요일(53.88%)이 제일 높고 목요일(47.37%)이 제일 낮았다. 교대조는 거의 차이가 없었다(50.3~50.9%) — 그래서 이후 분석은 교대조 대신 날짜/요일 축에 집중하기로 했다.
- Start_Time 컬럼 파싱하다가 처음엔 41%가 NaT로 날아가서 놀랐는데, 원인은 pd.to_datetime이 혼재된 포맷(초 있음/없음, 한 자리 시각 등)을 하나의 포맷으로만 추론해서 생긴 문제였다. format='mixed' 옵션 하나로 해결됨. (이거 꼭 기억해두기)
2단계: FAI 치수 이탈 — "먼저 흔들리는 것"과 "제일 크게 무너지는 것"은 다르다
- FAI 12개 대표 컬럼(그룹 내 상관 r=0.85~0.99인 건 1개씩만 선택)을 PASS 데이터 기준으로 공차를 역산해서 봤다.
- FAI117_V1이 불량 판별력 1위(이탈 시 FAIL률 94.1%)였고, FAIL률 추이랑 8개월 내내 거의 똑같이 움직였다. 이중축 그래프 처음 봤을 때 진짜 신기했다.
- 근데 "이탈 시작 순서"를 따져보니 의외였다 — FAI44_P73, FAI72_1이 11/3에 제일 먼저 흔들렸고, FAI117_V1은 한 달 늦은 12/8에야 본격적으로 무너졌다. 처음엔 컬럼사전 예상(FAI117_V1이 제일 먼저)이랑 달라서 당황했는데, 오히려 더 흥미로운 발견이 됐다.
- 복합 불량(여러 FAI가 동시에 이탈) 비율도 12월부터 같이 늘어서, "단일 불량 → 복합 불량"으로 패턴이 옮겨간 것처럼 보였다.
3단계: 사출 조건 — 데이터 청소가 진짜 메인 작업이었다
이 단계는 거의 절반이 "이상치 사냥"이었다.
- 금형온도1: 12%가 200000, 201005 같은 황당한 값. 알고 보니 E09, E10 설비 센서가 거의 고장난 상태였음(이탈률 85%, 82%).
- Cycle Time: 소량(47건)이지만 역시 비정상값 있어서 같이 정리.
- 금형온도2: 처음엔 안 걸렸는데 표준편차가 53이나 돼서 다시 봤더니 똑같은 패턴. 팀원이 이미 분석해둔 결과(계절 교란, 심슨의 역설 — 온도1↔FAI 상관이 월별로 통제하면 0으로 붕괴)를 참고해서 통째로 제외했다.
- 최소 쿠션: 그래프에 갑자기 뚝 떨어지는 구간이 있어서 봤더니, 2026-01-31~02-25 사이에 0.5/1.0/2.5 같은 고정값이 평소 4%에서 최대 90%까지 폭증해 있었다. 결측치를 기본값으로 채워넣은 흔적으로 보여서 그 구간은 NaN 처리.
- ruptures 패키지도 설치가 안 돼서, 이진 분할(Binary Segmentation) 변화점 탐지를 직접 구현했다. 오늘 라이브러리 두 개(pymannkendall, ruptures)를 직접 구현으로 대체한 셈.
그리고 이 모든 청소 끝에 나온 핵심 발견:
충진 시간이 12/7(0.197초) → 12/8(0.248초)로 정확히 점프했고, 이게 FAI117_V1이 무너진 날짜와 똑같다.
이건 진짜 우연이라고 보기 힘든 일치라서, 오늘 분석에서 제일 인상적인 부분이었다.
마지막: PPT로 정리
13장짜리 보고서를 만들었는데, 만들면서 제일 신경 쓴 건 "차트가 진짜 맞는 차트인가"였다. 최소 쿠션 그래프를 두 번 그렸었는데(첫 버전은 결함 구간이 매끄럽게 이어진 것처럼 보이는 잘못된 버전, 두 번째가 끊어서 보여주는 올바른 버전) 하필 둘 다 노트북에 남아있어서, 헷갈리지 않게 직접 일일이 확인하고 골랐다. AI한테 시킨 작업도 결과물을 한 번 더 검증해야 한다는 걸 다시 느낌.
오늘 배운 것 정리
- pd.to_datetime은 혼재된 날짜 포맷에서 format='mixed'를 꼭 챙겨야 한다.
- 외부 패키지 설치가 막히면 numpy/scipy로 직접 구현하는 게 생각보다 어렵지 않다(Mann-Kendall, 변화점 탐지 둘 다 해봄).
- 그래프가 "이상하게 매끄럽다" 싶으면 빈 데이터를 이어붙여서 그린 게 아닌지부터 의심하기.
- 시점이 일치한다고 곧바로 인과관계로 단정하면 안 된다 — 금형온도 사례(계절 교란)가 좋은 반례.
- "먼저 흔들리는 것"과 "가장 강하게 연관된 것"이 다를 수 있다는 게, 데이터 분석에서 은근히 중요한 통찰이었다.
다음에 할 일
- 12/8 전후로 LOTN(원료 로트)이 바뀌었는지 확인
- 설비별로 충진 시간 패턴을 분리해서 재확인
- 충진 시간 → FAI117_V1 인과관계를 통계적으로 더 검증
'내일배움캠프(본캠프)' 카테고리의 다른 글
| [내일배움캠프] 본캠프 7/2 (0) | 2026.07.02 |
|---|---|
| [내일배움캠프] 본캠프 7/1 (0) | 2026.07.01 |
| [내일배움캠프] 본캠프 6/29 (0) | 2026.06.29 |
| [내일배움캠프] 본캠프 6/26 (0) | 2026.06.26 |
| [내일배움캠프] 본캠프 6/25 (0) | 2026.06.25 |