1.项目背景
在我们逛电商网站的时候,经常会收到一些推销活动的通知,但是我们之前也没关注过那个商品,这些电商网站推销给我们这个商品是基于哪些影响因素呢?
研究表明,电商网站,可以根据用户的年龄、性别、地址以及历史数据等等信息,将其分为,比如“年轻白领”、“一家三口”、“家有一老”、”初得子女“等等类型,然后判断你属于其中的某一类,电商网站根据这类用户的特征向其发起不同的优惠活动。电商网站是如何利用用户的这些数据将用户分为不同的类别是目前要解决的重要问题。
2.项目简介
2.1项目内容
本项目将对电商网站给客户推销活动的影响因素进行分析,帮助运营商发现并改善客户体验,以及帮助运营商根据客户的实际情况,选择最适合客户的活动产品。主要研究以下问题:
1)分析客户指标与是否购买产品的关系;
2)尝试找到合适的模型预测流失客户;
3)针对性给出增加给客户推销促销活动精准性的建议。
2.2数据说明
实验使用客户是否购买产品及自身情况数据集进行分析,该数据集有13个字段,共600条记录,每条记录包含了唯一客户的指标。我们的目标就是发现前面的指标和最后一列客户是否购买产品指标之间的关系。数据如图 1所示。
图 1原始数据信息
该数据集每个指标名称及其含义说明如表 2‑1所示。
表 1数据指标及其说明
指标名称 |
指标描述 |
值域 |
ID |
客户识别号 |
[12101,12400] |
Age |
年龄 |
[18,67] |
Gender |
客户性别 |
Male 男;Female 女 |
Habitat |
居住地点 |
City_center 城市中心; Small_town 小城镇; Rural 农村; Suburban 郊区 |
Income |
年收入,单位为美元 |
[60392,505040] |
Married |
婚姻状况 |
Yes 已婚;No 未婚 |
Children |
儿童数量 |
[0,3] |
Car |
拥有一辆车吗? |
Yes 有;No 没有 |
Savings_Account |
拥有储蓄账户? |
Yes 有;No 没有 |
Current_Account |
拥有一个经常账户? |
Yes 有;No 没有 |
Loan |
未偿还贷款? |
Yes 有;No 没有 |
Family_Quotient |
收入与子女人数之间的比率 |
[20280,492400] |
Product |
客户购买了产品吗? |
Yes 买了;No 没有购买 |
2.3技术工具
本项目使用jupyter notebook,以Python语言为基础,对数据集进行数据整理和统计分析,用matplotlib、seaborn进行可视化呈现.
3.项目实施步骤
3.1数据分析步骤
3.1.1导入模块
import numpy as np import pandas as pd import matplotlib.pyplot as plt import sklearn from sklearn.preprocessing import LabelEncoder from sklearn import tree import warnings warnings.filterwarnings("ignore")
3.1.2获取数据
fdata = pd.read_excel("电商数据.xlsx") fdata.head()
3.2数据描述性分析
3.2.1查看数据维度
print(fdata.shape)
(600, 13)
数据共有600行,13列
3.2.2查看数据类型
Print(fdata.dtypes)
数据类型都正常,不需要进行处理
3.3数据预处理
在现实生活问题中,我们得到的原始数据往往非常混乱、不全面,机器学习模型往往无法从中有效识别并提取信息。数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已,真实的训练数据总是存在各种各样的问题:各特征(变量)的尺度(量纲)和数量级差异大、存在噪声:包含错误和异常值、存在缺失值、存在冗余特征(变量)等问题,存在上述问题的数据有时也称为“脏数据”,这些“脏数据”会影响机器学习模型预测的有效性(有时会得到相反的结论)、可重复性和泛化能力,从而影响模型的质量。因此在采集完数据后,机器学习建模的首要步骤以及主要步骤便是数据预处理。
数据预处理就是一种数据挖掘技术,本质就是为了将原始数据转换为可以理解的格式或者符合我们挖掘的格式。它可以改进数据的质量,从而有助于提高其后的挖掘过程的准确率和效率,得到高质量的数据。
查看是否有缺失值
fdata.isnull().sum()
数据没有缺失值,不需要进行处理
查看是否存在重复值
any(fdata.duplicated())
False
结果为False,说明不存在重复值,反之则存在
3.4数据可视化分析
3.4.1客户产品购买情况分析
#客户购买产品的人数情况 ProductDf=fdata['Product'].value_counts().to_frame() x=ProductDf.index y=ProductDf['Product'] plt.bar(x,y,width = 0.5,color = 'b') plt.title('Product(Yes/No) Num') plt.show()
通过柱状图可以查看在被调研的电商客户中,购买了产品和没购买产品的电商客户数量。如图 6所示,大约有350左右的客户没有购买电商网站推销的产品,说明推销的产品并没有对客户进行精准的定位。
# 客户购买产品比例饼图 fig = plt.figure(figsize=(8,8)) plt.pie(fdata['Product'].value_counts(), labels=fdata['Product'].value_counts().index, autopct='%1.2f%%',explode=(0.1,0)) plt.title('Product(Yes/No) Ratio') plt.show()
接下来通过饼图查看没购买产品的客户在所调研的客户中所占的比例,如图7所示。通过下图可知,没购买产品的电商客户在选取的客户中所占的比例要远大于购买了产品的客户,没购买产品的客户占比达54.33%。
3.4.2客户属性分析
客户属性包括Gender(性别)、Habitat(居住地)、Income(收入)、Married(婚姻状况)、Children(儿童数量)、Car(是否有车)、Savings_Account(是否有储蓄银行)、Loan(是否有未偿还贷款)八项指标。
1.性别、居住地和是否购买产品的关系分别如图8、图9所示
图8性别与购买产品与否的关系
图9居住地与购买产品与否的关系
2.婚姻状况和是否购买产品的关系
图10婚姻状况与购买产品与否的关系
3.孩子数量和是否购买产品的关系
图11孩子数量与购买产品与否的关系
4.是否有车和是否购买产品的关系
图12是否有车与购买产品与否的关系
5.是否有储蓄账户和是否购买产品的关系
图13是否有储蓄账户与购买产品与否的关系
6.是否有未偿还贷款和购买产品与否的关系
图14是否偿还贷款与购买产品与否的关系
通过对客户属性的分析,得到以下结论:
- 客户是否购买产品与性别关系不大;
- 居住在郊区的客户购买产品比例相比较居住在城市中心、小城镇、农村的客户而言要高,居住在城市中心和小城镇购买产品的比例大致相等,而居住在农村的客户购买产品的比例最低;
- 已婚的客户与未婚的客户相比,购买产品的人数明显较少;
- 孩子数量的多少与客户是否购买产品存在着正向相关关系。孩子数量越多,购买产品的客户人数就会减少,而没有孩子的客户数量与家里有两个孩子的客户购买产品的数量大致持平;
- 是否有车和是否有未偿还贷款与客户是否购买产品的关系结论一样。是否有车和是否有未偿还贷款与客户买不买产品没有关系;
- 有储蓄账户的客户相较于没有储蓄账户的客户而言,购买产品的人数相对较少。
3.5建立模型
3.5.1特征工程
# 对数据进行编码处理 fdata['Gender'] = fdata['Gender'].apply(lambda x:0 if x=='F' else 1) fdata['Married'] = fdata['Married'].apply(lambda x:0 if x=='No' else 1) fdata['Car'] = fdata['Car'].apply(lambda x:0 if x=='No' else 1) fdata['Savings_Account'] = fdata['Savings_Account'].apply(lambda x:0 if x=='No' else 1) fdata['Current_Account'] = fdata['Current_Account'].apply(lambda x:0 if x=='No' else 1) fdata['Loan'] = fdata['Loan'].apply(lambda x:0 if x=='No' else 1) fdata['Product'] = fdata['Product'].apply(lambda x:0 if x=='No' else 1) fdata['Habitat'] = fdata['Habitat'].replace(to_replace={'Rural':0,'Small_town':1,'Suburban':2,'City_center':3}) fdata.head()
# 对Income和Family_Quotient标准化处理 from sklearn.preprocessing import StandardScaler ss = StandardScaler() ss.fit(fdata[['ID','Age','Income','Family_Quotient']]) result = ss.transform(fdata[['ID','Age','Income','Family_Quotient']]) result_data = pd.DataFrame(result,columns=['ID','Age','Income','Family_Quotient']) fdata['Income'] = result_data['Income'] fdata['Family_Quotient'] = result_data['Family_Quotient'] fdata['Age'] = result_data['Age'] fdata['ID'] = result_data['ID'] fdata.head()
3.5.2准备数据
# 准备数据 from sklearn.model_selection import train_test_split X = fdata.drop('Product',1) y = fdata['Product'] x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
3.5.3构建模型
1.决策树模型
# 决策树模型 from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import confusion_matrix,accuracy_score,classification_report tree = DecisionTreeClassifier() tree.fit(x_train,y_train) y_pred = tree.predict(x_test) print('模型准确率',accuracy_score(y_test,y_pred)) print('混淆矩阵',confusion_matrix(y_test,y_pred)) print('分类报告',classification_report(y_test,y_pred))
2.逻辑回归模型
# 逻辑回归模型 from sklearn.linear_model import LogisticRegression lg = LogisticRegression() lg.fit(x_train,y_train) y_pred = lg.predict(x_test) print('模型准确率',accuracy_score(y_test,y_pred)) print('混淆矩阵',confusion_matrix(y_test,y_pred)) print('分类报告',classification_report(y_test,y_pred))
3.随机森林模型
# 随机森林模型 from sklearn.ensemble import RandomForestClassifier import numpy as np rfc = RandomForestClassifier() rfc.fit(x_train,y_train) y_pred = rfc.predict(x_test) print('模型准确率',accuracy_score(y_test,y_pred)) print('混淆矩阵',confusion_matrix(y_test,y_pred)) print('分类报告',classification_report(y_test,y_pred)) #打印特征重要性评分 feat_labels = x_train.columns[0:] importances = rfc.feature_importances_ indices = np.argsort(importances)[::-1] print('特征重要程度排名') for f,j in zip(range(x_train.shape[1]-1),indices): print(f + 1, feat_labels[j], importances[j])
从三个模型的结果中,我们看出随机森林模型的准确率最高,且从得出的特征重要程度排名中,我们看出收入与子女人数之间的比率、儿童数量、收入等特征因素的重要程度较大,即电商网站推销商品的影响因素中,收入与子女人数之间的比率、儿童数量、收入影响最大。
4.实验总结
4.1结果分析
根据以上分析,得到不会购买产品客户的指标:
- 居住在农村的客户购买产品较少;
- 对于已婚客户而言,除了自己的开销以外,还要兼顾家庭的开销,这使得这部分客户购买产品会考虑到更多的因素,已婚客户购买产品的可能性较未婚客户而言较小;
- 对于与孩子的客户而言,养孩子平常的开销非常大,孩子越多,花销越大。但没有孩子的客比有孩子的客户购买产品的可能性更小,这是因为多了一个孩子需要给孩子买各种各样的东西,比如玩具、孩子衣服这类的东西;
- 有储蓄账户的客户对自己的存款和开销平常有一个较为清楚的概念,因此这类客户购买产品大多不会冲动消费,会从自身实际进行考虑,购买推销产品的可能性较小;
4.2改善建议
为了使客户购买推销活动的产品,就要根据不同的人群,推销给他们真正需要的产品,给出如下建议:
- 客户方面:针对已婚、有孩子的客户可以推出定制服务如优惠套餐、实惠套餐等,即买回家全家人都可以使用的一套产品,;一方面家庭购买不仅量大而且更实惠,另一方对这类客户提供个性化服务。
- 对于居住在郊外的客户,外出购买东西不太方便,然而一些生活必需品又是不得不买的,网上购物是个不错的选择。针对这类客户,电商推销活动产品可以更倾向于生活必需品这类产品的推荐。
4.3实验心得
通过做这次报告,我学习到了很多的新知识,之前学习的时候感觉到这门课程非常的难学,做完报告之后,对之前学习的知识有了更深刻的理解。现在体会到了老师上课讲的要想学好这门课程重在练习,通过写代码、运行程序才能找到问题所在,才能理解每一行代码实际的意思。
在写报告的过程中,不仅让我学会把书本中的东西应用于实践,而且提高了我独立思考问题、自己动手操作的能力,也学会了更好的运用网络解决问题。在写代码的时候,有的时候运行不出来出现报错,就通过在网上查找资料直到程序运行成功,实实在在地掌握到了一些实践应用的技巧。
这次报告使我意识到,我们现在处于一个信息爆炸的时代,各种各样的的数据层出不穷,这就要求我们在选择数据的时候要学会筛选与处理,要想高效率的完成工作,掌握Python技能就显得尤为重要。
通过此次报告,我深刻地意识到学习还是要靠自学,老师起到的是指引和启蒙的作用,要想真正掌握一门技能只有通过自己主动学习,遇到不会的东西,通过自己先查资料自己解决,这样印象会更加深刻,逐渐总结经验,这样一定会取得收获与成就。
总而言之,通过这次报告,使我学会了把在课上学习到的理论知识应用于实践,在以后的学习乃至工作中继续学习,不断进步。