# 概述
数据分析是当今最热门的技能之一。Python凭借其丰富的数据科学库生态系统,成为数据分析的首选语言。本文将带你入门Python数据分析,介绍三大核心库:NumPy、Pandas和Matplotlib。
# 环境准备
首先,确保你已经安装了Python。然后使用pip安装数据分析所需的库:
pip install numpy pandas matplotlib seaborn
# NumPy数组基础
NumPy是Python中用于科学计算的核心库,提供了高性能的多维数组对象。
# 创建数组
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # [1 2 3 4 5]
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# [[1 2 3]
# [4 5 6]]
# 创建特殊数组
zeros = np.zeros((3, 4)) # 全零数组
ones = np.ones((2, 3)) # 全一数组
eye = np.eye(3) # 单位矩阵
range_arr = np.arange(0, 10, 2) # 类似range
linspace = np.linspace(0, 1, 5) # 等间距数组
# 数组属性
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # (2, 3) - 形状
print(arr.ndim) # 2 - 维度
print(arr.size) # 6 - 元素个数
print(arr.dtype) # int64 - 数据类型
# 数组运算
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 元素级运算
print(arr1 + arr2) # [5 7 9]
print(arr1 * arr2) # [4 10 18]
print(arr1 ** 2) # [1 4 9]
# 矩阵运算
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
print(np.dot(matrix1, matrix2)) # 矩阵乘法
# [[19 22]
# [43 50]]
# 数组索引和切片
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取单个元素
print(arr[0, 1]) # 2
print(arr[2][2]) # 9
# 获取行
print(arr[0]) # [1 2 3]
# 获取列
print(arr[:, 1]) # [2 5 8]
# 切片
print(arr[0:2, 1:3]) # [[2 3]
# [5 6]]
# 布尔索引
arr = np.array([1, 2, 3, 4, 5])
print(arr[arr > 3]) # [4 5]
# 常用函数
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr)) # 21 - 总和
print(np.mean(arr)) # 3.5 - 均值
print(np.max(arr)) # 6 - 最大值
print(np.min(arr)) # 1 - 最小值
print(np.std(arr)) # 1.7078 - 标准差
print(np.argmax(arr)) # 5 - 最大值索引
print(np.reshape(arr, (3, 2))) # 重塑形状
# [[1 2]
# [3 4]
# [5 6]]
# Pandas数据处理
Pandas是Python中最强大的数据处理和分析库,提供了DataFrame数据结构。
# 创建DataFrame
import pandas as pd
# 从字典创建
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 32],
'城市': ['北京', '上海', '广州', '深圳'],
'工资': [8000, 12000, 10000, 15000]
}
df = pd.DataFrame(data)
print(df)
# 查看数据
# 查看前几行
print(df.head()) # 默认前5行
print(df.head(3)) # 前3行
# 查看后几行
print(df.tail()) # 默认后5行
# 查看基本信息
print(df.info()) # 数据类型、非空值等
print(df.describe()) # 统计摘要
# 查看形状
print(df.shape) # (4, 4)
# 查看列名
print(df.columns) # Index(['姓名', '年龄', '城市', '工资'], dtype='object')
# 数据选择
# 选择列
print(df['姓名']) # 单列
print(df[['姓名', '工资']]) # 多列
# 选择行 - 按标签
print(df.loc[0]) # 第一行
print(df.loc[0:2]) # 前3行
# 选择行 - 按位置
print(df.iloc[0]) # 第一行
print(df.iloc[[0, 2]]) # 指定行
# 选择单元格
print(df.loc[0, '姓名']) # 张三
print(df.iloc[0, 0]) # 张三
# 条件筛选
print(df[df['工资'] > 10000]) # 工资大于10000
print(df[(df['年龄'] > 25) & (df['城市'] == '北京')])
# 数据清洗
# 检测缺失值
print(df.isnull()) # 每个元素是否缺失
print(df.isnull().sum()) # 每列缺失值数量
# 填充缺失值
df.fillna(0, inplace=True) # 用0填充
df.fillna(df.mean(), inplace=True) # 用均值填充
# 删除缺失值
df.dropna(inplace=True) # 删除包含缺失值的行
# 重复值处理
print(df.duplicated()) # 检测重复行
df.drop_duplicates(inplace=True) # 删除重复行
# 数据类型转换
df['年龄'] = df['年龄'].astype(str) # 转为字符串
df['工资'] = df['工资'].astype(float) # 转为浮点数
# 数据操作
# 添加列
df['奖金'] = df['工资'] * 0.1
# 修改列
df['工资'] = df['工资'] + 1000
# 删除列
df.drop('奖金', axis=1, inplace=True)
# 排序
df.sort_values('工资', ascending=False, inplace=True)
# 分组
grouped = df.groupby('城市')
print(grouped['工资'].mean()) # 按城市分组计算平均工资
# 合并数据
df1 = pd.DataFrame({'姓名': ['张三', '李四'], '年龄': [25, 30]})
df2 = pd.DataFrame({'姓名': ['张三', '王五'], '工资': [8000, 10000]})
merged = pd.merge(df1, df2, on='姓名', how='inner')
print(merged)
# 数据统计
print(df['工资'].sum()) # 总和
print(df['工资'].mean()) # 均值
print(df['工资'].median()) # 中位数
print(df['工资'].std()) # 标准差
print(df['工资'].max()) # 最大值
print(df['工资'].min()) # 最小值
print(df['城市'].value_counts()) # 计数
# 相关系数
print(df.corr())
# 协方差
print(df.cov())
# Matplotlib数据可视化
Matplotlib是Python中最常用的数据可视化库。
# 基本绘图
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 折线图
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y, label='折线图', color='blue', linewidth=2)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('基本折线图')
plt.legend()
plt.show()
# 柱状图
labels = ['张三', '李四', '王五', '赵六']
values = [8000, 12000, 10000, 15000]
plt.bar(labels, values, color=['red', 'blue', 'green', 'orange'])
plt.xlabel('姓名')
plt.ylabel('工资')
plt.title('员工工资对比')
plt.show()
# 直方图
data = np.random.randn(1000) # 生成1000个正态分布数据
plt.hist(data, bins=30, alpha=0.7, color='skyblue', edgecolor='black')
plt.xlabel('数值')
plt.ylabel('频数')
plt.title('正态分布直方图')
plt.show()
# 散点图
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
plt.colorbar()
plt.title('散点图')
plt.show()
# 饼图
labels = ['苹果', '香蕉', '橙子', '葡萄']
sizes = [30, 25, 20, 25]
colors = ['red', 'yellow', 'orange', 'purple']
explode = (0.1, 0, 0, 0) # 突出显示第一个
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal') # 保证饼图是圆形
plt.title('水果销售占比')
plt.show()
# 子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 第一个子图
axes[0, 0].plot([1, 2, 3], [1, 4, 9])
axes[0, 0].set_title('折线图')
# 第二个子图
axes[0, 1].bar(['A', 'B', 'C'], [3, 7, 2])
axes[0, 1].set_title('柱状图')
# 第三个子图
axes[1, 0].hist(np.random.randn(100))
axes[1, 0].set_title('直方图')
# 第四个子图
axes[1, 1].pie([40, 30, 20, 10])
axes[1, 1].set_title('饼图')
plt.tight_layout() # 自动调整布局
plt.show()
# Seaborn高级可视化
Seaborn是基于Matplotlib的高级可视化库,提供更美观的统计图表。
import seaborn as sns
# 加载内置数据集
tips = sns.load_dataset('tips')
# 箱线图
sns.boxplot(x='day', y='total_bill', data=tips)
plt.title('每日消费箱线图')
plt.show()
# 热力图
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('相关性热力图')
plt.show()
# 散点图矩阵
sns.pairplot(tips, hue='sex')
plt.show()
# 条形图
sns.barplot(x='day', y='total_bill', data=tips)
plt.show()
# 实战案例:电商销售数据分析
让我们通过一个完整的案例来巩固所学知识。
# 模拟数据
data = {
'日期': pd.date_range('2026-01-01', periods=30),
'销售额': np.random.randint(5000, 20000, size=30),
'订单数': np.random.randint(50, 200, size=30),
'转化率': np.random.uniform(0.02, 0.08, size=30)
}
df = pd.DataFrame(data)
# 数据概览
print(df.head())
print(df.describe())
# 计算日均销售额
daily_avg = df['销售额'].mean()
print(f'日均销售额: {daily_avg:.2f}')
# 计算每周销售额
df['周'] = df['日期'].dt.isocalendar().week
weekly_sales = df.groupby('周')['销售额'].sum()
print(weekly_sales)
# 可视化
plt.figure(figsize=(12, 6))
# 销售额趋势
plt.subplot(1, 2, 1)
plt.plot(df['日期'], df['销售额'], color='blue')
plt.title('每日销售额趋势')
plt.xticks(rotation=45)
# 订单数分布
plt.subplot(1, 2, 2)
sns.histplot(df['订单数'], bins=10, kde=True)
plt.title('订单数分布')
plt.tight_layout()
plt.show()
# 总结
本文介绍了Python数据分析的三大核心库:
- NumPy:用于高效数值计算,提供多维数组和矩阵运算
- Pandas:用于数据处理和分析,提供DataFrame数据结构
- Matplotlib:用于数据可视化,支持多种图表类型
- Seaborn:基于Matplotlib的高级可视化库
掌握这些工具,你就具备了进行数据分析的基本能力。继续学习机器学习和深度学习,你可以构建更强大的数据分析应用!