数据特征分析之 python相关性检验(转载学习)

本文深入讲解了数据特征分析中的相关性检验方法,包括通过图表直观判断、皮尔逊相关系数、斯皮尔曼秩相关系数及余弦相似度等,适用于不同类型的变量分析。

数据特征分析技能—— 相关性检验
相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度 
一般常用四种方法: 
- 画图判断 
- pearson(皮尔逊)相关系数 
- sperman(斯皮尔曼)相关系数 
- Cosine similarity (余弦相关系数)

 

 

绘制图形判断

一般对于强相关性的两个变量,画图就能定性判断是否相关

(1)散点图向量分析干系 

#random产生高斯分布
#uniform产生均匀分布

data1 = pd.Series(np.random.rand(50)*100).sort_values()
data2 = pd.Series(np.random.rand(50)*50).sort_values()
data3 = pd.Series(np.random.rand(50)*500).sort_values(ascending = False)
# 创建三个数据:data1为0-100的随机数并从小到大排列,data2为0-50的随机数并从小到大排列,data3为0-500的随机数并从大到小排列,

fig = plt.figure(figsize = (10,4))
ax1 = fig.add_subplot(1,2,1)
ax1.scatter(data1, data2)
plt.grid()
# 正线性相关

ax2 = fig.add_subplot(1,2,2)
ax2.scatter(data1, data3)
plt.grid()
# 负线性相关

(2)散点图矩阵初判多变量间关系

data = pd.DataFrame(np.random.randn(200,4)*100, columns = ['A','B','C','D'])
pd.plotting.scatter_matrix(data,figsize=(8,8),
                         c = 'k',
                         marker = '+',
                         diagonal='hist',
                         alpha = 0.8,
                         range_padding=0.1)
data.head()

è¿éåå¾çæè¿°

pearson(皮尔逊)相关系数

要求样本满足正态分布 
- 两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商,其值介于-1与1之间

 

data1 = pd.Series(np.random.rand(100)*100).sort_values()
data2 = pd.Series(np.random.rand(100)*50).sort_values()
data = pd.DataFrame({'value1':data1.values,
                     'value2':data2.values})
print(data.head())
print('------')
# 创建样本数据

u1,u2 = data['value1'].mean(),data['value2'].mean()  # 计算均值
std1,std2 = data['value1'].std(),data['value2'].std()  # 计算标准差
print('value1正态性检验:\n',stats.kstest(data['value1'], 'norm', (u1, std1)))
print('value2正态性检验:\n',stats.kstest(data['value2'], 'norm', (u2, std2)))
print('------')
# 正态性检验 → pvalue >0.05


data['(x-u1)*(y-u2)'] = (data['value1'] - u1) * (data['value2'] - u2)
data['(x-u1)**2'] = (data['value1'] - u1)**2
data['(y-u2)**2'] = (data['value2'] - u2)**2
print(data.head())
print('------')
# 制作Pearson相关系数求值表

r = data['(x-u1)*(y-u2)'].sum() / (np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum()))
print('Pearson相关系数为:%.4f' % r)
# 求出r
# |r| > 0.8 → 高度线性相关

结果为

     value1    value2
0  0.438432  0.486913
1  2.974424  0.663775
2  4.497743  1.417196
3  5.490366  2.047252
4  6.216346  3.455314

------
value1正态性检验:
 KstestResult(statistic=0.07534983222255448, pvalue=0.6116837468934935)
value2正态性检验:
 KstestResult(statistic=0.11048646902786918, pvalue=0.1614817955196972)
------

     value1    value2  (x-u1)*(y-u2)    (x-u1)**2   (y-u2)**2
0  0.438432  0.486913    1201.352006  2597.621877  555.603052
1  2.974424  0.663775    1133.009967  2345.549928  547.296636
2  4.497743  1.417196    1062.031735  2200.319086  512.612654
3  5.490366  2.047252    1010.628854  2108.181383  484.479509
4  6.216346  3.455314     931.020494  2042.041746  424.476709
------
Pearson相关系数为:0.9937

 pd中包含内置的求解pearson系数方法函数

# Pearson相关系数 - 算法

data1 = pd.Series(np.random.rand(100)*100).sort_values()
data2 = pd.Series(np.random.rand(100)*50).sort_values()
data = pd.DataFrame({'value1':data1.values,
                     'value2':data2.values})
print(data.head())
print('------')
# 创建样本数据

data.corr()
# pandas相关性方法:data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
# method默认pearson

Sperman秩相关系数

皮尔森相关系数主要用于服从正太分布的连续变量,对于不服从正太分布的变量,分类关联性可采用Sperman秩相关系数,也称 等级相关系数

