第2章:Python数据科学生态:Anaconda安装与配置、Jupyter Notebook使用、NumPy基础、Pandas基础、Matplotlib基础

说实话,很多初学者问我数据挖掘第一步该做什么,我总会说:先把你的Python环境搭好。别小看这一步,我见过太多人因为环境问题卡了整整一周。我自己刚入行时,也曾在配置环境上浪费过不少时间。

这一章,我们就来搞定数据挖掘的四大金刚:Anaconda、Jupyter Notebook、NumPy、Pandas、Matplotlib。嗯,一口气学完,后面你就知道有多爽了。

2.1 Anaconda:一站式数据科学工具箱

Anaconda是什么?说白了,它是一个Python发行版,把Python解释器、常用库、包管理器都打包好了。你装一个Anaconda,就等于装好了数据科学所需的大部分工具。

核心优势:

  • 自带Python解释器(不用单独装Python)
  • 内置conda包管理器(比pip更强大)
  • 预装200+常用数据科学库
  • 支持虚拟环境管理

2.1.1 安装步骤

我个人习惯去官网下载Anaconda Individual Edition。注意选对操作系统版本,Windows用户选64-Bit Graphical Installer就行。

# 安装完成后,验证是否成功
conda --version
# 输出示例:conda 23.7.4

python --version
# 输出示例:Python 3.11.5

小技巧:安装时勾选"Add Anaconda to my PATH environment variable",这样可以在命令行直接使用conda命令。不过新版安装器默认不勾选,建议手动勾上。

2.1.2 虚拟环境管理

我在项目中遇到过最头疼的事,就是不同项目依赖不同版本的库。比如项目A需要NumPy 1.19,项目B需要NumPy 1.24。怎么办?用虚拟环境隔离。

# 创建虚拟环境
conda create -n myenv python=3.9

# 激活环境
conda activate myenv

# 安装包
conda install numpy pandas matplotlib

# 退出环境
conda deactivate

# 查看所有环境
conda env list

注意:千万不要在base环境里装太多包。我曾经把base环境搞崩过,重装Anaconda花了半天。建议每个项目建一个独立环境。

2.2 Jupyter Notebook:交互式编程利器

Jupyter Notebook是我最常用的数据挖掘工具,没有之一。它把代码、运行结果、图表、文字说明整合在一个文档里,特别适合做探索性分析。

2.2.1 启动与基本操作

# 在命令行启动
jupyter notebook

# 或者使用JupyterLab(更现代的界面)
jupyter lab

启动后浏览器会自动打开,你会看到一个文件管理界面。新建一个Notebook,默认是.ipynb格式。

嗯,这里要注意几个快捷键:

  • Shift + Enter:运行当前单元格并跳到下一个
  • Ctrl + Enter:运行当前单元格但不跳转
  • Esc + A:在当前单元格上方插入新单元格
  • Esc + B:在当前单元格下方插入新单元格
  • Esc + M:切换为Markdown单元格(写说明文字)
  • Esc + Y:切换为代码单元格

我的习惯:先用Markdown单元格写清楚分析思路,再在代码单元格里实现。这样Notebook本身就是一份可执行的报告。

2.2.2 魔法命令

Jupyter有一些特殊的魔法命令,以%开头,能极大提升效率。

# 测量代码运行时间
%time sum(range(1000000))

# 查看变量内存占用
%whos

# 嵌入matplotlib图表
%matplotlib inline

# 运行外部Python文件
%run my_script.py

2.3 NumPy:数值计算的基础

NumPy是Python数据科学的基石。Pandas和Scikit-learn都建立在NumPy之上。说白了,NumPy就是高效的多维数组操作库。

2.3.1 创建数组

import numpy as np

# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])

# 创建全零数组
zeros = np.zeros((3, 4))

# 创建全一数组
ones = np.ones((2, 3))

# 创建等差数列
seq = np.arange(0, 10, 2)  # [0, 2, 4, 6, 8]

# 创建等间隔数组
lin = np.linspace(0, 1, 5)  # [0, 0.25, 0.5, 0.75, 1]

2.3.2 数组运算

NumPy的向量化运算是我最喜欢的功能。不用写循环,直接对整个数组做运算,速度飞快。

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 逐元素运算
print(a + b)    # [5, 7, 9]
print(a * b)    # [4, 10, 18]
print(a ** 2)   # [1, 4, 9]

# 广播机制
print(a + 10)   # [11, 12, 13]

# 统计运算
print(a.mean())  # 2.0
print(a.sum())   # 6
print(a.max())   # 3

为什么NumPy这么快?因为它的底层是用C语言写的,而且利用了CPU的SIMD指令集。你想想看,Python的for循环每步都要做类型检查,NumPy直接操作内存块,速度能差几十倍。

