스마트 인재개발원/2차프로젝트

(스마트인재개발원) 2차프로젝트 데이터 전처리 2차 (모델재선택)

앨런튜링_ 2021. 7. 5. 15:34
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
pd.set_option('display.max_row', 5000)
pd.set_option('display.max_columns', 1000)
# 무시
pd.set_option('mode.chained_assignment',  None)
data = pd.read_csv('합격자 스펙 데이터 (1~100059).csv', encoding='cp949')
data1 = pd.read_csv('합격자 스펙 데이터 (100060~200126).csv', encoding='cp949')
data2 = pd.read_csv('합격자 스펙 데이터 (200127~278149).csv', encoding='cp949')

data = pd.concat([data, data1, data2])

data['분기'] = data['지원분야'].str.split('\n').str[0]
data['부서'] = data['지원분야'].str.split('\n').str[1]
data.drop(['Unnamed: 0','지원분야'], axis=1, inplace=True)
a = data['출신전공'].str.contains('4년')
b = data['출신전공'].str.contains('초대졸')
c = data['출신전공'].str.contains('해외대학')
d = data['출신전공'].str.contains('대학원')
e = data['출신전공'].str.contains('고졸')

data['출신전공'][a] = '4년'
data['출신전공'][b] = '초대졸'
data['출신전공'][c] = '해외대학'
data['출신전공'][d] = '대학원'
data['출신전공'][e] = '고졸'
data['부서']=data['부서'].fillna('직무무관')
a = data['출신전공'].str.contains('4년')
a = data['부서'].str.contains('인사')
b = data['부서'].str.contains('사무')
c = data['부서'].str.contains('상담')
d = data['부서'].str.contains('조립')
e = data['부서'].str.contains('생산관리')
f = data['부서'].str.contains('서비스영업')
g = data['부서'].str.contains('보험영업')
h = data['부서'].str.contains('기술영업')
i = data['부서'].str.contains('법인영업')
j = data['부서'].str.contains('광고영업')
k = data['부서'].str.contains('해외영업')
k_1 = data['부서'].str.contains('아웃바운드TM')
l = data['부서'].str.contains('영업관리')
m = data['부서'].str.contains('전략')
n = data['부서'].str.contains('비서')
o = data['부서'].str.contains('마케팅')
o_1 = data['부서'].str.contains('광고제작')
p = data['부서'].str.contains('PR')
q = data['부서'].str.contains('상품기획 MD')
q_1 = data['부서'].str.contains('웹기획')
r = data['부서'].str.contains('디자인')
s = data['부서'].str.contains('홍보')
t = data['부서'].str.contains('퍼블리싱')
u = data['부서'].str.contains('프로그래머')
v = data['부서'].str.contains('통신기술')
w = data['부서'].str.contains('소프트웨어')
x = data['부서'].str.contains('인공지능')
y = data['부서'].str.contains('데이터베이스')
z = data['부서'].str.contains('네트워크')


