机器学习之皮尔逊相关系数

(广告投放数据分析代码逐行超详细讲解)

这份代码是数据分析入门最经典的实战案例:用 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))

逐行讲解:

  1. pd.read_csv(路径)

    • 读取CSV 格式的表格文件(广告数据)

    • 数据格式:每一行是一个地区 / 时间段,列包含:

      TV广告费用、Radio广告费用、Newspaper报纸费用、Sales销售额
      
  2. df

    • 变量名,代表数据表格(专业名:DataFrame)
  3. 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)

这是整个代码最核心的计算

  1. corrwith(y)

    • 专门计算:每一列广告费用销售额 y皮尔逊相关系数
  2. 皮尔逊相关系数(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

整段代码的【最终业务结论】

  1. 电视广告 对销售额影响最大(强正相关)
  2. 广播广告 有一定效果
  3. 报纸广告 几乎没有效果,建议砍掉预算
  4. 这就是用数据指导商业决策的标准流程!

总结

  1. 整套代码 = 读数据 → 洗数据 → 算相关性 → 可视化
  2. 核心函数:corrwith() 算单个特征相关性,corr() 算全量矩阵
  3. 核心指标:皮尔逊相关系数,判断两个变量的线性关系
  4. 业务价值:直接告诉老板哪个广告渠道最值得投钱
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