Top

파이썬으로 풀어보는 수학 [코드로 통계, 확률, 미적분과 같은 다양한 수학 탐험하기]

  • 원서명Doing Math with Python: Use Programming to Explore Algebra, Statistics, Calculus, and More! (ISBN 9781593276409)
  • 지은이아미트 사하(Amit Saha)
  • 옮긴이정사범
  • ISBN : 9788960778689
  • 25,000원
  • 2016년 06월 28일 펴냄
  • 페이퍼백 | 328쪽 | 188*235mm
  • 시리즈 : 프로그래밍 언어

책 소개

요약

파이썬을 이용해 고등학교 수준의 다양한 수학 문제를 풀어보는 책이다. 고등학교 수준의 통계, 기하학, 확률, 미적분과 관련된 다양한 수학 문제를 파이썬이라는 프로그래밍 언어를 이용해 해결하는 방법을 살펴본다. 이와 같은 과정을 경험하면서 자연스럽게 수학과 컴퓨터 과학에 대한 공부를 할 수 있다. 데이터에 대한 통계값을 계산하고, 이를 그래프, 막대차트, 산점도로 가시화할 수 있으며, 동전 던지기, 주사위 던지기 등과 같은 놀이를 통해 확률 이론과 프로그램을 이해할 수 있다. 또한, 파이썬의 기호 수학 함수를 사용해 대수학 문제를 풀거나, 기하학 형상을 그려보며 다양한 프랙털을 만들어 볼 수 있고, 미분과 적분함수를 알아내는 프로그램도 만들어 볼 수 있다.

이 책에서 다루는 내용

■ 통계로 데이터를 설명하고 그래프, 막대 그래프, 산점도로 가시화하는 방법
■ 동전 던지기, 주사위 던지기, 확률 게임에 대한 프로그램으로 살펴보는 집합 이론과 확률
■ 파이썬 기호 수학 함수를 이용한 대수학 문제 풀이
■ 기하학적 형상을 그려보고, 반즐리 펀(Barnsley fern), 시어핀스키(Sierpinski) 삼각형, 만델브로집합과 같은 다양한 프랙털 제작
■ 미분과 적분함수 계산 프로그램을 작성

이 책의 대상 독자

프로그래밍을 배우는 사람이라면 이 책에서 컴퓨터로 문제를 해결하기 위한 설명하는 방법을 좋아하게 될 것이다. 이와 같은 방법으로 여러분이 학습자를 가르친다면 이 책은 때로는 추상적인 컴퓨터 과학을 뛰어넘어 프로그래밍 기술의 적용 방법을 설명하는 데 유용하게 사용할 수도 있을 것이다.
이 책은 독자가 파이썬 3을 이용하며 파이썬 프로그래밍의 기초를 알고 있다고 가정한다. 구체적으로 함수와 함수 인자, 파이썬 클래스와 클래스 객체, 루프의 개념을 이해하고 있다고 가정한다. 부록 B는 프로그램에서 이용한 다른 파이썬 주제의 일부를 다룬다. 하지만 이 책은 추가 주제에 대한 지식까지 바라지는 않는다. 만약 파이썬에 대한 많은 내용을 알고 싶다면 『Python for Kids by Jason Briggs』(Nostarch Press, 2013)를 읽어볼 것을 추천한다.

이 책의 구성

1장, ‘숫자 연산’에서는 기초 수학 연산으로 시작해 점차 높은 수학 노하우가 필요한 주제를 설명한다.

2장, ‘그래프로 데이터 가시화’에서는 맷플롯립(matplotlib) 라이브러리를 이용해 데이터 셋에서 그래프를 만드는 방법을 설명한다.

3장, ‘통계값을 이용한 데이터 설명’에서는 데이터 셋을 처리하는 방법을 계속 설명하는데, 기초 통계 개념인 평균, 중위수, 최빈수, 데이터셋의 변수들을 대상으로 상관관계를 알아본다. 여러분은 데이터 셋을 배포하기 위해 잘 알려진 파일 포맷인 csv 파일에서 데이터를 불러와 처리하는 방법을 설명한다.

4장, ‘SYMPY를 이용한 대수와 부호 수학’에서는 SymPy 라이브러리를 이용해 부호 수학 (Symbolic Math)을 살펴본다. 방정식 해결과 같은 좀 더 복잡한 문제를 소개하기 전에 대수(Algebra) 표현식을 표현하고 이를 다루는 기초를 알아본다.

5장, ‘집합과 확률 다루기’에서는 수학 집합을 표현하는 방법과 기초 이산 확률에 대해 설명한다. 일양 및 비일양 랜덤사건을 시뮬레이션하는 방법도 알아본다.

