引言

在当今数据驱动的时代,数据分析已成为各行各业不可或缺的技能。Python凭借其简洁的语法和强大的数据科学库,成为数据分析领域的首选语言。其中,NumPyPandas 是两个最核心的库,它们为数据处理、计算和分析提供了坚实的基础。本文将带你从零开始,通过实战案例掌握Python数据分析的基本流程和核心技能。


一、环境搭建:Anaconda + Jupyter

1. 安装 Anaconda

Anaconda 是一个开源的 Python 发行版,集成了大量常用的数据科学包(如 NumPy、Pandas、Matplotlib 等),并自带包管理工具 conda

  • 下载地址:https://www.anaconda.com/products/distribution
  • 安装步骤
    1. 选择对应操作系统的版本(Windows/macOS/Linux)
    2. 下载并运行安装程序
    3. 按照提示完成安装(建议勾选“Add Anaconda to PATH”)

2. 启动 Jupyter Notebook

Jupyter Notebook 是一个交互式开发环境,非常适合数据分析和可视化。

  • 打开终端(或 Anaconda Prompt)
  • 输入命令:
    jupyter notebook
  • 浏览器将自动打开 Jupyter 界面,点击 New → Python 3 创建新笔记本。

二、NumPy:科学计算的基础

NumPy(Numerical Python)是 Python 中用于数值计算的核心库,其核心是 ndarray(N-dimensional array,多维数组)。

1. 创建数组

import numpy as np

# 创建一维数组
arr = np.array([1, 2, 3, 4, 5])
print(arr)  # [1 2 3 4 5]

# 创建二维数组(矩阵)
matrix = np.array([[1, 2], [3, 4]])
print(matrix)

2. 数组切片

NumPy 的切片语法与 Python 列表类似,但支持多维:

arr = np.array([10, 20, 30, 40, 50])

# 切片:[start:end:step]
print(arr[1:4])    # [20 30 40]
print(arr[::-1])   # [50 40 30 20 10] 反向

# 二维数组切片
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix[0, :])  # 第一行 [1 2 3]
print(matrix[:, 1])  # 第一列 [2 5 8]

3. 广播机制(Broadcasting)

广播允许不同形状的数组进行算术运算:

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

# b 被自动“广播”到与 a 相同的形状
result = a + b
print(result)
# [[11 22 33]
#  [14 25 36]]

4. 统计函数

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

print("均值:", np.mean(data))        # 5.5
print("标准差:", np.std(data))       # 2.87
print("最大值:", np.max(data))       # 10
print("最小值:", np.min(data))       # 1
print("总和:", np.sum(data))         # 55

三、Pandas:数据处理的利器

Pandas 提供了强大的数据结构,尤其是 DataFrame,非常适合处理表格型数据。

1. 创建 DataFrame

import pandas as pd

# 从字典创建 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [23, 25, 22, 24],
    'Score': [85, 92, 78, 96]
}
df = pd.DataFrame(data)
print(df)

输出:

      Name  Age  Score
0    Alice   23     85
1      Bob   25     92
2  Charlie   22     78
3    David   24     96

2. 缺失值处理

现实数据中常有缺失值(NaN),Pandas 提供了多种处理方式:

# 模拟缺失值
df.loc[1, 'Score'] = np.nan

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

# 填充缺失值(用平均分)
mean_score = df['Score'].mean()
df['Score'].fillna(mean_score, inplace=True)

# 或者直接删除含缺失值的行
# df.dropna(inplace=True)

3. 数据筛选

# 筛选分数大于90的学生
high_scorers = df[df['Score'] > 90]
print(high_scorers)

# 多条件筛选
result = df[(df['Age'] > 22) & (df['Score'] > 80)]
print(result)

四、常见问题与解决

1. 数据读取编码错误

使用 pd.read_csv() 读取 CSV 文件时,常因编码问题报错:

# 常见错误:UnicodeDecodeError
# df = pd.read_csv('data.csv')

# 解决方法:指定编码
df = pd.read_csv('data.csv', encoding='utf-8')

# 如果仍报错,尝试:
# df = pd.read_csv('data.csv', encoding='gbk')  # 中文常用
# df = pd.read_csv('data.csv', encoding='latin1')
# df = pd.read_csv('data.csv', encoding='cp1252')

2. 数据类型转换

确保数据类型正确,避免计算错误:

# 查看数据类型
print(df.dtypes)

# 转换数据类型
df['Age'] = df['Age'].astype(int)
df['Score'] = pd.to_numeric(df['Score'], errors='coerce')  # 错误转为 NaN

五、实战案例:学生成绩数据分析

1. 准备数据

假设有一个 students.csv 文件,内容如下:

Name,Math,English,Science
Alice,85,90,88
Bob,78,85,82
Charlie,92,76,90
David,88,94,85
Eve,80,88,84

2. 读取并分析数据

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

# 读取数据
df = pd.read_csv('students.csv', encoding='utf-8')

# 查看数据基本信息
print("数据预览:")
print(df.head())
print("\n数据类型:")
print(df.dtypes)

3. 成绩排序

# 按总分排序
df['Total'] = df[['Math', 'English', 'Science']].sum(axis=1)
df_sorted = df.sort_values(by='Total', ascending=False)
print("\n按总分排序:")
print(df_sorted)

4. 平均分统计

# 各科平均分
avg_scores = df[['Math', 'English', 'Science']].mean()
print("\n各科平均分:")
print(avg_scores)

# 全体学生平均分
overall_avg = df['Total'].mean()
print(f"\n全班平均总分:{overall_avg:.2f}")

5. 可视化图表

# 设置中文字体(避免乱码)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 绘制柱状图:各科平均分
avg_scores.plot(kind='bar', title='各科平均分', color=['skyblue', 'lightgreen', 'salmon'])
plt.ylabel('分数')
plt.xticks(rotation=0)
plt.show()

# 绘制饼图:成绩等级分布
def get_grade(score):
    if score >= 90: return 'A'
    elif score >= 80: return 'B'
    elif score >= 70: return 'C'
    else: return 'D'

df['Grade'] = df['Total'].apply(get_grade)
grade_count = df['Grade'].value_counts()

grade_count.plot(kind='pie', title='成绩等级分布', autopct='%1.1f%%')
plt.ylabel('')
plt.show()

结语

通过本文的学习,你已经掌握了使用 Python 进行数据分析的基本流程:从环境搭建、数据读取、清洗处理,到统计分析和可视化展示。NumPy 和 Pandas 的强大功能让你能够高效地处理各种数据任务。

关键要点回顾

  • 使用 Anaconda 快速搭建数据分析环境
  • NumPy 用于高效数组运算和数学计算
  • Pandas 是处理表格数据的首选工具
  • 注意编码问题和数据类型转换
  • 结合 Matplotlib 实现数据可视化

数据分析是一个不断实践的过程。建议你找一些真实数据集(如 Kaggle、政府开放数据等)进行练习,逐步提升技能。随着经验的积累,你将能够处理更复杂的数据分析任务,挖掘数据背后的深层价值。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