Pandas & NumPy Academy · レッスン

一変量解析

各列を個別に分析し、数値列では分布を、カテゴリ列では値の件数をプロットして、外れ値と歪みを確認します。

レッスン 2/413 ステップ

「一変量解析」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

単変量分析とは

単変量分析では、列同士の関係を無視し、1回につき1列だけを独立して調べます。目的は、各変数の分布を理解し、外れ値を検出し、歪度を特定して、モデリングを始める前にデータ品質の問題を見つけることです。単変量分析の方法は数値列とカテゴリカル列で異なります。数値列では分布プロットと要約統計量が必要ですが、カテゴリカル列では度数と割合を調べます。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric_cols = df.select_dtypes('number').columns.tolist()
categoric_cols = df.select_dtypes('object').columns.tolist()

print('Numeric columns:', numeric_cols)
print('Categorical columns:', categoric_cols)

数値列のヒストグラム

各数値列のヒストグラムを描画して、分布の形状を確認します。対称性と歪度(片側に伸びる裾)、多峰性(ピークが1つか複数か)、明らかな異常値(極端な値にあり、もっともらしくない値)に注目してください。Pandas の df.hist() を使うと、ループを書かずに複数列のヒストグラムをすばやく一覧表示できます。一方、Seaborn の histplot を使うと、個々の列をより細かく制御できます。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

# Quick multi-column histogram grid
numeric = df.select_dtypes('number')
numeric.hist(bins=20, figsize=(12, 8), layout=(2, 3), color='steelblue', edgecolor='white')
plt.suptitle('Univariate Distributions (Numeric Columns)', y=1.02)
plt.tight_layout()
plt.show()

数値列の要約統計量

各数値列について、平均値と中央値を計算して比較します。平均値が中央値を大きく上回る場合、分布は右に歪んでいます(右側の裾が長く、所得や価格のデータでよく見られます)。平均値が中央値を下回る場合は左に歪んでいます。また、平均値に対する標準偏差の大きさも確認してください。非負の変数で標準偏差が平均値を上回る場合は、変動が大きいか、外れ値がある兆候です。歪度は df.skew() で直接計算できます。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

summary = pd.DataFrame({
    'mean': numeric.mean(),
    'median': numeric.median(),
    'std': numeric.std(),
    'skewness': numeric.skew(),
    'missing_pct': (numeric.isna().sum() / len(df) * 100).round(1)
}).round(2)

print(summary)

外れ値検出のための箱ひげ図

箱ひげ図は、数値列の外れ値を見つけるための最も速い可視化手法です。ひげの外側(Q1 または Q3 から 1.5×IQR を超える範囲)にある点は個別に描画され、外れ値の可能性があるものとして示されます。外れ値が多い列については、データ入力ミスなのか、正当な極端値なのか、それとも正規分布ではないことの表れなのかを調査する必要があります。箱ひげ図では、箱の中で中央値が左右非対称な位置にあることから、右または左の歪みも確認できます。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 3, figsize=(14, 5))

for ax, col in zip(axes, ['age', 'fare', 'sibsp']):
    df[[col]].boxplot(ax=ax)
    ax.set_title(f'Box Plot: {col}')

plt.tight_layout()
plt.show()

IQR に基づく外れ値の件数

IQR(四分位範囲)法では、Q1 - 1.5×IQR 未満、または Q3 + 1.5×IQR を超える値を外れ値と定義します。これをプログラムで計算すると、グラフを描画せずにすべての数値列の外れ値を数えて調べることができます。グラフの生成ではなく異常値の件数をログに記録する必要がある自動化パイプラインで便利です。外れ値を削除するか、上限・下限を設定するか、フラグを付けるかは、ドメイン知識に基づいて慎重に決定してください。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

Q1 = numeric.quantile(0.25)
Q3 = numeric.quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outlier_counts = ((numeric < lower) | (numeric > upper)).sum()
print('Outlier counts per column:')
print(outlier_counts[outlier_counts > 0])

カテゴリカル列の値の出現回数

各カテゴリカル列で value_counts() を呼び出し、観測値がカテゴリ間でどのように分布しているかを確認します。必ず次の点を確認してください。単一のカテゴリが支配的(>80%)になっていないでしょうか。これは分類タスクにおけるクラス不均衡の原因になります。1~2件しかない希少カテゴリ(タイプミスや入力ミス)はないでしょうか。分布は業務上の想定と一致しているでしょうか(たとえば、「country」列で、予想外の国からの注文が大半を占めていないか)。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

for col in ['sex', 'embarked', 'class', 'who']:
    counts = df[col].value_counts(dropna=False)
    pct = (counts / len(df) * 100).round(1)
    result = pd.DataFrame({'count': counts, 'pct%': pct})
    print(f'\n--- {col} ---')
    print(result)

カテゴリ変数の棒グラフ

