対数と桁|関数・指数・対数・総和

このページはプロモーション(広告)を含みます。

関数・指数・対数・総和(初級・読む24分+演習30分)

この授業のゴール

仕事でどう使うか

対数は「掛け算を足し算に変える」「巨大な数を扱いやすい大きさにする」道具です。

路線 この授業の使いどころ
DS(データサイエンティスト) 売上や閲覧数のような右に裾が長い量を対数変換して分布を見やすくする。成長率の比較に対数差を使う
ML(機械学習エンジニア) 対数損失(log loss)、交差エントロピー、対数尤度。確率の積を対数の和に変えて、アンダーフロー(小さすぎる値が0に潰れること)を避ける
DX(DX推進・AI企画) 「何年で2倍になるか」「何倍に増えたか」の試算。グラフの対数軸を読んで、伸びの大きさを誤解しないようにする
RS(研究者) 指数関数的な現象の傾きを対数軸で直線にして推定する。pH、デシベルのような対数尺度の理解

実務でよく出る失敗は、底の取り違えと0以下への対数です。この授業で、その2つを検証できるようにします。

前提

次の知識を使います。不安があれば戻ってください。

この授業では電卓の log と ln キー、またはPythonの math.log を使います。

身近な状況:何回2倍にすれば1000人になるか

SNSのフォロワーが100人で、毎週2倍になるとします。1000人を超えるのは何週目でしょうか。

週 フォロワー数
0 100
1 200
2 400
3 800
4 1600

3週では800人で足りず、4週で1600人です。表を作れば分かりますが、「100万人になるのは?」と聞かれると、表を延々と続けることになります。

式で書くと、$100\times2^n\ge1000$、つまり $2^n\ge10$ を満たす最小の $n$ を探す問題です。$2^3=8$、$2^4=16$ なので、$n$ は3と4の間にあり、整数で言えば4週目です。この「$2^n=10$ となる $n$ は何か」という問いに、きちんとした記号を与えたものが対数です。

直感的な説明:対数は「何回掛けたか」を数える

指数は「同じ数を $n$ 回掛ける」、対数はその逆で「何回掛ければその値になるか」を答えます。

10を底にした対数は、0の個数に近い値です(1000なら0が3個並ぶ)。つまり、$\log_{10}$ は桁数を測るものさしです。

注意:対数は「割り算の結果」ではありません。$\log_2 8$ を「8÷2」と読んではいけません。「2を何乗すると8か」と読みます。

正確な定義:定義域・底・基本公式

定義:$b>0$ かつ $b\ne1$、$x>0$ のとき、

$$y=\log_b x \iff b^y=x$$

です。$b$ を底、$x$ を真数と呼びます。$y$ は指数(単位なし)です。

定義域の理由:

よく使う底:

記号 底 主な使われ方
$\log_{10}x$(常用対数) 10 桁数、pH、デシベル
$\log_2 x$ 2 情報量(ビット)、2倍の回数
$\ln x$(自然対数) $e\approx2.71828$ 微分積分、統計、機械学習

基本公式($x,y>0$、$k$ は実数):

公式 数値例
$\log_b(xy)=\log_b x+\log_b y$ $\log_{10}(100\times1000)=2+3=5$
$\log_b(x/y)=\log_b x-\log_b y$ $\log_2(32/4)=5-2=3$
$\log_b(x^k)=k\log_b x$ $\log_2(8^2)=2\times3=6$
$\log_b b=1$、$\log_b1=0$ $\log_5 5=1$、$\log_{10}1=0$
底の変換 $\log_b x=\dfrac{\ln x}{\ln b}$ $\log_2 8=\ln8/\ln2=2.0794/0.6931=3$

桁数:正の整数 $N$ の10進法での桁数は $\lfloor\log_{10}N\rfloor+1$ です。$\lfloor\ \rfloor$ は小数を切り捨てる記号です。$N=12345$ では $\log_{10}N\approx4.0915$、切り捨てて4、足して5桁。

重要な値:$\log_{10}2\approx0.30103$、$\ln2\approx0.693147$、$\ln10\approx2.302585$。

注意(Python):math.log(x) は自然対数です。底10は math.log10(x)、底2は math.log2(x)、任意の底は math.log(x, b) と書きます。numpy.log も自然対数です。

import math
print(math.log(8, 2))      # 底2: 3.0
print(math.log10(1000))    # 底10: 3.0
print(math.log(math.e))    # 自然対数: 1.0
print(math.log(100))       # 自然対数: 約4.605。2ではない

最後の行が 2.0 ではなく約4.605になる点が、底の取り違えの典型です。

