以统计学上的确定性发现某种情况是否会影响结果

111 阅读7分钟

[

Kat Hernandez

](medium.com/@kathleen.m…)

凯特-埃尔南德斯(Kat Hernandez

关注

5月22日

-

6分钟阅读

[

拯救

](medium.com/m/signin?ac…)

用统计学上的确定性来寻找一个条件是否影响到结果

Chi-Square测试的分解

上周我介绍了一个虚构的场景,我是一个与数据科学家合作的分析师。我的公司的利益相关者希望知道在哪里开一家新的餐厅是最好的位置。

对于大多数利益相关者来说,通常一个统计问题会引起他们对另一个问题的思考。因此,让我们用我虚构的场景,当我和数据科学家一起建立预测模型,寻找开餐馆的最佳地点时,一个利益相关者发送了这封电子邮件。

在美国以外的地方开一家餐厅的成本要高得多。根据我们的谈话,以及你目前在数据中看到的情况,是否有强烈的理由将我们的努力集中在美国以外的地区?

照片:Osman RanaonUnsplash

让我们来解开这个问题。在你所参与的对话中,利益相关者认为特定餐厅的评级是餐厅成功的关键。使用评级作为我们的成功因素,我们希望衡量是否有足够的统计证据表明位于美国的餐厅的状况比任何国际公司都要好。输入:Chi Square Test。

什么是Chi-Square测试?

芝方检验是一种统计检验,即给定一个特定的条件,在上述条件存在的情况下,预期的结果是否会变化到一个统计学意义的水平。该测试根据基本概率将实际结果与预期结果进行比较。在这个测试的实例中,我们希望测量。

H0:位于美国的餐厅与餐厅是否受到好评无关。

哈:位于美国的餐馆与一家餐馆是否受到好评有关系。

这个测试的第一步是分割你的数据集。我使用的是Zomato的数据集,在综合评分中发现了许多缺失的值,我正在删除这些值以使数据集正常化。我按国家代码分割数据集,并绘制每个国家的直方图以确定其正常性。

import pandas as pd import numpy as npimport seaborn as snsdf=pd.read_csv('zomato.csv')

美国综合评级的直方图

international=df.drop(df.index[df['Country Code'].isin([216])])international_histogram=sns.histplot(x='Aggregate rating', data=international)

国际综合评级的直方图

在去除使数据倾斜的缺失值后,我们将数据分成两个数据框架,一个只包括美国的评级,另一个包括除美国以外的所有评级。从这些直方图中,我们可以观察到自然的Bins或分组的数据排列方式。我们利用这些分组,在两个数据框架内创建一个新的系列,将这些评级组的每一个分组分为三个类别。

conditions=[    (us['Aggregate rating']<2.7),    (us['Aggregate rating']>4.0),    (us['Aggregate rating']<4)]values=['poor', 'fair', 'good']us['rating bin']=np.select(conditions, values)

在这三个类别中,我们现在通过对评级进行分门别类来创建一个计数,即在美国境内和境外有多少家评级为 "差"、"一般 "和 "好 "的餐厅。

international_rating_count=(international['rating bin'].value_counts())us_rating_count=(us['rating bin'].value_counts())

这两项统计显示,美国境内的公平、良好和差的评级总数分别为215,182和2个评级。此外,国际评级的数值统计显示,我有899个一般评级,5350个好评级和485个差评级。我创建了一个表格,将这些结果显示为实际结果。

arrays_ACTUAL=pd.DataFrame({'rating':['fair', 'good', 'poor'],                   'United States':[215,182,2] ,                     'International':[5350,899,485]})     arrays_ACTUAL.set_index(['rating'])arrays_ACTUAL['rating total']=arrays_ACTUAL['United States']+arrays_ACTUAL['International']arrays_ACTUAL.loc[len(arrays_ACTUAL.index)]=['column_total', 431,6968, 7133]arrays_ACTUAL

国际和美国评级的实际总评分

在上表中,我使用了我九年级时的老式TI-83计算器来得出列和行的总数,因为这些数值对Chi Square测试是至关重要的。此外,在这个测试中,我们希望为每种情况创建概率。这些概率构成了预期部分。

下一步是计算期望值表。在创建这个表格时,我们使用了一些可以追溯到比我大一代数课更早的材料。Python不包括一个预期结果包,有时基础知识是最好的。对于实际结果中的每一块瓷砖,我们需要计算每种情况下的单独概率。

手工计算每个预期结果的概率

举个例子,要计算一个评级是公平的概率**,而**US=

((美国和公平评级的总数)*(公平评级的总数))/评级的总数。

在这种情况下,431个基于美国的公平评级被乘以两个数据集中的5565个公平评级。这个相乘的数字被除以评级总数,即7133。这样,我们的预期评级数为336.26。从这些计算中,我们可以建立以下的预期评级表。

arrays_EXPECTED=pd.DataFrame({'rating':['fair', 'good', 'poor'],                   'United States':[336,65,29] ,                     'International':[5436,1056,475]})     arrays_EXPECTED.set_index(['rating'])arrays_EXPECTED['rating total']=arrays_EXPECTED['United States']+arrays_EXPECTED['International']arrays_EXPECTED.loc[len(arrays_EXPECTED.index)]=['column_total', 431,6968, 7133]

国际和美国的预期总评分

为了找到Chi Square,我们必须对每一种情况进行以下总结。

X²=∑(实际-预期)²/预期

和自由度,它们是

自由度=(CountofRows-1)(CountofColumns-1)

我们的计算结果见下文。

Chi-Test/X²计算。美国餐厅与国际餐厅的总体评级的预期与实际观察结果

我们有一个303的Chi Test值和两个自由度。这个测试的p值决定了我们对两组数值之间的差异的信心。在最后一步,我们再次使用python来推导p值。

from scipy import stats1-stats.chi2.cdf(303,2)

我个人不喜欢用python的方法来求p值,事实上我最初是用宾夕法尼亚州立大学统计500课本附录部分的表格来求p值的。作为参考,我使用的表格与这个表格中的数值是一致的。

在商业统计中,使用一个你可以辩护的方法和正确解释你的结论一样重要。我在不到3年前完成了宾夕法尼亚州立大学的研究生课程。我在统计学501、502和503中所学的大部分内容都是手工计算的。这使我能够真正理解我所理解的统计学所做的决定。

但回到我的整个虚构的故事,为什么首先要问这个问题。以下是我对这封邮件的回应。

你问了一个很好的问题。根据谈话,我把评级作为决定因素,以确定一家餐厅在美国和国际上是否更受欢迎。当我画出国际评级与美国评级的分布情况的视觉图时,你可以看到。

在这里,我们可以看到大多数美国的综合评分都比国际综合评分高。这些信息给了我进行统计测试的理由。我想了解美国的餐厅是否有统计学意义上的高评价。我进行了所谓的Chi Squared测试。这个测试使用基本概率来比较两组结果。从这个测试中,我发现在合理的怀疑范围内,美国的餐馆总体上比他们的国际同行更受好评。

基于这些发现,我建议我们把搜索的重点放在美国的地方。

参考。

8.1 - 独立性的Chi-Square Test | STAT 500 (psu.edu)

EDA-Zomato/Zomato EDA at main - Adesh2021/EDA-Zomato (github.com)

应用线性统计模型》, Michael H. Kutner,国际版,2005。McGraw-Hill Publishing, Inc.