故事从校园一卡通开始,校园一卡通是集身份认证、金融消费、数据共享等多项功能于一体的信息集成系统,也就是学生卡。积累了大量的历史记录,其中蕴含着学生的消费行为和财务状况等信息。是一个数据分析比赛的数据,很多报告都是从消费金额、消费地点、消费时间等角度分析,比较常规。但是数据,其实还可以更有趣。

本次使用南京理工一卡通的消费明细,我会从一个全新的角度出发,挖掘其中的情侣、基友、渣男、单身狗,大家可以把类似的方法扩展到风控领域使用,这种挖掘思路可以用到反欺诈、反舞弊等场景,思路比较新颖,具有较大的研究价值。

那我们开始,看看时序数据怎么利用关联规则进行挖掘,使用的数据集地址如下:https://github.com/Nicole456/Analysis-of-students-consumption-behavior-on-campus

如果没时间看看全文,直接跳到第五数据解读的环节。

一、数据集介绍

附件是某学校 2019年 4月 1 日至 4月 30日一共30天的一卡通数据,一共3个文件,数据字段和含义分别如下

data1.csv:校园卡基本信息

包含的字段有:['序号', '校园卡号', '性别', '专业名称', '门禁卡号']

data2.csv:校园卡消费明细

['流水号', '校园卡号', '校园卡编号', '消费时间', '消费金额', '存储金额', '余额', '消费次数', '消费类型', '消费项目编码', '消费项目序列号', '消费操作编码', '操作编码', '消费地点']

data3.csv:进出门禁详情

['序号', '门禁卡号', '进出时间', '进出地点', '是否通过', '描述']

二、数据读取

# 数据读取
import numpy as np
import pandas as pd
import ospd.set_option('display.max_columns', None)
os.chdir('/Users/wuzhengxiang/Documents/DataSets/students')
data1 = pd.read_csv("data1.csv", encoding="gbk")
data2 = pd.read_csv("data2.csv", encoding="gbk")
data3 = pd.read_csv("data3.csv", encoding="gbk")data1.columns = ['序号', '校园卡号', '性别', '专业名称', '门禁卡号']
data2.columns = ['流水号', '校园卡号', '校园卡编号', '消费时间', '消费金额', '存储金额', '余额', '消费次数', '消费类型', '消费项目编码', '消费项目序列号', '消费操作编码', '操作编码', '消费地点']
data3.columns = ['序号', '门禁卡号', '进出时间', '进出地点', '是否通过', '描述']print(data1.head(3))
序号    校园卡号 性别    专业名称      门禁卡号
0   1  180001  男  18国际金融  19762330
1   2  180002  男  18国际金融  20521594
2   3  180003  男  18国际金融  20513946print(data2.head(3))
流水号      校园卡号     校园卡编号             消费时间  消费金额  存储金额     余额  消费次数  \
0  117342773  181316-女  20181316  2019/4/20 20:17   3.0   0.0  186.1   818
1  117344766  181316-女  20181316   2019/4/20 8:47   0.5   0.0  199.5   814
2  117346258  181316-女  20181316   2019/4/22 7:27   0.5   0.0  183.1   820   消费类型  消费项目编码 消费项目序列号  消费操作编码  操作编码  消费地点 性别
0   消费      49     NaN     NaN   235  第一食堂  女
1   消费      63     NaN     NaN    27  第二食堂  女
2   消费      63     NaN     NaN    27  第二食堂  女  print(data3.head(3))序号      门禁卡号           进出时间       进出地点  是否通过    描述
0  1330906  25558880  2019/4/1 0:00  第六教学楼[进门]     1  允许通过
1  1330907  18413143  2019/4/1 0:02  第六教学楼[出门]     1  允许通过
2  1331384  11642752  2019/4/1 0:00    飞凤轩[进门]     1  允许通过

三、数据处理

