Date:     Updated:

카테고리:

태그: , ,

💡 파이썬에서 자주 쓰이는 라이브러리, 통계, 데이터 분석에 유용한 라이브러리들을 학습하고 정리한 페이지입니다.
관심분야인 야구에 관한 응용문제를 직접 만들어 풀어보며 학습했습니다.


04. 숫자와 수학모듈

04-01 math.gcd - 최대공약수

math.gcd 함수는 최대공약수를 구하는 함수이다. 인수에 숫자를 입력하면 그 숫자들의 최대공약수를 출력해준다.

사탕 60개와 초콜릿 100개 그리고 젤리 80개를 각각 나누어 똑같이 봉지에 나누어 담으려고 한다. 최대한으로 만들수 있는 봉지의 개수를 구해보자.

import math
math.gcd(60,100,80)

#결과
20


04-02. math.icm - 최소공배수

math.icm 함수는 최소공배수를 구하는 함수이다. 인수에 숫자를 입력하면 그 숫자들의 최소공배수를 출력해준다.

import math
math.icm(15,25) #15와 25의 최소공배수

#결과
75



04-03. decimal.Decimal - 정확한 소수점 연산

decimal.Decimal 모듈은 숫자를 10진수로 처리하여 정확한 소수점 자릿수를 표현할 때 사용하는 모듈이다.

이진수 기반의 파이썬 float 연산은 미세한 오차가 발생한다. 아래 결과가 이상한 것을 보자.

print(0.1*3)
print(1.2-0.1)
#결과
0.30000000000000004
1.0999999999999999

이를 해결하기 위해 decimal.Decimal 모듈을 사용하자.

인수를 넣을 땐 반드시 문자열로 써줘야 한다!

from decimal import Decimal
print(Decimal('0.1')*3)
print(Decimal('1.2')-Decimal('0.1'))

#결과
0.3
1.1

결과가 잘 출력됐다. Decimal 자료형은 다시 float형으로 변환할 수 있다.

print(float(Decimal('0.1')*3))
print(float(Decimal('1.2')-Decimal('0.1')))

Decimal은 정확성을 향상시키기 위해 고정소수점을 사용하여 메모리를 많이 사용하기 때문에 모든 float연산을 Decimal로 바꾸는 것은 좋은 방법이 아니다.

Decimal은 보통 한치의 오차도 허용하지 않는 금융권 또는 재무/회계 관련 프로그램을 작성할 때 사용하는 것이 유리하다.



04-04. fractions - 유리수

파이썬에서 유리수를 그냥 더하면 미세한 오차가 생긴다. 때문에 fractions.Fraction을 사용해줘야 한다.

from fractions import Fraction
a = Fraction(1,5)
b = Fraction(2,5)
print(a.numerator) #분자의 값
print(a.denominator) #분모의 값
print(a+b)
print(float(a+b))

#결과
1
5
3/5
0.6


04-05. random - 난수 생성

random 모듈은 난수를 생성할 때 사용하는 모듈이다.

6개의 숫자로 이루어진 로또 번호를 무작위로 생성해 주는 프로그램을 작성해보자. 이 때 숫자는 중복될 수 없다.

random.randint 함수는 임의의 숫자를 생성해준다.

import random
result = []
while len(result) <6:
  num = random.randint(1,45)
  if num not in result:
    result.append(num)
print(result)

리스트의 순서를 무작위로 섞고 싶을 땐 shuffle함수를 사용하고, 랜덤으로 하나를 선택하려면 choice함수를 사용한다.

a = [1,2,3,4,5]
random.shuffle(a)
print(a)
print(random.choice(a))

#결과
[3, 5, 4, 1, 2]
4


04-06. statistics - 평균값과 중앙값

평균값은 statistics.mean을 이용하여 구할 수 있고, 중앙값은 statistics.median을 이용하여 구할 수 있다.

문제

2021 보스턴 레드삭스의 투수들의 통산 whip를 나열하고, 이 값의 평균과 중앙값을 출력하라.

💡 정답.

whip = []
for n in statsapi.get('sports_players',{'season':2021, 'gameType':'R'})['people']:
  #보스턴 선수이고 투수인 선수를 뽑아서
  if n['currentTeam']['id'] == 111 and n['primaryPosition']['code'] =='1':
    #스탯 값은 문자열로 출력되니 float을 이용하여 실수로 만든다.
    whip.append(float(statsapi.player_stat_data(n['id'], 'pitching', 'career')['stats'][0]['stats']['whip'])) 
print(whip)

import statistics
print(statistics.mean(whip))
print(statistics.median(whip))

#결과
1.6066666666666667
1.3599999999999999