「数学の言葉で世界を見たら」をPython で見たら… Vol.6 自然対数
第3話「大きな数だって怖くない」
書籍の著者 大栗博司 先生
書籍「数学の言葉で世界を見たら」第3話「大きな数だって怖くない」の Python写経活動記録 です。
自然対数 $${\log_e}$$ にまつわる3つのお話を Python で動かします。
では書籍を開いて数学の旅に出発です🚀

はじめに
このブログシリーズは、書籍「数学の言葉で世界を見たら」(幻冬舎)で学んだ「数学の楽しさ」を「Python 写経の形式」でご紹介いたします。
【引用表記】
この記事は、出典に記載の書籍に掲載された文章とデータを引用し、適宜、掲載文章・データを改変して書いています。
【出典】
「数学の言葉で世界を見たら」 第3刷、著者 大栗博司、幻冬舎

5 銀行預金、倍になるのに何年かかる?
学びポイント
自然対数 $${\log_e}$$ の驚きの性質を次の3テーマで堪能します。
小さな数 $${\varepsilon}$$ の近似
お金が倍になる金利と年数の関係
恋人選び
この記事で用いるライブラリをインポートします。
## インポート
# 数値計算
import numpy as np
import pandas as pd
# 可視化
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Meiryo' # または import japanize_matplotlib
小さな数「ε」の近似
書籍 p.94には、科学の世界で自然対数 $${\log_e}$$ が使われる理由を先生が明かしています。
小さな数 $${\varepsilon}$$ について次の式が近似的に成り立ちます。
$$
\log_e (1 + \varepsilon) \approx \varepsilon
$$
「$${\varepsilon}$$ を中に含む $${\log_e}$$」が「$${\log_e}$$ の外の $${\varepsilon}$$」と近い、って面白いですね!
近似の様子を Python で見ておきましょう。
$${\varepsilon}$$ が $${10^{-1}}$$ から $${10^{-15}}$$ までの値のときの $${\log_e (1 + \varepsilon)}$$ を計算して、比べます。
### p.94 log_e(1 + ε) ≒ ε
## 計算
# ε の設定
epsilon = np.array([10**(-i) for i in range(1, 16)])
# log_e(1 + ε) の計算
approx = np.log(1 + epsilon)
## データフレーム化
df = pd.DataFrame({'ε': epsilon, 'log(1+ε)': approx})
display(df)【実行結果】
近似してますね~♬

$${1\text{e-}01=10^{-1}}$$ から $${1\text{e-}06=10^{-6}}$$ までは $${\log(1 + \varepsilon)}$$ の指数部が1桁大きくなっています。
1桁繰り上げて、仮数部を $${0.9 \cdots}$$ と読み替えると、近似していることが分かります。
こちらのほうが比べて見やすいかもです。
## おまけ:
for ep, ap in zip(epsilon, approx):
print(f'ε = {ep} \t⇒ log(1 + ε) = {ap}')【実行結果】
うん、近似してます!

$${\varepsilon}$$ と $${\log_e(1 + \varepsilon)}$$ の関係を、一応可視化してみます。
## グラフ表示
# εとlog(1 + ε)のプロット
plt.plot(epsilon, approx)
plt.gca().set_aspect('equal')
# 修飾
plt.xlabel('$\epsilon$', fontsize=12)
plt.ylabel('$\log(1+\epsilon)$', fontsize=12)
plt.grid(lw=0.5, alpha=0.5);【実行結果】
近似しているので直線的な関係になります(ですよね~)。

書籍はこの近似式を資産運用の例で応用しています。

お金が倍になる金利と年数の関係
ファイナンシャル・アドバイザーの「72の法則」から話が始まります。
金利 $${R}$$ % のとき、お金が2倍になる年数 $${n}$$ を $${n=72/R}$$ で求められるという法則です。
金利 $${R}$$ と年数 $${n}$$ で、元利金 $${(1 + R/100)^n}$$ となります。
元利金を自然対数にして、$${\varepsilon}$$ の近似式を用いると
$$
\log_e \left(1 + \cfrac{R}{100} \right)^n \approx n \times \cfrac{R}{100}
$$
の関係が得られます。
$${n=10}$$ 年、$${R=7.2}$$ % でお金が何倍になるか、対数およびその近似がどうなるか、を Python で計算してみます。
### p.95 log(1 + R/100)ⁿ ≒ n × R/100
## 設定
n = 10 # 年数
R = 7.2 # 年利 %単位
# 計算
print(f'{R}% で {n}年')
print('(1 + R/100)ⁿ =', (1 + R/100)**n)
print('log(1 + R/100)ⁿ =', np.log((1 + R/100)**n))
print('近似値 n × R/100 =', n * R/100)【実行結果】
$${7.2}$$ %、$${10}$$ 年で $${2.004}$$ 倍。
対数は $${0.6953}$$、対数の近似は $${0.72}$$ になりました。