我们首先需要把数据处理成关联规则能识别的格式,每5分钟分割成一个数据片段,里面是去重后的用户明细,大家可以类比,这里的用户ID就是商品ID,每5分钟就是一个订单,这样就能和常规的关联规则算法联系起来了,把时空数据转换成关联规则的应用方式,初学者还是比较难理解的,如果看不懂,大家可以看看我之前介绍原理的文章。

data2 = data2.merge(data1[['校园卡号','性别']],on='校园卡号')data2['校园卡号'] = data2['校园卡号'].apply(lambda x: str(x))+'-'+data2['性别']# 时间格式调整,转换成比较标准的格式,方便后面的处理
import datetime
def st_pt(x):#'2019/4/20 20:17'=>'2019-04-20 20:17:00'return str(datetime.datetime.strptime(x, "%Y/%m/%d %H:%M"))# 时间离散化,每个五分钟一个类型
def time_5(s):#'2022-02-22 17:46:07'=>'2022-02-22 17_9'a = str(round(int(s.split(':')[1])/5))return s.split(':')[0]+'_'+a# 数据处理,处理成标准的格式
df = data2
df = df.sort_values(by='消费时间',ascending=True)
df['消费时间_F'] = df['消费时间'].apply(st_pt)
df['消费时间_5'] = df['消费时间_F'].apply(time_5)
all_list = []
for v in df['消费时间_5'].unique():one = df[df['消费时间_5']==v]['校园卡号'].unique().tolist()all_list.append(one)print(len(all_list))#可以看到,有6176个时间片段,可以类比6176个订单
6176all_list # 看看list长什么样子
[['181735-女','180015-女'],['181058-男', '181374-男', '182044-女', '182581-女', '180052-女', '182729-男'],['181405-男','180078-男'],···]#数据保存起来
df.to_csv('df.csv',header=True,index=False)

四、关联规则挖掘

有了上面构造的数据,我们就可以进行关联规则的挖掘

#加载包,没有的自行安装
#pip install efficient-apriorifrom efficient_apriori import aprioriitemsets, rules = apriori(all_list, min_support=0.005,  min_confidence=1)itemsets[2]('183305-女', '183317-女'): 38,('183308-女', '183317-女'): 42,('183310-女', '183314-女'): 31,('183315-女', '183324-女'): 32,('183338-男', '183345-男'): 40,('183343-男', '183980-女'): 44,('183385-女', '183401-女'): 40,('183386-女', '183409-女'): 34,('183408-女', '183415-女'): 42,('183414-女', '183418-女'): 41,('183419-女', '183420-女'): 56,('183419-女', '183422-女'): 59,···
len(itemsets[2]) # 一共有三百多对,我们下面挑一部分来分析
378

我们可以看到,挖掘出来的关联规则,2元的组合一共有378条,数据是2019-04月一个月的,就是30天的。前面是用户对,后面是30天内出现的次数,30多次到50多次,基本上每天出险一次以上,都是比较强关联的。‍

数据对我们都加上了性别,基本可以推断,男女一般都是情侣,男男基本就是好基友,女女都是好闺蜜,而被我们排除的数据,里面很多就是单身狗了。

五、结果解读

上面挖掘的,都是汇总数据,为了更加具体,我们挑一对男女的消费明细来看看,这一对同学,一个月内出现了44次的关联,基本上每天都一起出入了,并且是男女组合。

('181597-男','183847-女'):44

2019/4/1  07:49  男生女生一起去吃早餐,男生吃了3块钱的,女生吃了6.5的,在第一食堂,多年后可能还能记起这一顿早餐

2019/4/1  11:18  男生女生一起去吃午饭,男生吃了8块钱的,女生也吃了8的,估计吃的饺子,或者是麻辣烫,这次在第四食堂,可能是上课的教室就在这附近

2019/4/2  07:42男生女生一起去吃早餐,男生吃了7.5块钱的,女生吃了3.5的,估计昨天点多了,没吃完,今天少吃点

2019/4/17  20:43  估计刚刚约会好了,在红太阳超市,女生估计买了个酸奶,男生饿了,买个个老坛酸菜牛肉面,买完,操场上一个大大的拥抱,各自回宿舍了,带着满满的甜蜜和力量,大学的美好,不过如此了·····

