数值型变量的可视化

2019-02-18  本文已影响37人  apricoter

一、直方图与核密度曲线

直方图一般用来观察数据的分布形态,横坐标代表数值的均匀分段,纵坐标代表每个段内的观测数量(频数)

按性别分组,研究不同性别下年龄分布的差异

通过seaborn模块中的distplot函数

import seaborn as sns
# 读入数据
Titanic = pd.read_csv(r'F:\titanic_train.csv')
Titanic.head()

以Titanic数据集为例


# 检查年龄是否有缺失
any(Titanic.Age.isnull())
# 不妨删除含有缺失年龄的观察
Titanic.dropna(subset=['Age'], inplace=True)
# 再检查年龄是否有缺失
any(Titanic.Age.isnull())

1.直方图和核密度图

# 取出男性年龄
Age_Male = Titanic.Age[Titanic.Sex == 'male']
# 取出女性年龄
Age_Female = Titanic.Age[Titanic.Sex == 'female']

# 绘制男女乘客年龄的直方图
sns.distplot(Age_Male, bins = 20, kde = True, hist_kws = {'color':'steelblue'}, label = '男性')
# 绘制女性年龄的直方图
sns.distplot(Age_Female, bins = 20, kde = True, hist_kws = {'color':'purple'}, label = '女性')
plt.title('男女乘客的年龄直方图')
# 显示图例
plt.legend()
# 显示图形
plt.show()

2.直方图

# 取出男性年龄
Age_Male = Titanic.Age[Titanic.Sex == 'male']
# 取出女性年龄
Age_Female = Titanic.Age[Titanic.Sex == 'female']

# 绘制男女乘客年龄的直方图
sns.distplot(Age_Male, bins = 20, kde = False, hist_kws = {'color':'steelblue'}, label = '男性')
# 绘制女性年龄的直方图
sns.distplot(Age_Female, bins = 20, kde = False, hist_kws = {'color':'purple'}, label = '女性')
plt.title('男女乘客的年龄直方图')
# 显示图例
plt.legend()
# 显示图形
plt.show()

从直方图来看,女性年龄的分布明显比男性矮,说明在各年龄段下,男性乘客要比女性乘客多

3.核密度图

# 绘制男女乘客年龄的核密度图
sns.distplot(Age_Male, hist = False, kde_kws = {'color':'red', 'linestyle':'-'}, 
             norm_hist = True, label = '男性')
# 绘制女性年龄的核密度图
sns.distplot(Age_Female, hist = False, kde_kws = {'color':'black', 'linestyle':'--'}, 
             norm_hist = True, label = '女性')
plt.title('男女乘客的年龄核密度图')
# 显示图例
plt.legend()
# 显示图形
plt.show()

从核密度图可以看出,男女性别的年龄分布趋势比较接近,说明在各年龄段下的男女乘客人数同步增加或减少。

二、箱线图

箱线图也可以体现数据分布,还可以发现数据中的异常点

一般绘制分组箱线图,即二手房单价按照分组变量(例如行政区域、楼层、朝向等)进行对比分析

通过seaborn模块中的boxplot函数

# 读取数据
Sec_Buildings = pd.read_excel(r'F:\sec_buildings.xlsx')
Sec_Buildings.head()

以某平台二手房单价数据为例


# 二手房在各行政区域的平均单价
group_region = Sec_Buildings.groupby('region')
avg_price = group_region.aggregate({'price_unit':np.mean}).sort_values('price_unit', ascending = False)

# 绘制分组箱线图
sns.boxplot(x = 'region', y = 'price_unit', data = Sec_Buildings, 
            order = avg_price.index, showmeans=True,color = 'steelblue',
            flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3}, 
            meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4},
            medianprops = {'linestyle':'--','color':'orange'}
           )
# 更改x轴和y轴标签
plt.xlabel('')
plt.ylabel('单价(元)')
# 添加标题
plt.title('不同行政区域的二手房单价对比')
# 显示图形
plt.show()

order表示按照平均价格降序排列,fileprops设置异常点的属性,meanprops设置均值的属性,medianprops设置中位数的属性


