[IQR および MAD] 原則。詳細な説明とコードを含む箱ひげ図について 1 つの記事で説明します。

IQR法

四分位ベース: データの第 1 四分位 (25%) と第 3 四分位 (75%) を使用して計算されます。
対称: 中央値に対して対称に上限と下限を考慮します。
極値の影響: データに極値が含まれている場合、IQR が非常に大きく拡張され、外れ値の検出感度が低下する可能性があります。

MAD法

中央値に基づく: 各点の中央値と偏差のみが考慮されます。
堅牢: 外れ値の影響を受けず、特に外れ値を含むデータに適しています。
非対称: 中央値からの絶対偏差のみが考慮されるため、中央値に関して対称ではありません。

利点の比較:

外れ値を含むデータ セットの場合: 外れ値の影響を受けにくいため、通常は MAD の方が優れています。
より対称的に分散されたデータ セットの場合: データの分散をより適切に反映できるため、IQR の方が優れている可能性があります。

短所の比較:

極値を含むデータ セットの場合: IQR の感度により、MAD よりもロバスト性が低くなる可能性があります。
非対称に分散されたデータ セットの場合: MAD は、データの実際の分散を完全には反映していない可能性があるため、IQR ほど優れていない可能性があります。

要約:

IQR法

四分位ベース: データの第 1 四分位 (25%) と第 3 四分位 (75%) を使用して計算されます。
対称: 中央値に対して対称に上限と下限を考慮します。
極値の影響: データに極値が含まれている場合、IQR が非常に大きく拡張され、外れ値の検出感度が低下する可能性があります。

MAD法

中央値に基づく: 各点の中央値と偏差のみが考慮されます。
堅牢: 外れ値の影響を受けず、特に外れ値を含むデータに適しています。
非対称: 中央値からの絶対偏差のみが考慮されるため、中央値に関して対称ではありません。

利点の比較:

外れ値を含むデータ セットの場合: 外れ値の影響を受けにくいため、通常は MAD の方が優れています。
より対称的に分散されたデータ セットの場合: データの分散をより適切に反映できるため、IQR の方が優れている可能性があります。

短所の比較:

極値を含むデータ セットの場合: IQR の感度により、MAD よりもロバスト性が低くなる可能性があります。
非対称に分散されたデータ セットの場合: MAD は、データの実際の分散を完全には反映していない可能性があるため、IQR ほど優れていない可能性があります。

要約:

データ セットが極値の影響を大きく受けている場合、または多数の繰り返し値が含まれている場合は、MAD の方が適切な選択肢となる可能性があります。
IQR は、データが極端な外れ値がなく均一に分布している場合にさらに便利です。

ここに画像の説明を挿入します

四分位数

データのセットを昇順に並べた後、データのセットを 4 等分する数を四分位数と呼びます。

第 1 四分位 (Q1)、第 2 四分位 (Q2、「中央値」とも呼ばれます)、および第 3 四分位 (Q3) はそれぞれ、サンプル内の小さい値から大きい値まで並べられたすべての値に等しくなります。 75 パーセンタイルの数値。

第 3 四分位と第 1 四分位の差は、四分位範囲 (IQR) とも呼ばれます。

歪度

は正規分布の逆であり、非対称分布の歪んだ状態を指します。 統計では、最頻値と平均値の差は分布の歪度の指標の 1 つとして使用できます。平均値が最頻値よりも大きい場合、それは正の歪度 (または右歪度) と呼ばれます。 ); 逆に、負の歪度 (または左歪度) と呼ばれます。

箱ひげ図を使用すると、データ全体の分布を観察し、中央値、25/% 分位数、75/% 分位数、上限、下限などの統計を使用してデータ全体の分布を説明できます。これらの統計を計算することにより、箱ひげ図が生成されます。この箱には、ほとんどの正常データが含まれており、異常データは箱の上下の境界の外側にあります。
データの歪度と末尾の重みを決定する

**標準正規分布からの大きなサンプルの場合、** 中央値は上位四分位数と下位四分位数の中心に位置し、箱ひげ図のボックスは中央線に対して対称になります。中央値が上位四分位数と下位四分位数の中心から離れるほど、分布の歪みが強くなります。値が大きい側に外れ値が集中すると分布は右に偏り、値が小さい側に外れ値が集中すると分布は左に偏ります。