·······

数据挖掘,我们不应该机械冰冷,应该通过数据,洞察后面的细节与故事,有时候,数据挖掘,是多么美妙的故事呢。

除了这一对,还有很多对的情侣,也是类似的生活轨迹。

通过分析,我们也发现两个渣男,啊呸,打死算了,细节我就不看了,你们去看

('180624-男', '181013-女'): 36
('180624-男', '181042-女'): 37('180780-女', '181461-男'): 38
('180856-女', '181461-男'): 34

还有我们挖掘的数据,剔除部分,有大量的单身狗的含量,没有人和他一起吃饭

更多的是,基友和闺蜜,可以看看下面的

itemsets[2]('183247-女', '183254-女'): 32,('183302-女', '183306-女'): 31,('183303-女', '183307-女'): 48,('183303-女', '183314-女'): 31,('183305-女', '183308-女'): 38,('183305-女', '183317-女'): 38,('183308-女', '183317-女'): 42,('183310-女', '183314-女'): 31,('183315-女', '183324-女'): 32,('183338-男', '183345-男'): 40,('183343-男', '183980-女'): 44,('183385-女', '183401-女'): 40,('183386-女', '183409-女'): 34,('183408-女', '183415-女'): 42,('183414-女', '183418-女'): 41,('183419-女', '183420-女'): 56,

3元的数据

itemsets[3]{('180363-女', '181876-女', '183979-女'): 40,('180711-女', '180732-女', '180738-女'): 35,('180792-女', '180822-女', '180849-女'): 35,('181338-男', '181343-男', '181344-男'): 40,('181503-男', '181507-男', '181508-男'): 33,('181552-男', '181571-男', '181582-男'): 39,('181556-男', '181559-男', '181568-男'): 35,('181848-女', '181865-女', '181871-女'): 35,('182304-女', '182329-女', '182340-女'): 36,('182304-女', '182329-女', '182403-女'): 32,('183305-女', '183308-女', '183317-女'): 32,('183419-女', '183420-女', '183422-女'): 49,('183419-女', '183420-女', '183424-女'): 45,('183419-女', '183422-女', '183424-女'): 48,('183420-女', '183422-女', '183424-女'): 51,('183641-女', '183688-女', '183690-女'): 32,('183671-女', '183701-女', '183742-女'): 35,('183713-女', '183726-女', '183737-女'): 36}

4元的数据,一般都是一个宿舍的,关系非常好的宿舍

itemsets[4]
{('183419-女', '183420-女', '183422-女', '183424-女'): 42}

六、风控应用

我们分析用的是校园刷卡数据,这样的时序数据,随处可见

订单下单数据

领券明细数据

信用卡刷卡数据

····

非常多的这种数据,我们可以通过时序关联的方法挖掘出来其中的时空关系,从而确定多个有一致行动的用户,达到一起打击的目的。

当然,这种方法也是有缺陷的,有些相隔时间近但是不再同一个5min中内的,不会产生关联,其实有更先进的算法去解决,我们后面慢慢介绍,因为比较抽象。

往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

