查看原文
其他

数据科学家须知:统计学中的5个悖论

数据应用学院 大数据应用 2023-08-17

今日份知识你摄入了么?

统计学是数据科学的重要组成部分,为我们提供了分析和理解数据的各种工具和技术。但有时统计结果可能与我们的感知相悖,甚至自相矛盾,导致了混乱和误解。在这篇文章中,我们将探讨每个数据科学家都应该熟悉的五个统计悖论。我们将解释每个悖论是什么,为什么会发生,以及如何避免掉进悖论的陷阱中。



看完文章后,你将对统计分析中可能出现的一些奇怪和意外的结果有更好的了解,并在工作中更好地处理它们。


目录


  1. 准确性悖论(Accuracy Paradox)

  2. 假阳性悖论(False Positive Paradox)

  3. 赌徒谬论(Gambler’s Fallacy)

  4. 辛普森悖论(Simpson’s Paradox)

  5. 伯克森悖论(Berkson’s Paradox)

  6. 结论


1

准确性悖论(Accuracy Paradox)


准确性悖论是指即使模型不具有预测性,也可以实现高度准确的情况。当数据集中的类分布不平衡时,可能会发生这种情况。例如,一个数据集,其中90%的观测值属于一个类,10%属于另一个类,那么,预测所有观测值的多数类的模型将达到90%的准确率,即使它并没有真正预测任何东西。


下面是Python中的一个示例用于说明这个概念:

import numpy as npfrom sklearn.metrics import accuracy_score
# create imbalanced datasety_true = np.array([0] * 900 + [1] * 100)y_pred = np.zeros(1000)
# calculate accuracyaccuracy = accuracy_score(y_true, y_pred)print('Accuracy:', accuracy)


在这个例子中,我们创建了一个不平衡的数据集,一个类中有900个观测值,另一个类中有100个观测值。然后,我们创建一个模型来预测所有观测值的多数类(0)。尽管没有实际预测任何东西,但该模型达到了90%的准确率。


我们可以在医学测试中看到准确性悖论的例子。假设有一种罕见的疾病,其发病率仅为十万分之一。如果创建了一种检测疾病的准确率为99.9%的测试,但将其用于只有0.1%的人患有这种疾病的人群,则该测试将具有99.9%的高准确率。然而,它将导致大量的假阳性,这意味着许多健康人将被错误地诊断为这种疾病。


相比使用准确性评估分类任务,精确度和召回率是更好的选择——这些指标与假阳性悖论有关,我们接着看:


2

假阳性悖论(False Positive Paradox)


当模型的准确性很高,但假阳性率也很高时,就会出现假阳性悖论。换句话说,当大量实例实际上是负的时,模型可以将它们分类为正的。这种悖论会导致错误的结论和决策。


示例:

import pandas as pdimport numpy as np
# Define variablesnormal_count = 9999fraud_count = 1false_positives = 499.95false_negatives = 0
# Calculate precisionprecision = fraud_count / (fraud_count + false_positives)print(f"Precision: {precision:.2f}")
# Calculate recallrecall = fraud_count / (fraud_count + false_negatives)print(f"Recall: {recall:.2f}")
# Calculate accuracytrue_negatives = normal_count - false_positivesaccuracy = (true_negatives + fraud_count) / (normal_count + fraud_count)print(f"Accuracy: {accuracy:.2f}")
Output:Precision: 0.00Recall: 1.00Accuracy: 0.95


我们假设对一种只影响1%人口的疾病进行医学测试。如果其测试的准确率为99%,那么它在99%的情况下都能正确识别疾病的存在与否。然而,如果对1000人进行检测,即使只有1人实际患有这种疾病,也会有10人检测呈阳性。这意味着阳性检测结果更可能是“假”阳性。


下面是产生悖论的Python代码示例:


