Python 数据分析实战完全指南:从入门到精通
数据分析是数据科学的核心技能,掌握 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 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。



手机流量卡
免费领卡
号卡合伙人
产品服务
关于本站
