Python中如何分析分类变量与标签的相关性及影响?
适配场景的统计方法与现有方案评估
现有方案适配性说明
- OrdinalEncoder:仅适用于有天然顺序的分类变量(如学历、年龄分段、年收入区间),无顺序分类变量(如地域、性别)不要使用,否则会引入不存在的顺序关系干扰后续统计结果,这类变量建议用独热编码或直接选择不需要编码的统计方法。
- 卡方检验:你目前使用的
stats.chi2.ppf()是卡方分布分位数计算函数,做特征和标签的独立性检验应该用stats.chi2_contingency(),先构造特征与Level的列联表再输入即可,这个方法完全适配你的场景,可以判断某个特征是否和Level显著相关。 - 相关矩阵:不要使用皮尔逊相关系数,你的标签是有序分类、特征多为分类变量,改用斯皮尔曼秩相关系数更合理,结果参考性更高。
推荐适配统计方法
1. 快速探索类方法
先做描述性统计可以快速定位核心特征,比直接使用复杂统计量更直观:
- 分组分布统计:用
pandas.DataFrame.groupby()直接查看不同Level的特征分布,示例代码:
# 查看不同Level的年收入分布占比 example.groupby("Level")["Annual Income"].value_counts(normalize=True).unstack()
- 列联表分析:用
pd.crosstab()构造特征与Level的交叉表,配合卡方检验输出显著性,p值小于0.05即可认为该特征与Level存在显著关联。
2. 关联度量化类函数
- 互信息(分类版):
sklearn.feature_selection.mutual_info_classif,可以衡量任意特征和标签的依赖程度,不管是线性还是非线性关系,也不需要提前对无序分类变量做编码,输出值越高说明该特征对Level的影响越大,是这类场景最常用的特征筛选指标之一。 - 斯皮尔曼秩相关系数:
scipy.stats.spearmanr,专门适配有序变量之间的相关性计算,你可以把有序分类特征(学历、收入、年龄)编码后和Level计算相关系数,正负号代表正/负相关,绝对值越大相关性越强。 - 克雷默V系数:专门用于衡量两个分类变量的关联强度,取值范围0到1,越高说明关联越强,适合无顺序分类变量(如地域、性别)和Level的关联度计算,代码实现如下:
import numpy as np import pandas as pd import scipy.stats as ss def cramers_v(x, y): confusion_matrix = pd.crosstab(x,y) chi2 = ss.chi2_contingency(confusion_matrix)[0] n = confusion_matrix.sum().sum() phi2 = chi2/n r,k = confusion_matrix.shape phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1)) rcorr = r - ((r-1)**2)/(n-1) kcorr = k - ((k-1)**2)/(n-1) return np.sqrt(phi2corr / min((kcorr-1), (rcorr-1)))
3. 影响程度量化类方法
如果需要明确每个特征对Level提升的具体影响,可以用以下模型方法:
- 有序逻辑回归:因为你的Level是有顺序的分类(3>2>1>0),用有序逻辑回归得到的系数可以直接量化每个特征变化带来的Level提升概率,比普通多分类逻辑回归更适配。
- 树模型特征重要性:用随机森林、LightGBM等树模型训练后输出的特征重要性,可以捕捉特征对Level的非线性影响,比如收入超过某个阈值后Level才会明显上升这类关系,不需要提前做复杂的特征编码。
内容的提问来源于stack exchange,提问作者RubberDuckProducer
相关产品推荐
相关产品推荐

