실기 모의고사 1회차
https://www.datamanim.com/dataset/practice/q1.html
1회차 — DataManim
Toggle in-page Table of Contents
www.datamanim.com
Import
import os
import pandas as pd
import numpy as np
import datetime
from dateutil.relativedelta import relativedelta
!pip install tqdm
import tqdm
import zipfile
import re
from tqdm import tqdm
작업 1유형
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/bank/train.csv')
df.head()
데이터 설명 : 은행의 전화 마케팅에 대한 고객의 반응 여부
df.shape
Question1
마케팅 응답 고객들의 나이를 10살 단위로 변환 했을 때, 가장 많은 인원을 가진 나이대는? (0~9 : 0 , 10~19 : 10)
df.age//10 *10
// 정수 몫
(df.age//10 *10).value_counts()
result = (df.age//10 *10).value_counts().index[0]
print(result)
Question2
마케팅 응답 고객들의 나이를 10살 단위로 변환 했을 때, 가장 많은 나이대 구간의 인원은 몇명인가?
result = (df.age//10 *10).value_counts().values[0]
print(result)
위의 두 question 차이점
value_counts().index냐 value_counts.values냐
Question3
나이가 25살 이상 29살 미만인 응답 고객들중 housing컬럼의 값이 yes인 고객의 수는?
result = df[(df.age >=25) & (df.age<29) & (df.housing =='yes')].shape[0]
print(result)
Question4
numeric한 값을 가지지 않은 컬럼들중 unique한 값을 가장 많이 가지는 컬럼은?
df.select_dtypes(exclude='int')
for col in df.select_dtypes(exclude='int'):
print(col)
lst= []
for col in df.select_dtypes(exclude='int'):
target = df[col]
lst.append([col,target.nunique()])
pd.DataFrame(lst)
result = pd.DataFrame(lst).sort_values(1,ascending=False).values[0][0]
print(result)
Question5
balance 컬럼값들의 평균값 이상을 가지는 데이터를 ID값을 기준으로 내림차순 정렬했을때 상위 100개 데이터의 balance값의 평균은?
result = df[df.balance >= df.balance.mean()].sort_values('ID',ascending=False).head(100).balance.mean()
print(result)
Question6
가장 많은 광고를 집행했던 날짜는 언제인가? (데이터 그대로 일(숫자),달(영문)으로 표기)
df[['day','month']].value_counts()
result = df[['day','month']].value_counts().index[0]
print(result)
Question7
데이터의 job이 unknown 상태인 고객들의 age 컬럼 값의 정규성을 검정하고자 한다.
샤피로 검정의 p-value값을 구하여라
from scipy.stats import shapiro
shapiro(df[df.job =='unknown'].age)
from scipy.stats import shapiro
result = shapiro(df[df.job =='unknown'].age)[1]
print(result)
샤피로윌크 검정(shapiro-wilk test)
통계학에서 정규성을 검정
Question8
age와 balance의 상관계수를 구하여라
result = df[['age','balance']].corr().iloc[0,1]
print(result)
Question9
y 변수와 education 변수는 독립인지 카이제곱검정을 통해 확인하려한다.
p-value값을 출력하라
카이제곱 검정(교차분석)
크로스탭 만들고 시작
v = pd.crosstab(df.y,df.education)
v
chi2_contingency(v)
결과해석
(1) chi-squre값(소수점 셋째짜리까지 표현)
(2) p-value
(3) df
(4) 기대치(expected value)
from scipy.stats import chi2_contingency
chi2 , p ,dof, expected = chi2_contingency(v)
print(p)
Question10
각 job에 따라 divorced/married 인원의 비율을 확인 했을 때 그 값이 가장 높은 값은?
t = df.groupby(['job','marital']).size().reset_index()
t
t.pivot_table(index='job',columns='marital')
t = df.groupby(['job','marital']).size().reset_index()
pivotdf = t.pivot_table(index='job',columns='marital')[0]
pivotdf = pivotdf.fillna(0)
pivotdf['ratio'] = pivotdf['divorced'] / pivotdf['married']
result = pivotdf.sort_values('ratio').ratio.values[-1]
print(result)
작업 2유형
import pandas as pd
train= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/bank/train.csv')
test= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/bank/test.csv')
submission= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/bank/submission.csv')
display(train.head())
display(test.head())
display(submission.head())
train/test/submission
은행의 전화 마케팅에 대한 고객의 반응 여부
간단한 모델링 작업
모델링 및 submission 파일 생성까지
train_test_split
from sklearn.model_selection import train_test_split
x = train.drop(columns=['ID','y'])
xd = pd.get_dummies(x)
y = train['y']
x_train, x_test, y_train, y_test = train_test_split(xd, y, stratify = y, random_state = 1)
pd.get_dummies()
object 형의 데이터가 있다면
(1) 먼저 수치형 데이터로 변환을 해주고(0,1,2,3,...)
(2) 그 다음 수치화된 데이터를 가변수화하여 나타내준다
그래야 기계학습에 적합한 데이터의 형태로 가공된다
수치형 데이터로 변환하고 끝내면 서로 간의 관계성이 생기게 된다
train_test_split
train_test를 분리하는 목적을 정확히 알아야 한다
정확하게 말하면 train/test가 아닌 train/validation으로 볼 수 있다
머신러닝 모델에 train 데이터를 100% 학습시킨 후 test 데이터에 모델을 적용했을 때 성능이 생각보다 나오지 않는 경우가 많다 > overfitting된 경우
parameters;
test_size : 테스트 셋 구성의 비율을 나타낸다(default = 0.25)
suffle : default 값이 True
stratify : default 값이 False, classification을 다룰 대 매우 중요한 옵션 값이다. stratify 값을 target으로 지정해주면 class 비율을 train/validation에 유지해준다. 즉 한 쪽에 쏠려서 분배되는 것을 방지
random_state = int
RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(x_train, y_train)
pred = rf.predict_proba(x_test)
pred
머신러닝 선능 평가에 활용되는 지표들
정확도(Auccuracy) : 실제 데이터와 예측 데이터가 얼마나 같은지를 판단하는 지표
오차행렬/혼동행렬(Confusion Matrix) : 분류 문제에서 예측 오류가 얼마인지, 어떤 유형의 오류가 발생하고 있는지를 함께 나타내는 지표
- 오차행렬을 통해 알 수 있는 지표들 : 정확도, 정밀도, 재현율, 민감도, 특이성
정밀도/재현율 트레이드오프 : 정밀도와 재현율은 상호보완적인 지표로 한쪽을 높이려고 하다보면 다른 한쪽이 떨어지기 쉬움
사이킷런의 분류 알고리즘은 예측 데이터가 특정 레이블에 속하는지 판단하기 위해 개별 레이블별로 확률을 구하고 그 확률이 큰 레이블 값으로 예측
일반적으로 임계값을 50%로 정하고 이보다 크면 positive, 작으면 negative
predict_proba()를 통하여 개별 레이블별 예측 확률을 반환받을 수 있음
F1스코어 : 정밀도와 재현율을 결합한 지표로 정밀도와 재현율이 어느 한쪽으로 치우치지 않을 때 상대적으로 높은 값을 가짐
ROC곡선과 AUC
metrics
from sklearn.metrics import roc_auc_score, classification_report
print('test roc score : ', roc_auc_score(y_test, pred[:,1]))
test_pred = rf.predict_proba(pd.get_dummies(test.drop(columns = ['ID'])))
submission['predict'] = test_pred[:,1]
print('submission file')
display(submission.head())
#submission.to_csv('dd.csv', index = False)