새소식

프로젝트

[Project] 고등학교 학생 성적에 미치는 요인 분석

  • -

머신러닝 기법을 이용하여 학생 성적에 영향을 미치는 여러가지 요인을 분석해 보았습니다.

 

GitHub - kangmincho1/Side-Projects: Collection of side projects

Collection of side projects. Contribute to kangmincho1/Side-Projects development by creating an account on GitHub.

github.com

 

Dataset

Predict the final grade of Portuguese high school students

 

Student Grade Prediction

Predict the final grade of Portugese high school students

www.kaggle.com

데이터의 구성은 row가 학생이며, column이 외부 환경에 대한 데이터입니다.

 

 

 

Data preprocessing

feature value를 살펴보면, 문자형 값을 갖고 있는 것들이 있습니다. 학습을 위하여 이를 숫자형 값으로 바꿔줘야 합니다.

 

 

문자형 값을 갖는 feature column들을 전부 숫자형 값으로 바꿔주기 위하여 sklearn의 LabelEncoder를 사용합니다. 이는 손쉽게 숫자형 값으로 처리해 줍니다.

 

 

성적을 label 데이터로 설정해야합니다. 처리된 데이터를 확인해보면 G1, G2, G3 column을 확인할 수 있습니다. 이는 학생의 첫번째, 두번째, 세번째 성적입니다. 하나의 label data가 필요하기 때문에 이를 하나의 column으로 바꿔줄 필요가 있습니다. 저는 이를 G1, G2, G3의 평균으로 하여 성적을 산출하도록 했습니다. 새롭게 column의 이름을 grade라고 지었습니다.

 

 

label data의 분포를 확인해봅니다. 회귀 모델을 학습 시킬 때, 데이터의 분포가 정규분포 모양을 하고 있어야 합니다. 현재 데이터는 정규분포의 모양을 띄고 있으므로, 학습시킬 때 큰 문제가 없을 것 같다고 판단했습니다.

 

 

 

Regression

sklearn의 회귀 모델들을 import 해줍니다.

평가지표는 회귀 모델에 맞게 RMSE, MAE로 선정했습니다.

ElastictNet의 l1_ratio가 0.3일 때, 대체적으로 좋은 성능을 보였기 때문에 이를 0.3으로 설정해주었습니다. 그 외의 회귀 모델에서 max_depth = 5로 설정한 이유는 max_depth 5가 오버피팅과 언더피팅이 일어나지 않는 적정한 수치라고 판단했기 때문입니다. LGBMRegressor의 num_leaves는 max_depth의 제곱보다 커야 하기 때문에 30으로 설정했습니다.

또한, Ridge, Lasso, ElastictNet의 alpha parameters는 0.07, 0.1, 0.5, 1, 3으로 테스트 해보았습니다.

 

 

먼저 Ridge, Lasso, ElasticNet을 제외한 회귀모델을 테스트 해 보았습니다.

전반적으로 RandomForest 회귀의 성능이 좋게 나타난 것을 볼 수 있습니다.

 

 

Ridge, Lasso, ElasticNet의 성능도 테스트 해 보았습니다.

 

Ridge

Best alpha ⇒ 1, RMSE: 3.5095608241027447, MAE: 1.6794173827085992

 

 

Lasso

Best alpha ⇒ 0.07, RMSE: 3.4862031129867517, MAE: 1.6738521045286183

 

 

ElasticNet

Best alpha ⇒ 0.07, RMSE: 3.4814759998894926, MAE: 1.6725971138881044

 

 

전반적인 결과

LinearRegression, RMSE: 3.5142466837905553, MAE: 1.68049057374532

RandomForestRegression, RMSE: 3.4064827313306822, MAE: 1.6458893256468705

XGBRegression, RMSE: 3.787195942333029, MAE: 1.7274601927322177

GBMRegression, RMSE: 3.7289092260699865, MAE: 1.720903132895153

LGBMRegression, RMSE: 4.014880465306646, MAE: 1.7736213641661238

Ridge, alpha 1) RMSE: 3.5095608241027447, MAE: 1.6794173827085992

Lasso, alpha 0.07) RMSE: 3.4862031129867517, MAE: 1.6738521045286183

ElasticNet, alpha 0.07) RMSE: 3.4814759998894926, MAE: 1.6725971138881044

 

전반적으로 봤을 때, RandomForestRegression의 성능이 가장 좋은 것을 확인할 수 있습니다

 

 

 

전반적인 분석

회귀를 해보았으나, 제일 중요한 것인 이 회귀 프로젝트를 진행한 이유입니다. 이 프로젝트의 궁극적인 목표는 학생들의 성적과 여러 변수와의 상관관계를 따지는 것입니다.

