基于Python的数据分析与可视化

发布时间:2026/10/11 21:53:48

基于Python的数据分析与可视化 前言数据分析与可视化经常被当成一件事来说其实是两个环节分析是从数据里提炼事实哪个分组最高、趋势在涨还是跌、两列之间有没有关系可视化是把提炼出的事实画成图让人一眼看懂。两者顺序不能颠倒——先分析、再画图先画图再找结论很容易被图形的视觉暗示带偏。新手最大的误解是不会 matplotlib 就做不了数据分析。事实相反统计分析几乎全部可以用标准库完成statistics、collections、math可视化才是真正依赖第三方库的那一层。matplotlib、seaborn、plotly 都是第三方库本机没有安装本文只讲它们的使用思路具体 API 以各自官方文档为准。本文先用纯标准库走完一整条描述性分析链路再用字符画出一个能直接看结果的条形图让你在没有绘图库的环境里也能把结论展示出来。一、分析流程从原始数据到结论一个可复用的分析流程通常固定成五步明确问题要回答的是哪个渠道转化最高还是这周的销量是不是异常问题不同指标就不同。取数与清洗把脏数据、缺失、单位不统一处理干净。描述性统计算集中趋势均值、中位数和离散程度极差、标准差。分组对比按维度切开看差异这是最出结论的一步。呈现表格或图形。第 3、4 步最容易被跳过直接跳到画图。结果就是画了一张很漂亮的图但说不出哪个组显著高于其他组图只是装饰。分析目标常用指标标准库来源典型水平均值、中位数statistics.mean/median波动大小极差、标准差max-min/statistics.stdev分布形状分位数statistics.quantiles频次结构计数、占比collections.Counter线性相关相关系数手写协方差 / 标准差二、纯标准库做描述性统计假设我们已经把数据清洗成分组名到数值列表的字典统计就变成了遍历。# 适用于 Python 3.8import statisticsdef describe(values):n len(values)if n 0:return Noneresult {n: n,mean: statistics.mean(values),median: statistics.median(values),min: min(values),max: max(values),range: max(values) - min(values),}result[stdev] statistics.stdev(values) if n 1 else 0.0return resultdata {A: [12, 15, 11, 14, 13], B: [30, 9, 22, 40, 18]}for name, values in data.items():print(name, describe(values))推演A组均值 13、中位数 13五个数都在 11~15 之间range是 4说明这组很稳B组均值 23.8、中位数 22但极差高达 31标准差明显更大。只看均值会得出B 组水平更高的结论但中位数和极差告诉你 B 组其实很不稳定——这正是分析要先看离散程度的原因。如果数据里有极端值outlier均值会被它拉走这时中位数更能代表典型水平。这也是为什么薪资、房价这类长尾分布的数据官方通报常用中位数而不是平均值。三、相关系数手写一遍就懂了两个变量之间有没有线性关系用皮尔逊相关系数Pearson correlation coefficient衡量取值范围是 -1 到 1接近 1 是强正相关接近 -1 是强负相关接近 0 是无线性关系。第三方库有现成函数但用标准库手写一遍能看清它的构造。# 适用于 Python 3.8import mathimport statisticsdef pearson(xs, ys):if len(xs) ! len(ys) or len(xs) 2:raise ValueError(两组数据长度必须相同且至少两个)mx statistics.mean(xs)my statistics.mean(ys)cov sum((x - mx) * (y - my) for x, y in zip(xs, ys))sx math.sqrt(sum((x - mx) ** 2 for x in xs))sy math.sqrt(sum((y - my) ** 2 for y in ys))if sx 0 or sy 0:raise ValueError(某一组数据没有波动无法计算相关)return cov / (sx * sy)分子是协方差的和分母是两个标准差未除以 n 的版本的乘积比值正好消掉了量纲。注意当某一列所有值都相同时sx为 0会导致除零所以必须先判断。这里要强调一句相关不等于因果。两个变量高度相关可能是第三个因素同时影响它们也可能是巧合。相关系数是发现线索的工具不是下结论的证据。四、用字符画一张图在没有绘图库的环境里可以用字符拼出横向条形图原理是把数值按比例缩放到固定的字符宽度。# 适用于 Python 3.8def bar_chart(data, width40):top max(data.values())if top 0:raise ValueError(最大值必须为正)for name, value in sorted(data.items(), keylambda kv: kv[1], reverseTrue):blocks round(value / top * width)print(f{name:6}| {# * blocks} {value})bar_chart({A: 13, B: 24, C: 7})推演最大值 24 映射到 40 个字符B取满 40 个#A是 13/24 ≈ 0.54取 22 个C是 7/24 ≈ 0.29取 12 个。格式化串里的左对齐标记配宽度 6保证各行的竖线能对齐。这类字符图和折线图、饼图比不了信息密度但胜在零依赖、能在纯文本终端里直接看。真实的可视化靠 matplotlib 这类库用它时的思路是固定的三步准备两个等长的序列x 和 y、调用对应的绘图函数、设置标题与坐标轴标签并show()或保存成文件。seaborn 在 matplotlib 之上封装了统计图形plotly 走交互式路线。这些库的具体函数名和参数请以各自官方文档为准不同版本之间有过调整。常见坑点拿均值代表长尾数据的典型水平。收入、房价、访问时长这类右偏分布里均值被少数极大值拉高会误导读者。❌ 只报statistics.mean(prices)就说平均房价是 X ✅ 同时给出statistics.median(prices)中位数更能代表中间那个人。在样本量为 1 时调用stdev()。样本标准差需要至少两个观测值否则抛StatisticsError。❌statistics.stdev([42])✅statistics.stdev(values) if len(values) 1 else 0.0。把stdev()与pstdev()混用。前者除以 n-1样本后者除以 n总体同一批数据算出的数不一样。❌ 认为两个函数结果相同、随便挑一个 ✅ 抽样数据用stdev()把整批当作总体用pstdev()。手写相关系数时不检查标准差是否为 0。当某一列所有值相同时分母为 0会抛ZeroDivisionError。❌ 直接cov / (sx * sy)✅ 先判断sx 0 or sy 0并给出明确错误。用相关系数直接下因果结论。相关只能说明同涨同跌不能说明谁导致谁。❌ 销售额和广告费相关系数 0.9所以投广告一定能涨销量 ✅ 把相关系数当作待验证的线索再用对照实验等方法去验证。画图前不做分组把不同量纲的数据放在一张图上。销售额百万级和转化率0 到 1画在同一坐标轴上转化率会被压成一条贴底的直线看不出任何变化。❌ 把量纲差异巨大的两列直接叠加绘制 ✅ 拆成子图或对其中一列做归一化 / 换用双坐标轴。以为字符宽度 1 的柱状图可以直接当正式图表用。终端字符宽度与像素不成比例且没有坐标轴与刻度只适合快速窥探数据。❌ 把字符图直接贴进正式报告 ✅ 字符图用于本地调试和粗看正式呈现交给绘图库。忽略异常值就计算相关性。一个离群点足以把相关系数从接近 0 抬到很高或者反过来压到很低。❌ 原样喂给相关函数 ✅ 先做异常值识别再决定是剔除、缩尾还是分箱。总结阶段用什么注意明确问题人先定指标再动手别让图形牵着结论走清洗上一节的csv/ 字符串处理脏数据会污染全部下游统计描述统计statistics均值配中位数、stdev配pstdev要分清分组对比dict 循环这一步才出结论相关分析手写皮尔逊或第三方相关不等于因果可视化matplotlib 等第三方或字符图第三方 API 以官方文档为准数据分析的价值在于从数据到判断的这一段推理可视化只负责把结论传达出去。先用标准库把集中趋势、离散程度、分组差异算清楚再决定用什么图去表达顺序对了哪怕只有字符图也比一张没有结论的漂亮图表有用得多。
延伸阅读

