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
반응형
'자격증공부 > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사] 모의고사3 (결측치, 분류, map, 단일T검정) (0) | 2023.06.30 |
---|---|
[빅데이터분석기사] 모의고사 1 (이상치, 분류(3개set), 쌍체T표본검정) (0) | 2023.06.30 |
[빅데이터분석기사] 모의고사 5 (누적합, 결측치, 이상치, 정렬, 회귀, 정규분포검증) (0) | 2023.06.30 |
[빅데이터분석기사] 모의고사4 (표준편차, 그룹합, 값 대체, 회귀, 일원배치법) (0) | 2023.06.30 |
[빅데이터분석기사][작업형2] 5회 기출문제 풀이(회귀) (0) | 2023.06.22 |