用Python分析更衣室团结程度
这是一个有趣的数据分析问题,以下是几种可落地的分析思路和代码案例。

分析思路
"更衣室团结程度"本质是团队内部人际关系网络的紧密程度,可以从以下维度量化:
| 维度 | 数据来源 | 指标 |
|---|---|---|
| 互动频率 | 训练/比赛中的传球、配合 | 传球网络密度 |
| 社交关系 | 球员间的ins点赞/评论、聚餐 | 社交图聚类系数 |
| 小团体 | 分组训练、座位、更衣位 | 社群检测(社区数、模块度) |
| 情绪一致性 | 采访、社媒文本情感 | 情感方差、一致性 |
| 派系对立 | 冲突事件、互不传球 | 网络割边、负向边 |
核心方案:社交网络分析
构建球员关系网络
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 模拟数据:球员间的互动次数(传球、聚餐、社媒互动)
interactions = [
("球员A", "球员B", 15), ("球员A", "球员C", 3),
("球员B", "球员C", 12), ("球员B", "球员D", 2),
("球员C", "球员D", 14), ("球员D", "球员E", 13),
("球员E", "球员F", 16), ("球员E", "球员A", 2),
("球员F", "球员A", 1), ("球员F", "球员B", 3),
]
G = nx.Graph()
for u, v, w in interactions:
G.add_edge(u, v, weight=w)
# ===== 关键指标 =====
print("网络密度:", round(nx.density(G), 3)) # 越接近1越团结
print("平均聚类系数:", round(nx.average_clustering(G), 3)) # 高=抱团
print("连通分量数:", nx.number_connected_components(G)) # >1说明存在孤立小团体
# 社群检测:识别派系
import community as community_louvain # pip install python-louvain
partition = community_louvain.best_partition(G, weight="weight")
modularity = community_louvain.modularity(partition, G)
print("社群划分:", partition)
print("模块度(越大派系越明显,>0.3警惕):", round(modularity, 3))
可视化关系网络
pos = nx.spring_layout(G, seed=42, weight="weight")
node_colors = [partition[n] for n in G.nodes()]
plt.figure(figsize=(8, 6))
nx.draw_networkx_nodes(G, pos, node_color=node_colors, cmap="Set1", node_size=800)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, width=[G[u][v]["weight"]/3 for u,v in G.edges()])"更衣室球员互动网络")
plt.axis("off")
plt.show()
解读方式:
- 图呈"一团" → 团结
- 分成 2~3 个明显色块且块间连线稀疏 → 存在派系,需警惕
- 有孤立节点 → 边缘球员
识别"桥梁球员"和"边缘球员"
# 中介中心性高 = 派系间的桥梁,是团结的关键人物
betweenness = nx.betweenness_centrality(G, weight="weight")
# 度中心性低 = 边缘人
degree = dict(G.degree(weight="weight"))
df = pd.DataFrame({"中介中心性": betweenness, "加权度数": degree})
df["类型"] = np.where(df["加权度数"] < df["加权度数"].mean(), "边缘", "核心")
print(df.sort_values("加权度数"))
洞察:
- 高中介 + 低度 = 派系和解的关键中间人
- 低度 = 可能被孤立的球员,需重点关怀
进阶分析
情感一致性分析(社媒/采访文本)
from snownlp import SnowNLP # 中文情感分析
tweets = {
"球员A": ["今天团队配合太棒了", "输球很沮丧但我们会团结"],
"球员B": ["更衣室氛围有点怪", "我们之间需要更多沟通"],
}
for player, texts in tweets.items():
scores = [SnowNLP(t).sentiments for t in texts]
print(f"{player}: 平均情感={np.mean(scores):.2f}, 方差={np.var(scores):.3f}")
- 组内方差大 → 情绪不稳定/有矛盾
- 球员间均值差异大 → 存在不满派系
小团体检测(更衣位、聚餐分组)
from sklearn.cluster import AgglomerativeClustering
# 球员特征:社媒互动频次、聚餐同桌次数、训练分组
features = np.array([[15,12,8],[3,2,1],[12,14,10],[2,3,1],[13,15,9],[16,13,11]])
clustering = AgglomerativeClustering(n_clusters=2).fit(features)
print("小团体标签:", clustering.labels_) # 划分明显→需要团建
综合团结指数
把各指标归一化后加权成一个"团结指数":
def team_cohesion(G, partition, sentiment_var):
density = nx.density(G)
clustering = nx.average_clustering(G)
mod = community_louvain.modularity(partition, G)
# 归一化:模块度和情感方差越高越不团结
score = (density * 40
+ clustering * 30
+ (1 - min(mod, 1)) * 20
+ (1 - min(sentiment_var, 1)) * 10)
return round(score, 1)
print("团结指数(0-100):", team_cohesion(G, partition, 0.4))
| 分数 | 判断 |
|---|---|
| >75 | 团结良好 |
| 50~75 | 基本正常,局部需关注 |
| <50 | 存在明显派系,建议干预 |
实践建议
- 数据获取是关键:真实场景要用训练GPS传球数据、更衣室座位、队内问卷("你愿意和谁搭档")等
- 多维度交叉验证:网络指标 + 情感分析 + 问卷,单看一项易误判
- 追踪趋势:按周计算指标,看团结度是否下滑(比单次快照更有意义)
- 保护隐私:涉及球员社交数据需合规授权
如果需要针对具体场景(如足球队传球数据、篮球队配合数据),我可以给出更贴合的字段设计和完整代码。