段階付き例題:桁数と倍増期間を求める

例題1:桁数。$2^{100}$ は何桁か。

例題2:倍増期間。年率7%で増える資産は何年で2倍になるか。

import math
print(math.floor(100 * math.log10(2)) + 1)          # 31
print(math.log(2) / math.log(1.07))                  # 約10.245
print(1.07 ** (math.log(2) / math.log(1.07)))        # 2.0 に戻る

例題3:定義域の確認。$\log_{10}(x-3)$ が定義できる $x$ の範囲は、真数 $x-3>0$ より $x>3$ です。$x=3$ のとき真数が0、$x=2$ のとき−1で、どちらも定義できません。

操作して理解する:底を変え、定義外を入れてみる

同じ数について、底を変えて値がどう変わるか確かめます。底の変換公式の確認にもなります。

import math
x = 1000
for b in [2, 10, math.e]:
    print("底", round(b, 3), "log =", round(math.log(x, b), 4))
print("底の変換 ln(x)/ln(b):", round(math.log(x) / math.log(2), 4))

次に、定義域の外を入れるとどうなるかを確認します。

import math
import numpy as np
try:
    print(math.log(0))
except ValueError as e:
    print("math.log(0) は ValueError:", e)
print(np.log(np.array([1.0, 0.0, -1.0])))

math.log(0) は例外(エラー)になります。numpy では 0 は -inf(負の無限大)、−1 は nan(not a number:数値ではない)が返り、静かに続行するため、後の集計に紛れ込みます。

自分で試す問い:(1) x を 1 にしたら全部の底で 0 になるか。(2) 売上が 0 の行を含む列に np.log をかけるとどうなるか。(3) np.log1p(x)($\ln(1+x)$)なら 0 を安全に扱えるか。答え:(1) はい($\log_b1=0$)。(2) その行が -inf になり、平均もすべて -inf になる。(3) $x=0$ なら $\ln1=0$ で安全。ただし「0」と「1」の差が小さい量を区別する意味が変わるので、使う理由を記録しておく。

発展:なぜ自然対数 e か、対数尤度への接続

自然対数の底 $e=2.71828\cdots$ は、$(1+1/n)^n$ を $n$ を大きくしたときの極限です。連続的に複利をかけたときの倍率が $e^{rt}$ で、微分すると $e^x$ が自分自身になる(「極限と連続の直感と定義」(有料版) 以降)ため、数学・統計では自然対数が標準になります。

確率の積とアンダーフロー:独立な確率 $p_1,\dots,p_n$ の積 $\prod p_i$ は、$n$ が大きいと0に近づき、コンピュータで0と区別できなくなります(アンダーフロー)。対数をとると $\sum\ln p_i$(和)になり、安定に計算できます。機械学習の対数尤度(log-likelihood:データが出る確率の対数)は、この考え方です。

ただし、対数は単調増加(入力が増えると出力も増える)なので、最大になる位置は元の値と同じです。この性質はグラフと定義域の検証で小さな例を計算します。

注意:「データを対数変換すれば正規分布になる」は一般には成り立ちません。変換後の分布を確認する必要があります。

よくある失敗

失敗1:0以下の数の対数をとる

import numpy as np
sales = np.array([120.0, 0.0, 85.0])
print(np.log(sales))
print(np.log(sales).mean())

0 は -inf になり、平均も -inf です。「売上0」は欠損ではなく、実際に0という値です。直し方:まず0や負の値の件数を確認する。0を除外する・小さな値を足す(log1p)・別の変換を使うかを、理由とともに決める。黙って 0 を落とすと、対象が変わります。

失敗2:log(a+b) を log a + log b と計算する

公式は積について $\log(xy)=\log x+\log y$ であって、和については成り立ちません。

import math
a, b = 10, 90
print(math.log10(a + b))             # 2.0
print(math.log10(a) + math.log10(b)) # 約2.954
print(math.log10(a * b))             # 約2.954 (積なら一致)

左は2.0、右は約2.954で一致しません。直し方:「積→和」「累乗→係数」の公式だけを使い、和の対数には使わない。

失敗3:底を無説明で切り替える

math.log(100) を「2」と期待して、約4.605が出る例です。

import math
print(math.log(100))        # 自然対数 約4.605
print(math.log10(100))      # 常用対数 2.0
print(math.log(100, 10))    # 2.0

自然対数で出した値と常用対数で出した値を混ぜて比較すると、約2.3026倍($\ln10$ 倍)ずれます。直し方:コードにも資料にも、使った底を明記する(ln、log10 と書き分ける)。比較は同じ底の値どうしだけで行う。