data['부서'][a] = '인사'
data['부서'][b] = '사무'
data['부서'][c] = '상담'
data['부서'][d] = '생산조립'
data['부서'][e] = '생산관리'
data['부서'][f] = '영업'
data['부서'][g] = '영업'
data['부서'][h] = '영업'
data['부서'][i] = '영업'""
data['부서'][j] = '영업'
data['부서'][k] = '영업'
data['부서'][k_1] = '영업'
data['부서'][m] = '기획전략'
data['부서'][n] = '비서'
data['부서'][o] = '마케팅'
data['부서'][o_1] = '마케팅'
data['부서'][p] = '마케팅'
data['부서'][q] = '마케팅'
data['부서'][q_1] = '마케팅'
data['부서'][s] = '마케팅'
data['부서'][t] = '마케팅'
data['부서'][r] = '디자인'
data['부서'][u] = '프로그래머'
data['부서'][v] = '프로그래머'
data['부서'][w] = '프로그래머'
data['부서'][x] = '프로그래머'
data['부서'][y] = '프로그래머'
data['부서'][z] = '프로그래머'
data['출신전공'].replace('해외대학', 7, inplace=True)
data['출신전공'].replace('대학원', 6, inplace=True)
data['출신전공'].replace('4년', 5, inplace=True)
data['출신전공'].replace('초대졸', 4, inplace=True)
data['출신전공'].replace('고졸', 3, inplace=True)
data['출신전공'].replace('중졸', 2, inplace=True)
data['출신전공'].replace('초졸', 1, inplace=True)
data['자격증'].replace('-',0, inplace=True)
data['자격증'].replace('1개',1, inplace=True)
data['자격증'].replace('2개',2, inplace=True)
data['자격증'].replace('3개',3, inplace=True)
data['자격증'].replace('4개',4, inplace=True)
data['자격증'].replace('5개',5, inplace=True)
data['자격증'].replace('6개',6, inplace=True)
data['자격증'].replace('7개',7, inplace=True)
data['자격증'].replace('8개',8, inplace=True)
data['자격증'].replace('9개',9, inplace=True)
data['자격증'].replace('10개',10, inplace=True)
data['자격증'].replace('11개',11, inplace=True)
data['자격증'].replace('12개',12, inplace=True)
data['자격증'].replace('13개',13, inplace=True)
data['자격증'].replace('14개',14, inplace=True)
data['자격증'].replace('15개',15, inplace=True)
data['자격증'].replace('16개',16, inplace=True)
data['교내/사회/봉사'].replace('-',0, inplace=True)
data['교내/사회/봉사'].replace('1회',1, inplace=True)
data['교내/사회/봉사'].replace('2회',2, inplace=True)
data['교내/사회/봉사'].replace('3회',3, inplace=True)
data['교내/사회/봉사'].replace('4회',4, inplace=True)
data['교내/사회/봉사'].replace('5회',5, inplace=True)
data['교내/사회/봉사'].replace('6회',6, inplace=True)
data['교내/사회/봉사'].replace('7회',7, inplace=True)
data['교내/사회/봉사'].replace('8회',8, inplace=True)
data['교내/사회/봉사'].replace('9회',9, inplace=True)
data['교내/사회/봉사'].replace('10회',10, inplace=True)
data['교내/사회/봉사'].replace('11회',11, inplace=True)
data['교내/사회/봉사'].replace('12회',12, inplace=True)
data['교내/사회/봉사'].replace('13회',12, inplace=True)
data['교내/사회/봉사'].replace('14회',14, inplace=True)
data['교내/사회/봉사'].replace('-',0, inplace=True)
data['해외경험'].replace('-',0, inplace=True)
data['해외경험'].replace('1회',1, inplace=True)
data['해외경험'].replace('2회',2, inplace=True)
data['해외경험'].replace('3회',3, inplace=True)
data['해외경험'].replace('4회',4, inplace=True)
data['해외경험'].replace('5회',5, inplace=True)
data['해외경험'].replace('6회',6, inplace=True)
data['해외경험'].replace('11회',11, inplace=True)
data['해외경험'].replace('7회',7, inplace=True)
data['해외경험'].replace('14회',14, inplace=True)
 
