基于人员访楼数据的聚类分析及可视化工具需求
按人员访问的建筑组合聚类的最优实现方案及可视化工具推荐
嘿,这个需求核心就是按人员的唯一建筑访问集合来分组对吧?我给你梳理两个最靠谱的实现路径,还有能搞定可视化的工具,之前Knime没成功可能是没找对节点组合,咱们换个思路来:
先明确下你的数据场景:每行记录是“人员X访问了建筑Y”,示例数据如下(实际有千余行):
PERSON1 BUILDING1 PERSON2 BUILDING4 PERSON3 BUILDING4 PERSON5 BUILDING3 PERSON3 BUILDING2 PERSON3 BUILDING1 PERSON5 BUILDING6 PERSON4 BUILDING6需要聚类规则:仅访问同一栋建筑的为一类,仅访问建筑1&2的为一类,仅访问建筑3&4的为一类,仅访问同一组3栋建筑的为一类,以此类推。
一、最优实现方式
1. Python 实现(灵活易扩展,自定义性强)
这是我最推荐的方案,用pandas就能快速搞定,步骤清晰:
- 第一步:整理原始数据
先把你那种一行多个人员-建筑对的格式,拆成每行一条记录,转换成DataFrame:import pandas as pd # 假设数据存在文本文件里,读取并拆分 with open('your_data.txt', 'r') as f: raw_data = f.read().split() # 两两分组生成人员-建筑记录 records = [(raw_data[i], raw_data[i+1]) for i in range(0, len(raw_data), 2)] df = pd.DataFrame(records, columns=['Person', 'Building']) - 第二步:生成唯一的建筑组合标识
关键是要让BUILDING1&BUILDING2和BUILDING2&BUILDING1归为同一类,所以要先对每个人员的建筑去重、排序,再拼接成字符串作为组合键:# 按人员分组,获取去重并排序的建筑列表,转为字符串键 person_building_groups = df.groupby('Person')['Building'].agg(lambda x: sorted(set(x))).reset_index() person_building_groups['Building_Combination'] = person_building_groups['Building'].apply(lambda x: '&'.join(x)) - 第三步:按组合聚类
最后按建筑组合分组,就能得到每个聚类对应的人员列表:clusters = person_building_groups.groupby('Building_Combination')['Person'].agg(list).reset_index() # 给聚类编号 clusters['Cluster_ID'] = clusters.index + 1 # 查看结果 print(clusters)
运行完就能得到完美符合你需求的聚类结果,后续还能灵活调整规则。
2. SQL 实现(适合数据库存储的数据)
如果你的数据存在数据库里,直接用SQL就能在端上处理,以MySQL为例:
- 先确保数据是每行一条
Person-Building记录(如果原始数据是一行多个对,MySQL可以用递归CTE拆分); - 生成每个人员的建筑组合键:
SELECT Person, GROUP_CONCAT(DISTINCT Building ORDER BY Building SEPARATOR '&') AS Building_Combination FROM your_table GROUP BY Person; - 按组合分组得到最终聚类:
SELECT CONCAT('Cluster ', ROW_NUMBER() OVER (ORDER BY Building_Combination)) AS Cluster_Name, Building_Combination, GROUP_CONCAT(Person SEPARATOR ', ') AS Persons_In_Cluster FROM ( SELECT Person, GROUP_CONCAT(DISTINCT Building ORDER BY Building SEPARATOR '&') AS Building_Combination FROM your_table GROUP BY Person ) AS person_combinations GROUP BY Building_Combination;
直接在数据库里就能导出聚类结果,不用导出到其他工具。
二、带可视化功能的工具推荐
1. Python + Plotly/Seaborn(代码式可视化,交互性强)
用上面的Python处理完数据后,直接用可视化库做图,比如用Plotly做交互式柱状图,能直观看到每个聚类的人员数量:
import plotly.express as px # 统计每个聚类的人员数量 clusters['Person_Count'] = clusters['Person'].apply(len) # 生成交互式柱状图 fig = px.bar(clusters, x='Cluster_ID', y='Person_Count', color='Building_Combination', hover_data=['Building_Combination', 'Person'], title='人员访问建筑组合聚类分布') fig.show()
也可以用Seaborn做热力图展示建筑组合关联,或者用网络图展示人员-建筑的关系,灵活性拉满。
2. Tableau/Power BI(无代码拖拽,适合非技术用户)
这两个工具绝对是可视化神器,完全不用写代码:
- 步骤:把
Person-Building数据导入工具,创建计算字段生成Building_Combination(按人员分组,去重排序后拼接),然后按这个字段分组,自动形成聚类; - 可视化:拖拽就能生成柱状图、树状图(展示不同组合的占比)、Sankey图(展示人员-建筑-聚类的流向),操作超直观,比Knime上手快多了。
3. Excel(轻量需求首选)
如果数据量不大,Excel也能搞定:
- 用「数据透视表」按人员分组,获取每个人员的所有建筑;
- 用
TEXTJOIN结合排序函数生成排序后的建筑组合; - 再按组合分组,用柱状图或饼图展示聚类分布,轻量又方便。
内容的提问来源于stack exchange,提问作者Learthgz
相关产品推荐
相关产品推荐

