Relanoteーノートの関係を可視化

Relanoteは、メモツール

数あるメモツールに新しいものが参入してきた。 特徴は、メモ間の関係を図に表してくれること。 こんな感じ

メモをリスト化したり、相互リンクする機能は標準装備といってもよいが、可視化までやってくれるツールはなかなかない。

え?相互リンクできないツール使ってる?それならいますぐ、Notionなど、相互リンクができるツールを使った方がいい。 スマホアプリもあるので、日常のメモは全部これでまかなえる。

スマホで使わないなら、Scrapboxがいい。こちらは、メモをタイル型に並べる見せ方など、わかりやすい。

でも、ノート同士がどんな関係なのかな?的なことを図解したければ、Relanoteだ。 まだできたばかりで、ExportやImportが実装されていないので、今後とても便利になる可能性があるアイデアだ。でも、Exportで、関係図からWord文書などに出力できたら便利だ。 もちろん、Markdownも期待している。

A note-taking tool to help you connect the dots. (出所:「Relanote」、https://relanote.com/?ref=producthunt

続きを読む

経済学のグラフを描く、その3:交点に記号をつける

交点を自動で計算し、記号をつける

だいたい、経済学で必要な曲線は自由に書けるようになってきた。 あとは位相なんかで使う陰関数だけど、僕は使うことない。必要な方はこちらあたりを参照して、countourというコマンドの使いかたを覚えればよい。

さて、次は交点に記号をつける。

交点に記号がついていると、

「二つの線の交点のうち、点Aは低い方で、点Bは高い方です。点Aより左側では利潤がマイナスで右側ではプラスです。ただ、Bを越えると再びマイナスになりますね。・・・」

といった感じで説明ができて、とても分かりやすい。

交点に記号がついていないと、

「この線とこの線の交じわる点、ここ、が均衡になります。さらに無差別曲線と交じわる点は 二つあって、左側が。。。」

という感じで分からなくもないけど、だんだん混乱してきだします。講義なら、ポインタで指すこともできるけれど、文章での表現なら非常にまだるっこしい。

そんなわけで、きちんと記号をつけておくことにする。

図に記号を書くときの位置決めは、PowerPointなどを使って、手作業だと一発で決まる。 が、曲線をちょっと変更すると、すべてがずれてしまって、またやりなおしだ。

そこで、自動で記号の位置を計算して記入する。

自動での記号のつけかたは、以前やった方針でだいたい大丈夫だと思っていた。

y1とy2の上下関係が変わったら、その点が交点だと考えることにする。
(出所:「Matplotlibで交点にラベルを表示する - ときどきエコ」、https://blog.ecofirm.com/post/pythongraphintersections200429/  )

が、問題があった。 この方法では、上下関係が変わらなければ、交点と判定しない。 つまり、無差別曲線と予算線が接するばあいは、交点とみなしてくれない。

若干コードが複雑になるけれど、ここをちゃんとやっておけば、あとで楽になる。

方針

コードの後半は前回の「経済学のグラフを書く、その2:無差別曲線と予算線」と同じだ。 ただし、draw_intersection(ax, x1, y1, y2, figlabels)という行が増えている。 この行で交点の座標を記入する。 もちろん、この行だけでは座標の記入はできなくて、この行が呼びだすdraw_intersectionという関数が実際の処理を担当する。

交点かどうかの判定は、if_intersection(y1, y2, i)で行なう。

判定基準は次の3つだ。

  1. y座標が同じ
  2. y座標の上下が入れ変わる
  3. y座標が近づいていたが、また離れる。その一番近い距離が基準以下。

1と2は以前と同じだ。 今回追加したのは3の条件だ。 判定のために二つ前までのy座標を使う。

x=i点のy座標の差をdy[i]とするとき、2つ前dy[i-2]から1つ前dy[i-1]の差と1つ前dy[i-1]から現時点dy[i]の差の符号が逆転しているかどうかを判定する。

このとき、精度の関係で、dy[i]=0とはならないので、dy[i]が一定の基準以下であるばあいに、交点とする。 一定の基準というのは、だいたい試行錯誤して決めればいいけれど、0.001から0.0001ぐらいでよいと思う。 そもそも、x座標を0.01刻み以上ぐらいで作っている(useedによって異なる)ので、あまり小さくしても仕方がない。

経済学のグラフを描く、その2:無差別曲線と予算線

Matplotlibで経済学のグラフを描くとりくみ

ぼちぼち勉強を進めている。 目標はマニュアルや検索なしで経済学のグラフならささっと描けるようになることだ。

今はフリーハンドの方が楽だけれど、PowerPointよりは早くなってきた。

しばらく続けて、ブログの定番ネタにしようと思っていたけれど、意外と簡単だった。

無差別曲線と予算線

今日は無差別曲線と予算線を描く。 たぶんグラフの描画だから、書くではなく描くなんだけど、つい間違える。 間違いを見つけたら、指摘してもらえるとありがたい。

さて、無差別曲線だ。 あれはどうやって描いているのだろうか?

PowerPointでは、ベジェ曲線を使うけれど、意外ときれいに描くのは難しい。

少し前のテキストだと、ぎざぎざで直線をつなげました!がんばってます!的なものもあったけど、今はあまり見ない。 その変わり、少しだけいびつな曲線というのはよくみる。 授業やる教員のPowerPointでそうなってるのも多そうだ。

さて、一番シンプルな無差別曲線と予算制約はこれだ。 そして、この二本の曲線が接するようになっている。

U=x_1x_2
Y = p_1x_1+p_2x_2

授業でみた曲線はちゃんと接してただろうか? これも意外と難しい。

今日はこれに挑戦する。

なんも考えずに書くとこうなる。

<img src="https://blog.ecofirm.com/images/myfig0512-2.png" alt="" width="100%"/>

この図は、両者が接するように、ちょっとずつ動かしながら手作業で接するように描いている。 PowerPointでやるのと手間は大して変わらない。 ただ、無差別曲線はきれいだ。

images/myfig0512.png

もうちょっと凝りたい

一度描くだけなら、これでよいのだが、もう少し予算線が傾いているほうがいった要望もある。 そのたびに、手作業はめんどうだ!

そう考えて、一般解を得ることにした。初期値として、u,px, pyを与えれば、ある無差別曲線とそれに接する予算線を引いてくれる。 ついでに、x軸とy軸もグラフがうまく表示できる範囲に調整してくれる。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('Agg')

useed = 9
px = 16
py = 4

u = py/px*useed**2
m = 2*px*(py/px*u)**0.5
x1 = np.linspace(0.1,m/px*1.2,500)
y1 = u/x1
y2 = m/py-px/py*x1

px3 = 4

m3 = 2*px3*(py/px3*u)**0.5
y3 = m3/py-px3/py*x1

myfig = plt.figure()
ax = myfig.add_subplot(111, xlabel='X1', ylabel='X2', xlim=(0,m/px*1.2),ylim=(0,m/py*1.2))

ax.set_xticks(ticks=[0])
ax.set_yticks(ticks=[])
ax.grid(color='gray')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.plot(x1, y1)
ax.plot(x1, y2,color='orange')
ax.plot(x1,y3, color='red')

myfig.savefig('images/myfig0513.png')
plt.close(myfig)
return 'images/myfig0513.png'

images/myfig0513.png

DenmarkReopen200511

デンマークは11日から大型店舗等を再開する。 コロナでシャットダウンした経済活動の再開がはじまる。

ここから、感染のコントロールが順調なら、順次経済活動が復活していく。 デンマークはコロナ前まで経済がとても好調で人手不足が続いていた。それがどこまで回復するのか、未知数だ。

学校も10年生(中3相当)までは18日から再開される。 また、18日からはレストランやカフェも再開する。

ソーシャルディスタンスをキープしつつ、10名以上の集会は禁止のままだ。

感染のコントロールが順調なら、と書いたが、これは新規感染者がいなければとかそういうことではない。 病院がコロナの患者のケアをしつつ、医療崩壊しない水準というのを念頭に置いているようだ。

デンマークでは新規感染者は、ゼロどころかまだ増える。 先日のニュースでは、無作為に抽出した国民に対してコロナの検査を実施する計画もあるそうだ。 一定数の患者をあぶりだしながら、医療体制を維持できるように国全体でコントロールしていく方針だ。

コロナはゼロにはならないし、治療が確立するまで長期間かかる。 だからそのための体制を整えるというのが、デンマーク政府の判断のようだ。

いつ治療が確立するかどうかは不透明だ。 感染が自然に収まるかどうかも保証できないし、そうなっても体制がなければ第二波には対応できない。 そんなことを考えてのことだと思う。

さて、日本の体制はどうなんだろうか。 僕のSNSはどちらかといえば、普段から政府に批判的な人のものが多いので、実際のところは見えにくい。 エビデンスをもとに、日本政府の体制が十分といって安心させてくれる人がいるといい。 けれども、なんとなく政府擁護の論調は、「政府が決めたんだから、いいに決まってるだろ」「現場はがんばってる」とか「絆があれば乗り切れる」という精神論的なものが多い。

続きを読む

Org BabelでPythonのTestを行なう

Org-babelを使いつつ、doctestを使って、Pythonコードをテストする。

また長い見出しになってしまった。 ややこしいことをやろうとするから、こうなる。

ここ最近、Org-babelを使ってコードを書いている。 かなり可能性がありそうなプラットホームだと感じているので、修行中だ。 もう少し勉強すれば、データ前処理→分析→レポート作成まで、orgのなかで完結できそうだ。

論文も基本的には、Orgで書いてしまおうと思う。 多くのジャーナルはWordで提出だが、図表が別なことが多いので、本文はほとんどテキストのみだ。 Wordで書く理由はどこにもない。

講義のメモやレジュメは以前からOrgで書いている。 図もmatplotlibを勉強してみたところ、思ったより楽にきれいなものが書けそううなので、この際スライドも移行しようと思っている。

さて、こうなると、Orgの世界でほとんどの作業が完結するのだが、一つ気になることがある。 それがテストだ。

研究やちょこっとした作業用にプログラムのコードを書くことがよくある。 そういうコードをしばらくして再利用しようとすると、どこをどう変更してよいか分からなくなってしまったりする。 ちゃんとテストを書いておけばと思うのだが、あとの祭りだ。

そこで、今回いくつか検索して、参考になる方法を見つけたので、ワークフローをまとめておく。

テストを書くということ

まず、テストというのは、関数を書く際にそれが想定した仕様に合っているか、自動でチェックする仕組みのことだ。 研究では使うことが少ないけれど、やはり書くにこしたことはない。

テストコードやドキュメントを整備することでプログラムの品質が向上することは広く知られています。その有効性は、研究用のプログラムであっても変わりません (出所:「忙しい研究者のためのテストコードとドキュメントの書き方 - Qiita」、https://qiita.com/NaokiHamada/items/0689cd85fb3e1adcda1a

僕もこの意見に全面的に賛成で、ドキュメントは以前から気をつかって書いていた。 が、テストは保守がめんどうで、書いたり書かなかったりだった。 Rに至っては書きかたもよくわからず、書かないままになっている。

今回、分析関係を全面的にPythonに移行することにしたので、ドキュメントとテストをちゃんと整備しつつ開発を進めることにした。

文書の中にコードを入れたい

さて、rmarkdownやJupyterでは、平文とコードを混在させながら分析を進めていける。固まり(チャンク)ごとにコードか平文かを指定しながら、文書を作成していけばよい。 必要に応じて、htmlにもpdfにも出力できる。 ツールを使えば、Wordとして出力も簡単だ。

一方、上記の方法だと、Pythonファイルにテストを書いていくので、Pythonファイルに直接ドキュメントを書く。 このばあいは、コメントとして書くために、出力時の形式がやや限定される。

別にそれでもよいのだが、もう少し前書き的なものや分析も書いておきたいこともある。

特に僕のばあいは、ライブラリを開発したいのではなく、自分の分析の際に必要な下働き的コードをちょこちょこと書くので、関数のドキュメントというよりも、全体の流れをきちんと説明したい。

そういうばあいは、Jupyterなどが選択肢になり、一般的にはテストを諦めざるをえない。

しかし、テストを諦めるかドキュメントを諦めるかの選択肢を迫るのは、上記サイトの意図するところではない。

むしろ、そこをなんとかするソリューションを考えるべきだ。

org-modeを使うとそのややこしい要求がクリアできる。org-babelはrmarkdownと同じようなものだと思えばよい。 どちらがいいのか?というと、ここは好みの問題かなと感じる。 僕は、長く使っているorg-modeを選択した。

org-modeからmarkdownへの変換は簡単なので、今はとりあえずそうというだけで、そこまで深刻な選択ではない。 (ここで、Wordを選択するならば、コードと文書は完全には別となるため、大きな選択だ。)

Matplotlibで経済学の図を描く:需要と供給

一番はじめの図

Matplotlibでさくっと経済学の図が書けたら、楽なはずだ。

PowerPointで図を書いているときに、「ここが塗りたいのに、ずれた!」的なことはよくある。 根性で書いてもよいが、毎回根性が必要となると、萎えてくる。

実は僕自身はけっこう、PowerPointの扱いに慣れていて、図もかなりのスピードで作図できるようになっている。

けれども、出先などでマウスがないときに、タッチパッドで図を書くのは嫌だ。

似たような図なんだけど、ちょっとだけ平行移動したいときは、線の長さが変わるのでけっこうめんどうだ。

などなど、細かなストレスがある。

じゃあ、エクセルは?とも思うのだが、塗りつぶしの手間を考えるとあまり手を出す気はしない。

来年、一冊本を書くことになったので、この際、スクリプトで書けたらいいなあと感じはじめた。 論文の図もきれいなのが、書けるようになるだろうし、なにより推定結果から再現可能な図を作れるようになれば、かなり助かる。

というわけで、この際、作図をマスターすることにした。

作図環境

作図はPython+Matplotlibだ。 中期的にはPython+Plotnineに移行するが、今は標準環境をマスターする。

ちなみに、JavaScpriptを使って動く図を使うような環境も作れるが、僕はそちらにはあまり関心がない。 授業でも図を動かすときは、基本の図を作って、そこにペンで書きこんでいる。

(リアルなペンではなく、スタイラスでパワポ上に線を描画してるだけやけどね)

さて、まずは簡単な図

経済学の基本的な講義でほんとに毎回というぐらい使用するのが、需要と供給のごくシンプルな図。 僕は、どんな説明も最終的には、できるだけこの図に落としこむようにしているので、毎回使う。

https://blog.ecofirm.com/images/econfig001.png

この図は、抽象的な需要と供給なので、横軸と縦軸の目盛りがいらない。 単に右上がりの線と右下がりの線があればよい。

だが、これが意外と難しい。 抽象的に線がひければいいと思っているから、座標はいらないのかな?と感じてしまうと、もうそこから進まない。

Matplotlibのばあい、座標が必要だ。

なので、xを0から100の範囲と定義してその間で線をひくようにしてやる。

そのためには、x=np.linspace(0,100,101)とする。これは、xを0から100の間で定義して、その間を101個に区切るという命令だ。 100個ではなく101個なのは、0もカウントされるからだ。 この命令で、xには、0から100までの整数が格納される。 なお、0から100である必要もなくて、0から20とか0から10でもかまわない。

単純な直線を引くだけなら、ここは別に0と100だけでもいいし、整数でなくてもいいので30とかにしても問題ない。 曲線を書いたり、交点の座標を表示させたりすることを考えるなら、むしろ10000ぐらいにしておいたほうがいいが、まあ、今はどうでもいい。

この程度の作図なら、区切りが多くてもパフォーマンスにはほとんど影響しない。

この基本図でじゃまになるのが、目盛りだ。縦軸と横軸の数字は不要だ。 set_xticksとset_yticksを定義して、X軸の0として原点のみ表示させている。

また、あまり枠のなかに、きつきつに直線が入るのも好みではないので、右側と上に20ずつ余裕をもたせている。

もう一点、周囲の枠は不要で、X軸とY軸の線だけを表示させるために、右と上の線は消している。

ここまででようやく、枠の準備ができた。

次に需給曲線を引く。 これは、y=xとy=100-xを引くだけだ。

これで基本的な需要供給の図は完成だ。

こまごまとした装飾も可能だが、それは次回以降にとりくむ。

Matplotlibで交点にラベルを表示する

やりたいこと

Pythonで図を書くためには、Matplotlibを使う。

講義で使用するための説明図を書くときには、線だけではなくて、交点にラベルをつけたい。

「二つの線の交点のうち、点Aは低い方で、点Bは高い方です。点Aより左側では利潤がマイナスで右側ではプラスです。ただ、Bを越えると再びマイナスになりますね。・・・」

といった感じで説明がしたい。

ストレートな方法は、手動で交点の座標を求めて、直接キャンバスに描画していく方法だ。 でも、それはめんどうだ。 僕がやりたい説明では、実は交点の座標はどうでもよくて、線が交わる場所に名前がついていればよい。

方法

そこで、こんな感じで考えた。

y1とy2の上下関係が変わったら、その点が交点だと考えることにする。 精度はもっとあげられるが、今回のばあいはこれで十分のようだ。

交点が近いと文字がかぶってしまうので、yoffsetを使って、偶数番目のラベルは交点の下に書くようにした。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('Agg')

x = np.linspace(0,12,120)
y1 = [1]*120
y2 = x*(x-2)*(x-10)

l='abcdefgh'
k=0
flg = False

myfig = plt.figure()
ax1 = myfig.add_subplot(111)
ax1.plot(x,y1,'blue')
ax1.plot(x,y2,'green')
for i,xi in enumerate(x):
    if ((y1[i] == y2[i]) or (flg != (y1[i] > y2[i]))):
        yoffset = 10 if k % 2 else -10
        ax1.text(xi, y1[i]+yoffset, '{l}'.format(l=l[k], fontsize=10)
        flg = not flg
        k += 1

ax1.legend(frameon=False, fontsize=10, numpoints=1, loc='lower left')

myfig.savefig('images/fig200429intersection.png')

/images/fig200429intersection.png

org-babelを使うときに、Matplotlibで日本語を含むPDFの図をつくる

課題

org-babeleを使って、Matplotlibで日本語を含むPDFの図をつくるばあい、次の三つの問題にぶつかる

  • 図に日本語を使うと豆腐(ただの四角)になる
  • PDFに出力しようとしても方法がわからない
  • org-babelのオプションがよくわからない

この三つの問題があるので、どんなキーワードで検索したものか悩んだ。 いったいどこが問題なのかも切りわけることができないので、けっこう苦労した。

今回のタイトルは長すぎな感があるけれど、問題の切り分けができていないと、やりたいことってこんな感じになってしまう。 ここから、順次切り分けることで、シンプルなタイトルになっていく。

さて、デンマークでは少しコロナ対策が緩和方向に向かっていて、こどもの学校がはじまっている。 街中にも少し人が増えている。 昨日、用事があって、中心部に行ったのだが、2週間前よりも明らかに人が増えていた。

お天気が続いて、暖かいので半袖の人も目立つ。

次は5月10日以降に第2段の緩和が検討されている。 それに向けて、人々は少し浮かれている気がする。

このまま緩和が続いて、僕も研究室に入れるようになるといいなあと期待している。

図に日本語を使う

まずは、普通のpythonスクリプトで、日本語を含んだ図を使えるようにしよう。

FAQ的な疑問なので、わりと簡単に答えがみつかる。 こちらがいちばんシンプルでわかりやすかった。同サイトの最後の方の説明を参考にして、以下のような設定をする。 これは個別にスクリプト中で指定する方法だ。 実際には、.matplotlibrcで指定しておく方が指定し忘れがなくなるのでおすすめだ。

ただし、いきなり.matplotlibrcに設定をすると、今度はちゃんと.matplotlibを読みにいっているかどうか?という問題がまた出てきて、トラブったときにめんどうだ。 なのでまずは、スクリプトのなかで設定することにした。

前半が設定。後半は、図を作成している。 といっても、X軸とY軸を表示しているだけだけ。

from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 
                               'Yu Gothic',
			       'Meirio',
			       'Takao',
			       'IPAexGothic',
			       'IPAPGothic',
			       'VL PGothic', 
			       'Noto Sans CJK JP',
			       ]
myfig = plt.figure()
axes1 = myfig.add_subplot(111)
axes1.set_xlabel('X軸です')
myfig.show()

PDFで図を作成する

次にこの図をpdfで保存できるようにする。

デンマークの小学校が再開された

今日からデンマークでは小5までと幼稚園が再開された。こどもたちも行った。 僕らもようやく、ちょっと一息だ。

在デンマーク日本大使館の情報によれば、これから少しずつ閉鎖を解除していくようだ。 一ヶ月前に国境も学校もレストラン等も閉鎖したのが功を奏したようだ。重症者は増えていないという。

国境を閉鎖したことで、国外からのコロナ持ちこみが最低限度になった。 大型ショッピングセンターを閉鎖したこと、公共交通機関利用の自粛などで、無秩序な人的接触の発生も最低限にとどめた。

こうなると、接触先を追求できる人間関係を特定しやすくなるし、感染が無秩序に広がることはない。ここまでくると、発生してもいわゆるクラスター対策で対処可能だ。 政府はそう判断したのだろう。

学校が再開されることは、デンマークでコロナが終わったということではない。こどもたちも、基本的に10人までの単位でクラスを臨時に編成して過ごす。 2メートルのSocial Distance(社会的距離)も維持される。 感染が予想以上に広がればまた閉鎖されるだろう。

それでも、周りに友達がいて、笑いあえるのはこどもたちにとってどれだけ救いになることだろうか。

そう考えて、若干のリスクをとりながら、こどもたちの精神面を考慮して、再開に踏みきったデンマーク政府を評価したい。 僕らは、これで感染が広がっても、政府の決断を批判することはしないようにしたい。

続きを読む

文章の書き方(2020年版)

メモ   メモ

資料   資料

Writing a PhD thesis with Org Mode (出所:「Writing a PhD thesis with Org Mode - EMACS-DOCUMENT」、http://blog.lujun9972.win/emacs-document/blog/2018/12/24/writing-a-phd-thesis-with-org-mode/index.html

文章を書くとは

文章を書くことに方法などあるのか?

文章を書く方法というのは、古来いろいろな人が説明してきた。 エッセイの書き方や小説の書き方、小論文の書き方など、検索すればいくらでも出てくる。

谷崎潤一郎の文章読本や本多勝一の日本語の作文技術あたりは定番といえる。

そこに僕がなぜ新たに文章を発表するのか?と考えはじめるとこんな文章を書くのは単なる時間のむだとも思える。

でも、過去の文章の書き方を読んだ人が実際に文章を発表する人になれるのか?というと、それはまた違う。 どうやって文章を書けばいいのかは分かっても、いざ、コンピュータに向かうとぱたっと手が止まってしまう人は多い。

コンピュータの前に紙を手にすべきだ! それはもっともだ。僕も長らくそうしてきた。 でも、今は現代で、さまざまなツールがある。 それを活用しないのはもったいない。

ツールはWordでもよいと思う。 最近のツールはよくできていて、とりあえず使うことは簡単だ。 でも、使いかたを学ばないと、それがほんとうに便利なのかは分からない。 まだなにも学んでいない人は、紙とえんぴつの方が便利だし、エクセルよりも紙と電卓の方が楽なはずだ。

そういうわけで、この一文は、主にツールを使ってどう文章を書くのかに意識を割いて書くことにしている。

自分の手順を作る

どんな文章を書くのか:条件

アウトプット

文章を書く際には、普通、どこに書くのかは決まっている。そういうのがなく、ただ、文章が書きたくなる人というのもいる。 ただ文章を書きたくなる人には3つのタイプがある。ただ書き散らして完成しない人と、書き散らした断片をつなぎ合わせて文章にする人と、適当に書いたものが自然にまとまった文章になる人だ。