이를 확인하는 방법은 여러 회귀들의 feature별 중요도를 살펴본 후, 이들을 종합하여 대체적으로 성적과 중요한 상관관계가 있다고 판단되는 feature를 DecisionTree Regressor로 plot을 그려 각 feature와 성적과의 관계를 확인해 볼 것입니다.

 

여기서 잠깐 feature들에 대한 부연 설명을 하겠습니다.

 

school: 두 학교 중 어떤 학교인지('GP' - Gabriel Pereira, 'MS' - Mousinho da Silveira)

sex: 성별

age: 나이

address: 시골에 사는지 도시에 사는지

famsize: 가족 구성원 크기

Pstatus: 가족과 같이 사는지, 떨어져 사는지

Medu: 어머니의 교육수준

Fedu: 아버지의 교육수준

Mjob: 어머니의 직업

Fjob: 아버지의 직업

reason: 이 학교를 선택한 이유(nominal: close to 'home', school 'reputation', 'course' preference or 'other')

guardian: 보호자

traveltime: 집에서 학교까지 걸리는 시간

studytime: 주간 공부 시간

failures: 불합격 수

schoolsup: 사교육 하는지, 하지 않는지

famsup: 집에서 따로 교육의 지원이 있는지, 없는지

paid: 학교에서 수학이나 포르투갈어를 추가적으로 수강하는지, 하지 않는지

activities: 방과 후 활동 수업 수강하는지, 하지 않는지

nursery: 보육시설에서 교육받았는지, 받지 않았는지

higher: 높은 교육 수준을 원하는지, 하지 않는지

internet: 집에서 인터넷 접속 가능 한지, 하지 않는지

romantic: 연애를 하는지, 하지 않는지

famrel: 가족과의 친밀도

freetime: 하교 후 쉬는 시간

goout: 친구들과 밖에서 노는 횟수

Dalc: 평일 음주량

Walc: 주말 음주량

health: 건강상태

absences: 결석 수

 

먼저, LinearRegression의 feature별 중요도를 보겠습니다.

이를 보면 higher, sex, famsize, studytime 등이 좋은 성적과 높은 상관관계를 가지며, failures, schoolsup, famsup, romantic 등이 낮은 성적과 높은 상관관계를 가지는 것을 볼 수 있습니다.

 

 

이번에는 RandomForestRegressor입니다.

이 그래프가 의미하는 것은 선형회귀와는 달리 성적이 좋으면 그래프가 높고, 성적이 낮으면 그래프가 낮은 것이 아니라, 성적과 얼마나 연관이 있는 feature인가를 의미합니다.

failures, absences, schoolsup, Fjob, freetime, goout, studytime, Medu 순으로 연관이 있는 것으로 보입니다.

 

 

그 다음 Ridge 입니다.

higher, sex, famsize, studytime 등이 좋은 성적과 연관이 있으며, schoolsup, failures, famsup, romantic, goout 등이 낮은 성적과 연관이 있는 것으로 보입니다.

 

 

그 다음 Lasso입니다.

sex, studytime, Medu, famsize, reason 등이 높은 성적과 연관이 있으며, failures, schoolsup, famsup, goout, romantic 등이 낮은 성적과 연관이 있습니다.

 

 

다음은 ElasticNet입니다.

sex, studytime, Medu, famsize 등이 높은 성적과 연관이 있으며, failures, schoolsup, famsup, goout 등이 낮은 성적과 연관이 있습니다.

 

 

이제 이를 토대로 회귀 곡선을 그려보도록 하겠습니다.

회귀 곡선을 그리는데 사용된 것은 DecsionTree Regressor입니다.

위의 feature 중요도를 종합적으로 판단해본 결과, sex, studytime, famsize, higher, Medu가 상대적으로 다른 feature에 비해 높은 성적과 연관이 있으며, failures, schoolsup, fampsup, goout, romantic 이 상대적으로 다른 feature에 비해 낮은 성적과 연관이 있다고 판단되어집니다.

sex를 성별, studytime을 공부시간, famsize를 가족구성원 수, higher를 동기부여, Medu를 어머니의 교육수준, failures를 낙방 횟수, schoolsup을 사교육, fampsup을 가정교육, goout을 친구와 노는 횟수, romantic을 연애라고 하겠습니다.

 

먼저 성별부터 확인해 보겠습니다.

코드는 변수만 다르고 동일하기에 성별 코드만 올리겠습니다.

 

성별

제일 위의 그림은 회귀 곡선을 그리지 않은 채 데이터의 분포만 확인한 그림입니다.

X 축이 feature이고 Y 축이 grade입니다.

남자가 1, 여자가 0입니다.

또한 아래 세가지 그림은 선형 회귀 곡선과 Decision Tree 회귀 곡선을 그린 것입니다. Max_depth를 2와 5로 해준 것은 보는 사람마다 시각이 다르기 때문에 저는 max_depth = 5가 적절하다고 생각되지만, max_depth = 2 도 해주어 조금 더 유연한 예측을 할 수 있도록 하였습니다.

