先问大家一个问题你在学习 Python 数据分析时是不是也遇到过“看了很多视频但一碰到真实数据就不知道从哪下手”的情况尤其是想用 SQL 查数据、用 Python 做清洗、再拿电商数据练手结果被各种资料搞得晕头转向。这篇文章就来解决这个问题用一条完整的 Python SQL 学习路线配合京东电商实战项目带你把零基础到能独立完成数据分析的路径走通。文章适合完全没有编程基础的小白也适合已经会一点 Python 但不知道怎么做数据分析项目的同学。学完之后你能掌握 Python 数据分析核心库的使用、SQL 常用查询语法、数据清洗与可视化方法并且完成一个可写进简历的电商数据分析项目。1. 数据分析到底是在做什么1.1 先理解数据分析的工作流程数据分析并不是“写代码”这么简单。它的核心是用数据回答业务问题。一个完整的数据分析流程通常包括明确问题业务方想知道什么比如“上个月哪些商品卖得最好”“用户复购率是多少”。获取数据从数据库、Excel、CSV、API 等来源拿到原始数据。数据清洗处理缺失值、重复值、异常值把数据整理成可分析的格式。分析与建模用统计方法或机器学习算法找出规律。可视化与报告用图表把结论直观地展示出来让别人能看懂。Python 和 SQL 正好覆盖了这个流程中的大部分环节。SQL 负责从数据库里快速取出数据Python 负责后续的清洗、分析和可视化。1.2 为什么 Python 是数据分析的首选语言Python 在数据分析领域的优势非常明显语法简单接近自然语言零基础也能快速上手。生态完善pandas、numpy、matplotlib、seaborn 等库覆盖了数据处理、分析和可视化全流程。社区活跃遇到问题基本都能搜到解决方案。与机器学习、深度学习衔接顺畅后期进阶不需要换语言。1.3 SQL 在数据分析中的位置不少初学者会问“我都用 Python 了为什么还要学 SQL”实际工作中数据通常存放在数据库中比如 MySQL、SQL Server、Oracle。你需要先用 SQL 把需要的数据查出来再交给 Python 做深度分析。SQL 取数能力决定了你拿到什么级别的数据如果连 SQL 都不熟练分析工作就无从谈起。另外SQL 的聚合、分组、连接操作在数据处理中效率很高。很多数据分析岗位的面试都会单独考察 SQL这也是必须掌握的原因。2. 环境准备搭建 Python 数据分析开发环境2.1 安装 Python 与 Jupyter Notebook如果你是完全零基础推荐直接安装 Anaconda。它是一个 Python 发行版自带 Jupyter Notebook、Spyder 和常用的数据分析库省去了一个个安装的麻烦。也可以从 Python 官网下载安装包安装后使用 pip 安装需要的库。无论用哪种方式安装完成后建议打开命令行验证 Python 是否安装成功python --version pip --version如果输入后能显示版本号说明安装成功。2.2 安装数据分析核心库本文案例会用到 pandas、numpy、matplotlib、seaborn。如果你没有安装可以执行下面的命令pip install pandas numpy matplotlib seaborn安装完成后建议创建一个工作目录例如jupyter/ecommerce-analysis后续的代码和文件都放在这个目录下。2.3 SQL 环境选择学习 SQL 有两种常见选择SQLite轻量级不需要安装数据库服务Python 自带 sqlite3 模块适合练习。MySQL生产环境使用最多需要安装 MySQL 服务端和客户端。本文的实战案例会演示用 Python 内置 SQLite 来执行 SQL这样你不需要额外安装数据库软件直接运行代码就能体验 SQL 取数流程。3. Python 数据分析核心基础3.1 pandas 核心数据结构pandas 是 Python 数据分析最核心的库两个最重要的数据结构是 Series 和 DataFrame。Series 是一维带标签数组可以理解为一列数据。DataFrame 是二维表格结构有行索引和列名类似 Excel 表格。下面通过一个简单示例认识 DataFrameimport pandas as pd # 创建 DataFrame data { 商品名称: [iPhone 15, 华为 Mate 60, 小米 14], 价格: [5999, 6999, 3999], 销量: [1200, 980, 1500] } df pd.DataFrame(data) print(df)运行结果商品名称 价格 销量 0 iPhone 15 5999 1200 1 华为 Mate 60 6999 980 2 小米 14 3999 15003.2 数据读取与初步查看实际项目中数据通常来自 CSV 文件或 Excel 文件。pandas 读取数据的常用方法import pandas as pd # 读取 CSV 文件 df pd.read_csv(jindong_orders.csv, encodingutf-8) # 查看前 5 行 print(df.head()) # 查看数据基本信息 print(df.info()) # 查看统计描述 print(df.describe())head() 用于快速预览数据info() 可以查看每列的数据类型和非空数量describe() 能输出数值列的统计指标比如均值、最小值、最大值。3.3 数据清洗基础真实数据往往存在问题最常见的三类缺失值某列有空值。重复值同一行出现了多次。数据类型错误该是数字的列被读成了字符串。处理缺失值和重复值的示例# 检查缺失值 print(df.isnull().sum()) # 删除包含缺失值的行 df_clean df.dropna() # 用指定值填充缺失值 df_fill df.fillna({销量: 0}) # 删除重复行 df_unique df.drop_duplicates()4. SQL 查询语言核心用法4.1 SELECT 基础查询SQL 最核心的操作就是查询。以下语句从订单表中选出商品名称和价格两列SELECT 商品名称, 价格 FROM orders;如果表中有大量数据可以使用 LIMIT 限制返回条数SELECT * FROM orders LIMIT 10;4.2 WHERE 条件过滤业务中不可能每次都查全表通常要加条件。比如查询价格大于 3000 的商品SELECT 商品名称, 价格 FROM orders WHERE 价格 3000;4.3 GROUP BY 分组聚合分组是数据分析中使用频率最高的操作。例如按商品类目统计销量总和SELECT 类目, SUM(销量) AS 总销量 FROM orders GROUP BY 类目;GROUP BY 通常会配合聚合函数使用常用的聚合函数有 COUNT、SUM、AVG、MAX、MIN。4.4 去重查询在 SQL 中DISTINCT 用于返回唯一不同的值。比如查看订单表中出现过的所有商品类目SELECT DISTINCT 类目 FROM orders;4.5 BETWEEN AND 区间查询BETWEEN AND 可以筛选某个范围内的数据。比如查询价格在 1000 到 5000 之间的商品SELECT 商品名称, 价格 FROM orders WHERE 价格 BETWEEN 1000 AND 5000;这条语句等价于价格 1000 AND 价格 5000。4.6 JOIN 表连接业务数据通常分散在多个表中。比如订单表和商品信息表需要用商品 ID 关联查询SELECT o.订单号, p.商品名称, o.销量 FROM orders o JOIN products p ON o.商品ID p.商品ID;JOIN 是 SQL 学习的难点也是数据分析面试的高频考点。练习时可以先从 INNER JOIN 入手再逐步熟悉 LEFT JOIN、RIGHT JOIN 的区别。5. 京东电商数据分析实战项目接下来进入本文的核心部分。我们将模拟一份京东电商订单数据用 Python 完成加载、清洗、分析和可视化再用 SQL 完成同样的取数任务。通过这个项目你能完整体验数据分析流程。5.1 项目背景与业务问题假设你拿到了某店铺 2024 年 1 月到 6 月的订单数据老板想知道每个月的销售额变化趋势。哪些类目贡献了主要收入。价格区间对销量的影响。是否存在销量异常的商品。这些问题都可以用数据来回答。5.2 构造模拟数据由于真实的订单数据涉及用户隐私本文使用 Python 生成模拟数据。文件名命名为jindong_orders.csv。import pandas as pd import numpy as np from datetime import datetime, timedelta # 设置随机种子保证结果可复现 np.random.seed(42) # 模拟商品信息 products [ (1001, iPhone 15, 手机, 5999), (1002, 华为 Mate 60, 手机, 6999), (1003, 小米 14, 手机, 3999), (1004, MacBook Air, 笔记本, 7999), (1005, ThinkPad X1, 笔记本, 8999), (1006, 机械键盘, 外设, 399), (1007, 无线鼠标, 外设, 99), (1008, 4K 显示器, 外设, 1999) ] # 生成 6 个月的订单数据 records [] start_date datetime(2024, 1, 1) for i in range(2000): product_id, product_name, category, price products[np.random.randint(len(products))] quantity np.random.randint(1, 5) order_date start_date timedelta(daysnp.random.randint(0, 180)) records.append([fJD{10000i}, product_id, product_name, category, price, quantity, order_date.strftime(%Y-%m-%d)]) df pd.DataFrame(records, columns[订单号, 商品ID, 商品名称, 类目, 价格, 数量, 订单日期]) df.to_csv(jindong_orders.csv, indexFalse, encodingutf-8-sig) print(df.head())运行后会在当前目录生成jindong_orders.csv文件。这里使用utf-8-sig编码是为了防止中文在 Excel 中打开出现乱码。5.3 数据加载与清洗拿到数据后先做初步探索和清洗。import pandas as pd # 加载数据 df pd.read_csv(jindong_orders.csv, encodingutf-8-sig) # 初步查看 print(df.shape) # 行数和列数 print(df.head()) # 前 5 行 print(df.info()) # 字段信息 print(df.isnull().sum()) # 缺失值统计如果数据中没有缺失值可以跳过缺失值处理。但项目中要保留清洗的习惯为后续真实数据做准备。5.4 销售额指标计算总销售额等于价格乘以数量。计算各月销售额、类目销售额占比是分析的核心环节。import pandas as pd df pd.read_csv(jindong_orders.csv, encodingutf-8-sig) # 计算销售额 df[销售额] df[价格] * df[数量] # 将订单日期转为日期类型 df[订单日期] pd.to_datetime(df[订单日期]) df[月份] df[订单日期].dt.to_period(M) # 每月销售额 monthly_sales df.groupby(月份)[销售额].sum().reset_index() print(monthly_sales) # 类目销售额占比 category_sales df.groupby(类目)[销售额].sum().sort_values(ascendingFalse).reset_index() print(category_sales) # 商品销量 Top5 top5 df.groupby(商品名称)[数量].sum().sort_values(ascendingFalse).head(5).reset_index() print(top5)这段代码是整篇文章的核心分三步完成先新增销售额列再按月汇总最后按类目和商品维度分析。5.5 SQL 完成同样的查询下面的代码使用 Python 内置 sqlite3 模块在 SQLite 中执行查询。先建表并导入 CSV 数据import sqlite3 import pandas as pd # 读取 CSV df pd.read_csv(jindong_orders.csv, encodingutf-8-sig) df[销售额] df[价格] * df[数量] # 连接到内存数据库 conn sqlite3.connect(:memory:) # 写入数据库 df.to_sql(orders, conn, indexFalse, if_existsreplace) # 查询 1每月销售额 query_monthly SELECT strftime(%Y-%m, 订单日期) AS 月份, SUM(销售额) AS 总销售额 FROM orders GROUP BY 月份 ORDER BY 月份; print(pd.read_sql_query(query_monthly, conn)) # 查询 2类目销售额 query_category SELECT 类目, SUM(销售额) AS 总销售额 FROM orders GROUP BY 类目 ORDER BY 总销售额 DESC; print(pd.read_sql_query(query_category, conn)) conn.close()注意SQLite 的 strftime 函数用于格式化日期如果你使用 MySQL语法有所不同比如用 DATE_FORMAT(订单日期, %Y-%m)。实际工作中要根据数据库类型调整写法。5.6 数据可视化分析结果通过图表展示会更直观。用 matplotlib 和 seaborn 绘制每月销售额折线图import pandas as pd import matplotlib.pyplot as plt # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(jindong_orders.csv, encodingutf-8-sig) df[销售额] df[价格] * df[数量] df[订单日期] pd.to_datetime(df[订单日期]) df[月份] df[订单日期].dt.to_period(M) monthly_sales df.groupby(月份)[销售额].sum() plt.figure(figsize(10, 6)) monthly_sales.plot(kindline, markero) plt.title(2024 年 1-6 月销售额趋势) plt.xlabel(月份) plt.ylabel(销售额) plt.grid(True) plt.show()如果系统没有 SimHei 字体可以把plt.rcParams[font.sans-serif]改成你电脑中已有的中文字体比如 Microsoft YaHei。同样可以绘制类目销售额柱状图import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(jindong_orders.csv, encodingutf-8-sig) df[销售额] df[价格] * df[数量] category_sales df.groupby(类目)[销售额].sum().sort_values(ascendingFalse) plt.figure(figsize(8, 6)) category_sales.plot(kindbar, colorskyblue) plt.title(各类目销售额对比) plt.xlabel(类目) plt.ylabel(销售额) plt.xticks(rotation45) plt.show()5.7 输出分析报告最后把分析结果整理成汇总表格并保存为 CSV 文件result { 总销售额: [df[销售额].sum()], 总订单数: [df[订单号].nunique()], 总销量: [df[数量].sum()], 客单价: [round(df[销售额].sum() / df[订单号].nunique(), 2)] } result_df pd.DataFrame(result) print(result_df) result_df.to_csv(analysis_summary.csv, indexFalse, encodingutf-8-sig)到这里一个完整的电商数据分析项目就完成了。整个过程包括数据构造、加载、清洗、指标计算、SQL 查询、可视化和报告输出。6. 常见问题与排查思路6.1 常见报错速查表问题现象常见原因解决思路pandas 读取 CSV 中文乱码原始文件编码不是 UTF-8使用encodingutf-8-sig或gbk重新读取matplotlib 中文显示为方框系统缺少中文字体设置plt.rcParams[font.sans-serif]为已安装中文字体运行 SQL 报语法错误SQL 版本或数据库方言不同根据数据库类型调整函数和关键字groupby 后列名混乱没使用 reset_index在 groupby 后加reset_index()dropna 后行数明显减少数据中合法空值被误删先检查每列缺失值比例再决定填充还是删除文件路径报错工作目录不对使用绝对路径或通过os.chdir()切换目录6.2 数据处理中的性能问题当数据量很大时pandas 的处理速度会明显下降。推荐做法读取时指定需要的列例如pd.read_csv(file, usecols[订单号, 价格])。尽量使用向量化操作避免循环遍历每一行。可以先用 SQL 完成聚合再读取小结果集到 pandas。数据量极大时可以学习 Dask 或 PySpark 等分布式计算工具。6.3 SQL 查询慢怎么办慢 SQL 最常见的两个原因没有索引和查询了不必要的数据。排查思路用 EXPLAIN 查看执行计划确认是否命中索引。检查 WHERE 条件字段是否有索引。减少 SELECT *只查询需要的字段。大表连接时先把子查询结果缩小再 JOIN。优化时要注意生产环境操作需谨慎。比如在重要表上建索引需要先在测试环境评估影响并遵守公司的变更流程。7. 最佳实践与工程建议7.1 数据分析代码的工程化建议很多初学者在 Jupyter 里写一大段代码就算完事但这在实际项目中不够用。更推荐的做法把清洗、分析、可视化分别封装成函数。使用统一的 main 函数调度流程。增加日志输出方便定位问题。分析脚本用if __name__ __main__:作为入口。关键步骤添加断言防止数据为空或字段缺失。下面是一个简单的脚本结构示例def load_data(path): 加载原始数据 return pd.read_csv(path, encodingutf-8-sig) def clean_data(df): 数据清洗 df df.drop_duplicates() df df.dropna() df[销售额] df[价格] * df[数量] return df def analyze_sales(df): 销售分析 return df.groupby(类目)[销售额].sum() def main(): df load_data(jindong_orders.csv) df_clean clean_data(df) result analyze_sales(df_clean) print(result) if __name__ __main__: main()7.2 数据安全与合规做数据分析时尤其是电商数据可能会接触到用户 ID、手机号、地址等敏感信息。在实际项目中要遵守不下载不必要的敏感字段。报表显示前对用户信息脱敏。测试环境使用模拟数据不要直接复制生产数据。涉及数据库操作时先确认授权范围再执行查询。7.3 可视化与报告的建议做数据分析图表不是越花哨越好。基本原则是一张图只表达一个核心信息。标题要说明业务结论不只是坐标轴名称。柱状图适合对比折线图适合趋势饼图适合占比但要控制分类数量。报告最后一定要有结论和建议而不是只丢一堆数字。7.4 学习路线的进一步规划学完本文内容后可以按以下方向继续深入统计学基础均值、方差、正态分布、假设检验。pandas 进阶透视表、时间序列处理、apply 函数使用。数据可视化进阶seaborn 统计绘图、Plotly 交互式图表。SQL 进阶窗口函数、子查询、索引优化。机器学习入门scikit-learn 线性回归、分类模型。在进阶学习时优先从真实数据分析项目开始。把每个项目拆成一个完整的数据分析报告既能巩固知识也能积累作品集。8. 总结从零基础到真正上手本文从数据分析的工作流程出发讲解了 Python 和 SQL 在数据分析中的分工然后一步步完成了环境搭建、pandas 数据处理、SQL 查询、京东电商数据分析实战。你现在已经掌握了数据分析的核心操作链加载数据 - 清洗数据 - 计算指标 - SQL 取数 - 可视化展示。不要把学习停在“看懂”这一步。建议你现在就打开 Jupyter复制本文的代码跑一遍再尝试修改分析维度比如按“价格区间”分析销量或者按“商品”分析毛利率。当你能够不参考任何资料独立完成一份数据清洗和销售分析报告时你才真正算是入门了数据分析。如果本文对你有帮助可以收藏备用。下一篇我会继续更新更深入的数据分析实战内容。