제조 데이터 분석에서 파생변수 생성이란?


  • 이번 글은 제조 데이터 분석을 하면서 필요한 데이터 전처리 중 파생변수 생성 부분에 대해 정리해보았습니다.
  • 필요 데이터 및 분석 대상 공정 등 어떤 분석을 하냐에 따라서 생성되는 파생변수들이 조금씩 달라지다보니, 일반적인 것들 위주로 작성하려고 하였습니다.😅
  • 파생변수 생성 케이스 관련해서 예시 및 코드를 계속 추가할 예정입니다! 꾸준히..추가해보도록 할게요..!🔥

데이터 분석 프로세스 중 데이터 전처리(Data Preprocessing) 단계는 분석을 수행할 때 다양한 원천 데이터 소스를 통해 목적에 맞는 데이터 형태를 만들기 위한 단계입니다.

데이터 전처리가 필요한 이유는 다음과 같습니다.

  1. 원하고자 하는 분석을 하기 위해서, 각각의 테이블 단위로 흩어져있는 데이터를 하나의 테이블로 결합하고 목적에 맞게 데이터 처리 작업 필요함
  2. 이때 데이터 정제 작업과 필요한 파생 변수 생성 작업 역시 진행되어야함
  3. 데이터에 숨겨진 추세나 패턴을 확인하기 위해 특정 변수 기준으로 요약 집계하는 경우도 있음


데이터 분석에서 데이터 전처리는 매우 중요한 단계라고 할 수 있으며, 분석 결과의 정확도와 신뢰도에 큰 영향을 미칩니다.

  1. 데이터 품질 향상
    • 결측치, 이상치, 중복 데이터 등이 분석 결과에 영향을 미치기 때문에, 이를 처리하고 데이터를 정제하는 과정이 필요
  2. 모델 성능 향상
    • 데이터의 스케일이 서로 다른 경우 분석 결과가 왜곡될 수 있기 때문에, 이를 처리하면 성능 개선 및 정확한 예측을 기대할 수 있음
  3. 일관성 있는 데이터 구성
    • 데이터 전처리를 통해, 데이터 구성에 일관성이 생김


개인적인 생각이지만, 분석을 하면 할수록 데이터 전처리 단계야말로 분석가의 노하우가 매우 중요시 되는 부분이라고 느끼고 있습니다. 그 이유는 데이터 가공을 어떻게 진행했냐에 따라, 의미 있는 분석 결과를 얻거나 성능 좋은 모델을 만들 때 효과를 볼 수 있는 부분이기 때문입니다.
아무래도 주로 접할 수 있는 Kaggle이나 Dacon의 예제 데이터들은 이미 데이터가 정제된 상태인 경우가 많습니다. 그렇기 때문에 실제 업무를 진행할 때에는 예제 데이터와 같이 데이터를 정제하고 분석하기 위한 형태로 만드는데 시간을 투자하는 것이 중요합니다. 저도 분석을 진행할 때 데이터 가공 단계에서 많은 시간을 투자하고 있으며, 어떻게 가공을 해서 데이터 특성을 더욱 잘 살릴 수 있을지 고민을 하고 있습니다. 모델을 재구성하거나 분석 가설을 다시 세워서 재진행할 때에도, 데이터 가공 단계부터 다시 시작하는 경우도 있구요!


🎈 Data Preprocessing 종류

데이터 가공 단계는 아래의 예시 그림과 같이 정말 다양한 범위를 포함하고 있습니다. image 출처 : DATA PREPROCESSING | DATA CLEANING PYTHON


