자격증/빅데이터 분석기사

빅데이터 분석기사 실기 2유형

구대연 2024. 6. 25. 15:20

유형2를 푸는 나만의 흐름 만들기!

  1. 문제를 꼼꼼히 읽고 문제를 정확하게 이해하기 (문제가 원하는 그대로 해야함)
  2. 분류, 회귀 판단하기
  3. 결측치, 이상치 파악 (1유형에서 주로 하지만 혹시나 모르니 확인하기)
  4. 관련성 없는 column삭제 (연관성분석으로 관련성 확인)
  5. 수치형, 범주형 column분류 (수치형 → 스케일링, 범주형 → 원핫인코딩 하기 위해)
  6. 스케일링, 원핫인코딩
  7. train, validation 분리 (validatoin을 답안으로 제출금지!)
  8. 모델선정 (RandomForest만 사용해도 충분함. 분류 → RandomForestClassifier, 회귀 → RandomForestRegressor)
  9. 문제에서 원하는 판별법으로 판단 (ROC, Accuracy) (시험에 제출하는 것 아님 그냥 정확도 확인용)
  10. test데이터로 prediction
  11. 결과값 제출 predict_test.to_csv(’수험번호.csv’ , index=False)
  12. read_csv로 제출한 답안 다시 확인해보기 </aside>

분류 문제

# 제공된 3개 데이터 (y_test데이터 활용X)
X_train.shape, X_test.shape, y_train.shape

##EDA
#
print(X_train.head())
print(y_train.head())
print(X_test.head())

#결측치 확인, column 유형확인
print(X_train.info())
print(y_train.info())
print(X_test.info())

#범주형 컬럼 개수 파악
print(len(X_train['Warehouse_block'].unique()))
print(len(X_test['Warehouse_block'].unique()))

print(len(X_train['Mode_of_Shipment'].unique()))
print(len(X_test['Mode_of_Shipment'].unique()))

print(len(X_train['Product_importance'].unique()))
print(len(X_test['Product_importance'].unique()))

print(len(X_train['Gender'].unique()))
print(len(X_test['Gender'].unique()))

#수치형, 범주형 column 분류
#범주형 컬럼 중 value의 개수가 3개 이하와 3개 초과로 나눔
col_num = ['Customer_care_calls','Customer_rating','Cost_of_the_Product','Prior_purchases','Discount_offered','Weight_in_gms']
col_cat1 = ['Mode_of_Shipment','Product_importance','Gender']
col_cat2 = 'Warehouse_block'

#범주형 원핫인코딩 
from pandas import get_dummies
X_train = pd.get_dummies(X_train, columns=col_cat1 , drop_first=True)
X_test = pd.get_dummies(X_test, columns=col_cat1 , drop_first=True)

#라벨인코딩
## 범주형 컬럼의 개수가 같을 때
from sklearn.preprocessing import LabelEncoder
for i in col_cat : 
    le = LabelEncoder()
    le.fit(X_train[i])
    X_train[i] = le.transform(X_train[i])
    X_test[i] = le.transform(X_test[i])
print(X_train)

## 범주형 컬럼의 개수가 다를 때
from sklearn.preprocessing import LabelEncoder
all_df = pd.concat([X_train.assign(ind="train"), X_test.assign(ind="test")])
le = LabelEncoder()
all_df[col_cat] = all_df[col_cat].apply(le.fit_transform)
X_train = all_df[all_df['ind'] == 'train']
X_train = X_train.drop('ind',axis=1)
print(X_train)
X_test = all_df[all_df['ind'] == 'test']
X_test = X_test.drop('ind',axis=1)
print(X_test)

# 결측값 대체
from sklearn.impute import SimpleImputer
## 연속형 변수의 결측값 대체
numeric_imputer = SimpleImputer(strategy='mean')
X_train_numeric = numeric_imputer.fit_transform(X_train_numeric)
X_test_numeric = numeric_imputer.transform(X_test_numeric)
## 범주형 변수의 결측값 대체
categorical_imputer = SimpleImputer(strategy='most_frequent')
X_train_categorical = categorical_imputer.fit_transform(X_train_categorical)
X_test_categorical = categorical_imputer.transform(X_test_categorical)

#수치형에 MinMax스케일링 적용
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train[col_num])
X_train[col_num] = scaler.transform(X_train[col_num])
X_test[col_num] = scaler.transform(X_test[col_num])

print(X_train) #스케일링이 잘 되었는지 확인

#ID컬럼 제외
X_train_id = X_train.pop('ID')
X_test_id = X_test.pop('ID')
print(X_train) #스케일링이 잘 되었는지 확인

#train과 validation데이터로 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['Reached.on.Time_Y.N'], test_size=0.3, random_state=42)

## 모델학습
# 1. RandomForest
# 모델 학습
from sklearn.ensemble import RandomForestClassifier
model1=RandomForestClassifier()
model1.fit(X_tr, y_tr)
model1_val_pred = model1.predict_proba(X_val)
print(model1_val_pred)

# 모델평가
# 1. ROC-AUC score
from sklearn.metrics import roc_auc_score
roc_score1 = roc_auc_score(y_val, model1_val_pred[:,1])
print(roc_score1)

# 2. accuracy_score - proba인 경우 사용 불가능
from sklearn.metrics import accuracy_score
roc_score2 = accuracy_score(y_val, model1_val_pred[:,1])
print(roc_score2)

# 2. xgboost
# 모델 학습
from xgboost import XGBClassifier
model2 = XGBClassifier()
model2.fit(X_tr, y_tr)
model2_val_pred = model2.predict_proba(X_val)

