分类数据 EDA 实战:如何发现隐藏的层次结构

简介: 本文揭示EDA核心:分类变量(如city、category)表面扁平,实则藏有收入层级、价值模式、时空分布等隐藏层次结构。通过频率vs价值分析、嵌套交叉、时间拆解与交互可视化,教你用Python挖掘真实结构,避免被数据表象欺骗,提升分析深度与建模质量。

探索性数据分析(EDA)的本质不是画图和算统计量,而是不被自己的数据欺骗。

分类列是最容易出问题的地方。

city

category

product

department

role

customer_type

——这些列看起来很简单,跑个

value_counts()

画个柱状图搞定了。

其实分类变量往往藏着隐藏的层次结构。这些关系存在于类别内部,不主动挖掘根本看不出来。一旦忽略那么就会得到错误的结论、垃圾特征、误导性的报表。

这篇文章讲的是如何在 EDA 阶段把这些隐藏结构找出来,用实际的步骤、真实的案例,外加可以直接复用的 Python 代码。

什么是"隐藏层次结构"?

一个分类变量表面看起来是扁平的,实际上却是分层的:这就是隐藏层次结构。

举几个常见例子:

City

背后藏着收入水平、门店类型、客户行为;

Product Category

背后是价格层级和利润模式;

Customer Type

对应着忠诚度阶段或消费能力;

Department

则可能隐含资历或责任级别。

把所有类别一视同仁EDA 就废了,因为它们从来都不平等。

示例数据集

继续使用同一份销售数据,保持系列的连贯性。

 import pandas as pd  
 import numpy as np  
 import matplotlib.pyplot as plt  
 import seaborn as sns  
 sns.set_style("whitegrid")  
 df = pd.read_csv("sales_data.csv")  
 df['order_date'] = pd.to_datetime(df['order_date'])  
 df.head()

扁平类别的假象

初学者通常这么干:

 df['city'].value_counts()

输出:Delhi: 3,Mumbai: 1,Bangalore: 1。

结论:"Delhi 销售最多。"

技术上没错,分析上毫无价值。

EDA 应该问更好的问题:Delhi 的客户是买得更频繁,还是买得更贵?Delhi 的数据是不是被某一个客户撑起来的?不同城市的品类结构有没有差异?

扁平的计数把真正的结构埋了起来。

频率不等于重要性

比较一下频率和价值:

 df.groupby('city')['amount'].sum().sort_values(ascending=False)

再看均值:

 df.groupby('city')['amount'].mean().sort_values(ascending=False)

你很可能发现:某个城市订单少但客单价高,另一个城市量大但贡献的收入反而一般。

这就是第一个隐藏层次结构:数量主导 vs 价值主导。

出现频率高的类别,并不自动意味着更重要。

嵌套类别

类别很少孤立存在。看看

city → category

的关系:

 pd.crosstab(df['city'], df['category'], normalize='index')

可视化一下:

 pd.crosstab(df['city'], df['category'], normalize='index')\  
   .plot(kind='bar', stacked=True, figsize=(8,5))  
 plt.title("Category Distribution Within Each City")  
 plt.show()

模式开始出现了:有的城市电子产品占大头,有的城市家具更突出,还有的城市品类分布比较均匀。

这里的隐藏层次结构是:城市不是一个类别,而是一个容器。

忽略这一点,细分就做不好,报表也只是走过场。

主导类别背后的子群组

看看

category

 df['category'].value_counts(normalize=True)

电子产品占主导。但继续拆解:

 df.groupby(['category', 'product'])['amount'].sum()

很可能发现某一个产品贡献了绝大部分收入,其他产品只是凑数的。

一个大类别可能完全由一个小子群组撑着。这对特征工程、库存规划、模型偏差都有直接影响。

客户层级

客户 ID 本质上也是分类变量,而且层次很深。

df.groupby('customer_id')['amount'].sum().sort_values(ascending=False)

你可能会看到某个客户贡献了大部分收入,或者同一个人反复购买。

再叠加城市维度:

df.groupby(['customer_id', 'city'])['amount'].sum()

真相可能是:某个城市的"领先地位"其实就靠一个客户撑着。由此得出的地理结论完全站不住脚。

