본문 바로가기

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

[빅데이터분석기사] 모의고사2 (이상치, 소수점데이터 찾기, 소수점데이터처리, 분류(3개set), 독립표본t-test)

320x100

* 퇴근후딴짓 님의 캐글 문제를 제가 풀어본 결과입니다.*

 

[유형1] 이상치찾기, 소수점데이터 찾고 처리하기(올림/내림/버림)

(문제) 주어진 데이터에서 이상치(소수점 나이)를 찾고 올림, 내림, 버림(절사)했을때 3가지 모두 이상치 'age' 평균을 구한 다음 모두 더하여 출력하시오.

 

-> 문제 바로가기(캐글)

 

* 올림/버림/내림

 - import numpy as np

 - 올림 : np.ceil(df['컬럼명'])

 - 내림 : np.floor(df['컬럼명'])

 - 버림 : np.trunc(df['컬럼명'])

 

* 소수점 데이터 찾는 방법 : 값 - 내림해서 뺀 값이 0이 아닌 경우 : df['컬럼'] - np.floor(df['컬럼') != 0 

 

(풀이) 

# 라이브러리 및 데이터 불러오기
import pandas as pd
import numpy as np

df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')

# EDA
# print(df.shape)
# print(df.head(3))
# print(df.info())
# print(df.isnull().sum())

# 이상치(소수점 나이) 찾기
cond = df['age']- np.floor(df['age']) == 0 # 내림해서 뻈을 때 정수인 경우
print(df[~cond].age) # 정수가 아닌 경우 (8개)

# 올림일 때 이상치 평균 (np.ceil(df['컬럼명']))
a = np.ceil(df[~cond].age).mean()

# 내림일 때 이상치 평균(np.floor(df['컬럼명']))
b = np.floor(df[~cond].age).mean()

# 버림일 때 이상치 평균(np.trunc(df['컬럼명']))
c = np.trunc(df[~cond].age).mean()

print(a, b, c)
320x100

[유형2] 분류, 이상치 처리하기

(문제) 당뇨병 여부 판단하기, 이상치 처리(Glucose, BloodPressure, SkinThickness, Insulin, BMI가 0인 값)

 

-> 문제 바로가기(캐글)

 

(풀이) 

##### 라이브러리 및 데이터 읽어오기
import pandas as pd

X_test = pd.read_csv("data/X_test.csv")
X_train = pd.read_csv("data/X_train.csv")
y_train = pd.read_csv("data/y_train.csv")

##### EDA

# print(X_train.shape, X_test.shape, y_train.shape)
# print(X_train.info(), X_test.info(), y_train.info())
# print(X_train.head(3), y_train.head(3))
# print(y_train['Outcome'].value_counts())

##### 데이터 전처리

# 결측치 확인
# print(X_train.isnull().sum(), X_test.isnull().sum()) # 없음

# 이상치 처리 (Glucose, BloodPressure, SkinThickness, Insulin, BMI가 0인 값) : 평균으로 대체
cols = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
# print(X_train[cols].head())
X_cols_mean = X_train[cols].mean()
# print(X_cols_mean)
X_train[cols] = X_train[cols].replace(0, X_cols_mean) #0을 평균으로 대체
# print(X_train[cols].head())

# 학습에 불필요한 컬럼 삭제
# print(X_train.shape, X_test.shape)
X_train = X_train.drop('id', axis =1)
X_id = X_test.pop('id')
# print(X_train.shape, X_test.shape)

# 피처엔지니어링 (수치형 데이터만 있으므로 분리하지않고 MinMaxScaler 수행)
from sklearn.preprocessing import MinMaxScaler
cols = X_train.select_dtypes(exclude = 'object').columns
scaler = MinMaxScaler()
X_train[cols] = scaler.fit_transform(X_train[cols])
X_test[cols] = scaler.transform(X_test[cols])
# print(X_train.head(), X_test.head())

##### 평가를 위한 훈련/검증용 데이터 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train,
                                           y_train['Outcome'],
                                           test_size = 0.2,
                                           random_state = 2023)
# print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)

##### 모델 생성 (랜덤포레스트, ROC 평가, 하이퍼파라미터 튜닝 수행)
# 랜던포레스트 분류 모델 생성
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators = 200, max_depth = 8, random_state = 2023)
model.fit(X_tr, y_tr)
pred = model.predict(X_val)

# ROC로 평가해보기
from sklearn.metrics import roc_auc_score
pred_roc = model.predict_proba(X_val)
# print(roc_auc_score(y_val, pred_roc[:,1]))

# 하이퍼파라미터 튜닝
# n_estimators = 200, max_depth = 8, random_state = 2023 : 0.8613372093023256
# n_estimators = 400, max_depth = 8, random_state = 2023 : 0.854360465116279
# n_estimators = 400, max_depth = 6, random_state = 2023 : 0.8593023255813954
# n_estimators = 200, max_depth = 6, random_state = 2023 : 0.8601744186046512
# n_estimators = 200, max_depth = 10, random_state = 2023 : 0.8479651162790698

##### X_test로 예측하고 최종 결과 제출하기

pred = model.predict(X_test)
# print(pred)

submit = pd.DataFrame({
    'id' : X_id,
    'Outcome': pred
})

submit.to_csv('0000.csv', index=False)

# print(submit)
반응형

[유형3] 독립표본T-test

(문제) 어떤 특정 약물을 복용한 사람들의 평균체온이 복용하지 않은 사람들의 평균체온과 유의미하게 다른지 검정해보려고 합니다. 검정통계량, p-valu, 검정결과를 출력하시오. (단, 각 그룹의 체온은 정규분포를 따른다고 가정합니다.)

 

-> 문제 바로가기(캐글)

 

* stats.ttest_ind(그룹1, 그룹2)

 

(풀이) 

# 데이터 수집
group1 = [36.8, 36.7, 37.1, 36.9, 37.2, 36.8, 36.9, 37.1, 36.7, 37.1]
group2 = [36.5, 36.6, 36.3, 36.6, 36.9, 36.7, 36.7, 36.8, 36.5, 36.7]


# 가설
# 귀무가설 : 약물을 복용한 그룹과 복용하지 않은 그룹의 체온 데이터는 차이가 없다.
# 대립가설 : 약물을 복용한 그룹과 복용하지 않은 그룹의 체온 데이터는 차이가 있다.

from scipy import stats

# print(dir(stats))
# print(help(stats.ttest_ind))

t_stat, p_val = stats.ttest_ind(group1, group2)

# 검정통계량
print(t_stat)

# p_value
print(p_val)

# 검정결과
print('p-value가 0.05보다 작으므로 귀무가설을 기각한다. 두 그룹은 차이가 있다.')
320x100
반응형