$${n}$$ 年で倍になることは $${\log_e 2 = 0.69315 \cdots}$$ と等しいとのことで、金利 $${R}$$ % のときにお金が2倍になる年数は次式で示されます。
$$
n \approx \cfrac{69.315}{R}
$$
この式の計算を Python でなぞってみます。
### p.95 金利R%で2倍になる年数nを計算
# log(2)の計算 ※FPの世界の72, 書籍の69.315 よりも精度の高い値
print('金利R%で2倍になる年数n: R × n = log(2) × 100 =', np.log(2) * 100)【実行結果】
書籍通りになりました。

ファイナンシャル・アドバイザーの法則は $${n=72/R}$$ でしたので、少し相違しています。
書籍 p.96 には5つの金利のケースでお金が倍になる年数と年数×金利を表にしています。
この表を Python で書きます。
## p.96 金利R%で2倍になる年数nを計算
# 金利R%で2倍になる年数nを計算する関数の定義
year4double = lambda R: np.log(2) / np.log(1 + R/100)
# n と n×R の計算
R = np.array([100, 30, 10, 1, 0.1]) # 金利R%の設定
n = year4double(R) # 2倍になる年数nの計算
n_by_R = n * R # n * R ≒ 72 or 69.315 or 69.314718...
# データフレーム化
df = pd.DataFrame({'金利[%]': R, '年数': n, '年数×金利': n_by_R})
df.round(2)【実行結果】
金利が小さくなるにつれて、年数×金利($${n \times R}$$) は書籍の $${69.315}$$ に近づきます。

ファイナンシャル・アドバイザーの「72」は金利 $${10}$$ % 程度の $${n \times R}$$ を示しています。
先生によると、$${72=2^3 \times 3^2}$$ であり、因数が $${2}$$ と $${3}$$ だけなので、お金が2倍になる年数を暗算しやすい、とのこと。
金利 $${R}$$ とお金が2倍になる年数 $${n}$$ の関係を可視化しましょう。
## 金利R%と年数nのプロット
# 金利R%の範囲の設定
R = np.linspace(1, 100, 101)
# 2倍になる年数nの計算
n = year4double(R)
## 描画
plt.plot(R, n)
# 修飾
plt.title('金利 $R$ %で2倍になる年数 $n$', fontsize=14)
plt.xlabel('$R$ [%]', fontsize=12)
plt.ylabel('$n$ [年]', fontsize=12)
plt.grid(lw=0.5, alpha=0.5);【実行結果】
金利 $${R}$$ を $${1}$$ % から $${100}$$ % まで動かしました。
年利 $${20}$$ % くらいあるといいですねぇ…


恋人選び
書籍 p.97 には、ケプラーが活用したと言われる「恋人選び」の法則が紹介されています。
そしてなんと!法則にネイピア数 $${e}$$ が現れています。
恋人候補 $${N}$$ 人を順番に面接するとき、$${m-1}$$ 人までは「流して」、$${m}$$ 番目の人から「本気モード」に切り替えて、気に入った人を選ぶ、という法則です。
大切な $${m}$$ は次の式で求められます。
$$
m = N/e \approx 0.368 \times N
$$
恋人候補が $${10}$$ 人のときの $${m}$$ を試算します。
### p.97 恋人選び関数
# 設定:恋人の候補人数
N = 10
# 関数定義:本気モードを出して選択するm人目の計算関数
m = lambda N: N / np.e
# 計算
print(f'{np.ceil(m(N))}人目以降の候補者を選ぶ(成功確率{1/np.e:.1%})')【実行結果】
本気モードは4人目からがオススメです。
成功確率は $${1/e}$$ になるようです。

候補人数 $${N}$$ を $${1}$$ ~ $${100}$$ のときの $${m}$$ 人目を可視化します。
「何かのとき」の目安にどうぞ!
## N=1~100人の候補者に対する、m人目の可視化
## 設定
# 候補者人数の配列
Ns = np.arange(1, 101)
# 本気モードを出して選択するm人目の計算
ms = m(Ns)
## 描画
# 描画領域の設定
plt.figure(figsize=(6, 6))
# 本気モードに切り替える m人の描画
plt.plot(Ns, ms, color='tab:blue', label='$m$')
# N=N の45度線の描画
plt.plot(Ns, Ns, color='tab:red', ls='--')
# 修飾
plt.xlabel('候補者人数 $N$', fontsize=12)
plt.ylabel('本気モードを出す $m$ 人目', fontsize=12)
plt.grid(lw=0.5, alpha=0.5)
plt.legend();【実行結果】

おわり
シリーズの記事
次の記事
前の記事
目次
ブログの紹介
note で7つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!
1.のんびり統計
統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。
2.実験!たのしいベイズモデリング1&2をPyMC Ver.5で
書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!
3.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で
書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!
4.楽しい写経 ベイズ・Python等
ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀
5.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で
書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。
6.データサイエンスっぽいことを綴る
統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。
7.Python機械学習プログラミング実践記
書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。
最後までお読みいただきまして、ありがとうございました。
いいなと思ったら応援しよう!
応援ありがとうございます。これからもがんばって記事を作成します!