Python数据分析实战:从数据清洗到决策支持的完整流程

发布时间:2026/9/18 12:17:45
Python数据分析实战:从数据清洗到决策支持的完整流程 简介面向数据分析初学者和Python使用者这份Word文档系统讲解如何借助Python生态完成数据分析覆盖数值计算库NumPy、表格处理库Pandas、可视化库Matplotlib以及探索性数据分析EDA并从数据分析的六个步骤——明确需求、收集数据、清洗加工、分析、共享与报告——展开帮助读者建立从业务问题到数据结论的完整流程意识。资源以Word格式提供压缩包内共1个文件大小约2.05MB轻量易读便于离线查看或打印目前已有46人学习下载适合刚接触数据分析、希望快速搭建知识框架的读者。内容上文档先介绍数据分析的整体概念和流程再深入演示NumPy数组的创建比如使用empty函数生成未初始化数组、zeros函数生成全零数组并通过加法、减法、乘法、除法示例说明直接运算与NumPy函数两种做法的异同同时讲解索引与切片的基本规则。这些知识点结合Pandas表格处理、Matplotlib图表绘制和EDA常见思路能够帮助读者理解数据在Python中的存储、变换与呈现方式既适合自学入门也可作为课程讲义的辅助资料。1. Python 数据分析的主线从原始数据到决策依据一提到“用 Python 做数据分析”很多人第一反应是 notebook 里画几根折线图。实际上数据分析是一条从原始数据到决策动作的完整链路把散落在 Excel、数据库、接口、日志里的数据收进来转换成口径统一的干净结构再组织成能聚合、能对比、能建模的形态最后变成一句业务能直接执行的话比如“下季度华南区备货提高 20%”。这里的收集、转换、组织不是论文里的修辞而是 pandas 里三个彼此独立又环环相扣的阶段。这篇文章面向的是数据分析师、转岗接触数据的业务同学以及准备接分析任务的研发。希望读完能照着步骤理出自己的分析流程。2. 数据收集把第一份数据读进 DataFrame 的常用路线“收集”这一步没有统一答案但有一个统一出口让所有来源的数据都进入 pandas DataFrame。文件、数据库、API、抓取来的网页数据甚至 pcap 流量日志最后都转成“行是样本、列是字段”的表结构后续转换和分析才能用同一套工具。下面按最常见的数据来源给三条高复用路线。2.1 先把运行环境立住python 安装与编辑器配置做数据分析不推荐把包装到全局环境。我一般的做法是安装官方 python 解释器后在项目目录里建虚拟环境再安装依赖。这样做的好处是换机器或者同时做多个数据分析项目时不会出现“这个包装了但另一个项目跑不起来”的依赖冲突。python3 -m venv .venv source .venv/bin/activate # Windows PowerShell 下激活命令是 .venv\Scripts\activate pip install pandas numpy matplotlib seaborn scikit-learn requests openpyxl这段命令会创建名为.venv的隔离环境并安装完整的数据分析基础包。pandas 负责表格处理numpy 提供数值运算matplotlib 和 seaborn 做可视化scikit-learn 用于建模预测requests 拉取接口数据openpyxl 让 pandas 能读写 Excel。编辑器方面vscode 里装好 Python 扩展后需要手动选中虚拟环境按CtrlShiftP打开命令面板输入Python: Select Interpreter选择.venv路径下的解释器。这一步经常被忽略导致代码能写但不能运行。pycharm 用户则是在 Settings 里把 Project Interpreter 指向同一个虚拟环境。环境配置不复杂但 90% 的“安装后 import 报错”都发生在这个环节值得花十分钟一次配好。2.2 读取第一批文件read_csv 的三个关键参数拿到一份 CSV 后直接pd.read_csv(文件名)虽然能跑但遇到中文列名、日期字符串、数字被识别成文本等场景就会翻车。我一般会先按下面这样读文件把格式问题在路上解决而不是等到清洗阶段再补救。import pandas as pd df pd.read_csv( order_details.csv, encodingutf-8, # 避免中文乱码 parse_dates[order_date], # 提前把日期列解析成 datetime dtype{store_id: str}, # store_id 是编号不是数值禁止参与计算 )encoding参数在 Excel 导出的 CSV 里尤其重要常见的中文编码有utf-8、utf-8-sig和gbk乱码时优先在这两者之间切换。parse_dates接收一个列名列表把日期文本转成 pandas 的 datetime 类型转换之后才能按月份、季度直接聚合。dtype用来指定列的类型像门店编号、订单号这类看起来是数字、实际没有数值意义的字段必须声明成字符串否则后续sum、mean这类函数会误伤它们。如果文件来自 Excel读取方式换成pd.read_excel(销售明细.xlsx, sheet_name订单, engineopenpyxl)其中sheet_name可以传工作表名称或索引。到这里一大部分“文件型数据收集”就完成了。2.3 用 requests 拉 API 数据并转成结构化表格多数系统的数据不直接给你文件而是通过 HTTP 接口暴露。比如电商订单、物流轨迹、用户行为事件都需要先请求接口再转成 DataFrame。这个环节的固定动作是带超时请求校验状态码把 JSON 拍平成表格。import requests import pandas as pd resp requests.get( https://api.example.com/orders, params{start_date: 2024-01-01, page_size: 1000}, timeout10, ) resp.raise_for_status() # 状态码不是 2xx 时直接抛异常避免把错误响应当数据 data resp.json() if isinstance(data, list): df pd.DataFrame(data) else: # 接口返回嵌套 JSON 时用归一化函数展开嵌套字段 df pd.json_normalize(data, sep_)timeout10让请求在 10 秒内得不到响应就中止避免爬虫或批处理任务卡死。raise_for_status()是防御性编程的习惯保证拿到的数据确实是成功的响应。接口返回 JSON 有两种常见结构顶层是对象数组直接用pd.DataFrame即可顶层是单个对象且里面有嵌套列表比如{items: [...], total: 100}就需要pd.json_normalize把嵌套字段展开成多列。爬虫抓回来的 HTML 数据也可以用类似思路先用解析库提取字段再交给 pandas核心流程没有变化。数据来源常用收集方式最常踩的坑CSV / Excelpd.read_csv / pd.read_excel编码不对导致中文乱码关系型数据库pandas.read_sql 或 客户端导出 CSV大表一次性读取内存不足HTTP APIrequests resp.json()忘记设置 timeout任务挂起网络抓包日志解析成 CSV 后走 pandas 路线字段类型需要手动指定这里顺带说一句做 pcap 流量数据分析时不要直接用 pandas 读原始抓包文件先用 pyshark 或 tshark 把需要的字段导出成 CSV 或 JSON再走上面的读取流程。文件格式千差万别最终都要收敛到“一张干净的表”这就是收集阶段的意义。3. 数据转换把数据洗到能放心计算的程度数据收集完最常见的现状是空值、重复行、类型错乱、日期格式不统一。转换阶段的目标不是把数据变成“没有错误”而是把它变成“计算口径明确”的结构。脏数据清洗没有一步到位的银弹但有一套固定体检流程和几个高频函数可以覆盖八成场景。3.1 拿到数据先体检info、isna、nunique 三件套拿到一张新表先不要急着head()看前几行用三个方法做一次系统体检print(df.info()) # 列名、非空数量、每列 dtype print(df.isna().sum()) # 每列缺失值数量 print(df.nunique()) # 每列不同值个数辅助发现维度是否异常info()能快速看出哪些列有缺失以及类型是否和业务预期一致比如“价格”列显示为 object 类型就说明里面有非数字内容。isna().sum()直接给出缺失量这一步决定后面用删除还是填充。nunique()统计每个字段的去重数量适合检查“省份”这类维度列是否混入了脏值比如出现 35 个省而不是 34 个。3.2 缺失值处理的取舍dropna 与 fillna 的适用边界缺失值处理最常见的误区是“一律删掉”和“一律填 0”。这两种做法都有代价删行会损失样本量填 0 则会拉低均值、放大波动。我一般先看字段的业务含义再决定策略。关键标识字段缺失直接删行连续数值字段缺失用统计值填充类别字段缺失用独立标记。df_clean df.dropna(subset[order_id]) # 订单号缺失的行删掉无法恢复业务含义 df_clean[amount] df_clean[amount].fillna(0) # 支付金额缺失填 0表示未支付 df_clean[province] df_clean[province].fillna(未知) # 省份缺失用占位值dropna的subset参数控制了“哪一列出现缺失才删除行”比全表dropna温和得多。fillna具体填什么要看场景金额为 0 有业务意义“这笔订单确实没付钱”用户性别填“未知”是为了保留样本而销量这类指标如果缺失我通常填中位数而不是均值因为中位数对极端值不敏感。充分理解了字段含义再决定缺失策略数据才是可解释的。3.3 类型规范化与特征衍生astype、to_numeric、cut 的组合清洗的另一个大头是类型统一。比如金额列可能是1,234.5这种带千分位逗号的字符串日期可能有2024/01/01和2024-01-01两种格式。把这些字段统一成规范类型是为后续聚合和建模打基础。df_clean[price] pd.to_numeric(df_clean[price].str.replace(,, ), errorscoerce) df_clean[order_date] pd.to_datetime(df_clean[order_date], format%Y-%m-%d, errorscoerce) df_clean[price_tier] pd.cut( df_clean[price], bins[0, 50, 200, 10000], labels[低价, 中价, 高价], )pd.to_numeric的errorscoerce会把无法解析的字符串转成 NaN比直接报错更适合脏数据场景。pd.to_datetime的format参数显式声明日期格式解析速度比自动推断快同时避免歧义。pd.cut做的事情是把连续价格离散化成“低/中/高”三个档位这种从原始字段衍生新字段的操作叫特征工程是数据分析里最出活的部分。3.4 用 pipe 串一个可复用的清洗流程实际情况里清洗步骤不止三步。如果每次都在全局变量上改改脚本会变成一团乱麻。我会把转换逻辑封装成独立函数再用pipe串成链式调用。这样每个环节单独可测也方便在多个数据集上复用同一套管线的清洗逻辑。def remove_duplicate_orders(df: pd.DataFrame) - pd.DataFrame: return df.drop_duplicates(subset[order_no], keepfirst) def fill_missing(df: pd.DataFrame) - pd.DataFrame: df df.copy() df[amount] df[amount].fillna(0) return df df_final ( df.pipe(remove_duplicate_orders) .pipe(fill_missing) .pipe(parse_datetime) )用pipe的好处是每个函数只接收 DataFrame、返回 DataFrame函数内部做了copy()避免修改原始数据。这样一步步往下传每一步的输入输出都清晰可见。需要注意的是函数内部如果没有df df.copy()pandas 有触发SettingWithCopyWarning的风险我一般会显式复制宁可多一份内存也不要出现警告和潜在的逻辑问题。关于重复值drop_duplicates(subset[order_no])处理的是“同一订单出现多次”的问题subset指定判断重复依据的字段keepfirst保留第一次出现的行。按照去重、填充、类型转换这个顺序组织清洗流程逻辑表达自然也很少出 bug。4. 数据组织与分析分组、透视后才能形成判断清洗之后的数据还是“明细表”要把它变成能看懂的分析结果就需要组织这一步。组织的方式离不开两个维度按什么维度看、用什么指标衡量。Excel 里的数据透视表和 SUMIF在 pandas 里对应groupby和pivot_table这是把明细变成观点的核心操作。4.1 用 groupby 完成按时间维度的聚合分析需求里最常见的句式是“按月份看销售额”“按城市看订单量”。这类需求在 pandas 里用groupby配合agg一次完成不需要写循环。monthly ( df_final.groupby(pd.Grouper(keyorder_date, freqME)) .agg( order_count(order_id, count), revenue(amount, sum), avg_price(amount, mean), ) .reset_index() )pd.Grouper(keyorder_date, freqME)表示把日期字段按月分组freqME是“月结束”的缩写注意 pandas 2.2 之后用M会出现弃用警告直接写ME更规范。agg里用“新列名 (原列, 聚合函数)”的语法同时计算多组指标订单数、总金额、平均金额一次拿到。reset_index()把分组键恢复为普通列便于后续和同类数据合并。4.2 用 pivot_table 做交叉维度汇总groupby处理的是单维度拆解业务上更常见的还有“时间 × 品类”“省份 × 渠道”这种交叉需求pivot_table是更直观的解法。pivot df_final.pivot_table( indexprovince, columnsprice_tier, valuesamount, aggfuncsum, fill_value0, )换成业务语言来描述这段代码的命令逻辑以省份作为行索引价格档位作为列名表格里每个格子放的是该省份在该价格档位上的总销售额fill_value0让没有数据的格子显示 0避免出现 NaN 影响后续计算。透视之后得到的是一个行列结构清晰的表格可以直接输出到 Excel或者喂给可视化工具。4.3 描述统计与相关性从表格变成结论聚合和透视让我们看到趋势但一个数值“高不高”很难靠肉眼判断需要统计指标来支撑判断。describe()一次性给出均值、标准差、四分位数corr()则计算数值列之间的相关系数其中methodspearman适用于非线性单调关系。print(df_final[[amount, quantity, cost]].describe()) corr df_final[[amount, quantity, cost]].corr(methodspearman) print(corr)一个容易踩的误区是相关系数高不代表因果。金额和成本高度相关是因为成本本身参与金额构成这是业务上必然的结果而不是发现了一个“新结论”。另一个分析误区是拿总量数据直接做对比忽略分母和背景。比如两个门店销售额相同但门店 A 面积是 B 的三倍坪效完全不同。真正能推动决策的洞察来自“拆分维度和选择指标”这两个动作而不是相关系数数值本身。4.4 可视化只保留三种类型趋势、分布、对比数据分析里的可视化不是画得越炫越好图表的作用是压缩信息。日常汇报我会固定用三张图折线图看时间趋势箱线图看分布柱状图做对比。代码固定在同一个模板里后续换数据只改字段名。import matplotlib.pyplot as plt import seaborn as sns sns.set_theme(stylewhitegrid) fig, ax plt.subplots(figsize(8, 4)) sns.lineplot(datamonthly, xorder_date, yrevenue, markero, axax) ax.set_title(月度收入趋势) ax.set_xlabel(月份) ax.set_ylabel(销售额) plt.tight_layout() plt.savefig(monthly_revenue.png, dpi150) plt.show()分析需求推荐图表对应 seaborn 函数时间趋势折线图sns.lineplot数据分布和离群点箱线图sns.boxplot分类对比柱状图sns.barplotmarkero让每个数据点显示圆点便于读取具体数值。dpi150保证保存的图片放大后不模糊。如果分析的是单细胞测序表达量或医疗健康数据关心的是分布和组间差异同样用这三张图就能覆盖大部分展示需求可视化工具的复杂度不该超过数据本身的复杂度。5. 未来预测与决策落地最小回归模型与验证技巧数据分析的最后一公里是“未来预测”。一个能支撑决策的预测模型不必一开始就上神经网络线性回归在解释性和稳定性上是很好的起点。我们拿第 4 章生成的monthly数据用 sklearn 拟合一个最小模型并验证预测可信度。import numpy as np from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error X np.arange(len(monthly)).reshape(-1, 1) # 用时间序号作为特征 y monthly[revenue].values # 月度销售额作为目标 model LinearRegression().fit(X, y) # 用最后 3 个月做简单回测 mae mean_absolute_error(y[-3:], model.predict(X[-3:])) print(fMAE: {mae:.2f}, 月度平均增量: {model.coef_[0]:.2f})这里把时间建模成线性序号coef_的含义是“每月平均销售额增量”。mean_absolute_error给出最近三个月的平均预测偏差如果偏差在可接受范围内这个增量就能用于预算制定。要注意的是这个模型只在趋势稳定时有效遇到季节波动、促销活动或突发事件线性假设会被破坏需要引入更多的特征列。预测结果落地成决策前还要做一次业务合理性检查。验证动作操作方式审查重点数据完整性检查清洗前后行数和关键字段缺失率数据是否覆盖完整业务周期口径一致性和业务方确认指标定义销售额是含税还是不含税模型回测时间序列必须用前段训练、后段验证避免随机切分导致数据泄漏边界外推看模型在极端区间的表现会不会预测出负销售额最后说一个关于“预测结果落地”的技巧模型给出的每个数值都要转成业务动作否则就只是数字。比如回测显示月均增量是 2 万元下一步应该追问这个增量来自新客还是老客、来自哪个区域、要不要调整城市月度目标。分析报告里写“预计下月销售额增长 2 万”不够要能落到“采购量上调 5%”这种可执行的结论上。数据分析的终点是决策模型是为决策降低不确定性的工具。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询