経済学のためのPython入門#
import datetime
dt = datetime.datetime.now()
print('Version:',dt.strftime('%Y年%m月%d日'))
Version: 2024年08月19日
本サイトに関するコメント等はGitHubのDiscussionsもしくはharuyama@econ.kobe-u.ac.jpにご連絡ください。
はじめに#
本サイトの目的は次の2つのサイトを学習するために必要なPython
の基礎の解説である。
次の12章から構成されている。
Python
入門I
プログラミング言語であるPython
は,日本語と同様に文法・表現・単語が決まっており,それらの使い方を説明する。外国語を学ぶことと似た様なものかと不安になる人もいるかも知れないが,そうではない。殆どの人は英語を学んだと思うが,実はPython
は英語で書かれているため,英語感覚でコードを読み書きすることができるのが一つの大きな利点である。しかし,英作文をイメージすると間違いである。理由は,正確性が要求されるからである。話し言葉・書き言葉は曖昧な表現になり得る。例えば,I kind of like him.(もしくは,I kinda like him.)ここでの”kind of”は「種類」と言う意味ではなく「曖昧さ」を表している。訳すと「まぁ,好きかなぁ,,,」の様なイメージだろうか。しかし,話すタイミングや語調によっては「実はそうでもないかも」の含みがある様にも聞こえるかも知れない。このように正確さにかける英語ではコンピュータに命令を伝えることは難しい。一般的にプログラミング言語は正確性が重視されるため,味気ない「文章」になる。更には少しでも間違えると「何言ってるか分かんない」という意味でエラーが発生する。一つのスペルミスでもエラーが発生するのである。このパートでは,「Python
語」を使いコンピュータに正確に命令を伝えて実行させる方法を学習する。(このパートは次の6章から構成されており,神戸大学経済学部の「プログラミング入門」の教科書として使用する予定である。)データ型と変数
データの操作
関数とメソッド
制御フロー
モジュールと疑似コード
図示とシミュレーション
Python
入門IINumPy
: 高速化
インストールしたPython
をそのままの「素」で使うことができる。しかし用途によっては物足りないと感じる場合がある。「素」のPython
を4人乗りの家族用乗用車とイメージしてみよう。通常の生活では十分だが,自動車レースに参加するとなると明らかに不十分である。目的によって機能を補ってくれるのがパッケージと呼ばれるもので,この章を含めて残りの章を使って主な(外部)パッケージについて説明する。NumPy
(Numerical Pythonの略でナンパイと読む)は,名前が示すように計算を高速化させるパッケージであり,乗用車をレース用にチューンアップしてくれる。シミュレーションを行う際には欠かせないパッケージである。Pandas
: データ分析
データを扱う際に欠かせないパッケージである。イメージ的には,Python
版のExcelと思えば良いだろう。名前は計量経済学の授業で出てきたパネル・データ(Panel Data)から派生した可愛らしい名前になっている。データを扱うのであればNumPy
で良いのではと思うかも知れない。実際,Pandas
のデータの部分はNumPy
のarray
と呼ばれるデータ型に簡単に変換できるようになっている。どこに利点があるかと言うと,行・列にラベル名(例えば,「Real GDP」)が使えるためデータの直感的な操作が可能となる。またデータを整形するのに便利な関数が多く用意されている。このパッケージ無ければデータを扱いが非常に面倒に感じる事になるだろう。Matplotlib
: 図示
データをプロット(図示)するためのパッケージである。NumPy
,Pandas
,SciPy
と並んでPython
のエコシステムを構成している。プロットするためのパッケージには様々なものが開発されているが,Matplotlib
が基本となっている。プロットのためのコードには幾つかのパターンがあり,オブジェクト指向と呼ばれる考えに基づく方法を紹介する。Pandas
: 図示
上で紹介したPandas
にもプロットする機能が備わっている。裏ではMatplotlib
が動いているが,手っ取り早くプロットしたい場合に重宝する。図の細かい所まで設定したい場合はMatplotlib
を直接使った方が良いが,Pandas
のプロット機能を知っていると非常に便利に感じるだろう。SciPy.optimize
: 解の求め方と最適化問題
経済学では最適化問題が至る所で出てくる。消費者の効用最大化問題,企業の利潤最大化もしくは費用最小化問題など。scipy.optimize
はそのためのツールを提供してくれる。また単なる最大化・最小化問題を数値的に解くのではなく,制約式の下での最適化問題も解くことが可能である。また等式制約と不等式制約の両方に対応している。経済学を勉強する上で欠かせないツールである。NumPy
: ランダム変数
既出のNumPy
の基本はarray
(配列)と呼ばれるリストに似たデータ型だが,その他にいくつかのサブパッケージが用意されている。その中の一つがランダム変数生成用のものである。ここでは,その使い方を説明する。統計学の理解やシミュレーションを行うには欠かせないものとなる。SciPy.stats
: 確率分布
上でも出てきたSciPy
はScientific Pythonの略であり,科学技術計算用のパッケージである。非常に大きなパッケージであり,その中には様々な用途(積分,統計,最適化問題など)に合わせたサブパッケージが用意されている。その中に,最適化問題用のSciPy.optimize
が含まれている。統計学用のサブパッケージがscipy.stats
であり,この章ではその使い方について簡単に説明する。統計学の授業で学んだ概念などを実際にコードを書いて実行することができる。ちなみに,SciPy
にはNumPy
と重複する機能も含んでおり,仕様が微妙に違ったりする。このサイトと上述の経済学のサイトでは,NumPy
にあるものはNumPy
のものを使うことにする。
また次のトピックについても取り上げているので参考にして欲しい。
ツールのインストールと説明
Pythonやと関連ツール(GitやGitHubなど)のインストールと使い方について説明する。Tipsと注意点
コードを書く上で役に立つ点をまとめる。是非読んでみよう!疑似コード
コードを自然言語(日本語や英語)で表したコードであり,コードの裏にある考え方を整理する。学業成績の分析
神戸大学のウリボーネット上にある成績を使い学業成績分析を行う。成績をコピーして使うので他大学でも使えるかもしれない?Gapminder
Gapminderは世界経済のGDPなどデータを駆使し興味深い分析をおこなっているサイトである。そのデータを使って,グループ別(例えば,アジア・欧州・アフリカなど)の計算を簡単に行うことができるPandas
のgroupby
の使い方とMulti-index
を紹介する。移動平均
移動平均の計算方法の解説とインフレ率とマネーストックの増加率で使ったDataFrame
の作成方法について説明する。
学生のコメント#
本サイトは神戸大学経済学部の「プログラミング入門」の教科書として使用した。その際の自由記述アンケートの内容を一部紹介する。(本サイトの一部は「プログラミングと経済分析」にも使用したがその授業の学生のコメントはここで紹介する。)
2023度第3クォーター(履修登録者171名)
毎週楽しい授業をありがとうございました!この授業を取らなければ一生関わらなかったであろうツールに触れるこができ,とても楽しかったです。毎週おもしろい授業が楽しみで,とても有意数時間を過ごせました!
慣れないプログラミングということで本来ハードルが高いはずなのですが,導入をすごく丁寧に初心者でもついて行けるような感じでやってくださったので,とても入りやすかったです。丁寧さとテンポ感のバランスが良く,飽きることなく,また置いていかれることなく最初から最後まで楽しんで学習することができました。
プログラミングは難しそうだと思っていたが,やってみると意外と面白かった。講義ノートも分かりやすかった。
プログラミングという授業名をきいて,少し難しく考えていたが,受けてみて,とても分かりやすい内容になっており,自分のためになった。
今回私は初めてプログラミングの授業を受けましたが非常に楽しい,かつ興味をもつことができる内容でした。まず最初に受けて他の授業と異なると感じたのは実際に手を動かして学んでいくという点です。 他の講義では教授の話を90分開いて終わりますがプログラミングでは,手を動かして進めていくため90 分常に考え楽しみながら授業を進めていくことができました。
プログラミングは難しいというイメージがありましたが,実際にプログラミングをしてみると,非常に楽しかったです。丁寧な解説で わかりやすかったです。
とても意義深い授業だった。今まではブログラミングとは小難しいものだと思って避けていたが,この授業のおかげでプログラミングに楽しく触れることができたからだ。
対面の授業に参加しても理解できなかったところを動画で復習できるのが良いと感じた。また,毎日の授業で課題があり,フィードバックも早いので,1つずつ消化しながら学ぶことができたのが,ありがたかった。
特に改善して欲しい点もなく授業もためになり満足しているため来年も後輩のために開請して欲しいと思う。
文理系関係なく,データサイエスが必要とされるこの時代において,少しでも知識があるのとないのとでは大きな差が開くように感じます。 コードがわずかに違うだけでエラーがでてしまうことに何回むかついたかは覚えていませんが,成功した時の達成感を感じることができ,よかったなと思います。
他にプログラミングを扱う授業を全学共通科目で履修していたのですが,その授業と比較しても,課題を取り組むためのサポートが手厚くありがたかったです。
自分で入力したコードがうまく実行されたときは気持ちよかったです。
初めてプログラミングというものを学んだが,非常に興味深いと思えた。私たちの2歳年下の人たちは高校でプログラミング を学習すると聞いたので,大学でも必修にしてくれたらいいのにと思っていた。
授業での説明や請義 ノートの内容がとても分かりやすかったので,プログラミング初心者だったが,とても理解しやすかった。
授業はわかりやすく,最初はプログラミングに興味がないものの,とりあえずとっておこうという気持ちではじめた私でも,楽しく学ぶことがてきた。
ビデオにとってくださっているのがなにより有難い。自分のペースでできるのがよい。また,宿題やエクササイズなど練習できるのもよかった。
初めの方こそ少しつまらないと感じてしまったが,回を重ねるにつれてコードや内容が複雑になっていくと同時に理解できたときの達成感をとても感じれて,どんどんプログラミングが楽しいと感じるようになった。また,最終国のグラフの書き方は特に,今後も役に立つと思った。これからも学んだことを役立てていきたい。
第7回目の授楽が1番おもしろいと感じました。図をプログラミングを使って表せることを知り,また,色やグラフの太さなどを調節することができるのはとても興時深いと感じました。この授業は理系野のような授業ではあるが,とてもいと思ったので来年も開講してほしいと思う。
プログラミング入門の授業を受けて,受ける前はプログラミングに興味はなかったが,受けてみるととても興味深い分野であると思いました。
非常にわかりやすい講議で,コンビュータに疎い私でも,少しはプログラミングについて理解でき,興味もわいた。
授業を受けてある程度理解すると,パイソンだけでない多くのプログラミングに共通する考え方を学べたということが分かり,受けてよかったと今は感じている。
具体例などを入れて授業をしてくれたので,とてもわかりやすかったです。
初めてのプログラミングで分からないことだらけでしたが,先生の説明がとても分かりやすく,プログラミングの基本的な操作を理解することができました。
初心者の授業で,満習が組み込まれている仕組みは自分にあっていて,とても楽しい授業の一つだった。
月,火5限のデータサイエンス基礎演習・概論よりわかりやすく楽しかったです。
2022度第3クォーター(履修登録者159名)
授業ノートが分かりやすく助かりました。
プログラミングはまったく触れたことがない分野だったため,将来に役立ちそうという理由で受講したはいいものの,理解できるか不安だった。しかし説明も丁寧で授業ビデオも残して下さったので,おいていかれることがなく,授業を受けられたと感じた。
プログラミンの入門として,初歩的なところから教わることができて良かった。授業内の例題・宿題・練習問題と,実践の場が多くあったのも良かった。
Pythonをほとんど知らない状態でも,しっかりと学ぶことができ,別授業であるが『データサイエンスPBL演習A』という授業では,学んだことを活かしてコードを読み書きすることができた。
講義のビデオを残してくださったり,練習問題と解答を用意してくださったり,復習の環境が整っているのは,学生によりそったありがたい姿勢を感じました。
この授業を受け,プログラミングへの興味が深まりました。
プログラミングというものを知るとても良い機会になった。
入門としてとても良いと思った。
非常にタメになる授業であり情報化社会の中で活きる知識だと感じた。
プログラミングに触れるのは初めてだったが,ていねいな説明で分かりやすかった。
将来に必要なスキルだと思うので学べて良かった。
練習問題がしっかりあったので,実践練習ができた。宿題も合わせてすることで,定着につながったと思う。
分からないことができるようになっていく感覚がとても楽しかったです。
高校まで少し習っていたプログラミングを詳しく学べた。今後参考になりそうなことが多くて良い学びとなった。
本サイトで使うPythonとパッケージのバージョン#
import gapminder, matplotlib, numpy, pandas, scipy
from platform import python_version
packages = ['Python', 'gapminder', 'matplotlib', 'numpy','pandas', 'scipy']
versions = [python_version(), gapminder.__version__, matplotlib.__version__, numpy.__version__, pandas.__version__, scipy.__version__]
for pack, ver in zip(packages, versions):
print(f'{pack:14}{ver}')
Python 3.12.5
gapminder 0.1
matplotlib 3.9.2
numpy 1.26.4
pandas 2.2.2
scipy 1.14.0
Economists(経済学を勉強する人も含めて(?))と付き合わない方が良い21+\(\alpha\)の理由
for an interactive Jupyter Notebook session with empty code cells.