解决Python直方图显示成一条柱子,无法分布显示 -- 查因是异常值影响

在阐述如何解决这个问题之前,先放一段前因(顺带后果)。

本来是在构建信用风险评级模型的过程遇到了这个问题,如下文。
看完之后,应该可以知道如何解决“Python直方图画成一根柱子”的问题了。


(以下不是可直接运行代码,还需导入相应模块和数据。)

# 四、探索性分析

# 在建立模型之前,我们一般会对现有的数据进行 探索性数据分析(Exploratory Data Analysis)。
# EDA是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索。
# 常用的探索性数据分析方法有:直方图、散点图和箱线图等。
plt.figure(figsize=(12,8))
bins=30

plt.subplot(211)
ax1= plt.hist(data.age, bins, color="green", alpha=0.8,rwidth=0.9)
plt.title("Age distribution")
plt.ylabel('# of age', fontsize=12)
plt.xlabel('age', fontsize=12)

plt.subplot(212)
ax2= plt.hist(data.MonthlyIncome,bins,color="green",alpha=0.8,rwidth=0.9)
plt.title("MonthlyIncome distribution")
plt.ylabel('# of MonthlyIncome', fontsize=12)
plt.xlabel('MonthlyIncome', fontsize=12)

plt.show()

# 客户年龄分布如下图所示,可以看到年龄变量大致呈正态分布,符合统计分析的假设。

# 原参考帖中,看原贴客户收入分布图,月收入也大致呈正态分布,符合统计分析的需要。
# 而我们这里呈现的收入分布集中在一条柱子上,看不清分布。我们猜测是异常值影响所致。接下来用箱线图找找异常值。

解决Python直方图显示成一条柱子,无法分布显示 -- 查因是异常值影响_第1张图片

datatemp2=data["MonthlyIncome"]
datatemp2.plot(kind='box',title='MonthlyIncome Distribution',sym='r+');

# 果然被异常值影响了,那接下来我们先把异常值分拆出去。

解决Python直方图显示成一条柱子,无法分布显示 -- 查因是异常值影响_第2张图片

print(data[data['MonthlyIncome'] > 50000].count())

# 如前文处理'NumberOfTime30-59DaysPastDueNotWorse'异常值的方式,直接剔除异常值
data = data[data['MonthlyIncome'] < 50000]
# 上述语句的阈值,从100万尝试到50万尝试到10万,再到6万,5万,最终确定5万。

# 重新查看收入直方图分布
plt.figure(figsize=(15,5))
plt.hist(data.MonthlyIncome,bins,color="green",alpha=0.8,rwidth=0.9)
plt.title("MonthlyIncome distribution")
plt.ylabel('# of MonthlyIncome', fontsize=12)
plt.xlabel('MonthlyIncome', fontsize=12)

plt.show()

# 所以,从客户收入分布图看出,月收入也大致呈正态分布,符合统计分析的需要。
# 另外,剔除掉的月收入异常值,有301个,在12万的数据量中可忽略不计。
SeriousDlqin2yrs                        301
RevolvingUtilizationOfUnsecuredLines    301
age                                     301
NumberOfTime30-59DaysPastDueNotWorse    301
DebtRatio                               301
MonthlyIncome                           301
NumberOfOpenCreditLinesAndLoans         301
NumberOfTimes90DaysLate                 301
NumberRealEstateLoansOrLines            301
NumberOfTime60-89DaysPastDueNotWorse    301
NumberOfDependents                      301
dtype: int64

解决Python直方图显示成一条柱子,无法分布显示 -- 查因是异常值影响_第3张图片

# 来个快速版的直方图

data.hist(bins=50, figsize=(20,15))
plt.show()

# 发现挺多变量含有异常值影响了直方图分布。

解决Python直方图显示成一条柱子,无法分布显示 -- 查因是异常值影响_第4张图片

# 用箱线图看看异常值
plt.figure(figsize=(16,8))
data.plot(kind='box',title='Various Var Distribution',sym='r+');
# 因为各个变量的数量级相差较大,直接放一起,无法观察。后面如有需要,再分开观察。此处不过多赘述。

解决Python直方图显示成一条柱子,无法分布显示 -- 查因是异常值影响_第5张图片

你可能感兴趣的:(练手纠错帖集结)