data['인턴'].replace('-',0, inplace=True)
data['인턴'].replace('1회',1, inplace=True)
data['인턴'].replace('2회',2, inplace=True)
data['인턴'].replace('3회',3, inplace=True)
data['인턴'].replace('4회',4, inplace=True)
data['인턴'].replace('5회',5, inplace=True)
data['인턴'].replace('6회',6, inplace=True)
data['인턴'].replace('7회',7, inplace=True)
data['인턴'].replace('8회',8, inplace=True)
data['인턴'].replace('10회',10, inplace=True)
data['인턴'].replace('12회',12, inplace=True)
data['인턴'].replace('13회',13, inplace=True)
data['인턴'].replace('14회',14, inplace=True)
data['인턴'].replace('17회',17, inplace=True)
data['인턴'].replace('20회',21, inplace=True)
data['인턴'].replace('21회',21, inplace=True)
data['수상내역'].replace('-',0, inplace=True)
data['수상내역'].replace('1회',1, inplace=True)
data['수상내역'].replace('2회',2, inplace=True)
data['수상내역'].replace('3회',3, inplace=True)
data['수상내역'].replace('4회',4, inplace=True)
data['수상내역'].replace('5회',5, inplace=True)
data['수상내역'].replace('6회',6, inplace=True)
data['수상내역'].replace('7회',7, inplace=True)
data['수상내역'].replace('9회',9, inplace=True)
data['수상내역'].replace('14회',14, inplace=True)
data['외국어(기타)'].replace('-',0, inplace=True)
data['외국어(기타)'].replace('1개',1, inplace=True)
data['외국어(기타)'].replace('2개',2, inplace=True)
data['외국어(기타)'].replace('3개',3, inplace=True)
data['외국어(기타)'].replace('4개',4, inplace=True)
data['토익스피킹'].replace('Lv8',8, inplace=True)
data['토익스피킹'].replace('Lv7',7, inplace=True)
data['토익스피킹'].replace('Lv6',6, inplace=True)
data['토익스피킹'].replace('Lv5',5, inplace=True)
data['토익스피킹'].replace('Lv4',4, inplace=True)
data['토익스피킹'].replace('Lv3',3, inplace=True)
data['토익스피킹'].replace('Lv2',2, inplace=True)
data['토익스피킹'].replace('Lv1',1, inplace=True)
data['토익스피킹'].replace('-',0, inplace=True)
data['OPIC'].replace('-',0, inplace=True)
data['OPIC'].replace('AL',9, inplace=True)
data['OPIC'].replace('IH',8, inplace=True)
data['OPIC'].replace('IM3',7, inplace=True)
data['OPIC'].replace('IM2',6, inplace=True)
data['OPIC'].replace('IM1',5, inplace=True)
data['OPIC'].replace('IL',4, inplace=True)
data['OPIC'].replace('NH',3, inplace=True)
data['OPIC'].replace('NL',2, inplace=True)
data['OPIC'].replace('NM',1, inplace=True)
data.reset_index(drop=True, inplace=True)
data['토익'] = data[data['토익'].str.contains('점')]['토익'].str.replace('점',"")
data['학점'] = data[data['학점'].str.contains('/4.5')]['학점'].str.replace('/4.5',"")
data['토익']= data['토익'].fillna(0)
data['학점']= data['학점'].fillna(0)
# from sklearn.preprocessing import LabelEncoder
# encoder = LabelEncoder()
# encoder.fit(data['합격회사'])
# data['합격회사'] = encoder.transform(data['합격회사'])
data['기업정보'].value_counts()

 

data['기업정보'] = data['기업정보'].str.split('</span>').str[0]
data['기업정보']= data['기업정보'].str.split('>').str[1]
data['기업정보'].value_counts()

data['OPIC'].value_counts()

X = data.iloc[:, 2:14]
y=data.iloc[:, -1]
y=pd.get_dummies(y)
# from sklearn.model_selection import train_test_split
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True,random_state=34)
# from sklearn.neural_network import MLPClassifier
# from sklearn.linear_model import LogisticRegression
# from sklearn.neighbors import KNeighborsClassifier
# from sklearn.svm import SVC
# from sklearn.gaussian_process import GaussianProcessClassifier
# from sklearn.gaussian_process.kernels import RBF
# from sklearn.tree import DecisionTreeClassifier
# from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
# from sklearn.naive_bayes import GaussianNB
# from sklearn.metrics import classification_report
# from sklearn.model_selection import cross_val_score
# from sklearn.metrics import roc_auc_score , plot_roc_curve, accuracy_score
# from sklearn import metrics
# from sklearn.metrics import mean_squared_error
# from sklearn.model_selection import train_test_split
# import xgboost as xgb

# rf = RandomForestClassifier()
# dt = DecisionTreeClassifier()
# kn = KNeighborsClassifier()
# lr = LogisticRegression()
# svc = SVC(random_state = 43, C = 10, gamma = 0.1, kernel ='rbf')

# models = [rf, dt, kn, lr, svc]
# for model in models:
#     model.fit(X_train, y_train)
#     pre = model.predict(X_test)
#     scores = cross_val_score(model, X_test, y_test, cv=5).mean().round(3)
#     #f1score = metrics.f1_score(y_test, y_pred).round(3)
#     print(model, '\n', 'Accuracy:', scores, '\n')
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
LinearRegression()
lr.score(X_test, y_test)
0.11353864528026579
data['부서'].value_counts()

 

