数据源:Kaggle网站上一个“blackFriday.csv”文件(Kaggle网站是一个流行的数据科学竞赛平台),下载下来的数据字段如下:
本节通过该数据,练习使用数据的三维图形化、字段之间的相关性及相关性热力图,直观地查看出哪些因素影响购买力,其三维散点图是怎样的。
一、怎样查看哪些因素影响购买力?方法1:逐一探索各字段对购买力的影响趋势
数据量较小时,可以逐一查看每个字段与购买额字段的相关系数。相关系数较大的,影响力就大。
而本文件数据量较大(53万条),不便直接展示各字段与购买额之间的散点图,所以可将研究字段比如年龄,可以按年龄段分组后取均值,然后再研究。
但该方法需要研究的字段较多,逐一探索的方法效率较低。因此考虑使用方法2。
方法2:使用Dataframe的corr()函数查看各字段之间的相关性
该方法可以更快地分析出各字段之间的相关性,自然也可以看出每个字段与购买额字段的相关系数,从而更快捷、更方便地观察出最具影响力的属性。
二、图形化展示某因素对购买力的影响根据方法2,逐步在python中实现,步骤如下:
Step1、看各因素之间的相关性
使用pd.read_csv()读入数据,生成DataFrame类型的变量。
使用dataframe.corr(),查看各字段之间的相关性。
【脚本及结果】
我们发现,没有年龄、城市类别和居住时长与其他字段之间的关联,原因是,这三个字段的值不是数值类型的。
将其转换为数值类型后,重新查看各字段之间的相关性。
【脚本】
import pandas as pd
data = pd.read_csv(r'D:\cpda\python\data\BlackFriday.csv')
pd.set_option('display.max_columns', None)
# 将年龄、居住时长调整为数值型
data['Age'] = data['Age'].apply(lambda x: x[0])
# 表示输入一个字符串x,输出x[0] , 在此不能直接使用int()函数,因为系统认为apply(lambda x: x[0])是一个序列
data.loc[data['Stay_In_Current_City_Years'] == '4+', 'Stay_In_Current_City_Years'] = 4 # 将该列异常数据用正常数据代替
data['Age'] = data['Age'].astype(int) # 数据类型转换
data['Stay_In_Current_City_Years'] = data['Stay_In_Current_City_Years'].astype(int)corr1 = data.corr()
print(corr1)【结果】
相关性矩阵
显然,这里数据量较大,不太容易一眼看出哪些字段相关性较强,所以我们需要可视化。
Step2、将相关性图形化
Seaborn是基于matplotlib的图形可视化python包,它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。Seaborn要求原始数据的输入类型为 pandas 的 Dataframe或 Numpy 数组。
这里我们使用他的heatmap()和clustermap()两个函数,可以展现相关性热力图,以及聚类情况。【脚本】sbn.heatmap(corr1)
sbn.clustermap(corr1)
plt.show()【结果】
heatmap()的结果由heatmap()与相关性矩阵来看,与销售额相关性较强的属性并不多,甚至产品类别1和产品类别2还与购买力成负相关。年龄好像与购买力有相关性,但比较弱。
此外,我们从图中还可以看出,年龄与婚否有相关性,这与我们的正常认知一致。几个产品类别之间也有较强的相关性。当然这些不在我们本次研究范围内。
我们再看clustermap()的结果:
clustermap()的结果
对比heatmap()图和clustermap()图,发现后者将系数相近的类别聚在了一些,全图深色浅色各聚一簇,以便我们做聚类分析。
Step3、看单一因素的影响力
因为我们研究的目标是“什么样的用户购买的更多”,所以尽管产品类别与销售额有明显地负相关性,却因不是研究主体“人”的属性,所以在此不做仔细观察。我们着重看人的年龄、职业、居住时长及婚否这些属性,可以详细查看相应的散点图。如:
因数据量较大,散点图太多,可以将年龄等字段分组后取均值,以看整体效果。
【脚本】
# 将年龄、居住时长调整为数值型
data['Age'] = data['Age'].apply(lambda x: x[0])
# 表示输入一个字符串x,输出x[0] , 在此不能直接使用int()函数,因为系统认为apply(lambda x: x[0])是一个序列
data.loc[data['Stay_In_Current_City_Years'] == '4+', 'Stay_In_Current_City_Years'] = 4 # 将该列异常数据用正常数据代替
data['Age'] = data['Age'].astype(int) # 数据类型转换
data['Stay_In_Current_City_Years'] = data['Stay_In_Current_City_Years'].astype(int)
y = data[['Purchase']].groupby(data['Age']).mean()
z = data[['Purchase']].groupby(data['Stay_In_Current_City_Years']).mean()
# 可视化相关性,二维
plt.scatter(y['Purchase'], y.index, c=y['Purchase']/10, s=y['Purchase']/10)
plt.show()
plt.scatter(z['Purchase'], z.index, c=z['Purchase']/10, s=z['Purchase']/10)
plt.show()
【结果】
年龄与购买额相关性
居住时长与购买额相关性
从上图可以看出,年龄、及居住时长都会对购买力产生影响。
此外,我们还可以查看这些因素的三维散点图。方法如下:
【脚本】
from mpl_toolkits.mplot3d import axes3d
result = data.groupby([data['Stay_In_Current_City_Years'], data['Age']]).mean()
# ax =plt.subplot(projection='3d')
fig = plt.figure('3D scatter')
ax3d = axes3d.Axes3D(fig)
ax3d.scatter(result['Purchase'], result.index.codes[0], result.index.codes[1],
color=cm.ScalarMappable().to_rgba(result['Purchase']), s=200)
plt.show()
【结果】
【看图分析】
上图中,X轴为购买额,Y轴为居住时长,Z轴为年龄段,我们可以看到:随着年龄段和居住时间的增加,购物额也在不断增加。
【特别说明】
针对3d可视化脚本,老师讲使用以下脚本即可:
ax =plt.subplot(projection='3d')
ax.scatter(result['Purchase'], result.index.codes[0], result.index.codes[1],
color=cm.ScalarMappable().to_rgba(result['Purchase']), s=200)
但实际在我机器上使用时,却报“Unknown projection '3d'”的错误,百度一下,发现“matplotlib版本和python版本的更新问题”,所以使用了以上解决方案。见https://blog.csdn.net/weixin_40051325/article/details/102896416
三、总结对我个人来说,本节学到的内容有:
1、 数据相关性的分析方法,使用dataframe.corr()
2、 相关性的图形化展示,使用Seaborn库下的heatmap()和clustermap()两个函数
3、 3d图形展示时,如果不能直接使用plt.subplot(projection='3d'),则引入axes3d( 3D图形绘制)。