您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页水资源质量数据集分析

水资源质量数据集分析

来源:华佗小知识

通过对水资源质量数据集的分析,

确定对水的可饮用性最为重要的水质因素,有助于制定更有效的水资源管理。

揭示不同水质因素之间的关联关系,有助于更全面地理解水质变化的模式。

问题1: 水资源质量中哪些因素对水的可饮用性(Potability)产生最大影响?

问题2: 如何预测水的可饮用性并识别潜在的风险因素?

water_potability.csv 文件包含 3276 个不同水体的水质指标。

                               

4.1问题一

水资源质量中哪些因素对水的可饮用性(Potability)产生最大影响?

4.1.1数据预处理

详见4.2.1

4.1.2数据可视化

统计各属性的频数直方图:

4.1.3相关性分析

使用相关性矩阵或热力图分析不同水质因素之间的相关性。

图 10 热力图分析

4.1.4特征选择

使用特征选择技术(如相关性分析、方差阈值等)确定与水可饮用性最相关的因素。

  1. 划分特征和目标变量  
  2. X = data.drop('Potability', axis=1)  特征  
  3. y = data['Potability']  目标变量  
  4.   
  5. 使用相关性分析选择与目标变量最相关的K个特征  
  6. k_best_features = 5  选择前K个特征  
  7. best_features = SelectKBest(score_func=chi2, k=k_best_features)#卡方检验  
  8. fit = best_features.fit(X, y)  
  9.   
  10. 获取特征的得分和p  
  11. # p值(p-value)是在统计假设检验中的一个重要指标,用于评估观察到的数据与假设之间的一致性。在特征选择中,p值通常用于衡量特征与目标变量之间的关联程度。  
  12. feature_scores = pd.DataFrame({'Feature': X.columns, 'Score': fit.scores_, 'P-value': fit.pvalues_})  
  13.   
  14. 打印特征的得分和p  
  15. print(feature_scores)  
  16.   
  17. 获取最相关的K个特征的列索引  
  18. selected_features_index = fit.get_support(indices=True)  
  19.   
  20. 提取最相关的K个特征的列  
  21. selected_features = X.iloc[:, selected_features_index]  
  22.   
  23. 打印最相关的K个特征  
  24. print(selected_features)  

使用了卡方检验(chi-squared test)来评估特征与目标变量之间的相关性,我们可以得出

硬度、固体、硫酸盐、电导率、有机碳与水体可饮用性最相关。

结果:

图 4 各个属性的相关性得分与P值

图 5 与可饮用性最相关的5个特征

4.2 问题二

如何预测水的可饮用性并识别潜在的风险因素?

4.2.1数据预处理

对数据集进行清理

  1. import pandas as pd  
  2. import seaborn as sns  
  3. import numpy as np  
  4. import matplotlib.pyplot as plt  
  5. from sklearn.metrics import classification_report, confusion_matrix, accuracy_score  
  6.   
  7. df = pd.read_csv('water_potability.csv')  
  8. print(df.shape) 
  9. df.info()  
  10. df.describe()  
  11.   
  12. df.isnull().sum()  

shape:

descirbe:

图 1 数据集信息

(1)处理缺失值

isnull

图 2 各个属性的缺失值统计

  1. df = df.fillna(df.mean())  
  2. print(df.isnull().sum())  

图 3 使用均值填补缺失值后结果

(2)处理异常值

  1. 处理异常值(这里假设异常值是3倍标准差之外的值)  
  2. for column in df.columns[:-1]:  排除Potability  
  3.     std_dev = df[column].std()  
  4.     mean_val = df[column].mean()  
  5.     df[column] = np.where((df[column] > mean_val + 3 * std_dev) | (df[column] < mean_val - 3 * std_dev), mean_val, df[column])  

4.2.2模型与评估

使用分类算法(如逻辑回归、决策树等)建立模型,预测水的可饮用性,并评估模型的性能。

  1. 逻辑回归模型

我们可以通过混淆矩阵得知,逻辑回归将所有样本分给0类(训练集中较多的值),导致准确率不高

  1. 划分特征和目标变量  
  2. X = df[['Hardness','Solids','Sulfate','Conductivity','Organic_carbon']] 特征  
  3. y = df['Potability']  目标变量  
  4.   
  5. 划分训练集和测试集  
  6. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  7.   
  8. 初始化逻辑回归模型  
  9. model = LogisticRegression()  
  10.   
  11. 训练模型  
  12. model.fit(X_train, y_train)  
  13.   
  14. 预测测试集  
  15. y_pred = model.predict(X_test)  
  16.   
  17. 评估模型性能  
  18. accuracy = accuracy_score(y_test, y_pred)  
  19. conf_matrix = confusion_matrix(y_test, y_pred)#混淆矩阵  
  20. classification_rep = classification_report(y_test, y_pred)  
  21.   
  22. 打印评估结果  
  23. print(f'Accuracy: {accuracy}')  
  24. print(f'Confusion Matrix:\n{conf_matrix}')  
  25. print(f'Classification Report:\n{classification_rep}')  

图 6 逻辑回归模型性能

图 7混淆矩阵示意图

  1. 决策树模型
  1. 初始化决策树模型  
  2. model = DecisionTreeClassifier(random_state=42)  
  3.   
  4. 训练模型  
  5. model.fit(X_train, y_train)  
  6.   
  7. 预测测试集  
  8. y_pred = model.predict(X_test)  

解决了逻辑回归的问题,但是准确率太低了

图 8 决策树模型性能

(3)Gradient Boosting模型(集成学习)

  1. model = GradientBoostingClassifier(random_state=42)  
  2.   
  3. 训练模型  
  4. model.fit(X_train, y_train)  
  5.   
  6. 预测测试集  
  7. y_pred = model.predict(X_test)  

图 9 Gradient Boosting性能

1. 硬度、固体、硫酸盐、电导率、有机碳与水体可饮用性最相关。

2. 不同算法对本数据集建模的性能不一,相关部门可以使用性能较好的模型来对水质做预判。

六、实验改进

1.根据老师的建议,将所有包含缺失值的元组都删去之后,重新进行了模型训练与预测

图 10 改进后的Gradient Boosting性能

发现精度并没有得到提升,我推测数据集中的属性与标签关系仍不够紧密。

3.发现使用相关性分析选择与目标变量最相关的K个特征(卡方检验)时,Solids属性的得分出现了异常值。得分越高说明相关性越低。

在统计学中,P值通常是一个介于 0 和 1 之间的概率值,表示观察到的数据或更极端情况出现的概率。但在实际应用中,由于计算的精度和,P值可能被截断为非常接近于零的小数,但不会真正等于零。

如果你得到的P值非常接近于零,通常可以理解为在原假设下观察到当前统计量或更极端情况的概率非常低。具体来说,当P值非常接近于零时,我们有足够的理由拒绝原假设,因为我们观察到的数据在原假设下的概率非常小,这被认为是统计上显著的。

P值小于显著性水平(通常设定为0.05): 如果计算得到的P值小于显著性水平,通常会拒绝原假设。这意味着观察到的数据在原假设下出现的概率较低,我们有足够的证据来怀疑原假设的真实性。

原假设为属性与标签相关,由此可得,solids属性与可饮用性极不相关。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务