轻松学习SQL数据分析:在实战中学习SQL数据分析,轻松应对学习、工作
案例一:零食商铺销售分析
【项目背景】
本次项目旨在深入分析2023年下半年(7月1日至12月31日)某平台上综合性零食的销售数据,以支持平台在2023年针对这一热门品类的广告投放策略。通过对购买人数、不同店铺表现及具体商品销售数据的全面研究,我们期望能够揭示综合性零食的整体销售趋势、价格区间分布以及消费者的地域偏好。
具体来说,我们的分析将聚焦于以下几个关键方面:
- 整体销售数据分析:首先,我们将统计综合性零食在2023年下半年的总销售额、销售量及购买人次,从而掌握该类商品的整体市场热度与增长态势。
- 价格区间研究:进一步,我们将分析不同价格区间的综合性零食销售情况,了解哪些价格段的商品更受消费者青睐,为平台定价策略提供参考。
- 地域偏好分析:此外,我们还将深入研究综合性零食消费者的地域分布情况,揭示不同地域消费者的购买习惯、需求特点,从而指导平台在不同地区投放更为精准的广告内容。
通过以上分析,我们将为平台提供详尽的数据支持和策略建议,助力其在2021年针对综合性零食品类制定更为精准有效的广告投放策略,进一步提升品牌影响力和市场竞争力。
【数据集介绍】
下表展示了一个示例数据集,其中包含了关于综合性零食在不同店铺的销售信息。**请注意,这些数据是虚拟的,但旨在提供一个清晰的数据结构参考。**以下是数据集中关键字段的详细描述:商品名称、店铺名称、价格、购买人数、买家地址。
综合性零食店铺销售数据
【经营分析】
1.分析平台售卖综合性零食的店铺数、总销售额、商品种类数、总购买人数等
为了获取店铺数、总销售额、商品种类数以及总购买人数等关键统计数量,我们需要利用SQL的汇总函数,并确保在统计过程中去除重复数据。使用DISTINCT
关键字可以有效地处理重复数据。
对于销售额的计算,由于在本案例中每人每次只购买一件商品,因此销售额可以通过将每件商品的价格(价格
字段)与购买人数(购买人数
字段,此处实际上代表销售数量)相乘得出。
SELECT
COUNT(DISTINCT shop_name) AS "店铺数",
COUNT(DISTINCT product_name) AS "商品种类数",
CONCAT(ROUND(SUM(price * purchase_count) / 10000, 2), '万元') AS "总销售额",
CONCAT(ROUND(SUM(purchase_count) / 10000, 2), '万人') AS "总购买人数"
FROM
snack_sales_data
查询结果:
分析结论:
平台综合性零食市场活跃,拥有1425家店铺,4156种商品,总销售额达到30353.34万元,吸引了701.49万消费者购买。市场竞争激烈,消费者需求旺盛。
2.找出销售额排名前10的店铺,并明确其购买人数、销售额
为了找出销售额排名前10的店铺,并明确其购买人数、销售额,我们可以按照以下步骤进行操作:
(1) 确定每个店铺的购买人数与销售额
首先,我们需要按照店铺名称对数据进行分组(GROUP BY 店铺名称
),并计算每个店铺的总销售额。销售额可以通过将每个商品的销售单价(价格)与相应的购买人数相乘,然后再对所有商品进行求和得出(SUM(价格 * 购买人数)
)。同时,我们也可以统计出每个店铺的总购买人数(SUM(购买人数)
)。
(2) 找出销售额排名前10的店铺
在得到每个店铺的销售额之后,我们需要对这些店铺按照销售额从高到低进行排序(ORDER BY SUM(价格 * 购买人数) DESC
)。然后,使用LIMIT 10
来限制返回结果的行数,从而得到销售额排名前10的店铺。
结合以上步骤,我们可以构建如下的SQL查询语句:
SELECT
shop_name,
ROUND(SUM(price * purchase_count) / 10000, 2) AS 总销售额_万元,
SUM(purchase_count) AS 总购买人数
FROM
snack_sales_data
GROUP BY
shop_name
ORDER BY
总销售额_万元 DESC
LIMIT 10;
这个查询将返回销售额排名前10的店铺的店铺名称、总销售额(以万元为单位,并保留两位小数)以及总购买人数。ROUND(SUM(价格 * 购买人数) / 10000, 2)
确保了销售额被正确地转换为万元,并四舍五入到小数点后两位。
查询结果:
图表分析:
分析结论:
“零嘴小筑”以5953.31万元高居销售额榜首,领先第二名“悠享食光”近2.2倍,更是第三名“零食驿站”的7.8倍。自第四名起,各店铺销售额差距逐渐缩小,市场竞争加剧。
3.找出购买人数排名前10的商品,并明确其购买人数
为了找出购买人数排名前10的商品及其对应的购买人数,我们进行了以下分析:
(1) 汇总每个商品的购买人数:
首先,我们按照商品名称对销售数据进行分组(GROUP BY 商品名称
),然后使用SUM()
函数对每个商品的购买人数进行汇总,从而得到每个商品的总购买人数。
(2) 找出购买人数排名前10的商品:
在得到每个商品的总购买人数后,我们按照购买人数从高到低进行排序(ORDER BY SUM(购买人数) DESC
),并通过LIMIT 10
限制返回结果的行数,从而得到购买人数排名前10的商品及其对应的购买人数。
SELECT
product_name,
SUM(purchase_count) AS 总购买人数
FROM
snack_sales_data
GROUP BY
product_name
ORDER BY
总购买人数 DESC
LIMIT 10;
查询结果:
图表分析:
分析结论:
“预售 悠享济州综合性零食”以650037人的购买量稳居榜首,是第2名的两倍多,显示出消费者对该品牌的强烈偏好。其余前10名商品购买量差距逐渐缩小,市场竞争激烈。
为了探究用户倾向于购买“悠享”品牌综合性零食是否因为其价格较低,我们可以进一步下钻分析,查看“悠享”品牌综合性零食的价格与其他商品的价格对比。在之前的SQL查询基础上,我们可以增加查询字段“价格”,以展示每个商品的价格信息
SELECT
product_name,
SUM(purchase_count) AS 总购买人数,
price
FROM
snack_sales_data
GROUP BY
product_name,price
ORDER BY
总购买人数 DESC
LIMIT 10;
查询结果:
图表分析:
分析结论:
尽管“悠享”品牌的综合性零食每袋价格与“零嘴小筑”品牌相比仅高出1元,在价格上几乎无差异,但其在市场上的购买人数却显著多于“零嘴小筑”,几乎是后者的两倍。这一数据表明,消费者在选择综合性零食时,并非仅受价格因素影响,而是更多地被“悠享”品牌的知名度和品牌效应所吸引。品牌效应在综合性零食市场中的影响力可见一斑。
4.明确综合性零食商品的价格区间是怎么分布的,以及每个区间的占比(按照0~50元,51~100元,101~150元,150元以上区间进行分析)
在解决价格区间分析的问题时,我们可以利用SQL的CASE
表达式来划分价格范围。以价格在0~50元这一区间为例,我们会在CASE
表达式中利用BETWEEN
来明确指定这个价格区间。之后,再利用汇总函数COUNT()
来计算属于这一价格区间的商品数量。
具体而言,CASE
表达式会根据每个商品的价格将其归类到相应的价格区间,而COUNT()
函数则会统计每个区间内的商品数量。这种方法能够清晰地展示不同价格区间的商品分布,帮助我们更好地理解和分析数据。
COUNT(CASE WHEN 价格 BETWEEN 0 AND 50 THEN 1 ELSE NULL END) AS "(0,50)元"
COUNT
函数用于计算表中的行数或非NULL值的数量。当COUNT
函数的参数是某个列时,它会计算该列中非NULL值的数量。如果列中的所有值都是NULL,或者指定的值是NULL,那么COUNT
函数将返回0
。
那么,每个区间的占比如何计算呢?
用上面得到的价格区间的数量除以总的价格计数(count(价格)),就是对应区间的占比。还是以价格在0~50元区间为例,该区间占比如下:
(COUNT(CASE WHEN 价格 BETWEEN 0 AND 50 THEN 1 ELSE NULL END) AS "(0,50)元" / COUNT(价格)) AS "(0,50)占比"
count(price)
用于计算price
列中非NULL值的数量。在这个上下文中,它用于统计某个数据表中所有商品的价格数量。
知道了查询区间(0,50)的SQL语句,那么其他区间也是一样的写法,完整的SQL语句如下:
select
COUNT(CASE WHEN price BETWEEN 0 AND 50 THEN 1 ELSE NULL END) AS "(0,50)元" ,
COUNT(CASE WHEN price BETWEEN 51 AND 100 THEN 1 ELSE NULL END) AS "(51,100)元",
COUNT(CASE WHEN price BETWEEN 101 AND 150 THEN 1 ELSE NULL END) AS "(101,150)元",
COUNT(CASE WHEN price > 150 THEN 1 ELSE NULL END) AS "150以上",
(COUNT(CASE WHEN price BETWEEN 0 AND 50 THEN 1 ELSE NULL END) / COUNT(price)) AS "(0,50)占比",
(COUNT(CASE WHEN price BETWEEN 51 AND 100 THEN 1 ELSE NULL END) / COUNT(price)) AS "(51,100)占比",
(COUNT(CASE WHEN price BETWEEN 101 AND 150 THEN 1 ELSE NULL END) / COUNT(price)) AS "(101,150)占比",
(COUNT(CASE WHEN price > 150 THEN 1 ELSE NULL END) / COUNT(price)) AS "150以上占比"
from
snack_sales_data
查询结果:
第二种查询方式:
-- 查询价格区间的销售数量
SELECT
'(0,50)元' AS 价格区间,
COUNT(*) AS 销售数量
FROM
snack_sales_data
WHERE
price BETWEEN 0 AND 50
UNION ALL
SELECT
'(51,100)元',
COUNT(*)
FROM
snack_sales_data
WHERE
price BETWEEN 51 AND 100
UNION ALL
SELECT
'(101,150)元',
COUNT(*)
FROM
snack_sales_data
WHERE
price BETWEEN 101 AND 150
UNION ALL
SELECT
'150以上',
COUNT(*)
FROM
snack_sales_data
WHERE
price > 150
分析结论:
当我们将商品的价格细分为四个区间时,每个区间的商品种类数及其在整个商品种类中的占比如下:
- (0,50)价格区间的商品种类数达到2134个,这一数字占据了总商品种类数的48.46%。
- 紧接着的(51,100)价格区间内,商品种类数为1343个,占整体商品种类数的30.50%。
综合这两个价格区间,我们可以看到定价低于100元的商品种类数已经占据了约80%的比例,这显示了商品定价策略中较为亲民的价格区间对商品种类多样性的重要贡献。
5.找出综合性零食购买人数最多的前10个地域
(1) 确定每个地域的总购买人数:
我们需要按照买家的地址(地域)进行分组,并对每个地域的购买人数进行汇总。具体来说,我们会使用SQL的GROUP BY
子句来根据买家地址(地域)分组数据,并使用SUM
函数来计算每个地域的总购买人数。
(2) 找出购买人数最多的前10个地域:
在得到每个地域的总购买人数后,我们希望根据这个数量从高到低进行排序,并只选择前10个地域。为此,我们将使用ORDER BY
子句来排序结果,并使用LIMIT
子句来限制返回的记录数。
SELECT
SUM(purchase_count) AS "总购买人数",
buyer_address AS "所在地域"
FROM
snack_sales_data
GROUP BY
buyer_address
ORDER BY
SUM(purchase_count)
DESC
LIMIT 10;
查询结果:
图表分析:
分析结论:
综合性零食购买地域前三名:山东济州以约456万购买人数领跑,浙江嘉兴约66万紧随其后,上海以24万位列第三。
【提出建议】
基于上述详尽的分析结果,结合当前业务场景,我们提出以下建议,为来年的广告投放策略提供参考:
- 聚焦头部店铺:鉴于综合性零食品类竞争激烈但销售额高度集中于头部店铺(前10名占比达43%),我们建议来年加大在这些店铺的广告投放力度,以进一步巩固并扩大其品牌影响力,进而提升销售额占比。
- 优化价格策略:考虑到综合性零食价格与购买意愿的关联,我们建议商家在设置商品价格时,将重点放在0~100元区间内,以迎合消费者的主流购买偏好。在广告投放中,应突出这一价格区间的商品优势,并提供更多针对该价格段的折扣优惠,以激发消费者的购买欲望。
- 拓展市场受众:基于综合性零食买家的地域偏好分析,尽管山东、浙江、上海是目前的主要市场,但仍有拓展空间。建议来年在稳定这些区域市场份额的基础上,通过增加广告投入和营销策略,如价格优惠、增加商品宣传曝光等,吸引更多地域的潜在消费者,从而进一步扩大综合性零食的市场份额。