当前位置:首页 > 学习笔记 > 正文内容

Python 数据分析实战完全指南:从入门到精通

廖万里10小时前学习笔记0

数据分析是数据科学的核心技能,掌握 Pandas、NumPy 和 Matplotlib 能让你高效处理海量数据、挖掘数据价值、呈现数据洞察。本文将从零开始,系统讲解 Python 数据分析的完整流程。

一、核心概念

Python 数据分析生态系统由三大核心库组成:

1. NumPy - 科学计算基础库,提供高效的多维数组对象和数学函数

2. Pandas - 数据处理与分析核心库,提供 DataFrame 和 Series 数据结构

3. Matplotlib - 数据可视化库,创建各类统计图表

这三个库协同工作,构成了 Python 数据分析的完整工具链。NumPy 提供底层计算能力,Pandas 提供数据操作接口,Matplotlib 负责结果呈现。

二、环境搭建与基础

2.1 安装依赖

# 使用 pip 安装核心库
pip install numpy pandas matplotlib

# 安装 Jupyter Notebook(推荐的数据分析环境)
pip install jupyter

# 验证安装
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

print(f"NumPy版本: {np.__version__}")
print(f"Pandas版本: {pd.__version__}")

2.2 NumPy 数组基础

import numpy as np

# 创建数组
arr1 = np.array([1, 2, 3, 4, 5])  # 一维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])  # 二维数组

# 数组属性
print(f"形状: {arr2.shape}")  # (2, 3)
print(f"维度: {arr2.ndim}")   # 2
print(f"数据类型: {arr2.dtype}")  # int64

# 数组运算(向量化操作,效率远超 Python 列表)
arr = np.array([1, 2, 3, 4, 5])
print(arr * 2)  # [2, 4, 6, 8, 10]
print(arr ** 2)  # [1, 4, 9, 16, 25]
print(np.sqrt(arr))  # [1., 1.41, 1.73, 2., 2.24]

# 常用函数
print(f"求和: {np.sum(arr)}")  # 15
print(f"均值: {np.mean(arr)}")  # 3.0
print(f"标准差: {np.std(arr)}")  # 1.41

2.3 Pandas Series 和 DataFrame

import pandas as pd

# Series:一维带标签数组
s = pd.Series([10, 20, 30, 40], index=["a", "b", "c", "d"])
print(s)
# a    10
# b    20
# c    30
# d    40

# DataFrame:二维表格结构
data = {
    "姓名": ["张三", "李四", "王五"],
    "年龄": [25, 30, 28],
    "城市": ["北京", "上海", "广州"]
}
df = pd.DataFrame(data)
print(df)
#    姓名  年龄  城市
# 0  张三  25  北京
# 1  李四  30  上海
# 2  王五  28  广州