複数のデータバッチの形状を比較する

ボックスの上限と下限は、それぞれデータの上位四分位と下位四分位です。これは、ボックスにデータの 50% が含まれていることを意味します。したがって、ビンの幅はデータの変動の程度をある程度反映します。 ボックスが平らであればあるほど、データが集中し、終了線 (つまり「ひげ」) が短くなり、データが集中していることを意味します。

matplotlibパラメータの詳細な説明

plt.boxplot(x,                      # x:指定要绘制箱图的数据
            notch=None,           # notch:是否是凹口的形式展现箱线图,默认非凹口
            sym=None,              # sym:指定异常点的形状,默认为+号显示
            vert=None,              # vert:是否需要将箱线图垂直摆放,默认垂直摆放
            whis=None,             # whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差
            positions=None,   # positions:指定箱线图的位置,默认为[0,1,2…]
            widths=None,         # widths:指定箱线图的宽度,默认为0.5
            patch_artist=None,        # patch_artist:是否填充箱体的颜色
            meanline=None,             # meanline:是否用线的形式表示均值,默认用点来表示
            showmeans=None,       # showmeans:是否显示均值,默认不显示
            showcaps=None,           # showcaps:是否显示箱线图顶端和末端的两条线,默认显示
            showbox=None,             # showbox:是否显示箱线图的箱体,默认显示
            showfliers=None,          # showfliers:是否显示异常值,默认显示
            boxprops=None,           # boxprops:设置箱体的属性,如边框色,填充色等
            labels=None,                  # labels:为箱线图添加标签,类似于图例的作用
            flierprops=None,          # filerprops:设置异常值的属性,如异常点的形状、大小、填充色等
            medianprops=None,   # medianprops:设置中位数的属性,如线的类型、粗细等
            meanprops=None,       # meanprops:设置均值的属性,如点的大小、颜色等
            capprops=None,           # capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等
            whiskerprops=None)   # whiskerprops:设置须的属性,如颜色、粗细、线的类型等

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(100)
data = np.random.normal(size=(1000,4),loc=0,scale=1)

ax = plt.subplot()
ax.boxplot(data)                                 # 绘图
ax.set_xlim([0,5])                               # 设置x轴值的范围  rotation=30
# ax.set_xticks()  							      # 自定义x轴的值
ax.set_xlabel("xlabel")                  # 设置x轴的标签
ax.set_xticklabels(['A','B','C','D'],  rotation=30,fontsize=10)   # 设置x轴坐标值的标签 旋转角度 字体大小
ax.set_title("xcy")       					  # 设置图像标题
ax.legend(labels= ['A','B','C','D'],loc='best',)  # 增加图例
ax.text(x=0.2 , y=3.5 , s="test" ,fontsize=12)   # 增加注

plt.show()

seabornパラメータの説明

  • x、y、hue: データまたはベクトル データ内の変数名
    長い形式のデータをプロットするための入力。

  • data: DataFrame、配列、配列リスト
    プロットに使用されるデータ セット。 x と y の両方が欠落している場合、データはワイド形式として扱われます。それ以外の場合、データは長い形式として扱われます。

  • order、hue_order: 文字列のリスト
    カテゴリカル変数 (対応する棒グラフ) が描画される順序を制御します。欠落している場合、カテゴリ変数の順序はデータから推測されます。

  • 方向: "v" または "h"
    描画の方向 (垂直または水平) を制御します。これは通常、入力変数の dtype から推測されますが、「カテゴリ」変数が数値である場合、またはワイドフォーマット データをプロットする場合に、プロットの方向を指定するために使用できます。

  • color: matplotlib color
    すべての要素の色、またはグラデーション パレットのシード カラー。

  • パレット: パレット名、リスト、または辞書
    色相変数のさまざまな色のレベル。 color_palette()、または色相レベルを matplotlib の色にマッピングする辞書からいくつかの説明を得ることができます。

  • saturation: float
    色の描画に使用される元の彩度のスケールを制御します。一般に、大きな塗りつぶしは、彩度を少し下げた色の方がよく見えるため、描画色を入力色の仕様と完全に一致させたい場合は、これを 1 に設定します。

  • width: float
    色合いのネストを使用しない場合の完全な要素の幅、またはプライマリ グループ化変数の 1 レベルのすべての要素の幅。

  • dodge:bool
    ティント ネストを使用するときに要素をカテゴリ軸に沿って移動するかどうか。

  • fliersize: float
    外れ値の観測値を表すために使用されるマーカーのサイズ。

  • linewidth: float
    構成要素の灰色の線の幅。

  • whis: float
    上位四分位数と下位四分位数を超えた場合の IQR (四分位間範囲) のスケールを制御し、描画されるひげセグメントを拡張します。この範囲外の点は外れ値として識別されます。

  • notch: boolean
    中央値の信頼区間を示すために四角形を「ノッチ」するかどうか。 plt.boxplot の一部のパラメータを通じて制御することもできます。

  • ax: matplotlib axis
    プロット時に使用される Axes 軸オブジェクト。それ以外の場合は、現在の Axes 軸オブジェクトが使用されます。

  • kwargs: キーと値のマッピング
    描画時に plt.boxplot に渡されるその他のパラメータ

