강의노트 05. 절차지향 방식 Data analysis

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

절차지향 프로그래밍 방식으로 프로그램 작성하기

개요

작성할 프로그램

  • 학생들의 점수 데이터를 통해 평균과 표준편차를 구하고,
  • 이를 기준으로 평가를 내린다.

데이터

  • class_A.bin
  • 상기 파일은 pickle.dump를 통해서 데이터 입력이 이루어졌으며, 딕셔너리 자료형을 갖고 있음 (pickle로 데이터를 저장하거나 불러올때는 파일을 바이트형식으로 읽거나 써야한다. (wb, rb))
  • lass_A.bin 파일 내용
{'greg': 95},
{'john': 25},
{'yang': 50},
{'timothy': 15},
{'melisa': 100},
{'thor': 10},
{'elen': 25},
{'mark': 80},
{'steve': 95},
{'anna': 20}

코드작성

import pickle
import math
from functools import reduce

# 평균
def average(scores):
    return reduce(lambda a, b: a + b, scores)/len(scores)

# 분산
def variance(scores, avrg):
    return reduce(lambda a, b: a + b, map(lambda s:(s-avrg)**2, scores))/len(scores)

# 평가
def evaluateClass(avrg, std_dev):
    if avrg <50 and std_dev >20:
        print("성적이 너무 저조하고 학생들의 실력 차이가 너무 크다.")
    elif avrg > 50 and std_dev >20:
        print("성적은 평균이상이지만 학생들 실력 차이가 크다. 주의 요망!")
    elif avrg < 50 and std_dev <20:
        print("학생들간 실력차는 나지 않으나 성적이 너무 저조하다. 주의 요망!")
    elif avrg > 50 and std_dev <20:
        print("성적도 평균 이상이고 학생들의 실력차도 크지 않다.")

# 파일에서 원하는 점수 데이터만 리스트로 만들기
f = open("class_A.bin", "rb")
# with open("class_A.bin", "rb") as f: 방식이 더 좋다

items = []

while 1:
    try:
        data = pickle.load(f)
    except EOFError:
        break    
    items.append(data)

print(items)

scores = []

# normal way
'''
for item in items:
    for value in item.values():
        scores.append(value)
'''

#pythonic way??
scores = list(map(lambda x: x[0] , map(lambda item:list(item.values()),items)))

print(scores)

avrg = average(scores) # 평균
variance = round(variance(scores, avrg), 1) # 분산
standard_deviation = round(math.sqrt(variance), 1) # 표준편차

print("\n")

print('*' * 50)
print("A반 성적 분석 결과")
print('*' * 50)
print("A반의 평균은 {0}점이고 분산은 {1}이며, 따라서 표준편차는 {2}이다".format(avrg, variance, standard_deviation))
print('*' * 50)
print("A반 종합 평가")
print('*' * 50)

print('\n')
evaluateClass(avrg, standard_deviation)

f.close()