list1 = ['ERP 시스템분석 설계','초중고 특수학교','영상 사진 촬영','자격증 기술 전문교육','감독 연출 PD','경영분석 컨설턴트',
         '의사 치과 한의사','기자','뷰티 미용 애완','회계 세무 CPA','작가 시나리오','법률 특허 상표','사회복지 요양보호 자원봉사',
         '부동산 중개 분양 경매','공연 전시 무대 스텝','음악 음향','이벤트 웨딩 도우미','아나운서 리포터 성우','전기 소방 통신 안전',
         '캐릭터 애니메이션','연예 엔터테인먼트','바이오 제약 식품','여행 항공 숙박','연구소 R&D','토목 조경 도시 측량','환경 플랜트'
         ,'외국어교육','전시 컨벤션','대학교수 강사 행정직','CS관리 강의','간호사','섬유 의류 패션','의료직기타','방송 케이블 프로덕션',
         '운전 기사','출판 인쇄 사진','게임','영화 배급','영화 음반 배급','레저 스포츠','보습학원 입시학원','시설 보안 경비 안전','기획전략',
         '디자인','인사','비서','요리 영양 제과제빵 바리스타','유통 물류 재고','자동차 조선 기계','화학 에너지 환경','설치 정비 A/S','구매 자재',
         '시공 현장 감리 공무','전기 전자 제어','반도체 디스플레이','채권 심사 보험 보상','배송 택배 운송','포장 가공','건축 설계 인테리어','기계설계 CAD CAM',
          '외국어 번역 통역','재무 세무 IR','학습지 과외 방문교사','리서치 통계 설문','QA 테스터 검증','컨텐츠 사이트운영','생산조립',
        '마케팅','프로그래머','생산관리','영업관리 지원 영업기획']

for i in range(len(list1)):
    idx = data[data['부서'] == list1[i]].index
    data = data.drop(idx)
    
    

    
data

list2 = data[data['스펙지수'] <= 200].index
list2


for i in range(len(list1)):
    idx = data[data['스펙지수'] == list2[i]].index
    data = data.drop(idx)
data.drop(['스펙지수'], axis=1, inplace=True)
data.drop(['토익'], axis=1, inplace=True)
X = data.iloc[:, 2:12]
y = data.iloc[:, -1]
y = pd.get_dummies(y)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True,random_state=34)

from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_auc_score , plot_roc_curve, accuracy_score
from sklearn import metrics
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.neural_network import MLPClassifier
import xgboost as xgb

lR = LogisticRegression()
rf = RandomForestClassifier()
dt = DecisionTreeClassifier()
kn = KNeighborsClassifier()
lr = LogisticRegression()


models = [rf, dt, kn]
for model in models:
    model.fit(X_train, y_train)
    pre = model.predict(X_test)
    scores = cross_val_score(model, X_test, y_test, cv=5).mean().round(3)
    #f1score = metrics.f1_score(y_test, y_pred).round(3)
    print(model, '\n', 'Accuracy:', scores, '\n')

모델 재 선택 및 공부

1. 선형 회귀(Linear Regression)

선형 회귀 알고리즘은 데이터 모델에 가장 적합한 선을 찾기 위해 데이터의 점들을 사용합니다.
이 선은 y = mx + c라는 방정식으로 나타낼 수 있는데, 여기서 y는 종속변수dependent variable를 나타내며, x는 독립변수independent variable를 나타냅니다. m과 c은 주어진 데이터셋을 기초적인 미적분을 사용해서 찾습니다.

선형회귀는 두 가지 종류로 분류할 수 있는데, 독립변수가 하나만 사용되는 단순 선형회귀simple linear regression와 독립변수가 여러개 사용되는 다중 선형회귀multiple linear regression로 분류할 수 있습니다.

 

 

2. SVM(Support Vector Machine)

SVM은 분류 알고리즘의 한 종류입니다. SVM은 각 데이터의 점들을 선을 사용해서 구분지으며, 이 선은 데이터의 범주를 구분지을 수 있는 가장 가까운 2개의 데이터의 점을 기준으로 만들어집니다.

3. KNN(K-Nearest Neighbors)

데이터가 무작위로 주어졌을 때, 인접한 k개의 영역에서 데이터의 종류를 예측하는 간단한 알고리즘입니다. k값은 예측의 정확도에 대한 중요한 인자입니다. 유클리드 거리 공식처럼 가까운 거리를 구하는 함수를 사용하여 가장 가까운 데이터의 집합을 판단합니다.

 

