Kibana 大数据分析实战(一)
kibana_sample_data_ecommerce
是 Elastic 官方提供的电商业务模拟数据集,主要用于 Kibana 的功能演示和数据可视化练习。这个数据集模拟了一个在线零售商的交易数据。
这个数据集设计精良,包含了电商业务中最常见的分析维度,非常适合用于学习 Kibana 的各种功能和分析方法。
- Discover:浏览原始订单数据
- Dashboard:创建销售仪表盘
- Visualize:
- 销售额趋势图(折线图)
- 商品类别销售占比(饼图)
- 地理分布图(地图)
- Lens:快速分析客户购买行为
- Maps:可视化销售地理分布
1.索引结构
该数据集包含一个主索引:
kibana_sample_data_ecommerce
2.初步探索(Discover 面板)
可以先在 Discover
面板中看一下该数据集有哪些业务字段,进行初步摸排。
2.1 Table 格式
2.2 JSON 格式
{
"_index": "kibana_sample_data_ecommerce",
"_type": "_doc",
"_id": "R5AfQJcBt8iFjG3dMKLq",
"_score": 1,
"_source": {
"category": [
"Men's Accessories",
"Men's Clothing"
],
"currency": "EUR",
"customer_first_name": "Marwan",
"customer_full_name": "Marwan Sharp",
"customer_gender": "MALE",
"customer_id": 51,
"customer_last_name": "Sharp",
"customer_phone": "",
"day_of_week": "Tuesday",
"day_of_week_i": 1,
"email": "marwan@sharp-family.zzz",
"manufacturer": [
"Elitelligence",
"Oceanavigations"
],
"order_date": "2025-06-03T16:09:07+00:00",
"order_id": 567543,
"products": [
{
"base_price": 24.99,
"discount_percentage": 0,
"quantity": 1,
"manufacturer": "Elitelligence",
"tax_amount": 0,
"product_id": 14075,
"category": "Men's Accessories",
"sku": "ZO0608106081",
"taxless_price": 24.99,
"unit_discount_amount": 0,
"min_price": 12.74,
"_id": "sold_product_567543_14075",
"discount_amount": 0,
"created_on": "2016-12-13T16:09:07+00:00",
"product_name": "Rucksack - black",
"price": 24.99,
"taxful_price": 24.99,
"base_unit_price": 24.99
},
{
"base_price": 20.99,
"discount_percentage": 0,
"quantity": 1,
"manufacturer": "Oceanavigations",
"tax_amount": 0,
"product_id": 20484,
"category": "Men's Clothing",
"sku": "ZO0296502965",
"taxless_price": 20.99,
"unit_discount_amount": 0,
"min_price": 9.87,
"_id": "sold_product_567543_20484",
"discount_amount": 0,
"created_on": "2016-12-13T16:09:07+00:00",
"product_name": "Jumper - dark grey",
"price": 20.99,
"taxful_price": 20.99,
"base_unit_price": 20.99
}
],
"sku": [
"ZO0608106081",
"ZO0296502965"
],
"taxful_total_price": 45.98,
"taxless_total_price": 45.98,
"total_quantity": 2,
"total_unique_products": 2,
"type": "order",
"user": "marwan",
"geoip": {
"country_iso_code": "MA",
"location": {
"lon": -8,
"lat": 31.6
},
"region_name": "Marrakech-Tensift-Al Haouz",
"continent_name": "Africa",
"city_name": "Marrakesh"
},
"event": {
"dataset": "sample_ecommerce"
}
},
"fields": {
"order_date": [
"2025-06-03T16:09:07.000Z"
],
"products.created_on": [
"2016-12-13T16:09:07.000Z",
"2016-12-13T16:09:07.000Z"
]
}
}
3.字段业务含义分析
3.1 订单基础信息
字段名 | 类型 | 业务含义 | 示例值分析 |
---|---|---|---|
order_id | 数值 | 订单唯一编号 | 567543(6 位数字 ID) |
customer_id | 数值 | 客户唯一标识 | 51(数值型 ID) |
customer_first_name | keyword | 客户名字 | “Marwan” |
customer_last_name | keyword | 客户姓氏 | “Sharp” |
customer_full_name | text | 客户全名 | “Marwan Sharp” |
customer_gender | keyword | 客户性别 | “MALE”(新版改为全大写) |
customer_phone | keyword | 联系电话 | 空值(表示未提供) |
email | keyword | 电子邮箱 | “marwan@sharp-family.zzz” |
user | keyword | 用户名 | “marwan”(可能为登录账号) |
3.2 时间信息
字段名 | 类型 | 业务含义 | 示例值分析 |
---|---|---|---|
order_date | date | 订单时间 | “2025-06-03T16:09:07+00:00”(UTC 时间) |
day_of_week | keyword | 星期几 | “Tuesday” |
day_of_week_i | integer | 星期数字 | 1(0=周日,1=周一,依此类推) |
products.created_on | date | 商品创建时间 | “2016-12-13T16:09:07+00:00”(早于订单日期) |
3.3 商品信息(嵌套对象)
字段名 | 类型 | 业务含义 | 示例值分析 |
---|---|---|---|
products.product_id | 数值 | 商品ID | 14075, 20484 |
products.product_name | text | 商品名称 | “Rucksack - black”(黑色背包) |
products.category | keyword | 商品类别 | “Men’s Accessories” |
products.sku | keyword | 库存单位 | “ZO0608106081”(商品编码) |
products.price | float | 实际售价 | 24.99(欧元) |
products.base_price | float | 基础价格 | 24.99(与售价相同,无折扣) |
products.quantity | integer | 购买数量 | 1(每件商品数量) |
products.tax_amount | float | 税额 | 0(免税) |
products.taxful_price | float | 含税价 | 24.99(与不含税价相同) |
products.taxless_price | float | 不含税价 | 24.99 |
products.discount_* 相关字段 | float | 折扣信息 | 全部为 0(无折扣) |
products.min_price | float | 最低价格 | 12.74(可能为历史最低价) |
products.manufacturer | keyword | 制造商 | “Elitelligence” |
3.4 订单汇总信息
字段名 | 类型 | 业务含义 | 示例值分析 |
---|---|---|---|
category | array | 订单包含的所有商品类别 | [“Men’s Accessories”, “Men’s Clothing”] |
manufacturer | array | 所有商品的制造商 | [“Elitelligence”, “Oceanavigations”] |
sku | array | 所有商品SKU | [“ZO0608106081”, “ZO0296502965”] |
taxful_total_price | float | 订单总金额(含税) | 45.98 EUR(24.99+20.99) |
taxless_total_price | float | 订单总金额(不含税) | 45.98 EUR |
total_quantity | integer | 商品总件数 | 2(两件商品) |
total_unique_products | integer | 唯一商品种类数 | 2(两种不同商品) |
currency | keyword | 货币类型 | “EUR”(欧元) |
type | keyword | 订单类型 | “order”(标准订单) |
3.5 地理位置信息
字段名 | 类型 | 业务含义 | 示例值分析 |
---|---|---|---|
geoip.country_iso_code | keyword | 国家代码 | “MA”(摩洛哥) |
geoip.location | geo_point | 经纬度 | lon: -8, lat: 31.6 |
geoip.region_name | keyword | 地区名称 | “Marrakech-Tensift-Al Haouz” |
geoip.continent_name | keyword | 大洲名称 | “Africa” |
geoip.city_name | keyword | 城市名称 | “Marrakesh”(马拉喀什) |
3.6 事件元数据
字段名 | 类型 | 业务含义 | 示例值分析 |
---|---|---|---|
event.dataset | keyword | 数据集来源 | “sample_ecommerce”(标识为示例数据) |
4.典型业务分析场景
4.1 销售分析
- 按时间(天、周、月)分析销售额
- 热销商品和类别分析
- 平均订单价值(AOV)分析
- 哪些商品经常被一起购买
4.2 客户分析
- 客户地域分布
- 客户性别购买偏好
- 高价值客户识别
- 客户购买频率、偏好品类、客单价等
4.3 库存分析
- 商品销售数量排行
- 商品周转率分析
4.4 地理分析
- 销售热点区域
- 区域销售对比
- 不同地区的销售偏好
5.实战分析
5.1 查询 Marwan Sharp 客户的所有购买记录
要查询特定客户的所有购买记录,可以使用 Elasticsearch 的 term
查询或 match
查询来匹配客户全名字段。以下是几种查询方式:
5.1.1 精确匹配查询(使用 term)
GET kibana_sample_data_ecommerce/_search
{
"query": {
"term": {
"customer_full_name.keyword": {
"value": "Marwan Sharp"
}
}
}
}
5.1.2 文本匹配查询(使用 match)
GET kibana_sample_data_ecommerce/_search
{
"query": {
"match": {
"customer_full_name": "Marwan Sharp"
}
}
}
5.1.3 组合查询 (使用客户 ID 和姓名)
GET kibana_sample_data_ecommerce/_search
{
"query": {
"bool": {
"must": [
{ "term": { "customer_id": 51 }},
{ "term": { "customer_full_name.keyword": "Marwan Sharp" }}
]
}
}
}
5.1.4 包含排序的查询(按订单日期降序)
GET kibana_sample_data_ecommerce/_search
{
"query": {
"term": {
"customer_full_name.keyword": {
"value": "Marwan Sharp"
}
}
},
"sort": [
{
"order_date": {
"order": "desc"
}
}
]
}
5.1.5 只返回特定字段的查询
GET kibana_sample_data_ecommerce/_search
{
"query": {
"term": {
"customer_full_name.keyword": {
"value": "Marwan Sharp"
}
}
},
"_source": ["order_id", "order_date", "taxful_total_price", "products.product_name"]
}
查询说明
term
vsmatch
term
用于精确值匹配,对 keyword 类型字段效率更高。match
会对文本进行分析,适合 text 类型字段。.keyword
子字段
- 当字段是 text 类型时(如 customer_full_name),使用
.keyword
子字段进行精确匹配。- 如果直接映射为 keyword 类型,则不需要加
.keyword
。- 性能考虑
- 使用
customer_id
(数值型)查询通常比姓名查询更快。- 如果经常按客户查询,可以考虑在
customer_id
字段上添加索引。- 分页处理
- 对于大量结果,可以添加
"from": 0, "size": 10
参数进行分页。
5.2 统计国家为 MA 的不同性别客户数量
要统计国家代码为 MA
(摩洛哥)的不同性别客户数量,可以使用 Elasticsearch 的聚合(aggregation
)功能。以下是几种查询方式:
5.2.1 基本聚合查询
GET kibana_sample_data_ecommerce/_search
{
"size": 0, // 不返回具体文档,只返回聚合结果
"query": {
"term": {
"geoip.country_iso_code": "MA"
}
},
"aggs": {
"genders": {
"terms": {
"field": "customer_gender",
"size": 10 // 返回所有可能的性别分类
}
}
}
}
5.2.2 包含去重客户数的精确统计
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"geoip.country_iso_code": "MA"
}
},
"aggs": {
"unique_customers": {
"cardinality": {
"field": "customer_id"
}
},
"genders": {
"terms": {
"field": "customer_gender",
"size": 10
},
"aggs": {
"unique_customers_per_gender": {
"cardinality": {
"field": "customer_id"
}
}
}
}
}
}
- 去重统计:使用
cardinality
聚合可以统计唯一客户数,避免同一客户的多次购买被重复计算。- 性能优化:对于大数据集,可以在
cardinality
聚合中添加"precision_threshold": 1000
参数平衡精度和性能。
5.2.3 包含性别和购买金额的复合统计
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"query": {
"term": {
"geoip.country_iso_code": "MA"
}
},
"aggs": {
"genders": {
"terms": {
"field": "customer_gender",
"size": 10
},
"aggs": {
"total_sales": {
"sum": {
"field": "taxful_total_price"
}
},
"avg_order_value": {
"avg": {
"field": "taxful_total_price"
}
}
}
}
}
}
以上查询可以帮助您了解 MA 国家客户的性别分布情况,以及不同性别客户的购买行为差异。