from sklearn.metrics import confusion_matrixfrom sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegression
# generate a binary classification datasetX, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=42)
# split the dataset into train and test setsX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# train a logistic regression modelmodel = LogisticRegression(random_state=42)model.fit(X_train, y_train)
# predict on test set and get the confusion matrixy_pred = model.predict(X_test)tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
# calculate the accuracy, precision, and recallaccuracy = (tp + tn) / (tp + tn + fp + fn)precision = tp / (tp + fp)recall = tp / (tp + fn)
print(f"Accuracy: {accuracy:.2f}")print(f"Precision: {precision:.2f}")print(f"Recall: {recall:.2f}")
Output:Accuracy: 0.79Precision: 0.82Recall: 0.75


在这种情况下,精确度和召回率是评估模型性能的更好方法。精确度测量所有阳性分类中真阳性的比例,而召回率测量所有实际阳性实例中真阳性的比例。这些措施可以帮助避开产出假阳性悖论,并为模型的性能提供更准确的评估。


3

赌徒谬论(Gambler’s Fallacy)


赌徒谬论,即相信过去的事件可以在随机过程中影响未来事件的概率。例如,在轮盘游戏中,一些玩家认为,如果球连续几次旋转都落在黑色上,那么下一次落在红色上的机会就会更高,尽管结果仍然是随机的。


通过Python示例,我们使用NumPy模块来模拟抛硬币:

import numpy as np
# Simulate flipping a coin 10 timesresults = np.random.randint(0, 2, size=10)print(f"Coin flips: {results}")
# Count the number of consecutive heads or tailsconsecutive = 0for i in range(1, len(results)):    if results[i] == results[i-1]:        consecutive += 1    else:        consecutive = 0
# Print the resultif consecutive > 0:    print(f"Number of consecutive flips: {consecutive + 1}")else:    print("No consecutive flips")
Output:Coin flips: [0 1 0 0 0 0 0 0 1 0]No consecutive flips


在上面的示例中,代码模拟抛硬币10次,然后计算连续正面或反面的数量。赌徒谬论表明,如果连续出现几个正面,那么下一个翻转更有可能是反面,反之亦然。然而,在现实中,每一次抛硬币都是独立的,并且产生正面或反面的机会是均等的。


我们可以在股票市场中看到赌徒谬论的例子。一些投资者可能认为,如果一只股票的价值连续几天持续上涨,那么它更有可能很快下跌,尽管市场走势本质上仍然不可预测,并受到一系列因素的影响。


4

辛普森悖论(Simpson’s Paradox)


辛普森悖论是一种统计现象,即当一个趋势出现在一个小数据集上而数据集被划分为子组时,趋势消失或逆转。如果数据分析不正确,这可能导致错误的结论。


图片来自pexels,作者:Dominik


假设我们想要比较一所大学男女生的录取率,我们有两个部门的数据:部门A和部门B.


男性和女性的录取率示例


在上述表格中,男性和女性的综合录取率为50%。然而,当我们按部门分析数据时,我们看到在每个部门中,女性的录取率都高于男性的录取率。这似乎违反了我们的感知,因为男性的总体录取率更高。


这一悖论的出现是因为每个系的申请人数和录取率都不一样。A系的整体录取率较高,但女性报考者的比例较低。部门B的整体录取率较低,但女性报考者的比例较高。


在Python中,我们可以使用以下代码来演示:


import pandas as pd
# Create a dataframedf = pd.DataFrame({'Department': ['A', 'A', 'B', 'B'],                   'Gender': ['Male', 'Female', 'Male', 'Female'],                   'Applicants': [100, 80, 500, 400],                   'Admitted': [60, 40, 40, 70]})
# Calculate admission ratesdf['Admission Rate'] = df['Admitted'] / df['Applicants'] * 100
# Display the dataframeprint(df)
# Calculate overall admission rateoverall_rate = df['Admitted'].sum() / df['Applicants'].sum() * 100print(f"Overall Admission Rate: {overall_rate:.2f}%")
# Calculate admission rates by department and genderdepartment_rates = df.groupby(['Department', 'Gender'])['Admission Rate'].mean()print(department_rates)
Ouput:  Department  Gender  Applicants  Admitted  Admission Rate0          A    Male         100        60            60.01          A  Female          80        40            50.02          B    Male         500        40             8.03          B  Female         400        70            17.5Overall Admission Rate: 19.44%Department  GenderA           Female    50.0            Male      60.0B           Female    17.5            Male       8.0Name: Admission Rate, dtype: float64