4. 로지스틱 회귀(Logistic Regression)

조심스럽고 신중한 결정이 필요할 때 사용합니다. 일반적으로 로지스틱 회귀는 손실이 최소화되도록 특정 집합으로 값을 맞추기 위해 일정한 함수를 사용합니다.

5. 의사결정 트리(Decision Tree)

이 알고리즘은 개체군에서 선택된 속성(독립 변수)을 기반으로 여러 집합에 대한 개체군을 분류합니다. 대개 이 알고리즘은 지니Gini, 카이-제곱Chi-square, 엔트로피entropy 등과 같은 방법을 사용하여 분류 문제를 해결합니다.

의사 결정 트리 알고리즘을 사용하여 누가 신용 카드를 갖고 싶은지 알아보고 개체군을 나눠보도록 하겠습니다. 예시로 연령과 결혼 상태를 기준으로 개체군의 속성을 고려해서 개체군을 분류해 보겠습니다. 나이가 30세 이상이거나 결혼을 한 경우에는 신용 카드를 더 선호하는 경향이 있습니다.

6. K-평균(K-Means)

클러스터링 문제에 대한 솔루션을 제공하는 비지도학습 알고리즘입니다. 이 알고리즘은 동일한 종류의 데이터 지점들homogeneous data points이 포함된  클러스터를 형성하는 절차를 따릅니다.

이 절차에 대해서 하나씩 다뤄보자면, 우선 k개의 중심점들centroids를 선택해서 이웃하는 데이터가 중심점을 가리키면 중심점과 결합하여 클러스터를 만듭니다. 결합을 후에는 각 클러스터 내에 새로운 중심이 생성됩니다. 그러면 새로운 중심에 가까운 데이터 중심점이 다시 결합하어 클러스터가 확장됩니다. 이 과정은 중심점이 바뀌지 않을 때까지 계속됩니다.

 

 

7. Random Forest

이 알고리즘은 의사결정 트리의 한 종류로 구분될 수 있습니다. 각각의 트리는 개별적으로 종류를 추정하며 이를 투표vote라고 합니다. 이상적으로는, 모든 트리의 각 선택를 고려해서 가장 많이 선택된 분류를 고릅니다.

 

8. Naive Bayes

이 알고리즘은 베이즈 정리Bayes' Theorem에서의 확률을 기반으로 합니다. Naive Bayes는 베이즈 정리의 요구 사항이기 때문에 각 기능이 서로 독립적인 경우에만 적용 할 수 있습니다. 예를 들자면, 꽃잎의 길이와 너비로 꽃의 종류를 예측하려고하면 두 가지 특징이 모두 독립적이기 때문에 Naive Bayes 방식을 사용할 수 있습니다.

 

9. Dimensional Reduction Algorithrm

일부 데이터셋은 처리하기 어려울 정도로 변수를 많이 포함하고 있을 수 있습니다. 특히 최근에 시스템으로부터 발생하는 데이터들은 너무 세부적인 수준까지 수집합니다. 이 경우 수집된 데이터셋에는 수천 개의 변수가 포함될 수 있으며 그 중 대부분은 불필요합니다.

하지만 이 경우 예측에 가장 큰 영향을 미치는 변수를 식별하는 것은 거의 불가능합니다. 차원 축소 알고리즘은 이런 상황에서 사용할 수 있습니다. 이 때는 Random Forest, 의사결정 트리와 같은 다른 알고리즘을 활용하여 가장 중요한 변수를 식별할 수도 있습니다.

10. Gradient Boosting Algorithm

Gradient Boosting Algorithm은 여러 가지 약한 알고리즘을 사용하여 더욱 강력한 알고리즘을 만듭니다. 하나의 알고리즘을 사용하는 대신 여러 개를 사용하면보다 보다 안정적이고 강력한 알고리즘을 만들 수 있습니다.

Gradient Boosting Algorithms은 여러 가지 종류가 있습니다. 그 중 일부를 소개하자면, 다음과 같은 것들이 있습니다.

XGBoost - 선형 알고리즘과 트리 알고리즘 모두 사용
LightGBM - 트리 기반 알고리즘만 사용

 

"스마트인재개발원에서 진행된 수업내용입니다"

https://www.smhrd.or.kr/

 

스마트인재개발원

4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관

www.smhrd.or.kr