[제로베이스] 데이터 사이언스 12기 - (02-19 스터디노트)

윤태호·2023년 2월 19일
0
post-thumbnail

오늘 수강한 강의 - 알고리즘(17 ~ 20)

17 최빈값 ~ 20 근삿값

최빈값

  • 데이터에서 빈도수가 가장 많은 데이터를 최빈값이라고 한다
class MaxAlgorithm:
    def __init__(self, ns):
        self.nums = ns
        self.maxNum = 0
        self.maxNumIdx = 0
    def setMaxIndAndNum(self):
        self.maxNum = self.nums[0]
        self.maxNumIdx = 0
        for i, n in enumerate(self.nums):
            if self.maxNum < n:
                self.maxNum = n
                self.maxNumIdx = i
    def getMaxNum(self):
        return self.maxNum
    def getMaxNumIdx(self):
        return self.maxNumIdx
nums = [1, 3, 7, 6, 7, 7, 7, 12, 12, 17]
maxAlo = MaxAlgorithm(nums)
maxAlo.setMaxIndAndNum()
maxNum = maxAlo.getMaxNum()
print('maxNum: {}'.format(maxNum))
indexes = [0 for i in range(maxNum + 1)]
print('indexes: {}'.format(indexes))
print('indexes length: {}'.format(len(indexes)))
for n in nums:
    indexes[n] = indexes[n] + 1
print('indexes: {}'.format(indexes))
maxAlo = MaxAlgorithm(indexes)
maxAlo.setMaxIndAndNum()
maxNum = maxAlo.getMaxNum()
maxNumIdx = maxAlo.getMaxNumIdx()
print('maxNum: {}'.format(maxNum))
print('maxNumIdx: {}'.format(maxNumIdx))
print('즉, {}의 빈도수가 {}로 가장 높다.'.format(maxNumIdx, maxNum))
  • (실습) 최빈값 알고리즘을 이용해서 학생 100명의 점수 분포를 다음과 같이 나타내 보자

maxScore.py

class MaxAlgorithm:
    def __init__(self, ns):
        self.nums = ns
        self.maxNum = 0
        self.maxNumIdx = 0
    def setMaxNumIdxAndNum(self):
        self.maxNum = self.nums[0]
        self.maxNumIdx = 0
        for i, n in enumerate(self.nums):
            if self.maxNum < n:
                self.maxNum = n
                self.maxNumIdx = i
    def getMaxNum(self):
        return self.maxNum
    def getMaxNumIdx(self):
        return self.maxNumIdx

modeEx.py

import random
import maxScore as ms
scores = []
for i in range(100):
    rn = random.randint(71, 100)
    if rn != 100: rn = rn - (rn % 5)
    scores.append(rn)
print('scores: {}'.format(scores))
print('scores length: {}'.format(len(scores)))
# 최댓값 알고리즘
maxAlo = ms.MaxAlgorithm(scores)
maxAlo.setMaxNumIdxAndNum()
maxNum = maxAlo.getMaxNum()
print('maxNum: {}'.format(maxNum))
# 인덱스 리스트 생성
indexes = [0 for i in range(maxNum + 1)]
print('indexes: {}'.format(indexes))
print('indexes length: {}'.format(len(indexes)))
# 인덱스 리스트에 빈도 저장
for n in scores:
    indexes[n] = indexes[n] + 1
print('indexes: {}'.format(indexes))
n = 1
while True:
    maxAlo = ms.MaxAlgorithm(indexes)
    maxAlo.setMaxNumIdxAndNum()
    maxNum = maxAlo.getMaxNum()
    maxNumIdx = maxAlo.getMaxNumIdx()
    if maxNum == 0:
        break
    print('{}. {}빈도수: {}\t'.format(n, maxNumIdx, maxNum), end='')
    print('+' * maxNum)
    indexes[maxNumIdx] = 0
    n += 1

근삿값

  • 특정 값(참값)에 가장 가까운 값을 근삿값이라고 한다
import random
nums = random.sample(range(0, 50), 20)
print('nums: {}'.format(nums))
inputNum = int(input('input number: '))
print('inputNum: {}'.format(inputNum))
nearNum = 0
minNum = 50
for n in nums:
    absNum = abs(n - inputNum)
    # print('absNum: {}'.format(absNum))
    if absNum < minNum:
        minNum = absNum
        nearNum = n
print('nearNum: {}'.format(nearNum))
  • (실습) 근삿값 알고리즘을 이용해서 시험 점수를 입력하면 학점이 출력되는 프로그램을 만들어보자

near 모듈

def getNearNum(an):
    baseScores = [95, 85, 75, 65, 55]
    nearNum = 0
    minNum = 100
    for n in baseScores:
        absNum = abs(n - an)
        if absNum < minNum:
            minNum = absNum
            nearNum = n
    if nearNum == 95:
        return 'A'
    elif nearNum == 85:
        return 'B'
    elif nearNum == 75:
        return 'C'
    elif nearNum == 65:
        return 'D'
    elif nearNum <= 55:
        return 'F'

nearEx.py

import near
scores = []
kor = int(input('input kor score: '))
scores.append(kor)
eng = int(input('input eng score: '))
scores.append(eng)
mat = int(input('input mat score: '))
scores.append(mat)
sci = int(input('input sci score: '))
scores.append(sci)
his = int(input('input his score: '))
scores.append(his)
# 총점
totalScore = sum(scores)
print('totalScore: {}'.format(totalScore))
# 평균
avgScore = totalScore / len(scores)
print('avgScore: {}'.format(avgScore))
# 등급
grade = near.getNearNum(avgScore)
print('grade: {}'.format(grade))

재미있었던 부분

가까운 값을 구하는 근삿값 부분의 실습 (시험 점수를 입력하면 학점이 출력되는 프로그램)이 가장 기억에 남고 이해하기 쉬웠다

어려웠던 부분

최빈값이 이해가 가지 않았던 것은 아니지만 너무 복잡해서 중간에 에러도 뜨고, 이해하는데 오래 걸렸다

느낀점 및 내일 학습 계획

이해는 가지만 혼자 만들수 없을때 가장 불안한 것 같다
강의를 보고 이해하는것과 직접 코드를 만들수 있느냐 없느냐는 다르니까 서툴더라도 직접 만들어보고 뭐가 틀린지 확인해봐야겠다
내일은 알고리즘 나머지 부분을 공부할 예정이다

profile
부트캠프 참여중

0개의 댓글