top of page

データ分析におけるPandasの異常検出のための7つの簡単なテクニック

更新日:6月22日

データ分析は刺激的な旅ですが、同時に課題も伴います。最大のハードルの一つは、異常値、つまり結論や予測を歪める可能性のある予期せぬ結果を特定することです。売上データの分析でも、システムパフォーマンスの監視でも、こうした異常値を認識することは非常に重要です。PythonのPandasライブラリを熱心に愛用する私は、こうした異常値を効率的に特定するための実用的なテクニックをいくつか発見しました。この記事では、データ分析を強化するために簡単に実装できる、信頼性の高い7つの方法をご紹介します。

異常を検知するパンダ
Pandas detecting anomalies

異常を理解する


異常値(外れ値とも呼ばれる)とは、全体の分布から大きく逸脱したデータポイントのことです。測定誤差や稀な事象といった問題から生じることがあります。例えば、顧客の購入金額のデータセットを分析している場合、ほとんどの購入金額が20ドルから200ドルの範囲であるデータセットにおいて、1件の10,000ドルの取引は異常値とみなされます。これらのポイントを認識することは非常に重要です。なぜなら、これらのポイントは洞察を歪め、誤った意思決定につながる可能性があるからです。


1. ボックスプロットによる目視検査


異常値を特定する最もシンプルかつ効果的な方法の一つは、箱ひげ図です。箱ひげ図はデータの分布を明確に表示し、外れ値を容易に見つけることができます。

箱ひげ図には、最小値、第1四分位値、中央値、第3四分位値、最大値の5つの統計値が含まれます。「ひげ」の外側にあるデータポイントは、外れ値となる可能性があります。

import pandas as pd
import matplotlib.pyplot as plt

サンプルデータ

data = {'Values': [1, 2, 3, 4, 5, 100]}
df = pd.DataFrame(data)

箱ひげ図

plt.boxplot(df['Values'])
plt.title('Box Plot of Values')

plt.show()

研究によると、箱ひげ図は外れ値を効果的に示すことができるため、分析ツールキットに欠かせないツールとなっています。箱ひげ図をざっと見るだけで、さらに分析する価値のある値があるかどうかがわかります。


2. Zスコア分析


Zスコアは、データポイントが平均値からどれだけ離れているかを定量化する簡単な方法です。Zスコアが3を超えるか-3を下回る値は、通常、異常値を示します。


Pandas を使用して Z スコアを計算する方法は次のとおりです。


from scipy import stats
import pandas as pd

df['Z-Score'] = stats.zscore(df['Values'])
anomalies = df[(df['Z-Score'] > 3) | (df['Z-Score'] < -3)]

print(anomalies)

この手法を用いることで、平均値からの逸脱を示す数値指標を明確に確認できます。例えば、1000件のエントリからなるデータセットにおいて、この範囲を超えるZスコアがいくつか見つかっただけでも、調査する価値のある異常な兆候が見られる可能性があります。


3. 四分位範囲(IQR)


四分位範囲(IQR)は、異常値を特定するためのもう一つの堅牢な手法です。IQRは、第1四分位(25パーセンタイル)と第3四分位(75パーセンタイル)の差として計算され、データの中央50%を効果的に捉えます。


Q1 = df['Values'].quantile(0.25)
Q3 = df['Values'].quantile(0.75)

IQR = Q3 - Q

外れ値を識別するための境界を定義する

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

anomalies = df[(df['Values'] < lower_bound) | (df['Values'] > upper_bound)]

print(anomalies)

研究によると、IQRを用いることで極端な値の影響を大幅に最小限に抑えられることが示されています。例えば、500件の販売記録のデータセットにIQRを適用することで、顧客の購買パターンと一致しない取引を認識するのに役立ちます。


4. ローリング平均と標準偏差を用いた時系列分析


時系列データの場合、ローリング統計は特に有用です。これにより、変動する期間内の平均値と標準偏差を計算できるため、傾向の変化に伴う異常値の特定が容易になります。


df['Rolling_Mean'] = df['Values'].rolling(window=3).mean()
df['Rolling_Std'] = df['Values'].rolling(window=3).std()

異常を特定する

anomalies = df[(df['Values'] > (df['Rolling_Mean'] + 2 * df['Rolling_Std'])) | (df['Values'] < (df['Rolling_Mean'] - 2 * df['Rolling_Std']))]

print(anomalies)

たとえば、センサー データを長期にわたって追跡している場合、この方法を使用すると、機器の故障を示唆する変動を警告できるため、問題が悪化する前に適切なタイミングでメンテナンスを行うことができます。


5. 分離フォレストアルゴリズム


機械学習に取り組む人にとって、Isolation Forest アルゴリズムは、特に大規模なデータセット内の異常を識別するための強力なツールです。


まず、scikit-learnライブラリがインストールされていることを確認してください。Isolation Forestは、特徴量をランダムに選択して値を分割することで異常を分離し、異常なパターンを捉えます。


from sklearn.ensemble import IsolationForest

model = IsolationForest(contamination=0.1)

df['Anomaly'] = model.fit_predict(df[['Values']])
anomalies = df[df['Anomaly'] == -1]
print(anomalies)

この方法は、従来の方法では異常を正確に特定するのが難しい、エントリが数万件を超えるデータセットに特に効果的です。


6. 局所外れ値係数(LOF)


局所外れ値係数(LOF)は、データポイントの局所的な密度を近傍のポイントと比較して評価する高度な手法です。密度が著しく低いポイントは異常としてフラグ付けされます。


from sklearn.neighbors import LocalOutlierFactor

lof = LocalOutlierFactor()
df['Anomaly'] = lof.fit_predict(df[['Values']])
anomalies = df[df['Anomaly'] == -1]

print(anomalies)


たとえば、トラフィック パターンを分析している場合、LOF はトラフィック量の異常な急増や急減を識別し、潜在的なインシデントやデータの不正確さを警告するのに役立ちます。


7. 視覚化テクニック


視覚的なツールは、データの理解を大幅に深め、異常値の特定に役立ちます。散布図や対比図などを活用して、データを視覚的に効果的に分析することを検討してください。


plt.scatter(df.index, df['Values'])
plt.title('Scatter Plot of Values')

plt.xlabel('Index')
plt.ylabel('Values')

plt.axhline(y=upper_bound, color='r', linestyle='-')
plt.axhline(y=lower_bound, color='r', linestyle='-')

plt.show()

研究によると、視覚化は、生データや指標だけでは十分に明らかにできない発見につながる可能性があります。視覚化によって得られる洞察は、複雑なデータセット内のパターンや外れ値を迅速に特定するのに役立ちます。


すべてをまとめる:Pandasデータ分析


異常値の認識は、特に精度が極めて重要な分野において、正確なデータ分析に不可欠です。箱ひげ図やZスコア分析などのツールは初期検査に最適ですが、アイソレーションフォレストやローカル外れ値係数などの高度な手法は、複雑な分析に優れています。

これらのテクニックを試し、データセットに適応させ、Pandasを使ってデータ分析スキルを磨きましょう。これらのツールを活用することで、異常を効率的に発見し、十分な情報に基づいたデータドリブンな意思決定を行えるようになります。

さらなるデータ異常を探すパンダ
Pandas hunting for more data anomalies

bottom of page