# 모델평가
# 1. ROC-AUC score
from sklearn.metrics import roc_auc_score
roc_score1 = roc_auc_score(y_val, model2_val_pred[:,1])
print(roc_score1)

# 2. Accuracy_score - proba인 경우 사용 불가능
from sklearn.metrics import accuracy_score
roc_score2 = accuracy_score(y_val, model2_val_pred[:,1])
print(roc_score2)

##test데이터 예측
model1_pred = model1.predict_proba(X_test)
print(model1_pred)

##데이터 내보내기
pd.DataFrame({'ID' : X_test_id, 'Reached.on.Time_Y.N' : model1_pred[:,1]}).to_csv('1234.csv',index=False)

##제출할 데이터 확인
df = pd.read_csv('1234.csv')
print(df)

회귀 문제

# 제공된 3개 데이터 (y_test데이터 활용X)
X_train.shape, X_test.shape, y_train.shape

##EDA
#
print(X_train.head())
print(Y_train.head())
print(X_test.head())

#결측치 확인, column 유형확인
print(X_train.info())
print(Y_train.info())
print(X_test.info())

# 결측값 대체

#범주형 컬럼 개수 파악
print(len(X_train['Warehouse_block'].unique()))
print(len(X_train['Mode_of_Shipment'].unique()))
print(len(X_train['Product_importance'].unique()))
print(len(X_train['Gender'].unique()))

#수치형, 범주형 column 분류
#범주형 컬럼 중 value의 개수가 3개 이하롸 3개 초과로 나눔
col_num = ['Customer_care_calls','Customer_rating','Cost_of_the_Product','Prior_purchases','Discount_offered','Weight_in_gms']
col_cat1 = ['Mode_of_Shipment','Product_importance','Gender']
col_cat2 = ['Warehouse_block']

#범주형에 원핫인코딩 적용 - value 3개 이하
from pandas import get_dummies
X_train = pd.get_dummies(X_train, columns=col_cat1 , drop_first=True)
X_test = pd.get_dummies(X_test, columns=col_cat1 , drop_first=True)

#라벨인코딩
## 범주형 컬럼의 개수가 같을 때
from sklearn.preprocessing import LabelEncoder
for i in col_cat : 
    le = LabelEncoder()
    le.fit(X_train[i])
    X_train[i] = le.transform(X_train[i])
    X_test[i] = le.transform(X_test[i])
print(X_train)

## 범주형 컬럼의 개수가 다를 때
from sklearn.preprocessing import LabelEncoder
all_df = pd.concat([X_train.assign(ind="train"), X_test.assign(ind="test")])
le = LabelEncoder()
all_df[col_cat] = all_df[col_cat].apply(le.fit_transform)
X_train = all_df[all_df['ind'] == 'train']
X_train = X_train.drop('ind',axis=1)
print(X_train)
X_test = all_df[all_df['ind'] == 'test']
X_test = X_test.drop('ind',axis=1)
print(X_test)

# 결측값 대체
from sklearn.impute import SimpleImputer
## 연속형 변수의 결측값 대체
numeric_imputer = SimpleImputer(strategy='mean')
X_train_numeric = numeric_imputer.fit_transform(X_train_numeric)
X_test_numeric = numeric_imputer.transform(X_test_numeric)
## 범주형 변수의 결측값 대체
categorical_imputer = SimpleImputer(strategy='most_frequent')
X_train_categorical = categorical_imputer.fit_transform(X_train_categorical)
X_test_categorical = categorical_imputer.transform(X_test_categorical)

#수치형에 MinMax스케일링 적용
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train[col_num])
X_train[col_num] = scaler.transform(X_train[col_num])
X_test[col_num] = scaler.transform(X_test[col_num])

print(X_train) #스케일링이 잘 되었는지 확인

#ID컬럼 제외
X_train_id = X_train.pop('ID')
X_test_id = X_test.pop('ID')
print(X_train) #스케일링이 잘 되었는지 확인

#train과 validation데이터로 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['Reached.on.Time_Y.N'], test_size=0.3, random_state=42)

##모델학습
#1. RandomForest
# 모델 학습
from sklearn.ensemble import RandomForestRegressor
model1=RandomForestRegressor()
model1.fit(X_tr, y_tr)
model1_val_pred = model1.predict(X_val)
print(model1_val_pred)

#모델평가
#1. MSE
from sklearn.metrics import mean_squared_error 
MSE1 = mean_squared_error(y_val, model1_val_pred) 

#2. R2
from sklearn.metrics import r2_score
r2_1 = r2_score(y_val, model1_val_pred)

# 2.XGboost
# 모델 학습
from xgboost import XGBRegressor
model2 = XGBRegressor()
model2.fit(X_tr, y_tr)
model2_val_pred = model2.predict(X_val)

#모델평가
#1. MSE
from sklearn.metrics import mean_squared_error 
MSE2 = mean_squared_error(y_val, model2_val_pred) 

#2. R2
from sklearn.metrics import r2_score
r2_2 = r2_score(y_val, model2_val_pred)

##test데이터 예측 (랜덤포레스트와 xgboost중 RMSE가 작은 모델로 적합)
model1_pred = model1.predict_proba(X_test)
print(model1_pred)

##데이터 내보내기
pd.DataFrame({'ID' : X_test_id, 'Reached.on.Time_Y.N' : model1_pred[:,1]}).to_csv('1234.csv',index=False)

##제출할 데이터 확인
df = pd.read_csv('1234.csv')
print(df)