尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python+SQL数据分析实战:京东电商项目从清洗到可视化

Python+SQL数据分析实战:京东电商项目从清洗到可视化 如果你正准备转行数据分析或者刚接触 Python 和 SQL却不知道该从哪里下手那么这篇文章就是为你准备的。网上关于 Python 数据分析的教程非常多但大多数要么只讲某个孤立的知识点要么一上来就丢出一堆数学公式让人越看越没有信心。本文我打算换一个思路以京东电商数据为分析对象把 Python 数据处理、SQL 查询、数据可视化整合到一个完整的实战项目中带你完整走一遍数据分析的工作流程。无论你是零基础入门还是有一点基础但缺少项目经验这篇教程都能给你一套可以直接照着做的方案。文章会从 Python 环境搭建开始逐步讲解 pandas 数据清洗、SQL 查询与统计、结果可视化最终完成一个电商销售数据分析报告。中间还会穿插大量常见报错和排查思路帮助你少踩坑。1. 为什么数据分析要同时学 Python 和 SQL很多刚接触数据分析的同学都会有一个疑问我是先学 Python 还是先学 SQL这两者到底是什么关系1.1 Python 和 SQL 的分工简单来说SQL 负责“取数”Python 负责“处理和分析”。在实际工作中绝大多数公司的数据都存在数据库里。数据分析师接到一个需求时第一步往往是用 SQL 从数据库里把需要的字段提取出来。这个阶段主要解决的是“有哪些数据”“数据放在哪张表里”“需要筛选什么条件”这类问题。数据取出来之后才是 Python 的主场。pandas 库可以完成数据清洗、缺失值处理、分组聚合、字段衍生等操作matplotlib 和 seaborn 则可以把分析结果做成图表方便业务部门理解。举一个具体例子假设要分析京东店铺近 30 天的销售情况你需要先用 SQL 查询出订单表中的订单号、商品名称、销量、销售额、下单时间等字段然后把结果导出成 CSV 文件再用 Python 读取这份 CSV统计每天的销售趋势、分析不同品类的销量占比、找出销量最高的前 10 个商品。1.2 零基础学习路径零基础学习数据分析建议按照以下顺序推进掌握 Python 基础语法变量、数据类型、循环、条件判断、函数。掌握 pandas 基础操作读取 CSV、数据预览、缺失值处理、分组聚合。掌握 SQL 常用查询SELECT、WHERE、GROUP BY、ORDER BY、JOIN。掌握数据可视化基础matplotlib 绘制折线图、柱状图、饼图。做一个完整实战项目把以上知识串联起来。这套路径是我认为最适合零基础的顺序不需要一上来就啃厚厚的算法书也不需要先把 Python 学完再学 SQL。两者交替进行效果更好。2. 环境准备从零搭建 Python 数据分析环境在开始写代码之前先把开发环境准备好。很多初学者卡在第一步就是因为 Python 版本、依赖库、IDE 之间容易产生各种兼容问题。2.1 安装 Python 与 Anaconda数据分析推荐使用 Anaconda 而不是直接安装原版 Python。原因很简单Anaconda 自带了 pandas、numpy、matplotlib 等常用的数据科学库同时也集成了 Jupyter Notebook省去了大量手动安装依赖的时间。安装步骤到 Anaconda 官网下载对应系统的安装包。双击安装包按照默认配置安装完成。打开终端Windows 下是 Anaconda Prompt输入python --version如果能正常输出版本号则说明安装成功。如果你只需要一个轻量级环境也可以直接安装 Python然后通过 pip 安装以下库pip install pandas numpy matplotlib openpyxl这里简单解释一下每个库的作用pandas数据处理和分析的核心库提供了 DataFrame 这种类似 Excel 表格的数据结构。numpy科学计算基础库pandas 底层就依赖它。matplotlib最常用的数据可视化库。openpyxl用于读写 Excel 文件的库后面项目导出结果时会用到。2.2 SQL 环境说明SQL 的实操环境可以选择 MySQL、SQL Server 或 SQLite。对于零基础学习我更推荐先用 SQLite原因有两点SQLite 不需要安装数据库服务Python 自带sqlite3模块直接就能用。后续切换到 MySQL 或 SQL Server 时SQL 语句的差别不会很大只需要修改连接方式即可。在项目实战阶段我们先用 SQLite 完成全流程操作。如果你所在的公司使用的是 MySQL 或 SQL Server等理解了 SQLite 的查询思路后再去学习对应数据库的建表语句和连接方式会容易很多。2.3 创建项目目录建议按照下面的结构创建项目文件夹方便管理代码和数据jd_analysis/ |-- data/ | |-- jd_orders.csv | |-- jd_products.csv |-- sql/ | |-- analysis.sql |-- analysis.py |-- visual.py |-- output/data目录存放原始数据。sql目录存放 SQL 查询脚本。analysis.py和visual.py存放 Python 分析代码。output目录存放导出的分析结果和图表。3. 核心基础pandas 数据处理必会操作在项目实战之前先花一点时间把 pandas 最核心的操作过一遍。掌握下面这些操作你就能应付大部分日常数据分析任务。3.1 读取数据并查看基本信息假设我们有一份京东商品的订单数据jd_orders.csv字段包括订单号、商品名、品类、价格、销量、下单日期、城市。先用 pandas 读取它import pandas as pd df pd.read_csv(data/jd_orders.csv) print(df.head()) print(df.info()) print(df.describe())代码解释df.head()查看前 5 行数据快速了解字段和数据内容。df.info()查看每一列的数据类型、非空数量帮助定位缺失值。df.describe()对数值列做描述性统计包括均值、标准差、最小值、最大值等。运行结果里如果看到某些列的非空数量小于总行数说明这一列存在缺失值。df.describe()里的计数也能反映出数值列的缺失情况。3.2 数据清洗真实业务数据很少是干净的常见问题包括缺失值、重复值、异常值。下面逐个处理。先看缺失值# 统计每列缺失值个数 print(df.isnull().sum()) # 删除包含缺失值的行 df df.dropna() # 用指定值填充缺失值 df[销量].fillna(0, inplaceTrue)再看重复值# 统计重复行数量 print(df.duplicated().sum()) # 删除重复行 df df.drop_duplicates()处理异常值时可以先通过描述性统计发现异常。例如价格列出现了负数或者销量明显超过正常范围这些都需要结合业务逻辑判断。一般做法是先筛选出异常数据确认后再决定是删除还是修正。3.3 分组聚合分组聚合是数据分析中出现频率最高的操作用来回答“按某个维度统计汇总指标”这类问题。# 按品类统计总销量和平均价格 result df.groupby(品类).agg({ 销量: sum, 价格: mean }).reset_index() print(result)groupby(品类)表示按品类分组agg方法对指定列执行聚合函数。销量列执行求和价格列执行平均值得到每个品类的总销量和平均价格。如果想要排序可以继续加sort_valuesresult result.sort_values(销量, ascendingFalse) print(result)3.4 日期处理日期列默认是字符串类型需要转换成 pandas 的 datetime 类型才能按年、月、日进行分组统计。df[下单日期] pd.to_datetime(df[下单日期]) df[下单月份] df[下单日期].dt.to_period(M) # 按月份统计销售额 monthly df.groupby(下单月份)[销售额].sum().reset_index() print(monthly)这里先通过pd.to_datetime把下单日期列转换为日期类型再用dt.to_period(M)提取月份最后按月份分组求和。4. SQL 核心语法数据分析师必须掌握的查询能力Python 负责分析SQL 负责取数。如果你的 SQL 能力薄弱后面在工作里会很吃力。这一节梳理数据分析场景下使用频率最高的 SQL 语法。4.1 基础查询SELECT、WHERE、ORDER BY最基础的查询就是“把某张表里符合条件的数据取出来”。SELECT 订单号, 商品名, 销量, 销售额, 下单日期 FROM jd_orders WHERE 下单日期 2025-01-01 AND 城市 北京 ORDER BY 销售额 DESC;这条 SQL 做了四件事用SELECT指定要查询的字段。用FROM指定表名。用WHERE筛选下单日期在 2025 年 1 月 1 日之后且城市为北京的数据。用ORDER BY 销售额 DESC按销售额从高到低排序。4.2 分组统计GROUP BY、HAVINGGROUP BY对应 pandas 里的groupby操作。例如统计每个品类的总销售额和订单数SELECT 品类, SUM(销售额) AS 总销售额, COUNT(订单号) AS 订单数 FROM jd_orders GROUP BY 品类;这里需要特别提醒一个容易出错的地方如果使用了GROUP BY那么SELECT后面的字段要么是分组字段要么是聚合函数不能直接查其他普通字段。下面的写法在大多数数据库中会报错-- 错误示例 SELECT 品类, 商品名, SUM(销售额) FROM jd_orders GROUP BY 品类;商品名没有出现在GROUP BY子句中也没有被聚合函数包裹数据库不知道应该返回哪一条记录。如果想对分组后的结果再做筛选不能使用WHERE而要使用HAVING。这两者的区别在于WHERE在分组之前过滤原始数据HAVING在分组之后过滤聚合结果。SELECT 品类, SUM(销售额) AS 总销售额 FROM jd_orders WHERE 下单日期 2025-01-01 GROUP BY 品类 HAVING SUM(销售额) 10000;4.3 多表关联JOIN真实业务中数据往往分布在多张表里。比如订单表只记录商品 ID商品名称和品类信息在商品表里这时就需要用 JOIN 把两张表关联起来。SELECT o.订单号, o.销量, o.销售额, p.商品名, p.品类 FROM jd_orders o LEFT JOIN jd_products p ON o.商品ID p.商品ID;LEFT JOIN的意思是以左边的订单表为主表即使某条订单在商品表中找不到匹配的商品信息这条订单记录也会保留商品名和品类显示为 NULL。4.4 子查询子查询就是把一个查询结果当临时表再用。比如找出销售额高于平均销售额的订单SELECT 订单号, 销售额 FROM jd_orders WHERE 销售额 ( SELECT AVG(销售额) FROM jd_orders );4.5 去重查询数据清洗时经常需要确认某张表里有没有重复记录可以用去重查询SELECT DISTINCT 订单号 FROM jd_orders;或者统计重复次数SELECT 订单号, COUNT(*) AS cnt FROM jd_orders GROUP BY 订单号 HAVING COUNT(*) 1;5. 京东电商实战项目从数据清洗到可视化现在进入本文的重头戏用一份模拟的京东电商数据完成一个完整的数据分析项目。项目流程是数据说明 → SQL 取数 → pandas 清洗 → 业务分析 → 可视化 → 导出报告。5.1 需求分析与数据说明本次项目的业务背景是某京东店铺需要做月度经营复盘希望了解 2025 年第一季度的销售表现。具体需求如下各品类销售额占比和销量排名。每月销售额趋势。销售额最高的 10 个商品。不同城市的销售分布。价格区间与销量的关系。为了演示 SQL 多表查询我们准备两张表jd_orders订单表和jd_products商品表。订单表存储每一笔订单的明细商品表存储商品的基础信息。先创建 SQLite 数据库并导入数据。为了简化操作我们用 Python 脚本完成建表和导入import sqlite3 import pandas as pd # 连接数据库文件不存在会自动创建 conn sqlite3.connect(data/jd_shop.db) # 读取 CSV orders pd.read_csv(data/jd_orders.csv) products pd.read_csv(data/jd_products.csv) # 写入数据库 orders.to_sql(jd_orders, conn, if_existsreplace, indexFalse) products.to_sql(jd_products, conn, if_existsreplace, indexFalse) print(数据导入完成)5.2 用 SQL 完成核心取数接下来在 SQL 中完成第一轮分析。下面这条 SQL 汇总各品类的总销量、总销售额SELECT p.品类, SUM(o.销量) AS 总销量, SUM(o.销售额) AS 总销售额, COUNT(DISTINCT o.订单号) AS 订单数 FROM jd_orders o LEFT JOIN jd_products p ON o.商品ID p.商品ID WHERE o.下单日期 BETWEEN 2025-01-01 AND 2025-03-31 GROUP BY p.品类 ORDER BY 总销售额 DESC;查询结果可以直接在数据库工具中查看也可以让 Python 执行后读取成 DataFrame。在 Python 中执行 SQL 并读取结果import sqlite3 import pandas as pd conn sqlite3.connect(data/jd_shop.db) sql SELECT p.品类, SUM(o.销量) AS 总销量, SUM(o.销售额) AS 总销售额, COUNT(DISTINCT o.订单号) AS 订单数 FROM jd_orders o LEFT JOIN jd_products p ON o.商品ID p.商品ID WHERE o.下单日期 BETWEEN 2025-01-01 AND 2025-03-31 GROUP BY p.品类 ORDER BY 总销售额 DESC; df_category pd.read_sql_query(sql, conn) print(df_category) conn.close()这里pd.read_sql_query是 pandas 提供的批量执行 SQL 并返回 DataFrame 的方法非常适合数据分析场景。5.3 用 pandas 完成数据清洗与字段衍生SQL 取数后数据可能仍然存在一些问题比如空值、异常值。我们在 pandas 里做二次加工。import pandas as pd # 读取原始订单数据 df pd.read_csv(data/jd_orders.csv) # 删除空值 df df.dropna() # 删除重复订单号 df df.drop_duplicates(subset[订单号]) # 标准化日期格式 df[下单日期] pd.to_datetime(df[下单日期]) # 衍生字段下单月份、销售额 df[下单月份] df[下单日期].dt.to_period(M) df[销售额] df[价格] * df[销量] # 检查是否还存在异常价格小于等于0 print(df[df[价格] 0])5.4 业务分析回答 5 个分析问题问题 1各品类销售额占比# 按品类分组汇总销售额 category_sales df.groupby(品类)[销售额].sum().reset_index() category_sales category_sales.sort_values(销售额, ascendingFalse) print(category_sales)问题 2每月销售额趋势monthly_sales df.groupby(下单月份)[销售额].sum().reset_index() print(monthly_sales)问题 3销售额最高的 10 个商品top10 df.groupby(商品名)[销售额].sum().reset_index() top10 top10.sort_values(销售额, ascendingFalse).head(10) print(top10)问题 4不同城市的销售分布city_sales df.groupby(城市)[销售额].sum().reset_index() city_sales city_sales.sort_values(销售额, ascendingFalse) print(city_sales)问题 5价格区间与销量的关系先把价格切成区间再统计每个区间的总销量bins [0, 100, 500, 1000, 5000] labels [100以内, 100-500, 500-1000, 1000-5000] df[价格区间] pd.cut(df[价格], binsbins, labelslabels) price_sales df.groupby(价格区间)[销量].sum().reset_index() print(price_sales)pd.cut是 pandas 里对连续变量分箱的常用方法bins是切分边界labels是每个区间的名称。5.5 数据可视化分析结果如果只放在表格里说服力会弱很多。下面用 matplotlib 把前三个核心分析结果画出来。先设置中文字体避免图表里的中文乱码import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False注意SimHei是 Windows 常见的中文字体。如果你在 macOS 或 Linux 环境运行可能需要在本地安装或使用其他中文字体。销售趋势折线图import matplotlib.pyplot as plt plt.figure(figsize(10, 5)) plt.plot(monthly_sales[下单月份].astype(str), monthly_sales[销售额], markero) plt.title(2025年第一季度每月销售额趋势) plt.xlabel(月份) plt.ylabel(销售额) plt.grid(True) plt.tight_layout() plt.savefig(output/月度销售趋势.png, dpi150) plt.show()品类销售额占比饼图plt.figure(figsize(8, 8)) plt.pie(category_sales[销售额], labelscategory_sales[品类], autopct%.1f%%) plt.title(品类销售额占比) plt.tight_layout() plt.savefig(output/品类销售额占比.png, dpi150) plt.show()Top10 商品柱状图plt.figure(figsize(10, 6)) plt.barh(top10[商品名], top10[销售额]) plt.title(销售额最高的10个商品) plt.xlabel(销售额) plt.gca().invert_yaxis() plt.tight_layout() plt.savefig(output/Top10商品.png, dpi150) plt.show()plt.barh绘制水平柱状图invert_yaxis()把 y 轴顺序反转让销售额最高的商品显示在最上面。5.6 导出分析报告最后把所有分析结果导出到 Excel 文件方便业务方查看。with pd.ExcelWriter(output/京东店铺销售分析.xlsx, engineopenpyxl) as writer: category_sales.to_excel(writer, sheet_name品类销售, indexFalse) monthly_sales.to_excel(writer, sheet_name月度趋势, indexFalse) top10.to_excel(writer, sheet_nameTop10商品, indexFalse) city_sales.to_excel(writer, sheet_name城市分布, indexFalse)6. 常见问题与排查思路实战过程中新手几乎都会遇到下面几类问题。我整理了对应排查思路方便你对照解决。问题现象常见原因解决思路pandas 读取 CSV 报错 FileNotFoundError当前工作目录和数据文件不在同一目录使用绝对路径或先执行os.chdir()切换目录图表中文显示为方块系统缺少中文字体或 matplotlib 未配置设置plt.rcParams[font.sans-serif]并检查字体是否存在运行 SQL 查询报 no such table数据库连接指向的文件没有创建表检查是否执行了建表和导入数据脚本日期字段无法分组统计日期列还是字符串类型先使用pd.to_datetime()转换类型groupby 结果列名不理想没有调用 reset_index用 reset_index() 把分组索引变成普通列使用 openpyxl 导出 Excel 报错缺少 openpyxl 库执行 pip install openpyxl 安装依赖再补充一个实际工作里经常踩的坑如果你在data/jd_orders.csv中看到订单号前面有看不见的空格可能导致后续去重、关联失效。读取数据后最好先做一次类型和内容的检查# 检查订单号是否包含空字符 print(df[订单号].str.strip().duplicated().sum())如果存在这个问题用df[订单号] df[订单号].str.strip()清洗即可。7. 最佳实践与工程建议学会跑通项目只是第一步真正能应用到实际工作还需要掌握一些工程化习惯。7.1 数据处理前先备份原始数据任何时候都不要直接修改原始 CSV 文件或数据库原始表。正确的做法是把原始数据保存在data/raw目录清洗后的数据放在data/processed目录。出现问题时可以从原始数据重新跑一遍分析流程。7.2 SQL 操作注意安全边界如果你在工作中使用 MySQL 或 SQL Server执行 UPDATE 和 DELETE 语句前一定要先确认WHERE条件是否完整。比如下面这条语句如果忘写WHERE id 1会更新所有记录UPDATE jd_products SET 价格 99 WHERE id 1;生产环境执行变更操作前建议先在测试库验证并确认有数据备份或事务包裹。同时不要把外部输入直接拼接到 SQL 字符串中否则存在 SQL 注入风险。推荐使用参数化查询例如 Python sqlite3 中的?占位符cursor.execute(SELECT * FROM jd_orders WHERE 订单号 ?, (order_id,))7.3 分析代码保持模块化不要把数据读取、清洗、分析、可视化全部堆在一个脚本里。建议按功能拆分成多个函数或脚本这样每次只需要重新运行变更的模块也方便后续代码复用。7.4 结果可复现数据分析项目必须保证可复现。操作步骤、代码、数据版本都应该记录清楚。建议每次分析前设置一个固定随机种子导出的文件命名中带上日期和版本号。7.5 性能注意事项当数据量变大时pandas 的某些操作会变得很慢。建议先用 SQL 在数据库端完成筛选、聚合、关联避免把大量原始数据加载到 Python。避免在 for 循环里逐行修改 DataFrame优先使用向量化操作。排序、去重时尽量先做类型转换和大小写统一避免重复计算。8. 总结与学习路线写到这里本次实战项目已经全部完成。你至少掌握了以下内容Python 数据分析环境搭建。pandas 基础数据清洗和分组聚合。SQL 核心查询语法包括 SELECT、WHERE、GROUP BY、JOIN、子查询。通过pd.read_sql_query让 Python 和 SQLite 协同工作。使用 matplotlib 完成折线图、饼图、柱状图可视化。一个完整的京东电商销售数据分析实战流程。接下来你可以从两个方向继续深入第一把 SQL 能力延伸到常用数据库。SQLite 的语法和 MySQL、SQL Server 存在部分差异建议找些 MySQL 或 SQL Server 的安装教程把同样的查询逻辑在真实数据库里再跑一遍。第二提高 Python 数据处理能力。pandas 还有非常多实用功能比如时间序列重采样、透视表、多表合并、apply 自定义函数等。当你处理的数据量从几万条增长到几百万条时还会接触到更高效的数据处理工具。数据分析学习的核心在于动手。建议你拿到本文的代码后不要只复制运行尽量手动敲一遍再换一批数据或者换一个分析角度比如分析不同城市的价格差异、分析商品价格和销量的相关性、分析促销月份和非促销月份的销售差异。这样一次扩展练习效果会比只看十篇教程更好。如果你在运行代码时遇到任何问题可以多看几遍运行报错信息搞清楚报错位置和原因再按本文的排查思路处理。希望这篇文章能帮你迈出数据分析实战的第一步。
返回列表