[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 2회 2번 파이썬 코드

2021. 6. 5. 20:23카테고리 없음

반응형

안녕하세요~

데이터에듀에서 나온 ADP실기 데이터 분석 전문가의 모의고사가 R로만 짜여저 있어서

ADP실기를 파이썬(python)언어로 보시는 분들을 위해 

제가 파이썬 언어로 바꾸면서 코딩을 한 내용을 공유드리고자 합니다.

 

ADP 실기 모의고사 2회

02. 정형 데이터마이닝(사용 데이터: Titanic)

titanic.csv
0.08MB

Titanic 뎅터는 타이나틱호의 탑승자들의 생존에 관련한 데이터이다. 데이터에 대한 설명은 아래와 같다. 

 

1) cabin, embarked변수의 값 중 ""로 처리된 값을 NA로 바꾸고 아래의 데이터 테이블을 보고 문자형, 범주형 변수들을 각각 character, factor형으로 변환하시오. 또, 수치형 변수가 NA인 값을 중앙값으로 대체하고, 범주형 변수가 NA인 값을 최빈값으로 대체하고 age변수를 아래의 표와 같이 구간화하여 age_1이라는 변수를 생성하고 추가하시오.

 

import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

#분류모형
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression

import statsmodels.api as sm

from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_curve, auc, roc_auc_score
from sklearn import tree
from sklearn.metrics import classification_report

path = './모의고사 2회/titanic.csv'
data= pd.read_csv(path)
data.head()
data.describe()
data.isnull().sum()
data.info()

먼저 titanic 데이터를 불러온다. 그리고 항상 데이터의 전체적인 형태를 확인해야하는 head(),  describe(), info(), 그리고 isnull()함수로 결측치가 얼마나 있는지 확인한다. 

확인해보니, carbin데이터에 1014의 결측치가 확인된다. 

data['cabin'].unique()

uniqe()함수로 결측치 모양을 확인해볼려고 했는데, 파이썬에서는 ""을 자동적으로 결측치로 인식하는 것 같다.

결측치를 확인한 후 최빈값으로 변경한다. 결측치가 있는 변수는 age, cabin, embarked, fare이다. 

data['cabin'].value_counts()
data['cabin']= data['cabin'].fillna('C23 C25 C27')
data['embarked'].value_counts()
data['embarked'] = data['embarked'].fillna('S')
data['age'].value_counts()
data['age']=data['age'].fillna(24)
data['fare'].value_counts()
data['fare']= data['fare'].fillna(8.0500 )

fillna()함수로 결측치를 채워준다. 

분석을 하기 위해 변수의 데이터 타입을 확인 한 후, 적절한 타입으로 변환한다. 

object형이 매우 많다.. object형은 분석의 데이터로 적절하지 않는 데이터형이기 때문에(수치형이 좋다!, string형도 범주형 또는 one-hot encoding으로 해결할 수 있다.)

이 책에서는 age, sex, embark  숫자로 범주화 했다.(사실 이부분은 분석가의 인사이트 및 경험인 것 같다. 범주화로 굳이 해야하는 이유가 명확이 없다.)

data['age_1']=data['age'].copy()
for i in range(len(data)):
    if(data['age'][i] >= 0 and data['age'][i] < 10) : data['age_1'][i]=0
    elif(data['age'][i] >= 10 and data['age'][i] < 20) : data['age_1'][i]=1
    elif(data['age'][i] >= 20 and data['age'][i] < 30) : data['age_1'][i]=2
    elif(data['age'][i] >= 30 and data['age'][i] < 40) : data['age_1'][i]=3
    elif(data['age'][i] >= 40 and data['age'][i] < 50) : data['age_1'][i]=4
    elif(data['age'][i] >= 50 and data['age'][i] < 60) : data['age_1'][i]=5
    elif(data['age'][i] >= 60 and data['age'][i] < 70) : data['age_1'][i]=6
    elif(data['age'][i] >= 70 and data['age'][i] < 80) : data['age_1'][i]=7
    elif(data['age'][i] >= 80 and data['age'][i] < 90) : data['age_1'][i]=8
 data['age_1'].value_counts()

data['sex']=data['sex'].replace({'female':2})
data['sex']=data['sex'].replace({'male':1})

embark변수는 string이기 때문에 get_dummies()함수를 사용한다. 

data['embarked'].value_counts()
data['embarked'] = pd.get_dummies(data['embarked'])

 

2) 전처리가 완료된 titanic 데이터를 train(70%), test(30%) 데이터로 분할하시오(set.seed(12345)를 실행한 후 데이터를 분할하시오.) 또, train데이터로 종속변수인 survived(생존여부)를 독립변수 pclass, sex, sibsp, parch, fare, embarked로 예측하는 분류모델 3개 이상 생성하고 test데이터에 대한 예측값을 csv파일로 각각 제출하시오.

X = data[['pclass','sex','sibsp','parch','embarked']]
y = data[['survived']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=12345)

분류모델을 생성한다. 

#첫번째 분류모델
dt_clf = DecisionTreeClassifier()
dt_clf = dt_clf.fit(X_train, y_train)
dt_prediction = dt_clf.predict(X_test)
accuracy_score(y_test, dt_prediction)

#평가 시각화를 위한 작업
fpr, tpr, threshold = metrics.roc_curve(y_test, dt_prediction)
roc_auc = metrics.auc(fpr, tpr)

plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

 

75%의 정확도가 나왔다. ROC커브와 AUC를 추출했다. ROC 커브는 파란색 실선 아래의 넓이가 많을 수록 예측력이 좋다는 것.

 

#두번째 분류모델
forest = RandomForestClassifier()
forest.fit(X_train, y_train)
y_pred = forest.predict(X_test)
print('정확도 :', metrics.accuracy_score(y_test, y_pred))

#평가 시각화를 위한 작업
fpr, tpr, threshold = metrics.roc_curve(y_test, y_pred)
roc_auc = metrics.auc(fpr, tpr)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

이번에도 정확도가 75%정도 나왔다. 

#세번째 분류모델
log_reg=LogisticRegression()
log_reg.fit(X_train, y_train)
y_pred = log_reg.predict(X_test)
print('정확도 :', metrics.accuracy_score(y_test, y_pred))

#평가 시각화를 위한 작업
fpr, tpr, threshold = metrics.roc_curve(y_test, y_pred)
roc_auc = metrics.auc(fpr, tpr)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

이번에는 정확도가 78%이다. 또한 AUC도 0.77로 제일 정확도가 높은 모델은 LogisticRegression이였다. 

 

 

 

 

▼모의고사 2회 1번 보러가기

https://shiningyouandme.tistory.com/29?category=807628 

 

[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 2회 파이썬 코드

안녕하세요~ 데이터에듀에서 나온 ADP실기 데이터 분석 전문가의 모의고사가 R로만 짜여저 있어서 ADP실기를 파이썬(python)언어로 보시는 분들을 위해 제가 파이썬 언어로 바꾸면서 코딩을 한 내

shiningyouandme.tistory.com