Pythonでデータ分析をするとき、データの特徴を数字で表すことがとても大切です。
NumPyを使えば、たった1行で次のようなことがわかります:
- データの平均はいくつか
- データのばらつきはどれくらいか
- 一番大きい値、小さい値は何か
- データに異常な値が含まれていないか
この記事では、NumPyでよく使う統計関数を、使い方と実例つきで詳しく説明します。
準備:NumPyのインポート
説明 NumPyを使う前に、必ずインポートが必要です。
import numpy as np
# テスト用のデータを作成
test_data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print("テストデータ:", test_data)
基本的な統計関数

合計を求める:np.sum()
説明 配列のすべての数を足し合わせます。
例
data = np.array([1, 2, 3, 4, 5])
result = np.sum(data)
print(f"合計: {result}")
実行結果
合計: 15
平均を求める:np.mean()
説明 配列の平均値を計算します。
例
data = np.array([2, 4, 6, 8, 10])
result = np.mean(data)
print(f"平均: {result}")
実行結果
平均: 6.0
中央値を求める:np.median()
説明 データを小さい順に並べたときの真ん中の値です。
例
data = np.array([1, 2, 3, 100, 200]) # 100と200は極端に大きい
average = np.mean(data)
median = np.median(data)
print(f"平均: {average}")
print(f"中央値: {median}")
実行結果
平均: 61.2
中央値: 3.0
ポイント 極端に大きい値があるときは、中央値の方が「普通の値」を表します。
最大値・最小値:np.max()、np.min()
説明 配列の中で一番大きい値と一番小さい値を見つけます。
例
data = np.array([15, 3, 9, 1, 12, 7])
max_value = np.max(data)
min_value = np.min(data)
print(f"最大値: {max_value}")
print(f"最小値: {min_value}")
実行結果
最大値: 15
最小値: 1
範囲を求める:np.ptp()
説明 最大値から最小値を引いた「データの幅」を計算します。
例
data = np.array([10, 20, 30, 40, 50])
range_value = np.ptp(data)
print(f"データの範囲: {range_value}")
実行結果
データの範囲: 40
ばらつきを表す統計関数

標準偏差:np.std()
説明 データがどれくらいばらついているかを表します。値が大きいほどばらつきが大きいです。
例
# ばらつきの小さいデータ
data1 = np.array([5, 5, 5, 5, 5])
# ばらつきの大きいデータ
data2 = np.array([1, 3, 5, 7, 9])
std1 = np.std(data1)
std2 = np.std(data2)
print(f"データ1の標準偏差: {std1}")
print(f"データ2の標準偏差: {std2}")
実行結果
データ1の標準偏差: 0.0
データ2の標準偏差: 2.8284271247461903
分散:np.var()
説明 標準偏差を2乗した値です。ばらつきを表すもう一つの指標です。
例
data = np.array([2, 4, 6, 8, 10])
variance = np.var(data)
std_dev = np.std(data)
print(f"分散: {variance}")
print(f"標準偏差: {std_dev}")
print(f"標準偏差の2乗: {std_dev**2}")
実行結果
分散: 8.0
標準偏差: 2.8284271247461903
標準偏差の2乗: 8.000000000000002
パーセンタイルと分位点
パーセンタイル:np.percentile()
説明 「下から数えて○○%の位置にある値」を求めます。
例
# テストの点数データ
scores = np.array([60, 65, 70, 75, 80, 85, 90, 95])
# 下から25%、50%、75%の位置の値
p25 = np.percentile(scores, 25)
p50 = np.percentile(scores, 50) # 中央値と同じ
p75 = np.percentile(scores, 75)
print(f"25パーセンタイル: {p25}")
print(f"50パーセンタイル: {p50}")
print(f"75パーセンタイル: {p75}")
実行結果
25パーセンタイル: 68.75
50パーセンタイル: 77.5
75パーセンタイル: 86.25
分位点:np.quantile()
説明 パーセンタイルと同じですが、0から1の範囲で指定します。
例
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 0.25 = 25%と同じ意味
q1 = np.quantile(data, 0.25) # 第1四分位
q2 = np.quantile(data, 0.50) # 第2四分位(中央値)
q3 = np.quantile(data, 0.75) # 第3四分位
print(f"第1四分位: {q1}")
print(f"第2四分位: {q2}")
print(f"第3四分位: {q3}")
実行結果
第1四分位: 3.25
第2四分位: 5.5
第3四分位: 7.75
位置を見つける関数

