概要(describeは「列ごとの要約統計を一瞬で確認する」入口)
pandasのdescribeは、数値列やカテゴリ列の“基本統計”をまとめて表示するメソッドです。数値なら件数・平均・標準偏差・最小/最大・四分位数、カテゴリ(文字列)なら件数・ユニーク数・最頻値・その出現回数が出ます。探索的データ解析(EDA)の最初の数分で「分布の中心・広がり・欠損の傾向」をざっくり掴むのに非常に有効です。
基本の使い方(数値中心がデフォルト、対象列は切り替え可能)
数値列の要約を表示する
import pandas as pd
df = pd.DataFrame({
"age": [23, 45, 56, 67, 34],
"height": [160, 175, 180, 170, 165],
"name": ["Alice", "Bob", "Charlie", "David", "Eve"]
})
print(df.describe())
# 数値列: count, mean, std, min, 25%, 50%, 75%, max が表示
Python数値列だけが対象(デフォルト)。「中心(mean/median=50%)」「散らばり(std)」「範囲(min/max)」「偏り(四分位)」が一目でわかります。
文字列(カテゴリ)も含めたい場合
print(df.describe(include="all"))
# 数値とオブジェクト列の両方を要約
Pythonカテゴリ列は、count/unique/top/freq(件数・ユニーク数・最頻値・その回数)を確認できます。IDやラベルの品質チェックに向いています。
特定型だけ・特定列だけを対象にする
print(df.describe(include=["object"])) # 文字列のみ
print(df[["age", "height"]].describe()) # 列を指定
Python対象を絞ることで、読みやすく、比較しやすい要約になります。
解釈のコツ(各指標が“何を示すか”を短く掴む)
数値列に出る指標の意味
- count: 欠損を除いたデータ数。少ない列は分析前に補完や除外を検討。
- mean: 平均。外れ値に弱いので、50%(中央値)と必ずセットで見る。
- std: 標準偏差。値の散らばり具合。大きいほどバラつく。
- min/max: 範囲。あり得ない値が混じっていないかの確認に最適。
- 25%/50%/75%: 四分位数。分布の形(偏り・裾)を掴む基礎。中央値(50%)は外れ値に強い中心指標。
カテゴリ列に出る指標の意味
- count: データ数。欠損が多ければ前処理の対象。
- unique: ユニーク数。IDの重複やカテゴリの粒度を推測できる。
- top/freq: 最頻値とその回数。偏りや支配的カテゴリの存在を確認。
実践例(数値要約・カテゴリ要約・パーセンタイル変更)
数値列の要約を使って外れ値と欠損を疑う
df = pd.DataFrame({"score": [10, 50, 55, 60, 200, None]})
print(df.describe()) # 200や欠損の影響をチェック
# 例)meanが高すぎ、stdが大きい → 外れ値(200)を疑う
# countが少ない → 欠損の補完(fillna)や除外(dropna)を検討
Python外れ値は平均や範囲で兆候が出ます。中央値(50%)にも注目して、頑健な判断をします。
カテゴリ列の偏りを把握して前処理方針を決める
df = pd.DataFrame({"city": ["Tokyo", "Tokyo", "Osaka", None, "Tokyo"]})
print(df.describe(include=["object"]))
# uniqueの少なさ → コード化(カテゴリ型)や集計の方向性を検討
# top/freqで偏りが強ければ、クラス不均衡への対策(重み付けなど)を意識
Pythonパーセンタイルを変更して「裾」を詳しく見る
df = pd.DataFrame({"sales": [100, 120, 130, 300, 500, 550, 600]})
print(df.describe(percentiles=[0.1, 0.5, 0.9]))
# 10%/90%などを追加して、裾の重さ(heavy tail)を把握
Pythonデフォルトの25/50/75%以外に、目的の境界を足して分布の端を観察します。
応用(グループ別要約・時系列の窓要約・型整備と連携)
グループ別にdescribeして比較する
df = pd.DataFrame({
"team": ["A","A","B","B","B"],
"score": [60, 75, 80, 85, 70]
})
print(df.groupby("team")["score"].describe())
# チームA/Bの分布比較(中心と散らばり)を一発で
Python目的別(カテゴリ別)に分布の違いを把握できます。施策や閾値の分け方のヒントになります。
時系列で整えてから要約
df = pd.DataFrame({"date": ["2025-01-01","2025-01-03","2025-01-02"], "sales": [100, None, 120]})
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values("date")
print(df["sales"].describe())
# 並べ替え・欠損対応後に要約すると、見立てが安定
Pythondescribeは「型が正しい前提」で生きる
df["date"] = pd.to_datetime(df["date"]) # 日付は日時型に
df["price"] = df["price"].astype("float64")# 数値は数値型に
print(df[["date", "price"]].describe(include="all"))
Python文字列で数値が混じっていると要約が歪みます。前処理でdtypeを整えるのが先です。
よくあるつまずき(NaNと件数、平均と中央値、文字列の扱い)
欠損が多いとcountが小さくなる
describeのcountは“非欠損数”。割合を見たい場合は、lenと組み合わせて「欠損率」を算出します。
s = df["score"]
missing_rate = 1 - (s.count() / len(s))
Python平均は外れ値に弱いので中央値も見る
平均が極端に動く場合、50%(median)を拠り所にして分布を判断します。必要なら外れ値除去やロバスト統計へ。
文字列列のdescribeは「頻度・ユニーク」中心
数値のような分布指標は出ません。必要なら長さや正規表現で品質チェックを行い、数値に変換可能なら前処理で列を分割・変換します。
まとめ(「まずdescribe」で分布の地図を手に入れ、前処理と比較へ繋げる)
describeは、数行のコードで「中心・散らばり・範囲・欠損・頻度」を俯瞰できる強力な入口です。数値は平均と中央値を並べて外れ値の影響を判断し、カテゴリはユニーク数と最頻値で偏りを掴む。percentilesで裾を追加し、groupbyでセグメント比較、dtype整備で正しい要約に。最初にdescribeで“地図”を作る—それが、初心者でも迷わず前処理・分析の次の一手へ進むための最短ルートです。