まとめ

用語

対数(logarithm)

b^y=x となる指数 y を log_b x と書く。

真数(argument of a logarithm)

log_b x の x。実数の範囲では正でなければならない。

自然対数(natural logarithm)

底が e≈2.71828 の対数。ln x と書く。

常用対数(common logarithm)

底が10の対数。桁数やデシベルに使う。

よくある質問

なぜ対数が必要なのですか?

掛け算を足し算に変え、極端に大きい・小さい数を扱いやすくするためです。また「何回掛ければその値になるか」という問い(倍増期間など)は、対数でしか直接答えられません。

底は何を選べばよいですか?

目的で選びます。桁数は10、情報量や2倍の回数は2、解析・統計は自然対数が標準です。底が違っても値は定数倍の違いだけです。大事なのは、資料に底を明記して統一することです。

対数は負になってよいのですか?

はい。真数が1未満の正の数なら負になります($\log_{10}0.001=-3$)。真数が負になることとは別の話で、そちらは定義できません。

売上が0の行があるとき、対数変換はどうしますか?

まず0の件数と意味(本当に0か、未入力か)を確認します。log1p を使う、0を除いて対象を限定する、別の変換を使うなどの選択があり、どれを選んだかを分析メモに残します。黙って落とさないのが原則です。

対数をとると何が変わりますか、変わらないことは何ですか?

大小関係は変わりません(単調増加)。差の意味が「比」に変わります。対数の差は倍率の対数なので、10と20の差(2倍)が、100と200の差(同じ2倍)と同じ幅で並びます。

$\log$ とだけ書いてあるとき、底は何ですか?

分野で違います。数学・統計・情報科学の多くは自然対数、工学・化学は常用対数のことが多いです。判断できないときは確認し、自分が書く資料では必ず底を示します。

確認問題

問1 $\log_2 8$ の意味として正しいものはどれか。

  1. ① 8を何乗すると2になるか
  2. ② 2×8=16
  3. ③ 8÷2=4
  4. ④ 2を何乗すると8になるか、つまり3
解答と解説

正解:④

$\log_2 8=y\iff 2^y=8$。答えは3です。割り算ではなく「何乗か」を答えます。

問2 実数の範囲で $\log_{10}x$ が定義できる $x$ の条件は。

  1. ① 任意の実数
  2. ② $x\ge0$
  3. ③ $x>0$
  4. ④ $x\ne1$
解答と解説

正解:③

10のどんな累乗も正なので、真数は正である必要があります。0も負の数も定義できません。

問3 次のうち、公式として正しいものはどれか。

  1. ① $\log(ab)=\log a+\log b$($a,b>0$)
  2. ② $\log(a-b)=\log a/\log b$
  3. ③ $\log(ab)=\log a\times\log b$
  4. ④ $\log(a+b)=\log a+\log b$
解答と解説

正解:①

対数は積を和に変えます。和の対数を分解する公式はありません。

問4 Pythonで import math した後、math.log(100) の値に最も近いのはどれか。

  1. ① 2.0
  2. ② 4.605
  3. ③ 10.0
  4. ④ 100.0
解答と解説

正解:②

math.log(x) は自然対数 $\ln x$ です。$\ln100=2\ln10\approx4.605$。底10の2.0は math.log10(100) です。

問5 123456(6桁)の桁数を式で求める方法として正しいのは。

  1. ① $\log_2N$ を四捨五入
  2. ② $\log_{10}N$ をそのまま使う
  3. ③ $\lfloor\log_{10}N\rfloor+1$
  4. ④ $\lfloor\ln N\rfloor+1$
解答と解説

正解:③

$\log_{10}123456\approx5.09$、切り捨てて5、+1で6桁。自然対数では桁数になりません。

問6 年率5%の複利で2倍になる期間を $n$ とする。正しい式は。

  1. ① $n=\ln2\times\ln1.05$
  2. ② $n=2\times1.05$
  3. ③ $n=2/1.05$
  4. ④ $n=\ln2/\ln1.05$
解答と解説

正解:④

$1.05^n=2$ の両辺に $\ln$ をとると $n\ln1.05=\ln2$ です。

次に学ぶこと

次は 総和と総乗の記号 で、たくさんの値を足す記号 Σ と掛ける記号 Π を学びます。対数は積を和に変えるので、L04・L06 の対数尤度につながります。戻るなら 指数と増減率(指数)。

この授業の確認問題だけで習得とはしません。MA01 の総合テストと自力課題で判定します。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い