대표적인 Data Preprocessing 방법들은 다음과 같습니다.

  1. 결측치(Missing Value) 처리
    • 결측치 : 데이터에서 값이 없는 케이스
    • 대표적인 방법 : 평균, 중앙값, 최빈값으로 채우기 / 해당 데이터를 제외
  2. 이상치(Outlier) 처리
    • 이상치 : 정상적인 값의 범위에서 크게 벗어난 값
    • 대표적인 방법 : 이상치를 제거 / 다른 값으로 대체 / Isolation Forest / One-Class SVM
    • 하지만 도메인에 따라서 이상치 기준이 다르기 때문에, 도메인 및 데이터에 따라 이상치 처리 기준을 정해야함
    • 일부 도메인에서는 이상치를 더 중요시 여기는 경우도 있음
  3. 데이터 변환
    • 데이터 분석에 사용되는 데이터는 종종 비선형성을 가지거나, 분포가 치우친 경우가 존재함
    • 대표적인 방법 : 로그 변환 / 제곱근 변환
  4. 데이터 스케일링(Feature Scaling)*
    • 데이터의 스케일이 서로 다른 경우, 분석 결과가 왜곡될 수 있음
    • 대표적인 방법 : 표준화(Standardization) / 정규화 / Min-Max Nomarlization
  5. 데이터 인코딩
    • 분석에 사용되는 대부분의 모델은 문자열을 처리할 수 없기 때문에, 문자열을 수치형 값으로 변환하는 과정이 필요함
    • 대표적인 방법 : 원-핫 인코딩 / 레이블 인코딩
  6. 피쳐 엔지니어링 (Feature Engineering)
    • Raw Data로부터 Feature를 만들거나 재구성하는 과정
    • 대표적인 방법 : Feature Extraction / Encoding / 통합, 정제, 변환, 파생변수
    • eature Extraction : 주어진 Featrue 바탕으로 새로운 Feature로 재구성


이번 글에서는 데이터 전처리 중 파생변수(Derived Variable)를 생성하는 것에 대해 설명하도록 하겠습니다.

🎈 파생변수 목적 및 의의

파생변수(Derived Variable)는 기존의 변수를 조합하여 새로운 변수를 만들어 내는 것을 의미합니다. 도메인 전문가의 아이디어가 중요하며, 주의 깊게 생각하는 부분의 가정(가설)을 설정하여 파생변수를 생성하는 과정을 거치게 됩니다.

  • 예시) 화학산업 - 촉매 반응시간 파생변수


이때 파생변수를 만드는 것이 데이터 전처리의 최종 목적이 아닌, 분석 목적에 맞게 적절한 파생변수를 생성하는 것이 중요합니다. 적절한 파생변수를 생성함으로써 기존 변수에서 파악하기 힘든 패턴이나 관계를 발견할 수 있으며, 이를 통해 모델의 성능을 향상시키는 것은 데이터 분석에서 매우 중요한 단계 중 하나입니다.

이때 주의해야할 점은 다음과 같습니다.

  1. 데이터 분석 및 예측에 활용하기 위해, 특정 상황(or 기간)에만 의미가 있는 것보다 전 데이터구간에 대표성을 가질 수 있는 파생변수를 생성해야함
  2. 특정 함수에 의해 값을 만들어 의미를 부여하기 때문에, 해석할 수 있는 논리적 타당성이 필요


✅ 파생변수 생성 방법

파생변수는 생성하는 방법들은 다양하게 있지만, 일반적으로 다음과 같은 방법들이 있습니다.

  1. 새로운 변수의 조합
    • 두 개 이상의 변수를 조합(ex. 곱셉, 나눗셈, 덧셈, 뺄샘 등의 연산)하여 새로운 변수를 생성함
    • 예시) 주택가격 예측 모델 - 주택의 면적과 방의 개수를 곱하여 새로운 변수를 생성
    • 예시) BMI(체질량 지수) - 신장과 체중의 곱셈
  2. 구간 분할(Binning)
    • 연속형 변수의 값을 특정 구간으로 나누어 이산형 변수로 변환하거나 분위수/퍼센트 등급 등으로 변환하여 새로운 변수를 생성함
    • 예시) 키, 변수를 분위수 등급으로 변환하여 새로운 변수를 생성
    • 예시) 연령 - 10대, 20대, 30대 등
  3. 이동평균(Moving Average) & 이동분산(Moving Variance)
    • 변수의 이동평균 또는 이동분산을 계산하여 새로운 변수를 생성함
    • 예시) 시계열 데이터 - 최근 3일간의 평균을 계산하여 새로운 변수를 생성
  4. 로그/제곱근 등의 변환
    • 변수의 값을 로그/제곱근 등으로 변환하여 새로운 변수를 생성함
    • 예시) 매출액 변수를 로그 변환하여 새로운 변수를 생성
  5. 클러스터링
    • 변수를 클러스터링하여 새로운 변수를 생성함
    • 예시) 고객 데이터 - 유사한 고객을 클러스터링하여 새로운 변수를 생성
  6. 외부 데이터
    • 외부 데이터를 가져와 기존 데이터와 결합하여 새로운 변수를 생성함
    • 예시) 날씨 데이터를 가져와 주식 가격 예측 모델에 적용하여 새로운 변수를 생성
  7. 조건문 활용
    • 조건에 따라 서로 다른 값을 반환하는 조건문 함수를 이용하여 새로운 변수를 생성함
    • 예시) 연비가 20이 넘는 자동차에 고연비 합격 판정을 내리고, 넘지 못하면 불합격으로 분류된 새로운 변수를 생성


