1. 오늘의 학습 목표
오늘은 통계와 머신러닝 개인과제 내용을 확인하고, 각 문제를 어떤 방향으로 풀어야 할지 정리했다.
이번 과제는 AI4I 설비 데이터를 활용해서 설비 고장 여부를 통계적으로 분석하고, 머신러닝 모델로 예측해보는 흐름으로 구성되어 있다.
단순히 코드만 작성하는 과제가 아니라, 데이터 탐색부터 기초통계, 가설검정, 상관관계 분석, 시각화, 머신러닝 모델링, Feature Engineering까지 이어지는 종합 과제에 가깝다.
오늘의 목표는 바로 정답을 완성하는 것보다, 먼저 문제 구조를 파악하고 각 항목에서 어떤 분석 방법을 써야 하는지 정리하는 것이다.
크게 보면 이번 과제는 다음 흐름으로 풀어가면 될 것 같다.
데이터 불러오기 → 데이터 탐색 → 기초통계 분석 → 가설검정 → 머신러닝 모델링 → 상관관계 분석 → 시각화 → 카이제곱 검정 → 파생 변수 생성 및 모델 비교
2. 오늘 학습한 내용
데이터셋 이해
이번 과제에서는 AI4I 데이터셋을 사용한다.
AI4I 데이터는 제조 설비와 관련된 데이터로, 설비의 온도, 회전 속도, 토크, 공구 마모도 같은 특성을 가지고 있다. 최종적으로는 machine_failure 컬럼을 기준으로 설비가 정상인지, 고장이 발생했는지를 분석한다.
사용되는 주요 컬럼은 다음과 같다.
- air_temp : 공기 온도
- process_temp : 공정 온도
- rotational_speed : 회전 속도
- torque : 토크
- tool_wear : 공구 마모도
- Type : 제품 등급
- machine_failure : 설비 고장 여부
이번 과제에서 가장 중요한 타깃 변수는 machine_failure다.
정상은 0, 고장은 1로 구분된다.
먼저 해야 할 일은 데이터의 기본 구조를 확인하는 것이다.
df.info()
df.head()
df.describe()
df.isnull().sum()
이 단계에서는 데이터가 몇 행인지, 결측치가 있는지, 수치형 변수와 범주형 변수가 어떻게 구성되어 있는지 확인해야 한다.
특히 machine_failure의 분포를 먼저 봐야 한다. 고장 데이터가 정상 데이터보다 훨씬 적다면 클래스 불균형이 있을 수 있고, 이후 머신러닝 모델 평가에서도 정확도만 보면 안 될 수 있기 때문이다.
통계 파트
기초 통계 분석 방향
첫 번째 필수 문제는 고장 여부에 따라 설비 특성들의 평균과 중앙값을 비교하는 문제다.
여기서는 machine_failure를 기준으로 정상 설비와 고장 설비를 나누고, 각 변수의 평균과 중앙값을 구하면 된다.
분석할 변수는 크게 세 그룹으로 나뉜다.
온도 관련 특성은 air_temp, process_temp다.
동력 관련 특성은 rotational_speed, torque다.
공구 마모 특성은 tool_wear다.
이 문제는 groupby()를 활용하면 될 것 같다.
df.groupby('machine_failure')[features].agg(['mean', 'median']).round(2)
여기서 중요한 것은 단순히 표만 출력하는 것이 아니라, 정상 설비와 고장 설비의 평균과 중앙값이 어떻게 다른지 해석하는 것이다.
예를 들어 고장 설비에서 특정 변수의 평균이 정상 설비보다 높다면, 그 변수는 고장과 관련이 있을 가능성이 있다. 반대로 평균과 중앙값 차이가 거의 없다면 고장 여부를 구분하는 데 큰 영향을 주지 않을 수도 있다.
다만 평균만 보면 이상치에 영향을 받을 수 있으므로 중앙값도 함께 봐야 한다. 평균과 중앙값이 크게 다르다면 분포가 한쪽으로 치우쳐 있거나 이상치가 있을 가능성도 생각해야 한다.
독립표본 T-test 방향
두 번째 필수 문제는 고장 여부에 따라 각 특성의 평균 차이가 통계적으로 유의한지 확인하는 문제다.
여기서는 정상 설비 그룹과 고장 설비 그룹을 나누고, 각 변수에 대해 독립표본 T-test를 수행해야 한다.
사용할 변수는 기초통계와 동일하다.
- 온도 관련 : air_temp, process_temp
- 동력 관련 : rotational_speed, torque
- 공구 마모 : tool_wear
가설은 다음과 같은 방식으로 세우면 된다.
귀무가설은 정상 설비와 고장 설비의 평균에 차이가 없다는 것이다.
대립가설은 정상 설비와 고장 설비의 평균에 차이가 있다는 것이다.
stats.ttest_ind(group_normal[feature], group_failure[feature])
결과로 t-score와 p-value가 나오기 때문에, p-value가 0.05보다 작은지 확인하면 된다.
p-value가 0.05보다 작으면 귀무가설을 기각하고, 해당 변수는 고장 여부에 따라 평균 차이가 있다고 볼 수 있다.
여기서도 중요한 것은 단순히 유의하다, 유의하지 않다에서 끝내는 것이 아니다. 어떤 카테고리의 특성이 고장 판별에 더 중요해 보이는지 비교해야 한다.
예를 들어 동력 관련 변수의 p-value가 작고 평균 차이도 크다면, 고장 여부와 동력 특성이 더 밀접할 가능성을 생각해볼 수 있다.
상관관계 분석 방향
상관관계 분석에서는 연속형 변수들과 machine_failure 사이의 피어슨 상관계수를 구해야 한다.
사용할 변수는 다음과 같다.
- air_temp
- process_temp
- rotational_speed
- torque
- tool_wear
- machine_failure
먼저 상관계수 행렬을 만들고, seaborn heatmap으로 시각화하면 된다.
corr = df[features].corr().round(2)
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
이후 machine_failure와의 상관계수를 기준으로 절댓값이 큰 순서대로 정렬하면 된다.
상관계수는 -1에서 1 사이 값을 가진다.
1에 가까우면 양의 상관관계, -1에 가까우면 음의 상관관계, 0에 가까우면 선형 관계가 약하다고 볼 수 있다.
다만 machine_failure는 0과 1로 이루어진 이진 변수이기 때문에, 상관계수를 해석할 때 너무 강하게 단정하면 안 될 것 같다.
이 문제에서는 T-test 결과와 상관관계 결과를 비교하는 것도 중요하다.
T-test는 정상 그룹과 고장 그룹의 평균 차이를 보는 것이고, 상관관계는 두 변수의 선형적인 관계를 보는 것이다. 그래서 두 결과가 비슷하게 나올 수도 있지만, 완전히 같은 의미는 아니다.
박스플롯 시각화 방향
박스플롯 문제는 고장 여부에 따라 각 연속형 변수의 분포 차이를 시각적으로 확인하는 문제다.
x축은 machine_failure, y축은 각 특성값으로 두고, 5개의 변수를 subplot으로 그리면 된다.
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
sns.boxplot(x='machine_failure', y=feature, data=df, ax=axes[i])
여기서는 정상 설비와 고장 설비의 중앙값, 사분위 범위, 이상치 분포를 비교하면 된다.
기초통계에서 평균과 중앙값으로 확인했던 차이가 박스플롯에서도 보이는지 연결해서 해석해야 한다.
예를 들어 고장 설비의 torque 박스가 정상 설비보다 위쪽에 있다면, 고장 설비에서 토크가 더 높은 경향이 있다고 볼 수 있다.
반대로 박스의 위치가 거의 겹치면 해당 변수만으로는 고장 여부를 구분하기 어려울 수 있다.
카이제곱 검정 방향
카이제곱 검정은 Type과 machine_failure 사이에 연관성이 있는지 확인하는 문제다.
T-test는 수치형 변수의 평균 차이를 검정하는 방법이고, 카이제곱 검정은 범주형 변수 간의 독립성을 검정하는 방법이다.
여기서는 Type이 L, M, H 같은 범주형 변수이고, machine_failure도 정상/고장이라는 범주형 변수이므로 카이제곱 검정을 사용할 수 있다.
먼저 교차표를 만든다.
contingency_table = pd.crosstab(df['Type'], df['machine_failure'])
그다음 chi2_contingency()를 사용해서 카이제곱 통계량과 p-value를 구하면 된다.
chi2, p, dof, expected = chi2_contingency(contingency_table)
가설은 다음과 같이 세우면 된다.
귀무가설은 제품 등급과 고장 여부가 독립이라는 것이다.
대립가설은 제품 등급과 고장 여부가 서로 연관성이 있다는 것이다.
p-value가 0.05보다 작으면 귀무가설을 기각하고, 제품 등급과 고장 여부 사이에 통계적으로 유의한 연관성이 있다고 판단할 수 있다.
추가로 제품 등급별 고장률도 계산해야 한다. 단순히 p-value만 보는 것이 아니라, 어떤 등급에서 고장률이 더 높은지 해석하는 것이 중요하다.
머신러닝 파트
선형 회귀 모델 방향
필수 3번은 air_temp를 이용해 process_temp를 예측하는 선형 회귀 문제다.
공기 온도와 공정 온도는 서로 선형 관계가 있을 것으로 예상되기 때문에 LinearRegression을 사용하면 된다.
독립변수 X는 air_temp, 종속변수 y는 process_temp다.
주의할 점은 sklearn의 LinearRegression은 X를 2차원 형태로 넣어야 한다는 것이다.
X = df[['air_temp']]
y = df['process_temp']
이후 모델을 학습하고, 결정계수 R²를 계산하면 된다.
회귀식은 다음 형태로 작성할 수 있다.
process_temp = 계수 × air_temp + 절편
그리고 air_temp가 305K일 때 process_temp를 예측하면 된다.
이 문제는 머신러닝 문제이지만, 회귀식과 결정계수를 함께 해석해야 한다는 점에서 통계적인 느낌도 있다.
R²가 높다면 공기 온도가 공정 온도를 잘 설명한다고 볼 수 있고, 낮다면 단순히 공기 온도만으로 공정 온도를 설명하기 어렵다고 볼 수 있다.
RandomForest 모델 방향
도전 1번은 동력 및 마모 관련 특성과 제품 등급을 사용해 설비 고장 여부를 예측하는 문제다.
사용할 변수는 다음과 같다.
- rotational_speed
- torque
- tool_wear
- Type
타깃 변수는 machine_failure다.
여기서 Type은 L, M, H로 이루어진 범주형 데이터이므로 숫자로 바꾸는 인코딩이 필요하다. 문제에서는 LabelEncoder를 사용하라고 되어 있다.
le = LabelEncoder()
df['Type_encoded'] = le.fit_transform(df['Type'])
인코딩 후에는 le.classes_를 확인해서 어떤 숫자가 어떤 등급에 해당하는지 봐야 한다.
그다음 train/test 데이터를 나눈다.
train_test_split(X, y, test_size=0.3, random_state=42)
모델은 RandomForestClassifier를 사용한다.
RandomForestClassifier(random_state=42)
이 문제에서 중요한 부분은 모델 정확도뿐만 아니라 Feature Importance를 확인하는 것이다.
RandomForest는 각 변수가 예측에 얼마나 중요한 역할을 했는지 중요도를 제공한다. 이를 막대 그래프로 시각화하면 어떤 특성이 고장 예측에 더 큰 영향을 주는지 볼 수 있다.
여기서는 단순히 정확도가 높다에서 끝내지 않고, torque, tool_wear, rotational_speed, Type 중 어떤 변수가 더 중요하게 나타났는지 해석하는 방향으로 풀어야 한다.
로지스틱 회귀 모델 방향
도전 2번은 온도 및 동력 관련 특성을 사용해 설비 고장 여부를 예측하는 로지스틱 회귀 문제다.
사용할 변수는 다음과 같다.
- air_temp
- process_temp
- torque
타깃 변수는 machine_failure다.
로지스틱 회귀는 분류 모델이기 때문에 정상/고장처럼 0과 1로 나뉘는 값을 예측할 때 사용할 수 있다.
먼저 train/test 데이터를 분리하고, LogisticRegression 모델을 학습하면 된다.
model = LogisticRegression(max_iter=1000)
문제에서 수렴 경고가 발생할 수 있다고 했기 때문에 max_iter 값을 늘려주는 방향을 생각해야 한다.
이 문제에서 봐야 할 것은 세 가지다.
첫 번째는 모델 정확도다.
두 번째는 각 특성의 계수다. 로지스틱 회귀의 계수를 보면 각 변수가 고장 확률에 어떤 방향으로 영향을 주는지 확인할 수 있다.
계수가 양수면 해당 변수가 증가할수록 고장일 가능성이 커지는 방향으로 해석할 수 있고, 음수면 반대 방향으로 볼 수 있다.
세 번째는 새로운 설비 데이터에 대한 고장 확률 예측이다.
조건은 다음과 같다.
- air_temp : 302K
- process_temp : 310K
- torque : 72Nm
여기서는 predict_proba()를 사용해서 정상 확률과 고장 확률을 확인해야 한다.
model.predict_proba(new_sample)
이 문제는 로지스틱 회귀의 장점인 확률 해석을 활용하는 문제라고 볼 수 있다.
Feature Engineering 방향
도전 3번은 파생 변수를 만들어 RandomForest 모델 성능이 좋아지는지 확인하는 문제다.
생성할 파생 변수는 두 가지다.
첫 번째는 power다.
power는 회전 속도와 토크를 이용해 전력을 계산하는 변수다.
power = 2 * np.pi * rotational_speed * torque / 60
두 번째는 temp_diff다.
temp_diff는 공정 온도와 공기 온도의 차이다.
temp_diff = process_temp - air_temp
이 두 변수는 기존 변수들을 조합해서 만든 파생 변수다.
파생 변수를 만든 뒤에는 기술통계로 값의 범위를 확인하고, 기존 변수와 함께 RandomForest 모델에 넣어야 한다.
사용할 변수는 다음과 같다.
- rotational_speed
- torque
- tool_wear
- power
- temp_diff
그다음 도전 1에서 만든 RandomForest 모델과 정확도를 비교한다.
문제에서는 도전 1 결과가 98.13%라고 제시되어 있으므로, 새 모델의 정확도가 이보다 높아졌는지 확인하면 된다.
여기서 중요한 것은 단순히 정확도가 올랐다, 떨어졌다가 아니다.
파생 변수를 추가했을 때 Feature Importance에서 power나 temp_diff가 얼마나 중요하게 나타나는지 확인해야 한다.
만약 파생 변수가 높은 중요도를 가진다면, 기존 변수만으로는 표현하기 어려웠던 정보를 새 변수가 잘 담고 있다고 해석할 수 있다.
반대로 중요도가 낮거나 성능이 좋아지지 않는다면, 파생 변수가 모델에 큰 도움을 주지 않았다고 볼 수 있다.
3. 나의 간단 소감
오늘은 개인과제 문제를 바로 풀기보다, 먼저 전체 구조를 읽고 어떤 방향으로 접근해야 할지 정리했다.
처음 과제를 봤을 때는 문제 수가 많아서 꽤 부담스러웠다. 기초통계, T-test, 선형회귀, RandomForest, 로지스틱 회귀, 상관관계, 박스플롯, 카이제곱 검정, Feature Engineering까지 한 번에 들어가 있어서 처음에는 어디서부터 손대야 할지 헷갈렸다.
그런데 문제를 하나씩 나눠보니 흐름이 조금 보였다. 결국 핵심은 machine_failure를 기준으로 설비 특성들이 어떻게 달라지는지 보고, 그 차이를 통계적으로 확인한 뒤, 머신러닝 모델로 고장 여부를 예측해보는 것이다.
통계 파트에서는 정상 설비와 고장 설비를 비교하는 것이 중심이다. 평균과 중앙값을 보고, T-test로 평균 차이가 유의한지 확인하고, 상관관계와 박스플롯으로 변수별 차이를 다시 확인하는 흐름이다. 여기에 Type처럼 범주형 변수는 카이제곱 검정으로 따로 분석해야 한다.
머신러닝 파트에서는 선형회귀, RandomForest, 로지스틱 회귀가 각각 다른 역할을 한다. 선형회귀는 공기 온도로 공정 온도를 예측하는 회귀 문제이고, RandomForest와 로지스틱 회귀는 설비 고장 여부를 예측하는 분류 문제다. 같은 머신러닝이어도 어떤 값을 예측하느냐에 따라 접근 방식이 달라진다는 점을 다시 확인했다.
특히 이번 과제에서는 해석이 중요해 보인다. 단순히 코드를 실행해서 숫자를 얻는 것보다, 그 숫자가 어떤 의미인지 설명해야 한다. 평균과 중앙값이 왜 다른지, p-value가 작다는 것이 무엇을 뜻하는지, Feature Importance가 높은 변수가 왜 중요한지까지 말로 정리해야 한다.
Feature Engineering 문제도 인상적이었다. 기존 변수만 사용하는 것이 아니라 power, temp_diff처럼 도메인 지식을 반영한 파생 변수를 만들고, 이 변수가 모델 성능에 도움이 되는지 비교해야 한다. 이 부분은 실제 데이터 분석에서 단순히 모델을 돌리는 것보다 변수를 어떻게 설계하느냐가 중요하다는 점을 보여주는 것 같다.
오늘 정리하면서 느낀 건, 이번 과제가 지금까지 배운 내용을 한 번에 연결하는 종합 문제라는 점이다. 통계는 데이터의 차이를 설명하고, 머신러닝은 그 차이를 바탕으로 예측을 수행한다. 그리고 시각화는 그 과정을 사람이 이해할 수 있게 도와준다.
아직 실제 답안을 완성한 것은 아니지만, 어떤 순서로 접근해야 할지는 어느 정도 잡힌 것 같다. 이번 과제는 코드를 많이 작성하는 것도 중요하지만, 분석 결과를 해석하는 글까지 같이 완성해야 하는 과제라서 차근차근 정리하면서 풀어봐야겠다.
'내일배움캠프' 카테고리의 다른 글
| [본캠프] 데이터기반 QA/QC 부트캠프 37일차 (0) | 2026.07.02 |
|---|---|
| [본캠프] 데이터기반 QA/QC 부트캠프 36일차 (0) | 2026.07.01 |
| [본캠프] 데이터기반 QA/QC 부트캠프 34일차 (1) | 2026.06.29 |
| [본캠프] 데이터기반 QA/QC 부트캠프 33일차 (0) | 2026.06.26 |
| [본캠프] 데이터기반 QA/QC 부트캠프 32일차 (0) | 2026.06.25 |