美文网首页大学生世界
小案例(六):预测小偷行为(python)

小案例(六):预测小偷行为(python)

作者: 三猫后端 | 来源:发表于2017-10-09 09:35 被阅读117次

    原文链接:小案例(六):预测小偷行为(python)

    微信公众号:机器学习养成记    搜索添加微信公众号:chenchenwings


    《菜鸟侦探挑战数学分析》小案例,python实现第六弹

    案件回顾

    杂货店屡遭贼

    1,杂货店遭小偷情况严重

    2,现有8个月内,每天的失窃纪录

    3,偷窃者有老顾客家属和学生,店主希望能防患于未然(问题:失窃是否有规律?怎样运用规律堤防盗贼?)

    时间序列分析

    将数据存储为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活动日周一周三周二周五周六周四周日

    023621111011111

    113150211111101

    28090311110111

    38160411111011

    44000511111110

    接下来使用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

    coefstd errzP>|z|[0.0250.975]

    活动日-2.10620.698-3.0170.003-3.475-0.738

    周一1.43160.9941.4400.150-0.5163.379

    周三-2.23140.430-5.1890.000-3.074-1.389

    周二0.48720.6890.7070.480-0.8641.838

    周五-0.28700.558-0.5150.607-1.3800.806

    周六0.51950.7130.7290.466-0.8781.916

    周四-0.28700.558-0.5150.607-1.3800.806

    从结果显示,周三和活动日的P值<0.005,否定原假设,即认为与要预测的变量“损失”有关。从对已有数据进行分析的结果显示,两所学校的学生与杂货店失窃有关,但这个判断结果只是根据手头数据得到的,可能存在某盗窃团伙专门在隔周的周三作案但是我们不知道,也就是说解释变量一开始就选错了,因此解释变量的选择对结果有很大影响。

    几个小概念

    逻辑回归:算法简单和高效,在实际中应用非常广泛。将普通回归函数,经Sigmoid函数,把输出压缩到[0,1]。当用逻辑回归做分类问题时,通常针对二分类问题,即结果是二选一的数据。


    python系列数据分析小案例历史文章:

    第一弹->小案例(一):商业街抽奖

    第二弹->小案例(二):面包是不是变轻了

    第三弹->小案例(三):调查问卷

    第四弹->小案例(四):销售额下滑

    第五弹->小案例(五):销量预测


    微信公众号:机器学习养成记    搜索添加微信公众号:chenchenwings

    扫描二维码,关注我们。

    如需转载,请在开篇显著位置注明作者和出处,并在文末放置机器学习养成记二维码和添加原文链接。

    快来关注我们吧!

    相关文章

      网友评论

        本文标题:小案例(六):预测小偷行为(python)

        本文链接:https://www.haomeiwen.com/subject/jtyuyxtx.html