歪度(skewness、わいど)は、分布の「左右の非対称さ」を 1 つの数で表す指標である。平均 が分布の中心、分散 と標準偏差 が広がりを表すのに対して、歪度は「形のバランス」を表す。
- 正の歪度(右に長い尾): 大半の値が小さく、少数の大きな値が裾を伸ばす。
[平均](../mean/) > [中央値](../median/)になる傾向 - 負の歪度(左に長い尾): 大半の値が大きく、少数の小さな値が裾を伸ばす。
平均 < 中央値になる傾向 - 歪度 ≈ 0: 左右対称(正規分布など)
実用上は正の歪度を持つデータが多い。給与・取引金額・アクセス回数・待ち時間・株価のような「下限はあるが上限は無い」量は、構造的に右に裾を引きやすい。
定義と「なぜ 3 乗するか」
代表的な定義は「標準化された 3 次モーメント」である。
skewness = E[((X - mu) / sigma)^3]muは平均、sigmaは標準偏差
3 乗を使うのは、左右の非対称性を符号付きで捉えるためである。差 (X - mu) をそのまま足し合わせると(1 乗)正と負が打ち消し合って常に 0 になる。差を 2 乗すると(分散 になる)符号が消えて広がりだけが残る。差を 3 乗すれば符号が保たれ、かつ大きく離れた値が強調される(差 2 → 8 倍, 差 -2 → -8 倍)。
(X - mu) / sigma のように標準偏差で割って標準化してから 3 乗するのは、無次元量にして単位やスケールに依存しない指標にするためである。これにより異なるデータ間で歪度の値を直接比較できるようになる。
歪度の絶対値の目安は次の通り。
|skewness| < 0.5: ほぼ対称0.5 ≤ |skewness| < 1.0: 中程度の歪み|skewness| ≥ 1.0: 強い歪み(変換を検討する目安)
尖度との対比
歪度と並んで分布の形を測る指標に 尖度(kurtosis) がある。
- 歪度(3 次モーメント): 左右の非対称さ
- 尖度(4 次モーメント): 裾の重さ(中心の尖り方、外れ値の出やすさ)
正規分布の尖度は 3(または 0、定義による)。尖度が高いと「中心が尖って裾が重い」分布になり、外れ値が出やすい性質を持つ。歪度と尖度を組み合わせると、平均・分散だけでは見えない「分布の癖」が定量化できる。
前提・注意
- 外れ値の影響を強く受ける(3 乗するので、極端な値が支配的になりやすい)
- サンプル数が小さいと推定が不安定
- 歪度は「形の傾向」を示すだけで、分布の全体像を代替しない。ヒストグラムや KDE で形を目視するのが先決
- 多峰性(山が複数)の判断はできない
log1p (plus) 変換
log1p 変換は log(1 + x) を適用する変換。右に歪んだ分布(長い右尾)を圧縮し、極端な値の影響を和らげるのが目的である。log(x) は x=0 で定義できないため、0 を含むデータでは扱いにくい。log1p は log(1 + x) を使うことで 0 を含めても安全に変換でき、x が小さいときは log(1 + x) ≈ x となるため、値の歪みを抑えつつ自然にスケールを圧縮できる。
使いどころ
- 取引金額やアクセス回数など、右に長い分布の特徴量
- 外れ値の影響を抑えたいとき
- 変数のスケール差が大きく、学習が不安定なとき
注意点
x >= 0が前提(負の値には直接使えない)- 0 を含む場合でも
log1pなら安全に扱える - 変換後の解釈(単位)が変わる点に注意
Python での実例
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(0)
raw = rng.lognormal(mean=1.0, sigma=0.8, size=1000)
log1p = np.log1p(raw)
fig, axes = plt.subplots(1, 2, figsize=(8, 3))
axes[0].hist(raw, bins=30, color="#4C78A8", edgecolor="white")
axes[0].set_title("Original (right-skewed)")
axes[1].hist(log1p, bins=30, color="#F58518", edgecolor="white")
axes[1].set_title("After log1p")
plt.tight_layout()
plt.show()
出力:
数学での使いどころ
- 分布の形状把握(非対称性の定量化)
- 正規性の仮定チェックの補助指標
機械学習での使いどころ
歪度の高い特徴量は、線形モデルや距離ベースのモデルで学習を不安定にしやすい。前処理として変換を入れる判断に歪度を使う。
- 特徴量の分布形状の把握(EDA で歪度をスキャンして変換対象を絞る)
- log1p 変換・Box-Cox 変換の判断:
|skewness| > 1程度が目安 - 線形回帰・LogisticRegression の入力前処理: 右に長い特徴量を圧縮して残差の歪みを減らす
- 目的変数の前処理: 価格予測などで目的変数が右に歪んでいる場合、
log1p(y)で学習してからexpm1(y_pred)で戻す - 異常検知での「正常分布からの逸脱度」評価
- 木系モデル(RandomForest, 勾配ブースティング)では順序判定なので歪度の影響は小さく、変換不要なことが多い
具体的な利用例:
- 不動産価格予測で価格が右に長く
skewness ≈ 1.5→log1p(price)を目的変数にして学習 - 待ち時間予測で
skewness ≈ 2.0→ Box-Cox 変換で λ を最適化して正規化 - 顧客生涯価値(LTV)の予測で右に長い分布を log1p で圧縮
適さないケース
- 負の値を多く含む変数(別の変換が必要)
- 変換後の解釈が重要な場面(ログ変換で意味が変わる)