《零基础学会!如何用 sql+Python 绘制柱状图和折线图,数据可视化一看就懂》

发布于:2025-02-26 ⋅ 阅读:(21) ⋅ 点赞:(0)

在数据驱动的时代,MySQL 是最常用的关系型数据库管理系统之一,广泛应用于各类数据存储和处理场景。数据分析的过程不仅仅是收集数据,还包括数据的清洗、转换、查询以及最终的报告和可视化。在本文中,我们将通过实际案例来介绍如何使用 MySQL 进行数据分析,并结合 Python 绘制柱状图和折线图,帮助你快速掌握数据分析和可视化技巧。

MySQL 数据分析实战

1. 数据准备与清洗

数据分析的第一步是准备好需要分析的数据。通常,数据的来源可能是业务系统生成的日志、交易记录、用户行为数据等。

1.1 导入数据

假设我们有一个包含用户交易记录的数据集,格式如下:

user_id, transaction_id, amount, transaction_date
1, 10001, 150, 2024-01-01
2, 10002, 200, 2024-01-02
...

可以通过以下 SQL 语句将其导入 MySQL:

INSERT INTO transactions (transaction_id, user_id, amount, transaction_date) VALUES
(10005, 1, 250, '2024-01-05'),
(10006, 2, 300, '2024-01-07'),
(10007, 3, 150, '2024-01-10'),
(10008, 4, 400, '2024-01-12'),
(10009, 5, 500, '2024-01-14'),
(10010, 1, 320, '2024-01-16'),
(10011, 2, 220, '2024-01-18'),
(10012, 3, 180, '2024-01-20'),
(10013, 4, 550, '2024-01-22'),
(10014, 5, 600, '2024-01-25'),
(10015, 1, 280, '2024-01-28'),
(10016, 2, 170, '2024-01-30'),
(10017, 3, 400, '2024-02-02'),
(10018, 4, 350, '2024-02-04'),
(10019, 5, 450, '2024-02-06'),
(10020, 1, 270, '2024-02-08'),
(10021, 2, 320, '2024-02-10'),
(10022, 3, 500, '2024-02-12'),
(10023, 4, 330, '2024-02-15'),
(10024, 5, 520, '2024-02-17'),
(10025, 1, 400, '2024-02-19'),
(10026, 2, 280, '2024-02-21'),
(10027, 3, 460, '2024-02-23'),
(10028, 4, 310, '2024-02-26'),
(10029, 5, 380, '2024-02-28'),
(10030, 1, 290, '2024-03-02'),
(10031, 2, 320, '2024-03-05'),
(10032, 3, 520, '2024-03-08'),
(10033, 4, 390, '2024-03-11'),
(10034, 5, 500, '2024-03-13'),
(10035, 1, 250, '2024-03-15'),
(10036, 2, 380, '2024-03-18'),
(10037, 3, 470, '2024-03-21'),
(10038, 4, 310, '2024-03-24'),
(10039, 5, 440, '2024-03-26'),
(10040, 1, 210, '2024-03-28'),
(10041, 2, 270, '2024-03-31'),
(10042, 3, 330, '2024-04-02'),
(10043, 4, 310, '2024-04-04'),
(10044, 5, 370, '2024-04-06'),
(10045, 1, 400, '2024-04-08'),
(10046, 2, 450, '2024-04-10'),
(10047, 3, 490, '2024-04-13'),
(10048, 4, 520, '2024-04-15'),
(10049, 5, 450, '2024-04-17'),
(10050, 1, 460, '2024-04-19'),
(10051, 2, 230, '2024-04-22'),
(10052, 3, 350, '2024-04-24'),
(10053, 4, 470, '2024-04-26'),
(10054, 5, 490, '2024-04-29'),
(10055, 1, 500, '2024-05-02'),
(10056, 2, 320, '2024-05-04'),
(10057, 3, 450, '2024-05-06'),
(10058, 4, 370, '2024-05-09'),
(10059, 5, 500, '2024-05-11'),
(10060, 1, 330, '2024-05-13'),
(10061, 2, 410, '2024-05-16'),
(10062, 3, 490, '2024-05-18'),
(10063, 4, 520, '2024-05-21'),
(10064, 5, 300, '2024-05-23'),
(10065, 1, 280, '2024-05-25'),
(10066, 2, 360, '2024-05-28'),
(10067, 3, 470, '2024-05-30'),
(10068, 4, 450, '2024-06-02'),
(10069, 5, 320, '2024-06-04'),
(10070, 1, 400, '2024-06-06'),
(10071, 2, 220, '2024-06-09'),
(10072, 3, 340, '2024-06-11'),
(10073, 4, 430, '2024-06-14'),
(10074, 5, 550, '2024-06-16'),
(10075, 1, 250, '2024-06-18'),
(10076, 2, 320, '2024-06-20'),
(10077, 3, 430, '2024-06-23'),
(10078, 4, 470, '2024-06-25'),
(10079, 5, 360, '2024-06-27'),
(10080, 1, 290, '2024-06-30'),
(10081, 2, 410, '2024-07-02'),
(10082, 3, 500, '2024-07-05')


1.2 清洗数据

数据清洗主要包括去除重复数据、处理缺失值、格式转换等操作。可以使用以下 SQL 查询来检查并清理数据。

去除重复数据:

