1. はじめに
データ分析や機械学習の前処理で頻繁に登場するのが「対数変換」です。本記事では、PythonのNumPyライブラリを使って、対数変換を行う方法について詳しく解説します。
「Python|対数変換する:numpy.log(), numpy.log10()」というテーマのもと、numpy.log()
とnumpy.log10()
の使い方や違い、実務での活用方法、注意点までを網羅的に解説します。
この記事を読むことで、
- 自然対数と常用対数の違い
numpy.log()
とnumpy.log10()
の使い分け- 実際のコード例とその出力結果
- エラーを避けるためのポイント
などが理解できるようになります。
2. NumPyで対数変換を行う基本構文と使い方
2-1. 対数変換とは?
対数変換(log transformation)とは、データのスケールを縮小するための処理で、特に右に長い分布(右裾の広い分布)を正規分布に近づける際によく使われます。
Pythonでは、NumPyライブラリのlog()
関数とlog10()
関数を用いることで、簡単に対数変換を行うことができます。
2-2. numpy.log():自然対数の計算
numpy.log()
は、ネイピア数 e ≒ 2.718
を底とする「自然対数(ln)」を計算します。
import numpy as np
# 自然対数の計算
data = np.array([1, np.e, np.e**2])
log_result = np.log(data)
print(log_result)
実行結果:
[0. 1. 2.]
このように、e
のn乗に対してnumpy.log()
を使うと、そのnが返されます。
2-3. numpy.log10():常用対数の計算
numpy.log10()
は、底10の対数(常用対数)を求めます。スケールが大きく桁数が多いデータを扱う場面でよく使用されます。
import numpy as np
# 常用対数の計算
data = np.array([1, 10, 100, 1000])
log10_result = np.log10(data)
print(log10_result)
実行結果:
[0. 1. 2. 3.]
このように、10のn乗に対してnumpy.log10()
を使うと、nが得られます。
3. よくある使い方・応用例
3-1. データのスケーリングとしての活用
例えば、収入やアクセス数など、スケールが大きいデータに対して、対数変換を施すことで、分布が整い、機械学習モデルの性能が向上する場合があります。
import numpy as np
import matplotlib.pyplot as plt
# もとのデータ
x = np.array([10, 100, 1000, 10000, 100000])
# 対数変換
log_x = np.log10(x)
# グラフで可視化
plt.plot(x, label="original")
plt.plot(log_x, label="log10 transformed")
plt.legend()
plt.show()
このように、視覚的にもデータの扱いやすさが向上します。
3-2. データフレームへの適用(pandasとの併用)
実務では、pandasのDataFrameと組み合わせて使用するケースが多くあります。
import pandas as pd
import numpy as np
# データフレームを作成
df = pd.DataFrame({
'売上': [100, 1000, 10000, 100000]
})
# 対数変換(自然対数と常用対数)
df['売上_log'] = np.log(df['売上'])
df['売上_log10'] = np.log10(df['売上'])
print(df)
実行結果:
売上 売上_log 売上_log10
0 100 4.605170 2.000000
1 1000 6.907755 3.000000
2 10000 9.210340 4.000000
3 100000 11.512925 5.000000
4. 注意点・エラー対策
4-1. 0や負の数に注意
0や負の値を対数変換しようとするとエラーやNaNになります。事前にデータをフィルタリングするか、np.where()
などを用いて対処しましょう。
import numpy as np
data = np.array([0, -10, 1, 10])
# 負や0の値を除外
valid_data = data[data > 0]
log_result = np.log10(valid_data)
print(log_result)
実行結果:
[0. 1.]
安全に処理するためには、data > 0
などの条件フィルタが必須です。
4-2. log(0)は「-inf」になる
numpy.log(0)
を実行すると、エラーにはならず「-inf(負の無限大)」が返されますが、後続処理に支障をきたす可能性があるため注意が必要です。
import numpy as np
print(np.log(0)) # warningが出るが実行可能
実行結果:
-inf
5. まとめ
本記事では、「Python|対数変換する:numpy.log(), numpy.log10()」というテーマで、NumPyによる自然対数と常用対数の扱い方について学びました。
np.log()
は自然対数(底e)np.log10()
は常用対数(底10)- 対数変換は機械学習や統計解析でよく使われる
- 0や負の数に対する処理には注意が必要
実務では「売上」「アクセス数」「人口」などスケールが大きな数値データの変換や可視化にとても有効です。
学習のコツとしては、まず小さな配列で挙動を確認し、次第にデータフレームや可視化へと応用していくのがおすすめです。
ぜひ自分のプロジェクトや分析業務で活用してみてください。