案件回顾
杂货店屡遭贼
将数据存储为csv格式,导入python,查看前10行数据。
import pandas as pd xiaotailang = pd.read_csv('xiaotailang.csv') xiaotailang.head(10)
按照时间顺序,画出失窃数额的线形图。
xiaotailang.date = pd.to_datetime(xiaotailang.date) import matplotlib.pyplot as plt import pylab plt.rcParams['font.sans-serif'] = ['SimHei'] xiaotailang.index = xiaotailang.iloc[:,2] xiaotailang.iloc[:,0].plot() plt.ylabel("数额") plt.title("失窃数据") pylab.show()
从图显示,可以看出一月和四月,即寒假和春假期间出现了失窃数额大幅减少的情况。但是数据太多无法看清,因此将14年10月份的单独拿出来做线形图。
xiaotailang.iloc[0:30,0].plot()
plt.ylabel("数额") plt.title("10月份失窃数据") pylab.show()
从10月份的失窃图可以看出,失窃数额呈现似有似无的周期性波动:1号,15号,29号失窃数额激增,相隔皆为14天,且都是周三,但是10号和23号也出现失窃小高峰。结合周围情况发现,周围有一所学校学生每2周的周三下午不上课,还有一所学校在出现失窃小高峰的日子为学校活动日,下午也不上课,且学校的学生家比较远,寒假春假的时候很难出现在杂货店,因此,初步怀疑两所学校的学生与杂货店失窃有关。
再从其他方面进行分析。现在把数据按照损失多和损失少分开,通过计算,失窃数额均值为1000左右,标准差为450左右,根据正态分布性质,平均值左右一个标准差的范围内应包含约68%的数据,因此这里选取1500(1000+450后上取整)当作区分损失多少的标准。下面用周几与活动日的数据进行逻辑回归分析,查看周三和活动日与损失多少是否有关。
逻辑回归只能对数值型变量进行处理,在我们的这个问题中,“活动日”和“周几”均为类型变量,所以要先对数据进行转化。pandas库中的get_dummies函数,可以将列虚拟化。
import pandas as pd xiaotailang.iloc[:,3] = xiaotailang.iloc[:,3].replace(['no', 'yes'], [1, 0]) day = pd.get_dummies(xiaotailang['周几']) #列虚拟化,将类型变量转为数值变量 xiaotailang = xiaotailang.iloc[:,0:4].join(day)#数据整合 xiaotailang.iloc[:,4:] = xiaotailang.iloc[:,4:].replace([0, 1], [1, 0]) xiaotailang.head()
将虚拟化的数据与原数据中要用的列进行整合,得到如下结果:
数额 | 损失 | date | 活动日 | 周一 | 周三 | 周二 | 周五 | 周六 | 周四 | 周日 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2362 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
1 | 1315 | 0 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
2 | 809 | 0 | 3 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
3 | 816 | 0 | 4 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
4 | 400 | 0 | 5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
接下来使用statesmodels库中的Logit函数执行逻辑回归,其中“损失”为要预测的变量,“活动日”及周一到周六的数据作为解释变量,为了避免多重共线性,这里不使用“周日”列。
import statsmodels.api as sm #xiaotailang['intercept'] = 1.0 logit = sm.Logit(xiaotailang.iloc[:,1], xiaotailang.iloc[:,3:10]) # 拟合模型 result = logit.fit() result.summary()
得到的结果如下:
Optimization terminated successfully.
Current function value: 0.313466
Iterations 8
coef | std err | z | P>|z| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
活动日 | -2.1062 | 0.698 | -3.017 | 0.003 | -3.475 | -0.738 |
周一 | 1.4316 | 0.994 | 1.440 | 0.150 | -0.516 | 3.379 |
周三 | -2.2314 | 0.430 | -5.189 | 0.000 | -3.074 | -1.389 |
周二 | 0.4872 | 0.689 | 0.707 | 0.480 | -0.864 | 1.838 |
周五 | -0.2870 | 0.558 | -0.515 | 0.607 | -1.380 | 0.806 |
周六 | 0.5195 | 0.713 | 0.729 | 0.466 | -0.878 | 1.916 |
周四 | -0.2870 | 0.558 | -0.515 | 0.607 | -1.380 | 0.806 |
从结果显示,周三和活动日的P值<0.005,否定原假设,即认为与要预测的变量“损失”有关。从对已有数据进行分析的结果显示,两所学校的学生与杂货店失窃有关,但这个判断结果只是根据手头数据得到的,可能存在某盗窃团伙专门在隔周的周三作案但是我们不知道,也就是说解释变量一开始就选错了,因此解释变量的选择对结果有很大影响。
逻辑回归:算法简单和高效,在实际中应用非常广泛。将普通回归函数,经Sigmoid函数,把输出压缩到[0,1]。当用逻辑回归做分类问题时,通常针对二分类问题,即结果是二选一的数据。