WITH CTE AS (
    SELECT 
        transaction_id,
        user_id,
        ROW_NUMBER() OVER (PARTITION BY transaction_id ORDER BY transaction_date) AS row_num
    FROM transactions
)
DELETE FROM transactions
WHERE transaction_id IN (
    SELECT transaction_id
    FROM CTE
    WHERE row_num > 1
);


处理缺失值:

UPDATE transactions
SET amount = 0
WHERE amount IS NULL;

2. 数据分析

清洗后的数据可以进行各种分析。以下是几个常见的数据分析任务:

2.1 销售总额分析

我们可以通过以下 SQL 查询来计算某个时间段内的总销售额:

SELECT SUM(amount) AS total_sales
FROM transactions
WHERE transaction_date BETWEEN '2024-01-01' AND '2024-01-31';

图片

2.2 用户活跃度分析

分析每个用户在某段时间内的交易次数,可以使用以下查询:

SELECT user_id, COUNT(transaction_id) AS transaction_count
FROM transactions
WHERE transaction_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY user_id
ORDER BY transaction_count DESC;

图片

2.3 平均交易金额分析

计算每笔交易的平均金额,可以通过以下查询:

SELECT AVG(amount) AS average_transaction_amount
FROM transactions
WHERE transaction_date BETWEEN '2024-01-01' AND '2024-01-31';

图片

3. 数据可视化

虽然 MySQL 可以进行强大的数据查询,但其本身并不支持复杂的可视化功能。在实际应用中,通常会将 MySQL 中的查询结果导出并与其他工具(如 Excel、Tableau、Power BI 等)结合,进行数据可视化。

在本篇教程中,我将展示如何使用 Python 中的 matplotlib 绘制柱状图和折线图。

3.1 绘制柱状图和折线图

首先,我们需要从 MySQL 中提取数据。假设我们已经得到了每个用户在 2024 年 1 月份的交易次数。接下来,我们将绘制一个包含柱状图和折线图的图表,柱状图展示每个用户的交易次数,折线图展示交易次数的变化趋势。

以下是实现的完整代码:

import pymysql
import pandas as pd
import matplotlib.pyplot as plt

# 连接 MySQL 数据库
conn = pymysql.Connect(user='root', password='root', host='localhost', database='demo')

# 执行查询
query = """
SELECT user_id, COUNT(transaction_id) AS transaction_count 
FROM transactions 
WHERE transaction_date BETWEEN '2024-01-01' AND '2024-01-31' 
GROUP BY user_id 
ORDER BY transaction_count DESC;
"""
df = pd.read_sql(query, conn)

# 创建一个图形
fig, ax1 = plt.subplots()

# 绘制柱状图
bars = ax1.bar(df['user_id'], df['transaction_count'], color='b', alpha=0.6)
ax1.set_xlabel('User ID')
ax1.set_ylabel('Transaction Count', color='b')
ax1.tick_params(axis='y', labelcolor='b')

# 在柱状图上添加数值
for bar in bars:
    yval = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2, yval + 20, str(int(yval)), ha='center', color='b', fontsize=10)

# 创建第二个 Y 轴
ax2 = ax1.twinx()

# 绘制折线图
line, = ax2.plot(df['user_id'], df['transaction_count'], color='r', marker='o', linestyle='-', label='Transaction Count (Line)')
ax2.set_ylabel('Transaction Count (Line)', color='r')
ax2.tick_params(axis='y', labelcolor='r')

# 在折线图上添加数值
for i, txt in enumerate(df['transaction_count']):
    ax2.text(df['user_id'][i], txt + 20, str(txt), ha='center', color='r', fontsize=10)

# 标题
plt.title('User Activity in January 2024')

# 调整布局,以避免数值重叠
plt.tight_layout()

# 显示图表
plt.show()
3.2 图表效果

运行上述代码后,你将看到一个包含柱状图和折线图的图表:

  • 柱状图:展示每个用户的交易次数。

  • 折线图:展示交易次数的趋势变化。

每个柱状图的顶部和折线图的数据点上方都会显示数值标签,帮助更直观地查看数据。

图片

报告中可以包含每个用户的总消费金额、每月的销售趋势、各类产品的销量等。

4. 性能优化

在进行大规模数据分析时,查询性能非常重要。以下是一些常见的优化方法:

4.1 索引优化

为经常查询的字段(如 user_idtransaction_date 等)创建索引,可以大大提高查询性能:

CREATE INDEX idx_user_id ON transactions(user_id);
CREATE INDEX idx_transaction_date ON transactions(transaction_date);
4.2 分区表

对于非常大的表,使用分区表可以提高查询效率。例如,可以按月份将交易数据进行分区:

CREATE TABLE transactions (
    transaction_id INT,
    user_id INT,
    amount DECIMAL(10, 2),
    transaction_date DATE
)
PARTITION BY RANGE (YEAR(transaction_date)) (
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p2025 VALUES LESS THAN (2026)
);

MySQL 是一个强大的数据库管理工具,它可以支持从数据清洗、查询到分析和报告的全过程。在进行数据分析时,我们可以通过 SQL 语句来进行数据提取和处理,通过其他工具进行可视化,最终为决策提供数据支持。在处理大规模数据时,我们还需要关注性能优化,确保查询速度。

通过这些步骤,我们可以使用 MySQL 在实际的业务场景中进行高效的数据分析,并通过 Python 的数据可视化库,如 matplotlib,将分析结果呈现为易于理解的图表。