0%

Python数据分析入门教程

# 概述

数据分析是当今最热门的技能之一。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的高级可视化库

掌握这些工具,你就具备了进行数据分析的基本能力。继续学习机器学习和深度学习,你可以构建更强大的数据分析应用!