✅ 제조분석 - 파생변수 생성 방법

그렇다면 제조 분석에서의 파생변수 생성은 어떤 케이스가 있을까요?
위에서 얘기한 파생변수 생성 방법과 비슷하지만, 제조 용어들을 사용해서 설명하도록 하겠습니다. (일부 예시만 존재)

  1. 반응속도 변수 (Reaction Rate Variables)
    • 반응 시간과 반응 조건에 대한 변수를 조합하여 생성
    • 예시) 반응 시간, 온도, 압력, 농도 등의 변수를 조합하여, 반응 속도를 나타내는 변수를 생성
  2. 불량률 변수 (Defect Rate Variables)
    • 불량률 : 제조 공정에서 발생하는 불량 제품의 비율을 나타내는 지표
    • 제조과정에서 발생하는 불량의 원인에 대한 변수를 조합하여 생성
    • 예시) 공정 온도/압력/속도 등의 변수를 조합하여, 불량률을 예측하는 변수를 생성
    • 공정 운전 데이터를 이용하여 해당 공장에서 불량률이 높은 시간대나 작업조를 구분할 수 있음 → 불량률 예측 변수 생성 가능
  3. 공정능력 지수 변수 (Process Capability Index Variables)
    • 공정능력 지수 : 제조 공정의 안정성과 정확성을 나타내는 지표
    • 제조 공정에서 측정된 데이터를 이용하여, 공정능력 지수를 계산할 수 있음
    • 예시) 생산 라인의 평균값과 표준편차를 이용하여, 공정능력 지수 변수를 생성
  4. 시간 관련 변수 (Time Variables)
    • 제조분야에서는 시간에 따라 생산 라인의 성능이 달라질 수 있음
    • 예시) 생산 라인의 가동시간, 정지시간, 교체시간 등의 변수를 생성
  5. 기존 센서 데이터를 활용한 새로운 변수
    • 센서 변수를 이용하여 하나 또는 두 개 이상의 변수를 조합(ex. 곱셉, 나눗셈, 덧셈, 뺄샘 등의 연산)하여 새로운 변수를 생성함
    • 예시) 좌우 또는 상하 온도 센서 차이값, 팬 속도와 차압, 가스 센서 이동평균


🎈 제조분석 - 파생변수 생성 예시

앞서 파생변수를 설명드릴 때, 파생변수를 해석할 수 있는 논리적 타당성이 필요하다고 말씀드렸는데요! 무작정(?) 파생변수를 최대한 많이 생성하는 경우도 있겠지만, 일반적으로 도메인 지식을 기반으로 새로운 파생변수를 생성할 때에는 가설을 세워 특정 함수에 의해 값을 만드는 과정을 거치게 됩니다.

그렇다면 이번 포스팅에서는 다음과 같은 가설로 파생변수 생성을 하는 과정을 진행해보도록 하겠습니다.