data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
                    '每周看电视小时数':[7,0,27,50,28,29,20,12,6,17]})
print(data)
print('------')
# 创建样本数据

data.sort_values('智商', inplace=True)
data['range1'] = np.arange(1,len(data)+1)
data.sort_values('每周看电视小时数', inplace=True)
data['range2'] = np.arange(1,len(data)+1)
print(data)
print('------')
# “智商”、“每周看电视小时数”重新按照从小到大排序,并设定秩次index

data['d'] = data['range1'] - data['range2']
data['d2'] = data['d']**2
print(data)
print('------')
# 求出di,di2

n = len(data)
rs = 1 - 6 * (data['d2'].sum()) / (n * (n**2 - 1))
print('Sperman秩相关系数为:%.4f' % rs)
# 求出rs

输出结果为: 

    智商  每周看电视小时数
0  106         7
1   86         0
2  100        27
3  101        50
4   99        28
5  103        29
6   97        20
7  113        12
8  112         6
9  110        17
------
    智商  每周看电视小时数  range1  range2
1   86         0       1       1
8  112         6       9       2
0  106         7       7       3
7  113        12      10       4
9  110        17       8       5
6   97        20       2       6
2  100        27       4       7
4   99        28       3       8
5  103        29       6       9
3  101        50       5      10
------
    智商  每周看电视小时数  range1  range2  d  d2
1   86         0       1       1  0   0
8  112         6       9       2  7  49
0  106         7       7       3  4  16
7  113        12      10       4  6  36
9  110        17       8       5  3   9
6   97        20       2       6 -4  16
2  100        27       4       7 -3   9
4   99        28       3       8 -5  25
5  103        29       6       9 -3   9
3  101        50       5      10 -5  25
------
Sperman秩相关系数为:-0.1758

pd中包含内置的求解spearman系数方法函数

# spearman相关系数 - 算法

data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
                    '每周看电视小时数':[7,0,27,50,28,29,20,12,6,17]})
print(data)
print('------')
# 创建样本数据

data.corr(method='spearman')
# pandas相关性方法:data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
# method默认pearson

此处转载自:https://blog.youkuaiyun.com/ICERON/article/details/80219603 

余弦待更.....一般余弦计算相似度比较多哈。

 

 

 