sns.countplot を使うか、value_counts().plot(kind='bar') を呼び出して、カテゴリの値の出現回数を棒グラフで可視化します。棒は頻度の高い順から低い順に並べると、支配的なカテゴリをすぐに確認できます。二値変数(yes/no、male/female)であれば円グラフも使用できますが、カテゴリが4つ以上ある場合は棒グラフの方が常に明確です。カテゴリ名が長い場合は、目盛りラベルを45度回転させてください。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.countplot(data=df, x='embarked', order=df['embarked'].value_counts().index, ax=axes[0])
axes[0].set_title('Embarkation Port Counts')

sns.countplot(data=df, x='class', order=['First', 'Second', 'Third'], ax=axes[1])
axes[1].set_title('Passenger Class Counts')

plt.tight_layout()
plt.show()

歪度の検出と変換の適用

右に大きく歪んだ数値列(歪度 > 1.5)には、分布をより対称にするために対数変換が有効なことがよくあります。これは、正規性を仮定する多くの統計検定や一部の ML アルゴリズムで重要です。np.log1p()(log(x+1)。ゼロ付近の値にも安全)を適用し、歪度を再確認します。変換前後のヒストグラムを比較して、分布がより釣鐘型になったことを確認してください。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(10, 4))

sns.histplot(df['fare'], bins=30, kde=True, ax=axes[0])
axes[0].set_title(f'fare (skew={df["fare"].skew():.2f})')

log_fare = np.log1p(df['fare'])
sns.histplot(log_fare, bins=30, kde=True, ax=axes[1], color='coral')
axes[1].set_title(f'log1p(fare) (skew={log_fare.skew():.2f})')

plt.tight_layout()
plt.show()

分散がゼロの列の確認

分散がゼロの列(すべての値が同一)は、どのモデルにも情報を提供しないため削除してください。分散がほぼゼロの列(行の99%が同じ値)も同様に役に立ちません。df.var() で分散を計算して絞り込みます。また、nunique() == len(df) となる列も確認してください。これらは ID 列である可能性が高く、特徴量としては使用すべきではありませんが、行識別子として役立つ場合があります。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

# Zero-variance columns
zero_var = numeric.columns[numeric.var() == 0].tolist()
print('Zero-variance columns:', zero_var)

# Near-zero variance (std < 0.01)
nzv = numeric.columns[numeric.std() < 0.01].tolist()
print('Near-zero variance:', nzv)

# Likely ID columns (all unique values)
id_candidates = [c for c in df.columns if df[c].nunique() == len(df)]
print('Likely ID columns:', id_candidates)

単変量分析の自動化ループ

各列について同じ分析を手作業で繰り返すのではなく、すべての数値列を反復処理し、主要な統計量を構造化された形式で出力するループを書きます。これにより、多数の列をすばやく確認し、注意が必要な列にフラグを付けられます。出力はパイプラインの監査ログの一部として CSV ファイルに保存でき、データをモデリングに使用する前に関係者が確認できます。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

rows = []
for col in numeric.columns:
    s = df[col]
    Q1, Q3 = s.quantile(0.25), s.quantile(0.75)
    IQR = Q3 - Q1
    n_outliers = ((s < Q1 - 1.5*IQR) | (s > Q3 + 1.5*IQR)).sum()
    rows.append({
        'column': col,
        'missing_pct': round(s.isna().mean() * 100, 1),
        'mean': round(s.mean(), 2),
        'std': round(s.std(), 2),
        'skew': round(s.skew(), 2),
        'outliers': int(n_outliers)
    })

report = pd.DataFrame(rows)
print(report.to_string(index=False))

単変量分析の結果を記録する

単変量分析が完了したら、結果を体系的に記録します。各列について、分布の形状(歪み、二峰性、ほぼ正規)、欠損値の割合と予定する補完方法、外れ値の件数と対応(上限・下限の設定、削除、フラグ付け)、およびドメイン上の確認が必要な不審な値を記録してください。この記録は、クリーニング手順の指針となり、後から判断を忘れたり異議を唱えられたりすることを防ぐデータ品質ログになります。

クイックチェック

このレッスンで学んだ単変量分析の理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、ヒストグラムによって数値列の分布の形状を確認できること、箱ひげ図と IQR フェンスによって外れ値を特定できること、value_counts によってカテゴリカル列のカテゴリ頻度を確認できることを学びました。これらのチェックをループで自動化すると、再利用可能な品質レポートを作成できます。次は二変量分析と相関分析に進み、列のペア間の関係を理解します。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「一変量解析」レッスンは無料ですか?

はい。「一変量解析」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「一変量解析」で何を学びますか?

各列を個別に分析し、数値列では分布を、カテゴリ列では値の件数をプロットして、外れ値と歪みを確認します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「一変量解析」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データセットプロファイリングのチェックリスト
  2. 一変量解析
  3. 二変量解析と相関分析
  4. レポートでの分析結果の要約
← Pandas & NumPy Academyに戻る