
UCI玻璃数据集深度解析从数据清洗到可视化洞察的完整指南1. 初识UCI玻璃数据集法医化学的数字化密码当犯罪现场散落的玻璃碎片成为破案关键时化学成分类别分析就成为了现代法医学的重要工具。UCI玻璃数据集正是这样一个独特的化学分析数据集它记录了214个玻璃样本的9种化学成分含量及对应的用途分类。这个看似简单的数据集背后隐藏着材料科学、刑事侦查和工业质检等多领域的应用价值。玻璃作为非晶态固体其物理特性与化学成分有着直接关联。通过测量以下关键指标我们可以建立化学成分与用途之间的关联模型折射率(RI)光线在玻璃中的弯曲程度氧化物含量Na(钠)、Mg(镁)、Al(铝)、Si(硅)、K(钾)、Ca(钙)、Ba(钡)、Fe(铁)的重量百分比玻璃类型被编码为1-7的整数涵盖了建筑窗户、车辆玻璃、容器玻璃等多种用途。在实际案件中分析玻璃碎片的化学成分可以帮助确定其来源比如判断车祸现场的玻璃是来自车辆前挡风玻璃还是建筑物的窗户玻璃。import pandas as pd # 从UCI机器学习仓库加载原始数据 url https://archive.ics.uci.edu/ml/machine-learning-databases/glass/glass.data columns [Id,RI,Na,Mg,Al,Si,K,Ca,Ba,Fe,Type] glass_df pd.read_csv(url, headerNone, namescolumns) print(f数据集维度{glass_df.shape}) print(前5条样本) print(glass_df.head())输出示例数据集维度(214, 10) 前5条样本 Id RI Na Mg Al Si K Ca Ba Fe Type 0 1 1.52101 13.64 4.49 1.10 71.78 0.06 8.75 0.0 0.0 1 1 2 1.51761 13.89 3.60 1.36 72.73 0.48 7.83 0.0 0.0 1 2 3 1.51618 13.53 3.55 1.54 72.99 0.39 7.78 0.0 0.0 1 3 4 1.51766 13.21 3.69 1.29 72.61 0.57 8.22 0.0 0.0 1 4 5 1.51742 13.27 3.62 1.24 73.08 0.55 8.07 0.0 0.0 12. 数据清洗实战打造高质量分析基础原始数据就像未经打磨的钻石需要经过精细切割才能展现其真正价值。UCI玻璃数据集虽然结构良好但仍存在一些需要处理的问题点2.1 缺失值与异常值检测首先检查数据的完整性# 检查缺失值 print(缺失值统计) print(glass_df.isnull().sum()) # 描述性统计 print(\n描述性统计) print(glass_df.describe())关键发现数据集中没有缺失值这在真实场景中非常罕见某些元素如Ba(钡)和Fe(铁)在很多样本中含量为0K(钾)的最大值(6.21)与75%分位数(0.61)差距悬殊可能存在异常值2.2 特征工程与数据标准化不同化学成分的测量单位和量纲差异很大需要进行标准化处理from sklearn.preprocessing import StandardScaler # 移除ID列 data glass_df.drop(Id, axis1) # 分离特征和目标变量 X data.drop(Type, axis1) y data[Type] # 标准化特征 scaler StandardScaler() X_scaled scaler.fit_transform(X) X_scaled pd.DataFrame(X_scaled, columnsX.columns) # 添加目标列 processed_df X_scaled.copy() processed_df[Type] y.values print(\n标准化后的数据) print(processed_df.head())2.3 类别分布分析玻璃类型分布极不均衡这会影响后续建模import matplotlib.pyplot as plt # 类别分布可视化 type_counts glass_df[Type].value_counts().sort_index() plt.figure(figsize(10,6)) bars plt.bar(type_counts.index.astype(str), type_counts.values, colorskyblue) # 添加数值标签 for bar in bars: height bar.get_height() plt.text(bar.get_x() bar.get_width()/2., height, f{int(height)}, hacenter, vabottom) plt.title(玻璃类型分布, fontsize15) plt.xlabel(玻璃类型, fontsize12) plt.ylabel(样本数量, fontsize12) plt.xticks(fontsize11) plt.yticks(fontsize11) plt.grid(axisy, linestyle--, alpha0.7) plt.show()类型分布特点类型1(建筑窗户-浮法)和类型2(建筑窗户-非浮法)占主导类型3(车辆窗户-浮法)仅有17个样本类型7(头灯玻璃)仅有9个样本3. 三维可视化解析化学指纹的多角度观察3.1 箱线图矩阵元素分布的直观对比箱线图是展示数据分布的强大工具特别适合比较不同特征的统计特性plt.figure(figsize(15,10)) processed_df.drop(Type, axis1).plot(kindbox, vertFalse, patch_artistTrue) plt.title(标准化后的特征箱线图, fontsize15) plt.xlabel(标准化值, fontsize12) plt.grid(axisx, linestyle--, alpha0.7) plt.show()关键发现Mg(镁)和Ba(钡)的分布呈现明显的双峰特征K(钾)存在多个离群点大多数元素的标准化值集中在[-2,2]区间内3.2 平行坐标图多维特征的关系网络平行坐标图可以揭示高维数据中的模式和聚类from pandas.plotting import parallel_coordinates plt.figure(figsize(15,10)) parallel_coordinates(processed_df, Type, colormapviridis, alpha0.5) plt.title(玻璃化学成分平行坐标图, fontsize15) plt.xlabel(化学元素, fontsize12) plt.ylabel(标准化值, fontsize12) plt.xticks(rotation45) plt.grid(linestyle--, alpha0.7) plt.legend(locupper right, bbox_to_anchor(1.15, 1)) plt.show()模式识别类型1和类型2在某些元素上非常相似但在Mg含量上有明显区别类型6(容器玻璃)在Ba含量上有独特特征类型7(头灯玻璃)在Fe含量上与其他类型区分明显3.3 热力图元素间的相关性网络化学元素间的相互作用关系可以通过相关性热图直观展示import seaborn as sns plt.figure(figsize(12,10)) corr_matrix processed_df.drop(Type, axis1).corr() sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0, linewidths0.5) plt.title(化学成分相关性热图, fontsize15) plt.xticks(rotation45, fontsize10) plt.yticks(fontsize10) plt.show()显著相关性RI(折射率)与Ca(钙)呈现强正相关(0.81)Mg(镁)与Ba(钡)呈现负相关(-0.49)Al(铝)与Ba(钡)呈现正相关(0.48)4. 高级分析技巧从可视化到业务洞察4.1 主成分分析(PCA)降维观察将9维数据降维到2维观察样本分布from sklearn.decomposition import PCA pca PCA(n_components2) principal_components pca.fit_transform(X_scaled) pca_df pd.DataFrame(dataprincipal_components, columns[PC1, PC2]) pca_df[Type] y.values plt.figure(figsize(12,8)) sns.scatterplot(xPC1, yPC2, hueType, datapca_df, paletteviridis, s100, alpha0.7) plt.title(玻璃数据PCA降维(方差解释率%.2f) % sum(pca.explained_variance_ratio_), fontsize15) plt.xlabel(fPC1 ({pca.explained_variance_ratio_[0]:.1%}), fontsize12) plt.ylabel(fPC2 ({pca.explained_variance_ratio_[1]:.1%}), fontsize12) plt.grid(linestyle--, alpha0.5) plt.legend(title玻璃类型) plt.show()PCA发现前两个主成分解释了约50%的方差类型6和类型7在二维平面上有较好的分离性类型1和类型2有较大重叠4.2 t-SNE可视化非线性结构探索对于更复杂的非线性关系t-SNE通常能提供更好的可视化效果from sklearn.manifold import TSNE tsne TSNE(n_components2, perplexity30, random_state42) tsne_results tsne.fit_transform(X_scaled) tsne_df pd.DataFrame(datatsne_results, columns[TSNE1, TSNE2]) tsne_df[Type] y.values plt.figure(figsize(12,8)) sns.scatterplot(xTSNE1, yTSNE2, hueType, datatsne_df, paletteviridis, s100, alpha0.7) plt.title(玻璃数据t-SNE可视化, fontsize15) plt.xlabel(TSNE1, fontsize12) plt.ylabel(TSNE2, fontsize12) plt.grid(linestyle--, alpha0.5) plt.legend(title玻璃类型) plt.show()t-SNE观察类型6(容器玻璃)形成了明显的独立簇类型7(头灯玻璃)也有较好的聚集性建筑窗户玻璃(类型1和2)仍然存在较多重叠4.3 特征重要性分析使用随机森林评估各化学成分对分类的重要性from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier(n_estimators100, random_state42) rf.fit(X_scaled, y) importance pd.DataFrame({ Feature: X.columns, Importance: rf.feature_importances_ }).sort_values(Importance, ascendingFalse) plt.figure(figsize(10,6)) sns.barplot(xImportance, yFeature, dataimportance, paletteviridis) plt.title(化学成分分类重要性, fontsize15) plt.xlabel(重要性得分, fontsize12) plt.ylabel(化学元素, fontsize12) plt.grid(axisx, linestyle--, alpha0.7) plt.show()关键发现Mg(镁)是最具区分力的特征RI(折射率)和Al(铝)次之K(钾)和Fe(铁)的区分能力较弱5. 实战建议与经验分享在实际项目中处理类似数据集时有几个关键点值得特别注意数据标准化策略选择当特征间量纲差异大时标准化是必须的对于含有大量零值的稀疏特征(如Ba、Fe)RobustScaler可能比StandardScaler更合适考虑在标准化前去除或填补异常值处理类别不平衡的技巧过采样少数类或欠采样多数类使用类别权重调整模型尝试分层抽样确保每类都有代表评估指标选择F1分数或AUC-ROC而非准确率可视化优化经验平行坐标图中类别过多会导致视觉混乱可先聚焦主要类别热力图的颜色映射应突出关键相关性区间交互式可视化(如Plotly)有助于探索高维数据保存可视化配置便于后续分析复用# 示例使用Plotly创建交互式平行坐标图 import plotly.express as px fig px.parallel_coordinates(processed_df, colorType, dimensionslist(X.columns), color_continuous_scalepx.colors.diverging.Tealrose, labels{Type: 玻璃类型}, title玻璃化学成分交互式平行坐标图) fig.show()建模方向建议先尝试树模型(随机森林、XGBoost)处理非线性关系对于重叠严重的类别(如类型1和2)可考虑聚类分析神经网络可能在小数据集上表现不稳定集成多种模型的结果可能提高鲁棒性