上級マクロ経済学

第5回 pythonライブラリの利用

Author

荻巣嘉高

1 ライブラリの利用

Pythonで用いるライブラリ

Pythonは基本的な演算以外、多くの計算などはライブラリに依存している。 ここではこの講義で主に用いるライブラリを以下に記載する。


Numpy
数学的な計算に用いるライブラリ。多くの数学的操作を提供している。

Matplotlib
グラフなどを描写するためのライブラリ。計算結果を表示して確認するなどのためにも、ほとんどの場合マスト。

Pandas
データフレームと呼ばれる形式で表データを扱うのが得意なライブラリ。ExcelやCSVファイルをデータフレームとして読み込んだり、データフレームをExcelやCSVファイルに書き出したりすることができる。

Scipy
Numpyで提供されていない特殊な関数や、統計分布の関数などの少し高度な科学技術計算の際に利用することが多い。 余談だが、スパース行列なども扱える。

Pythonでの計算例

例えばネイピア数eを用いて、 e^{2}

を計算するためには、e \approx 2.71828182846を使って、

e =  2.71828182846 # どっかから調べてもってくる
e**2 # eの2乗
7.38905609893584

と計算する必要があります。

  • ライブラリ(Numpy)を使えば、いちいちe \approx 2.71828182846を調べる必要がなくなる。

ライブラリのimport

Numpyを利用してみよう。 利用したいライブラリは、

  • import <パッケージ名>

でインポートする。

import numpy
  • インポートした後、<パッケージ名>.<関数名>の形でライブラリ内の関数を利用できる。
  • ネイピア数の乗数e^{x}を計算する関数はexp(x)です。
  • e^2は次のように計算します。

. . .

numpy.exp(2) # numpyのexp関数で、引数が2
7.38905609893065
  • xは引数と言われます。

パッケージの名前付け

ライブラリ(あるいはパッケージやモジュール)をインポートする際には、別名をつけることができます。

省略名をつけると、パッケージの利用がしやすくなります。

  • 別名は、import <パッケージ名> as <別名>としてつけます。
import numpy as np # numpyをnpとしてインポート

np.exp(2)
7.38905609893065

2 Numpy

インポート

import numpy as np

で利用。

  • 数学的な操作などを行う場合には必須ライブラリ
  • Pythonのネイティブの関数よりも計算が早いことがほとんど。

指数関数と対数関数