💡 가정

  1. Case 1: Barrel 온도가 ZONE별 차이가 많이 날 경우 제품 불합격에 영향을 줄 것이다.
    • 제품 불합격 시, ZONE별 Barrel 온도 차이가 클 것이다.
    • 이유 : 계량 및 사출시 수지가 일정하게 융융(녹임)을 유지하기 위해 온도가 일정해야하기 때문
  2. Case 2 : Mold 온도의 총합이 차이가 많이 날 경우 제품 불합격에 영향을 줄 것이다.
    • 제품 불합격 시, Mold 온도의 총합이 상대적으로 낮을 것이다.
    • 이유 : 충분히 건조시켜주며 재료가 융융되는 시간을 절약 시켜주기 위해 온도가 높아야 하기 때문

이때 Case 1에서 ZONE이라는 용어가 나오는데, extruder, barrel 등과 같은 설비들에 센서값들이 일정한 간격으로 존재하며 이 간격들을 ‘ZONE’이라고 칭합니다. 아래 그림 기준으로 보면, barrel이라고 하는 것을 front, center, rear로 총 3구역으로 나누게 됩니다. image 참조 : Injection Molding: How to Set Barrel Zone Temps


위의 2개의 가설로 어떤 파생변수를 만들 수 있을까요? 물론 여러가지 파생변수를 만들어낼 수 있겠지만, 가설 그대로만을 가지고 빠르게 파생변수를 만든다면 2개의 파생변수를 생성할 수 있을 것입니다.

  1. Case 1: Barrel 온도가 ZONE별 차이가 많이 날 경우 제품 불합격에 영향을 줄 것이다.
    • 주요 포인트 : ZONE별 차이
    • 파생변수 : Barrel 온도 센서의 ZONE별 차이값
  2. Case 2: Mold 온도의 총합이 차이가 많이 날 경우 제품 불합격에 영향을 줄 것이다.
    • 주요 포인트 : 온도 총합 차이
    • 파생변수 : Mold 온도 센서별 누적합값 image


위의 내용을 python 코드로 구현했고 아래와 같습니다.

파생변수 생성 대상 column group 지정

# Barrel 온도
barreltemp_colname = ['TI_3051_PV', 'TI_3052_PV', 'TI_3053_PV', 'TI_3054_PV', 'TI_3055_PV']

# Mold 온도
moldtemp_colname = ['TI_5051_PV', 'TI_5052_PV', 'TI_5053_PV', 'TI_5054_PV', 'TI_5055_PV']

파생변수 생성 - (1) 각 변수별 값 차이 계산

def preprocess_diff_variable(dat, col_list):
    column_list = list(itertools.combinations(col_list,2))

    # 변수 combination으로 변수 차이값 산출
    for i in range(len(column_list)):
        new_value_name = 'DIFF_' + column_list[i][0] + '___' + column_list[i][1]
        first_value = dat[column_list[i][0]]
        second_value = dat[column_list[i][1]]
        # new column 생성
        dat[new_value_name] = abs(first_value - second_value)

    return dat

파생변수 생성 - (2) 누적합 산출

def preprocess_cusum_variable(dat, col_list, new_col_name):

    for i in range(1,len(col_list)):
        sum = 0
        new_value_name = 'CUSUM_' + new_col_name + 'CNT' + str(i+1)

        for j in range(i+1):
            sum = sum + dat[col_list[j]]

        dat[new_value_name] = sum

    return dat

파생변수 생성

preprocess_diff_variable(train, barreltemp_colname)

preprocess_cusum_variable(train, moldtemp_colname, 'MOLDTEMP_')


결론

지금까지 파생변수를 만드는 과정과 제조업에서 사용되는 예시들에 대해 살펴보았습니다.
이를 아래와 같이 요약하자면 다음과 같습니다.

  1. 파생변수는 기존의 변수를 변형해 만드는 변수입니다.
  2. 특정 함수를 적용하거나 기존 변수를 조합하여 새변수를 생성할 수 있습니다.
  3. 제조업에서는 특정 센서들 간의 관계성을 통해 생성되는 파생변수가 대표적입니다.





© 2020.02. by ysjang0926

Powered by theorydb