在上面的代码中,我们使用与上表中相同的数据创建了一个dataframe ,然后,我们计算录取率并显示dataframe 。接下来,我们计算整体录取率,即19.44%。最后,我们按部门和性别对数据进行分组,并计算每个亚组的录取率。我们看到,尽管男性的总体录取率更高,但女性在这两个部门的录取率都更高。这,即是辛普森悖论。


5

伯克森悖论(Berkson’s Paradox)


同样作为一种统计现象,伯克森悖论,指其中两个独立或任意变量之间呈现负相关,但当数据被分成亚组时,尽管它们之间没有实际相关性,还是出现了正相关。当两个自变量具有共同的影响或原因,而该影响或原因不包括在分析中时,就会出现这种悖论。


接下来,我们使用IRIS数据集解释这个悖论——先让我们将萼片长度和宽度作为两个变量。我们可以使用PANDAS中的corr()方法计算这两个变量之间的相关系数:


import pandas as pdimport seaborn as sns
iris = sns.load_dataset('iris')
correlation = iris['sepal_length'].corr(iris['sepal_width'])print('Correlation between sepal length and width:', correlation)
Correlation between sepal length and width: -0.11756978413300208


正如我们所看到的,在整个数据集中,萼片长度和宽度之间存在负相关。


然而,如果我们按物种划分数据集,并分别计算每个物种的相关系数,我们可能会得到不同的结果。例如,如果我们只考虑刚毛藻物种,我们会得到一个正相关:


setosa = iris[iris['species'] == 'setosa']correlation_setosa = setosa['sepal_length'].corr(setosa['sepal_width'])print('Correlation between sepal length and width for setosa:', correlation_setosa)
Correlation between sepal length and width for setosa: 0.7425466856651597


这意味着刚毛藻的萼片长度和宽度之间存在正相关,与总体负相关相反。


这一悖论的出现是因为与其他物种相比,刚毛属物种的萼片长度和宽度的数值范围较小。因此,当我们只考虑刚毛藻物种时,整个数据集内的负相关性被刚毛藻物种内的正相关性所掩盖。


结论


总之,理解统计悖论对于数据科学家至关重要,它们可以帮助我们避免数据分析中的常见错误和偏差。


  1. 准确性悖论告诉我们,仅有准确性不足以评估分类任务,精确度和召回率提供的信息更多。

  2. 假阳性悖论强调了理解假阳性成本的重要性。

  3. 赌徒谬论提醒我们,每个事件都是独立的,过去的结果不会影响未来的结果。

  4. 辛普森悖论表明,汇总数据可以模糊变量之间的关系,并导致错误的结论。

  5. 最后,伯克森悖论表明,当从总体中选择非随机样本时,抽样偏差是如何发生的。


统计学中的5个悖论


意识到这些悖论可以帮助数据科学家在工作中做出更准确、更明智的决策。

原文作者:Simranjeet Singh

翻译作者:高佑兮

美工编辑:过儿

校对审稿:Chuang

原文链接:https://medium.com/@simranjeetsingh1497/5-paradoxes-in-statistics-every-data-scientist-should-be-familiar-with-478b74310099

本周公开课预告


往期精彩回顾


USDC稳定币破发,硅谷银行倒闭引发加密市场大动荡

数据科学家订阅ChatGPT三周体验:每天节省3小时工作时间!

保姆级指南:如何利用OpenAI和Python让你的简历更出彩!

Pandas的秘密:5个鲜为人知的功能,将彻底改变你的数据分析技能

ChatGPT带你掌握高效技巧,让你的Excel效率猛增10倍!





点「在看」的人都变好看了哦

点击“阅读原文”查看数据应用学院核心课程

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存