目录
在我们逛电商网站的时候,经常会收到一些推销活动的通知,但是我们之前也没关注过那个商品,这些电商网站推销给我们这个商品是基于哪些影响因素呢?
研究表明,电商网站,可以根据用户的年龄、性别、地址以及历史数据等等信息,将其分为,比如“年轻白领”、“一家三口”、“家有一老”、”初得子女“等等类型,然后判断你属于其中的某一类,电商网站根据这类用户的特征向其发起不同的优惠活动。电商网站是如何利用用户的这些数据将用户分为不同的类别是目前要解决的重要问题。
本项目将对电商网站给客户推销活动的影响因素进行分析,帮助运营商发现并改善客户体验,以及帮助运营商根据客户的实际情况,选择最适合客户的活动产品。主要研究以下问题:
1)分析客户指标与是否购买产品的关系;
2)尝试找到合适的模型预测流失客户;
3)针对性给出增加给客户推销促销活动精准性的建议。
实验使用客户是否购买产品及自身情况数据集进行分析,该数据集有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 没有购买 |
本项目使用jupyter notebook,以Python语言为基础,对数据集进行数据整理和统计分析,用matplotlib、seaborn进行可视化呈现.
- 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")
- fdata = pd.read_excel("电商数据.xlsx")
-
- fdata.head()

print(fdata.shape)
(600, 13)
数据共有600行,13列
Print(fdata.dtypes)

数据类型都正常,不需要进行处理
在现实生活问题中,我们得到的原始数据往往非常混乱、不全面,机器学习模型往往无法从中有效识别并提取信息。数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已,真实的训练数据总是存在各种各样的问题:各特征(变量)的尺度(量纲)和数量级差异大、存在噪声:包含错误和异常值、存在缺失值、存在冗余特征(变量)等问题,存在上述问题的数据有时也称为“脏数据”,这些“脏数据”会影响机器学习模型预测的有效性(有时会得到相反的结论)、可重复性和泛化能力,从而影响模型的质量。因此在采集完数据后,机器学习建模的首要步骤以及主要步骤便是数据预处理。
数据预处理就是一种数据挖掘技术,本质就是为了将原始数据转换为可以理解的格式或者符合我们挖掘的格式。它可以改进数据的质量,从而有助于提高其后的挖掘过程的准确率和效率,得到高质量的数据。
查看是否有缺失值
fdata.isnull().sum()

数据没有缺失值,不需要进行处理
查看是否存在重复值
any(fdata.duplicated())
False
结果为False,说明不存在重复值,反之则存在
- #客户购买产品的人数情况
- 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%。
客户属性包括Gender(性别)、Habitat(居住地)、Income(收入)、Married(婚姻状况)、Children(儿童数量)、Car(是否有车)、Savings_Account(是否有储蓄银行)、Loan(是否有未偿还贷款)八项指标。

图8性别与购买产品与否的关系

图9居住地与购买产品与否的关系
2.婚姻状况和是否购买产品的关系

图10婚姻状况与购买产品与否的关系
3.孩子数量和是否购买产品的关系

图11孩子数量与购买产品与否的关系
4.是否有车和是否购买产品的关系

图12是否有车与购买产品与否的关系
5.是否有储蓄账户和是否购买产品的关系

图13是否有储蓄账户与购买产品与否的关系
6.是否有未偿还贷款和购买产品与否的关系

图14是否偿还贷款与购买产品与否的关系
通过对客户属性的分析,得到以下结论:
- # 对数据进行编码处理
- 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()

- # 准备数据
- 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)
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])

从三个模型的结果中,我们看出随机森林模型的准确率最高,且从得出的特征重要程度排名中,我们看出收入与子女人数之间的比率、儿童数量、收入等特征因素的重要程度较大,即电商网站推销商品的影响因素中,收入与子女人数之间的比率、儿童数量、收入影响最大。
根据以上分析,得到不会购买产品客户的指标:
为了使客户购买推销活动的产品,就要根据不同的人群,推销给他们真正需要的产品,给出如下建议:
通过做这次报告,我学习到了很多的新知识,之前学习的时候感觉到这门课程非常的难学,做完报告之后,对之前学习的知识有了更深刻的理解。现在体会到了老师上课讲的要想学好这门课程重在练习,通过写代码、运行程序才能找到问题所在,才能理解每一行代码实际的意思。
在写报告的过程中,不仅让我学会把书本中的东西应用于实践,而且提高了我独立思考问题、自己动手操作的能力,也学会了更好的运用网络解决问题。在写代码的时候,有的时候运行不出来出现报错,就通过在网上查找资料直到程序运行成功,实实在在地掌握到了一些实践应用的技巧。
这次报告使我意识到,我们现在处于一个信息爆炸的时代,各种各样的的数据层出不穷,这就要求我们在选择数据的时候要学会筛选与处理,要想高效率的完成工作,掌握Python技能就显得尤为重要。
通过此次报告,我深刻地意识到学习还是要靠自学,老师起到的是指引和启蒙的作用,要想真正掌握一门技能只有通过自己主动学习,遇到不会的东西,通过自己先查资料自己解决,这样印象会更加深刻,逐渐总结经验,这样一定会取得收获与成就。
总而言之,通过这次报告,使我学会了把在课上学习到的理论知识应用于实践,在以后的学习乃至工作中继续学习,不断进步。