机器学习之皮尔逊相关系数
·
机器学习之皮尔逊相关系数
(广告投放数据分析代码逐行超详细讲解)
这份代码是数据分析入门最经典的实战案例:用 Python 分析广告投放费用(电视 / 广播 / 报纸) 和销售额的相关性,找出最有效的广告渠道。我会逐段、逐行、连注释一起给你讲透,零基础也能看懂。
前置准备:安装依赖库
# pip install numpy pandas matplotlib
- 这行是安装命令,需要在电脑的终端 / 命令行里运行,不是在 Python 代码里执行
- 作用:下载数据分析必需的 3 个工具库
numpy:数学计算基础库pandas:处理表格数据(核心)matplotlib:画图基础库
# pip install numpy pandas matplotlib
# 1. 导入必备库
import pandas as pd # 处理表格数据的核心库(读取CSV、数据清洗、计算相关系数)
import seaborn as sns # 基于matplotlib的可视化库,画热力图超方便
import matplotlib.pyplot as plt # 基础可视化库,控制图表显示
# 2. 读取广告投放数据集(CSV格式)
# 数据集说明:advertising.csv通常包含「不同渠道广告投放费用」和「对应销售额」,
# 比如TV、Radio、Newspaper列是广告费用,Sales列是销售额
df = pd.read_csv("../data/advertising.csv")
# 打印数据形状(行数=样本数,列数=特征数)
print("第1次打印数据形状: "+str(df.shape))
# 3. 数据清洗:处理冗余列和缺失值(实战中第一步必做)
# 3.1 删除第一列(通常是无意义的索引列/序号列,对分析没用,有点类似我们的主键OID)
# axis=1表示删除列,inplace=True表示直接修改原DataFrame,不生成新数据
df.drop(df.columns[0], axis=1, inplace=True)
# 3.2 删除包含缺失值的行(缺失值会影响相关系数计算,简单清洗直接删)
df.dropna(inplace=True)
# 再次打印形状,对比清洗前后的样本数/列数变化
print("第2次打印数据形状: "+str(df.shape))
# 4. 提取特征(X)和目标变量(y)—— 机器学习标准操作
# X:特征矩阵(广告投放费用,比如TV、Radio、Newspaper),删除目标列Sales
X = df.drop("Sales", axis=1)
# y:目标变量(销售额),是我们要分析/预测的核心
y = df["Sales"]
# 打印特征矩阵和目标变量的形状,验证维度是否正确
print("预期:(样本数, 特征数),比如(200,3)(200个样本,3个广告渠道): ",X.shape) # 预期:(样本数, 特征数),比如(200,3)(200个样本,3个广告渠道)
print("预期:(样本数,),比如(200,)(每个样本对应一个销售额): ",y.shape) # 预期:(样本数,),比如(200,)(每个样本对应一个销售额)
print()
# 5. 计算「每个特征与目标变量(销售额)的皮尔逊相关系数」
# corrwith(y):专门计算DataFrame中每一列与指定Series(y)的相关系数,结果是一维Series
# 核心目的:精准计算 “每个广告渠道费用” 和 “销售额” 的相关系数;
corr = X.corrwith(y) # 上课时候给同学们查看下corrwith方法源码13297行
# 打印特征-销售额的相关系数,比如TV和Sales的r值可能≈0.8(强正相关),Newspaper可能≈0.3(几乎无关)
print("每个特征与目标变量(销售额)的皮尔逊相关系数: 投电视广告最有效,广播还行,报纸广告几乎没用。\n",corr)
print()
# 6. 计算「全量相关系数矩阵」(包含所有列,包括Sales)
# corr():默认计算皮尔逊相关系数,生成对称矩阵(行和列都是所有特征+目标变量)
# 核心目的:不仅看特征和销售额的相关性,还看特征之间的相关性(比如Radio和TV是否冗余)
corr_matrix = df.corr()
# 打印相关系数矩阵,直观查看所有变量间的线性关系
print("打印相关系数矩阵,直观查看所有变量间的线性关系\n")
print("每一个数字 = 两个变量之间的 “相关程度”,范围永远在 -1 ~ 1 之间\n")
print(corr_matrix)
# # 7. 可视化相关系数矩阵(热力图)
# # 7.1 画热力图:annot=True显示数值,fmt='.2f'保留2位小数,cmap='coolwarm'红蓝配色(红:正相关,蓝:负相关)
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm')
# 7.2 设置图表标题
plt.title("Feature Correlation Matrix")
# 7.3 显示图表
plt.show()
1. 导入必备库(工具包)
import pandas as pd # 处理表格数据的核心库(读取CSV、数据清洗、计算相关系数)
import seaborn as sns # 基于matplotlib的可视化库,画热力图超方便
import matplotlib.pyplot as plt # 基础可视化库,控制图表显示
核心作用:
把安装好的工具 “引入” 到代码里,给它们起简短别名(方便后续写代码):
pd:专门处理表格数据(像 Excel 一样)sns:专门画好看的统计图表(热力图、散点图)plt:控制图表的显示、标题、尺寸等
2. 读取广告数据集
df = pd.read_csv("../data/advertising.csv")
print("第1次打印数据形状: "+str(df.shape))
逐行讲解:
-
pd.read_csv(路径)-
读取CSV 格式的表格文件(广告数据)
-
数据格式:每一行是一个地区 / 时间段,列包含:
TV广告费用、Radio广告费用、Newspaper报纸费用、Sales销售额
-
-
df- 变量名,代表数据表格(专业名:DataFrame)
-
df.shape- 输出表格的 (行数,列数)
- 示例:
(200, 5)表示 200 条数据,5 列字段
3. 数据清洗(数据分析必做第一步)
# 3.1 删除第一列(无意义的索引列/序号列)
df.drop(df.columns[0], axis=1, inplace=True)
# 3.2 删除包含缺失值的行
df.dropna(inplace=True)
# 再次打印形状,对比清洗前后
print("第2次打印数据形状: "+str(df.shape))
为什么要做数据清洗?
原始数据可能有无用列、空值,会导致计算错误!
关键参数解释:
axis=1:代表删除列(axis=0 代表删除行)inplace=True:直接修改原表格,不用重新赋值dropna():删除包含空数据 / 缺失值的行
运行效果:
- 第 1 次打印:
(200,5)→ 有索引列 + 4 个有效列 - 第 2 次打印:
(200,4)→ 只剩 TV、Radio、Newspaper、Sales
4. 拆分特征和目标(机器学习标准格式)
# X:广告费用(用来预测的特征)
X = df.drop("Sales", axis=1)
# y:销售额(我们要分析/预测的目标)
y = df["Sales"]
print("特征矩阵形状: ",X.shape)
print("目标变量形状: ",y.shape)
核心逻辑:
- X(特征):所有广告渠道的花费(输入)
- y(目标):销售额(输出)
- 我们要研究:广告花费 → 销售额 的关系
正常输出示例:
特征矩阵形状: (200, 3) → 200条数据,3个广告渠道
目标变量形状: (200,) → 200个销售额结果
5. 计算【单个特征与销售额的相关系数】
corr = X.corrwith(y)
print("每个特征与销售额的皮尔逊相关系数:\n",corr)
这是整个代码最核心的计算!
-
corrwith(y)- 专门计算:每一列广告费用 和 销售额 y 的皮尔逊相关系数
-
皮尔逊相关系数(r 值)规则:
1:完全正相关(花的越多,卖的越多)0.7~1.0:强相关0.3~0.7:中等相关0~0.3:弱相关 / 几乎无关- 负数:负相关
典型输出结果(你运行后也类似):
TV 0.78
Radio 0.57
Newspaper 0.22
✅ 结论:
- TV 广告:强相关(最有效)
- 广播:中等相关
- 报纸:几乎没用
6. 计算【全量相关系数矩阵】
corr_matrix = df.corr()
print("相关系数矩阵:\n",corr_matrix)
作用:
计算所有变量之间的两两相关性:
- TV 和 Radio
- TV 和 Newspaper
- Radio 和 Sales
- … 所有组合
这是一个对称矩阵,对角线永远是1(自己和自己完全相关)。
7. 可视化:画热力图(最直观的图表)
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm')
plt.title("Feature Correlation Matrix")
plt.show()
参数解释:
-
annot=True:在格子里显示数字 -
fmt='.2f':保留 2 位小数 -
cmap='coolwarm':配色方案- 红色 → 正相关越强
- 蓝色 → 负相关越强
-
plt.title():设置图表标题 -
plt.show():弹出图表窗口
图表你会看到:
- TV 和 Sales 格子是深红色(强相关)
- Newspaper 和 Sales 格子是浅红色(弱相关)
- 所有对角线都是大红色 1.00
整段代码的【最终业务结论】
- 电视广告 对销售额影响最大(强正相关)
- 广播广告 有一定效果
- 报纸广告 几乎没有效果,建议砍掉预算
- 这就是用数据指导商业决策的标准流程!
总结
- 整套代码 = 读数据 → 洗数据 → 算相关性 → 可视化
- 核心函数:
corrwith()算单个特征相关性,corr()算全量矩阵 - 核心指标:皮尔逊相关系数,判断两个变量的线性关系
- 业务价值:直接告诉老板哪个广告渠道最值得投钱
更多推荐


所有评论(0)