资讯动态

Python数据分析概述:从环境搭建到数据清洗与可视化全流程

发布时间:2026/10/17 16:19:48 来源:尧图企业网站定制
简介面向Python数据分析初学者的教学课件内容对应第1章“Python数据分析概述”系统讲解数据分析的概念、六步流程、典型应用场景及常用工具适合高校相关课程、企业培训或自学入门使用。资源共1个文件为PPT演示文稿压缩包大小4.07MB页面内容完整既可直接用于课堂教学也可作为课前预习和知识梳理的参考。目前已有135人学习说明该课件对初学者具有一定参考价值。课件详细阐述了狭义数据分析与数据挖掘的区别并结合客户分析、营销分析、社交媒体分析、网络安全、设备管理等实际案例展开说明同时对比了R、Python、MATLAB三种语言的难易程度与适用领域介绍Anaconda、Jupyter Notebook、NumPy、Pandas、Matplotlib、Scikit-learn等核心工具还总结了Python数据分析的五大优势。整体逻辑清晰、案例丰富能帮助读者快速建立数据分析的整体认知框架为后续学习打好基础。1. 这一页 PPT 不只是概念Python 数据分析概述背后是一条完整链路「Python 数据分析概述」这一章在课程安排里通常只占一节课但它决定了你后面能不能顺利学下去。多数人以为这是讲「Python 是什么、为什么火」的绪论翻过去就完事实际上PPT 里分页展示的「数据读取—数据清洗—分组计算—可视化」四步就是整个数据分析工作的主链路后面每一个章节都在这条链路上做深化。这里不重复那一页大纲而是把它展开成一套能直接跑通的最小方案装环境、读数据、查数据、洗数据、算指标、出图表一条龙走完。适合刚带新人的讲师也适合从 Excel 转过来的业务分析照着跑一遍就知道这门课值不值得深学、坑在哪里。2. 为什么数据分析要先学 Python三个库的分工与一条主链路2.1 NumPy、pandas、Matplotlib 各自管住哪一段Python 能成为数据分析的事实标准不是因为这门语言本身而是因为围绕它长出了三个配合紧密的库NumPy 负责数值计算pandas 负责表格化操作Matplotlib 负责出图。绝大多数教材把这三个库拆成独立章节讲导致初学者学完 NumPy 忘了 pandas学完 pandas 又不知道图怎么画。真正的学习顺序应该是先建立一个总认知知道每个库解决哪一类问题再往里填细节。先看 NumPy。它的核心是一个多维数组对象 ndarray。为什么 pandas 和很多机器学习库都建立在它之上因为 Python 原生的列表做数值计算时性能太差列表元素可以是任意对象每次运算都要做类型检查循环几百万元素会消耗大量时间。NumPy 的数组是同质的所有元素类型一致数据在内存里连续存放配合向量化操作一个表达式就能完成整个数组的逐元素运算。举例来说要对一万个数字各自乘以 2Python 列表要写 for 循环NumPy 只需要arr * 2后者快几十倍。这个「向量化」的思维方式贯穿整个数据分析周期。接着是 pandas。它的核心对象 DataFrame 可以理解成「带列名和行索引的表格」和 Excel 工作表在视觉上非常接近但在操作方式上完全不同。pandas 几乎所有方法都是列优先的求和、均值、去重默认都是逐列计算这种设计让它在做宽表聚合时比 Excel 手工拖公式高效得多。底层存储用到了 NumPy 数组因此既继承了速度又加上了列名、索引、缺失值标记、时间序列这类数据分析特有的能力。最后是 Matplotlib。它的定位是底层绘图库API 偏底层画一张柱状图要写好几行代码但换来的是每个细节都可控字体、坐标轴、刻度、线型、颜色全部能精确指定。很多入门者第一眼会觉得它的默认样式不够好看转去学花哨的绘图库我个人的习惯是没有特别需求时Matplotlib 足够覆盖日常 90% 的场景。数据结果的价值在数字本身把图保存成 PNG 发出去比在交互式窗口里反复调样式重要得多。三个库串起来就是一条主链路NumPy 提供计算的引擎pandas 把原始数据变成结构化表格并完成清洗和聚合Matplotlib 把聚合结果画出来。这条链路上还有一个容易被忽略的细节pandas 的 DataFrame 由多个 NumPy 数组拼成你在df[列名]上做运算时底层触发的是 NumPy 的向量化操作因此写出高效代码的关键不是把 Python 练到炉火纯青而是少用循环、多用库函数。下面这张对照表是我平时给新人讲课时用的把 Excel 里的常用操作翻译成 pandas 写法也能顺便看出为什么这章 PPT 值得认真读任务Excel 操作pandas 对应写法说明筛选行自动筛选勾选df[df[列] 100]布尔索引条件写在方括号里排序数据–排序df.sort_values(列)默认升序加ascendingFalse降序汇总分类汇总df.groupby(分组列)[值列].sum()分组后必须指定值列和聚合函数透视表插入透视表pd.pivot_table(df, index行, columns列, values值, aggfuncsum)参数名与透视表四个区域一一对应2.2 数据形态的转变从单元格到 DataFrame 的两种关键认知从 Excel 转到 Python最需要建立的第一个认知是DataFrame 的操作是列优先的。Excel 里你选中一行删除、整行挪动先想到的是行pandas 里大多数场景你关心的是「某一列有没有缺失、某一列的和、某一列的类型」行只是这些列的对齐方式。新手最常见的翻车就是把 Excel 的行思维带进来想算总销售额先想怎么选中整张表而正确写法是直接df[销售额].sum()一行解决。第二个认知是数据默认被全部载入内存。Excel 打开文件时可以只加载可见区域pandas 的read_csv会一次性把整个文件读进内存后续所有操作都在内存里完成。这个设计带来两个推论一是文件越大启动越慢机器内存就是瓶颈二是读取阶段就可以用usecols参数只挑需要的列把用不上的列直接丢掉能省下大量内存。这个认知最现实的价值是让你在看到「内存不足」报错时不慌——它不是 bug是设计如此解法是抽样、分块读取或者换一个更轻量的格式。再说什么时候该用 Python什么时候继续用 SQL 和 Excel。我的判断标准很简单数据以本地文件形式存在、清洗逻辑复杂、或者接下来要做建模和预测这三条命中任意一条就用 Python如果只是查几个数字SQL 一条语句能搞定没必要把 Python 拉进来。概述章放在第一章恰恰是想在读者被语法细节淹没之前先把「数据处理的通用路径」立起来——你之后学的每一个函数都是在为这条路径上的某一步服务。很多人纠结要不要先把 Python 语法书看完再开始答案是没必要边用边补更快这条路径先跑起来比什么都重要。3. 把分析环境跑起来最小安装、三种数据读法与三项探查3.1 用虚拟环境装好最小组合十分钟内开始写代码先装 Python建议装 3.10 或更高版本官方安装包装好后在命令行输入python --version能直接看到版本号。为了避免不同项目之间的依赖互相污染强烈建议新开一个虚拟环境把数据分析相关的库装在独立环境里。常见的做法是用 Python 自带的 venv一不需要额外安装工具二足够应对入门阶段的需求。# 在你想放项目的位置执行创建名为 da_env 的虚拟环境 python -m venv da_env # 激活环境macOS / Linux source da_env/bin/activate # 激活环境WindowsPowerShell 或 CMD da_env\Scripts\activate # 安装最小组合numpy、pandas、matplotlib、openpyxl pip install numpy pandas matplotlib openpyxl激活成功后命令行提示符前面会出现(da_env)此时 pip 安装的包都在这个环境内不会污染系统 Python。最后那个 openpyxl 不是主分析库而是 pandas 读取 .xlsx 文件时依赖的引擎入门阶段最容易漏装的就是它提前装上省得后面报错再补。如果你用的是 Linux 服务器且没有图形界面Matplotlib 画图前还需要额外指定非交互后端不过第一章用本机环境跑就足够了。安装完成后跑一个最小验证脚本确认三个库能同时导入版本之间没有兼容冲突import pandas as pd import numpy as np import matplotlib.pyplot as plt print(pandas:, pd.__version__) print(numpy:, np.__version__) print(matplotlib:, plt.matplotlib.__version__)如果第一行import pandas就报 ModuleNotFoundError绝大多数原因是当前终端没有激活虚拟环境重新执行激活命令即可如果提示找不到 matplotlib单独pip install matplotlib补装。这里有一个我一直沿用的习惯先单独跑一次导入脚本再开始读数据不要等写了 50 行代码才在中间某一行发现环境问题那时候排查起来很痛苦。__version__是每个库自带的版本字符串打印出来可以确认导入成功也能在未来遇到兼容问题时快速定位版本差异。3.2 三种读数据的方式CSV、Excel、SQL数据在本地最常见的形态是 CSV 和 Excel团队协作时则可能是数据库里的表。pandas 对三种来源都有现成函数参数也不难记关键在于每个场景的一个核心参数不要漏。import pandas as pd # 1. 读 CSVencoding 是最常踩坑的参数Windows 下很多文件是 GBK 编码 df_csv pd.read_csv(sales.csv, encodingutf-8-sig) # 2. 读 Excelengineopenpyxl 对应 .xlsx 格式 df_excel pd.read_excel(sales.xlsx, sheet_nameSheet1, engineopenpyxl) # 3. 读 SQL需要先安装 sqlalchemy 和对应数据库驱动 # from sqlalchemy import create_engine # engine create_engine(sqlite:///sales.db) # df_sql pd.read_sql(SELECT * FROM orders WHERE 日期 2024-01-01, engine)第一行编码参数值得单独说Windows 平台的 Excel 导出 CSV 常用 GBK直接read_csv不指定编码中文列名会变成乱码甚至直接抛 UnicodeDecodeError。utf-8-sig是带 BOM 的 UTF-8兼容性比utf-8更好Mac 和 Linux 上一般用utf-8即可。如果不确定文件编码可以先试encodinggbk再不行就用errorsreplace让无法解析的字符替换成占位符先把列名看清楚。第二行读 Excelsheet_name可以传工作表名也可以传位置序号比如 0 代表第一个工作表.xlsx后缀必须要有 openpyxl.xls老格式则需要 xlrd 引擎安装方式同样是 pip 安装对应包。第三行读 SQL 注释里带了一条示例初学者最容易犯的错误是在read_sql里写一大段 Python 字符串拼接正确做法是先单独把 SQL 写清楚、在数据库客户端里跑通再放进 pandas出问题时便于定位是 SQL 的问题还是 pandas 的问题。3.3 三行代码看清数据全貌shape、dtypes、describe读进来的数据不要急着算先花十秒钟看清它的整体情况。我一般用四个方法打头阵shape 看规模dtypes 看类型head 看内容describe 看统计分布。print(df.shape) # (行数, 列数)先确认数据体量 print(df.dtypes) # 每列数据类型object 通常代表文本或类型错乱 print(df.head(5)) # 打印前 5 行肉眼确认列名和内容 print(df.describe()) # 数值列统计摘要均值、标准差、最小值、四分位数、最大值shape 返回一个元组第一个元素是行数第二个是列数这个数字决定了后续操作的内存压力。dtypes 每个值常见的有 int64、float64、object、datetime64 四种其中 object 最值得警惕——它可能是正常的文本列也可能是日期或数字被读成了字符串后面需要转换。describe 默认只统计数值列输出里如果 count 比 shape 的行数小说明这一列有缺失值这是判断数据是否需要清洗的最快信号。这三项探查我称之为「数据体检」在整个分析流程里只占十秒钟但能避免 80% 的后续返工。比如 dtypes 显示日期列是 object后面分组按月汇总就会报错你不如在这一步就用pd.to_datetime把它转掉再比如 describe 里发现销售额最小值为负数你就要想清楚这个负数是退款还是脏数据先决定处理策略再往下走。4. 概述章里最该落地的部分从清洗到出图的最小分析流程概述章 PPT 里的流程图画得再漂亮也不如亲手跑通一遍。这一章我用一份模拟的销售数据讲透「读—查—洗—算—画」假设 DataFrame 里已经有日期、产品、单价、销量、销售额、订单号六列后续代码都基于这个结构展开。如果你的数据结构差不多可以逐段照抄不一样就改列名原理一致。4.1 清洗先量化缺失再决定删除还是填充拿到数据先别急着填充第一步永远是量化缺失。缺失值处理没有万能方案删除还是填充取决于缺失量、列的重要性和业务含义乱填比不填更危险。# 第一步量化缺失逐列列出缺失数量 print(df.isna().sum()) # 第二步核心字段缺失则删除该行subset 限定只在这些列上检查 df_clean df.dropna(subset[销售额, 订单号]) # 第三步数值类次要字段用均值填充类别字段用众数填充 df_clean[销量] df_clean[销量].fillna(df_clean[销量].mean()) df_clean[产品] df_clean[产品].fillna(df_clean[产品].mode()[0]) # 第四步顺手处理重复行保留第一条 df_clean df_clean.drop_duplicates()isna().sum()先给出一份缺失清单你会一眼看出哪些列缺得多、哪些列几乎没有缺。dropna的subset参数很关键它把检查范围限定在业务上不可为空的关键列而不是整表所有列——备注列空着很正常不该因为备注为空就删除整行。fillna对数值列用均值是入门阶段默认做法但如果数据有季节性波动均值会失真更稳的是按组填充比如用 groupby 后 transform 算各组均值再填。类别列用mode()[0]取众数注意mode返回的是一个 Series必须加[0]取第一个值。重复行用drop_duplicates时默认保留第一次出现的行如果希望保留最后一次加参数keeplast。注意fillna里直接调用mean()会在每次填充时重新计算全列均值数据量加大后建议先用groupby算出分组均值再map回原表能省不少时间。清洗这一步还有个版本习惯要提早期 pandas 教程里到处是inplaceTrue新版官方文档已经不太推荐这样做——inplace 是否生效在各版本间表现不完全一致而且原地修改不利于追溯。我现在的习惯是每次操作都赋给新变量如df_clean既能保留原始数据做对比也避免在长链式操作中出现不明所以的告警。4.2 分组聚合groupby 加 agg一步算完所有指标清洗后的数据要回答业务问题最常用的是分组聚合按产品分、按月分、按地区分再看每个组的总和、平均值、数量。pandas 的groupby和agg组合能把多指标一次算完比多次筛选再分别统计高效得多。# 按产品分组同时计算总销售额、平均单价、订单数三个指标 result ( df_clean .groupby(产品) .agg( 总销售额(销售额, sum), 平均单价(单价, mean), 订单数(订单号, count) ) .reset_index() ) print(result)groupby(产品)把数据按产品拆成若干组后续 agg 里的每一组三元组都是「新列名(原列名, 聚合函数)」的写法这是 pandas 的命名聚合比旧版的agg({销售额: sum})更清晰。sum 是求和mean 是均值count 是统计非缺失的个数——注意 count 和 size 的区别count 只数非空值如果订单号列有缺失结果会比实际行数小确定该列没有缺失时用 count 就够了。reset_index()这一步千万别漏不加它产品列会变成行索引打印出来「产品」这一列凭空消失这是新手最容易困惑的地方。如果业务需要按时间汇总比如看月度趋势可以先在清洗阶段把日期列转成时间类型再用pd.Grouper做分组df_clean[日期] pd.to_datetime(df_clean[日期]) monthly ( df_clean .groupby(pd.Grouper(key日期, freqM)) .agg(总销售额(销售额, sum)) .reset_index() )freqM表示按月聚合换成W是周、Q是季度、Y是年。pd.Grouper必须保证日期列是 datetime64 类型否则会报 TypeError所以前面那行to_datetime是配套操作。4.3 可视化几行代码出一张能发给同事的柱状图聚合结果出来后下一步是画图。Matplotlib 默认样式不算美观但对内部沟通足够关键是把标题、坐标轴标签和网格线配齐让看图的人不用问就知道这张图在表达什么。import matplotlib.pyplot as plt # 中文字体与负号显示没有这一步中文标题会变成方框 plt.rcParams[font.sans-serif] [SimHei] # Windows 常用macOS 可换成 Arial Unicode MS plt.rcParams[axes.unicode_minus] False fig, ax plt.subplots(figsize(8, 5)) ax.bar(result[产品], result[总销售额], color#4C72B0) ax.set_title(各产品总销售额对比) ax.set_xlabel(产品) ax.set_ylabel(总销售额) ax.grid(axisy, linestyle--, alpha0.6) plt.tight_layout() plt.savefig(sales_by_product.png, dpi150) plt.show()第一段 rcParams 处理的是中文字体缺了它图上的中文标题会变成一个个方框这不是 Matplotlib 的 bug而是默认字体不含中文字形提前设好省得返工。subplots返回 fig 和 axfigsize控制画布宽高单位是英寸bar的第一参数是 x 轴类别第二参数是高度color随手给一个品牌色避免默认的蓝色在所有图里看起来一样。grid只画水平网格线linestyle设成虚线、alpha降到 0.6视觉上不抢数据本身。最后tight_layout自动调整边距savefig把图存成 PNGdpi 150 足够发微信和放进报告plt.show()用于在本地窗口显示——注意在无图形界面的服务器上show()可能卡住不动那时注释掉这行、只保留savefig即可。到此概述章 PPT 里那条「读数据—清洗—计算—可视化」的链路就完整跑通了一遍。你会发现它并不神秘每一步都是几行代码的事难点不在单个函数而在组合在一起的顺序和参数选择。5. 避坑指南跑通这套流程最容易遇到的五个问题带过几位零基础的新人之后我发现他们卡住的位置高度集中几乎都在这五个问题上。按「现象—原因—解决」逐条拆正好对应前面几章的流程环节。5.1 读写与类型相关的三个坑第一个坑是 CSV 读出来中文乱码。现象read_csv之后列名和内容全是乱码或者直接抛 UnicodeDecodeError 异常代码看起来完全没问题。原因在文件编码Windows 下 Excel 导出的 CSV 常见 GBK 编码而 pandas 默认按 UTF-8 解析编码不匹配自然乱码。解决方法是读取时显式指定编码先试encodinggbk再试encodingutf-8-sig如果两种都试过仍有零星乱码就加errorsreplace把解析不了的字符替换掉至少保证流程能继续跑之后再回到原始文件确认数据来源。第二个坑是日期列被读成 object 字符串。现象df[日期].max()返回的不是最大日期而是按字典序排出来的「最大字符串」比如2023-09-02会排在2024-01-15后面按月分组时直接报错。原因是读取时没有解析日期pandas 把它当普通文本。解决方法是二选一读取时加parse_dates[日期]或读取后用pd.to_datetime(df[日期])转换转换后记得用df.dtypes确认该列已经变成 datetime64。第三个坑是读.xlsx时提示 Missing optional dependency openpyxl。现象代码和前面章节一模一样单独运行时却报缺少可选依赖。原因很直白pandas 读 Excel 需要外部引擎openpyxl 没被安装。解决pip install openpyxl已经装过还报错就用which pip确认当前终端是否激活了正确的虚拟环境很多情况是装到了另一个环境里。这类「缺依赖」的错误信息已经明说了缺什么大多数时候照做就能解决不是玄学。5.2 计算与赋值相关的两个坑第四个坑是 SettingWithCopyWarning 告警。现象先筛选出一个子表再给子表某一列赋值pandas 弹出 SettingWithCopyWarning而且赋值经常没生效。原因链式操作中df[df[产品] A]这个表达式返回的是视图还是副本pandas 在不同场景下表现不一致对不确定对象的修改自然不可靠。解决需要修改时先.copy()得到明确副本或者在筛选之后马上用.loc定位# 避免告警的推荐写法先复制再修改 sub df[df[产品] A].copy() sub[备注] 高优先级 # 不需要复制时用 .loc 直接做条件赋值 df.loc[df[产品] A, 备注] 高优先级第五个坑是 groupby 之后分组列「不见了」。现象执行完result df.groupby(产品)[销售额].sum()后打印 result发现没有「产品」这一列只有销售额。原因groupby 的默认行为是把分组列变成行索引打印时索引显示在最左边且不占列名位置视觉上像被删掉了。解决分组后接.reset_index()或在 groupby 里加参数as_indexFalse两者效果一样把索引还原成普通列。我习惯用as_indexFalse因为从语义上直接告诉读者「我不想让它当索引」。6. 把概述章变成你的第一个端到端实验问题清单加一个可复用函数学完前面几章你已经能跑通一条完整流程。最后一章分享一个我反复验证过的做法把「读—查—洗—算—画」封装成一个函数然后用一份完全陌生的数据去验证它。能跑通说明链路真的建立了跑不通报错信息会精确指出你该补哪一块。6.1 把分析流程包成一个函数下次换数据直接调用def quick_report(df, group_col, value_col): 输入 DataFrame输出按 group_col 分组、对 value_col 求和的报表和柱状图 df df.dropna(subset[value_col]) # 清洗剔除核心指标缺失的行 result df.groupby(group_col, as_indexFalse)[value_col].sum() # 聚合 fig, ax plt.subplots(figsize(8, 5)) ax.bar(result[group_col], result[value_col]) ax.set_title(f{value_col} by {group_col}) ax.set_xlabel(group_col) ax.set_ylabel(value_col) plt.tight_layout() plt.show() return result # 用法换文件和列名即可 report quick_report(df_clean, 产品, 销售额) print(report)函数的三个参数分别是要分析的数据、分组列名、数值列名传参时只需改列名不用改函数体。它把清洗、聚合、出图三步压缩成一次调用验证时不用每次都从零写 30 行代码。如果你要更严谨可以在函数里加一步 dtypes 检查确保 value_col 是数值类型再求和否则字符串列会直接报错。这一章真正的进阶用法是给自己列一份「自问自答」清单这一页 PPT 总共讲了几步每一步对应上面的哪段代码如果换成一份日志文件、一份问卷结果哪一步会最先崩我当初带新人时习惯先把语法、数据结构完整过一遍再动手结果大家越听越迷糊两周过去连 CSV 都没读进来后来改成先拿真实的小数据跑通上面的函数再回头补语法细节效率反而高得多。把这个习惯沿用下去遇到陌生的数据格式先套函数看结果再按报错去查文档比埋头背函数签名有用得多。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