在阐述如何解决这个问题之前,先放一段前因(顺带后果)。
本来是在构建信用风险评级模型的过程遇到了这个问题,如下文。
看完之后,应该可以知道如何解决“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()
# 客户年龄分布如下图所示,可以看到年龄变量大致呈正态分布,符合统计分析的假设。
# 原参考帖中,看原贴客户收入分布图,月收入也大致呈正态分布,符合统计分析的需要。
# 而我们这里呈现的收入分布集中在一条柱子上,看不清分布。我们猜测是异常值影响所致。接下来用箱线图找找异常值。
datatemp2=data["MonthlyIncome"]
datatemp2.plot(kind='box',title='MonthlyIncome Distribution',sym='r+');
# 果然被异常值影响了,那接下来我们先把异常值分拆出去。
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
# 来个快速版的直方图
data.hist(bins=50, figsize=(20,15))
plt.show()
# 发现挺多变量含有异常值影响了直方图分布。
# 用箱线图看看异常值
plt.figure(figsize=(16,8))
data.plot(kind='box',title='Various Var Distribution',sym='r+');
# 因为各个变量的数量级相差较大,直接放一起,无法观察。后面如有需要,再分开观察。此处不过多赘述。