12 数据预处理-数据预处理-数据冗余分析-综合案例
Python 数据分析入门一文搞懂数据冗余分析与综合预处理附 Pandas 可视化实战适合人群Python 初学者 / 数据分析入门 / 数据预处理学习者 / 教学案例分享在做数据分析时很多人会先关注这些问题数据有没有缺失值数据里有没有异常值有没有重复记录多张表能不能合并这些问题当然都很重要。但在真实的数据处理中还有一个特别容易被忽略的问题数据冗余比如两个字段名字不同但其实表达的是同一个意思一个字段其实可以由另一个字段推导出来两列数据数值变化几乎完全一致重复表达了相同信息如果这些冗余信息不处理就会带来不少问题数据表看起来越来越大但有效信息并没有增加分析时容易重复理解、重复计算特征过多会增加处理成本多来源数据合并后表结构会变得混乱这篇文章就以“学生学情数据分析”为案例带你系统理解什么是冗余属性数据冗余是怎么产生的为什么相关系数和协方差可以帮助识别冗余如何用图像直观表达“冗余度”如何把冗余分析放进完整的数据预处理流程如何使用Pandas完成基础的综合预处理任务现实中的数据往往并不是“干净”的通常会存在噪声、不一致和缺失等问题需要通过数据清洗进行预处理 [2]。而对于冗余属性的识别可以结合字段语义、相关系数和协方差等方式进行分析 [1]。一、什么是数据冗余可以先用一句话理解数据冗余就是同一类信息被重复保存或重复表达。常见情况有两类。1字段含义重复例如student_idstu_no这两个字段名字不同但都表示学生编号。2属性信息重复例如总成绩综合成绩如果两列数值几乎一样或者完全一样就说明它们可能在重复表达同一类信息。在数据分析中冗余属性可能由其他属性推导得到也可能因为属性命名不一致而带来重复信息 [1]。二、为什么要做冗余分析很多初学者会觉得“字段多一点也没关系反正数据还在。”但实际上冗余字段会带来不少麻烦。1. 增加理解成本字段越多越难快速判断哪些才是真正有价值的信息。2. 增加处理成本后续做统计分析、建模、可视化时都要处理更多列。3. 影响分析结果如果多个字段本质上表达的是同类信息可能会造成“重复放大”。4. 降低数据质量多来源数据整合后如果不分析冗余表会越来越乱。所以你可以把冗余分析理解成给数据表做一次“减负”和“瘦身”。三、案例学生学情数据里哪些字段可能冗余先构造一份简单的数据。importpandasaspdimportnumpyasnp dfpd.DataFrame({student_id:[001,002,003,004,005],stu_no:[001,002,003,004,005],平时成绩:[85,78,90,88,76],期末成绩:[92,80,94,90,78],总成绩:[89,79,92,89,77],综合成绩:[89,79,92,89,77]})print(df)从这张表里很容易发现两个可能的冗余问题问题1字段名不同但意思相同student_idstu_no这两个字段都表示学生编号。问题2字段值高度一致总成绩综合成绩两列值完全一样说明冗余非常明显。四、冗余属性一般怎么识别冗余分析通常有两个入口1先看字段语义这是最直观、也是最适合初学者的方法。例如student_id和stu_no明显都像是学号年龄和出生年份一个字段可以由另一个字段推导总成绩和综合成绩业务含义接近数值还很像所以第一步永远建议先问这些字段是不是在说同一件事2再看数值相关性对于数值型属性可以用相关系数协方差来辅助分析属性之间的关系 [1]。如果两个字段的相关性非常高就可能意味着它们表达的是高度相似的信息。注意这里是“可能”不是“绝对”。五、什么是相关系数相关系数可以简单理解为衡量两个数值型字段变化趋势是否一致。取值一般在-1到1之间越接近1正相关越强越接近-1负相关越强越接近0相关性越弱如果两个字段的相关系数非常接近1说明它们的变化趋势非常一致就有可能存在冗余 [1]。例如平时成绩高期末成绩通常也高 → 正相关一个字段升高另一个下降 → 负相关没什么关系 → 相关性弱六、什么是协方差协方差也可以衡量两个变量是否一起变化 [1]。你可以简单理解为两个变量经常一起增大或一起减小 → 协方差通常为正一个增大、另一个减小 → 协方差通常为负没明显关系 → 协方差接近 0不过协方差受量纲影响较大所以在课堂和入门教学里通常更建议优先看相关系数更直观协方差作为补充。七、冗余度能不能用图像表达可以而且非常适合用图像来讲。如果只给学生看一堆相关系数数字很多人会觉得抽象。但如果把这些数字画成图理解会轻松很多。最推荐的图像表达方式有三种1. 相关系数热力图最适合整体看多个字段之间的关系。2. 散点图适合单独比较两个字段是否高度相似。3. 柱状图适合围绕某一个核心字段看它和其他字段的关系。八、方法1相关系数热力图最推荐这是做冗余分析时最常见、也最直观的一种方式。示例代码importseabornassnsimportmatplotlib.pyplotasplt corr_matrixdf[[平时成绩,期末成绩,总成绩,综合成绩]].corr()plt.figure(figsize(8,6))sns.heatmap(corr_matrix,annotTrue,cmapYlGnBu,fmt.2f)plt.title(属性相关系数热力图)plt.show()如何理解颜色越深说明相关性越强如果总成绩和综合成绩的值非常接近1.00说明它们高度相关这通常意味着它们可能表达的是重复信息 [1]为什么适合课堂因为学生一眼就能看到哪些字段“太像了”。九、方法2散点图看两个字段是不是“几乎一条线”如果你只想单独比较两个字段比如总成绩综合成绩那散点图会非常直观。示例代码plt.figure(figsize(6,4))plt.scatter(df[总成绩],df[综合成绩],colorred)plt.xlabel(总成绩)plt.ylabel(综合成绩)plt.title(总成绩与综合成绩散点图)plt.grid(True)plt.show()如何理解如果图上的点几乎都落在一条斜线上说明两个字段变化几乎同步冗余程度可能很高。这个图特别适合高职课堂因为学生很容易理解“点越像一条线这两个字段就越像。”十、方法3柱状图展示与目标字段的相关性如果你想围绕某个核心字段来讲比如“总成绩”和其他字段的关系可以画柱状图。示例代码corr_with_totaldf[[平时成绩,期末成绩,总成绩,综合成绩]].corr()[总成绩].sort_values(ascendingFalse)plt.figure(figsize(8,4))corr_with_total.plot(kindbar,colorskyblue)plt.title(各字段与总成绩的相关性)plt.ylabel(相关系数)plt.show()适合讲什么哪些字段和总成绩关系最强哪个字段可能和总成绩重复表达信息十一、用 Pandas 做基础冗余分析1先看整体数据情况print( 数据预览 )print(df.head())print(\n 数据结构 )print(df.info())2查看相关系数矩阵print(\n 相关系数矩阵 )print(df[[平时成绩,期末成绩,总成绩,综合成绩]].corr())3查看协方差矩阵print(\n 协方差矩阵 )print(df[[平时成绩,期末成绩,总成绩,综合成绩]].cov())4删除明显冗余字段dfdf.drop(columns[stu_no,综合成绩])print(\n 去除冗余字段后的数据 )print(df)这里的处理逻辑是stu_no和student_id含义重复综合成绩和总成绩信息重复所以保留一列即可。十二、完整代码冗余分析 可视化演示下面给出一份完整代码复制即可运行。importpandasaspdimportnumpyasnpimportseabornassnsimportmatplotlib.pyplotasplt# 1. 构造数据dfpd.DataFrame({student_id:[001,002,003,004,005],stu_no:[001,002,003,004,005],平时成绩:[85,78,90,88,76],期末成绩:[92,80,94,90,78],总成绩:[89,79,92,89,77],综合成绩:[89,79,92,89,77]})print( 原始数据 )print(df)print(\n 数据结构 )print(df.info())# 2. 相关系数矩阵corr_matrixdf[[平时成绩,期末成绩,总成绩,综合成绩]].corr()print(\n 相关系数矩阵 )print(corr_matrix)# 3. 协方差矩阵cov_matrixdf[[平时成绩,期末成绩,总成绩,综合成绩]].cov()print(\n 协方差矩阵 )print(cov_matrix)# 4. 相关系数热力图plt.figure(figsize(8,6))sns.heatmap(corr_matrix,annotTrue,cmapYlGnBu,fmt.2f)plt.title(属性相关系数热力图)plt.show()# 5. 散点图plt.figure(figsize(6,4))plt.scatter(df[总成绩],df[综合成绩],colorred)plt.xlabel(总成绩)plt.ylabel(综合成绩)plt.title(总成绩与综合成绩散点图)plt.grid(True)plt.show()# 6. 柱状图corr_with_totalcorr_matrix[总成绩].sort_values(ascendingFalse)plt.figure(figsize(8,4))corr_with_total.plot(kindbar,colorskyblue)plt.title(各字段与总成绩的相关性)plt.ylabel(相关系数)plt.show()# 7. 删除冗余字段df_cleandf.drop(columns[stu_no,综合成绩])print(\n 去除冗余字段后的数据 )print(df_clean)十三、为什么冗余分析要放进完整的数据预处理流程因为冗余分析通常不会单独出现。真实数据更常见的是有缺失值有异常值有重复记录字段命名不统一还存在冗余属性所以更合理的思路是把冗余分析作为完整数据预处理流程中的一步。数据预处理本身就包括数据清洗、数据合并、数据变换等环节Python 中可以使用Pandas、NumPy等工具完成这些操作 [2]。十四、一个基础的数据预处理流程可以先记住下面这个步骤数据预处理基础流程查看数据基本情况处理缺失值检测异常值删除重复记录统一字段名和结构分析冗余属性输出清洗后的结果表这个顺序非常适合初学者因为是“分步骤推进”的。十五、综合实训示例把前面学的内容串起来下面给出一个小型综合实训示例同时包含缺失值重复记录字段冗余数值冗余importpandasaspdimportnumpyasnp dfpd.DataFrame({student_id:[001,002,002,003,004,005],stu_no:[001,002,002,003,004,005],平时成绩:[85,np.nan,np.nan,78,88,76],期末成绩:[92,80,80,10,90,np.nan],考勤次数:[20,18,18,np.nan,20,19],总成绩:[89,79,79,44,89,78],综合成绩:[89,79,79,44,89,78]})print( 原始数据 )print(df)# 1. 处理缺失值df[平时成绩]df[平时成绩].fillna(df[平时成绩].mean())df[期末成绩]df[期末成绩].fillna(df[期末成绩].median())df[考勤次数]df[考勤次数].fillna(df[考勤次数].mean())# 2. 删除重复记录dfdf.drop_duplicates(subset[student_id])# 3. 删除命名冗余字段dfdf.drop(columns[stu_no])# 4. 查看相关性print(\n 相关系数矩阵 )print(df[[平时成绩,期末成绩,总成绩,综合成绩]].corr())# 5. 删除明显冗余字段dfdf.drop(columns[综合成绩])print(\n 预处理后的数据 )print(df)十六、最容易踩的坑坑1字段多就以为信息更多不一定。很多时候只是冗余更多。坑2看到高相关就直接删列不建议机械操作。高相关只是提示“可能冗余”最终还要结合业务理解 [1]。坑3只看数值不看字段语义像student_id和stu_no这种冗余不是靠相关系数判断而是靠业务语义判断。坑4只会处理不会解释真正的数据分析不仅是“把代码跑通”更重要的是能解释为什么认为它冗余为什么删这一列不删那一列删除之后会不会影响后续分析十七、给初学者的一个记忆口诀这部分建议先记住下面这 5 句话冗余属性就是重复表达信息的属性。字段命名不一致也可能带来冗余。相关系数和协方差可以帮助判断数值字段的关系。高相关不一定等于一定删除要结合业务理解。冗余分析是数据预处理流程中的重要一步。十八、课后练习适合课堂 / 自学练习 1基础题已知数据如下dfpd.DataFrame({student_id:[001,002,003],stu_no:[001,002,003],平时成绩:[80,85,90],期末成绩:[82,88,92],总成绩:[81,86,91],综合成绩:[81,86,91]})请完成找出可能的冗余字段计算数值字段的相关系数矩阵画出相关系数热力图说明哪些字段可能冗余理由是什么输出删除冗余字段后的结果表练习 2提高题请自己构造一份数据表要求同时包含1 个缺失值1 条重复记录1 个异常值2 个明显冗余字段然后完成查看数据整体情况处理缺失值检测异常值删除重复记录分析冗余字段用图像表达冗余度输出清洗结果练习 3迁移题请把“学生学情数据”替换成你熟悉的业务场景例如某店铺销售数据某电商用户消费数据某宿舍每日用电数据要求写出其中可能存在的冗余字段说明如何判断这些字段是否冗余至少使用一种图像方式表达冗余关系设计一套完整的预处理步骤十九、总结这篇文章解决的核心问题其实很实际当一张表里的字段越来越多时哪些是真信息哪些是重复信息我们通过学生学情数据这个案例学习了什么是冗余属性冗余是怎么产生的如何利用相关系数和协方差做简单分析 [1]如何用热力图、散点图、柱状图表达冗余关系如何把冗余分析放进完整的数据预处理流程如何用Pandas完成基础的综合预处理任务 [2]最重要的结论是冗余分析不是孤立知识点而是完整数据预处理流程中的重要一步。二十、写在最后如果这篇文章对你有帮助欢迎点赞、收藏、评论支持一下。如果你也在学习 Python 数据分析建议把缺失值处理、异常值检测、重复值删除、字段统一和冗余分析这些内容连起来练习因为真实场景里它们往往不会单独出现 [2]。你在做数据预处理时最容易忽略的是“异常值”还是“冗余字段”欢迎在评论区交流。