본문 바로가기

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

[빅데이터분석기사] 모의고사3 (결측치, 분류, map, 단일T검정)

320x100

 

[유형1] 결측치 처리(map 활용)

(문제) 주어진 데이터에서 결측치가 80% 이상 되는 컬럼은 삭제하고, 80% 미만인 결측치가 있는 컬럼은 'city' 별 중앙값으로 값을 대체하고, 'f1'컬럼의 평균값을 출력하세요.

ㅇ 문제 바로가기(캐글)

 

* df['컬럼명'].map( { 'A':a, 'B':b, 'C':c })

* 결측치 대체

 - 결측치 컬럼 삭제 : df.drop['컬럼명']

 - 결측치 채우기 : df.fillna(값) 

 

(풀이)

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

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

# 비율 구하기
# print(df.isnull().sum()/df.shape[0])

# 80% 이상 컬럼 삭제
# help(df.drop)
df = df.drop(['f3'], axis=1)
print(df)

# 80% 미만 컬럼은 city별 중앙값으로 대체
# print(df['city'].value_counts())
g = df[df['city']=='경기'].f1.median() # 경기
s = df[df['city']=='서울'].f1.median() # 서울
d = df[df['city']=='대구'].f1.median() # 대구
b = df[df['city']=='부산'].f1.median() # 부산
# print(g, s, d, b)
# help(df.fillna)
values = {"경기":g, "서울":s, "대구":d, "부산":b}
df['f1'] = df['f1'].fillna(df['city'].map(values))
# print(df.isnull().sum())


# f1컬럼 평균값
print(df['f1'].mean())

 

반응형

[유형2] 성인 인구조사 소득 예측(분류, 50K 이하/초과 여부 분류)

(문제) X_train, y_train, X_test에서 income(수익) 예측하기

 

ㅇ 문제 바로가기(캐글)

 

* 결측치 처리는 필수 : 최빈값으로 대체 : df['컬럼'].fillna(값)

* 수치형데이터 피처엔지니어링시, 컬럼명을 정의한 뒤 수행 할 것

*  분류 문제에서 타겟컬럼이 0,1 데이터가 아닌 경우 데이터변환 할 것 : y = (y_train['컬럼'] ! = '데이터').astype(int)

 

(풀이)

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

# X_train = pd.read_csv('X_train.csv')
# y_train = pd.read_csv('y_train.csv')
# X_test = pd.read_csv('X_test.csv')

##### EDA
# print(X_train.shape, y_train.shape, X_test.shape)
# print(X_train.head(3))
# print(y_train.head(3))
# print(X_train.info(), y_train.info())
# print(X_train.isnull().sum())
# print(y_train['income'].value_counts())


##### 데이터전처리
# 불필요한 컬럼 삭제(id 등)
# print(help(df.drop)) : df.drop(columns=['B', 'C'])
# print(help(df.pop)) :  df.pop('class')
X_train = X_train.drop(columns=['id'])
X_id = X_test.pop('id')
# print(X_train.shape, X_test.shape)

# 결측치 처리 (workclass, occupation, native.country) : 최빈값으로 대체
w = X_train['workclass'].mode()[0]
o = X_train['occupation'].mode()[0]
n = X_train['native.country'].mode()[0]

w1 = X_test['workclass'].mode()[0]
o1 = X_test['occupation'].mode()[0]
n1 = X_test['native.country'].mode()[0]

X_train['workclass'] = X_train['workclass'].fillna(w)
X_train['occupation'] = X_train['occupation'].fillna(o)
X_train['native.country'] = X_train['native.country'].fillna(n)

X_test['workclass'] = X_test['workclass'].fillna(w1)
X_test['occupation'] = X_test['occupation'].fillna(o1)
X_test['native.country'] = X_test['native.country'].fillna(n1)

# print(w, o, n)
# print(X_train.isnull().sum(), X_test.isnull().sum())


##### 피처엔지니어링
## 숫자/범주형 데이터 분리
n_train = X_train.select_dtypes(exclude = 'object').copy()
n_test = X_test.select_dtypes(exclude = 'object').copy()

c_train = X_train.select_dtypes(include = 'object').copy()
c_test = X_test.select_dtypes(include = 'object').copy()

