閉じる

Pandasのdescribeで要約統計量を効率的に出力:実務で役立つカスタマイズと活用法

データ分析のプロジェクトにおいて、生データを読み込んだ直後にまず実行するのがデータの中身を把握するための探索的データ分析 (EDA) です。

その中でも、Pandasの describeメソッド は、データセット全体の傾向を俯瞰するために最も頻繁に使用されるツールの一つです。

平均値や標準偏差、四分位数といった統計量を一瞬で算出してくれるこのメソッドは、非常に強力ですが、デフォルトの設定だけで済ませてしまうのはもったいないと言えます。

実務では、データの型に応じた適切なオプションの指定や、より深い洞察を得るためのカスタマイズが求められます。

本記事では、Pandasの describe() を使いこなし、効率的にデータの本質を見抜くためのテクニックを詳しく解説します。

describeメソッドの基本機能とデフォルトの挙動

Pandasの describe() メソッドは、DataFrameやSeriesに含まれるデータの 要約統計量 を計算して返します。

まずは、最も一般的な数値データに対して実行した場合の挙動を見ていきましょう。

数値データにおける標準的な出力内容

デフォルトの状態では、 describe() は数値型のカラムのみを抽出し、以下の統計量を算出します。

項目内容
count欠損値を除いたデータ数
mean平均値
std標準偏差 (データのばらつき)
min最小値
25%第一四分位数 (下位25%の点)
50%中央値 (第ニ四分位数)
75%第三四分位数 (上位25%の点)
max最大値

以下のサンプルコードで、実際の動作を確認してみましょう。

Python
import pandas as pd
import numpy as np

# サンプルデータの作成
data = {
    'age': [25, 30, 35, 40, 45, 200],  # 一部外れ値を含む
    'salary': [400, 500, 600, 700, 800, 900],
    'department': ['IT', 'HR', 'IT', 'Sales', 'HR', 'Sales']
}
df = pd.DataFrame(data)

# デフォルトのdescribeを実行
print(df.describe())
実行結果
              age      salary
count    6.000000    6.000000
mean    62.500000  650.000000
std     67.878568  187.082869
min     25.000000  400.000000
25%     31.250000  525.000000
50%     37.500000  650.000000
75%     43.750000  775.000000
max    200.000000  900.000000

この結果から、例えば age カラムの 最大値が200となっており、異常値が含まれている可能性が高い ことが即座に判断できます。

このように、データのクリーニングが必要な箇所を特定するのが最初のステップです。

カテゴリカルデータの要約統計量

実務で扱うデータには、数値だけでなく文字列(オブジェクト型)やカテゴリ型のデータも多く含まれます。

デフォルトの describe() ではこれらは無視されますが、引数を指定することで詳細を確認できます。

include引数による対象の切り替え

include='object' を指定すると、文字列データの要約統計量が表示されます。

Python
# 文字列データに対するdescribe
print(df.describe(include='object'))
実行結果
       department
count           6
unique          3
top            IT
freq            2
項目内容
count欠損値を除いた有効なデータ数
uniqueユニークな(重複を除いた)値の数
top最も頻繁に出現する値 (最頻値)
freq最頻値の出現回数

もし、数値型とオブジェクト型の両方を一度に確認したい場合は、 include='all' を使用します。

ただし、この場合は数値のみに存在する項目(meanなど)と、オブジェクトのみに存在する項目(uniqueなど)が混在し、該当しない箇所は NaN と表示されます。

実務で役立つカスタマイズ手法

標準的な出力だけでも有用ですが、実務では特定のビジネスルールに基づいた分析が必要です。

ここでは、より高度なカスタマイズ方法を紹介します。

パーセンタイルの詳細指定

デフォルトでは25%, 50%, 75%の四分位数が表示されますが、 percentiles 引数を使うことで、任意のパーセンタイルを追加できます。

例えば、 外れ値の影響を詳しく見るために1%点や99%点を確認したい 場合に有効です。

Python
# 10%, 90%, 99%点を確認する
custom_stats = df.describe(percentiles=[.1, .5, .9, .99])
print(custom_stats)
実行結果
              age      salary
count    6.000000    6.000000
mean    62.500000  650.000000
std     67.878568  187.082869
min     25.000000  400.000000
10%     27.500000  450.000000
50%     37.500000  650.000000
90%    122.500000  850.000000
99%    192.250000  895.000000
max    200.000000  900.000000

このように、特定の上位・下位データを細かくチェックすることで、データの分布をより正確に把握できます。

転置(T)による可読性の向上

カラム数が多いDataFrameに対して describe() を実行すると、横に長くなりすぎて画面に収まりきらなくなります。

その際は、 .T もしくは .transpose() を用いて 行列を入れ替える と非常に見やすくなります。