永远要检查:一个类别是由众多贡献者驱动的,还是被某个异常个体拉高的。

时间带来的层次

时间天然会产生层次结构。

df['month'] = df['order_date'].dt.month  
df.groupby(['city', 'month'])['amount'].sum().unstack()

画出来:

sns.lineplot(data=df, x='month', y='amount', hue='city', marker='o')  
plt.show()

你可能会发现不同城市在不同月份达到峰值,季节性主导权在品类之间轮换。

静态的柱状图永远看不到这些。

类别与数值的交互

处理分类数据时,交互分析是最关键的一环。

先看单一维度:

sns.boxplot(x='category', y='amount', data=df)  
plt.show()

加上城市:

sns.boxplot(x='city', y='amount', hue='category', data=df)  
plt.xticks(rotation=45)  
plt.show()

同一个品类在不同城市的表现可能天差地别,消费分布不一样,隐藏的高端细分市场也藏在里面。

特征创意往往就是这么来的。

隐藏层次结构如何破坏模型

不做 EDA 就直接 one-hot 编码会出大问题,因为高价值和低价值的子群组被混在一起,客户集中度信息泄露,噪声被放大。

EDA 阶段可以这样修补:

df['high_value_customer'] = (  
    df.groupby('customer_id')['amount']  
      .transform('sum') > df['amount'].median()  
).astype(int)

这个特征的存在,完全依赖于对层次结构的挖掘。

分类数据的 EDA 清单

每个分类列都应该过一遍:频率检查、基于价值的聚合、跨类别交互、时间维度拆分、异常值主导检查。

跳过这些,EDA 就只是做做样子。

面试时怎么说

不要说"我检查了分类分布"。

要说:"我通过结合频率、价值贡献以及与时间和数值变量的交互,分析了分类变量的隐藏层次结构,识别出主导子群组,避免了建模时的误导性结论。"

面试官一听就知道你是明白人。

总结

分类数据从来都不是扁平的。EDA 存在的意义,就是证明这个假设是错的。

隐藏的层次结构能解释很多事:为什么报表会骗人,为什么模型会过拟合,为什么业务决策让人一头雾水。

一旦开始有意识地寻找这些结构,就再也回不去了。分析的段位会直接拉升一个档次。

EDA 的目的不是更快地出图,而是在相信图表之前,先想清楚。

by Gitanjali

