小案例(六):预测小偷行为(python)
案件回顾
杂货店屡遭贼
- 杂货店遭小偷情况严重
- 现有8个月内,每天的失窃纪录
- 偷窃者有老顾客家属和学生,店主希望能防患于未然(问题:失窃是否有规律?怎样运用规律堤防盗贼?)
- 时间序列分析
将数据存储为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]。当用逻辑回归做分类问题时,通常针对二分类问题,即结果是二选一的数据。
- 三个小时学会wordpress模板制作
- The each() function is deprecated报错的解决方法
- 书接上文:薛定谔的猫是如何诞生的?
- docker源码分析(3)---镜像(1)
- k8s源码分析-----kubelet(8)pod管理
- 大会 | DiracNets:无需跳层连接的ResNet
- golang时间戳格式化与解析
- golang-net/http源码分析之http server
- 白话面向智能体编程(Agent Oriented Programmig, AOP)之四
- 用fpm来做rpm打包
- Nginx配置文件nginx.conf详解
- 这是一位师兄的算法学习之路
- Windows下JavaWeb环境的安装笔记
- 深度解析:持续交付将如何拯救IT运维?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php设计模式之建造器模式分析【星际争霸游戏案例】
- Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
- PHP容器类的两种实现方式示例
- Linux下Mysql定时任务备份数据的实现办法
- PHP抽象类和接口用法实例详解
- php+lottery.js实现九宫格抽奖功能
- PHP实现一个按钮点击上传多个图片操作示例
- php实现 master-worker 守护多进程模式的实例代码
- Ubuntu 18.04 Server 设置静态IP 的办法
- PHP依赖注入容器知识点浅析
- centos克隆linux虚拟机的完整步骤分享
- laravel框架中间件简单使用方法示例
- PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
- Smarty模板语法详解
- PHP保留两位小数的几种方法