6장, ‘기하학적 형상과 프렉탈 그리기’에서는 맷플롯립을 이용해 기하학적 형상과 프렉탈을 그리고 동영상 그림을 만드는 방법을 알아본다.

7장, ‘미적분 문제 풀기’에서는 파이썬 표준 라이브러리와 SymPy에서 사용 가능한 수학 함수를 설명하고 미분 문제를 해결하는 방법을 알아본다.

부록A, ‘소프트웨어 설치’에서는 마이크로소프트 윈도우, 리눅스, 맥 OS x에서 파이썬 3, 맷플롯립, SymPy를 설치하는 방법을 설명한다.

부록B, ‘파이썬 주제 소개’에서는 초보자에게 도움이 되는 몇 가지 파이썬 주제를 살펴본다.

저자/역자 소개

지은이의 말

이 책의 목적은 세 가지 주제를 함께 배울 수 있게 하는 것이다. 이 책에서는 고등학교 수준의 수학인 측정 단위 변환, 투사물 운동 조사, 평균 계산, 중위수, 최빈값, 선형상관관계 결정, 대수방정식 풀기, 간단한 추운동(pendulum), 주사위 게임 시뮬레이션, 기하학적 형상 생성, 극한값/미분/적분 함수 계산을 파이썬 프로그램으로 살펴본다. 수학적으로 이러한 내용은 매우 익숙한 주제들이지만 펜과 종이를 사용하는 대신 컴퓨터를 이용해 알아볼 것이다.
프로그램 입력으로 숫자와 수식을 취해 반복 계산을 수행한 다음 해를 출력하거나 그래프를 그린다. 일부 프로그램은 수학 문제를 해결하는 데 강력한 계산기 역할을 할 것이다. 다른 여러 업무 중에서 방정식에 대한 해를 찾아내고 데이터 집합 간의 상관관계를 계산해 함수의 최대값을 결정한다. 다른 프로그램에서는 투척물 운동, 동전 던지기, 주사위 던지기 같은 실제 생활의 사건을 시뮬레이션한다. 이러한 사건을 시뮬레이션하는 프로그램을 이용해 쉽게 분석하고 이에 대해 학습한다.
프로그램 없이 학습하기에는 극단적으로 어려운 주제일 수도 있다. 예를 들어 프렉탈을 손으로 그리면 꽤 지루하고 거의 불가능하다. 하지만 프로그램으로는 관련 작업을 루프문 내부에 위치시킨 다음 for 루프를 실행하기만 하면 된다.
여러분은 프로그래밍과 수학이 좀 더 흥미롭고 재미있으며 도움이 될 수 있다는 것을 배울 것이다.

지은이 소개

아미트 사하(Amit Saha)

레드햇과 선마이크로시스템에서 재직했던 소프트웨어 엔지니어다. Fedora Scientific라는 과학과 교육용 유저대상 리눅스를 배포하는 회사를 만들고 운영하고 있다. 또한 Prentice Hall Learning에서 출간한 『Write Your First Program』의 저자이기도 하다.

옮긴이의 말