指数関数(e^{x}
np.exp(x)


対数関数(\log x
np.log(x)

ndarray

Numpyをインポートすれば、ndarray形式を扱える。

  • N-dimentional array形式
    • N次元配列、という意味。
  • 「Numpyバージョンのリスト」と言えるだろう。
  • ベクトルや行列などとして扱うことができる。
    • 計算ができる。

. . .

np.array(<数値のリスト>)とすると、ndarray形式にできる。

A = [1,2,3,4] # pythonリスト
print(A)
A
[1, 2, 3, 4]
[1, 2, 3, 4]
B = np.array([1,2,3,4]) # ndarray
print(B)
B
[1 2 3 4]
array([1, 2, 3, 4])

ndarrayで行列を表現する

Pythonリストで、リストのリストを作ることができる。

A = [[1,2],[3,4]]
A
[[1, 2], [3, 4]]

これをndarrayに変換することができる。

A = [[1,2],[3,4]]
B = np.array(A)
B
array([[1, 2],
       [3, 4]])

これを、行列として扱うことができる。

さらに、行列のうちij列目の要素を、

  • <ndarray行列>[i][j]
  • <ndarray行列>[i,j]

で取得できる。(カウントは0からであることに注意!)

A = [[1,2],
    [3,4]]
B = np.array(A)

print(B[0,1]) # 0行1列目: 2
print(B[1,1]) # 1行1列目: 4
2
4

ndarrayの注意点

  • 中のリストは、すべてが同じ要素数でないとndarrayにできない。
A = [[1,2], [3,4,5]]
A # OK
[[1, 2], [3, 4, 5]]
A = [[1,2], [3,4,5]]
np.array(A) # NG
  • ndarrayは、要素の全てが同じデータ型になる。
B = [[1,2], ["佐藤", "鈴木"]]
B # 1つめはint型のリスト、2つ目はstr型のリスト
[[1, 2], ['佐藤', '鈴木']]
B = [[1,2], ["佐藤", 4]]
np.array(B) # データがすべてstr型になってしまう
array([['1', '2'],
       ['佐藤', '4']], dtype='<U21')

ndarrayの作成

  • 0からnより小さい整数までのリストを作成する。
np.arange(11) # 0から11より小さい整数(10)までのリスト
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
  • mからnより小さい整数までのリストを作成する。
np.arange(3,6) # 3から6より小さい整数(5)までのリスト
array([3, 4, 5])
  • mからnより小さい数まで、s刻みのリストを作成する。
np.arange(3,6,0.5) # 3から6より小さい整数(5)まで、0.5刻みのリスト
array([3. , 3.5, 4. , 4.5, 5. , 5.5])
  • 最小値をa、最大値をbとして、等間隔になるようにnだけの点を取るリストを作成する。
np.linspace(0,2,5) # 0から2まで、5つの点を取るようなリスト
array([0. , 0.5, 1. , 1.5, 2. ])
  • 全ての要素が0で、要素数がnのリストを作成する。
np.zeros(3)
array([0., 0., 0.])
  • 全ての要素が1で、要素数がnのリストを作成する。
np.ones(4)
array([1., 1., 1., 1.])

reshape

  • reshapeで、データの行列数を変える。
a = np.ones(6)
print("1D-array")
print(a)
print()
print("2D-array")
b = a.reshape(3,2) # aを3by2行列にする
print(b)
1D-array
[1. 1. 1. 1. 1. 1.]

2D-array
[[1. 1.]
 [1. 1.]
 [1. 1.]]

ndarrayの演算

ここでは主にベクトルの演算を扱う。

行列の演算については、今後必要に応じて補足します。

a = np.arange(3) # a=[0,1,2]
a # 元のリスト
array([0, 1, 2])
add = a+1 # 全ての要素に1を足す。
add
array([1, 2, 3])
sub = a-1 # 全ての要素から1を引く。
sub
array([-1,  0,  1])
mult = a*2 # 全ての要素に2をかける。
mult
array([0, 2, 4])
dev = a/2 # 全ての要素を2で割る。
dev
array([0. , 0.5, 1. ])
power = a**3 # 全ての要素を3で乗じる。
power
array([0, 1, 8])
a = np.arange(3) # a=[0,1,2]
b = np.arange(3,6) # b=[3,4,5]
a,b
(array([0, 1, 2]), array([3, 4, 5]))
add_v = a+b # 同じインデックスごとに足す
add_v
array([3, 5, 7])
sub_v = a-b # 同じインデックスごとに引く
sub_v
array([-3, -3, -3])
mult_v = a*b # 同じインデックスごとかける
mult_v
array([ 0,  4, 10])
dev_v = a/b # 同じインデックスごとに割る
dev_v
array([0.  , 0.25, 0.4 ])
power_v = a**b # 同じインデックスごとに乗じる
power_v
array([ 0,  1, 32])
c = np.arange(4) # c=[0,1,2,3]
a + c # 要素数が異なるとエラー

ndarrayの関数

  • 以下の関数は、<ndarray>だけでなく、pythonリストにも使える。
a = np.arange(10) # 1から9までのリスト
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sum(a) # 合計
45
np.mean(a) # 平均
4.5
np.median(a) # 中央値
4.5
np.max(a) # 最大値
9
np.min(a) # 最小値
0
np.var(a) # 分散(nで割る)
8.25
np.var(a, ddof=1) # 不偏分散(n-1で割る)
9.166666666666666
np.std(a) # 標準偏差(nで割る)
2.8722813232690143
np.std(a, ddof=1) # 不偏標準偏差(n-1で割る)
3.0276503540974917

ランダム変数を使う

Numpyはランダム変数を生成できる。

Numpyライブラリ内のrandomモジュールを用いる。

  • ライブラリ内のモジュールの使用は<ライブラリ名>.<モジュール名>とする。
  • モジュール内の関数を使う場合は、<ライブラリ名>.<モジュール名>.<関数名>とする。

いくつかのランダム生成の関数

np.random.random() # [0,1)区間で生成
0.698057248447303
np.random.random(3) # [0,1)区間で3個生成
array([0.86447943, 0.322681  , 0.67078879])
np.random.uniform(2,5) # [2,5)区間から1個生成
3.3526218092400475
np.random.uniform(2,5,3) # [2,5)区間から3個生成
array([3.14630826, 3.23243405, 3.20443875])
np.random.randint(10,20) # [10,19)区間の整数から1個生成
18
np.random.randint(10,20,4) # # [10,19)区間の整数から4個生成
array([15, 10, 15, 19])

平均0、分散1の正規分布を標準正規分布と呼びます。

np.random.randn() # 正規分布から生成
-1.1361695256759599
np.random.randn(4) # 平均0、分散1の正規分布から4個生成
array([0.92807197, 0.09402926, 1.5076116 , 1.12852295])

choice関数

choice()を使うと、くじ引きを作ることもできる。

# "佐藤"、"鈴木"、"近藤"から
# 等確率で一つ選ぶ
np.random.choice(["佐藤","鈴木","近藤"]) 
'佐藤'
# "佐藤"、"鈴木"、"近藤"から
# pの確率分布に従って
# 一つ選ぶ
np.random.choice(["佐藤","鈴木","近藤"],p=[0.1,0.3,0.6])
'近藤'
# "佐藤"、"鈴木"、"近藤"から
# pの確率分布に従って
# 2つ選ぶ
# 重複あり
np.random.choice(["佐藤","鈴木","近藤"],size=2,p=[0.1,0.3,0.6])
array(['近藤', '近藤'], dtype='<U2')
# "佐藤"、"鈴木"、"近藤"から
# pの確率分布に従って
# 2つ選ぶ
# 重複なし
np.random.choice(["佐藤","鈴木","近藤"],size=2,p=[0.1,0.3,0.6], replace=False)
array(['近藤', '鈴木'], dtype='<U2')

seedの設定

ランダム変数は、引くたび変化してしまうため、結果が一致するかどうかを確認する時などにはむしろ不便になりがち。

seed()を指定すると、引く数が固定される。

seedのイメージ
  • ランダムに引かれる変数は、実は疑似乱数表というような表を使って選ばれてきているとイメージして欲しい。
    • 疑似乱数表は順にランダムに引かれた変数が記されていっている。
    • seedを指定しない場合は、疑似乱数表1、疑似乱数表2、疑似乱数表3…というものから毎度どの表を使うかをランダムに選んでいるイメージ。
    • seedを指定すると「疑似乱数表2を使う」ことが固定され、その後ずっと疑似乱数表2の乱数が使われる感じ。

次のコードを数回実行してください。

np.random.randint(0,10,3)
array([5, 0, 7])

次のコードを数回実行してください。

np.random.seed(1) # seedを固定

np.random.randint(0,10,3)
array([5, 8, 9])

3 Matplotlib

インポート

色々なグラフ描写のためのライブラリ。

基本的には、pyplotモジュールしか使わない。

したがって、次のようにインポートする。

import matplotlib.pyplot as plt

その後、plt.<関数名>で描写を行う。

基本のラインプロット

y=x^2 をプロットしよう。

x = np.arange(-3,4) # -3から3
y = x**2 # yの値を計算する。

plt.plot(x,y) # plotを描く
plt.show() # plotを表示する # notebook形式のファイルだと必要ないこともある

2025-09-13T13:02:19.702843 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

x = np.arange(-3,4) # -3から3
y = x**2

plt.plot(x,y, marker="o") # markerの指定
plt.show() # plotを表示する # notebook形式のファイルだと必要ないこともある

2025-09-13T13:02:19.730651 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

x = np.arange(-3,4) # -3から3
y = x**2

plt.plot(x,y, marker="o", 
            markersize=16, # マーカーのサイズ 
            markerfacecolor="red", # マーカーの塗りつぶしの色
            markeredgecolor="green", # マーカーの縁の色
            markeredgewidth=3 # マーカーの縁の太さ
            ) 
            
plt.show() # plotを表示する # notebook形式のファイルだと必要ないこともある

2025-09-13T13:02:19.759697 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

マーカーの種類はこちら

x = np.arange(-3,4) # -3から3
y = x**2

plt.plot(x,y,
        color="green", # ラインの色
        linestyle="--", # linestyleを指定 # ls="--"でもOK
        linewidth=2 # ラインの太さ
        ) 
plt.show() # plotを表示する # notebook形式のファイルだと必要ないこともある

2025-09-13T13:02:19.788500 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

ラインの種類は"-", "--", "-.", ":"など。

linestyle=""とすれば、ラインが消える。

複数のラインの描写

f(x)=x^2 g(x)=-2x を描写する。

  • 2本以上描写する時には、ラインの違いがわかるように色、ラインの種類などを工夫する。
  • 凡例をつける。
x = np.arange(-3,4) # -3から3
f = x**2 # fの値を計算する。
g = -2*x # gの値を計算する。

plt.plot(x,f,
        label="f(x)") # 凡例用の名前(=f(x))をつける
plt.plot(x,g,
        label="g(x)") # 凡例用の名前(=g(x))をつける
plt.legend() # 凡例をプロットに入れる
plt.show()

2025-09-13T13:02:19.822548 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

プロット周りのレイアウト

x = np.arange(-3,4) # -3から3
f = x**2 # fの値を計算する。
g = -2*x # gの値を計算する。

## ここからプロット用のコード

plt.figure(figsize=(6,8)) # 図の枠の大きさを調整する。

## ラインのプロット
plt.plot(x,f,
        label="f(x)") # 凡例用の名前(=f(x))をつける
plt.plot(x,g,
        label="g(x)") # 凡例用の名前(=g(x))をつける

plt.xlim(-2,4) # x軸のプロット範囲を-2から4にする
plt.ylim(-1,6) # y軸のプロット範囲を-1から6にする


## ラベル
plt.xlabel("x", fontsize=20) # x軸のラベルをサイズ20で
plt.ylabel("f(x), g(x)", fontsize=14) # y軸のラベルをサイズ14で
plt.title("functions of x") # タイトル。基本は日本語が使えない。


plt.legend() # 凡例をプロットに入れる

plt.show()

2025-09-13T13:02:19.860795 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

散布図

散布図はscatter()関数を用いる。 y = x + u でyを作ろう。

ただし、uは正規分布に従ってランダムに生成する。

x = np.linspace(-1,1,100) # [-1,1]区間を等間隔に区切って100個のxを作る
u = np.random.normal(size=len(x)) # uをランダムに100個生成
y = x + u # yを計算

plt.scatter(x,y) # 散布図を描く
plt.show()

2025-09-13T13:02:19.897716 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

フォントの設定などはこちら
x = np.linspace(-1,1,100) # [-1,1]区間に等間隔に区切って100個のxを作る
u = np.random.normal(size=len(x)) # uをランダムに100個生成
y = x + u # yを計算

plt.scatter(x,y, # 散布図を描く
            marker="*", # マーカーの種類
            s=100, #マーカーの大きさ
            color="green" # 色
            ) 

plt.show()

2025-09-13T13:02:19.931066 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

棒グラフ

棒グラフはbar()関数を用いる。

bars = [100,200,140]
label = ["A","B","C"]

plt.bar(label,bars) # 棒グラフを描く

plt.show()

2025-09-13T13:02:19.959545 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

フォントの設定などはこちら
bars = [100,200,140]
label = ["A","B","C"]

plt.bar(label,bars, # 棒グラフを描く
        color="orange", # 色の指定
        width=0.3, #横幅
        ) 

plt.show()

2025-09-13T13:02:19.985599 image/svg+xml Matplotlib v3.9.2, https://matplotlib.org/

4 Scipy

インポート

次のようにインポート。

import scipy as sp

おそらく経済系の人は、

  • scipy.stats
  • scipy.optimize

のモジュールがScipyでも圧倒的に利用頻度が高いだろう。

import scipy.stats as stat # statsのインポート
import scipy.optimize as opt # optimizeのインポート
  • ただし、scipyの利用方法は、今後必要に応じて解説します(やれることが多すぎる)。

まとめ

  • すごいスピードで紹介をしています。
  • 全てをすぐにできるようになる必要はありません。

たいていの場合、

  1. ある必要な処理が出てくる。
  2. その処理をしてくれるパッケージ(あるいはそれを含むライブラリ)やその関数を検索する(Googleは神)
  3. 検索して出てきた解説記事等を参考にして関数を用いる。
  • バグの対応も同様で、検索してみるのが一番。