天猫优惠券使用情况预测的逻辑回归分析
背景
基于25317条天猫用户的基本特征、行为信息,使用python分析使用优惠券消费行为特征,并建立逻辑回归模型进行预测。
分析思路
数据展示
#导入要使用的模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
import seaborn as sns
from sklearn import metrics
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df=pd.read_csv(r'D:L2_Week3.csv')
df.head()
#查看数据是否为空值
df.isnull().sum()
特征分析
类别型特征分析
#coupon_ind为要预测的目标值
#查看目标值的分布情况
df['coupon_ind'].value_counts(1)
df.job.value_counts(1) # 各职业占比
df.marital.value_counts(1) #婚姻状况比例
df.loan.value_counts(1) #花呗使用占比
df.default.value_counts(1) #花呗违约占比
df.returned.value_counts(1) # 退货情况占比
df.coupon_ind.value_counts(1) #优惠券使用占比
总结:
用户群体主要职业分布主要包括管理者、蓝领工人、技术人员、决策者、和服务人员。
已婚人群占比最大为60%。
16%的客户使用花呗进行购物。
在使用花呗的群体中,不到2%有过违约记录。
超过55%的用户有过退货记录。
优惠券使用率为12%。
数值型特征分析
df.describe()
# 年龄分布直方图
df.age.hist(bins=100)
#近六个月优惠券使用条形图
df.coupon_used_in_last6_month.plot(kind='hist',bins=50)
#近一个月优惠券使用条形图
df.coupon_used_in_last_month.plot(kind='hist',bins=14)
总结:
用户平均为41岁,其中25-60岁群体人数占比最大。
近6个月优惠券平均使用次数2.77次,主要集中在4次以内。
近一个月优惠券平均使用次数为0.3次,主要在2次以内。
相关性分析
#哑变量处理
df1=pd.get_dummies(df)
#相关系数排序
df1.corr()[['coupon_ind']].sort_values('coupon_ind',ascending=False)
#因为default_no,default_yes,returned_no,returned_yes,loan_no,loan_yes相互的性关系数相同,因此只保留其中一个
df1.drop(['ID','default_no','returned_no','loan_no'],axis=1,inplace=True)
# 给coupon_ind重命名
df1=df1.rename(columns={'coupon_ind':'flag'})
数据建模
模型建立
# 设定x,y
df2=df1.copy()
df2.drop(['flag'],axis=1,inplace=True)
df2.head()
x=df2
y=df1['flag']
#分离训练集与测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.70)
#训练逻辑回归模型
model = LogisticRegression()
model.fit(x_train, y_train)
#查看训练集的概率
prob = model.predict_proba(x_train)
pd.DataFrame(prob).apply(lambda x:round(x,4))
模型评估
#查看预测结果的准确率、召回率、f1-score
pred = model.predict(x_test)
print(classification_report(y_test,pred,labels=[1,0],target_names=['是','否']))
#计算正确率
print('截距为:',model.intercept_)
print('回归系数为:',model.coef_)
print('训练集正确率',model.score(x_train,y_train))
print('预测值正确率',metrics.accuracy_score(y_test,pred))
由于样本的正负样本的比例非常不均衡,因此正确率不具有参考性,这里使用ROC曲线进行评估
#计算ROC曲线AUC值
from sklearn.metrics import roc_curve,auc
fpr,tpr,threshold = roc_curve(y_test,pred)
roc_auc = auc(fpr,tpr)
print('ROC曲线AUC值:',roc_auc)
ROC曲线AUC值: 0.5028496400852676
plt.figure(figsize=(6, 5))
# 绘制ROC曲线。
plt.plot(fpr, tpr, label="ROC")
# 绘制(0, 0)与(1, 1)两个点的连线,该曲线(直线)为随机猜测的效果。
plt.plot([0,1], [0,1], lw=2, ls="--", label="随机猜测")
# 绘制(0, 0), (0, 1), (1, 1)三点的连线(两条线),这两条线构成完美的roc曲线(auc的值为1)。
plt.plot([0, 0, 1], [0, 1, 1], lw=2, ls="-.", label="完美预测")
plt.xlim(-0.01, 1.02)
plt.ylim(-0.01, 1.02)
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate(FPR)', fontsize=13)
plt.ylabel('True Positive Rate(TPR)', fontsize=13)
plt.grid()
plt.title(f"ROC曲线-AUC值为{auc(fpr, tpr):.5f}", fontsize=14)
plt.legend()
plt.show()
ROC曲线的AUC值非常低,模型不具有预测价值,因此需要进行优化。
模型优化
因为样本的正负分布非常不均衡,因此对参数class_weight进行调整。
#分离训练集与测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.60)
#训练逻辑回归模型,这里由于目标值样本不均衡,采用加权的方式建立模型
model = LogisticRegression(C=10000.0, class_weight='balanced', dual=False,
fit_intercept=True, intercept_scaling=1, max_iter=100,
multi_class='ovr', n_jobs=1, penalty='l2', random_state=100,
solver='liblinear', tol=0.0001, verbose=0, warm_start=False)
model.fit(x_train, y_train)
#查看训练集的概率
prob = model.predict_proba(x_train)
pd.DataFrame(prob).apply(lambda x:round(x,4))
#查看预测结果的准确率、召回率、f1-score
pred = model.predict(x_test)
print(classification_report(y_test,pred,labels=[1,0],target_names=['是','否']))
print('截距为:',model.intercept_)
print('回归系数为:',model.coef_)
print('训练集正确率',model.score(x_train,y_train))
print('预测值正确率',metrics.accuracy_score(y_test,pred))
#计算ROC曲线AUC值
from sklearn.metrics import roc_curve,auc
fpr,tpr,threshold = roc_curve(y_test,pred)
roc_auc = auc(fpr,tpr)
print('ROC曲线AUC值:',roc_auc)
ROC曲线AUC值: 0.6521166524625934
plt.figure(figsize=(6, 5))
# 绘制ROC曲线。
plt.plot(fpr, tpr, label="ROC")
# 绘制(0, 0)与(1, 1)两个点的连线,该曲线(直线)为随机猜测的效果。
plt.plot([0,1], [0,1], lw=2, ls="--", label="随机猜测")
# 绘制(0, 0), (0, 1), (1, 1)三点的连线(两条线),这两条线构成完美的roc曲线(auc的值为1)。
plt.plot([0, 0, 1], [0, 1, 1], lw=2, ls="-.", label="完美预测")
plt.xlim(-0.01, 1.02)
plt.ylim(-0.01, 1.02)
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate(FPR)', fontsize=13)
plt.ylabel('True Positive Rate(TPR)', fontsize=13)
plt.grid()
plt.title(f"ROC曲线-AUC值为{auc(fpr, tpr):.5f}", fontsize=14)
plt.legend()
plt.show()