학교를 다녀본 사람들이라면 학창시절에 누구나 수학, 영어와 관련한 참고서도 많이 사고 공부도 열심히 했을 것이다. 성적이 좋게 나오는 것과 상관없이 누구나 이러한 경험이 있을 것이다.
지금 학교를 다니고 있는 중고등학생들도 아마 다르지 않을 것이라 생각한다. 수학과 관련된 누구나 다 알고 있는 참고서의 누적판매량이 우리나라 총인구 수준에 육박할 만큼 팔려 나간 것으로 추정된다고 하니, 아직도 수학은 우리 학생들에게는 열심히 해야 하는 과목이라고 생각된다. 프로그램은 어떠할까? 아마도 수학만큼은 아니겠지만 관심이 있는 학생들이라면 프로그래밍 언어 하나는 배우고 있을 것이다. 이러한 언어 중에 최근 들어 인기가 있는 언어 중의 하나가 파이썬이다.
나는 수학과 프로그래밍 언어를 한 번에 익힐 수 있을 만한 책이 있으면 좋겠다고 생각했는데, 바로 이 책이 찾고 있었던 책이었다. 이 책을 번역하게 되어 영광으로 생각한다.
2016년 초에 우리나라는 알파고 열풍이 일었다. 아마도 다들 알겠지만 인공지능의 위력을 가장 쉽게 접할 수 있었던 사건이었지 않을까 생각한다. 바둑을 시작하기 일주일 전만 해도 컴퓨터가 어떻게 사람을 이길 수 없을 것이라고 생각한 사람들이 대부분일 것이다. 하지만 이러한 생각은 이젠 잘못되었다라는 것을 명백히 입증한 것이 이번 알파고 사건이다. 물론 컴퓨터가 사람을 이길 수 있도록 하기까지는 수학과 컴퓨터 프로그램이 어느 정도 역할을 했다는 데는 이견을 갖는 사람은 없을 것이다.
이처럼 프로그램을 통해 무언가를 만들고자 하는 사람에게 있어 수학은 매우 중요한 학문이다. 수학적 사고가 없이는 좋은 프로그램을 만들 수 없기 때문이다. 또한 수학적 이론을 잘 알고 있는 사람에게 있어 프로그램은 매우 중요한 기술이다. 특히 데이터를 분석하고 알고리즘을 개발하는 경우, 이를 프로그램으로 효율적으로 구현하는 능력이 떨어진다면 본인조차도 상당히 답답할 것이다. 따라서 수학과 프로그램 언어는 서로 같이 배우고 익히는 것이 필요하다라고 생각한다. 하지만 우리나라의 교과과정에서는 수학과 컴퓨터를 같이 배울 수 있는 기회가 그리 많지 않은 점이 아쉽다.
아마도 경험해보았겠지만 수학적 이론을 프로그램으로 구현해보고 컴퓨터상에서 시뮬레이션해보는 경험은 참 재미있는 일이다. 아마도 실제로 해보지 않는다면 이러한 재미를 실감할 수 없을 것이라 생각한다. 이와 같은 재미를 느끼는 데 이 책이 어느 정도 기여를 했으면 하는 마음이다.

옮긴이 소개

정사범

대학교와 대학원에서 산업공학을 전공했고 의사결정과 최적화 방법론에 대해 관심이 많다. 2000년이 시작될 즈음 회사에 입사해 제조업에서 발생되는 다양한 데이터를 R과 파이썬으로 분석해 본 경험이 있다. 지금도 제조현장에서 발생되는 여러 이슈사항을 데이터에 근거해 수리적으로 해결해보려고 고민한다. 또한 다양한 책과 현장 경험을 통해 데이터 수집, 정제, 분석, 보고 방법에 대한 지식을 얻는 것에 감사하고 있다. 에이콘출판사에서 출간한 『RStudio 따라잡기』(2013), 『The R book(Second Edition) 한국어판』(2014), 『예측 분석 모델링 실무 기법』(2014), 『데이터 마이닝 개념과 기법』(2015)을 번역했다.

목차

