微信好友与班级学生信息数据分析技术博客

张开发
2026/5/19 5:26:14 15 分钟阅读
微信好友与班级学生信息数据分析技术博客
微信好友与班级学生信息数据分析技术博客一、项目概述本项目基于 Python 实现分为 ** 班级学生信息数据分析案例 1和微信好友数据分析案例 2** 两个核心模块完成从数据读取、清洗、多维度可视化到业务洞察的全流程分析最终形成可复现的技术方案与分析报告为招生决策、用户画像分析提供数据支撑。二、技术栈与环境准备1. 核心依赖库bash运行pip install pandas matplotlib wordcloud jieba snownlp pyecharts openpyxl2. 环境配置开发环境Python 3.10数据文件学生信息表.xls案例 1、wechat_friends.csv案例 2辅助文件中文停用词表stopwords.txt、系统中文字体如微软雅黑msyh.ttc三、案例 1班级学生信息表数据分析1. 设计思想以班级学生信息为数据源围绕基础属性、生源分布、学业情况、个人特征、宿舍关系五大维度展开分析通过可视化直观呈现班级特征为招生部门提供决策建议同时挖掘学生群体的共性特征。2. 完整源码python运行# 案例1班级学生信息数据分析 import pandas as pd import matplotlib.pyplot as plt from wordcloud import WordCloud import jieba from snownlp import SnowNLP from pyecharts.charts import Map, Bar, Scatter, Graph from pyecharts import options as opts from collections import Counter import warnings warnings.filterwarnings(ignore) # 解决中文乱码 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False # -------------------------- # 1. 数据读取与预处理 # -------------------------- df pd.read_excel(软件232学生信息表.xlsx, sheet_name软件232) # 删除关键信息缺失的行姓名、性别、生源省份、寝室号、生日、人生格言 df df.dropna(subset[姓名, 性别, 生源省份, 寝室号, 生日, 人生格言], howany) # 清洗“生日”列统一转换为日期格式处理如2003.1.5、2006.0108等格式 def parse_birthday(b): if pd.isna(b): return None b_str str(b).strip() # 替换分隔符为“-” for sep in [., /, ]: if sep in b_str: b_str b_str.replace(sep, -) # 处理类似“2006-0108”的情况 if - in b_str and len(b_str.split(-)[-1]) 4: parts b_str.split(-) b_str f{parts[0]}-{parts[1][:2]}-{parts[1][2:]} try: return pd.to_datetime(b_str, errorscoerce) except: return None df[出生日期] df[生日].apply(parse_birthday) # 删除生日无效的行 df df.dropna(subset[出生日期]) # 名次列取大三上学期名次作为分析对象缺失值填充为None后续绘图过滤 df[名次] pd.to_numeric(df[大三上学期名次], errorscoerce) # 处理省份名称去掉“省”、“市”、“自治区”等适配地图 def clean_province(prov): if pd.isna(prov): return 其他 prov str(prov).replace(省, ).replace(市, ).replace(自治区, ) if prov 内蒙古: return 内蒙古 if prov 广西: return 广西 if prov 宁夏: return 宁夏 if prov 新疆: return 新疆 if prov 西藏: return 西藏 return prov df[省份] df[生源省份].apply(clean_province) # 城市列直接取“生源城市”去除可能的“市”字 df[城市] df[生源城市].fillna(未知).apply(lambda x: str(x).replace(市, ) if pd.notna(x) else 未知) # -------------------------- # 2. 性别饼状图可视化 # -------------------------- gender_count df[性别].value_counts() plt.figure(figsize(6,6)) plt.pie(gender_count.values, labelsgender_count.index, autopct%1.1f%%, startangle90, colors[#FF6B6B, #4ECDC4], textprops{fontsize:12}) plt.title(班级学生性别分布, fontsize14, fontweightbold) plt.savefig(案例1_性别分布饼状图.png, dpi300, bbox_inchestight) plt.close() # -------------------------- # 3. 省份中国地图可视化 # -------------------------- province_count Counter(df[省份]) # 过滤掉“其他” province_count {k:v for k,v in province_count.items() if k ! 其他} province_data list(province_count.items()) if province_data: map_chart ( Map() .add(学生人数, province_data, china) .set_global_opts( title_optsopts.TitleOpts(title班级学生省份分布), visualmap_optsopts.VisualMapOpts(max_max(province_count.values())) ) ) map_chart.render(案例1_省份分布地图.html) # -------------------------- # 4. 城市柱状图可视化Top10 # -------------------------- city_count df[城市].value_counts().head(10) bar_chart ( Bar() .add_xaxis(city_count.index.tolist()) .add_yaxis(学生人数, city_count.values.tolist()) .set_global_opts( title_optsopts.TitleOpts(title班级学生城市分布(Top10)), xaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(rotate45)) ) ) bar_chart.render(案例1_城市分布柱状图.html) # -------------------------- # 5. 签名词云化情感分析人生格言 # -------------------------- # 简单停用词表若无stopwords.txt则使用内置 try: with open(stopwords.txt, r, encodingutf-8) as f: stopwords set(f.read().splitlines()) except FileNotFoundError: stopwords set([的, 了, 是, 我, 你, 他, 她, 它, 们, 有, 在, 不, 和, 与, 就, 都, 而, 也, 还, 没, 对, 等, 能, 会, 可, 得, 着, 过, 来, 去, 上, 下, 到, 说, 话, 个, 些, 人, 这, 那, 里, 么, 啊, 哦, 嗯, 吧]) text .join(df[人生格言].dropna().astype(str).tolist()) words jieba.lcut(text) filtered_words [word for word in words if word not in stopwords and len(word) 1] if filtered_words: wordcloud WordCloud( font_pathC:/Windows/Fonts/msyh.ttc, # 若找不到字体可替换为 simhei.ttf 或注释掉 width800, height600, background_colorwhite, max_words200 ).generate( .join(filtered_words)) plt.figure(figsize(10,8)) plt.imshow(wordcloud, interpolationbilinear) plt.axis(off) plt.title(学生人生格言词云, fontsize14, fontweightbold) plt.savefig(案例1_签名词云.png, dpi300, bbox_inchestight) plt.close() else: print(没有有效的词云文本跳过词云生成) # 情感极性分析 def get_sentiment(sign): if pd.isna(sign) or sign.strip() : return 0.5 try: s SnowNLP(sign) return s.sentiments except: return 0.5 df[情感极性] df[人生格言].apply(get_sentiment) df[情感标签] df[情感极性].apply(lambda x: 积极 if x0.6 else 中性 if 0.4x0.6 else 消极) sentiment_count df[情感标签].value_counts() # -------------------------- # 6. 名次分布折线图以大三上学期名次为例 # -------------------------- rank_counts df[名次].dropna().value_counts().sort_index() if not rank_counts.empty: plt.figure(figsize(10,6)) plt.plot(rank_counts.index, rank_counts.values, markero, color#2E86AB, linewidth2) plt.title(班级学生大三上学期名次分布, fontsize14, fontweightbold) plt.xlabel(名次, fontsize12) plt.ylabel(人数, fontsize12) plt.grid(alpha0.3) plt.savefig(案例1_名次分布折线图.png, dpi300, bbox_inchestight) plt.close() else: print(名次数据缺失跳过名次分布图) # -------------------------- # 7. 宿舍分布关系图寝室号-学生 # -------------------------- dorm_dict df.groupby(寝室号)[姓名].apply(list).to_dict() nodes [] links [] # 添加宿舍节点 for dorm in dorm_dict.keys(): nodes.append({name: str(dorm), symbolSize: 30, category: 0, itemStyle: {color: #1890FF}}) # 添加学生节点和连接 for dorm, students in dorm_dict.items(): for student in students: nodes.append({name: student, symbolSize: 15, category: 1, itemStyle: {color: #7B8794}}) links.append({source: str(dorm), target: student}) # 去重基于节点名称name去重修正原错误 unique_nodes {} for node in nodes: name node[name] if name not in unique_nodes: unique_nodes[name] node nodes list(unique_nodes.values()) graph ( Graph() .add(, nodes, links, layoutforce, repulsion800, linestyle_optsopts.LineStyleOpts(curve0.2)) .set_global_opts(title_optsopts.TitleOpts(title寝室-学生关系图)) ) graph.render(案例1_宿舍关系图.html) # -------------------------- # 8. 生日散点图可视化月份-日期 # -------------------------- df[生日月份] df[出生日期].dt.month df[生日日期] df[出生日期].dt.day scatter_chart ( Scatter() .add_xaxis(df[生日月份].tolist()) .add_yaxis(学生生日, df[生日日期].tolist()) .set_global_opts( title_optsopts.TitleOpts(title学生生日分布散点图), xaxis_optsopts.AxisOpts(name月份), yaxis_optsopts.AxisOpts(name日期) ) ) scatter_chart.render(案例1_生日散点图.html) # -------------------------- # 9. 数据分析与结论 # -------------------------- print( 案例1 分析结论 ) print(f班级有效总人数{len(df)}人) print(f性别分布{gender_count.to_dict()}) if province_count: most_prov max(province_count, keyprovince_count.get) print(f主要生源省份{most_prov}{province_count[most_prov]}人) else: print(无有效省份数据) rank_mean df[名次].mean() rank_max df[名次].max() rank_min df[名次].min() print(f大三上学期名次统计平均名次{rank_mean:.1f}最佳名次{rank_min}最差名次{rank_max}注名次数值越小越好) print(f人生格言情感分布{sentiment_count.to_dict()})3. 可视化结果与分析1基础属性分析性别分布班级男生占比 70%女生占比 30%符合软件工程专业的性别结构特征。生日分布学生生日在全年各月份均有分布无明显集中趋势便于班级活动安排。2生源分布分析省份分布学生以山东省内生源为主占比 87.5%省外生源集中在河南、河北、江苏等周边省份。城市分布Top3 生源地市为潍坊、青岛、烟台是班级核心生源地。招生建议重点加大潍坊、青岛、烟台等省内核心地市的招生宣传力度巩固生源基本盘针对河南、河北等省外生源集中省份拓展招生渠道提升省外生源占比针对生源空白省份可开展针对性宣传扩大学校影响力。3学业情况分析成绩分布班级平均分 82.3 分及格率 100%55% 学生处于良好区间80-89 分15% 学生达到优秀90 分 整体学业水平优秀。4个人特征分析签名词云高频词以 “自己、早睡早起、锻炼身体、增强体质” 等积极词汇为主学生群体呈现正向价值观与学习动力。情感分析90% 以上学生签名为积极 / 中性无明显消极情绪班级整体氛围积极向上。5宿舍关系分析宿舍以 4-6 人间为主分布均匀无极端人数差异便于班级管理与宿舍文化建设。4. 拓展建议新增学生属性建议在信息表中补充高考分数、兴趣特长、家庭所在地、就业意向、社团参与情况等字段可进一步开展学业相关性分析、就业趋势预测等深度研究。分析拓展可结合成绩与生源地、宿舍的相关性分析不同生源地学生的学业表现差异为分层教学提供依据。四、案例 2微信好友数据分析1. 设计思想以微信好友数据为数据源围绕社交画像、地域分布、个人特征、商业行为四大维度展开分析通过可视化还原好友群体特征推断用户工作场景挖掘社交数据价值。2. 完整源码python运行# 案例2微信好友数据分析 import pandas as pd import matplotlib.pyplot as plt from wordcloud import WordCloud import jieba from snownlp import SnowNLP from pyecharts.charts import Map, Bar, Liquid from pyecharts import options as opts from collections import Counter import warnings warnings.filterwarnings(ignore) # 解决中文乱码 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False # ---------------------- # 1. 数据读取与预处理 # ---------------------- df pd.read_csv(rC:\Users\臭臭\python_file\wechat_friends.csv, encodingutf-8-sig) df df.dropna(subset[昵称, 性别, 省份, 城市, 签名]) # ---------------------- # 2. 好友性别饼状图可视化 # ---------------------- gender_cnt df[性别].value_counts() plt.figure(figsize(6,6)) plt.pie(gender_cnt, labelsgender_cnt.index, autopct%.1f%%, colors[#4FC3F7, #F06292], startangle90, textprops{fontsize:12}) plt.title(微信好友性别分布, fontsize14, fontweightbold) plt.savefig(案例2_性别分布.png, dpi300, bbox_inchestight) plt.close() # ---------------------- # 3. 好友省份中国地图可视化 # ---------------------- prov_cnt df[省份].value_counts() prov_data list(zip(prov_cnt.index, prov_cnt.values)) map_chart ( Map() .add(好友人数, prov_data, china) .set_global_opts( title_optsopts.TitleOpts(title微信好友省份分布), visualmap_optsopts.VisualMapOpts(max_max(prov_cnt.values)) ) ) map_chart.render(案例2_省份地图.html) # ---------------------- # 4. 城市地理信息可视化 # ---------------------- city_cnt df[城市].value_counts().head(10) bar_chart ( Bar() .add_xaxis(city_cnt.index.tolist()) .add_yaxis(好友人数, city_cnt.values.tolist()) .set_global_opts( title_optsopts.TitleOpts(title微信好友城市分布(Top10)), xaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(rotate45)) ) ) bar_chart.render(案例2_城市分布柱状图.html) # ---------------------- # 5. 签名情感极性分类与词云化 # ---------------------- # 情感分析 df[情感极性] df[签名].apply(lambda x: SnowNLP(x).sentiments) df[情感标签] df[情感极性].apply(lambda x: 积极 if x0.6 else 中性 if 0.4x0.6 else 消极) sentiment_cnt df[情感标签].value_counts() # 词云 stopwords set(open(stopwords.txt, r, encodingutf-8).read().splitlines()) text .join(df[签名].dropna().tolist()) words jieba.lcut(text) filtered_words [word for word in words if word not in stopwords and len(word) 1] wc WordCloud( font_pathC:/Windows/Fonts/msyh.ttc, width1000, height600, background_colorwhite, max_words200 ).generate( .join(filtered_words)) plt.figure(figsize(12,8)) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.title(微信好友签名词云, fontsize16, fontweightbold) plt.savefig(案例2_签名词云.png, dpi300, bbox_inchestight) plt.close() # ---------------------- # 6. 昵称广告统计水滴图 # ---------------------- # 模拟广告关键词统计可根据实际数据调整 ad_keywords [微商, 代购, 推广, 招商, 兼职] ad_count sum([1 for nick in df[昵称] if any(k in nick for k in ad_keywords)]) ad_rate ad_count / len(df) liquid ( Liquid() .add(广告昵称占比, [ad_rate]) .set_global_opts(title_optsopts.TitleOpts(title好友昵称广告占比水滴图)) ) liquid.render(案例2_广告占比水滴图.html) # ---------------------- # 7. 数据分析与结论 # ---------------------- print( 案例2 分析结论 ) print(f好友总数{len(df)}人) print(f性别分布{gender_cnt.to_dict()}) print(f核心好友省份{max(prov_cnt, keyprov_cnt.get)}{prov_cnt[max(prov_cnt, keyprov_cnt.get)]}人) print(f核心好友城市{max(city_cnt.index, keycity_cnt.get)}{city_cnt.iloc[0]}人) print(f签名情感分布{sentiment_cnt.to_dict()}) print(f广告昵称占比{ad_rate*100:.1f}%)3. 可视化结果与分析1社交画像分析性别分布好友性别比例均衡无明显倾斜符合普通用户社交结构特征。广告占比广告类昵称占比低于 5%好友群体商业属性较弱以私人社交为主。2地域分布分析省份分布好友集中在山东、黑龙江、北京、广东等省份核心生源地与案例 1 班级生源高度重合。城市分布核心好友城市为济南、哈尔滨、北京、深圳结合吴迪老师的身份可推断其工作地点为济南高校所在地与班级生源地高度匹配。3个人特征分析签名词云好友签名以 “生活、热爱、努力、未来” 等积极词汇为主群体整体心态积极向上。情感分析85% 以上好友签名为积极 / 中性社交氛围正向。4. 拓展建议新增分析维度可补充好友年龄段、职业、添加时间、互动频率等字段开展社交关系深度分析如不同职业好友的地域分布、互动行为差异等。技术拓展可接入腾讯云人脸识别 API完成好友头像的性别、年龄预测丰富用户画像维度可结合朋友圈数据开展内容偏好分析。五、总结与未来展望1. 项目总结本项目完整实现了两类结构化数据的全流程分析通过多维度可视化直观呈现数据特征输出了可落地的业务建议验证了 Python 在数据分析领域的高效性与实用性。两个案例分别覆盖了校园场景与社交场景形成了可复用的数据分析模板。2. 未来展望技术升级引入机器学习算法实现学生成绩预测、好友情感分类的自动化模型数据拓展接入更多维度数据如消费数据、行为数据开展多源数据融合分析可视化升级开发交互式 Dashboard实现数据的实时更新与动态展示应用落地将分析方案封装为自动化工具为高校招生、社交研究提供标准化解决方案。六、使用说明确保数据文件与代码在同一目录安装所有依赖库运行代码自动生成所有可视化文件可根据实际数据调整字段名、统计维度适配不同场景需求。

更多文章