解决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()

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

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

在这里插入图片描述

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+');
# 因为各个变量的数量级相差较大,直接放一起,无法观察。后面如有需要,再分开观察。此处不过多赘述。

在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Python中画出一条柱子是渐变色的柱状图,可以使用matplotlib库中的color模块以及patches模块。具体实现步骤如下: 1. 导入需要的库 ```python import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.patches import Rectangle ``` 2. 创建数据 ```python x = np.arange(5) # 柱状图的横坐标 y = [2, 5, 8, 3, 6] # 柱状图的纵坐标 ``` 3. 创建颜色映射 ```python gradient = np.linspace(0, 1, 256) colors = cm.get_cmap('rainbow')(gradient) ``` 这里使用cm.get_cmap('rainbow')创建了一个颜色映射,它会根据数据的值自动转换对应的颜色。 4. 绘制柱状图 ```python fig, ax = plt.subplots() # 绘制一条渐变色柱子 rect = Rectangle((0, 0), 1, max(y), color=colors[0]) ax.add_patch(rect) # 绘制其他普通柱子 for i in range(1, len(x)): ax.bar(x[i], y[i], color=colors[i]) ax.set_xlim([-1, len(x)]) plt.show() ``` 这里使用ax.add_patch()函数绘制了一个Rectangle对象,它的左下角坐标是(0, 0),宽度是1,高度是y的最大值,颜色设置为颜色映射的第一个颜色colors[0]。然后使用循环,绘制其他普通柱子,颜色也是根据颜色映射自动设置的。 完整代码如下: ```python import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.patches import Rectangle x = np.arange(5) y = [2, 5, 8, 3, 6] gradient = np.linspace(0, 1, 256) colors = cm.get_cmap('rainbow')(gradient) fig, ax = plt.subplots() rect = Rectangle((0, 0), 1, max(y), color=colors[0]) ax.add_patch(rect) for i in range(1, len(x)): ax.bar(x[i], y[i], color=colors[i]) ax.set_xlim([-1, len(x)]) plt.show() ``` 运行代码,就可以得到一条柱子是渐变色的柱状图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值