목차
  • 1장 숫자•연산
    • 기초•수학 연산
    • 라벨: 이름을 숫자에 부착시키기
    • 다른 종류의 숫자
      • 분수 계산
      • 복소수
    • 사용자 입력 가져오기
      • 예외와 유효하지 않은 입력값 처리
      • 입력값으로 분수와 복소수
    • 수리적 연산을 수행하는 프로그램 작성
      • 정수 팩터 계산
      • 곱 테이블 생성
      • 이차방정식의 근 구하기
    • 프로그래밍 연습
      • #1: 짝수-홀수 자판기
      • #2: 개선된 곱 테이블 생성
      • #3: 개선된 단위 변환
      • #4: 분수 계산기
      • #5: 사용자에게 Exit(종료하기) 권한 부여

  • 2장 그래프로 데이터 가시화
    • 카르테지안 좌표평면의 이해
    • 리스트와 튜플을 이용한 작업
      • 리스트나 튜플에 대한 실행 반복
    • 맷플롯립을 이용한 그래프 생성
      • 그래프에 점 표시
      • 뉴욕시의 연간 평균 온도를 그래프로 표시
      • 뉴욕시의 월간 온도 비교
      • 그래프 개인화
      • 그래프 저장
    • 수식으로 그래프 그리기
      • 만유인력에 대한 뉴턴의 법칙
      • 포물선 운동
    • 학습 내용
    • 프로그래밍 연습
      • #2: 이차방정식을 그림으로 탐색해보기
      • #3: 투척 궤적 비교 프로그램 개선
      • #4: 비용 가시화
      • #5: 피보나치 순열과 황금비 간의 관계 탐색

  • 3장 통계값을 이용한 데이터 설명
    • 평균 계산
    • 중위수 계산
    • 최빈수를 계산하고 빈도 테이블 생성
      • 가장 공통적인 요소 알아내기
      • 최빈값 찾기
      • 빈도 테이블 생성
    • 산포정도 측정
      • 숫자 집합의 범위 알아내기
      • 분산과 표준편차 계산
    • 두 데이터 집합 간 상관관계 계산
      • 상관계수 계산
      • 고등학교 성적 등급과 대학입학시험 성적
    • 산점도
    • 파일에서 데이터 읽기
      • 텍스트 파일에서 데이터 읽기
      • CSV 파일에서 데이터 읽어오기
    • 학습 내용
    • 프로그래밍 연습
      • #1: 상관계수 계산 문제 개선
      • #2: 통계값 계산기
      • #3: 다른 csv 데이터로 테스트
      • #4: 퍼센트 위치 계산
      • #5: 그룹화한 빈도 테이블 생성

  • 4장 SYMPY를 이용한 대수(Algebra)와 부호(Symbolic Math) 수학
    • 부호와 부호 연산 정의
    • 수식 계산
      • 수식을 요소화하고 전개
      • 보기 좋게 출력
      • 값으로 대체
      • 문자열을 수식으로 변환
      • 수식 곱하기
    • 방정식 풀기
      • 이차방정식 풀기
      • 다른 표시로 되어 있는 한 개 변수에 대한 해 계산
      • 선형 방정식 시스템 풀기
    • SymPy를 사용해 그래프 그리기
      • 사용자가 입력한 수식을 그래프로 그리기
      • 여러 함수 그래프 그리기
    • 학습 내용
    • 프로그래밍 연습
      • #1: 팩터 파인더
      • #2: 그래픽을 이용한 방정식 풀기
      • #3: 수열합 계산
      • #4: 단일 변수의 부동식 풀기

  • 5장 집합과 확률 다루기
    • 집합은 무엇인가?
      • 집합 생성
      • 부분집합, 초집합, 파워집합
      • 집합 연산
    • 확률
      • 사건A나 사건B의 확률
      • 사건A와 사건B의 확률
      • 랜덤숫자 생성
      • 비일양 랜덤숫자
    • 학습 내용
    • 프로그래밍 연습
      • #1: 집합 간의 관계를 가시화하기 위해 벤다이어그램 사용
      • #2: 대수의 법칙
      • #3: 돈이 떨어지기 전에 토스 시도 횟수는?
      • #4: 카드뭉치 섞기
      • #5: 원의 면적 추정

  • 6장 기하학적 형상과 프렉탈 그리기
    • 맷플롯립의 패치로 기하학적 형상 그리기
      • 원 그리기
      • 움직이는 그림 만들기
      • 투사물의 포물선 애니메이션
    • 프렉탈 그리기
      • 평면상의 점 변환
      • Barnsley 고사리 그리기
    • 학습 내용
    • 프로그래밍 연습
      • #1 : 사각형내에 원을 포함시키기
      • #2 : Sierpinski 삼각형 그리기
      • #3 : Henon의 함수 탐색
      • #4 : 만델브로트(Mandelbrot) 집합 그리기

  • 7장 미적분 문제 풀기
    • 함수란 무엇인가?
      • 함수의 도메인과 범위
      • 일반적인 수학 함수에 대한 개요
    • SymPy의 가정
    • 함수의 극한 계산기
      • 연속 복리
      • 실시간 변화율
    • 함수의 미분 계산
      • 미분 계산기
      • 편미분의 계산
    • 고차 미분과 최대, 최소값 구하기
    • 그레디언트 상승을 이용해 전역 최대값 알아내기
      • 그레디언트 상승에 대한 제네릭 프로그램
      • 초기값에 대한 경고
      • 단계 크기와 입실론의 역할
    • 함수의 적분 계산
    • 확률밀도함수
    • 학습 내용
    • 프로그래밍 연습
      • #1: 한 점에서 함수의 연속 검증
      • #2: 그레디언트 하강 구현
      • #3: 두 곡선 간 면적
      • #4: 곡선 길이 계산

  • 후기
    • 다음에 탐색해볼 일들
      • 프로젝트 율러
      • 파이썬 문서
      • 참고 문헌
    • 참고 사이트
    • 결론

  • 부록A 소프트웨어 설치
    • 마이크로 소프트 윈도우
      • SymPy업데이트
      • matplotlib-venn 설치
      • Python Shell 시작
    • 리눅스
      • SymPy 업데이트
      • matplotlib-venn 설치
      • 파이썬 셸 시작
    • 맥 OS X
      • SymPy업데이트
      • matplotlib-venn 설치
      • 파이썬 셸 시작

  • 부록B 파이썬 주제 소개
    • If name ==’ main ’
    • 리스트 컴프리헨션
    • 딕셔너리 데이터 구조
    • 다중 리턴값
    • 예외 처리
      • 다중 예외 유형 설정
      • else블록
    • 파이썬에서 파일 읽기
      • 한번에 모든 행 읽기
      • 입력으로 파일명 설정
      • 파일을 읽을 때 오류 다루기
    • 코드 재사용

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.26 : 본문 5행]
방금 본 것 처럼 파이썬은 1.0 또는 4.0을 수학적으로 정수('int')로 분류한다. 따라서 이러한 프로그램에서 유효 입력값으로 숫자를 받게 되면 해당 입력값은 부동소수점 숫자에서 정수로 변환된다. 다행스럽게 이러한 함수가 파이썬 내에 구축되어 있다.
->
방금 본 것 처럼 파이썬은 1.0 또는 4.0을 수학적으로 정수('int')로 분류하지 않는다. 따라서 이러한 프로그램에서 유효 입력값으로 숫자를 받게 되면 해당 입력값은 부동소수점 숫자에서 정수로 변환해야 한다. 다행히 이러한 함수가 파이썬 내에 구축되어 있다.

