- 使用2来代替大于2的值
revNew = [] for val in df.RevolvingUtilizationOfUnsecuredLines: if val <= 2: revNew.append(val) else: revNew.append(2.)
再次分箱
对age分箱
df.age.plot.box(grid=True)
发现 age 属性中存在0值情况,而这些数据明显是异常值,因此对其进行处理 df = df[df["age"] > 0]
对三个属性进行分箱
df.boxplot(column=["NumberOfTime30-59DaysPastDueNotWorse", "NumberOfTime60-89DaysPastDueNotWorse", "NumberOfTimes90DaysLate"],rot=30) rot:int或float,默认为0 标签的旋转角度(以度为单位)相对于屏幕坐标
上面的箱线图可以看出 NumberOfTime30-59DaysPastDueNotWorse,NumberOfTime60-89DaysPastDueNotWorse,NumberOfTimes90DaysLate三个特征都存在两个异常值
查看具体的异常值
df["NumberOfTime30-59DaysPastDueNotWorse"].unique() df["NumberOfTime60-89DaysPastDueNotWorse"].unique() df["NumberOfTimes90DaysLate"].unique()
可以看出96和98是异常值数据
- 用指定列数据的中位数来替换异常值
def replaceOutlier(data): New = [] med = data.median() for val in data: if ((val == 98) | (val == 96)): New.append(med) else: New.append(val) return New
删除了异常值之后 再看这3个列的箱线图
查看DebtRatio的箱线图
第一个参数是 指定列数据 第二个参数是 阈值 如果列数据是数组 则转换成array shape返回是数据表的矩阵行列数 对于矩阵的行数 也可以使len(x)函数输出的矩阵长度 也就是所谓的行数 对数列中的每一行取中位数 再用每一行中的每一个数据减去中位数 再对差值取中位数 再用一个公式 norm.ppf(0.75) * (每个数据和中位数差距) / 每个中位数的中位数 得到一个异常值分值 分值大于阈值的话 返回true 分值小于阈值返回false