目录
相关文章
|
1月前
|
人工智能 安全 前端开发
开源可扩展 + 安全可控|MonkeyCodeAI,企业研发工具最优解
MonkeyCodeAI是企业级开源AI研发基础设施,首创“双引擎+全流程”架构,覆盖需求拆解、架构设计、编码、Review与安全扫描。支持私有化部署、多模型适配(含国产模型)、内置安全扫描与规范驱动,AGPL-3.0开源可扩展。已验证于紧急开发、原型验证及金融合规等场景,真正实现高效、安全、可控的AI原生研发。
131 9
|
25天前
|
人工智能 测试技术
LLM创造力可以被度量吗?一个基于提示词变更的探索性实验
本文探讨提示词工程为何仍是“玄学”,并通过实验证明:加入明确指令(如“Be as creative as possible”)可显著、可量化地提升LLM输出多样性,效果甚至超过调高温度。研究以embedding距离为代理指标,覆盖13个主流模型,揭示提示词迭代可度量、可预测,为LLM应用从经验走向工程化提供新路径。
101 17
LLM创造力可以被度量吗?一个基于提示词变更的探索性实验
|
13天前
|
人工智能 监控 网络安全
2026年开工不想工作?3分钟部署OpenClaw(原Clawdbot)AI助手 24小时为我工作
春节假期结束,不少人刚回到工位就陷入“开工倦怠”:不想回邮件、不想整理报表、不想写代码、不想处理重复琐碎的事务,只想发呆摸鱼,但工作任务堆成山, deadlines 步步紧逼。有没有一种方式,能让AI替我们完成大部分机械性、重复性工作,实现“人在摸鱼,工作已完成”的理想状态?答案就是**阿里云OpenClaw(原Clawdbot)**——一款能7×24小时不间断工作的开源AI自动化助手,无需人工盯守,一句话下达指令,就能自动执行办公、开发、搜索、整理、定时任务等全场景操作。
267 9
|
27天前
|
数据采集 人工智能 自然语言处理
从“通才”到“专才”:揭秘AI大模型预训练与微调的核心魔法
本文通俗解析AI“预训练+微调”范式:预训练如AI的“基础教育”,让模型从海量数据中自学语言与视觉规律;微调则是定向“专业培训”,用少量业务数据将通用大模型转化为解决具体问题的“专属专家”。全程兼顾原理、步骤与实践,助力零基础用户轻松上手。(239字)
159 7
从“通才”到“专才”:揭秘AI大模型预训练与微调的核心魔法
|
1月前
|
人工智能 弹性计算 数据可视化
2026年阿里云新老用户部署 OpenClaw(Clawdbot) 流程步骤和使用指南汇总
OpenClaw作为阿里云生态下轻量化、高适配的AI自动化代理工具,2026年版本在部署便捷性、功能扩展性上实现全面升级,成为阿里云用户实现“云端AI自动化”的核心选择。无论是个人用户快速落地基础功能,还是企业用户定制化适配业务场景,掌握标准化的部署流程与高效的使用方法都是关键。本文将从部署前准备、阿里云一键部署全流程、核心功能使用、进阶配置、常见问题解决五大维度,为阿里云用户整理一份完整的OpenClaw部署与使用指南,包含实操代码命令与场景化使用技巧,覆盖从0到1的全生命周期管理。
560 14
|
26天前
|
人工智能 缓存 自然语言处理
告别Demo|手把手教你构建可用的LangChain测试智能体
市面上从不缺少能跑通 Demo 的 AI 测试脚本,缺的是能在企业级复杂场景下真正“抗住事”的测试智能体。今天我们不谈概念,直接动手:基于 LangChain 从零构建一个具备测试设计、自主执行、结果分析能力的生产级 Agent。它将证明,AI 自动化测试的价值,不在于“看起来智能”,而在于能为你省下多少真实工时。
|
1月前
|
人工智能 架构师 SEO
AI开始反问人类:生成式搜索时代,内容竞争的真正战场已经变了
AI搜索正从“找词”转向“解题”,内容竞争单位由关键词升维为“问题的标准答案”。尹邦奇提出的GEO(生成式引擎优化)强调:谁定义问题,谁掌控引用权。“答案架构师”需将模糊需求转化为结构清晰、判断明确、结论可复用的标准回答——观点比信息重要,判断比描述值钱。
135 14
|
11天前
|
JavaScript 搜索推荐 前端开发
从提示工程转向 上下文工程,6种让LLM在生产环境中稳定输出的技术
本文系统阐述“上下文工程”(Context Engineering)——生产级AI系统的核心能力。它不依赖提示词优化,而是通过选择性检索、上下文压缩、层次化布局、动态查询重构、记忆注入与工具感知六大技术,精准控制模型在运行时“看到什么、何时看、如何看”,从而根治幻觉、提升准确率、降低Token消耗,让小模型也能稳定输出高质量结果。
146 16
从提示工程转向 上下文工程,6种让LLM在生产环境中稳定输出的技术
|
4天前
|
存储 人工智能 Serverless
阿里云QwQ-32B模型如何部署安装?基于函数计算FC一键安装
阿里云QwQ-32B是性能媲美全球顶尖开源模型的轻量级推理大模型。本文详解如何通过函数计算FC(Function AI)一键部署:支持应用模板快速启动对话界面,或API调用集成至AI应用,零代码新手友好,10分钟完成部署。(239字)
59 16
|
5天前
|
人工智能 前端开发 Serverless
不用写一行代码!阿里云上线 Qwen3 一键部署,秒开大模型对话界面
通义千问Qwen3正式开源8款混合推理模型,含2款MoE(235B/30B)和6款Dense(0.6B–32B),支持119种语言、思考/非思考双模式,在代码、数学等基准表现优异。依托阿里云函数计算,提供vLLM/SGLang/Ollama等多种部署方式,开箱即用。(239字)
151 23

热门文章

最新文章