본문 바로가기
Python

[Python] 성적 분석 프로그램 (Python Code)

by 스테고사우르스 2023. 1. 13.

작년에 파이썬을 독학하면서 직접 만들어보았던 성적분석 프로그램입니다.

 

졸업을 하려면 졸업 학점 요건을 충족시켜야 하는데요,

 

그에 맞게 학점을 잘 땄는 지 알아볼 수 있는 프로그램입니다.

 

저희 학교는 크게 전공과 교양으로 나뉘어져 있고,

교양도 필수교양, MSC, 일반교양, 핵심역량 등으로 나뉘어져 있습니다.

 

이렇게 종류가 많으니 하나하나 요건을 충족했는지 계산하는게 귀찮겠죠?

 

그래서 학교 사이트에서 다운받을 수 있는 엑셀 성적표를 dataframe으로 받아오면,

한 번에 볼 수 있도록 프로그램을 짜보았습니다.

 

친구들에게 프로그램을 보내줬더니 귀찮은 계산을 안해도 된다면서 좋아하더라구요 ㅎㅎ

 

 


Python Code

import pandas as pd

df = pd.read_excel('./학생성적정보.xlsx')
df

우선 성적표를 읽어옵니다.

 

df_new = df.drop(columns = ['번호', '학수강좌번호', 'Unnamed: 6', '삭제구분', '공학인증', '성적인정대학명', '교과목영문명', '대학대학원', '인정구분'])
df_new.loc[[18, 25], '이수구분'] = '기소'
df_new.loc[13, '공학세부요소'] = '기초교양(교필)'
df_new.loc[df_new['교과목명'] == 'EAS2', '공학세부요소'] = '기초교양(교필)'
df_new.loc[df_new['교과목명'] == '공학법제', '이수구분'] = '기소'
df_new.loc[df_new['교과목명'] == '공학윤리', '이수구분'] = '기소'

필요 없는 줄은 삭제해주고,

분류가 중복되어 있는 몇 과목은 수정해줍니다.

 

엑셀에는 대분류까지만 되어있고 소분류는 안되어있더라구요..

 

def score(grade):
    if grade == 'A+':
        grade = 4.5
    elif grade == 'A0':
        grade = 4.0
    elif grade == 'B+':
        grade = 3.5
    elif grade == 'B0':
        grade = 3.0
    elif grade == 'C+':
        grade = 2.5
    elif grade == 'C0':
        grade = 2.0
    elif grade == 'D+':
        grade = 1.5
    elif grade == 'D0':
        grade = 1.0
    elif grade == 'F':
        grade = 0
    elif grade == 'P':
        grade = 0
    return grade

df_new['가중치'] = df_new['등급'].apply(score) * df_new['학점']
df_new

A+은 4.5로 A0는 4.0으로.. 이렇게 문자를 숫자로 변환하였습니다.

 

그리고 학점이 1학점, 2학점, 3학점, 4학점 이렇게 다양하게 있어서

그에 따른 가중치를 주었습니다.

 

그 후에 분류별로 그룹을 지어주면 다음과 같습니다.

 

 

이제 성적을 계산해볼까요?

 

 

이런식으로 충족여부뿐만 아니라 분류별로도 평점을 볼 수 있게 해주었습니다.

 

그리고 P는 평점 계산에서 빠지기 때문에 drop 해주었습니다.

 

 

학점 비율이나 이수 분야 비율 같이 학생들이 궁금해 할만한 정보들도 몇개 넣어놨습니다.

 

group11 = df_new.loc[(df_new['년도'] == 2017) & (df_new['학기'] == '1학기')]
indexP = group11[group11['등급'] == 'P'].index
new11 = group11.drop(indexP)
mean11 = new11['가중치'].sum() / new11['학점'].sum()

group12 = df_new.loc[(df_new['년도'] == 2017) & (df_new['학기'] == '2학기')]
indexP = group12[group12['등급'] == 'P'].index
new12 = group12.drop(indexP)
mean12 = new12['가중치'].sum() / new12['학점'].sum()

group21 = df_new.loc[(df_new['년도'] == 2020) & (df_new['학기'] == '1학기')]
indexP = group21[group21['등급'] == 'P'].index
new21 = group21.drop(indexP)
mean21 = new21['가중치'].sum() / new21['학점'].sum()

group22 = df_new.loc[(df_new['년도'] == 2020) & (df_new['학기'] == '2학기')]
indexP = group22[group22['등급'] == 'P'].index
new22 = group22.drop(indexP)
mean22 = new22['가중치'].sum() / new22['학점'].sum()

group31 = df_new.loc[(df_new['년도'] == 2021) & (df_new['학기'] == '1학기')]
indexP = group31[group31['등급'] == 'P'].index
new31 = group31.drop(indexP)
mean31 = new31['가중치'].sum() / new31['학점'].sum()

group32 = df_new.loc[(df_new['년도'] == 2021) & (df_new['학기'] == '2학기')]
indexP = group32[group32['등급'] == 'P'].index
new32 = group32.drop(indexP)
mean32 = new32['가중치'].sum() / new32['학점'].sum()

group41 = df_new.loc[(df_new['년도'] == 2022) & (df_new['학기'] == '1학기')]
indexP = group41[group41['등급'] == 'P'].index
new41 = group41.drop(indexP)
mean41 = new41['가중치'].sum() / new41['학점'].sum()


import numpy as np

x = ['1-1', '1-2', '2-1', '2-2', '3-1', '3-2', '4-1']
y = [mean11, mean12, mean21, mean22, mean31, mean32, mean41]
y = np.round(y, 2)
plt.plot(x, y)
plt.grid(axis = 'y', color = 'black', alpha = 0.7, linestyle = '-.')
for idx, txt in enumerate(y):
    plt.text(x[idx], y[idx] + 0.1, txt, ha = 'center')
plt.show()

마지막으로 학기 별 성적 변화도를 넣어주었습니다.

 

독학을 할 때 유튜브에서 시키는 것만 하다보니,

내가 잘 하고 있는 건가 의문이 생겼는데요.

 

이렇게 나만의 프로그램을 만들어보니 실력이 빠르게 느는 것 같아서 좋았습니다.

 

 


 

'Python' 카테고리의 다른 글

[Python] 데이콘 분석시각화 경진대회 후기 (Python Code)  (1) 2023.01.13

댓글