scipy.statsで基本統計量を一発計算する

scipy.statsで基本統計量を一発計算する

データ分析の第一歩は、データの「全体像」をつかむことです。

平均値だけを見ても、データの本当の姿はわかりません。

データがどれくらいばらついているのか、偏りがあるのか、外れ値がありそうかなど、複数の指標をまとめて確認することが大切です。

今回は、SciPyの scipy.stats モジュールに含まれる describe() 関数を使って、データの基本統計量を一発で計算する方法を解説します。

基本統計量とは?

基本統計量(きほんとうけいりょう) とは、データの特徴を数値で表したもののことです。「要約統計量」とも呼ばれます。

たとえば、クラス全員のテストの点数データがあったとき、以下のような疑問が浮かぶかもしれません。

  • 平均点はどれくらい?
  • 点数のばらつきは大きい?小さい?
  • 高得点側に偏っている?低得点側に偏っている?

こうした疑問に数値で答えてくれるのが基本統計量です。

代表的なものには、平均値、分散、歪度、尖度などがあります(それぞれの意味は後ほど説明します)。

 

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つのグループに統計的な差があるか」を判定する方法を紹介します。