最大値・最小値の位置:np.argmax()、np.argmin()
説明 最大値や最小値が配列の何番目にあるかを教えてくれます。
例
scores = np.array([85, 92, 78, 96, 89])
max_index = np.argmax(scores)
min_index = np.argmin(scores)
print(f"最高点: {scores[max_index]} (位置: {max_index})")
print(f"最低点: {scores[min_index]} (位置: {min_index})")
実行結果
最高点: 96 (位置: 3)
最低点: 78 (位置: 2)
2次元配列での統計処理
軸を指定した計算:axis の使い方
説明 2次元配列では、行ごとや列ごとに統計を計算できます。
例:学生の成績データ
# 3人の学生の3科目の成績
# 行:学生、列:科目
scores = np.array([[80, 85, 90], # 学生1
[75, 80, 85], # 学生2
[90, 95, 80]]) # 学生3
print("成績データ:")
print(scores)
# 各学生の平均点(行ごと)
student_avg = np.mean(scores, axis=1)
print("各学生の平均点:", student_avg)
# 各科目の平均点(列ごと)
subject_avg = np.mean(scores, axis=0)
print("各科目の平均点:", subject_avg)
# 全体の平均点
total_avg = np.mean(scores)
print("全体の平均点:", total_avg)
実行結果
成績データ:
[[80 85 90]
[75 80 85]
[90 95 80]]
各学生の平均点: [85. 80. 88.33333333]
各科目の平均点: [81.66666667 86.66666667 85. ]
全体の平均点: 84.44444444444444
axisの覚え方
axis=0
:縦方向(列ごと)に計算axis=1
:横方向(行ごと)に計算
条件付きの統計処理
特定の条件を満たすデータだけで統計
説明 条件を指定して、その条件に合うデータだけで統計を計算できます。
例:合格点以上の平均点
scores = np.array([45, 67, 89, 34, 78, 92, 56, 83])
passing_score = 60
# 合格点以上の点数だけを取り出す
passed_scores = scores[scores >= passing_score]
print("合格点以上の点数:", passed_scores)
# 合格者の平均点
passed_avg = np.mean(passed_scores)
print("合格者の平均点:", passed_avg)
# 合格率
pass_rate = len(passed_scores) / len(scores) * 100
print(f"合格率: {pass_rate:.1f}%")
実行結果
合格点以上の点数: [67 89 78 92 83]
合格者の平均点: 81.8
合格率: 62.5%
その他の便利な統計関数
重複を取り除く:np.unique()
説明 配列から重複を取り除いて、ユニークな値だけを取り出します。
例
data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 5])
unique_values = np.unique(data)
print("元のデータ:", data)
print("重複なし:", unique_values)
# 各値の出現回数も知りたい場合
unique_values, counts = np.unique(data, return_counts=True)
print("値:", unique_values)
print("回数:", counts)
実行結果
元のデータ: [1 2 2 3 3 3 4 4 5]
重複なし: [1 2 3 4 5]
値: [1 2 3 4 5]
回数: [1 2 3 2 1]
相関係数:np.corrcoef()
説明 2つのデータの関係の強さを-1から1の値で表します。
例
# 身長と体重のデータ(仮想)
height = np.array([160, 165, 170, 175, 180])
weight = np.array([50, 55, 65, 70, 75])
# 相関係数を計算
correlation = np.corrcoef(height, weight)
print("身長と体重の相関係数:")
print(correlation)
# 相関係数の値だけを取得
corr_value = correlation[0, 1]
print(f"相関係数: {corr_value:.3f}")
実行結果
身長と体重の相関係数:
[[1. 0.969]
[0.969 1. ]]
相関係数: 0.969
相関係数の意味
- 1に近い:正の強い関係(片方が増えるともう片方も増える)
- 0に近い:関係なし
- -1に近い:負の強い関係(片方が増えるともう片方が減る)
実際に使える応用例
データの要約統計
説明 データの全体像を一度に把握する関数を作ってみましょう。
def describe_data(data):
"""データの要約統計を表示する関数"""
print("=== データの要約統計 ===")
print(f"データ数: {len(data)}")
print(f"平均: {np.mean(data):.2f}")
print(f"中央値: {np.median(data):.2f}")
print(f"最大値: {np.max(data)}")
print(f"最小値: {np.min(data)}")
print(f"標準偏差: {np.std(data):.2f}")
print(f"25%: {np.percentile(data, 25):.2f}")
print(f"75%: {np.percentile(data, 75):.2f}")
# 使用例
test_scores = np.array([78, 85, 92, 69, 88, 91, 76, 82, 89, 95])
describe_data(test_scores)
実行結果
=== データの要約統計 ===
データ数: 10
平均: 84.50
中央値: 86.50
最大値: 95
最小値: 69
標準偏差: 8.17
25%: 78.25
75%: 90.75
関数の使い分けガイド
代表値(中心の値)
関数 | いつ使う? | 特徴 |
---|---|---|
np.mean() | 一般的な平均が欲しい | 極端な値に影響される |
np.median() | 極端な値がある | 極端な値に影響されにくい |
ばらつき
関数 | いつ使う? | 特徴 |
---|---|---|
np.std() | ばらつきを知りたい | よく使われる |
np.var() | 数学的な計算 | 標準偏差の2乗 |
np.ptp() | 簡単な範囲を知りたい | 最大-最小 |
分布の理解
関数 | いつ使う? | 特徴 |
---|---|---|
np.percentile() | 相対的な位置を知りたい | パーセントで指定 |
np.quantile() | 統計的な分析 | 0-1で指定 |
まとめ
必ず覚えたい基本5つ
np.mean()
– 平均np.median()
– 中央値np.std()
– 標準偏差np.max()
,np.min()
– 最大・最小np.sum()
– 合計
データ分析でよく使う組み合わせ
# データの基本情報を一気に確認
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(f"平均: {np.mean(data):.2f}")
print(f"中央値: {np.median(data):.2f}")
print(f"標準偏差: {np.std(data):.2f}")
print(f"最大値: {np.max(data)}, 最小値: {np.min(data)}")
print(f"25%-75%: {np.percentile(data, 25):.1f} - {np.percentile(data, 75):.1f}")
コメント