이를 보면 상대적으로 남자가 여자보다 성적이 좋은 것을 알 수 있습니다.

 

 

공부시간

이를 보면, 공부를 많이 하는 학생의 수는 적지만, 적은 수에 비해 성적이 좋은 것을 확인할 수 있습니다. 또한 공부시간이 4시간이 되는 학생들 중 최하위 점수는 한 명도 없습니다.

 

 

가족 구성원 수

이 feature는 가족구성원이 3명보다 많으면 0, 가족구성원이 3명보다 적으면 1입니다.

가족 구성원 수가 적을수록 학생의 성적이 더 좋은 것을 보실 수 있습니다.

 

 

공부에 대한 동기부여

1이 더 높은 수준의 교육을 원하는 학생이고, 0이 그렇지 않은 학생입니다.

이걸 보면, 마음가짐을 좋게 먹는다고 해서 무조건 좋은 성적을 받는 건 아니지만, 마음가짐이 좋지 못하면 성적은 무조건 좋지 못하다는 것을 알 수 있습니다.^^

 

 

어머니의 교육수준

이를 보면, 어머니의 교육 수준이 낮다고 해서 학생의 성적이 절대적으로 낮은 것은 아니지만, 대체적으로 보면 어머니의 교육수준이 높으면 성적이 높은 것을 볼 수 있습니다.

 

 

낙방 횟수

확실히 낙방을 적게 한 학생들의 성적이 대체적으로 좋은 것을 확인할 수 있습니다.

 

 

사교육

이를 보면 사교육을 받는 학생들은 중위권에 많이 분포하며 압도적으로 좋은 성적을 가진 학생은 볼 수 없었습니다.

이는 사교육을 받은 학생의 표본이 적어서 그랬던 거 같기도 하지만, 엄청나게 적은 수는 아니라 사교육을 받았다 해서 성적이 좋다고 볼 수 없다 할 수 있습니다. 참 신기한 것은 사교육을 받은 학생들은 극과 극의 성적이 없이 대체로 중간 성적을 유지하는 것입니다. 제 생각에는, 완전히 낮은 성적이 없는 이유는 어느정도 학원이나 과외에서 돈을 들여 교육을 시켜 놨기 때문에 완전히 바닥인 성적은 없는 것으로 보입니다.

 

 

가정 교육

가정 교육을 따로 받았던 학생들이 그렇지 않은 학생들보다 살짝 낮은 성적대를 보이고 있습니다. 사교육만큼은 아니지만 이도 최상위권의 성적은 존재하지 않는 것을 확인할 수 있습니다. 다만, 사교육과 다른 점은 이 중에서는 성적이 바닥을 찍는 학생도 존재한다는 것입니다.

 

 

친구들과 노는 횟수

선형회귀만 놓고 보면 친구들과 놀면 놀수록 성적이 떨어지는 것처럼 보이지만, 이진 트리 회귀에서는 친구들과 2시간 정도 노는 것은 성적 향상에 도움되는 것으로 보이나 3시간부터는 성적이 조금씩 떨어지는 것을 볼 수 있습니다.

이를 보면 놀땐 놀아야 되는 것은 맞는 것 같습니다.

 

 

연애

1이 연애를 하는 학생이고, 0이 연애를 하지 않는 학생입니다.

연애를 하지 않는 학생들은 대체적으로 낮은 성적에 적게 분포하고 있고 최상위권 성적도 꽤나 있습니다.

그러나 연애를 하는 학생들은 최상위권의 성적은 거의 없으며, 낮은 성적에도 많은 학생들이 분포하는 것을 볼 수 있습니다.

 

 

 

Result

위에서 한 실험결과를 가지고 어느정도 요악을 해보겠습니다.

남자일수록 대체적으로 성적이 높습니다.

공부시간이 많을수록 좋은 성적을 받습니다. 그러나 공부를 많이 한다고 해서 무조건 성적이 좋은 것도 아닙니다.

가족 구성원 수가 적을수록 성적이 좋습니다.

마음가짐을 좋게 먹으면 좋은 성적을 받을 수 있으나, 보장된 것은 아닙니다. 하지만, 마음가짐을 좋지 않게 먹으면, 좋은 성적을 절대 못 받습니다.

어머니의 교육 수준이 높을수록 자녀의 성적도 높은 경향이 있습니다.

과거 시험들에서 낙제점을 받았을수록 성적이 좋지 않습니다.

사교육을 받는다고 해서 최상위권의 점수가 나오는 것은 쉽지 않습니다.

가정에서 따로 교육을 받는다고 성적이 잘 나오지 않습니다.

친구들과 적당히 놀면 좋은 성적을 받을 수 있으나, 과하면 성적이 떨어집니다.

연애를 하면 성적이 낮아질 가능성이 있습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.