1장 파이썬 시작하기#
자료 출처: QuantEcon by Thomas J. Sargent and John Stachurski
1.1 Python이란?#
파이썬(Python)은 네덜란드 프로그래머인 Guido van Rossum이 1989년에 고안한 범용 프로그래밍 언어다. Python은 무료이고, 오픈 소스며, Python Software Foundation을 통해 개발이 진행된다. Python은 가장 많이 사용되는 10대 프로그래밍 언어에 꾸준히 랭크 되었으며, 2024년 1월 PYPL(PopularitY of Programming Language) 기준으로 전 세계적으로 가장 인기있는 프로그래밍 언어다.(파이썬 다음으로 Java, JavaScript, C/C++, C#, R, PHP 순이다.) Python은 과학 컴퓨팅을 위한 주요 도구로 전세계적으로 과학 분야 작업에서 비중이 급속히 확대되고 있다.
Python은 우리가 여기에서 다룰 데이터 분석뿐만 아니라 웹 개발, CGI(common gateway interface) 및 그래픽 유저 인터페이스, 게임 개발, 멀티미디어, 데이터 처리, 보안 등 거의 모든 애플리케이션 도메인에서 사용되는 범용 언어다. 파이썬은 Google, Dropbox, YouTube 등 인터넷 서비스 및 첨단테크 회사에서 광범위하게 사용되고 있다.
파이썬은 많은 라이브러리의 지원을 받는 비교적 작은 핵심 언어를 가지고 있다. Python은 구문이 읽기 쉽고 기억하기 쉽기 때문에 매우 유용하다. 이에 따라 파이썬은 과학 컴퓨팅의 핵심 언어 중 하나가 되었다. 다음 분야에서 지배적 플레이어 또는 메이저 플레이어이며, 경제학을 비롯한 사회과학에서도 인기가 높아지고 있다.
데이터 과학 및 기계학습(machine learning) 작업을 위해 다양한 파이썬 패키지(라이브러리 또는 모듈이라고도 함)를 사용한다. 예를 들어, 데이터 통합 및 데이터 분석에 위에서 언급한 pandas 패키지를 사용하고, 머신러닝 모형을 구축하기 위해 scikit-learn 패키지가 사용되며, 다차원 데이터의 수학적 연산을 실행해야 할 때 numpy 패키지가 유용하다. 이런 라이브러리들 덕분에 고가의 통계 패키지(SPSS, STATA, SAS 등) 없이도 다양한 통계분석을 쉽게 할 수 있다.
1.2 Python 시작하기#
파이썬으로 프로그램을 작성하고 실행하는 데는 다양한 방법이 있지만, 여기에서 제시하는 방식은 기본 파이썬 랭귀지뿐만 아니라 주요 라이브러리가 들어있는 파이썬 배포판(distribution: 패키지 묶음 설치판)을 설치하는 것이다. 가장 인기있는 것이 아나콘다(Anaconda)이다. 다양한 파이썬 라이브러리를 따로따로 설치하는 것이 번거로울 수 있는데, Anaconda를 이용하면 필요한 주요 패키지를 한 번에 설치할 수 있다.
설치는 “anaconda download”를 검색해서 아나콘다 설치 파일을 다운로드하고 지침을 따라 설치하면 된다.(“Skip registration”을 선택하면 등록을 하지 않고도 다운로드 할 수 있다.)
자신의 컴퓨터 운영체제(Windows, Mac, Linux)에 맞는 아나콘다를 설치한다. 설치과정에서는 시스템이 제안하는 대로 설치하는 것이 무난하다.

아나콘다는 패키지를 관리하고 업그레이드하는 conda라는 도구를 제공한다. 정기적으로 실행해야 하는 conda 명령 중 하나는 전체 아나콘다 배포판을 업데이트하는 명령이다. 이를 위해서는 다음을 실행하면 된다.(업데이트에 시간이 오래 걸릴 수 있다.)
아나콘다 프롬프트(Prompt) 터미널을 열거나, 또는 주피터 노트북을 실행한다.
거기에
conda update anaconda를 입력한 다음 실행시킨다.
Jupyter Notebook#
주피터 노트북(Jupyter Notebook)은 파이썬 및 여러 과학 라이브러리와 상호 작용할 수 있는 방법 중 하나로서 브라우저 기반 인터페이스로 파이썬을 사용한다. 파이썬 명령을 작성하고 실행하며, 표, 그림, 애니메이션 등을 브라우저에 출력하고, 서식있는 텍스트와 수학 표현을 혼합하는 것이 가능하다. 이러한 기능으로 인해 주피터 노트북은 이제 과학 컴퓨팅 생태계의 메이저 플레이어가 되었다. 주피터 노트북은 아나콘다 배포판의 일부다. Windows일 경우, 아나콘다를 설치하고 시작 버튼을 누르면, 아나콘다 앱이 새로 설치된 것을 확인할 수 있다.
주피터 노트북(또는 주피터 랩)을 여는 방법
(1) Windows의 경우, 우선 시작 메뉴의 Anaconda 앱 중에서 “Anaconda Prompt”를 실행하면 다음과 같은 터미널 창이 나온다.

(2) 위 프롬프트 창의 (base) C:\Users\사용자이름>에 jupyter notebook을 타이핑하고 엔터를 치면 자신의 웹 브라우저에서 주피터 노트북이 실행된다. 이 경우 주피터 노트북이 실행되는 위치가 자신의 컴퓨터 사용자(Users) 디렉토리가 된다.
(3) 주피터 노트북이 실행되는 특정 위치를 자신이 선택할 수도 있는데, 윈도즈의 경우 가령 C 드라이브의 루트 디렉토리(즉, C:\)에서 주피터 노트북이 실행되도록 하기 위해서는 다음과 같이 하면 된다. 즉, (base) C:\Users\사용자이름>에서 cd\를 타이핑 하고 엔터를 친 다음, 거기에서 jupyter notebook을 타이핑하고 엔터를 치면 된다. 이 경우 사용자(Users) 디렉토리가 아니라 C:\ 디렉토리에서 주피터 노트북이 구동된다.(이렇게 하면 주피터 노트북 파일을 넣어 놓은 특정 디렉토리를 찾아가기가 쉽다.)
(4) Anaconda Prompt 창에서 jupyter notebook 대신 jupyter lab을 타이핑하여, Jupyter Notebook 대신 JupyterLab을 오픈할 수 있다. Jupyter Notebook이 개별 파일 단위(.ipynb)로 열고 작업하는 구조라면, 주피터 노트북의 차세대 인터페이스라 할 수 있는 JupyterLab은 여러 노트북 파일을 동시에 열어놓고 작업하기 편리하다.
ChatGPT Q&A#
주피터 노트북과 주피터 랩을 간단히 비교 설명해줘.
주피터 노트북 (Jupyter Notebook)
웹 브라우저에서 실행되는 대화형 환경.
코드 셀과 마크다운 셀을 섞어서 실행·작성할 수 있음.
직관적이고 가볍게 쓸 수 있어서 처음 배우는 사람이나 단일 분석 프로젝트에 적합.
파일 단위(
.ipynb)로 열고 작업하는 구조.주피터 랩 (JupyterLab)
주피터 노트북의 차세대 인터페이스.
노트북 파일뿐 아니라 터미널, 텍스트 편집기, 데이터 뷰어 등을 한 화면에서 탭이나 패널로 동시에 다룰 수 있음.
확장 기능(Extension) 지원이 강력해서 IDE(통합 개발 환경)처럼 활용 가능.
여러 노트북·파일을 동시에 열어놓고 작업하기 편리함.
즉, 주피터 랩은 주피터 노트북을 포함한 “확장된 작업 환경”이라고 보면 된다.
이상의 모든 것이 정상적으로 작동한다면 자신의 웹브라우저 상에 Jupyter Notebook이 열렸을 것이다. 여기에서 오른쪽 상단의 New를 클릭하고 Python 3을 선택해보자. 이렇게 하면 자신의 컴퓨터에 Python 명령을 입력할 수있는 active cell이 표시된다.

셀의 모드#
셀이 편집(edit) 모드에 있으면, 입력한 모든 내용이 커서가 깜박이는 셀에 나타난다. 셀에서 코드를 실행하기 위해서는 Shift 키를 누른 상태에서 엔터를 치거나, ctrl 키를 누른 상태에서 엔터를 치면 된다.(전자는 실행 후 다음 셀로 이동하는 반면, 후자는 실행 후 그 자리에 머무는 차이가 있다.)

Jupyter 노트북에서 키보드 입력의 효과는 사용중인 모드에 따라 다르다.
편집(edit) 모드
입력한 내용이 해당 셀에 있는 그대로 표시된다.
명령(command) 모드
키 입력은 명령으로 해석된다. 예를 들어
b를 입력하면 현재 셀 아래에 새 셀이 추가된다.
모드를 전환하려면
편집 모드에서 명령 모드로 전환하기:
Esc또는Ctrl+M누르기명령 모드에서 편집 모드로 전환하기:
Enter를 누르거나 셀을 클릭
1.3 파이선 프로그래밍 맛보기#
테스트 프로그램을 실행해보자. 여기에서는 세부 내용에 신경쓰지 말고 파이썬 코드가 이런 것이라는 정도만 알고, 해당 셀에 커서를 놓고 Shift+Enter 또는 Ctrl+Enter로 실행을 연습해보자.
숫자 프로그래밍#
행렬(matrix) 및 배열(array)의 기본적 처리 기능은 넘파이(NumPy) 라이브러리에서 제공한다. 예를 들어, 다음과 같이 배열을 만들어보자. 배열이란 벡터, 행렬, 숫자표 등을 표현하기 위해 항목을 차례로 배열한 것을 말한다.
import numpy as np # numpy 라이브러리 로드
a = np.linspace(-np.pi, np.pi, 100) # -π에서 π까지 100개의 동일 간격 그리드 만들기
a
array([-3.14159265, -3.07812614, -3.01465962, -2.9511931 , -2.88772658,
-2.82426006, -2.76079354, -2.69732703, -2.63386051, -2.57039399,
-2.50692747, -2.44346095, -2.37999443, -2.31652792, -2.2530614 ,
-2.18959488, -2.12612836, -2.06266184, -1.99919533, -1.93572881,
-1.87226229, -1.80879577, -1.74532925, -1.68186273, -1.61839622,
-1.5549297 , -1.49146318, -1.42799666, -1.36453014, -1.30106362,
-1.23759711, -1.17413059, -1.11066407, -1.04719755, -0.98373103,
-0.92026451, -0.856798 , -0.79333148, -0.72986496, -0.66639844,
-0.60293192, -0.53946541, -0.47599889, -0.41253237, -0.34906585,
-0.28559933, -0.22213281, -0.1586663 , -0.09519978, -0.03173326,
0.03173326, 0.09519978, 0.1586663 , 0.22213281, 0.28559933,
0.34906585, 0.41253237, 0.47599889, 0.53946541, 0.60293192,
0.66639844, 0.72986496, 0.79333148, 0.856798 , 0.92026451,
0.98373103, 1.04719755, 1.11066407, 1.17413059, 1.23759711,
1.30106362, 1.36453014, 1.42799666, 1.49146318, 1.5549297 ,
1.61839622, 1.68186273, 1.74532925, 1.80879577, 1.87226229,
1.93572881, 1.99919533, 2.06266184, 2.12612836, 2.18959488,
2.2530614 , 2.31652792, 2.37999443, 2.44346095, 2.50692747,
2.57039399, 2.63386051, 2.69732703, 2.76079354, 2.82426006,
2.88772658, 2.9511931 , 3.01465962, 3.07812614, 3.14159265])
ChatGPT Q&A#
다음 파이썬 코드를 쉽게 설명해줘.
import numpy as np a = np.linspace(-np.pi, np.pi, 100) a
이 파이썬 코드는
numpy라이브러리를 사용하여 특정한 수열을 생성합니다. 각 코드 라인의 의미는 다음과 같습니다.
import numpy as np:
numpy라이브러리를np라는 약칭으로 가져옵니다.numpy는 수학적 계산을 위한 파이썬 라이브러리로, 특히 배열이나 행렬 연산에 자주 사용됩니다.
a = np.linspace(-np.pi, np.pi, 100):
np.linspace()함수는 지정된 범위 내에서 균일한 간격의 숫자들을 생성합니다.여기서는
-np.pi부터np.pi까지의 범위에 걸쳐 총 100개의 숫자를 생성합니다.-np.pi와np.pi는 각각 원주율 π의 음수와 양수 값을 나타냅니다.결과적으로, 이 라인은 -π부터 π까지의 범위에서 균등하게 분포된 100개의 숫자를 포함하는 배열
a를 생성합니다.
a:
이 라인은 배열
a를 출력합니다. 이 배열에는 -π에서 π까지 균등하게 분포된 100개의 숫자가 들어 있습니다.이 코드는 주로 수학이나 공학 계산, 데이터 시각화 등에서 사용됩니다. 예를 들어, 함수의 그래프를 그릴 때 x축의 값을 생성하는 데 사용할 수 있습니다. 여기서 생성된 값들은 원주율 π에 관련된 계산이나 trigonometric(삼각 함수) 함수의 그래프를 그릴 때 유용합니다.
파이썬 라이브러리#
라이브러리(library)는 기본 파이썬 배포판에는 포함되지 않은 모듈 또는 함수 그룹을 로딩하는 데 사용된다. 아주 기본적인 분석을 수행하는 함수는 기본 파이썬 배포판에 표준으로 제공되지만 좀 더 다양하고 복잡한 함수나 작업을 위해서는 해당 라이브러리를 불러와서 사용한다. 참고로 2022년 11월 현재 Python 소프트웨어의 공식 저장소인 PyPI(Python Package Index)에는 다양한 기능을 가진 41만개 이상의 라이브러리 패키지가 있다.(Wikipedia, “Python (programming language)”)
아나콘다 배포판을 설치하고 주피터 노트북을 통해 파이썬을 사용하는 경우, 머신러닝 통계 분석에 필요한 각종 표준적인 라이브러리 패키지를 사용자가 직접 다운로드할 필요가 없고, 이미 이런 라이브러리들이 설치돼있다. 단, 설치된 라이브러리를 사용하기 위해서는 그 때마다 바로 위 명령문의 예처럼 해당 라이브러리를 호출하는 절차(즉, import numpy as np)가 필요하다.
SciPy 라이브러리는 NumPy 위에 구축되었으며, 예를 들어 \( \int_{-2}^2 \phi(z) dz \)와 같은 적분 계산이 가능하다. 여기서 \( \phi \)는 표준정규(standard normal) 확률밀도함수(probability density function)이다.
from scipy.stats import norm
from scipy.integrate import quad
ϕ = norm()
value, error = quad(ϕ.pdf, -2, 2) # 가우시안 구적법(Gaussian quadrature)을 사용하여 적분 실행
value
0.9544997361036417
Symbolic Algebra#
Mathematica 또는 Maple에서처럼 기호 표현 계산 등이 가능하다. SymPy 라이브러리는 이 기능을 제공한다.
from sympy import Symbol
x, y = Symbol('x'), Symbol('y') # 'x'와 'y'를 대수 기호로 취급
x + x + x + y
이 경우 다음과 같은 조작이 가능하다.
expression = (x + y)**3
expression.expand()
또한 다항식 풀기가 가능하다.
from sympy import solve
solve(x**2 + x + 2)
[-1/2 - sqrt(7)*I/2, -1/2 + sqrt(7)*I/2]
통계 분석#
Python의 데이터 관리 및 통계 라이브러리는 지난 몇 년 동안 빠르게 발전해 왔다. 데이터 작업에 가장 많이 사용되는 라이브러리 중 하나는 pandas이다. 다음은 간단한 예다.
import pandas as pd
np.random.seed(1234)
data = np.random.randn(5, 2) # N(0,1) 정규분포에서 5x2 행렬 임의 추출
dates = pd.date_range(start='1/1/2022', end='1/5/2022')
df = pd.DataFrame(data, columns=('price', 'weight'), index=dates)
print(df)
price weight
2022-01-01 0.471435 -1.190976
2022-01-02 1.432707 -0.312652
2022-01-03 -0.720589 0.887163
2022-01-04 0.859588 -0.636524
2022-01-05 0.015696 -2.242685
# 바로 위에서 만든 'df'라는 데이터 프레임의 평균값 구하기
df.mean()
price 0.411768
weight -0.699135
dtype: float64
기타 유용한 통계 라이브러리
statsmodels — 다양한 통계 루틴
scikit-learn — Python의 머신러닝(Google 등에서 후원)
온라인 도움말#
가령 바로 위에서 사용했던 np.random.randn 명령어에 대한 도움말을 얻으려면 주피터 노트북 셀에서 해당 명령어의 맨앞이나 맨뒤에 물음표를 붙여 np.random.randn?을 실행하면 된다. 도움말 문서가 아래와 같이 나타난다.(그런데 이렇게 하는 대신 Googl에서 np.random.randn을 검색해보는 것이 더 도움이 될 때가 많다.)
np.random.randn?
Docstring:
randn(d0, d1, ..., dn)
Return a sample (or samples) from the "standard normal" distribution.
.. note::
This is a convenience function for users porting code from Matlab,
and wraps `standard_normal`. That function takes a
tuple to specify the size of the output, which is consistent with
other NumPy functions like `numpy.zeros` and `numpy.ones`.
.. note::
New code should use the
`~numpy.random.Generator.standard_normal`
method of a `~numpy.random.Generator` instance instead;
please see the :ref:`random-quick-start`.
If positive int_like arguments are provided, `randn` generates an array
of shape ``(d0, d1, ..., dn)``, filled
with random floats sampled from a univariate "normal" (Gaussian)
distribution of mean 0 and variance 1. A single float randomly sampled
from the distribution is returned if no argument is provided.
Parameters
----------
d0, d1, ..., dn : int, optional
The dimensions of the returned array, must be non-negative.
If no argument is given a single Python float is returned.
Returns
-------
Z : ndarray or float
A ``(d0, d1, ..., dn)``-shaped array of floating-point samples from
the standard normal distribution, or a single such float if
no parameters were supplied.
See Also
--------
standard_normal : Similar, but takes a tuple as its argument.
normal : Also accepts mu and sigma arguments.
random.Generator.standard_normal: which should be used for new code.
Notes
-----
For random samples from the normal distribution with mean ``mu`` and
standard deviation ``sigma``, use::
sigma * np.random.randn(...) + mu
Examples
--------
>>> np.random.randn()
2.1923875335537315 # random
Two-by-four array of samples from the normal distribution with
mean 3 and standard deviation 2.5:
>>> 3 + 2.5 * np.random.randn(2, 4)
array([[-4.49401501, 4.00950034, -1.81814867, 7.29718677], # random
[ 0.39924804, 4.68456316, 4.99394529, 4.84057254]]) # random
Type: builtin_function_or_method
기타 콘텐츠#
코드를 실행하는 것 외에도 주피터 노트북을 사용하면 페이지에 텍스트, 방정식, 그림 및 비디오까지 포함할 수 있다. 셀에 커서가 있는 상태에서 마우스를 사용하여 메뉴 항목 목록 바로 아래의 Code로 돼 있는 드롭 다운 메뉴에서 Markdown을 선택하면, (LaTeX와 비슷하지만 더 간단한) “Markdown”이라는 마크업(markup) 언어를 작성할 수 있다. 여러분이 보고 있는 현재 셀의 문서가 마크다운으로 작성된 것이며, 텍스트뿐 아니라 다음과 같이 식을 표현할 수도 있다.
If \(\{A_n\}\) is pairwise disjoint, then
라이브러리 설치#
앞서 설명한 대로 기본적으로 필요한 라이브러리는 아나콘다에 이미 들어있는데, 여기에 들어있지 않은 추가적으로 필요한 라이브러리는 pip 또는 conda로 자신이 직접 설치해야 한다.(pip은 파이썬 패키지를 설치하는 반면, conda는 파이썬뿐 아니라 C, C++, R 등 모든 언어로 작성된 소프트웨어를 포함한다.)
가령 QuantEcon.py은 경제학을 위한 고성능 오픈 소스 파이썬 코드 라이브러리인데, 여기에서 제공하는 quantecon를 설치하기 위해서는 아나콘다 프롬프트 창에서 다음을 실행하면 된다.
(base) C:\Users\pilsu>pip install quantecon 또는
(base) C:\Users\pilsu>conda install quantecon
또는 위와 동일한 명령문을 주피터 노트북에서도 실행시킬 수 있는데, 이 때는 맨 앞에 % 또는 !를 붙여서 사용한다. 즉, 주피터 노트북의 임의의 셀에서 %pip install quantecon이나 %conda install quantecon을 입력하고 실행하면 된다.