新加一列——Label,滑坡点赋值为1,非滑坡点赋值为0,土地利用都是forest,没有参考价值,所以删去土地利用的列。
去除带有空值的行,最后
正样本(滑坡)数量: 153
负样本(非滑坡)数量: 148
面向AI编程,计算PCC,VIF,TOL,IG
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as stats # normaltest
from statsmodels.stats.outliers_influence import variance_inflation_factor # VIF
from sklearn.feature_selection import mutual_info_classif # 信息增益
file_path = r"D:/pyfileTorch/Graduation_test_code/test_158/Landslide_NoLandslide.xlsx"
df = pd.read_excel(file_path)
# 缺失值占比较低(如 <5%),可以考虑删除
df = df.dropna()
# df.info()
label_counts = df['Label'].value_counts()
print("正样本(滑坡)数量:", label_counts.get(1, 0))
print("负样本(非滑坡)数量:", label_counts.get(0, 0))
# 计算皮尔逊相关系数(PCC)
print("\n📌 皮尔逊相关系数计算:")
pcc_results = {}
for col in df.columns:
if col != "Label" and df[col].dtype in ['float64', 'int64']: # 仅处理数值型变量
corr,p_value = stats.pearsonr(df['Label'], df[col])
pcc_results[col] = {"pcc":corr,"P-value":p_value}
# 转换为DataFrame并按绝对相关性排序
pcc_df = pd.DataFrame.from_dict(pcc_results,orient='index')
pcc_df = pcc_df.sort_values(by="pcc",key=abs,ascending=False)
print(pcc_df)
# 设置中文字体(SimHei)防止乱码
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 可视化相关性热图
plt.figure(figsize=(10,6))
sns.heatmap(df.corr(numeric_only=True),annot=True,cmap="coolwarm",fmt=".2f")
plt.title("相关性热图")
plt.show()
# 计算VIF和容忍度(TOL)
print("\n📌 计算VIF和TOL:")
numeric_cols = [col for col in df.columns if col!="Label" and df[col].dtype in ['float64','int64']]
X = df[numeric_cols]
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif_data["Tolerance"] = 1 / vif_data["VIF"]
vif_data = vif_data.sort_values(by="VIF", ascending=False)
print(vif_data)
# 计算信息增益(IG)
print("\n📌 计算信息增益(IG):")
X = df[numeric_cols]
y = df["Label"]
ig_values = mutual_info_classif(X,y,discrete_features=False,random_state=42)
# 生成IG DataFrame
ig_df = pd.DataFrame({"Variable":numeric_cols,"Information Gain":ig_values})
ig_df = ig_df.sort_values(by="Information Gain",ascending=False)
print(ig_df)
# 可视化信息增益
plt.figure(figsize=(10,5))
sns.barplot(x="Information Gain",y="Variable",data=ig_df,hue="Variable", palette="viridis", legend=False)
plt.title("信息增益")
plt.show()
📌 皮尔逊相关系数计算:
pcc P-value
NDVI 0.446030 4.040643e-16
径流强度指数 0.339710 1.447624e-09
高程 0.319816 1.384757e-08
距水系 0.298895 1.254533e-07
距道路 0.298421 1.316152e-07
地形起伏度 0.258536 5.512872e-06
年降雨量 0.241787 2.230360e-05
剖面曲率 0.232283 4.721952e-05
坡度 0.208672 2.668991e-04
地形湿度指数 -0.176807 2.076835e-03
平面曲率 -0.173195 2.568635e-03
坡向 0.162032 4.830793e-03
POI核密度 -0.152097 8.212598e-03
距断层 0.047870 4.079382e-01
地形粗糙度 0.003136 9.567858e-01
📌 计算VIF和TOL:
Variable VIF Tolerance
6 地形粗糙度 285.939160 0.003497
14 年降雨量 266.027514 0.003759
13 NDVI 25.087014 0.039861
7 坡度 13.297419 0.075203
5 地形起伏度 11.491313 0.087022
4 地形湿度指数 11.272922 0.088708
0 高程 7.495429 0.133415
2 平面曲率 5.996318 0.166769
1 剖面曲率 4.497164 0.222362
8 坡向 4.169299 0.239848
10 距水系 3.702025 0.270122
11 距断层 3.113677 0.321164
9 距道路 2.403011 0.416145
3 径流强度指数 2.318824 0.431253
12 POI核密度 1.630471 0.613320
📌 计算信息增益(IG):
Variable Information Gain
14 年降雨量 0.182637
5 地形起伏度 0.171043
13 NDVI 0.144006
7 坡度 0.131028
6 地形粗糙度 0.125067
4 地形湿度指数 0.100118
12 POI核密度 0.070008
0 高程 0.064968
1 剖面曲率 0.056498
8 坡向 0.049344
9 距道路 0.045589
3 径流强度指数 0.034531
2 平面曲率 0.031532
10 距水系 0.021523
11 距断层 0.017077