```markdown # 肥胖等级预测项目完整实现(含评分标准对应步骤) 本项目来源于和鲸社区,使用转载需要标注来源 作者: 虎鲸mkpf 来源: https://www.heywhale.com/mw/project/68d5ed35e81133f930509f5c --- ## ✅ 第一部分:数据预处理(30分) ### 🔹 步骤1:导入库并加载数据 ```python import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder # 加载数据,变量命名为 wujing wujing = pd.read_csv('wujing.csv') print("✅ 数据已加载,共", len(wujing), "条记录") ``` ### 🔹 步骤2:清理列名与缺失值检查 ```python # 清理列名:去除空格和特殊字符 wujing.columns = wujing.columns.str.strip().str.replace(r'[^\w]', '_', regex=True) # 检查缺失值 print("❌ 缺失值统计:") print(wujing.isnull().sum()) ``` ### 🔹 步骤3:异常值检测(通过BMI) ```python # 计算 BMI wujing['BMI'] = wujing['Weight'] / (wujing['Height'] ** 2) # 过滤不合理BMI(<12 或 >60) wujing = wujing[(wujing['BMI'] >= 12) & (wujing['BMI'] <= 60)] print(f"✅ 异常值清洗完成,剩余 {len(wujing)} 条数据。") ``` ### 🔹 步骤4:目标变量标准化为 `0be1dad` ```python # 统一转为字符串并去首尾空格 wujing['Obesity'] = wujing['Obesity'].astype(str).str.strip() # 修复常见拼写错误 mapping_obesity = { 'Ormal_Weight': 'Normal_Weight', 'Insufficient Weight': 'Insufficient_Weight', 'Obesity_Type_ll': 'Obesity_Type_II', 'Obesity_Type_lll': 'Obesity_Type_III', 'Overweight_Level_Il': 'Overweight_Level_II', 'overweight_level_i': 'Overweight_Level_I', 'normal weight': 'Normal_Weight', 'insufficient weight': 'Insufficient_Weight' } wujing['Obesity'] = wujing['Obesity'].replace(mapping_obesity) # 统一空格为下划线 wujing['Obesity'] = wujing['Obesity'].str.replace(r'\s+', '_', regex=True) # 定义合法类别 valid_classes = [ 'Normal_Weight', 'Insufficient_Weight', 'Overweight_Level_I', 'Overweight_Level_II', 'Obesity_Type_I', 'Obesity_Type_II', 'Obesity_Type_III' ] # 过滤非法标签 mask = wujing['Obesity'].isin(valid_classes) wujing = wujing[mask].reset_index(drop=True) print(f"✅ 目标变量清洗完成,保留 {len(wujing)} 条有效数据。") ``` ### 🔹 步骤5:分类变量编码 ```python # 二元变量映射 binary_map = {'Yes': 1, 'No': 0, 'yes': 1, 'no': 0, 'Male': 1, 'Female': 0} for col in ['Gender', 'family_history_with_overweight', 'FAVC', 'SMOKE', 'SCC']: if col in wujing.columns: wujing[col] = wujing[col].map(binary_map).fillna(0).astype(int) # 有序变量编码(CAEC、CALC) le = LabelEncoder() for col in ['CAEC', 'CALC']: wujing[col] = le.fit_transform(wujing[col].astype(str)) # 名义变量 One-Hot 编码(MTRANS) wujing = pd.get_dummies(wujing, columns=['MTRANS'], prefix='MTRANS', drop_first=True) ``` --- ## ✅ 第二部分:特征选择(20分) ### 🔹 分析方法:基于相关性与模型系数初步判断重要特征 ```python # 构建特征矩阵 X 和标签 y feature_cols = [col for col in wujing.columns if col not in ['id', 'Obesity', 'BMI', '0be1dad']] X = wujing[feature_cols] y = wujing['Obesity'] # 使用标签编码生成数值标签(即您要求的 0be1dad) label_map = { 'Insufficient_Weight': 0, 'Normal_Weight': 1, 'Overweight_Level_I': 2, 'Overweight_Level_II': 3, 'Obesity_Type_I': 4, 'Obesity_Type_II': 5, 'Obesity_Type_III': 6 } wujing['0be1dad'] = wujing['Obesity'].map(label_map).astype(int) y_encoded = wujing['0be1dad'] # 查看前几项以验证 print("🎯 特征选择前的数据结构:") print(X.iloc[:3, :5]) # 展示部分特征 print("🔢 标签映射示例:") print(wujing[['Obesity', '0be1dad']].drop_duplicates()) ``` ### 🔹 特征重要性初筛(皮尔逊相关系数) ```python # 计算每个特征与目标标签的相关性 correlations = X.corrwith(pd.Series(y_encoded)).abs().sort_values(ascending=False) print("\n🔝 特征与肥胖等级的相关性排序:") print(correlations.head(10)) ``` --- ## ✅ 第三部分:模型训练(30分) ### 🔹 划分训练集与测试集 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y_encoded, test_size=0.2, random_state=42, stratify=y_encoded ) ``` ### 🔹 使用逻辑回归进行多分类建模 ```python from sklearn.linear_model import LogisticRegression model = LogisticRegression( multi_class='multinomial', solver='lbfgs', max_iter=1000, random_state=42 ) model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` --- ## ✅ 第四部分:模型评估(10分) ### 🔹 准确率与分类报告 ```python from sklearn.metrics import accuracy_score, classification_report acc = accuracy_score(y_test, y_pred) print(f"【准确率】: {acc:.4f}") print("\n📋 分类报告:") print(classification_report(y_test, y_pred)) ``` --- ## ✅ 第五部分:结果分析(10分) ### 🔹 总结关键影响因素与建议 ```python # 获取逻辑回归系数作为特征重要性参考 coef_df = pd.DataFrame({ 'Feature': X.columns, 'Importance': np.mean(np.abs(model.coef_), axis=0) }).sort_values(by='Importance', ascending=False) print(""" 💡 【结果分析与健康建议】 经过建模分析,以下因素对肥胖等级影响最大: """) print(coef_df.head(6).to_string(index=False)) print(""" 📌 健康干预建议: 1. 🍔 控制高热量饮食(FAVC)频率; 2. 🏃 提高体力活动水平(FAF); 3. 🧬 对有家族史人群开展早期筛查; 4. 📱 减少电子设备使用时间(TUE); 5. 💧 鼓励每日摄入充足水分(CH2O)。 政策层面可推广校园营养计划、企业健康管理机制等。 """) ``` --- ### **知识点(列出该代码中遇到的知识点)** - **数据清洗与异常检测**:通过计算BMI识别并剔除不合理样本,保障数据质量。 - **分类变量编码技术**:对有序与无序变量分别采用标签编码和独热编码,适配模型输入需求。 - **多分类逻辑回归建模**:使用`multi_class='multinomial'`解决肥胖等级多类别预测问题,避免误用线性回归。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值