1. 项目概述
这个数据分析与可视化项目源于一个实际需求:如何从微信好友和学生信息这两类看似不相关的数据中挖掘有价值的信息。作为一名长期从事数据工作的开发者,我发现很多人在微信社交和学生管理中都积累了海量数据,却很少真正利用这些数据。
项目核心是通过Python技术栈实现以下目标:
- 从微信导出好友数据(需手动导出或通过合规API获取)
- 整理学生信息数据库(模拟或脱敏真实数据)
- 使用pandas进行数据清洗和特征提取
- 通过pyecharts构建交互式可视化看板
注意:所有数据处理必须遵守隐私保护原则,本文示例数据均为模拟生成,实际应用中请确保数据脱敏
2. 数据准备与清洗
2.1 微信好友数据获取
微信官方并不直接提供好友数据导出API,但可以通过以下合规方式获取基础数据:
- 使用微信电脑版"通讯录管理"功能导出CSV
- 通过企业微信接口(需企业账号权限)
- 手动整理备注信息(最安全但效率低)
典型数据结构示例:
python复制{
"昵称": "张三",
"备注": "大学同学-计算机系",
"地区": "北京",
"性别": 1,
"添加时间": "2020-05-01"
}
2.2 学生信息数据处理
学生数据通常来自教务系统,建议使用pandas进行结构化处理:
python复制import pandas as pd
# 读取Excel数据
students = pd.read_excel('students.xlsx')
# 基础清洗
students['年龄'] = (pd.to_datetime('today') - pd.to_datetime(students['出生日期'])).dt.days // 365
students['BMI'] = students['体重'] / (students['身高']/100)**2
常见清洗操作:
- 处理缺失值:
df.fillna() - 类型转换:
pd.to_datetime() - 异常值过滤:
df[(df['成绩']>=0) & (df['成绩']<=100)]
3. 数据分析关键技术
3.1 社交网络分析
通过微信好友数据可以构建社交关系图谱:
python复制from collections import defaultdict
relations = defaultdict(int)
for note in df['备注']:
if '-' in note:
relation = note.split('-')[0]
relations[relation] += 1
# 转换为DataFrame
relation_df = pd.DataFrame({
'关系类型': relations.keys(),
'数量': relations.values()
}).sort_values('数量', ascending=False)
3.2 学生成绩分析
典型分析维度包括:
- 各科成绩分布
- 成绩与出勤率相关性
- 班级排名趋势
使用pandas快速统计:
python复制# 按班级统计平均分
class_avg = students.groupby('班级')[['语文','数学','英语']].mean()
# 计算综合排名
students['总分'] = students[['语文','数学','英语']].sum(axis=1)
students['排名'] = students.groupby('班级')['总分'].rank(ascending=False)
4. 可视化实现
4.1 pyecharts基础配置
python复制from pyecharts import options as opts
from pyecharts.charts import Pie
pie = (
Pie()
.add("", [list(z) for z in zip(relation_df['关系类型'], relation_df['数量'])])
.set_global_opts(title_opts=opts.TitleOpts(title="微信好友关系分布"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
pie.render("relation_pie.html")
4.2 高级可视化案例
学生成绩分布雷达图:
python复制from pyecharts.charts import Radar
radar = (
Radar()
.add_schema(
schema=[
opts.RadarIndicatorItem(name="语文", max_100),
opts.RadarIndicatorItem(name="数学", max_100),
opts.RadarIndicatorItem(name="英语", max_100),
opts.RadarIndicatorItem(name="物理", max_100),
opts.RadarIndicatorItem(name="化学", max_100)
]
)
.add("优秀学生", [avg_scores_top10])
.add("全班平均", [avg_scores_all])
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
微信好友地域分布热力图:
python复制from pyecharts.charts import Geo
geo = (
Geo()
.add_schema(maptype="china")
.add(
"好友分布",
[list(z) for z in zip(provinces, counts)],
type_="heatmap"
)
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=max_count),
title_opts=opts.TitleOpts(title="微信好友地域分布热力图"),
)
)
5. 实战经验与避坑指南
5.1 数据清洗常见问题
-
时间格式不一致:
- 原始数据中常见"2023/01/01"、"2023-01-01"、"20230101"混用
- 解决方案:统一使用
pd.to_datetime()强制转换
-
中文编码问题:
- 读取CSV时出现乱码
- 指定编码:
pd.read_csv('data.csv', encoding='gb18030')
-
缺失值处理误区:
- 不要简单用0填充所有空值
- 分类变量用众数,连续变量用中位数
5.2 可视化优化技巧
-
颜色搭配原则:
- 使用渐变色表示数值大小
- 不同类别采用对比色
- 避免使用红色/绿色对比(色盲用户不友好)
-
交互设计要点:
- 添加数据筛选功能
- 设置合理的tooltip显示格式
- 对大数据集采用下采样提高渲染性能
-
移动端适配:
python复制.set_global_opts( toolbox_opts=opts.ToolboxOpts(is_show=True), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")] )
6. 项目扩展方向
6.1 自动化数据更新
使用schedule库实现定时分析:
python复制import schedule
import time
def daily_job():
# 数据更新和分析逻辑
pass
schedule.every().day.at("02:00").do(daily_job)
while True:
schedule.run_pending()
time.sleep(60)
6.2 集成机器学习模型
示例:预测学生成绩趋势
python复制from sklearn.ensemble import RandomForestRegressor
# 特征工程
X = students[['上次成绩', '出勤率', '作业完成率']]
y = students['本次成绩']
# 训练模型
model = RandomForestRegressor()
model.fit(X, y)
# 预测并可视化
students['预测成绩'] = model.predict(X)
6.3 构建Web看板
使用Flask+pyecharts构建完整应用:
python复制from flask import Flask
from pyecharts.charts import Bar
app = Flask(__name__)
@app.route("/")
def index():
bar = Bar().add_xaxis(["A", "B", "C"]).add_yaxis("系列", [1,2,3])
return bar.render_embed()
我在实际项目中总结的几个关键点:
- 微信数据获取要特别注意合规性,最好使用官方导出功能
- 学生成绩分析时要注意数据脱敏,删除或加密身份证等敏感信息
- pyecharts的全局配置(opts)需要反复调试才能达到最佳视觉效果
- 大数据量时考虑使用pyecharts的并行渲染功能提升性能