【机器学习】情侣、基友、渣男和狗-基于时空关联规则的影子账户挖掘相关推荐

  1. 情侣、基友、渣男和狗-基于时空关联规则的影子账户挖掘

    故事从校园一卡通开始,校园一卡通是集身份认证.金融消费.数据共享等多项功能于一体的信息集成系统,也就是学生卡.积累了大量的历史记录,其中蕴含着学生的消费行为和财务状况等信息.是一个数据分析比赛的数据, ...

  2. 【干货+福利】情侣、基友、渣男和狗-基于SynchroTrap+LPA算法的团伙账户挖掘

    本文目的:把经常一起行动的人找出来,并划分成一个Group,仅利用时间关系,无需其他介质 上一期的文章,没有解决相隔时间近但是不在同一个5min切片内的的问题,为了解决这个问题,我研究了一些关于时序的 ...

  3. Python关联规则挖掘情侣、基友、渣男和狗。学会这个就非常牛逼了。

    本文讲解的是机器学习中一个算法的应用:关联规则分析 整个故事从一张校园卡开始.相信小伙伴们都用过校园卡,它是一种其个人身份认证.校园消费.数据共享等多功能于一体的校园信息集成与管理系统.在它里面存储着 ...

  4. 好家伙,渣男基因被发现了?还能让直男变弯?

    导读:"渣男基因被发现了!"这是怎么回事呢? 作者:宛平城外的胖子 来源:大数据DT(ID:hzdashuju) 01 渣男的必要条件:D4DR基因 上世纪末,耶路撒冷的理查德·埃 ...

  5. 有时间同情渣男傻女,不如想想人都是怎么被臆想出来的爱情给坑了

    第184原创 文|明玥 1 整个周末,整个互联网社交环境都被某大叔男明星的丑闻弄得乌烟瘴气. 这么恶心的瓜,我原本并不想吃. 因为细究一下,你就会发现,这个里面没有谁是值得站的,每个人都经不起推敲. ...

  6. 为了多拿点补贴,马斯克甚至还当过“渣男”?

    来源| 差评 ID| chaping321 作者| 差评君 作为这颗行星上目前最有钱的人,马斯克身上的标签,可以说是贴都贴不完. 成功的企业家.硅谷钢铁侠这些大家熟悉的身份咱们就先不说了. 光是今年喊 ...

  7. transformer中QKV的通俗理解(渣男与备胎的故事)

    transformer中QKV的通俗理解(渣男与备胎的故事) 用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔 ...

  8. MySQL从删库到跑路(7):连接查询,用联系的观点看女神与渣男

     "有为,能陪我说说话么?"  望着梨花带雨的女神,一时间李有为陷入了恍惚之中,尽管心里已经千万次告诫自己要远离面前的女人,可是当她真的出现在面前时,李有为的大脑早已一片空白.   ...

  9. 渣男手册,安卓恋爱话术库API

    渣男手册,安卓恋爱话术库API  Lan   2020-04-17 14:56   228 人阅读  0 条评论 import requestswhile (True):i = input(" ...

最新文章

  1. 关于ceph源码 backtrace 打印函数调用栈
  2. python软件开发-哪个开发软件可以写python啊,VS可以么?
  3. [Solved] UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte
  4. java缓存技术_java缓存技术
  5. python基础===PEP网站,代码规范指南
  6. java学习(130):treemap类
  7. 信息学奥赛一本通(1106:年龄与疾病)
  8. Mate 50年内无望!华为确认10月海外发布会主角是nova系列
  9. 敏捷个人A1组第二次讨论纪要 你在事业上打算何去何从?
  10. 【C语言】开平方公式,根号下x的函数使用:sqrt()
  11. 论WMS系统的未来前景
  12. c语言分形程序,C语言实现分形图形
  13. 360无线wifi 无法连接服务器,360wifi连接上但上不了网的解决方法
  14. you-get的一点修改
  15. 在Linux中修改系统的IP地址
  16. 科技爱好者周刊(第 213 期):知识孤岛,知识软件
  17. linux下启动node服务出现events.js:167 throw er; // Unhandled ‘error‘ event 的解决方法
  18. 热力学多元函数微分基础
  19. 《读者》2005言论
  20. 【已解决】如何做excel表的下拉框多选

热门文章

  1. DNS区域传送、子域授权
  2. 一年的天数 Exercise06_16
  3. LaText中插入带上下限的求和符号
  4. linux学习笔记4:linux的任务调度,进程管理,mysql的安装和使用,ssh工具的使用,linux网络编程...
  5. 转 性能分析工具汇总
  6. Lucene 简单手记
  7. C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象
  8. Mime类型与文件后缀对照表及探测文件MIME的方法
  9. matlab人工势场法三维演示图,人工势场法(Artificial Potential Field Method)的学习
  10. circRNA研究相关数据库,riboCIRC使用指南