데이터로 살펴보는 학생들의 행동연구를 통한 성적 예측 ¶
데이터 소개¶
- 각 파일의 컬럼은 아래와 같습니다.
gender: 학생의 성별 (M: 남성, F: 여성)
NationaliTy: 학생의 국적
PlaceofBirth: 학생이 태어난 국가
StageID: 학생이 다니는 학교 (초,중,고)
GradeID: 학생이 속한 성적 등급
SectionID: 학생이 속한 반 이름
Topic: 수강한 과목
Semester: 수강한 학기 (1학기/2학기)
Relation: 주 보호자와 학생의 관계
raisedhands: 학생이 수업 중 손을 든 횟수
VisITedResources: 학생이 과목 공지를 확인한 횟수
Discussion: 학생이 토론 그룹에 참여한 횟수
ParentAnsweringSurvey: 부모가 학교 설문에 참여했는지 여부
ParentschoolSatisfaction: 부모가 학교에 만족했는지 여부
StudentAbscenceDays: 학생의 결석 횟수 (7회 이상/미만)
Class: 학생의 성적 등급 (L: 낮음, M: 보통, H: 높음)
최종 목표¶
- 연구용 Tabular 데이터의 이해
- 데이터 시각화를 통한 인사이트 습득 방법의 이해
- Scikit-learn 기반의 모델 학습 방법 습득
- Logistic Regression, XGBoost 기반의 모델 학습 방법 습득
- 학습된 모델의 평가 방법 및 시각화 방법 습득
Step 0. 의료 데이터셋에 대하여¶
연구용 데이터의 목적¶
연구용 데이터의 인용¶
Step 1. 데이터셋 준비하기¶
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
문제 1. Colab Notebook에 Kaggle API 세팅하기¶
In [2]:
import os
In [3]:
# os.environ을 이용하여 Kaggle API Username, Key 세팅하기
os.environ['KAGGLE_USERNAME'] = 'robin0309'
os.environ['KAGGLE_KEY'] = "39d5191a5de2cda257138f0285e9378e"
In [4]:
# Linux 명령어로 Kaggle API를 이용하여 데이터셋 다운로드하기 (!kaggle ~)
# Linux 명령어로 압축 해제하기
!kaggle datasets download -d aljarah/xAPI-Edu-Data
!unzip '*.zip'
문제 2. 데이터 다운로드 및 압축 해제하기¶
In [5]:
# Linux 명령어로 Kaggle API를 이용하여 데이터셋 다운로드하기 (!kaggle ~)
# Linux 명령어로 압축 해제하기
!ls
In [6]:
import glob
문제 3. Pandas 라이브러리로 csv파일 읽어들이기¶
In [7]:
# pd.read_csv()로 csv파일 읽어들이기
df = pd.read_csv('xAPI-Edu-Data.csv')
Step 2. EDA 및 데이터 기초 통계 분석¶
문제 4. 데이터프레임의 각 컬럼 분석하기¶
In [8]:
# DataFrame에서 제공하는 메소드를 이용하여 컬럼 분석하기 (head(), info(), describe())
df.head()
Out[8]:
In [9]:
df.info()
In [10]:
round(df.describe(),2)
Out[10]:
In [11]:
df.describe(include=[np.number])
Out[11]:
In [12]:
df.describe(include=['O'])
Out[12]:
문제 5. 수치형 데이터의 히스토그램 그리기¶
In [13]:
# seaborn의 histplot, jointplot, pairplot을 이용해 히스토그램 그리기
plt.subplot(221)
sns.histplot(x='raisedhands',hue='Class',data=df,kde=True)
plt.subplot(222)
sns.histplot(x='VisITedResources',hue='Class',data=df,kde=True)
plt.subplot(223)
sns.histplot(x='AnnouncementsView',hue='Class',data=df,kde=True)
plt.subplot(224)
sns.histplot(x='Discussion',hue='Class',data=df,kde=True)
plt.rcParams["figure.figsize"] = (20, 15)
plt.show()
Groupby로 상관관계 파악 -> 성적이 높을 수록 손을 들거나
공지확인 및 토론 발표등의 횟수가 높아짐을 보임
In [14]:
df.groupby('Class').mean()
Out[14]:
In [15]:
df.groupby('Class').mean()
Out[15]:
In [16]:
def my_mean(s):
return np.mean(s)
df.groupby('Class').agg({'raisedhands':my_mean,'VisITedResources':np.sum})
Out[16]:
In [17]:
df.groupby(['Class'],as_index=True).apply(lambda x:(x.raisedhands+x.VisITedResources).sum())
Out[17]:
성별은 남자가 여자보다 살짝 더 Class H 분포가 많다는 것을 알 수 있다¶
In [18]:
df.groupby(['Class','gender'],as_index=False).mean()
Out[18]:
In [19]:
df['gender'].value_counts()
Out[19]:
In [20]:
df.groupby('gender').size()
Out[20]:
In [21]:
df.loc[df['Class']=='H','Discussion']
Out[21]:
In [22]:
df.head()
Out[22]:
문제 6. Countplot을 이용하여 범주별 통계 확인하기¶
In [23]:
# seaborn의 countplot()을 사용
# Hint) x와 hue를 사용하여 범주별 Class 통계 확인
plt.subplot(221)
sns.countplot(x='gender',hue='Class',data=df)
plt.subplot(222)
sns.countplot(x='NationalITy',hue='Class',data=df)
plt.subplot(223)
sns.countplot(x='PlaceofBirth',hue='Class',data=df)
plt.subplot(224)
sns.countplot(x='GradeID',hue='Class',data=df)
plt.rcParams["figure.figsize"] = (15, 15)
plt.xticks(rotation=90)
plt.figure(figsize=(20,10))
plt.show()
In [24]:
sns.pairplot(df, hue='Class', hue_order=['L', 'M', 'H'])
Out[24]:
문제 7. 범주형 대상 Class 컬럼을 수치로 바꾸어 표현하기¶
In [25]:
# L, M, H를 숫자로 바꾸어 표현하기 (eg. L: -1, M: 0, H:1)
# Hint) DataFrame의 map() 메소드를 사용
df['Class_value'] = df['Class'].map(dict(L=-1, M=0, H=1))
In [26]:
df['Topic'].value_counts()
Out[26]:
In [27]:
# 숫자로 바꾼 Class_value 컬럼을 이용해 다양한 시각화 수행하기
gb = df.groupby('gender').mean()['Class_value']
gb
Out[27]:
In [33]:
plt.bar(gb.index,gb)
plt.rcParams["figure.figsize"] = (5, 5)
plt.figure(figsize=(5,5))
plt.show()
In [148]:
gb=df.groupby('Topic').mean()['Class_value']
plt.barh(gb.index,gb)
Out[148]:
Step 3. 모델 학습을 위한 데이터 전처리¶
문제 8. get_dummies()를 이용하여 범주형 데이터 전처리하기¶
In [34]:
df.columns
Out[34]:
In [35]:
df.dtypes
Out[35]:
In [160]:
df.select_dtypes(exclude='object')
Out[160]:
In [36]:
df.head()
Out[36]:
In [37]:
# pd.get_dummies()를 이용해 범주형 데이터를 one-hot 벡터로 변환하기
# Hint) Multicollinearity를 피하기 위해 drop_first=True로 설정
X = pd.get_dummies(df.drop(['ParentschoolSatisfaction', 'Class', 'Class_value'], axis=1),
columns=['gender', 'NationalITy', 'PlaceofBirth',
'StageID', 'GradeID','SectionID', 'Topic',
'Semester', 'Relation', 'ParentAnsweringSurvey',
'StudentAbsenceDays'],
drop_first=True)
y = df['Class']
In [45]:
X.shape
Out[45]:
In [46]:
X.columns
Out[46]:
In [38]:
X
Out[38]:
문제 9. 학습데이터와 테스트데이터 분리하기¶
In [42]:
from sklearn.model_selection import train_test_split
In [43]:
# train_test_split() 함수로 학습 데이터와 테스트 데이터 분리하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
Step 4. Classification 모델 학습하기¶
문제 10. Logistic Regression 모델 생성/학습하기¶
In [47]:
from sklearn.linear_model import LogisticRegression
In [54]:
model_lr = LogisticRegression(max_iter=10000)
model_lr.fit(X_train, y_train)
Out[54]:
In [ ]:
문제 11. 모델 학습 결과 평가하기¶
In [55]:
from sklearn.metrics import classification_report
In [58]:
# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_lr.predict(X_test)
print(classification_report(y_test,pred))
문제 12. XGBoost 모델 생성/학습하기¶
In [59]:
from xgboost import XGBClassifier
In [61]:
# XGBClassifier 모델 생성/학습
model_xgb = XGBClassifier()
model_xgb.fit(X_train,y_train)
Out[61]:
문제 13. 모델 학습 결과 평가하기¶
In [66]:
# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_xgb.predict(X_test)
print(classification_report(y_test, pred))
Step5 모델 학습 결과 심화 분석하기¶
문제 14. Logistic Regression 모델 계수로 상관성 파악하기¶
In [85]:
model_lr.coef_.shape # 59가 학습에 쓰이는 feature 개수 3은 class
Out[85]:
In [89]:
model_lr.classes_
Out[89]:
성적이 좋은 요소 찾기¶
In [90]:
# Logistic Regression 모델의 coef_ 속성을 plot하기
fig=plt.figure(figsize=(15,8))
plt.bar(X.columns, model_lr.coef_[0, :]) # 성적을 좋게하는 것을 출력하기위해 [0,:] -> H 로 하는 것
plt.xticks(rotation=90)
plt.show()
성적이 좋지 않은 학생들의 요인 추출¶
In [91]:
# Logistic Regression 모델의 coef_ 속성을 plot하기
fig=plt.figure(figsize=(15,8))
plt.bar(X.columns, model_lr.coef_[1, :]) # 성적을 좋게하는 것을 출력하기위해 [0,:] -> H 로 하는 것
plt.xticks(rotation=90)
plt.show()
문제 15. XGBoost 모델로 특징의 중요도 확인하기
성적을 결정하는데 중요하게 생각되는 요소 -> 특정 L 이나 M이나 H가아닌 전체적인 경우
In [73]:
fig = plt.figure(figsize=(15, 8))
plt.bar(X.columns, model_xgb.feature_importances_)
plt.xticks(rotation=90)
plt.show()
In [ ]:
반응형
'Project & Kaggle' 카테고리의 다른 글
유럽 축구 경기 및 선수 특징 추출을 통한 승부 예측 (0) | 2021.04.02 |
---|---|
데이터로 알아보는 리그 오브 레전드의 승리 예측 및 인사이트 (0) | 2021.02.09 |
심부전증 환자 데이터를 통한 사망 여부 Classification (0) | 2021.02.01 |
Dog and cat Classification with CNN (0) | 2020.12.15 |
주택 가격 예측 with Deep Neural network (0) | 2020.12.11 |