图中上下两条横线代表上下须、箱体的上下两条横线代表上下四分位数、箱体中的虚线代表中位线、箱体中的点则为均值、上下须两端的点代表异常值

三、小提琴图

将数值型数据的核密度图和箱线图融合在一起,进而形成小提琴图

通过seaborn模块中的violinplot函数

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
# 读入数据
tips = pd.read_csv(r'F:\tips.csv')
tips.head()

以酒吧的消费数据为例


# 设置绘图风格(不妨使用R语言中的ggplot2风格)
plt.style.use('ggplot')
# 绘制分组小提琴图
sns.violinplot(x = "day", # 指定x轴的数据
               y = "total_bill", # 指定y轴的数据
               hue = "sex", # 指定分组变量
               data = tips, # 指定绘图的数据集
               order = ['Thur','Fri','Sat','Sun'], # 指定x轴刻度标签的顺序
               scale = 'count', # 以男女客户数调节小提琴图左右的宽度
               split = True, # 将小提琴图从中间割裂开,形成不同的密度曲线;
               palette = 'RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量)
              )
# 添加图形标题
plt.title('每天不同性别客户的消费额情况')
# 设置图例
plt.legend(loc = 'upper center', ncol = 2)
# 显示图形
plt.show()

scale:用于调整小提琴图左右的宽度,如果为area,则表示每个小提琴图左右部分拥有相同的面积;如果为count,则表示根据样本数量来调节宽度;如果为width,则表示每个小提琴图左右两部分拥有相同的宽度


每个小提琴左右两边代表了不同性别客户的消费额分布。
以周五周六为例,周五的男女客户数量差异不大,而周六男性客户比女性客户多,因为右半边的核密度图更宽一些。

四、折线图

一般用于拟合时间序列数据

通过matplotlib模块中的plot函数

import matplotlib.pyplot as plt
# 读入数据
wechat = pd.read_excel(r'F:\wechat.xlsx')
wechat.head()

以某微信公众号的阅读人数和阅读人次为例


1. 绘制单条折线图

# 绘制单条折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Counts, # y轴数据
         linestyle = '-', # 折线类型
         linewidth = 2, # 折线宽度
         color = 'steelblue', # 折线颜色
         marker = 'o', # 折线图中添加圆点
         markersize = 6, # 点的大小
         markeredgecolor='black', # 点的边框色
         markerfacecolor='brown') # 点的填充色
# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数趋势')
# 显示图形
plt.show()

折线类型:
-(一个减号) 实心线
--(两个减号) 虚线
-.(减句号) 虚线和点构成的线
:(英文冒号) 点构成的线

点的类型:
.(英文句号) 实心点
o(小写字母) 空心点

2,绘制两条折线图

如何将阅读人数和人次同时呈现在图中?
对于x轴的刻度标签,是否可以只保留月份和日期,并且以7天作为间隔?

# 绘制两条折线图
# 导入模块,用于日期刻度的修改
import matplotlib as mpl
# 绘制阅读人数折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Counts, # y轴数据
         linestyle = '-', # 折线类型,实心线
         color = 'steelblue', # 折线颜色
         label = '阅读人数'
         )
# 绘制阅读人次折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Times, # y轴数据
         linestyle = '--', # 折线类型,虚线
         color = 'indianred', # 折线颜色
         label = '阅读人次'
         )

# 获取图的坐标信息
ax = plt.gca()
# 设置日期的显示格式  
date_format = mpl.dates.DateFormatter("%m-%d")  
ax.xaxis.set_major_formatter(date_format) 
# 设置x轴显示多少个日期刻度
# xlocator = mpl.ticker.LinearLocator(10)
# 设置x轴每个刻度的间隔天数
xlocator = mpl.ticker.MultipleLocator(7)
ax.xaxis.set_major_locator(xlocator)
# 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度
plt.xticks(rotation=45)

# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数与人次趋势')
# 添加图例
plt.legend()
# 显示图形
plt.show()

plt.show自动将两条折线呈现在一张图中
通过ax获取原始状态的轴属性后,基于ax对象修改刻度的显示方式


上一篇下一篇

猜你喜欢

热点阅读