# 基本属性
print(f"形状: {df.shape}")  # (3, 3)
print(f"列名: {df.columns.tolist()}")  # ["姓名", "年龄", "城市"]
print(f"数据类型:
{df.dtypes}")

三、数据读取与导出

3.1 读取各种格式文件

import pandas as pd

# 读取 CSV 文件
df_csv = pd.read_csv("data.csv", encoding="utf-8")

# 读取 Excel 文件
df_excel = pd.read_excel("data.xlsx", sheet_name="Sheet1")

# 读取 JSON 文件
df_json = pd.read_json("data.json")

# 读取 SQL 数据库
import sqlite3
conn = sqlite3.connect("database.db")
df_sql = pd.read_sql("SELECT * FROM users", conn)

# 读取网页表格
df_web = pd.read_html("https://example.com/table.html")[0]

3.2 数据导出

# 导出为 CSV
df.to_csv("output.csv", index=False, encoding="utf-8-sig")

# 导出为 Excel
df.to_excel("output.xlsx", sheet_name="数据", index=False)

# 导出为 JSON
df.to_json("output.json", orient="records", force_ascii=False, indent=2)

# 导出为 HTML
df.to_html("output.html", index=False)

四、数据清洗与处理

4.1 数据探索

import pandas as pd

# 加载示例数据
df = pd.read_csv("sales_data.csv")

# 查看数据基本信息
print(df.head())  # 前5行
print(df.tail())  # 后5行
print(df.info())  # 数据类型和内存信息
print(df.describe())  # 统计摘要

# 查看缺失值
print(df.isnull().sum())

# 查看唯一值
print(df["类别"].unique())
print(df["类别"].value_counts())

4.2 处理缺失值

# 检测缺失值
print(df.isnull().sum())

# 删除缺失值
df_dropna = df.dropna()  # 删除包含缺失值的行
df_dropna_cols = df.dropna(axis=1)  # 删除包含缺失值的列

# 填充缺失值
df_fillna = df.fillna(0)  # 用0填充
df_fillna_mean = df.fillna(df.mean())  # 用均值填充
df_fillna_ffill = df.fillna(method="ffill")  # 前向填充

# 插值填充
df_interp = df.interpolate()  # 线性插值

4.3 数据筛选与过滤

# 单条件筛选
df_filtered = df[df["销售额"] > 10000]

# 多条件筛选
df_multi = df[(df["销售额"] > 10000) & (df["地区"] == "华东")]

# 使用 query 方法
df_query = df.query("销售额 > 10000 and 地区 == \"华东\"")

# 使用 isin 筛选
df_isin = df[df["类别"].isin(["电子", "服装"])]

# 字符串匹配
df_str = df[df["产品名称"].str.contains("手机")]

4.4 数据分组与聚合

# 按 单列分组
grouped = df.groupby("地区")

# 聚合计算
print(grouped["销售额"].sum())  # 各地区销售总额
print(grouped["销售额"].mean())  # 各地区销售均值
print(grouped["销售额"].agg(["sum", "mean", "count"]))  # 多种聚合

# 多列分组
multi_grouped = df.groupby(["地区", "类别"])["销售额"].sum()

# 自定义聚合函数
def range_func(x):
    return x.max() - x.min()

df.groupby("地区")["销售额"].agg(["mean", "std", range_func])

4.5 数据合并

# 创建示例数据
df1 = pd.DataFrame({"id": [1, 2, 3], "name": ["A", "B", "C"]})
df2 = pd.DataFrame({"id": [1, 2, 4], "score": [90, 85, 95]})

# 内连接(交集)
inner = pd.merge(df1, df2, on="id", how="inner")

# 左连接
left = pd.merge(df1, df2, on="id", how="left")

# 外连接(并集)
outer = pd.merge(df1, df2, on="id", how="outer")

# 纵向拼接
df_concat = pd.concat([df1, df2], axis=0)  # 按行拼接
df_concat_cols = pd.concat([df1, df2], axis=1)  # 按列拼接

五、数据可视化

5.1 基础图表

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 折线图
plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [10, 20, 15, 25], marker="o", linestyle="-", color="blue")
plt.title("月度销售趋势")
plt.xlabel("月份")
plt.ylabel("销售额")
plt.grid(True)
plt.show()

# 柱状图
categories = ["A", "B", "C", "D"]
values = [23, 45, 56, 78]
plt.bar(categories, values, color="steelblue")
plt.title("各类别销售额")
plt.show()

# 饼图
plt.pie(values, labels=categories, autopct="%1.1f%%", startangle=90)
plt.title("销售占比")
plt.show()

# 散点图
plt.scatter(df["广告投入"], df["销售额"], alpha=0.6)
plt.xlabel("广告投入")
plt.ylabel("销售额")
plt.title("广告投入与销售额关系")
plt.show()

5.2 Pandas 内置绘图

import pandas as pd

# 创建示例数据
df = pd.DataFrame({
    "月份": ["1月", "2月", "3月", "4月", "5月"],
    "销售额": [100, 150, 120, 180, 200],
    "利润": [20, 35, 25, 40, 50]
})
df.set_index("月份", inplace=True)

# 折线图
df.plot(kind="line", marker="o", figsize=(10, 6))
plt.title("月度销售趋势")
plt.show()

# 柱状图
df.plot(kind="bar", figsize=(10, 6))
plt.title("月度销售对比")
plt.show()

# 面积图
df.plot(kind="area", alpha=0.5, figsize=(10, 6))
plt.title("销售趋势面积图")
plt.show()

# 箱线图
df.plot(kind="box", figsize=(8, 6))
plt.title("数据分布箱线图")
plt.show()

5.3 高级可视化技巧

import matplotlib.pyplot as plt

# 子图布局
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 第一个子图:折线图
axes[0, 0].plot([1, 2, 3, 4], [10, 20, 15, 25])
axes[0, 0].set_title("趋势图")

# 第二个子图:柱状图
axes[0, 1].bar(["A", "B", "C"], [30, 45, 25])
axes[0, 1].set_title("对比图")

# 第三个子图:饼图
axes[1, 0].pie([30, 45, 25], labels=["A", "B", "C"], autopct="%1.1f%%")
axes[1, 0].set_title("占比图")

# 第四个子图:直方图
axes[1, 1].hist([1, 2, 2, 3, 3, 3, 4, 4, 5], bins=5)
axes[1, 1].set_title("分布图")

plt.tight_layout()
plt.show()

# 热力图(相关系数矩阵)
import seaborn as sns
corr = df.corr()
sns.heatmap(corr, annot=True, cmap="coolwarm", center=0)
plt.title("特征相关性热力图")
plt.show()

