故事从校园一卡通开始,校园一卡通是集身份认证、金融消费、数据共享等多项功能于一体的信息集成系统,也就是学生卡。积累了大量的历史记录,其中蕴含着学生的消费行为和财务状况等信息。是一个数据分析比赛的数据,很多报告都是从消费金额、消费地点、消费时间等角度分析,比较常规。但是数据,其实还可以更有趣。
一、数据集介绍
二、数据读取
# 数据读取
import numpy as np
import pandas as pd
import os
pd.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国际金融 20513946
print(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 允许通过
三、数据处理
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个订单
6176
all_list # 看看list长什么样子
[['181735-女','180015-女'],['181058-男', '181374-男', '182044-女', '182581-女', '180052-女', '182729-男'],['181405-男','180078-男'],···]
#数据保存起来
df.to_csv('df.csv',header=True,index=False)
四、关联规则挖掘
#加载包,没有的自行安装
#pip install efficient-apriori
from efficient_apriori import apriori
itemsets, 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
五、结果解读
('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,
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}
itemsets[4]
{('183419-女', '183420-女', '183422-女', '183424-女'): 42}
六、风控应用
非常多的这种数据,我们可以通过时序关联的方法挖掘出来其中的时空关系,从而确定多个有一致行动的用户,达到一起打击的目的。
当然,这种方法也是有缺陷的,有些相隔时间近但是不再同一个5min中内的,不会产生关联。
- EOF -
看完本文有收获?请转发分享给更多人
推荐关注「数据分析与开发」,提升数据技能
点赞和在看就是最大的支持❤️

