Python关联规则挖掘情侣、基友、闺蜜、渣男和狗
本文讲解的是机器学习中一个算法的应用:关联规则分析
整个故事从一张校园卡开始。相信小伙伴们都用过校园卡,它是一种其个人身份认证、校园消费、数据共享等多功能于一体的校园信息集成与管理系统。在它里面存储着大量的数据,包含:学生消费、宿舍门禁、图书馆进出等。
本文使用的是南京某高校学生一卡通在2019年4月1-20号的消费明细数据,从统计可视化分析、关联规则分析,发现学生一卡通的使用情况和学生当中的情侣、基友、闺蜜、渣男和单身狗等有趣信息。
使用的数据集地址如下:https://github.com/Nicole456/Analysis-of-students-consumption-behavior-on-campus
导入数据
1 | import pandas as pd |
1、数据1:每个学生的校园卡基本信息
2、数据2:校园卡每次消费和充值的明细数据
3、数据3:门禁明细数据
数据大小
In [8]:
1 | print("df1: ", df1.shape) |
缺失值
1 | # 每列缺失值 |
人数对比
不同性别人数
不同专业人数
In [16]:
1 | df5 = df1["Major"].value_counts().reset_index() |
不同专业不同性别人数
In [18]:
1 | df6 = df1.groupby(["Major","Sex"])["CardNo"].count().reset_index() |
1 | fig = px.treemap( |
进出门禁信息
地址信息
In [21]:
1 | # 1、处理address |
进出门禁时间
In [25]:
1 | df8 = pd.merge(df3,df1,on="AccessCardNo") |
1 | # 准备画布 |
消费信息
In [30]:
1 | # 数据合并 只取出两个字段:卡号和性别 |
合并信息
In [32]:
1 | df10["Card_Sex"] = df10["CardNo"].apply(lambda x: str(x)) + "_" + df10["Sex"] |
主要地点
In [33]:
1 | # Card_Sex:统计消费人次 |
1 | fig = px.bar(df11,x="Dept",y="Card_Sex") |
1 | fig = px.bar(df11,x="Dept",y="Money") |
关联规则挖掘
时间处理
时间处理主要是两个点:
- 时间格式的转换
- 时间离散化:每5分钟一个类型
在这里我们默认:如果两个时间在同一个类型中,认为两人在一起消费
1 | import datetime |
提取每个时间类型的人员信息:
1 | # 方式1 |
频繁项集寻找
In [44]:
1 | import efficient_apriori as ea |
一个人
一个人消费的数据最多:2565条数据,单身毕竟多!
1 | len(itemsets[1]) # 2565条 |
两个人
1 | len(itemsets[2]) # 378条 |
查看了全部的数据,统计了下面的结果:
1 | ('180433_男', '180499_女'): 34 |
1、可疑男生1-180624
回到原始数据,查看他和不同女生在时间上消费的交集情况。
(1)和女生181013的交集:
- 4月1号早上7.36:应该是一起吃了早餐;11点54一起吃了午饭
- 4.10、4.12等不同时间点的交集
(2)和女生181042的交集:
2、看看可疑的渣男3
这哥们实在是厉害呀~数据挖掘显示居然和4个女生同时存在一定的关联!
1 | ('182239_男', '182304_女'): 39 |
除了可能的男女朋友关系,在2元数据中更多的是基友或者闺蜜:
1 | ('180450_女', '180484_女'): 35, |
3-4个人
3-4元的数据可能是一个宿舍的同学或者朋友一起的,相对数量会比较少:
1 | len(itemsets[3]) # 18条 |
4元数据只有一条:
总结
关联规则分析是一个经典数据挖掘算法,在消费明细数据、超市购物篮数据、金融保险、信用卡等领域应用的十分广泛。当我们运用关联分析技术挖掘出频繁出现的组合和强关联规则之后,就可以指定相应的营销策略或者找到不同对象之间的关系。
上面的数据挖掘过程,其实也存在一定的缺陷:
- 约束太宽:仅仅是根据时间间隔类型进行分组统计,忽略了学生的专业、消费地点等信息
- 时间太窄:5分钟的时间间隔过去窄,会过滤掉很多信息