1. 라이브러리 임포트
pandas를 `pd`, numpy를 `np`, seaborn을 `sns`, matplotlib.pyplot을 `plt`로 임포트하세요.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
2. 데이터 불러오기
- 파일을 읽어 churn_df라는 이름의 데이터프레임으로 저장하세요.
- 파일명: employee_churn.csv
churn_df = pd.read_csv('employee_churn.csv')
churn_df
pd.read_csv
3. 데이터 확인
work_life_balance(일과 삶의 균형 만족도)와 department(부서명)에 따른 overtime(초과근무)를 시각화를 통해 보고자합니다.
- seaborn의 barplot()을 이용하여 그래프를 만드세요.
- x= 'department', y='work_life_balance', hue='overtime'
- 4지 선다의 문제를 보고 정답을 답03 변수에 저장하세요.
다음 중 부서(department)와 초과근무 여부(overtime)에 따른 work_life_balance 평균 비교 결과에 대한 설명으로 가장 적절한 것은 무엇인가?
1. 모든 부서에서 초과근무를 하지 않는 직원들의 work_life_balance가 더 높다.
2. finance 부서는 초과근무를 하는 직원의 work_life_balance가 더 높다.
3. engineering 부서는 초과근무 여부와 관계없이 work_life_balance에 큰 차이가 없다.
4. sales 부서는 초과근무를 하는 직원의 work_life_balance가 더 높다.
sns.barplot(data=churn_df, x= 'department', y='work_life_balance', hue='overtime')
답03 = 2
sns.barplot(data=churn_df, x= 'department', y='work_life_balance', hue='overtime')
컬럼명들에 따옴표 주의
4. 결측치 확인 및 처리
결측치가 있는 컬럼을 찾고, 결측치가 존재하는 행을 지우고자 합니다.
- 결측치를 찾는 코드를 작성하고, 결측치가 존재하는 컬럼명을 답04 변수에 저장하세요(예 : 답04 = 'overtime, attrition')
- 결측치가 존재하는 행을 지우고 처리한 데이터를 pre_df 변수에 저장하세요.
- 저장된 pre_df 변수는 reset_index()를 이용하여 index를 초기화 하세요.
- drop = True, inplace = True
churn_df.isna().sum()
답04 = 'years_experience, salary'
pre_df = churn_df.dropna(subset=['years_experience', 'salary'])
pre_df.reset_index(drop=True, inplace=True)
pre_df
churn_df.isna().sum()
pre_df = churn_df.dropna(subset=['years_experience', 'salary'])
pre_df.reset_index(drop=True, inplace=True)
pre_df / # pre_df.isna().sum()
일정 컬럼만 삭제할 때는 dropna( subset = [ ] ) 형태로 무조건 써줘야 함
삭제가 잘 되었는지 꼭 확인해볼 것
5. Groupby를 이용한 데이터 확인
부서별로 직원들의 직무 만족도(job_satisfaction) 평균을 분석하여, 직원 만족도가 높은 부서를 찾고자 합니다.
- groupby를 이용하여 각 부서(department)의 평균 직무 만족도를 계산하여, 가장 만족도가 높은 부서를 찾으세요.
- 문제를 보고 만족도가 높은 부서를 답05 변수에 저장하세요.
1. Sales
2. HR
3. Engineering
4. Marketing
5. Engineering
pre_df.groupby('department')['job_satisfaction'].mean()
답05 = 4
pre_df.groupby('department')['job_satisfaction'].mean()
답05 = 숫자 고르면 됨
6. crosstab을 이용한 데이터 확인
부서별로 이직률(Attrition 비율)을 분석하고자 합니다.
이를 위해 pandas의 crosstab() 함수를 사용하여 부서(department)별 이직 여부(attrition) 비율을 계산합니다.
- 각 부서별로 이직률과 재직률을 비율(%)로 확인합니다.
- 가장 attribution(이직여부)가 높은 부서를 답06 변수에 저장하세요(예 : 답06 = 'hr')
- normalize = 'index'
- round()를 사용하여 소수점 둘째자리까지 출력하세요.
print(pd.crosstab(pre_df['department'], pre_df['attrition'], normalize='index').round(2)
pd.crosstab(index=pre_df['department'], columns=pre_df['attrition'], normalize='index').round(2)
답06 = 'engineering'
print(pd.crosstab(pre_df['department'], pre_df['attrition'], normalize='index').round(2)
pd.crosstab(index=pre_df['department'], columns=pre_df['attrition'], normalize='index').round(2)
-- 동일함
print(pd.crosstab(pre_df['department'], pre_df['attrition'], normalize='index').round(2))
- pd.crosstab 두 범주형 변수 간의 빈도나 비율을 빠르게 볼 수 있는 함수
- normalize='index' 옵션: 집계값이 아니라 비율 기반 비교가 가능 - pre_df [ 'col' ] 로 써야 하는 이유 : DataFrame이 아니라 pandas 범용 함수이기 때문
- pd범용 함수
pd.crosstab(series1, series1)
pd.concat( [df1, df2, ...] )
pd.cut(series, bins=...)
pd.merge(df1, df2, on = 'key')
pd.pivot(df, index = ... , columns = ...)
- df 메서드
df.groupby('col')
df.sort_values('col')
df.pivot_table(index='col', columns = 'col2')
df.agg( {'col' : 'mean'} )
df.drop( [ 'col1', 'col2'], axis = 1)
출력:
attrition 0 1
department
engineering 0.61 0.39
finance 0.67 0.33
hr 0.66 0.34
marketing 0.69 0.31
sales 0.73 0.27
7. 범주형 변수 인코딩
범주형 변수들을 인코딩 합니다.
- department 변수는 원핫 인코딩 진행
- overtime은 np.where을 이용하여 Y는 1로 N은 0으로 변경
- 아래 셀을 실행하여 education_level에 대한 인코딩을 진행해 주세요.
- 원핫 인코딩은 drop_first = True 옵션 사용
- 처리된 데이터는 encoding_df 변수에 저장
encoding_df = pd.get_dummies(data=pre_df, columns=['department'], drop_first=True)
encoding_df['overtime'] = np.where(encoding_df['overtime'] == 'Y', 1, 0)
encoding_df
encoding_df = pd.get_dummies(data=pre_df, columns=['department'], drop_first=True)
encoding_df['overtime'] = np.where(encoding_df['overtime'] == 'Y', 1, 0)
encoding_df
np.where(조건, 참일 때 값, 거짓일 때 값)
df 이름 할당 주의!!!!!
8. feature / target 분리
모델 학습을 위해 X, y를 분리합니다.
- X = attrition 제외 전부
- y = attrition
X = encoding_df.drop(columns='attrition')
y = encoding_df_clean['attrition']
X = encoding_df_clean.drop(columns='attrition')
y = encoding_df_clean['attrition']
9. train / test 데이터 분리
모델 학습 및 평가를 위해 데이터를 분리합니다.
- 데이터셋을 분리하기 위해 train_test_split을 import하세요.
- 훈련 데이터 셋 = X_train, y_train
- 검증 데이터 셋 = X_valid, y_valid
- random_state=42
- 훈련 데이터셋과 검증 데이터셋의 비율은 8:2
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)
10. 데이터 표준화
데이터 스케일링을 통해 모델 학습의 성능을 높입니다.
- StandardScaler를 이용해 Feature 데이터를 스케일링하세요.
- X_train은 fit_tranform을 이용하여 X_train 변수에 저장
- X_valid는 transform을 이용하여 X_test의 변수에 저장
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_valid)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_valid)
11. LightGBM 모델 학습
LightGBM 모델을 이용하여 학습합니다.
- n_estimators=100, max_depth=7, random_state=10
- LGBMClassifier를 사용해 attrition을 예측하는 모델을 학습하세요.
- LGBM모델을 lgbmc변수에 저장하세요.
- n_estimators=100, max_depth=6, learning_rate = 0.01, random_state=10
- 훈련은 스케일링 처리된 데이터를 사용해 주세요.
from lightgbm import LGBMClassifier
lgbmc = LGBMClassifier(n_estimators=100, learning_rate=0.1, max_depth=6, random_state=42)
lgbmc.fit(X_train, y_train)
from lightgbm import LGBMClassifier sklearn아님, LightGBMClassifier 아님
lgbmc = LGBMClassifier(n_estimators=100, learning_rate=0.1, max_depth=6, random_state=42)
lgbmc.fit(X_train, y_train)
12. XGBoost 모델 학습
XGBoost 모델을 학습합니다.
- 아래 셀을 실행하여 XGBClassifier를 불러오세요.
- XGBClassifier를 사용해 leave_yn을 예측하는 모델을 학습하세요.
- XGBoost모델을 xgbc변수에 저장하세요.
- n_estimators=200, max_depth=8, learning_rate=0.1, random_state=10
- 훈련은 스케일링 처리된 데이터를 사용하여 주세요.
from xgboost import XGBClassifier
xgbc = XGBClassifier(n_estimators = 200, max_depth = 8, learning_rate = 0.1, random_state = 10)
xgbc.fit(X_train, y_train)
from xgboost import XGBClassifier sklearn아님
xgbc = XGBClassifier(n_estimators = 200, max_depth = 8, learning_rate = 0.1, random_state = 10)
xgbc.fit(X_train, y_train)
13. 모델 성능 비교
모델 예측 성능을 비교합니다.
- accuracy_score, f1_score 출력
- lightGBM의 predict를 이용하여 검증 데이터를 예측하고, 예측된 데이터는 lgbmc_predict변수에 저장하여 주세요.
- xgboost의 predict를 이용하여 검증 데이터를 예측하고, 예측된 데이터는 xgbc_predict변수에 저장하여 주세요.
- 각 모델별 정확도와 f1-score를 출력
from sklearn.metrics import accuracy_score, f1_score
# 답안지
lgbmc_predict = lgbmc.predict(X_valid)
xgbc_predict = xgbc.predict(X_valid)
# 정답지 vs 답안지
print("LightGBM")
print("Accuracy:", accuracy_score(y_valid, lgbmc_predict))
print("F1 Score:", f1_score(y_valid, lgbmc_predict))
print("XGBoost")
print("Accuracy:", accuracy_score(y_valid, xgbc_predict))
print("F1 Score:", f1_score(y_valid, xgbc_predict))
from sklearn.metrics import accuracy_score, f1_score
# 답안지
lgbmc_predict = lgbmc.predict(X_valid)
xgbc_predict = xgbc.predict(X_valid)
# 정답지 vs 답안지
print("LightGBM")
print("Accuracy:", accuracy_score(y_valid, lgbmc_predict))
print("F1 Score:", f1_score(y_valid, lgbmc_predict))
print("XGBoost")
print("Accuracy:", accuracy_score(y_valid, lgbmc_predict))
print("F1 Score:", f1_score(y_valid, lgbmc_predict))
14. 딥러닝 모델 설계 및 학습
딥러닝 모델로 이직 여부를 예측합니다.
모델 구조
- Dense(64, selu) → BatchNormalization
- Dense(32, selu) → BatchNormalization
- Dense(16, selu)
- Dense(2, softmax)
optimizer: adam, loss: categorical_crossentropy, metric: accuracy
epochs=50, batch_size=32
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, BatchNormalization
from tensorflow.keras.utils import to_categorical
tf.random.set_seed(10)
y_train = to_categorical(y_train, num_classes=2)
y_valid = to_categorical(y_valid, num_classes=2)
# 1. 모델 생성 + 레이어 묶기
model = Sequential([
Dense(64, 'selu'),
BatchNormalization(),
Dense(32, 'selu'),
BatchNormalization(),
Dense(16, 'selu'),
Dense(2, 'softmax')
])
# 2. 컴파일
model.compile(
optimizer=Adam(),
loss='categorical_crossentropy',
metrics=['accuracy']
)
# 3. 학습
history = model.fit(
X_train, y_train,
epochs=50,
batch_size=32
)
# 1. 모델 생성 + 레이어 묶기
model = Sequential([
Dense(64, 'selu'),
BatchNormalization(),
Dense(32, 'selu'),
BatchNormalization(),
Dense(16, 'selu'),
Dense(2, 'softmax')
])
# 2. 컴파일
model.compile(
optimizer=Adam(),
loss='binary_crossentropy',
metrics=['accuracy']
)
# 3. 학습
history = model.fit(
X_train, y_train,
epochs=50,
batch_size=32
)
참고
| 분류 모델의 경우 |
회귀 모델의 경우 | |
| 마지막 unit = 1 | 마지막 unit = 2 | 마지막 unit = 회귀할 값의 개수에 맞게 설정 |
| 이진 분류, 단일 벡터 라벨 | 이진 분류, 원-핫 인코딩 라벨 | 일반적으로 단일 연속값 예측은 unit=1 다중 출력 회귀 문제(예: 여러 연속값 예측)는 출력값 개수만큼 유닛 수 지정 |
| 활성화 : sigmoid |
활성화 : softmax | 회귀에서는 출력값이 연속 수치 = 보통 활성화 함수를 사용X = None 또는 linear 활성화 함수 |
| loss : binary_crossentropy | loss : categorical_crossentropy | loss : 평균 제곱 오차(MSE), 평균 절댓값 오차(MAE)등을 사용 |
출처: 내돈내산 문제집

[이패스코리아] 2025 이패스 AI능력시험 AICE Associate /사은품 마스크제공 - 컴퓨터 입문/활용 | 쿠팡
쿠팡에서 [이패스코리아] 2025 이패스 AI능력시험 AICE Associate /사은품 마스크제공 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 컴퓨터 입문/활용 제품도 바로 쿠팡에서 확인할 수 있습
www.coupang.com