通过对水资源质量数据集的分析,
确定对水的可饮用性最为重要的水质因素,有助于制定更有效的水资源管理政策。
揭示不同水质因素之间的关联关系,有助于更全面地理解水质变化的模式。
二、实验内容
问题1: 水资源质量中哪些因素对水的可饮用性(Potability)产生最大影响?
问题2: 如何预测水的可饮用性并识别潜在的风险因素?
三、数据集说明
water_potability.csv 文件包含 3276 个不同水体的水质指标。
- pH 值:
PH值是评价水体酸碱平衡的重要参数。它也是水体酸性或碱性状况的指标。 WHO 建议 pH 值的最大允许限值为 6.5 至 8.5。目前调查范围为6.52-6.83,处于WHO标准范围内。 - 硬度:
硬度主要是由钙盐和镁盐造成的。这些盐是从水流经的地质沉积物中溶解出来的。水与产生硬度的物质接触的时间长短有助于确定原水的硬度。硬度最初定义为水因钙和镁而沉淀肥皂的能力。 - 固体(总溶解固体 - TDS):
水能够溶解多种无机和一些有机矿物质或盐,如钾、钙、钠、碳酸氢盐、氯化物、镁、硫酸盐等。这些矿物质会产生不良的味道并淡化水的颜色。这是水的利用的重要参数。 TDS值高的水表明水的矿化度很高。 TDS 的理想限值为 500 毫克/升,最大限值为 1000 毫克/升,符合饮用目的。 - 氯胺:
氯和氯胺是公共供水系统中使用的主要消毒剂。当将氨添加到氯中以处理饮用水时,最常形成氯胺。饮用水中氯含量高达 4 毫克/升(mg/L 或百万分之四 (ppm))被认为是安全的。 - 硫酸盐:
硫酸盐是存在于矿物、土壤和岩石中的天然物质。它们存在于环境空气、地下水、植物和食物中。硫酸盐的主要商业用途是在化学工业中。海水中的硫酸盐浓度约为每升 2,700 毫克 (mg/L)。在大多数淡水供应中,其浓度范围为 3 至 30 毫克/升,但在某些地理位置发现的浓度要高得多(1000 毫克/升)。 - 电导率:
纯水不是良好的电流导体,而是良好的绝缘体。离子浓度的增加增强了水的电导率。一般来说,水中溶解固体的量决定了电导率。电导率 (EC) 实际上测量溶液传输电流的离子过程。根据WHO标准,EC值不应超过400μS/cm。 - 有机碳:
水源水中的总有机碳 (TOC) 来自腐烂的天然有机物 (NOM) 以及合成来源。 TOC 是纯水中有机化合物中碳总量的量度。根据美国环保局 (US EPA)处理过的水/饮用水中的 TOC 为 2 mg/L,并且 <用于处理的源水中4毫克/升。 - 三卤甲烷:
THM 是可能存在于经过氯处理的水中的化学物质。饮用水中的 THM 浓度根据水中有机物质的含量、处理水所需的氯量以及所处理的水的温度而变化。饮用水中 THM 含量高达 80 ppm 被认为是安全的。 - 浊度:
水的浊度取决于悬浮状态的固体物质的数量。它是衡量水的发光特性的指标,该测试用于指示废物排放中胶体物质的质量。 Wondo Genet Campus 获得的平均浊度值 (0.98 NTU) 低于 WHO 推荐值 5.00 NTU。 - 可饮用性:
指示水是否可供人类安全饮用,其中 1 表示可饮用,0 表示不可饮用。
四、实验过程
4.1问题一
水资源质量中哪些因素对水的可饮用性(Potability)产生最大影响?
4.1.1数据预处理
详见4.2.1
4.1.2数据可视化
统计各属性的频数直方图:
4.1.3相关性分析
使用相关性矩阵或热力图分析不同水质因素之间的相关性。
图 10 热力图分析
4.1.4特征选择
使用特征选择技术(如相关性分析、方差阈值等)确定与水可饮用性最相关的因素。
- # 划分特征和目标变量
- X = data.drop('Potability', axis=1) # 特征
- y = data['Potability'] # 目标变量
- # 使用相关性分析选择与目标变量最相关的K个特征
- k_best_features = 5 # 选择前K个特征
- best_features = SelectKBest(score_func=chi2, k=k_best_features)#卡方检验
- fit = best_features.fit(X, y)
- # 获取特征的得分和p值
- # p值(p-value)是在统计假设检验中的一个重要指标,用于评估观察到的数据与假设之间的一致性。在特征选择中,p值通常用于衡量特征与目标变量之间的关联程度。
- feature_scores = pd.DataFrame({'Feature': X.columns, 'Score': fit.scores_, 'P-value': fit.pvalues_})
- # 打印特征的得分和p值
- print(feature_scores)
- # 获取最相关的K个特征的列索引
- selected_features_index = fit.get_support(indices=True)
- # 提取最相关的K个特征的列
- selected_features = X.iloc[:, selected_features_index]
- # 打印最相关的K个特征
- print(selected_features)
使用了卡方检验(chi-squared test)来评估特征与目标变量之间的相关性,我们可以得出
硬度、固体、硫酸盐、电导率、有机碳与水体可饮用性最相关。
结果:
图 4 各个属性的相关性得分与P值
图 5 与可饮用性最相关的5个特征
4.2 问题二
如何预测水的可饮用性并识别潜在的风险因素?
4.2.1数据预处理
对数据集进行清理
- import pandas as pd
- import seaborn as sns
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
- df = pd.read_csv('water_potability.csv')
- print(df.shape)
- df.info()
- df.describe()
- df.isnull().sum()
shape:
descirbe:
图 1 数据集信息
(1)处理缺失值
isnull
图 2 各个属性的缺失值统计
- df = df.fillna(df.mean())
- print(df.isnull().sum())
图 3 使用均值填补缺失值后结果
(2)处理异常值
- # 处理异常值(这里假设异常值是3倍标准差之外的值)
- for column in df.columns[:-1]: # 排除Potability列
- std_dev = df[column].std()
- mean_val = df[column].mean()
- 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模型与评估
使用分类算法(如逻辑回归、决策树等)建立模型,预测水的可饮用性,并评估模型的性能。
- 逻辑回归模型
我们可以通过混淆矩阵得知,逻辑回归将所有样本分给0类(训练集中较多的值),导致准确率不高
- # 划分特征和目标变量
- X = df[['Hardness','Solids','Sulfate','Conductivity','Organic_carbon']] # 特征
- y = df['Potability'] # 目标变量
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
- # 初始化逻辑回归模型
- model = LogisticRegression()
- # 训练模型
- model.fit(X_train, y_train)
- # 预测测试集
- y_pred = model.predict(X_test)
- # 评估模型性能
- accuracy = accuracy_score(y_test, y_pred)
- conf_matrix = confusion_matrix(y_test, y_pred)#混淆矩阵
- classification_rep = classification_report(y_test, y_pred)
- # 打印评估结果
- print(f'Accuracy: {accuracy}')
- print(f'Confusion Matrix:\n{conf_matrix}')
- print(f'Classification Report:\n{classification_rep}')
图 6 逻辑回归模型性能
图 7混淆矩阵示意图
- 决策树模型
- # 初始化决策树模型
- model = DecisionTreeClassifier(random_state=42)
- # 训练模型
- model.fit(X_train, y_train)
- # 预测测试集
- y_pred = model.predict(X_test)
解决了逻辑回归的问题,但是准确率太低了
图 8 决策树模型性能
(3)Gradient Boosting模型(集成学习)
- model = GradientBoostingClassifier(random_state=42)
- # 训练模型
- model.fit(X_train, y_train)
- # 预测测试集
- 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属性与可饮用性极不相关。