統計検定2級 標準化得点

## はじめに
今回は統計検定2級の範囲の標準化得点について学んでいきます。標準化得点は学校のテストでも利用しているので、馴染みがありますね！！そもそも標準化得点って何？、なんで必要なの？って事を明らかにしていこうと思います！！

# 📊 標準化得点（zスコア）とは？

標準化得点（**zスコア**）とは、あるデータが平均からどれだけ離れているかを「標準偏差を基準に」示す指標です。

---

## ✅ 数式と意味

標準化得点は、次の式で定義されます：

$$
z = \frac{x - \mu}{\sigma}
$$

- $x$：個々のデータ  
- $\mu$：平均（mean）  
- $\sigma$：標準偏差（standard deviation）  
- $z$：標準化得点（zスコア）

---

## 🧠 直感的な理解

- $z = 0$：平均と同じ  
- $z > 0$：平均より大きい  
- $z < 0$：平均より小さい  
- $z = 1$：平均より1標準偏差上  
- $z = -2$：平均より2標準偏差下  

---

## 🎯 なぜ使うの？

### 1. 単位やスケールが異なるデータの比較に使える

たとえば：
- テストA：100点満点、平均70点、あなたの点数80点
- テストB：50点満点、平均30点、あなたの点数35点

どちらも $z = 1.0$（＝平均より1標準偏差上）  
→ **どちらも相対的には同じくらい良い成績！**

---

### 2. 分布内での相対的位置がわかる

正規分布を前提にすると、zスコアから「全体の中でどれくらいの位置にいるか」がわかります：

| zスコア | 下位%（累積確率） | 上位% |
|--------|-------------------|--------|
| $-2.0$ | 2.28%             | 97.72% |
| $-1.0$ | 15.87%            | 84.13% |
| $0.0$  | 50.00%            | 50.00% |
| $1.0$  | 84.13%            | 15.87% |
| $2.0$  | 97.72%            | 2.28%  |

---

### 3. 統計解析・機械学習の前処理に役立つ

特徴量のスケールを揃えることで、回帰・分類・クラスタリングなどの精度や収束性が向上します。

---

## 🧮 計算例

平均 $\mu = 70$、標準偏差 $\sigma = 10$ のテストで、得点 $x = 85$ の場合：

$$
z = \frac{85 - 70}{10} = 1.5
$$

→ あなたのスコアは平均より **1.5標準偏差分上**。  
→ 正規分布なら **上位約6.68%** に入ります。

---

## 🎓 偏差値との関係

偏差値は、zスコアを使ってスケール変換したものです：

$$
偏差値 = 10z + 50
$$

たとえば、zスコアが $1.0$ なら：

$$
偏差値 = 10 \times 1 + 50 = 60
$$

→ 偏差値60は、**上位約16%** に該当します。


## 実践
```py
# 📌 日本語フォントインストール（Google Colab専用）
!apt-get -y install fonts-ipafont-gothic > /dev/null

# 📦 ライブラリ
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from scipy.stats import norm

# 🎌 日本語フォント設定（Colab用）
jp_font = FontProperties(fname="/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf")
plt.rcParams['font.family'] = jp_font.get_name()

# ⚙️ 平均と標準偏差を設定
mu = 70
sigma = 10

# 🎲 スコアを正規分布からランダムに生成
np.random.seed(42)
scores = np.random.normal(loc=mu, scale=sigma, size=20).round(1)

# 🧮 zスコア・パーセンタイル計算
z_scores = (scores - mu) / sigma
lower_percentiles = norm.cdf(z_scores) * 100
upper_percentiles = 100 - lower_percentiles

# 📋 データフレームにまとめる
df = pd.DataFrame({
    'スコア': scores,
    'zスコア': z_scores,
    '上位%': upper_percentiles
}).sort_values('スコア').reset_index(drop=True)

# 📈 正規分布の曲線データを作成
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 400)
y = norm.pdf(x, mu, sigma)

# 🎨 グラフ描画
plt.figure(figsize=(12, 6))
plt.plot(x, y, label='正規分布', color='steelblue')
plt.fill_between(x, 0, y, alpha=0.1, color='steelblue')

# 📍 各スコアに点とzスコア・上位%のラベルを表示（重なり回避）
for i, row in df.iterrows():
    score = row['スコア']
    z = row['zスコア']
    upper_pct = row['上位%']
    pdf_y = norm.pdf(score, mu, sigma)
    offset = 0.004 if i % 2 == 0 else -0.006  # ラベルを交互に上下に
    va_align = 'bottom' if offset > 0 else 'top'

    # 点と垂直線
    plt.plot(score, pdf_y, 'o', color='crimson')
    plt.vlines(score, 0, pdf_y, colors='crimson', linestyles='dotted')

    # ラベル表示（スコア・zスコア・上位％）
    plt.text(score, pdf_y + offset,
             f"{score:.1f}点\nz={z:.2f}\n上位{upper_pct:.1f}%",
             ha='center', va=va_align,
             fontproperties=jp_font, fontsize=9)

# 🖋 グラフ装飾
plt.title("正規分布上にスコアを可視化（zスコアと上位％）", fontproperties=jp_font)
plt.xlabel("スコア", fontproperties=jp_font)
plt.ylabel("確率密度", fontproperties=jp_font)
plt.grid(True)
plt.legend(prop=jp_font)
plt.tight_layout()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/59b09fe2-fe45-4ba0-a9cd-8d2a3b05b8ab.png)

```py:
# 📌 日本語フォントインストール（Google Colab専用）
!apt-get -y install fonts-ipafont-gothic > /dev/null