[p.32: 아래에서 8~5행]
>>> try
a = float(input('Enter a number: '))
except ValueError:
print('You entered an invalid number')
->
>>> try:
a = float(input('Enter a number: '))
except ValueError:
print('You entered an invalid number')

[p.35: 아래에서 9~4행]
>>> try
a = Fraction(input('Enter a fraction: '))
except ZeroDivisionError:
print('Invalid fraction')
Enter a fraction: 3/0
Invalid fraction
->
>>> try:
a = Fraction(input('Enter a fraction: '))
except ZeroDivisionError:
print('Invalid fraction')
Enter a fraction: 3/0
Invalid fraction

[P.36 : 아래서 3행]
0이 아닌 정수 a를 또 다른 정수 b로 나눌 때 나머지가 0이라면
->
0이 아닌 정수 a로 또 다른 정수 b를 나눌 때 나머지가 0이라면

[p.51 : #개선된 단위 변환 2행]
이 프로그램을 확장해 무게 단위(킬로미터와 파운드)
->
이 프로그램을 확장해 질량 단위(킬로그램과 파운드)

[p.148 : 두번째 문단 1행]
매번 반복할 때 마다 x*i/i ->
매번 반복할 때 마다 x**i/i

[p. 190 : 코드 마지막 줄]
for num in s:
->
for num in space:

[p.190 : 본문 마지막 행]
나타나는 주요 숫자의 확률
->
나타나는 소수(prime numbers)의 확률

[p.199 : 3문단 1행]
$5 또는 $10의 확률은 1/6의 확률로 배분하고, $20 또는 $40은 1/3의 확률로 배분한다.
->
$5 또는 $10의 확률은 1/6의 확률로 배분하고, $20 또는 $50은 1/3의 확률로 배분한다.

[p. 200 : 코드 11행]
probability = [1/6, 1/6, 1/3, 2/3]
->
probability = [1/6, 1/6, 1/3, 1/3]

[p.202 : 코드 11행]

[p.203 : 마지막 행]
즐겨하는 운동에 대한 설문 응답이 'football'이면 둘째 열이 1이고,
또 다른 운동이거나 아무 운동도 좋아하지 않으면 셋째 열이 1이다.
->
"football"을 좋아하는 스포츠로 표시한 경우 두 번째 열에는 1이 표시되고,
"football"이외의 다른 스포츠를 좋아하거나 모든 운동을 싫어하는 경우 세 번째 열에는 1이 표시된다.

[p. 205 : # 대수의 법칙 5행]
(1) 적분값만을 취하는 이산형 랜덤 변수는 5장에서 본 유일한 랜덤 변수다.
->
(1) 정수값만을 취하는 이산형 랜덤 변수는 5장에서 볼 수 있는 랜덤 변수의 유일한 종류다.

[p.217 : 15행]
internal:
->
interval:

[p.217 : 마지막 행]
FunAnimation 객체
->
FuncAnimation 객체

[p. 229 : 변환1]
y(n+1) = -0.04y(n) + 0.85y(n) + 1.6
->
y(n+1) = -0.04x(n) + 0.85y(n) + 1.6

[p. 229 : 변환2]
y(n+1) = 0.23y(n) + 0.22y(n) + 1.6
->
y(n+1) = 0.23x(n) + 0.22y(n) + 1.6

[p.229 : 변환3]
x(n+1) = -0.15x(n) - 0.28x(n)
->
x(n+1) = -0.15x(n) + 0.28y(n)

[p. 229 : 변환3]
y(n+1) = 0.26y(n) + 0.24y(n) + 0.44
->
y(n+1) = 0.26x(n) + 0.24y(n) + 0.44