[유형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)
[유형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보다 작으므로 귀무가설을 기각한다.")
'자격증공부 > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사] 모의고사2 (이상치, 소수점데이터 찾기, 소수점데이터처리, 분류(3개set), 독립표본t-test) (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 |