数据分析三件套:Numpy、Pandas、Matplotlib

目录

[一、 环境准备与安装](#一、 环境准备与安装)

[1.1 确认Python环境](#1.1 确认Python环境)

[1.2 使用pip一键安装](#1.2 使用pip一键安装)

[1.3 验证安装是否成功](#1.3 验证安装是否成功)

[二、 NumPy:数组计算的基石](#二、 NumPy:数组计算的基石)

[2.1 什么是NumPy?](#2.1 什么是NumPy?)

[2.2 创建数组的四种方式](#2.2 创建数组的四种方式)

[2.3 数组的常用操作](#2.3 数组的常用操作)

[2.3.1 形状操作](#2.3.1 形状操作)

[2.3.2 数学运算](#2.3.2 数学运算)

[2.3.3 索引与切片](#2.3.3 索引与切片)

[2.4 NumPy小练习:统计考试成绩](#2.4 NumPy小练习:统计考试成绩)

三、Pandas:数据分析的灵魂

[3.1 Pandas核心数据结构](#3.1 Pandas核心数据结构)

[3.2 创建DataFrame](#3.2 创建DataFrame)

[3.3 数据查看与基本信息](#3.3 数据查看与基本信息)

[3.4 添加/修改列](#3.4 添加/修改列)

[3.5 缺失值处理](#3.5 缺失值处理)

[3.6 分组与聚合(类似SQL的GROUP BY)](#3.6 分组与聚合(类似SQL的GROUP BY))

[3.7 读取与保存文件(CSV/Excel)](#3.7 读取与保存文件(CSV/Excel))

[四、 Matplotlib:数据可视化利器](#四、 Matplotlib:数据可视化利器)

[4.1 快速上手:第一个折线图](#4.1 快速上手:第一个折线图)

[4.2 四种常用图表类型及代码](#4.2 四种常用图表类型及代码)

[4.2.1 柱状图(Bar Chart)](#4.2.1 柱状图(Bar Chart))

[4.2.2 直方图(Histogram)](#4.2.2 直方图(Histogram))

[4.2.3 散点图(Scatter Plot)](#4.2.3 散点图(Scatter Plot))

[4.2.4 饼图(Pie Chart)](#4.2.4 饼图(Pie Chart))

[4.3 子图布局:一图多画](#4.3 子图布局:一图多画)

[4.4 中文字体显示问题(解决方案)](#4.4 中文字体显示问题(解决方案))

[五、 完整的数据分析案例](#五、 完整的数据分析案例)

[5.1 生成模拟数据](#5.1 生成模拟数据)

[5.2 数据清洗与整理](#5.2 数据清洗与整理)

[5.3 数据聚合分析](#5.3 数据聚合分析)

[5.4 可视化展示](#5.4 可视化展示)

[5.5 输出](#5.5 输出)


一、 环境准备与安装

1.1 确认Python环境

在安装三件套之前,请确保你的电脑已经安装了Python(推荐3.8及以上版本)。打开命令行(Windows用cmd或PowerShell,Mac/Linux用终端),输入:

bash 复制代码
python --version

如果显示版本号,说明Python已安装;如果没有,去Python官网下载安装即可。------https://www.python.org/downloads/

1.2 使用pip一键安装

最常用的方法是使用pip包管理器。由于三个库经常一起使用,我们可以一次性安装:

bash 复制代码
pip install numpy pandas matplotlib

小提示:如果下载速度慢,可以换成国内镜像源,例如清华源:

bash 复制代码
pip install numpy pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 验证安装是否成功

安装完成后,进入Python交互环境(输入python回车),依次导入三个库,不报错即为成功:

python 复制代码
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

print("安装成功!")

如果输出了`安装成功!`,恭喜你,环境已经搭建好了!

二、 NumPy:数组计算的基石

2.1 什么是NumPy?

NumPy(Numerical Python)是Python科学计算的核心库。它提供了高性能的多维数组对象ndarray,以及大量的数学函数。简单说:Python原生列表能做100件事,NumPy数组能做10000件事,而且快10倍以上。

2.2 创建数组的四种方式

python 复制代码
python
import numpy as np

# 方法1:从列表创建
a = np.array([1, 2, 3, 4, 5])
print("一维数组:", a)

# 方法2:全0数组
b = np.zeros((2, 3))  # 2行3列
print("全0数组:\n", b)

# 方法3:全1数组
c = np.ones((2, 2))
print("全1数组:\n", c)

# 方法4:范围数组(类似range)
d = np.arange(0, 10, 2)  # 0到10步长2
print("arange:", d)

2.3 数组的常用操作

2.3.1 形状操作

python 复制代码
python
arr = np.array([[1,2,3], [4,5,6]])
print("原数组形状:", arr.shape)   # (2, 3)

# 改变形状(reshape)
arr_2d = arr.reshape(3, 2)
print("reshape后:\n", arr_2d)

# 展平为一维
arr_flat = arr.flatten()
print("展平后:", arr_flat)

2.3.2 数学运算

python 复制代码
python
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

# 逐元素运算
print("加法:", x + y)      # [5 7 9]
print("乘法:", x * y)      # [4 10 18]
print("平方:", x ** 2)      # [1 4 9]

# 通用函数(ufunc)
print("开方:", np.sqrt(x))  # [1. 1.414 1.732]
print("求和:", np.sum(x))   # 6
print("均值:", np.mean(x))  # 2.0

2.3.3 索引与切片

python 复制代码
python
arr = np.array([[1,2,3], [4,5,6], [7,8,9]])

# 取第一行
print(arr[0, :])   # [1 2 3]

# 取第二列
print(arr[:, 1])   # [2 5 8]

# 切片:前两行,后两列
print(arr[:2, 1:3])  # [[2 3] [5 6]]

2.4 NumPy小练习:统计考试成绩

python 复制代码
python
# 假设5位学生的数学成绩
scores = np.array([85, 92, 78, 90, 88])

print(f"最高分: {np.max(scores)}")
print(f"最低分: {np.min(scores)}")
print(f"平均分: {np.mean(scores):.2f}")
print(f"标准差: {np.std(scores):.2f}")  # 衡量离散程度

# 输出:
最高分: 92
最低分: 78
平均分: 86.60
标准差: 4.71

NumPy的速度优势来自底层C语言实现,当你需要处理大量数值计算时,一定要优先使用NumPy而不是Python循环。

三、Pandas:数据分析的灵魂

3.1 Pandas核心数据结构

Pandas基于NumPy构建,提供了两个超级好用的数据结构:

  • Series:带标签的一维数组(类似带行索引的列)
  • DataFrame:带标签的二维表格(像Excel工作表)

3.2 创建DataFrame

python 复制代码
python
import pandas as pd

# 从字典创建
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [23, 25, 22, 24],
    '城市': ['北京', '上海', '广州', '深圳'],
    '工资': [8000, 9500, 7200, 8800]
}
df = pd.DataFrame(data)
print(df)

# 输出:

   姓名  年龄  城市    工资
0  张三  23  北京   8000
1  李四  25  上海   9500
2  王五  22  广州   7200
3  赵六  24  深圳   8800

3.3 数据查看与基本信息

python 复制代码
python
# 工资大于8500的人
high_salary = df[df['工资'] > 8500]
print(high_salary)

# 年龄小于24且工资大于7500
filtered = df[(df['年龄'] < 24) & (df['工资'] > 7500)]
print(filtered)

3.4 添加/修改列

python 复制代码
python
# 添加年终奖列(工资的1.5倍)
df['年终奖'] = df['工资'] * 1.5

# 修改城市:北京 -> 首都
df.loc[df['城市'] == '北京', '城市'] = '首都'
print(df)

3.5 缺失值处理

现实数据经常有缺失值,Pandas提供了强大的处理工具:

python 复制代码
python
import numpy as np

# 构造带缺失值的数据
df_missing = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, 11, 12]
})
print("原始数据:\n", df_missing)

# 检测缺失值
print("缺失值统计:\n", df_missing.isnull().sum())

# 方法1:删除缺失行
df_drop = df_missing.dropna()
print("删除缺失行后:\n", df_drop)

# 方法2:填充缺失值(用列均值填充)
df_fill = df_missing.fillna(df_missing.mean())
print("用均值填充后:\n", df_fill)

3.6 分组与聚合(类似SQL的GROUP BY)

python 复制代码
python
# 创建示例数据
df_sales = pd.DataFrame({
    '部门': ['销售', '技术', '销售', '技术', '市场'],
    '员工': ['A', 'B', 'C', 'D', 'E'],
    '销售额': [100, 200, 150, 300, 250]
})

# 按部门分组,计算总销售额
grouped = df_sales.groupby('部门')['销售额'].sum()
print(grouped)

# 输出:

部门
市场    250
技术    500
销售    250
Name: 销售额, dtype: int64

3.7 读取与保存文件(CSV/Excel)

python 复制代码
python
# 读取CSV文件
df = pd.read_csv('data.csv')

# 读取Excel文件(需要安装openpyxl或xlrd)
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 保存为CSV
df.to_csv('output.csv', index=False)

# 保存为Excel
df.to_excel('output.xlsx', index=False)

Pandas还能处理时间序列、合并连接(merge/concat)、数据透视表(pivot_table)等高级功能,本文只介绍最常用的,后续再单独介绍!

四、 Matplotlib:数据可视化利器

4.1 快速上手:第一个折线图

python 复制代码
python
import matplotlib.pyplot as plt

# 数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# 创建图形
plt.plot(x, y, marker='o', linestyle='-', color='b', label='y=2x')

# 添加标签和标题
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('简单折线图示例')
plt.legend()

# 显示图形
plt.show()

4.2 四种常用图表类型及代码

4.2.1 柱状图(Bar Chart)

适合比较不同类别的数值。

python 复制代码
python
categories = ['苹果', '香蕉', '橙子', '葡萄']
values = [30, 45, 38, 52]

plt.bar(categories, values, color=['red', 'orange', 'orange', 'purple'])
plt.title('水果销量统计')
plt.xlabel('水果')
plt.ylabel('销量(kg)')
plt.show()

4.2.2 直方图(Histogram)

适合查看数值分布(如年龄分布、分数分布)。

python 复制代码
python
import numpy as np

# 生成1000个服从正态分布的随机数
data = np.random.randn(1000)

plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.title('正态分布直方图')
plt.xlabel('数值')
plt.ylabel('频数')
plt.show()

4.2.3 散点图(Scatter Plot)

适合观察两个变量之间的关系。

python 复制代码
python
# 身高(cm) vs 体重(kg)
height = [158, 162, 170, 175, 180, 165, 169, 172]
weight = [52, 55, 63, 70, 78, 58, 62, 68]

plt.scatter(height, weight, s=100, c='red', marker='o')
plt.title('身高体重散点图')
plt.xlabel('身高(cm)')
plt.ylabel('体重(kg)')
plt.grid(True)
plt.show()

4.2.4 饼图(Pie Chart)

适合展示占比。

python 复制代码
python
sizes = [25, 35, 20, 20]
labels = ['Python', 'Java', 'C++', 'JavaScript']
explode = (0.05, 0, 0, 0)  # 突出第一块

plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title('编程语言使用比例')
plt.axis('equal')  # 保证饼图是正圆
plt.show()

4.3 子图布局:一图多画

python 复制代码
python
# 创建2行2列的子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))

# 子图1:折线图
axes[0,0].plot([1,2,3], [1,4,9])
axes[0,0].set_title('折线图')

# 子图2:柱状图
axes[0,1].bar(['A','B','C'], [3,7,5])
axes[0,1].set_title('柱状图')

# 子图3:散点图
axes[1,0].scatter([1,2,3], [5,6,7])
axes[1,0].set_title('散点图')

# 子图4:直方图
axes[1,1].hist(np.random.randn(100), bins=20)
axes[1,1].set_title('直方图')

plt.tight_layout()  # 自动调整间距
plt.show()

4.4 中文字体显示问题(解决方案)

Matplotlib默认字体不支持中文,会显示成小方块。解决方法:

python 复制代码
python
# 方法一:全局设置(推荐)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False   # 解决负号显示问题

# 方法二:临时指定(用于单个标签)
plt.xlabel('年龄', fontproperties='SimHei')

如果SimHei不行,可以换成['Microsoft YaHei']`或`['KaiTi'],也可以使用系统可用字体:

python 复制代码
python
import matplotlib.font_manager as fm
# 查看所有可用字体
fonts = [f.name for f in fm.fontManager.ttflist]
print(fonts)

五、 完整的数据分析案例

场景:某公司销售数据,分析不同地区的销售额情况,并可视化。

5.1 生成模拟数据

python 复制代码
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']

# 生成100条销售记录
np.random.seed(42)  # 固定随机种子,保证结果可重复
regions = ['华北', '华东', '华南', '西南', '西北']
products = ['产品A', '产品B', '产品C']

data = {
    '日期': pd.date_range('2024-01-01', periods=100, freq='D'),
    '地区': np.random.choice(regions, 100),
    '产品': np.random.choice(products, 100),
    '销售额': np.random.randint(500, 5000, 100),
    '客户数': np.random.randint(5, 100, 100)
}
df = pd.DataFrame(data)
print(df.head())

5.2 数据清洗与整理

python 复制代码
python
# 检查缺失值
print("缺失值情况:\n", df.isnull().sum())

# 假设销售额有2个异常值(大于4500),我们将其替换为均值
mean_sales = df['销售额'].mean()
df.loc[df['销售额'] > 4500, '销售额'] = mean_sales

# 新增列客单价 = 销售额 / 客户数
df['客单价'] = df['销售额'] / df['客户数']

5.3 数据聚合分析

python 复制代码
python
# 按地区统计总销售额和平均客单价
region_stats = df.groupby('地区').agg({
    '销售额': 'sum',
    '客单价': 'mean',
    '客户数': 'sum'
}).round(2).reset_index()
print(region_stats)

# 输出(示例):

| 地区 | 销售额 | 客单价 | 客户数 |
|------|--------|--------|--------|
| 华东 | 148230 | 68.23  | 2450   |
| 华南 | 132110 | 72.15  | 1980   |
| 华北 | 112300 | 55.67  | 2100   |
| 西北 | 98500  | 45.89  | 1700   |
| 西南 | 107660 | 60.44  | 1880   |

5.4 可视化展示

python 复制代码
python
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 各地区销售额柱状图
axes[0].bar(region_stats['地区'], region_stats['销售额'], color='skyblue')
axes[0].set_title('各地区总销售额对比')
axes[0].set_xlabel('地区')
axes[0].set_ylabel('销售额(元)')
for i, v in enumerate(region_stats['销售额']):
    axes[0].text(i, v+2000, str(int(v)), ha='center')

# 各地区平均客单价折线图
axes[1].plot(region_stats['地区'], region_stats['客单价'], marker='o', linewidth=2, markersize=8)
axes[1].set_title('各地区平均客单价')
axes[1].set_xlabel('地区')
axes[1].set_ylabel('客单价(元)')
axes[1].grid(True, linestyle='--', alpha=0.6)

plt.tight_layout()
plt.show()

5.5 输出

python 复制代码
python
best_region = region_stats.loc[region_stats['销售额'].idxmax(), '地区']
print(f"销售额最高的地区是:{best_region}")

high_customer = region_stats.loc[region_stats['客单价'].idxmax(), '地区']
print(f"客单价最高的地区是:{high_customer}")
`

这样一个从数据生成、清洗、分析到可视化的完整流程就完成了!是不是很有成就感?

如果这篇文章du对你有帮助,欢迎点赞、收藏、关注哦!

相关推荐
聊聊MES那点事14 小时前
从数据采集到日报输出,FastReport如何帮工厂做好生产日报?
数据分析·报表工具·fastreport
kcuwu.15 小时前
Python数据分析三剑客导论:NumPy、Pandas、Matplotlib 从入门到入门
python·数据分析·numpy
superior tigre15 小时前
NumPy 基础使用方法(基础+矩阵运算+Attention)
线性代数·矩阵·numpy
数厘16 小时前
2.4MySQL安装配置指南(电商数据分析专用)
数据库·mysql·数据分析
databook17 小时前
逃离SQL丛林:实用主义的数据救赎
后端·sql·数据分析
wang_yb17 小时前
逃离SQL丛林:实用主义的数据救赎
数据分析·databook
问组生物18 小时前
在线绘制带连线的配体-受体联合热图
数据分析·数据可视化·论文插图·科研绘图·科学科普·基因表达·联合热图
Aloudata19 小时前
如何通过 NoETL 指标平台根治跨业务口径混乱
数据分析·etl·指标平台·指标口径
七颗糖很甜21 小时前
雨滴谱数据深度解析——从原始变量到科学产品的Python实现【下篇】
python·算法·pandas