データ分析の第一歩は、データの「全体像」をつかむことです。
平均値だけを見ても、データの本当の姿はわかりません。
データがどれくらいばらついているのか、偏りがあるのか、外れ値がありそうかなど、複数の指標をまとめて確認することが大切です。
今回は、SciPyの scipy.stats モジュールに含まれる describe() 関数を使って、データの基本統計量を一発で計算する方法を解説します。
Contents
基本統計量とは?
基本統計量(きほんとうけいりょう) とは、データの特徴を数値で表したもののことです。「要約統計量」とも呼ばれます。
たとえば、クラス全員のテストの点数データがあったとき、以下のような疑問が浮かぶかもしれません。
- 平均点はどれくらい?
- 点数のばらつきは大きい?小さい?
- 高得点側に偏っている?低得点側に偏っている?
こうした疑問に数値で答えてくれるのが基本統計量です。
代表的なものには、平均値、分散、歪度、尖度などがあります(それぞれの意味は後ほど説明します)。
scipy.stats.describe() とは?
describe() は、データの基本統計量をまとめて一度に計算してくれる便利な関数です。
この関数を使えば、以下の6つの統計量を一行のコードで取得できます。
| 統計量 | 英語名 | 意味 |
|---|---|---|
| データの個数 | nobs | データがいくつあるか |
| 最小値・最大値 | minmax | データの範囲(一番小さい値と一番大きい値) |
| 平均値 | mean | データの「真ん中あたり」を表す代表値 |
| 分散 | variance | データのばらつき具合を表す数値 |
| 歪度 | skewness | データの左右の偏りを表す数値 |
| 尖度 | kurtosis |
1つずつ自分で計算することもできますが、describe() を使えば たった1行 で全部出てきます。
実際に使ってみよう
データを用意する
まず、分析するデータを用意します。ここでは、10人の生徒のテストの点数を例にします。
以下、コードです。
from scipy import stats # 10人分のテストの点数データ scores = [55, 62, 71, 74, 78, 80, 85, 88, 92, 95]
from scipy import stats:SciPyライブラリの中からstats(統計処理)モジュールを読み込みますscores = [55, 62, 71, 74, 78, 80, 85, 88, 92, 95]:10人分の点数を リスト(データの並び)として変数scoresに格納します
describe() を実行する
では、describe() でデータの基本統計量を計算してみましょう。
以下、コードです。
# 基本統計量をまとめて計算 result = stats.describe(scores) print(result)
result = stats.describe(scores):describe()関数にデータscoreを渡し、結果をresultに格納しますprint(result):結果を画面に表示します
以下、実行結果です。
DescribeResult( nobs=10, minmax=(55, 95), mean=78.0, variance=165.33333333333334, skewness=-0.42212177031053827, kurtosis=-0.8213341137703782 )
数字がたくさん出てきました。1つずつ簡単に解説していきます。
各統計量の意味を理解しよう
① nobs(データの個数)
nobs=10
nobs は「Number of observations(観測数)」の略で、データの個数を表します。
今回は10人分の点数データを渡したので、10 と表示されています。
データ分析では、まずデータの件数を確認することが基本です。件数が少なすぎると、分析結果の信頼性が低くなるためです。
② minmax(最小値・最大値)
minmax=(55, 95)
minmax は、データの中で最も小さい値(最小値)と最も大きい値(最大値)をペアで表示します。
- 最小値:55点
- 最大値:95点
データの範囲(レンジ)は、40点(= 95 – 55 )です。
この「範囲」を見ることで、データがどれくらい広がっているかの大まかなイメージがつかめます。
③ mean(平均値)
mean=78.0
mean(ミーン) は 平均値 のことです。すべてのデータを足して、データの個数で割った値です。
計算式:(55 + 62 + 71 + 74 + 78 + 80 + 85 + 88 + 92 + 95) ÷ 10 = 78.0
平均値はデータの「中心」を表す代表的な指標ですが、極端に大きい値や小さい値(外れ値)の影響を受けやすいという弱点があります。
④ variance(分散)
variance=156.66666666666666
variance(バリアンス) は 分散 のことで、データがどれくらいばらついているかを表す数値です。
- 分散が 大きい → データが平均から離れてばらけている
- 分散が 小さい → データが平均の近くに集まっている
describe() が計算する分散は 不偏分散(ふへんぶんさん) と呼ばれるものです。これは、データの個数ではなく「データの個数 – 1」で割って計算します。サンプルデータ(一部のデータ)から全体の傾向を正確に推定するための補正で、統計学では一般的に使われる手法です。初心者の方は「より正確な分散」くらいの理解で大丈夫です。⑤ skewness(歪度)
skewness=-0.27269830702915875
skewness(スキューネス) は 歪度(わいど) のことで、データの分布が左右どちらに偏っているかを表す数値です。
- 歪度 ≒ 0 → 左右対称(偏りなし)
- 歪度 > 0 → 右に裾が長い(低い値に多く集まっている)
- 歪度 < 0 → 左に裾が長い(高い値に多く集まっている)
今回の値は -0.27 で、0に近い小さなマイナスです。
つまり、ほぼ左右対称だが、わずかに高得点寄りに集まっていることを示しています。
⑥ kurtosis(尖度)
kurtosis=-1.0762832065606863
kurtosis(カートシス) は 尖度(せんど) のことで、データの分布の山がどれくらい鋭いか(とがっているか)を表す数値です。
- 尖度 ≒ 0 → 正規分布と同じくらいの鋭さ
- 尖度 > 0 → 鋭くとがった山(中心にデータが集中、外れ値も多い)
- 尖度 < 0 → なだらかで平坦な山(データが広く分散)
今回の値は -1.08 で、正規分布よりもなだらかな分布であることを示しています。
テストの点数が特定の点数帯に集中せず、広い範囲に散らばっているイメージです。
正規分布とは、平均値を中心にして左右対称にデータが広がる、釣り鐘型の分布のことです。自然界や社会のデータ(身長、テストの点数など)の多くが、この正規分布に近い形になるとされています。統計分析の基礎となる非常に重要な概念です。
各統計量を個別に取り出す方法
describe() の結果は、一つの塊(オブジェクト)として返されますが、各統計量を個別に取り出すこともできます。
以下、コードです。
result = stats.describe(scores)
# 各統計量を個別に取り出す
print(f"データ数 : {result.nobs}")
print(f"最小値 : {result.minmax[0]}")
print(f"最大値 : {result.minmax[1]}")
print(f"平均値 : {result.mean}")
print(f"分散 : {result.variance}")
print(f"歪度 : {result.skewness}")
print(f"尖度 : {result.kurtosis}")
result.nobs:結果(result)の中からnobs(データ数)を取り出しますresult.minmax[0]:minmaxはペア(最小値, 最大値)なので、[0]で最小値、[1]で最大値を取り出しますf"...{変数}...":f文字列(フォーマット文字列) と呼ばれる書き方で、文字列の中に変数の値を埋め込むことができます
以下、実行結果です。
データ数 : 10 最小値 : 55 最大値 : 95 平均値 : 78.0 分散 : 165.33333333333334 歪度 : -0.42212177031053827 尖度 : -0.8213341137703782
レポートやグラフ作成のときに、特定の値だけを使いたい場合に便利です。
pandasの describe() との違い
Pythonのデータ分析でよく使うライブラリに pandas(パンダス) があります。
pandasにも describe() メソッドがありますが、出力される項目が異なります。
以下、コードです。
import pandas as pd scores = [55, 62, 71, 74, 78, 80, 85, 88, 92, 95] s = pd.Series(scores) print(s.describe())
以下、実行結果です。
count 10.000000 mean 78.000000 std 12.858201 min 55.000000 25% 71.750000 50% 79.000000 75% 87.250000 max 95.000000 dtype: float64
出力される統計量(平均値や分散などのこと)が異なります。整理すると次のようになります。
| 項目 | scipy.stats.describe() | pandas.describe() |
|---|---|---|
| データ数 | ✅ nobs | ✅ count |
| 平均値 | ✅ mean | ✅ mean |
| 分散 | ✅ variance | ❌ |
| 標準偏差 | ❌ | ✅ std |
| 最小値・最大値 | ✅ minmax | ✅ min, max |
| 四分位数 | ❌ | ✅ 25%, 50%, 75% |
| 歪度 | ✅ skewness | ❌ |
| 尖度 | ✅ kurtosis |
以下、使い分けの目安です。
- データの分布の形状(歪みや鋭さ)を知りたい →
scipy.stats.describe()
- データの散らばり方の区切り(四分位数)を知りたい →
pandas.describe()
どちらが正解ということではなく、目的に応じて使い分けるのがポイントです。
実務では、両方を併用してデータの全体像をつかむことが多いです。
> データを小さい順に並べて4等分したときの区切りの値です。25%(下位25%の境目)、50%(真ん中=中央値)、75%(上位25%の境目)の3つがあります。「データの真ん中あたりがどこにあり、どう広がっているか」をつかむのに便利です。
分散の平方根(ルート)を取った値です。分散はデータを2乗して計算するため、元のデータと単位が変わってしまいます。標準偏差にすることで、元のデータと同じ単位で「ばらつき」を理解できるようになります。pandasは分散の代わりに標準偏差を表示します。
まとめ
今回のポイントを振り返りましょう。
- 基本統計量 は、データの特徴を数値で表したもの
scipy.stats.describe()を使えば、6つの統計量を一発で計算できる- 各統計量の意味:nobs(個数)、minmax(範囲)、mean(平均)、variance(分散)、skewness(歪度)、kurtosis(尖度)
- pandasの
describe()とは出力項目が異なるので、目的に応じて使い分ける - 歪度・尖度を使えば、平均や分散だけではわからない分布の形状まで把握できる
次回は、「t検定をPythonで実行してみよう」 をテーマに、「2つのグループに統計的な差があるか」を判定する方法を紹介します。