Python
# 転置して表示
print(df.describe().T)
実行結果
        count   mean        std   min    25%   50%    75%    max
age       6.0   62.5  67.878568  25.0  31.25  37.5  43.75  200.0
salary    6.0  650.0  187.082869 400.0 525.00 650.0 775.00  900.0

縦方向にカラム名が並ぶため、数十個のカラムがあるデータセットでもスクロールだけで全体を確認できるようになります。

グルーピングとの組み合わせ

実務では、全体の統計量だけでなく「部署ごと」「カテゴリごと」の統計量を知りたいケースがほとんどです。

Pandasの groupby() と組み合わせることで、強力な分析が可能になります。

カテゴリ別の要約統計量

以下のコードは、部署(department)ごとの年齢と給与の統計量を算出する例です。

Python
# 部署ごとにグループ化してdescribeを実行
grouped_stats = df.groupby('department').describe()
print(grouped_stats)

この結果はマルチインデックス形式になり、各部署の特性を比較するのに役立ちます。

もし特定のカラム(例えばsalary)だけを見たい場合は、以下のように記述します。

Python
# 特定のカラムのみ抽出
print(df.groupby('department')['salary'].describe())
実行結果
            count   mean         std    min    25%    50%    75%    max
department                                                              
HR            2.0  550.0  353.553391  300.0  425.0  550.0  675.0  800.0
IT            2.0  500.0  141.421356  400.0  450.0  500.0  550.0  600.0
Sales         2.0  800.0  141.421356  700.0  750.0  800.0  850.0  900.0

特定のセグメントで 平均値が著しく高い、あるいは標準偏差が大きくばらついている といった傾向を、数行のコードで発見できます。

大規模データセットにおける注意点と効率化

データサイズが数百万行を超えるような大規模データセットの場合、 describe() の計算に時間がかかることがあります。

特に標準偏差やパーセンタイルの計算は CPU リソースを消費します。

必要なカラムだけに絞り込む

すべてのカラムに対して統計を出すのではなく、あらかじめ数値カラムだけに絞り込んだり、分析対象のカラムを限定したりすることで、処理速度を向上させることができます。

Python
# 数値型カラムのみを抽出して実行
numeric_df = df.select_dtypes(include=[np.number])
print(numeric_df.describe())

浮動小数点の表示精度の設定

デフォルトでは小数点以下が長く表示され、表が見づらくなることがあります。

round() メソッドを繋げるか、Pandasの表示オプションを設定することで、情報を整理できます。

Python
# 小数点第2位まで表示
print(df.describe().round(2))

また、Notebook環境(Jupyter等)を使用している場合は、 style.format を活用して視覚的に強調することも可能です。

describeの結果を用いたデータバリデーション

describe() は単に数値を眺めるためだけのものではありません。

その戻り値はそれ自体が DataFrame であるため、 自動化されたデータチェック(バリデーション) に利用できます。

例えば、以下のように特定の条件を満たさない場合に警告を出す仕組みを構築できます。

Python
stats = df.describe()

# 最小値が0未満のカラムがないかチェック
if (stats.loc['min'] < 0).any():
    print("警告: 負の値が含まれているカラムがあります。")

# 年齢の最大値が150を超えているかチェック
if stats.loc['max', 'age'] > 150:
    print("警告: ageカラムに異常な値が含まれています。")

このように、プログラムの中で統計量を参照することで、パイプラインの途中でデータの品質を担保するスクリプトを作成することができます。

補足:他のメソッドとの使い分け

describe() は非常に便利ですが、万能ではありません。

目的やデータの特性に応じて、他のメソッドと使い分けることが重要です。

  1. info():
    欠損値の有無や、メモリ使用量、各カラムのデータ型を確認したい場合に最適です。
  2. value_counts():
    特定のカラムにおける値の出現頻度を詳細に知りたい場合(特にカテゴリ変数)に使用します。
  3. quantile():
    特定のパーセンタイル値だけがプログラム的に必要な場合、 describe() 全体を計算するより高速です。

これらを組み合わせることで、データの全体像と詳細の両方を効率的に把握できるようになります。

まとめ

Pandasの describe() メソッドは、データ分析の第一歩を支える非常に強力なツールです。

デフォルトの数値出力だけでなく、 include 引数によるカテゴリデータの把握、 percentiles による分布の深掘り、そして T による可読性の向上など、 実務でのニーズに合わせた柔軟な使いこなし が求められます。

分析の現場では、単にツールを使うだけでなく、算出された統計量から「データの異常」や「ビジネス上の特徴」を読み解く力が重要です。

本記事で紹介したテクニックを活用し、迅速かつ正確なデータ把握を行ってください。

まずは手元のデータセットで df.describe(include='all').T を実行し、見落としていたデータの特性がないか確認することから始めてみましょう。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!