# print(n_train.head(3))

## 수치형데이터 : MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
cols = X_train.select_dtypes(exclude = 'object').columns
# print(cols)
scaler = MinMaxScaler()
n_train[cols] = scaler.fit_transform(n_train[cols])
n_test[cols] = scaler.transform(n_test[cols])
# print(n_train.head())

## 범주형데이터 : 원핫인코딩 수행 (train, test 데이터 합친 후 수행하고, 다시 분리하기)
all_df = pd.concat([c_train, c_test])
all_df = pd.get_dummies(all_df)

line = int(c_train.shape[0])
c_train = all_df.iloc[:line, :].copy()
c_test = all_df.iloc[line:, :].copy()

## 수치/범주형 데이터를 다시 X_train, X_test로 합치기
X_train = pd.concat([n_train, c_train], axis = 1)
X_test = pd.concat([n_test, c_test], axis = 1)
# print(X_train.head())

## 타겟컬럼을 0, 1로 변경
# print(y_train.head())
y = (y_train['income'] != '<=50K').astype(int)
# print(y.head())

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

##### 모델 생성(분류)
from sklearn.ensemble import RandomForestClassifier
# print(help(RandomForestClassifier))
model = RandomForestClassifier(n_estimators= 600, max_depth = 12, random_state = 2022)
model.fit(X_tr, y_tr)

##### ROC지표로 자체평가
from sklearn.metrics import roc_auc_score
pred = model.predict_proba(X_val)
# print(roc_auc_score(y_val, pred[:,1]))

##### 하이퍼파라미터 조정
# n_estimators= 200, max_depth = 4, random_state = 2022 : 0.8913571685519006
# n_estimators= 200, max_depth = 4, random_state = 2022 : 0.8929399656261242
# n_estimators= 400, max_depth = 8, random_state = 2022 : 0.9072012270674287
# n_estimators= 600, max_depth = 8, random_state = 2022 : 0.9076274031735881
# n_estimators= 900, max_depth = 8, random_state = 2022 : 0.9072352012470524
# n_estimators= 800, max_depth = 8, random_state = 2022 : 0.9073501139134259
# n_estimators= 600, max_depth = 10, random_state = 2022 : 0.910418182181542
# n_estimators= 600, max_depth = 12, random_state = 2022 : 0.9124607298453176

##### X_test로 예측하고, 최종제출파일 생성
pred = model.predict(X_test)
# print(pred)

submit = pd.DataFrame({
    'id' : X_id,
    'income' : pred
})
print(submit.head())

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

[유형3] 단일 T표본 검정(ttest_1samp)

(문제) 다음은 22명의 학생들이 국어시험에서 받은 점수이다. 학생들의 평균이 75보다 크다고 할 수 있는가?

ㅇ 귀무가설 (H0) : 모평균은 mu와 같다.(u=mu), 학생들의 평균은 75이다.

ㅇ 대립가설 (H1) : 모평균은 mu보다 크다. (u > mu), 학생들의 평균은 75보다 크다.

* 모집단은 정규분포를 따르고 표본의 크기가 충분하다는 가정

검정통계량, p-value, 검정결과를 출력하시오.

 

ㅇ 문제 바로가기(캐글)

 

* 결측치 처리는 필수 : 최빈값으로 대체 : df['컬럼'].fillna(값)

* 수치형데이터 피처엔지니어링시, 컬럼명을 정의한 뒤 수행 할 것

*  분류 문제에서 타겟컬럼이 0,1 데이터가 아닌 경우 데이터변환 할 것 : y = (y_train['컬럼'] ! = '데이터').astype(int)

 

(풀이)

from scipy import stats

# print(dir(stats))

scores = [75, 80, 68, 72, 77, 82, 81, 79, 70, 74, 76, 78, 81, 73, 81, 78, 75, 72, 74, 79, 78, 79]

# print(help(stats.ttest_1samp)
t_stat, p_val = stats.ttest_1samp(scores, 75, alternative = 'greater')

# 검정통계량
print(t_stat)

# p-value
print(p_val)

# 검정결과
print("p-value가 0.05보다 작으므로 귀무가설을 기각한다.")
320x100
반응형