基础知识
数据分析核心概念
数据分析是从数据中提取有用信息的过程,涉及数据收集、清洗、转换、建模和可视化等多个环节。
NumPy 数组
NumPy 是 Python 科学计算的基础库,提供了高性能的多维数组对象和各种数学函数。
- ndarray:N 维数组对象,是 NumPy 的核心
- 向量化运算:避免 Python 循环,提高计算效率
- 广播机制:不同形状数组之间的运算规则
Pandas DataFrame
Pandas 是 Python 数据分析的核心库,提供了 DataFrame 和 Series 两种主要数据结构。
- DataFrame:二维表格型数据结构,类似 Excel 表格
- Series:一维带标签数组
- 支持数据对齐、缺失值处理、数据合并等操作
数据清洗
数据清洗是数据分析的重要步骤,包括处理缺失值、重复值、异常值,以及数据类型转换等。
可视化
数据可视化帮助直观理解数据。常用库包括 Matplotlib、Seaborn、Plotly 等。
图文教程
步骤一:Pandas 基本操作
import pandas as pd
# 创建 DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 28],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Shenzhen'],
'salary': [8000, 12000, 15000, 10000]
})
# 基本信息
print(df.head()) # 前5行
print(df.info()) # 数据信息
print(df.describe()) # 统计描述
步骤二:数据筛选
# 条件筛选
beijing = df[df['city'] == 'Beijing']
high_salary = df[df['salary'] > 10000]
# 多条件筛选
result = df[(df['age'] > 25) & (df['salary'] >= 10000)]
# 使用 query
df.query('age > 25 and salary >= 10000')
# 选择列
df[['name', 'salary']]
df.loc[0:2, ['name', 'age']]
步骤三:分组聚合
# 按城市分组统计
city_stats = df.groupby('city').agg({
'salary': ['mean', 'max', 'min'],
'age': 'mean'
})
# 透视表
pivot = pd.pivot_table(df, values='salary',
index='city',
aggfunc=['mean', 'count'])
# 排序
df.sort_values('salary', ascending=False)
# 新增列
df['salary_level'] = pd.cut(df['salary'],
bins=[0, 10000, 15000, 20000],
labels=['Low', 'Medium', 'High'])
代码实操
阅读以下代码,理解实现原理,然后尝试修改并运行
实践任务:数据清洗与可视化
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=100),
'sales': np.random.normal(1000, 200, 100),
'customers': np.random.randint(50, 200, 100)
})
df.loc[10:15, 'sales'] = np.nan
df.loc[80, 'sales'] = 5000
df['sales'].fillna(df['sales'].median(), inplace=True)
Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df.loc[df['sales'] > upper, 'sales'] = upper
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].plot(df['date'], df['sales'])
axes[0].set_title('Sales Trend')
axes[1].scatter(df['customers'], df['sales'])
axes[1].set_title('Sales vs Customers')
plt.tight_layout()
plt.show()
练习任务
- 添加移动平均线到趋势图
- 按月份分组统计销售额
- 添加箱线图显示销售数据分布