在数据分析中,我们经常需要回答一个问题:"这两个数据集之间的差异有多大?"这个问题看似简单,但实际上涉及很多统计学的概念和方法。仅仅看到两个数字不同是不够的,我们需要判断这种差异是否具有统计意义,是否可能是随机波动导致的,还是真正反映了某种规律。 在这节课中,我们将学习如何系统地比较不同数据集,理解统计显著性的概念,并掌握一些基础的统计检验方法。

在开始比较不同数据集之前,我们需要先理解一些基础的统计概念。这些概念不仅帮助我们描述数据,更重要的是帮助我们理解数据的变异性,从而判断差异是否显著。
平均数(Mean)是我们最熟悉的统计量,它代表了数据的"中心位置"。计算平均数很简单,就是把所有数值加起来,然后除以数值的个数。
在SQL中,我们可以使用AVG函数来计算平均数:
|SELECT AVG(订单金额) AS 平均订单金额 FROM 订单表;
假设我们执行这个查询,得到的结果是:
这个查询返回所有订单金额的平均值。但是,仅仅知道平均值是不够的。假设我们有两个销售团队,团队A的平均销售额是10000元,团队B的平均销售额是10500元。这两个数字确实不同,但这种差异是否显著呢?要回答这个问题,我们需要了解数据的变异性。
方差(Variance)和标准差(Standard Deviation)是衡量数据分散程度的重要指标。如果数据的标准差很小,说明数据比较集中,平均值能够很好地代表整体;如果标准差很大,说明数据比较分散,平均值可能不够有代表性。
方差是每个数据点与平均值之差的平方的平均值。标准差是方差的平方根,它的单位与原始数据相同,更容易理解。
在SQL中,我们可以使用VAR_POP或VAR_SAMP函数来计算方差,使用STDDEV_POP或STDDEV_SAMP函数来计算标准差:
|SELECT AVG(订单金额) AS 平均金额, STDDEV_POP(订单金额) AS 标准差, VAR_POP(订单金额)
假设我们执行这个查询,可能得到如下结果:
这个查询同时返回平均值、标准差和方差。标准差越大,说明订单金额的波动越大;标准差越小,说明订单金额比较稳定。从上面的结果可以看到,平均订单金额是10250元,标准差是2450.50元,这意味着大部分订单金额会在10250 ± 2450.50元的范围内。
在统计学中,正态分布(Normal Distribution)是一个非常重要的概念。如果数据符合正态分布,那么大约68%的数据会落在平均值加减一个标准差的范围内,大约95%的数据会落在平均值加减两个标准差的范围内,大约99.7%的数据会落在平均值加减三个标准差的范围内。
这个规律帮助我们理解数据的分布特征。如果我们的数据大致符合正态分布,我们就可以用平均值和标准差来描述数据的特征,并基于这些特征进行统计推断。
让我们通过一个图表来直观地理解正态分布。假设我们的订单金额数据符合正态分布,平均值为10000元,标准差为2000元,那么数据的分布会呈现如下特征:
从图表中可以看到,正态分布呈现钟形曲线,中心位置是平均值。大约68%的数据会落在平均值±1个标准差的范围内(8000-12000元),大约95%的数据会落在平均值±2个标准差的范围内(6000-14000元)。
虽然正态分布在统计学中非常重要,但在实际工作中,很多数据并不完全符合正态分布。我们需要根据实际情况选择合适的统计方法。
在实际工作中,我们往往无法获取全部数据,只能从总体中抽取一部分样本进行分析。采样(Sampling)就是从总体中选择一部分数据的过程。
采样的关键是要保证样本具有代表性,能够反映总体的特征。如果采样方法不当,样本可能会产生偏差,导致分析结果不准确。
在SQL中,我们可以使用随机采样来获取样本:
|SELECT * FROM 订单表 ORDER BY RANDOM() LIMIT 1000;
这个查询随机选择1000条订单记录。RANDOM()函数生成随机数,ORDER BY RANDOM()将记录随机排序,LIMIT 1000只取前1000条。
当我们有了两个数据集,想要比较它们之间的差异时,我们不仅要看数字上的差异,还要判断这种差异是否具有统计意义。
最直接的比较方法是计算两个数据集的平均值,然后看它们的差异:
|SELECT '团队A' AS 团队, AVG(订单金额) AS 平均金额, COUNT(*) AS 订单数 FROM 订单表 WHERE 团队 = 'A' UNION ALL SELECT '团队B' AS 团队, AVG(订单金额) AS 平均金额, COUNT(*) AS 订单数 FROM 订单表
假设我们执行这个查询,可能得到如下结果:
这个查询分别计算两个团队的平均订单金额。从结果可以看到,团队A的平均金额是10000元,团队B的平均金额是10500元,差异是500元。但是,这500元的差异是否显著呢?
要回答这个问题,我们需要考虑数据的变异性。如果两个团队的数据标准差都很小,那么500元的差异可能是显著的;如果标准差很大,那么500元的差异可能只是随机波动。
我们可以同时计算平均值和标准差,然后比较:
|SELECT 团队, AVG(订单金额) AS 平均金额, STDDEV_POP(订单金额) AS 标准差, COUNT(*) AS 订单数 FROM 订单表 WHERE 团队 IN ('A', 'B') GROUP BY 团队;
假设我们执行这个查询,可能得到如下结果:
这个查询返回每个团队的平均金额、标准差和订单数。从结果可以看到,团队A的平均金额是10000元,标准差是2500元;团队B的平均金额是10500元,标准差是2800元。两个平均值之间的差异(500元)相对于标准差来说比较小,这个差异可能只是随机波动,但我们需要更严格的统计检验来确认。
在实际分析中,我们经常需要从多个维度进行比较。比如,我们想要了解不同月份、不同产品类型、不同支付方式下的销售情况。
|SELECT 月份, 产品类型, 支付方式, AVG(订单金额) AS 平均金额, COUNT(*) AS 订单数 FROM 订单表 GROUP BY 月份, 产品类型, 支付方式 ORDER BY 月份, 产品类型, 支付方式;
这个查询按照月份、产品类型和支付方式三个维度进行分组,计算每个组合的平均订单金额。通过比较不同组合的数值,我们能够发现一些规律,比如某些月份某些产品类型的销售额特别高,或者某些支付方式下的订单金额特别大。
但是,这种比较仍然是描述性的。要判断差异是否具有统计意义,我们需要进行更严格的统计检验。
比例(Ratio)是数据分析中非常有用的工具。通过计算比例,我们能够消除绝对数值的影响,专注于相对关系。
假设我们想要比较不同产品类别的销售占比:
|SELECT 产品类别, COUNT(*) AS 订单数, SUM(订单金额) AS 总金额, ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM 订单表), 2) AS 订单占比, ROUND(SUM(订单金额) * 100.
假设我们执行这个查询,可能得到如下结果:
这个查询计算每个产品类别的订单数和总金额,以及它们占总数的比例。通过查看比例,我们能够更清楚地了解各个类别的相对重要性。从结果可以看到,电子产品虽然订单数占比35.71%,但金额占比达到38.46%,说明电子产品的平均订单金额较高。
比例还可以用来计算增长率。比如,我们想要了解每个月的销售额相对于上个月的增长率:
|WITH 月度销售 AS ( SELECT 月份, SUM(订单金额) AS 月度总金额 FROM 订单表 GROUP BY 月份 ), 月度对比 AS ( SELECT m1.月份 AS 当前月, m1.月度总金额 AS 当前月金额, m2.月度总金额 AS 上月金额, ROUND((m1
假设我们执行这个查询,可能得到如下结果:
这个查询使用CTE来逐步计算。首先,月度销售CTE计算每个月的总销售额;然后,月度对比CTE将当前月与上个月进行对比,计算增长率。增长率能够帮助我们识别销售趋势,发现哪些月份增长较快,哪些月份可能出现下降。
从结果可以看到,2月和3月都有5%的增长,4月出现了-2.38%的下降,5月和6月又恢复了增长:
当我们使用比例进行比较时,我们需要考虑比例的标准误差(Standard Error)。标准误差反映了比例的可靠性,样本量越大,标准误差越小,比例越可靠。
在SQL中计算比例的标准误差稍微复杂一些,因为需要用到平方根函数:
|SELECT 产品类别, COUNT(*) AS 订单数, ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM 订单表), 2) AS 订单占比, ROUND(SQRT(COUNT(*) * 100.
这个查询计算每个产品类别的订单占比及其标准误差。标准误差帮助我们理解比例的可靠性,如果标准误差很大,说明这个比例可能不够稳定。
当我们想要判断两个类别变量之间是否存在关联时,卡方检验(Chi-Square Test)是一个非常有用的工具。比如,我们想要知道产品类型和支付方式之间是否存在关联,或者地区偏好和产品类别之间是否存在关联。
进行卡方检验的第一步是构建交叉表(Contingency Table),也就是将两个类别变量的所有组合都列出来,统计每个组合的频数。
|SELECT 产品类型, SUM(CASE WHEN 支付方式 = '信用卡' THEN 1 ELSE 0 END) AS 信用卡, SUM(CASE WHEN 支付方式 = '支付宝' THEN 1 ELSE 0 END) AS 支付宝, SUM(CASE WHEN 支付方式 = '微信支付' THEN 1 ELSE
假设我们执行这个查询,可能得到如下结果:
这个查询构建了一个交叉表,展示了不同产品类型下各种支付方式的使用次数。通过查看这个表,我们能够初步判断是否存在某种关联,比如某些产品类型更倾向于使用某种支付方式。
从结果可以看到,电子产品更倾向于使用支付宝(520次),而服装类产品在三种支付方式上分布相对均匀。
卡方检验的核心思想是比较观察频数(Observed Frequency)和期望频数(Expected Frequency)。如果两个变量之间没有关联,那么每个组合的期望频数应该等于行总数乘以列总数再除以总样本数。
在SQL中计算期望频数需要一些技巧:
|WITH 观察频数 AS ( SELECT 产品类型, 支付方式, COUNT(*) AS 观察值 FROM 订单表 GROUP BY 产品类型, 支付方式 ), 行总计 AS ( SELECT 产品类型, COUNT(*) AS 行总数 FROM 订单表 GROUP BY 产品类型 ), 列总计 AS (
假设我们执行这个查询,可能得到如下结果(部分数据):
这个查询使用多个CTE来逐步计算。首先,观察频数CTE统计每个组合的实际出现次数;然后,行总计和列总计CTE分别计算每行和每列的总数;最后,主查询计算每个组合的期望频数。
从结果可以看到,观察值和期望值之间存在差异。比如电子产品使用信用卡的观察值是450,期望值是410.71,说明电子产品使用信用卡的频率高于预期。这些差异将用于计算卡方统计量。
卡方统计量的计算公式是:对每个组合,计算(观察值-期望值)的平方除以期望值,然后将所有组合的结果相加。
|WITH 观察频数 AS ( SELECT 产品类型, 支付方式, COUNT(*) AS 观察值 FROM 订单表 GROUP BY 产品类型, 支付方式 ), 行总计 AS ( SELECT 产品类型, COUNT(*) AS 行总数 FROM 订单表 GROUP BY 产品类型 ), 列总计 AS ( SELECT 支付方式, COUNT(
假设我们执行这个查询,可能得到如下结果:
这个查询计算了卡方统计量。卡方统计量越大,说明观察频数和期望频数之间的差异越大,两个变量之间存在关联的可能性越大。从结果可以看到,卡方统计量是45.23,这个值需要与卡方分布表进行比较,或者使用Excel的CHISQ.TEST函数来计算p值,以判断产品类型和支付方式之间是否存在显著关联。
虽然我们可以在SQL中计算卡方统计量,但要进行完整的卡方检验(包括计算p值),使用Excel会更加方便。
首先,我们将SQL查询的结果导出到Excel,构建交叉表。然后,我们可以使用Excel的CHISQ.TEST函数来进行卡方检验。这个函数需要两个参数:观察频数区域和期望频数区域。
在Excel中,我们可以先计算期望频数,然后使用CHISQ.TEST函数:
|=CHISQ.TEST(观察频数区域, 期望频数区域)
这个函数返回p值。如果p值小于0.05(通常的显著性水平),我们可以认为两个变量之间存在显著的关联。
卡方检验要求每个单元格的期望频数至少为5。如果某些单元格的期望频数太小,卡方检验的结果可能不够可靠。在这种情况下,我们可能需要合并某些类别,或者使用其他统计方法。
在实际工作中,SQL和Excel各有优势。SQL擅长处理大量数据和复杂的查询,Excel擅长可视化和统计分析。将两者结合使用,能够发挥各自的优势。
我们可以在SQL中进行数据清洗、筛选、聚合等操作,准备好用于统计分析的数据:
|SELECT 产品类型, 支付方式, COUNT(*) AS 订单数, AVG(订单金额) AS 平均金额 FROM 订单表 WHERE 订单日期 >= '2024-01-01' GROUP BY 产品类型, 支付方式 ORDER BY 产品类型, 支付方式;
假设我们执行这个查询,可能得到如下结果(部分数据):
这个查询筛选了2024年1月1日之后的订单,按照产品类型和支付方式分组,计算了订单数和平均金额。这些数据可以直接导出到Excel进行进一步分析。从结果可以看到,不同产品类型和支付方式组合下的平均订单金额存在差异,这些差异可以通过统计检验来判断是否显著。
在Excel中,我们可以使用各种统计函数来进行更深入的分析。除了卡方检验,我们还可以进行t检验(比较两个样本的平均值)、方差分析(比较多个样本的平均值)等。
对于t检验,Excel提供了T.TEST函数:
|=T.TEST(数组1, 数组2, 尾数, 类型)
这个函数比较两个数组的平均值,返回p值。如果p值小于0.05,我们可以认为两个样本的平均值存在显著差异。
我们可以将SQL查询的结果和Excel的统计分析结合起来,创建一份完整的统计报告。报告中应该包括数据的基本描述、统计检验的结果、以及对这些结果的解释。
在创建报告时,我们应该清楚地说明我们使用了什么统计方法,为什么选择这些方法,以及结果的含义。这样,读者才能够理解我们的分析过程,并对结果有信心。
这节课我们用通俗的方法学会比较数据,理解统计显著性,并掌握基础的统计检验。当我们看到两个数据有差异时,不能光看表面,还要用合适的统计方法判断这种差别是不是“有意义”。 像平均数、标准差这些基础概念,不仅帮我们描述数据,还能帮助我们选对分析方法。比例在分析时也很常用,它能帮助我们从相对关系来看问题,但要注意比例的波动和可靠性。像卡方检验这样的统计工具,可以判断两个类别变量之间是否真的有关联。
实际分析时,最重要的是根据不同情况选择对的方法,同时注意样本数量对结果的影响。样本少,结论可能不靠谱;样本很多,哪怕很小的差异也容易变得“显著”。此外,统计上显著不代表业务上重要,理解结果时还要结合实际业务场景,不能盲目相信统计数字。
统计检验帮助我们判断差异是否显著,但最终的判断还需要结合业务知识和实际经验。数据告诉我们"是什么",但"为什么"和"怎么办"需要我们的专业判断。
在下节课,我们将学习如何分析"发生在哪里",探索地理和位置数据在商业分析中的重要性。这将帮助我们理解位置因素如何影响业务表现,并学会使用SQL和Excel进行地域分析。