更多相关文章

2026/10/11 21:53:48

如何使用Python代码创建表格

前言 很多初学者看到「用 Python 创建表格」这个说法会犯嘀咕:Python 语言本身并没有一种叫「表格」的内置类型。list、tuple、dict、set 都是数据结构,它们能装数据,但不会自己变成一张有行列、有边框的表格。所以这个题目的真实含义是——用…

2026/10/11 21:53:48

如何利用Python提取pdf中的表格数据(附实战案例)

前言 用 Python 从 PDF 里抠表格,是自动化办公里最容易「预期落空」的一项任务。很多人上手前的预期是:装一个库,调用一个「提取表格」的方法,拿到一个干净的二维数组。真实情况是——提取出来的东西常常串行、错列、把两列合成一…

2026/10/11 22:59:17

电信用户流失预测实战:Python机器学习分类全流程解析

简介:面向机器学习初学者与算法竞赛实践者,Python基于机器学习的电信用户流失预测项目,以Kaggle平台上的Telco Customer Churn数据集为对象,完整演示从业务理解到模型验证的端到端流程。项目按三个典型阶段展开:业务背…

2026/10/11 22:59:17

双连杆机械臂反向运动学Matlab代码实战与避坑指南

简介:这是一份基于Matlab环境开发的双连杆机器人手臂反向运动学代码包,面向已知末端位姿求解关节角度的典型问题,适合计算机、电子信息工程、数学等专业学生用于课程设计、期末大作业和毕业设计,也适合机器人初学者结合仿真快速掌…

2026/10/11 22:59:17

慢查询从1200ms到0.4ms:连接条件下推的SQL优化实战

半个月前我接到一条慢查询工单,一个订单聚合报表SQL平均耗时1200ms,高峰期甚至到1.5秒。业务方已经想把报表接口改成异步任务,我拦住他们说先别急。翻出执行计划一看,问题根本不是缺索引,也不是业务逻辑复杂&#xff0…

2026/10/11 22:59:17

社交网络分析课设实战:NetworkX图论、中心性与传播模型

简介:这份资源是哈尔滨工业大学计算机课程实验中的社交网络分析项目,面向高校计算机相关专业学生及需要完成课程设计的学习者,帮助其将数据挖掘、图论与算法实现等理论落地为可运行代码。压缩包为zip格式,整体约1.74MB&#xff0c…

2026/10/11 22:59:17

冷却循环水反复结垢?清洗治标不治本,水质管理才是关键

不知道你有没有遇到过这样的怪事:一套冷却循环水系统,隔两三个月就得停下来请人清洗一次。清洗队前脚刚走,换热器的压差确实马上恢复正常,水温也压得住了。可没过多久,同样的问题又卷土重来,检修记录本上又…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