2.3.3 索引与切片

arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])

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

# 取第一列
print(arr[:, 0])     # [1, 4, 7]

# 取子矩阵
print(arr[:2, 1:])   # [[2, 3], [5, 6]]

# 布尔索引
print(arr[arr > 5])  # [6, 7, 8, 9]

2.4 Pandas:数据分析的核心

Pandas提供了两种核心数据结构:Series(一维)和DataFrame(二维)。我在实际项目中,90%的数据处理工作都是用Pandas完成的。

2.4.1 Series与DataFrame

import pandas as pd

# Series:带标签的一维数组
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

# DataFrame:表格型数据结构
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 35],
    '城市': ['北京', '上海', '广州']
})
print(df)

2.4.2 数据读取与查看

# 读取CSV文件
df = pd.read_csv('data.csv')

# 查看前5行
df.head()

# 查看基本信息
df.info()

# 查看统计摘要
df.describe()

# 查看列名
df.columns

避坑指南:我曾经在读取CSV时没指定编码,结果中文全乱码了。建议养成习惯:pd.read_csv('file.csv', encoding='utf-8')。如果还不行,试试encoding='gbk'

2.4.3 数据清洗常用操作

# 检查缺失值
df.isnull().sum()

# 删除缺失值
df.dropna()

# 填充缺失值
df.fillna(df.mean())

# 删除重复行
df.drop_duplicates()

# 重命名列
df.rename(columns={'旧名': '新名'})

# 筛选数据
df[df['年龄'] > 30]

# 分组聚合
df.groupby('城市')['年龄'].mean()

2.5 Matplotlib:数据可视化基础

数据挖掘有个黄金法则:先可视化,再建模。Matplotlib是Python最经典的可视化库,虽然界面有点老气,但功能极其强大。

2.5.1 快速上手

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建折线图
plt.figure(figsize=(8, 4))
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
plt.title('正弦函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

2.5.2 常用图表类型

图表类型 适用场景 核心函数
折线图 趋势变化 plt.plot()
柱状图 类别对比 plt.bar()
散点图 变量关系 plt.scatter()
直方图 数据分布 plt.hist()
箱线图 异常值检测 plt.boxplot()

2.5.3 子图与布局

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

# 在第一个子图绘制
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('sin(x)')

# 在第二个子图绘制
axes[0, 1].plot(x, np.cos(x), color='red')
axes[0, 1].set_title('cos(x)')

# 在第三个子图绘制
axes[1, 0].plot(x, np.tan(x), color='green')
axes[1, 0].set_ylim(-5, 5)
axes[1, 0].set_title('tan(x)')

# 在第四个子图绘制
axes[1, 1].scatter(x, np.sin(x) * np.cos(x), s=10)
axes[1, 1].set_title('sin(x)*cos(x)')

plt.tight_layout()
plt.show()

注意:在Jupyter Notebook中,记得先运行%matplotlib inline,否则图表可能不显示。如果你想要交互式图表,可以用%matplotlib notebook

2.6 实战:完整的数据探索流程

最后,我们用一个完整的例子,把今天学的知识串起来。假设我们有一份销售数据,要做初步探索。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 1. 生成模拟数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
sales = np.random.normal(1000, 200, 100) + np.sin(np.linspace(0, 10, 100)) * 100

df = pd.DataFrame({
    '日期': dates,
    '销售额': sales
})

# 2. 数据概览
print("数据形状:", df.shape)
print("\n前5行:")
print(df.head())
print("\n统计摘要:")
print(df.describe())

# 3. 可视化分析
plt.figure(figsize=(12, 4))

plt.subplot(1, 3, 1)
plt.plot(df['日期'], df['销售额'])
plt.title('销售额趋势')
plt.xticks(rotation=45)

plt.subplot(1, 3, 2)
plt.hist(df['销售额'], bins=20, edgecolor='black')
plt.title('销售额分布')

plt.subplot(1, 3, 3)
plt.boxplot(df['销售额'])
plt.title('销售额箱线图')

plt.tight_layout()
plt.show()

# 4. 发现异常值
Q1 = df['销售额'].quantile(0.25)
Q3 = df['销售额'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = df[(df['销售额'] < lower) | (df['销售额'] > upper)]
print(f"\n发现 {len(outliers)} 个异常值")

你看,短短几十行代码,我们就完成了数据加载、统计描述、可视化分析和异常检测。这就是Python数据科学生态的魅力——工具链完整,衔接流畅。

我个人建议,学完这一章后,找一份真实的数据集(比如Kaggle上的Titanic数据集),完整地走一遍这个流程。只有动手做,才能真正掌握。下一章,我们将进入数据预处理的世界,那才是数据挖掘真正开始的地方。