# 📦 ライブラリ
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from scipy.stats import norm

# 🎌 日本語フォント設定（Colab用）
jp_font = FontProperties(fname="/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf")
plt.rcParams['font.family'] = jp_font.get_name()

# ⚙️ 平均と標準偏差を設定
mu = 70
sigma = 10

# 🎲 スコアを正規分布からランダムに生成
np.random.seed(42)
scores = np.random.normal(loc=mu, scale=sigma, size=20).round(1)

# 🧮 zスコア・パーセンタイル計算
z_scores = (scores - mu) / sigma
lower_percentiles = norm.cdf(z_scores) * 100
upper_percentiles = 100 - lower_percentiles

# 📋 データフレームにまとめる
df = pd.DataFrame({
    'スコア': scores,
    'zスコア': z_scores,
    '上位%': upper_percentiles
}).sort_values('スコア').reset_index(drop=True)

# 📈 正規分布の曲線データを作成
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 400)
y = norm.pdf(x, mu, sigma)

# 🎨 グラフ描画
plt.figure(figsize=(12, 6))

# ⛅ ±2σ の塗り（全体95.4%）
plt.fill_between(x, 0, y, where=((x >= mu - 2*sigma) & (x <= mu + 2*sigma)),
                 color='orange', alpha=0.1, label='±2σの範囲')

# ⛅ ±1σ の塗り（全体68.3%）
plt.fill_between(x, 0, y, where=((x >= mu - sigma) & (x <= mu + sigma)),
                 color='yellow', alpha=0.3, label='±1σの範囲')

# 正規分布の曲線
plt.plot(x, y, label='正規分布', color='steelblue')

# スコアごとの点とラベル
for i, row in df.iterrows():
    score = row['スコア']
    z = row['zスコア']
    upper_pct = row['上位%']
    pdf_y = norm.pdf(score, mu, sigma)
    offset = 0.004 if i % 2 == 0 else -0.006
    va_align = 'bottom' if offset > 0 else 'top'

    # 点と線
    plt.plot(score, pdf_y, 'o', color='crimson')
    plt.vlines(score, 0, pdf_y, colors='crimson', linestyles='dotted')

    # ラベル表示
    plt.text(score, pdf_y + offset,
             f"{score:.1f}点\nz={z:.2f}\n上位{upper_pct:.1f}%",
             ha='center', va=va_align,
             fontproperties=jp_font, fontsize=9)

# 🖋 ラベルなど装飾
plt.title("正規分布と標準化得点：±1σ, ±2σの範囲と上位％", fontproperties=jp_font)
plt.xlabel("スコア", fontproperties=jp_font)
plt.ylabel("確率密度", fontproperties=jp_font)
plt.grid(True)
plt.legend(prop=jp_font)
plt.tight_layout()
plt.show()
```

## 📊 標準化得点（zスコア）とパーセンタイル範囲

| zスコアの範囲     | 含まれる割合（%） | パーセンタイル範囲（下位〜上位） | 意味・解釈                      |
|------------------|------------------|-------------------------------|-------------------------------|
| ±1σ（-1.0〜+1.0） | 約68.3%          | 16.0%〜84.1%                  | 平均的な値（よくある範囲）         |
| ±2σ（-2.0〜+2.0） | 約95.4%          | 2.3%〜97.7%                   | ほとんどの値（異常ではない）       |
| ±3σ（-3.0〜+3.0） | 約99.7%          | 0.15%〜99.85%                 | ほぼすべて（例外を除く）           |
| z < -2.0          | 約2.3%           | ～2.3%                        | 非常に低い値（まれ・要注意）       |
| z > +2.0          | 約2.3%           | 97.7%～                       | 非常に高い値（優秀・外れ値の可能性）|

---

### ✅ パーセンタイルの意味：
- **50%：中央値（z=0）**
- **16%：z = -1（平均−1σ）**
- **84%：z = +1（平均＋1σ）**
- **2.3% / 97.7%：z = ±2**
- **0.15% / 99.85%：z = ±3**

:::note info
上の表を持っておくと、標準化得点で上位何％なのかというのが判定できていいですね！
意思決定の指標になると思います！
:::