features_per_row = 25

# 计算需要绘制的行数
num_rows = (data.shape[1] + features_per_row - 1) // features_per_row

# 对于每个25个特征的区间绘制一个箱形图
for i in range(num_rows):
    start_col = i * features_per_row
    end_col = min(start_col + features_per_row, data.shape[1])
    data_long = pd.melt(data.iloc[:, start_col:end_col])
    plt.figure(figsize=(12, 6), dpi=300)  # 设定每个图的大小
    sns.boxplot(x='variable', y='value', data=data_long)
    plt.xticks(rotation=90)  # 旋转x轴标签
    plt.tight_layout()
    plt.show()

ここに画像の説明を挿入します

外れ値を自動的に特定して削除します

IQRバージョン

for column in df.select_dtypes(include=[np.number]).columns:
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 300 * IQR
    upper_bound = Q3 + 300 * IQR

    # 确定异常值
    outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
    outlier_values = outliers[column].values
    if len(outlier_values)>0:
        # 打印结果
        print(IQR)
        print(f"特征 '{
      
      column}' 的异常值数量: {
      
      len(outlier_values)}")
        if len(outlier_values) > 0:
            print(f"特征 '{
      
      column}' 的异常值: {
      
      outlier_values}")
        else:
            print(f"特征 '{
      
      column}' 没有检测到异常值。")
        print()  

MADバージョン

df=data

# 定义一个函数来计算MAD
def mad(data, const=0.6745):
    med = np.median(data)
    mad = np.median(np.abs(data - med))
    return mad if mad != 0 else None

# 初始化一个空的索引列表,用于存储异常值所在的行
outlier_indices = []

# 对DataFrame中的每一列应用MAD方法
for column in df.select_dtypes(include=[np.number]).columns:
    median = df[column].median()
    mad_value = mad(df[column])
    
    # 只有当MAD值大于0.1时才进行异常值检测
    if mad_value and mad_value > 0.1:
        # 设置一个异常值阈值,这里使用的是80倍的MAD
        threshold = 100 * mad_value
        lower_bound = median - threshold
        upper_bound = median + threshold

        # 确定异常值
        outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
        outlier_values = outliers[column].values
        
        # 如果找到异常值,将它们的索引添加到列表中
        if len(outlier_values) > 0:
            outlier_indices.extend(outliers.index.tolist())
            # 打印结果
            print(f"特征 '{
      
      column}' 的MAD值: {
      
      mad_value}")
            print(f"特征 '{
      
      column}' 的异常值数量: {
      
      len(outlier_values)}")
            print(f"特征 '{
      
      column}' 的异常值: {
      
      outlier_values}")
            print()

# 删除异常值所在的行
df_cleaned = df.drop(index=set(outlier_indices))

print(f"删除异常值后的数据行数: {
      
      df_cleaned.shape[0]}")

テキストごとに 1 つの単語

几帳面な

おすすめ

転載: blog.csdn.net/weixin_47723732/article/details/134670727