べき法則と対数法則
心理物理学においては、感覚の強さを表す関数として対数関数(対数法則)とべき関数(べき法則)がよく知られている。べき関数は、対数関数が不適切であるとして、Stevensにより提案された。しかし、対数関数を取り上げる言説が、現在でも健在である。
小早川達「こころの測り方:こころで捉える味覚と臭覚」(心理学ワールド、Jan.2026, pp.36-37)の図1に塩水の濃度と神経活動のグラフが掲載されている。横軸に対数値をとったグラフがほぼ直線であることから、「濃度の対数値に対して、線形に活動量が増加している」(p.36)と書かれている。べき法則については何も書かれていない。心理物理学の立場からは、べき関数はどのようであるのかも検討される必要があると考え、調べてみた。
対数関数は、濃度の対数値と活動量が線形であると書かれているので、次のように設定する。
![]()
べき関数は、次のものを用いる(Gescheider, 1997)。
![]()
式(1)と式(2)をデータに当てはめて、Figure 1の結果を得た。プログラムは、リスト1に示したものである。

Figure 1
読み込んだデータ値は、青色の小円で表示した。
赤色の直線は、対数法則(1)のグラフである。横軸を対数値に取ったとき、データがほぼ直線上に並んでいることを表している。しかし、このことはべき法則が成立っていないことを意味してはいない。
緑色の曲線は、べき法則(2)の曲線である。対数法則(1)より、べき法則(2)の方がデータによりよく当てはまっている。
小早川(2026)の図1のデータは、対数法則だけを見れば対数法則がよいように見えるが、べき法則をも考えれば、べき法則の方がよりよく当てはまっていると言えるものである。
まとめ
物理量の対数値を座標軸にとることは、よく行われる。デシベル値も対数値である。対数値を採用すると、広い範囲の物理量が扱いやすくなる。
対数値を座標軸にとったとき、得られたグラフの解釈には注意が必要である。対数値を座標軸とするグラフで簡明な関係が得られ、それが定説とは異なるものであるとき、定説ではどのようなグラフになるのかという検討も必要である。
参考文献
Gescheider, G. A. (1997). Psychophysics: The fundamentals, Third edition. Mahwah: Lawrence Erlbaum Associations, Publishers.
小早川達(2026)「こころの測り方:こころを捉える味覚と臭覚」心理学ワールド、Jan.2026, pp.36-37
岡本安晴(2014)「心理学データ分析と測定」、勁草書房
岡本安晴(2025)「感覚・知覚測定法」 和氣典二・重野純・村上郁也(編)感覚・知覚心理学ハンドブック 第三版(第2章)、誠信書房
Stevens, S. S. (1959). Review of L. L.
Thurstone: The measurement of values. Contemporary Psychology, 4,
388-389.
Stevens, S. S. (1966). A metric for social
consensus. Science, 151, 530-541.
Stevens, S. S. (1975). Psychophysics: Introduction to its perceptual, neural, and social prospects. New York: Wiley.
リスト1 スクリプトファイルはsample.zipにまとめた。
import numpy
as np
import matplotlib.pyplot
as plt
import scipy.optimize
as so
"""
小早川達(2026)「こころで捉える味覚と臭覚」, pp.36-37.
図1からのデータ値の読み取り
"""
saline = [30, 100, 300, 1000]
neural = [14.3, 24.5, 31.0, 41.2]
plt.plot(np.log(saline), neural, 'o',
label='Data')
# データのプロット
plt.xlabel('Salt')
plt.ylabel('Neural Activity')
plt.xticks(np.log(saline), saline)
class F_Log():
"""
対数法則用クラス
"""
def __init__(self,
saline, neural):
self.saline = saline
self.neural = neural
def f(self, ab):
v =
0.0
for i in range(4):
v += (self.neural[i]
- (ab[0] + ab[1] * np.log(self.saline[i]))) ** 2
return v
f_log = F_Log(saline,
neural)
x0 = [10.0, 1.0]
results = so.minimize(f_log.f, x0, method='Nelder-Mead') # 対数法則の係数
print(results)
a = results.x[0]
b = results.x[1]
plt.plot([np.log(30), np.log(1000)],
[a + b*np.log(30), a + b*np.log(1000)],
label=f"a+b*log(x): a={a:.3f},
b={b:.3f}")
class F_Power():
"""
べき法則用クラス
"""
def __init__(self,
saline, neural):
self.saline = saline
self.neural = neural
def f(self, abc):
c =
30 - abc[2]**2
v =
0.0
for i in range(4):
v += (self.neural[i]
- (abc[0] * ((saline[i]-c)**abc[1]))) ** 2
return v
f_power = F_Power(saline,
neural)
x0 = [1.0, 0.3, 0.0]
results_pwr = so.minimize(f_power.f, x0, method='Nelder-Mead') # べき法則の係数
print(results_pwr)
ap = results_pwr.x[0]
bp = results_pwr.x[1]
cp = 30 - results_pwr.x[2]**2
print('ap =', ap, ' bp =', bp, ' cp =', cp)
def est_pwr(x):
"""
べき法則の関数
"""
return ap * ((x - cp)**bp)
x_coord = np.linspace(np.log(30),
np.log(1000), 1000)
y_coord = est_pwr(np.exp(x_coord))
# べき法則のグラフ値
plt.plot(x_coord, y_coord, label=f"a*((x-c)**b):
a={ap:.3f}, b={bp:.3f}, c={cp:.3f}")
plt.legend()
plt.show()