六、实战案例:电商销售数据分析

6.1 数据准备

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

# 模拟电商销售数据
np.random.seed(42)

# 生成12个月的销售数据
months = pd.date_range("2025-01-01", periods=12, freq="M")
products = ["手机", "电脑", "平板", "耳机", "手表"]
regions = ["华东", "华南", "华北", "西南", "华中"]

data = []
for month in months:
    for _ in range(100):  # 每月100条订单
        data.append({
            "日期": month,
            "产品": np.random.choice(products),
            "地区": np.random.choice(regions),
            "销售额": np.random.randint(100, 10000),
            "数量": np.random.randint(1, 10),
            "用户等级": np.random.choice(["普通", "VIP", "SVIP"], p=[0.6, 0.3, 0.1])
        })

df = pd.DataFrame(data)
print(f"数据形状: {df.shape}")
print(df.head())

6.2 数据探索

# 基本统计
print("=== 数据概览 ===")
print(df.describe())

# 各产品销售额统计
print("
=== 产品销售额统计 ===")
product_stats = df.groupby("产品")["销售额"].agg(["sum", "mean", "count"])
product_stats.columns = ["总销售额", "平均销售额", "订单数"]
print(product_stats.sort_values("总销售额", ascending=False))

# 各地区销售情况
print("
=== 地区销售情况 ===")
region_stats = df.groupby("地区").agg({
    "销售额": "sum",
    "数量": "sum",
    "用户等级": "count"
})
region_stats.columns = ["总销售额", "总销量", "订单数"]
print(region_stats)

6.3 数据可视化分析

# 设置中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 图1:月度销售趋势
monthly_sales = df.groupby(df["日期"].dt.strftime("%Y-%m"))["销售额"].sum()

plt.figure(figsize=(12, 5))
monthly_sales.plot(kind="line", marker="o", color="steelblue", linewidth=2)
plt.title("2025年月度销售趋势", fontsize=14)
plt.xlabel("月份")
plt.ylabel("销售额(元)")
plt.grid(True, alpha=0.3)
plt.fill_between(range(len(monthly_sales)), monthly_sales.values, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("monthly_sales.png", dpi=150)
plt.show()

# 图2:产品销售额对比
plt.figure(figsize=(10, 6))
product_stats["总销售额"].sort_values().plot(kind="barh", color="steelblue")
plt.title("各产品销售额对比", fontsize=14)
plt.xlabel("销售额(元)")
for i, v in enumerate(product_stats["总销售额"].sort_values()):
    plt.text(v + 1000, i, f"¥{v:,.0f}", va="center")
plt.tight_layout()
plt.show()

# 图3:地区销售分布饼图
plt.figure(figsize=(8, 8))
region_sales = df.groupby("地区")["销售额"].sum()
plt.pie(region_sales, labels=region_sales.index, autopct="%1.1f%%", 
        startangle=90, colors=plt.cm.Set3.colors)
plt.title("各地区销售占比", fontsize=14)
plt.show()

# 图4:用户等级分析
plt.figure(figsize=(10, 6))
user_stats = df.groupby("用户等级").agg({
    "销售额": ["sum", "mean"],
    "数量": "sum"
})
user_stats.columns = ["总销售额", "平均订单额", "总购买量"]
print(user_stats)

x = range(len(user_stats))
width = 0.25
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar([i - width for i in x], user_stats["总销售额"]/10000, width, label="总销售额(万)", color="steelblue")
ax.bar(x, user_stats["平均订单额"], width, label="平均订单额", color="coral")
ax.bar([i + width for i in x], user_stats["总购买量"]/10, width, label="总购买量(十件)", color="seagreen")
ax.set_xticks(x)
ax.set_xticklabels(user_stats.index)
ax.legend()
ax.set_title("不同用户等级消费分析", fontsize=14)
plt.tight_layout()
plt.show()

6.4 高级分析

# 计算各产品月度销售趋势
pivot_table = df.pivot_table(
    values="销售额", 
    index=df["日期"].dt.strftime("%Y-%m"),
    columns="产品",
    aggfunc="sum"
)

print("=== 产品月度销售透视表 ===")
print(pivot_table)

# 可视化透视表
plt.figure(figsize=(14, 7))
pivot_table.plot(kind="bar", figsize=(14, 7), width=0.8)
plt.title("各产品月度销售额对比", fontsize=14)
plt.xlabel("月份")
plt.ylabel("销售额(元)")
plt.legend(title="产品", bbox_to_anchor=(1.02, 1), loc="upper left")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 计算销售增长率
monthly_total = df.groupby(df["日期"].dt.strftime("%Y-%m"))["销售额"].sum()
growth_rate = monthly_total.pct_change() * 100

print("
=== 月度环比增长率 ===")
print(growth_rate)

# 可视化增长率
plt.figure(figsize=(12, 5))
colors = ["green" if x > 0 else "red" for x in growth_rate.dropna()]
plt.bar(growth_rate.dropna().index, growth_rate.dropna(), color=colors, alpha=0.7)
plt.axhline(y=0, color="black", linestyle="-", linewidth=0.5)
plt.title("月度销售环比增长率", fontsize=14)
plt.xlabel("月份")
plt.ylabel("增长率(%)")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

七、进阶技巧与最佳实践

7.1 性能优化

import pandas as pd
import time

# 大数据量处理优化技巧

# 1. 使用适当的数据类型减少内存
df = pd.read_csv("large_data.csv")
print(f"优化前内存: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")

# 转换数据类型
df["category_col"] = df["category_col"].astype("category")  # 分类列
df["int_col"] = df["int_col"].astype("int32")  # 降级整数
df["float_col"] = df["float_col"].astype("float32")  # 降级浮点

print(f"优化后内存: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")

# 2. 分块读取大文件
chunks = []
for chunk in pd.read_csv("huge_file.csv", chunksize=10000):
    # 处理每个块
    processed = chunk[chunk["value"] > 100]
    chunks.append(processed)
df_final = pd.concat(chunks, ignore_index=True)

# 3. 使用 eval 和 query 加速计算
df.eval("total = price * quantity", inplace=True)
result = df.query("price > 100 and quantity > 5")

7.2 时间序列处理

import pandas as pd

# 创建时间序列数据
dates = pd.date_range("2025-01-01", periods=100, freq="D")
ts = pd.Series(np.random.randn(100), index=dates)

# 时间索引操作
print(ts["2025-01"])  # 选择1月数据
print(ts["2025-01-15":"2025-02-15"])  # 日期范围

# 重采样
monthly = ts.resample("M").mean()  # 月度均值
weekly = ts.resample("W").sum()  # 周度汇总

# 滚动窗口
rolling_mean = ts.rolling(window=7).mean()  # 7日移动平均
rolling_std = ts.rolling(window=7).std()  # 7日移动标准差

# 时间偏移
shifted = ts.shift(1)  # 向后移动1天
diff = ts.diff()  # 一阶差分
pct_change = ts.pct_change()  # 百分比变化

7.3 数据分析工作流最佳实践

# 标准数据分析流程示例

def analyze_data(file_path):
    """完整的数据分析流程"""
    
    # 1. 数据加载
    df = pd.read_csv(file_path)
    print(f"加载完成: {df.shape[0]} 行, {df.shape[1]} 列")
    
    # 2. 数据探索
    print("
=== 数据概览 ===")
    print(df.info())
    print(df.describe())
    
    # 3. 数据清洗
    # 处理缺失值
    df = df.dropna(subset=["关键列"])  # 删除关键列缺失
    df = df.fillna({"数值列": df["数值列"].median()})  # 中位数填充
    
    # 处理异常值
    Q1 = df["数值列"].quantile(0.25)
    Q3 = df["数值列"].quantile(0.75)
    IQR = Q3 - Q1
    df = df[(df["数值列"] >= Q1 - 1.5*IQR) & (df["数值列"] <= Q3 + 1.5*IQR)]
    
    # 4. 特征工程
    df["新特征"] = df["列1"] / df["列2"]
    df["分类编码"] = df["分类列"].astype("category").cat.codes
    
    # 5. 分析计算
    result = df.groupby("分组列").agg({
        "数值列": ["mean", "std", "count"]
    })
    
    # 6. 结果导出
    result.to_excel("分析结果.xlsx")
    
    return result

# 调用分析函数
result = analyze_data("sales_data.csv")

总结

Python 数据分析是一套完整的技术体系,本文从环境搭建开始,系统讲解了 NumPy 数组操作、Pandas 数据处理、Matplotlib 可视化三大核心技能,并通过电商销售数据分析实战案例,展示了完整的数据分析工作流程。

核心要点回顾:

1. NumPy 提供高效的数组计算能力,是数据分析的基础

2. Pandas 的 DataFrame 是数据操作的核心,熟练掌握数据读取、清洗、筛选、分组、合并等操作

3. Matplotlib 支持丰富的可视化类型,掌握折线图、柱状图、饼图、散点图等常用图表

4. 实战思维:数据分析要围绕业务目标,从数据中发现洞察、指导决策

5. 性能优化:处理大数据时注意内存管理和分块处理

掌握这些技能后,你可以高效处理各种数据分析任务,为业务决策提供数据支撑。建议通过实际项目持续练习,不断提升数据分析能力。

本文链接:https://www.kkkliao.cn/?id=933 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。