温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :)
1. 项目简介
本项目基于国内某高校校园一卡通系统一个月的运行数据,使用数据分析和建模的方法,挖掘数据中所蕴含的信息,对学生在校园内的消费行为、生活习惯和消费金额等方面进行规律分析,同时对学校不同食堂、商铺等销售数据、人流量等维度进行统计分析,并构建 web 交互平台,通过视觉感知,更清晰直观、方便快速地抓住数据的信息,辅助管理者做出高效的决策。
基于大数据的校园一卡通数据分析与可视化平台
2. 功能组成
基于大数据的校园一卡通数据分析与可视化平台的功能主要包括:
(1)数据挖掘及分析
包括个人消费总额的聚类,消费特征聚类分析,人流量分析,热点商户分析。
(2)学生消费特征
对不同人群进行群体标签划分,分为 节约型 低消费型 适当型 高消费型,对不同人群在总样本中的占比进行行为分析。
(3)热点商户分析
对不同的商户进行个人消费频率 平均单笔交易金额和总金额的统计,进行热度排序及展示。
(4)可视化平台
包括不同消费特征人群的占比及人均消费金额显示 热点商户的排名显示 不同时段各人流量显示。
3. 基于大数据的校园一卡通数据分析与可视化平台
3.1 系统首页和注册登录
3.2 学生消费行为分析
3.2.1 学生消费次数和总金额(元)的分布情况
可以看出,学生本月的消费次数和消费的总金额均呈现长尾分布,且只有少部分的学生消费次数和金额较大。
3.2.2 学生消费特征群体标签划分分布情况
通过对学生消费总金额对不同学生人群进行群体标签划分,分为:节约型、低消费型、适当型、高消费型,对不同人群在总样本中的占比进行行为分析:
def student_analysis():
"""学生维度的分析"""
people_df = df['PeoNo'].value_counts().reset_index()
# 消费总金额
people_money = df[['PeoNo', 'Money']].groupby('PeoNo').sum().reset_index()
people_money = people_money.sort_values(by='Money', ascending=False)
# 对不同人群进行群体标签划分,分为 节约型 低消费型 适当型 高消费型,对不同人群在总样本中的占比进行行为分析
def calc_type(money):
if money > 1000:
return '高消费型'
elif money > 500:
return '适当型'
elif money > 300:
return '低消费型'
else:
return '节约型'
people_money['type'] = people_money['Money'].map(calc_type)
type_count_dict = people_money['type'].value_counts().to_dict()
# 不同时间点消费次数和金额的分布情况
weekday_money = df[['Weekday', 'Money']].groupby('Weekday').sum().reset_index()
weekday_money = weekday_money.sort_values(by='Weekday', ascending=True)
hour_money = df[['Hour', 'Money']].groupby('Hour').sum().reset_index()
hour_money = hour_money.sort_values(by='Hour', ascending=True)
可以看出,只有极少部分的学生为高消费型人群,绝大部分为节约型以及低消费型,大部分的大学生都是理性消费,甚至偏向节约。
3.2.3 学生在不同时间点消费总金额(元)差异分布情况
对学生消费总金额按照星期和小时维度进行统计分析,可以看出:
(1)周五之后消费总金额逐渐下降,周六日的消费额最小,可能是大部分学生周六日放假期间选择外出就餐等消费行为,符合预期;
(2)每天当中 11-12点和17-18点的消费达到高峰,分别对应学生的中午和晚上就餐时间,同时还可以发现,早上的消费金额明显比中午和晚上少,可能是由于早餐比较便宜,以及部分学生选择早上不吃饭。
3.3 店铺维度统计分析
3.3.1 不同店铺/食堂学生消费总次数分布情况
以店铺/食堂等维度进行统计分析,分析学生的消费都分布在哪些店铺:
def shop_analysis():
"""店铺维度分析"""
dept_count_dict = df['Dept'].value_counts().to_dict()
# 消费总金额
people_money = df[['Dept', 'Money']].groupby('Dept').sum().reset_index()
people_money = people_money.sort_values(by='Money', ascending=False)
# 店铺人均消费
shop_mean = df[['Dept', 'Money']].groupby('Dept').mean().reset_index()
top_shop = [k for k in dept_count_dict if dept_count_dict[k] > 700]
shop_mean['hot_dept'] = shop_mean['Dept'].map(lambda x: x in top_shop)
shop_mean = shop_mean[shop_mean['hot_dept']]
shop_mean = shop_mean.sort_values(by='Money', ascending=False)
可以看出:
(1)第二食堂和第五食堂非常受学生们的欢迎,消费总次数远远多余其他食堂。同时还可以发现,消费的除了食堂,还包括水电缴费、食品店、学校财务处、超市、医务室等地方;
(2)第四食堂学生的消费总金额最多,其次是第四食堂,财务处最少。
3.3.2 热门店铺人均消费占比和排名分布情况
通过对商铺的消费金额和次数的人均统计分析,可以看出,教师食堂的价格最贵,的确如此,教师食堂主要是面向教职工开发,一般价格也相对偏贵。最受欢迎的第二食堂是因为在所有食堂中人均消费最低,大部分学生更偏向于选择第二食堂,与前面分析的大部分学生为节约型以及低消费型消费行为的结论相对应!
3.3.3 热门商铺人流量随时间分布变化情况
通过对热门商铺人流量的时序分析,可以看出,人流量呈现出周期性特性,消费人流量高峰集中在中午11点-12点,此时间段为中午消费高峰,符合预期。
3.4 店铺人流量与销量预测(更新)
对每个店铺每天消费的学生人数和总销售额数据进行时序建模,构建 ARIMA 模型,预测下一个日期的人流量与销售量。
3.5 学生消费特征计算与聚类(更新)
利用 pandas 数据科学工具包对每个学生的一卡通消费数据,计算消费特征,构建特征向量:
......
# 平均消费金额
tmp_feat = df[['PeoNo', 'Money']].groupby('PeoNo').mean().reset_index()
tmp_feat.rename(columns={'Money': '平均消费金额'}, inplace=True)
people_feat = people_feat.merge(tmp_feat, on=['PeoNo'], how='inner')
# 消费次数
tmp_feat = df[['PeoNo', 'Date']].groupby('PeoNo').count().reset_index()
tmp_feat.rename(columns={'Date': '消费次数'}, inplace=True)
people_feat = people_feat.merge(tmp_feat, on=['PeoNo'], how='inner')
# 总fundmoney
tmp_feat = df[['PeoNo', 'FundMoney']].groupby('PeoNo').sum().reset_index()
tmp_feat.rename(columns={'FundMoney': '累计FundMoney'}, inplace=True)
people_feat = people_feat.merge(tmp_feat, on=['PeoNo'], how='inner')
# 平均FundMoney
tmp_feat = df[['PeoNo', 'FundMoney']].groupby('PeoNo').mean().reset_index()
tmp_feat.rename(columns={'FundMoney': '平均FundMoney'}, inplace=True)
people_feat = people_feat.merge(tmp_feat, on=['PeoNo'], how='inner')
......
最后利用 KMeans算法,对所有学生的消费特征向量进行聚类,并结合 TSNE 降维实现可视化:
......
tsne = TSNE(n_components=2)
tsne.fit_transform(feat_data)
loc_points = tsne.embedding_
print('KMeans聚类')
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans = kmeans.fit(feat_data)
student_labels = kmeans.predict(feat_data)
cluster_df = pd.DataFrame()
cluster_df['x'] = loc_points[:, 0]
cluster_df['y'] = loc_points[:, 1]
cluster_df['cluster'] = student_labels
cluster_df['PeoNo'] = student_peono
......
4. 总结
本项目基于国内某高校校园一卡通系统一个月的运行数据,使用数据分析和建模的方法,挖掘数据中所蕴含的信息,对学生在校园内的消费行为、生活习惯和消费金额等方面进行规律分析,同时对学校不同食堂、商铺等销售数据、人流量等维度进行统计分析,并构建 web 交互平台,通过视觉感知,更清晰直观、方便快速地抓住数据的信息,辅助管理者做出高效的决策。
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。
精彩专栏推荐订阅: