작년에 파이썬을 독학하면서 직접 만들어보았던 성적분석 프로그램입니다.
졸업을 하려면 졸업 학점 요건을 충족시켜야 하는데요,
그에 맞게 학점을 잘 땄는 지 알아볼 수 있는 프로그램입니다.
저희 학교는 크게 전공과 교양으로 나뉘어져 있고,
교양도 필수교양, 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 |
---|
댓글