用Spyder进行科学计算和可视化

本研讨会允许您探索Spyder的一些特性,这些特性使Spyder成为使用Python提供的科学工具的理想IDE。在整个工作坊中,我们将应用科学的方法回答一些与我们的偏好和认知能力有关的问题。到本研讨会结束时,学员将能够使用Spyder探索数据,使用一些统计工具对其进行分析,并绘制变量之间的关系图。

必备条件

您需要安装Spyder。访问我们的 installation guide 了解更多信息。

重要

Spyder现在提供 独立安装程序 对于Windows和MacOS,无需下载 Python 或在现有环境中手动安装,即可更轻松地启动和运行应用程序。虽然我们仍然支持 Python ,但我们建议在这些平台上使用这种安装方法,以避免大多数软件包冲突问题和其他问题。

还需要具备以下先验知识:

学习目标

完成本研讨会后,您应该能够:

  • 运用科学方法回答与心理测量学变量相关的问题

  • 了解如何使用Spyder的内置科学计算工具

学员配置文件

本研讨会面向那些想要学习如何从数据集中科学地回答问题的人。我们还将其设计为学习如何将Spyder用作研究工具的教程。

简介

在这个研讨会中,我们将探索一个数据集,并使用它来回答一些使用科学方法的问题。

为什么要用Python做科研?

Python是一种成熟的编程语言,许多科学界都选择它来支持研究过程。这有几个原因:

  • 它用途广泛,易学易用。

  • 它允许以多种方式处理输入和输出。无论您的数据是什么格式,在Python中总有一种方法可以导入它(并以您选择的格式导出它)

  • 它是被解释的。您不必从头到尾编写代码来查看部分结果。这使得浏览数据变得特别容易和快速

  • 它具有对科学计算任务的内置支持: SciPyNumPyPandas ,以及由科学家创建和为科学家创建的大量其他类库

  • 它是机器学习中使用最广泛的编程语言(包括KERAS和TensorFlow)

  • 它有很好的绘图库

  • 它可以与 Jupyter Notebooks 以及它们在云中的实施 (Google ColabBinder )

斯派德如何才能帮助我进行科学研究呢?

Spyder是一个用Python编写的科学集成开发环境,由科学家、工程师和数据分析师设计。它将综合开发工具的高级编辑、分析、调试和分析功能与科学包的数据探索、交互执行、深度检查和漂亮的可视化功能独特地结合在一起。与Python一起,它为科学计算提供了一套非常完整的工具。

科学方法的基本步骤

这个 scientific method 是一套用于以有效方式获得新知识的良好实践。广义上讲,科学方法的发展阶段有以下几个阶段:

  1. 观察:首先找出需要解释的地方

  2. 搜索/生成理论:对世界状态或它是如何工作的说一两句话(对某一现象的抽象思维)

  3. 假设:识别变量并做出预测

  4. 测试/实验/更多观察:测量变量之间的关系

  5. 分析:拟合模型/图形数据

  6. 报告:分享新的调查结果

在整个研讨会中,我们将以实际的方式开发这些步骤中的每一个。我们将使用Spyder作为研究工具,并使用来自在线约会网站的心理测量数据,使其变得简单和有趣。

使用Spyder进行科学研究简介

如果您不熟悉Spyder,我们建议您从我们的 Quickstart 。但是如果你想要一个总结,这里有一个快速的概述。

注解

如果您已经有使用Spyder的经验,您可以跳到 Preparation work 部分。

编辑

这个 Editor 是编写代码并将其另存为文件(脚本)的位置。它使您可以轻松地持久化您的工作。您可以在这里编写您希望在IPython控制台中进行的数据分析中保留的代码。 在这里,您还将能够阅读、编辑和运行本研讨会中的代码

IPython控制台

这个 IPython Console 是Spyder的组件,您可以在其中编写要试验的代码块。 在本研讨会中,我们将向您提供一些代码片段,您可以在此控制台中复制并运行这些代码

本质上,IPython控制台允许您使用Python执行命令和与数据交互。

变量资源管理器

这个 Variable Explorer 是Spyder最好的功能之一。它允许您以交互方式浏览和管理在当前所选对象的代码中生成的对象 IPython控制台 会议。

Variable Explorer是本研讨会中最常用的组件之一。 这是我们将在其中观察数据和除曲线图之外的大多数科学分析结果的窗格

打印窗格

这个 Plots pane 显示在您的IPython控制台会话中创建的所有静电图形和图像。 代码生成的所有绘图都将显示在此组件中 。您还可以将每个图形保存在本地文件中,或将其复制到剪贴板以与其他研究人员共享。

代码分析(分享时尚的代码!)

拥有一个能够检测代码错误、风格问题、不良实践、不一致和其他问题的工具不是很棒吗?这正是 Code Analysis 。您的代码可以运行,但是如果您打算与其他研究人员共享它,那么如果它既可读又整洁就更好了。

准备工作

在开始之前,您必须已经安装了运行代码所需的一些包和库。我们建议您在虚拟环境中安装这些要求。在这里,我们将一步一步地解释如何做到这一点。

设置CONDA环境

如果您想让Spyder在专用环境中独立于您的其他软件包进行更新,并避免任何冲突,您可以做到。

您可以通过两种不同的方式设置您的环境。

重要

我们建议使用以下工具创建虚拟环境 Anaconda (或 Miniconda ),因为它与Spyder无缝集成。您可以在以下位置找到安装说明 Anaconda documentation

1.使用命令

只需在您的Anaconda提示符(Windows)或终端(其他平台)中运行以下命令,即可将Spyder最小限度地安装到一个名为 scientific-computing

$ conda create -n scientific-computing

要安装Spyder的可选依赖项以实现全部功能,请改用以下命令:

$ conda create -n scientific-computing spyder=5 numpy scipy pandas matplotlib sympy cython seaborn spyder-kernels pyarrow

警告

Spyder现在提供 独立安装程序 对于Windows和MacOS,无需下载 Python 或在现有环境中手动安装,即可更轻松地启动和运行应用程序。如果使用独立安装程序,则不需要安装 spyder=5 和康达在一起。

2.从环境.yml文件

您还可以使用环境文件轻松安装虚拟环境 (scientific-computing.yml ),我们与您分享。只需在终端运行以下命令(当前目录下必须有环境文件):

$ conda env create -f scientific-computing.yml

激活环境

现在您可以通过以下方式进入新创建的虚拟环境:

$ conda activate scientific-computing

正在下载数据集

我们将使用由Kirkegaard和Bjerrekaer收集的名为OKCupid的公共数据集。该数据集由68371条记录和2626个变量组成。

下载 OKCupid dataset 添加到您选择的目录中。

设置工作目录

虚拟环境和数据文件现在已准备就绪。剩下的唯一一件事就是创建一个在其中工作的目录。在您的操作系统中,使用您选择的名称创建一个新目录。然后将数据集文件复制并解压缩到那里。

下面是一个示例(在Linux或MacOS上):

$ mkdir scientific-computing
$ cd scientific-computing

请记住,在这个新目录中,您必须将数据文件解压。

启动Spyder:

$ spyder

让我们确保Spyder准备好了。首先,检查工作目录是否正确。您应该在右上角看到包含数据集的目录的路径。大概是这样的:

Spyder's Working Directory plugin showing the working directory of spyder-scientific

其次,让我们检查一下我们创建的虚拟环境是否在Spyder中启用。去 Preferences > Python interpreter ,并使用下面的下拉列表 Use the following Python interpreter 若要选择虚拟环境的路径,请执行以下操作。您应该会看到类似这样的内容:

Set up environment in Spyder's Preferences

现在,您已经为继续研讨会做好了一切准备。

下载代码

尽管研讨会是为您在IPython控制台中编写代码而设计的,但我们已经创建了一个文件,您可以 download 。此脚本提供了您将在本研讨会中编写的所有代码,如果您迷路了,您可以使用它作为指南。

数据集

OkCupid是一个数据集,它收集从在线约会网站OKCupid获得的信息。它由68,371条记录组成,这些记录是利用提取公共信息的刮刀自动收集的。

数据集包含人口统计数据(例如,性别、性取向和年龄)。它还包括网站算法用来计算一些个性指标以帮助寻找兼容匹配的一般问题的答案。

如果您想了解有关此数据集是如何收集的以及它包含哪些信息的更多信息,您可以在本文中获得这些信息: The OKCupid dataset

请记住在Spyder右下角的“IPython控制台”中键入并运行此研讨会的所有代码。

IPython Console location in Spyder IDE

您也可以编写代码或在编辑器(占据Spyder整个左侧的窗格)中编写代码。如果使用编辑器,则可以通过选择代码并按下 Run selection or current line 按钮中的 Run toolbar 或者按F9键。

Editor location in Spyder IDE

要开始,请导入库。

import matplotlib.pyplot as plt
import pandas as pd
import scipy.stats as stats
import seaborn as sns

您先前下载的数据在 parquet 格式化。这种格式非常方便,因为它比CSV或JSON文件更小、更快。

加载数据:

data = pd.read_parquet("parsed_data_public.parquet")

现在您应该能够看到在Variable Explorer中导入的数据。

Dataset in the Variable Explorer

您可以看到对象的DataFrame类型以及对象的行数和列数。

浏览数据集

年龄

现在,让我们研究其中一个变量,在本例中是数值变量age (d_age )。

注解

在OKCupid数据集中,所有人口统计变量前缀为“d_”,配置文件变量前缀为“p_”。

data.d_age.describe()
Console output for data.d_age.describe()

发生了什么?我们打电话给 data 对象,并使用Python的点表示法拾取 d_age 列。这有一个 Pandas Series 键入Object。对于此对象,我们将 describe() 显示一些指标汇总的方法:数值计数、平均值、标准差、最大值、最小值等。从这些数字可以看出,样本主要由年轻人组成(平均年龄为31.65岁)。

函数、方法或对象属性的返回可以存储为变量,以便在变量资源管理器中随时可用:

max_age = data.d_age.min()
min_age = data.d_age.max()
More variables in Variable Explorer

这些值是浮点数。最低年龄为18.0岁,最高为100.0岁。

注解

还要注意,每种类型的变量都有不同的颜色来快速区分它们。

我们已经知道最低和最高年龄,平均年龄在32岁左右。进一步研究此变量的一个好方法是绘制直方图,这是一种显示频率分布的图形。如此一来,我们可以看到站台上的年轻人群体是否比年长的群体更多。

我们可以直接根据数据框绘制直方图。为此,我们选择变量(就像我们对 .describe() ),并调用 .plot.hist() 方法。在此方法中,我们将把箱的数量和绘图的透明度作为参数传递 (alpha )。

data.d_age.plot.hist(bins=25, alpha=0.5)
Age histogram with Pandas

在Spyder中生成简单直方图的另一种方法是在Variable Explorer中对数组使用上下文菜单。但是首先,我们必须将这些值存储在一个列表中,并调用该变量 age

age = data.d_age.tolist()
Age histogram option from Variable Explorer Age histogram from Variable Explorer

频率分布有不同的大小和形状。直方图的形状揭示了有关数据的非常有趣的事情。对称的钟形直方图可能表明分布是正态的(大多数分数都接近分布的中心)。在年龄直方图中,您可以看到它有一条向右的“尾巴”(朝向较老的年龄)。严格地说,这叫做“肯定”。 skewed “。同样值得注意的是,它有点尖利(正面)。 kurtosis 或尖峰瘦身)。这两件事可能表明年龄不是一个随机变量。

虽然我们可以直接从数据帧创建直方图,但是我们将使用一个名为Seborn的Python库来做同样的事情,因为这个库将允许我们稍后做更有趣的事情。

sns.histplot(data.d_age, kde=True, bins=25)
plt.show()

我们打电话给 sns.histplot() 有三个论点。第一个 (data.d_age )是一部熊猫系列,有 定量的 我们要绘制的变量。第二个 (kde=True )添加显示理想年龄分布模型的曲线(使用称为 核密度估计器 )。第三个是 (bins=25 )表示我们需要图形中的25个箱。

Age histogram with Seaborn

第二行 (plt.show() )旨在显示到目前为止尚未显示的所有数字。如果您对如何利用对象、方法或函数有任何疑问,可以使用 help() 控制台中的工具。例如:

help(plt.show)

或者,您也可以利用Spyder中包含的帮助窗格获取屏幕帮助:

plt.show() help in Spyder's Help pane

使用Seborn,我们可以添加一条表示直方图平均值的线。为此,我们将使用 axvline() 方法,并添加具有Mean值的文本,其中 text()min_ylimmax_ylim 用于标记文本的位置。

sns.histplot(data.d_age, kde=True, bins=25)
plt.xlabel('Age')
plt.axvline(data.d_age.mean(), color='k', linestyle='dashed', linewidth=1)
min_ylim, max_ylim = plt.ylim()
plt.text(data.d_age.mean()*1.1, max_ylim*0.9,
         'Mean: {:.2f}'.format(data.d_age.mean()))
plt.show()
Age histogram with mean line

宗教严肃性

我们知道数据框架的范围,我们已经看到了如何探索数量变量。现在让我们转到一个定性变量。这个 columns 属性显示数据帧中的列名列表。我们还知道人口统计变量以“d_”为前缀,因此我们可以查找与此前缀对应的变量名称。

demograph = [v for v in list(data.columns) if v.startswith("d_")]

在变量资源管理器中,您将看到一个新变量 demograph 。如果双击它,您将看到数据集中的人口统计变量列表。在列表的末尾,您将看到一个值 d_religion_seriosity 。如果您右键单击它,屏幕上会出现几个选项。您可以重命名该列、将其删除或插入新列。让我们点击 Copy 若要将列名复制到内存中,请执行以下操作。

在IPython控制台中,键入 data. 然后复制列名。在末尾键入句点(不带空格),然后按Tab键。您应该会看到类似以下内容:

IPython Console auto-completion

然后,您可以看到该类的所有相关方法和属性的列表。就在最后你会看到 value_counts 它可以用来总结变量。它是一个方法,因此必须以括号结束:

data.d_religion_seriosity.value_counts()

# but not too serious about it     11142
# and laughing about it             7307
# and somewhat serious about it     5372
# and very serious about it         3290
# Name: d_religion_seriosity, dtype: int64

除了人口统计和个人资料变量外,该数据集还包括对各种主题问题的回答。这些问题都是用前缀“q”后跟一个整数来编码的。问题的文本存储在一个名为 question_data.csv (您可以将其作为 OKCupid dataset )。

我们可以在变量资源管理器中检查此文件:

question_data = pd.read_csv("question_data.csv", sep=";")

双击变量资源管理器中的“QUESTEM_DATA”,以显示与其代码(“Q”+Number)对齐的每个问题。

现在我们已经学会了如何探索数据,我们可以提出一些有趣的问题,并尝试在数据集和Spyder的帮助下回答这些问题。

想一个理论,写一个假设

理论只不过是对某事的一种解释。例如,我们可以卷入猫和狗之间的永恒冲突。作为一个爱狗的人,我可能有一个理论(当然是不科学的),那就是那些喜欢与狗作伴的人比那些喜欢邪恶(但可爱)小猫的人更聪明。为了检验理论的支持性,人们可以在此基础上做出预测,看看这个预测在实验或具体情况下的表现如何。我们称这个预测为假设。

假说是一种可以用科学方法检验的陈述。它们必须能够使用经验证据或数据进行验证。例如, 绿色是最好的颜色 不是一个假设,因为它既不能证明也不能反证。

关于以上关于一个人的宠物偏好的理论,要探究它,我们应该找出两个变量之间的关系。第一个变量将与 self-identification as a cat person or dog person 。第二个变量与一个人的 解决问题和解决情况的能力

OKCupid数据集有一些有用的变量,我们可以用它们来研究这一理论。例如,问题 q997 ( 你是爱猫的人还是爱狗的人? )提供有关个人宠物偏好的信息。第二个变量稍微更难想出来,因为它稍微复杂一些。幸运的是,收集数据集的研究人员还选择了14个问题来代替认知能力测试。可以在文件中找到这组选择的问题 test_items.csvOKCupid dataset

test_items = pd.read_csv("test_items.csv")

因此,让我们尝试看看在OKCupid数据集中是否有任何证据支持以下假设:

喜欢狗而不喜欢猫的人在认知能力测试中得分更高。

注解

剧透提醒:如果你是爱猫人士,并且觉得你应该立即离开这个工作坊,我建议你留下来。如果你不是爱猫的人,那也留下来吧。

构建测试

我们已经知道哪些问题将作为认知能力测试的一部分。现在我们将对这些数据进行处理,以获得每个人的分数。

首先,我们复制原始数据集:

ca_test = data.copy()

然后,我们找到每个测试题的正确答案(这些答案在 test_items )。

right_answers = []
for ID, ROW in test_items.iterrows():
    right_answers.append(ROW.iloc[ROW["option_correct"] + 2])
test_items["right_answer"] = right_answers

正确答案已存储在 test_items 数据帧。

接下来,我们将在 ca_test 数据帧,该人是否正确回答了在认知能力测试中选择的每个问题。这些答案将在新变量中以布尔值的形式输入,前缀为“resp_”,后跟相应的问题代码。使用函数计算布尔值 lambda row: row[q] == a, axis=1

for ID, ROW in test_items.iterrows():
    QUESTION = "q" + str(ROW["ID"])
    ANSWER = str(ROW["right_answer"])
    try:
        ca_test.dropna(subset=[QUESTION], inplace=True)
        ca_test["resp_" + QUESTION] = ca_test.apply(lambda row: row[QUESTION] == ANSWER, axis=1)
    except KeyError:
        print(f"{QUESTION} not found.")

重要

一些 test_items 数据中没有问题,但不要担心这一点。我们使用一个 try... except 挡路忽略这些错误。回答这些问题是可选的,所以许多OkCupid网站用户没有回答所有问题。因此,我们已经从记录中删除了没有回答我们为认知能力测试选择的14个问题的用户。这大大减少了样本量。还有其他方法可以避免这种减少,但这些方法不在本研讨会的讨论范围内。

我们想要对每个人的正确答案求和,但是一些整数结果被存储为字符串,所以让我们修正一下:

ca_test.q18154 = pd.Series(ca_test.q18154, dtype="int")
ca_test.q18154 = pd.Series(ca_test.q18154, dtype="string")
ca_test.resp_q18154 = ca_test.apply(lambda row: row["q18154"] == "26", axis=1)

ca_test.q255 = pd.Series(ca_test.q255, dtype="int")
ca_test.q255 = pd.Series(ca_test.q255, dtype="string")
ca_test.resp_q255 = ca_test.apply(lambda row: row["q255"] == "89547", axis=1)

现在我们有了每个试题的正确答案,让我们把每个人的正确答案加起来。有14道题,所以最高分也是14分:

cognitive_score = ca_test[list(ca_test.filter(regex="^resp"))].sum(axis=1)
ca_test["cognitive_score"] = cognitive_score

我们怎么把这些回应加起来呢?请记住,每个答案都存储为带有前缀“resp_”的布尔值(True或False)。所以我们在 ca_test 每列以“resp”开头的答案的数据帧(我们使用正则表达式 regex="^resp" 以及该方法 filter ),并将每行的True值相加 sum(axis=1) 。然后,我们将这些结果存储在 ca_test 数据集。

您可以通过在IPython控制台中键入内容来查看这些操作的结果 ca_test.cognitive_score.describe() 。如果这样做,则在 计数 您将看到,新记录的数量已经减少到479条(68,371名用户的睡觉没有回答所有这些问题)。

认知能力分布

让我们画一张这个变量的直方图,看看频率分布。

sns.histplot(ca_test.cognitive_score, kde=True, bins=6)
sns.set_palette(palette)
Cognitive test score histogram

如您所见,在本例中,分布不是对称的,而是在左侧有一条很长的“尾巴”(负偏斜)。这意味着回答所有问题的大多数用户都做得相当好,只有少数用户以错误的方式回答了大部分问题。

重要

我们在本节中计算的值已包含在数据中 (data.CA_items )。但是,我们选择使用代码再次获得这些结果,因为这是学习如何使用Python和Pandas提供的工具进行数据操作的好方法。

关联变量

记住,这个假设涉及两个变量:你更喜欢哪种宠物和认知能力。宠物喜好的测量将从问题开始。 q997 (类别变量或定性变量)和认知能力将通过测试中正确答案的总和(定量区间变量)来衡量。有了这种类型的变量,我们可以制作一些框图,看看均值之间是否有差异。

但首先,让我们改变标准的海运调色板,以获得更漂亮的情节。

palette = sns.color_palette("husl")
sns.palplot(palette)

注解

Seborn允许您从不同样式的图形和调色板中进行选择。欲了解更多信息,请访问https://seaborn.pydata.org/tutorial/color_palettes.html。

现在,我们将创建框图来观察变量之间的关系。为此,我们将使用 catplot 海运班级。第一个参数将是x轴,在本例中它将是定性变量(问题 q997 )。第二个参数是y轴,我们将把数量变量(认知分数)放在那里。使用参数 kind 我们指出这是一个框图。这些参数 heightaspect 调整图形的外观。最后一个参数, data ,指示数据的来源。

sns.catplot(x=ca_test.q997, y=ca_test.cognitive_score,
kind="box", height=5, aspect=2, data=ca_test).set_axis_labels("q997 = Are you a cat person or a dog person?", "cognitive score")
sns.set_palette(palette)
Pet preferences and cognitive score relationship (boxplot)

方框图或方框胡须图显示在方框中心附近 mean 作为水平线的数据。框周围的线条表示 50%的观测值 ( 四分位数区间 )。在盒子外面,向上和向下,我们发现了两个胡须:下面的一个代表 数据集下部的值的平均值 ,上面的一个表示 数据集上部的值的平均值 。胡须之外的点是 异常值

重要

异常值是与数据值的睡觉非常不同的值。必须考虑它们,因为它们经常会在我们试图与数据拟合的模型中造成偏差。

该图显示了四个框,用于测量以下群体的认知能力:

  1. 那些喜欢狗的人

  2. 那些模糊地把自己定义为猫人和狗人的人。

  3. 那些更喜欢猫的人

  4. 那些既不喜欢猫也不喜欢狗的人。

最低的平均数是那些只喜欢狗的人,但只喜欢很少的狗。代表爱狗人士的方框(和边界)也更“宽”,这意味着这一群体的个人测试结果有更大的变异性。但这与那些更喜欢猫的人并没有太大的不同。所有的平均数都在其他盒子(四分位数)的范围内,这似乎表明,实际上,这些群体的智力测试分数并没有真正重要的差异。这似乎削弱了对我们上面提出的最初假设的支持。

注解

如果您想要查看这些数字,请输入 dog_or_cat = ca_test.groupby("q997")["cognitive_score"].describe() 在IPython控制台中,并在变量资源管理器中查看结果。这样你就可以看到有多少人更喜欢猫或狗,以及每组认知能力测试结果的均值和标准差。

为了在上下文中了解平均值之间的真正差异,让我们创建一些条形图。我们现在将使用Seborn的BarPlot类。在x轴上,我们再次将定性变量( q997 )和y轴上的数量变量(认知分数)。data参数将整个数据集作为参数。

fig_dims = (12, 8)
fig, ax = plt.subplots(figsize=fig_dims)
sns.barplot(x=ca_test.q997, y=ca_test.cognitive_score, ax=ax, data=ca_test)
sns.set_palette(palette)
plt.xlabel("q997 = Are you a cat person or a dog person?")
plt.ylabel("cognitive score")
Pet preferences and cognitive score mean representation (box graph)

如果盒子图表明均值没有显示出显著差异(可能是由于偶然),条形图确认这些差异在比例上是相当温和的。

方差检验

为了确保均值之间的差异在统计上具有显著性,我们将执行方差分析(ANOVA),因为我们将比较两个以上组的均值。

方差分析是如何运作的?这个分析告诉我们,三种或三种以上的手段是否相等。如果是这样的话,这将支持零假设。

注解

这个 零假设 是我们在假设中陈述的预测之外的另一种预测。零假设简单地说,观察到的均值差异是由于收集样本时发生的随机变化造成的。

方差分析产生一个 F-ratio (也称为F统计量),它将数据中的系统变化量(可由模型或假设解释的变化量)与非系统变异量(我们的假设或模型无法解释的变化量)进行比较。这意味着F是模型与其误差的比率。Anova还生产一种 p-value 这表明变化可以归因于零假设的概率。p值越小,观测到的变化就越不可能是偶然的。

设置数据格式

要执行方差分析,让我们从使用认知能力测试结果的数据集开始。宠物首选项值现在将是列名,每行将表示一个人。

警告

要进行方差分析,必须满足某些要求或假设。例如,残差的分布必须是正态的。这不是这里的情况。对于此示例,有更合适的统计测试,以及对数据执行某些转换以便在此情况下应用方差分析的可能性。然而,我们使用方差分析是因为它是一个相当流行的测试,而且因为本研讨会的目的是作为使用Spyder进行科学计算的入门课程。我们不打算在这里获得科学结果以供发表。

dog_or_cat_pivot = ca_test.pivot(columns="q997", values="cognitive_score")

您将看到其中一栏包含测试的答案,这些答案是由那些没有具体说明他们对宠物的喜好的人所做的。让我们删除该列。

dog_or_cat_pivot.drop(dog_or_cat_pivot.columns[0], axis=1, inplace=True)
Pet preferences pivot table for ANOVA analysis.

现在,让我们重命名列名(为简单起见)并删除缺少值的记录(使用 dropna )。这一论点 inplace=True 允许您直接修改数据帧,而不必创建新的数据帧。

dog_or_cat_col_names = list(dog_or_cat_pivot.columns)
dog_or_cat_pivot.columns = ["A", "B", "C", "D"]
dog_or_cat_pivot.dropna(how="all", inplace=True)

注解

在变量中 dog_or_cat_col_names 我们已按顺序存储值的名称。这意味着:A=两者,B=猫,C=狗,D=都不是。

要执行方差分析,我们将使用名为“stats”的Python库,特别是 f_oneway 功能。您可以通过键入以下命令找到有关此库的详细信息 stats 或通过键入以下命令了解有关该函数的更多信息 stats.f_oneway

stats.f_oneway() help in Spyder's Help pane

帮助指出,该函数需要一个类似数组的数组作为输入(在我们的示例中,一个样本用于A,一个样本用于B,一个样本用于C,一个样本用于D)。因为我们在每列中都有空单元格,所以让我们从每列中删除它们( f_oneway 函数不支持缺失值)。

dog_or_cat_samples = [dog_or_cat_pivot[col].dropna() for col in dog_or_cat_pivot]

在上面的代码行中,我们创建了一个包含4个元素的列表:每列A、B、C和D的测试结果,没有缺失值(它们用 dropna() )。

运行方差分析

现在,让我们运行ANOVA并将输出存储在两个变量中: f_valuep_value 。请注意,由于 dog_or_cat_samples 是一个列表,则必须使用星号传递参数 (*dog_or_cat_samples )。

f_value, p_value = stats.f_oneway(*dog_or_cat_samples)

在…的帮助下 stats.f_oneway 在“帮助窗格”中,您可以阅读此函数输出的说明、有关测试的一些有趣说明,以及一些可用于更好地理解此分析性质的参考资料。

重要

在帮助窗格中,您将看到方差分析需要满足某些假设。在本研讨会中,我们没有检查这些假设,因为我们的目标只是展示一些Spyder功能,使研究工作变得更容易。因此,不应过于严格地对待本例中用方差分析得出的结果。

在变量资源管理器中,您可以找到这两个新变量: f_valuep_valuep_value (0.6275)远高于0.05%,这就支持了零假设(削弱了对我们假设的支持)。为了知道所获得的F值是否大于理论上的期望值,a F临界值 必须经过计算。可以使用 stats 库,一个重要级别( q ),以及自由度( df )关于小组数量和观察数量:

num_groups = len(dog_or_cat_pivot.columns)
num_observations = len(dog_or_cat_pivot)
dfn = num_groups - 1
dfd = num_observations - num_groups

f_critical = stats.f.ppf(q=0.95, dfn=dfn, dfd=dfd)

的价值 f_critical (2.6241)大于 f_value (0.5813)。这意味着这些组的平均值之间的方差没有显著差异。由于 p 值表明我们不能排除随机变化,那么我们必须抛弃我们的假设。

这一切的结论是什么?在我们的数据中,似乎很少或根本没有证据表明,一个人的宠物偏好与他或她解决实际或抽象问题的能力之间确实存在关联。猫和狗的主人们,欢呼雀跃吧!

报告和共享

在科学界,分享结果,无论是好的还是坏的,都是至关重要的。今天,在科学计算中,共享数据以及用于处理和分析数据的代码也是至关重要的。为了帮助解决这一问题,我们将使用Spyder的代码分析。

代码分析

当您共享代码时,您希望代码是可读的、干净的,并且不会过于复杂。代码分析组件可以帮助我们检测这些问题,甚至可以检测可能影响代码性能的错误。

若要查看示例,可以打开 scientific-computing-astro.py 文件,然后运行 Code Analysis (打开窗格中的文件,然后单击右上角的绿色三角形按钮)。

Code Analysis pane Example for astrological sign and cognitive ability

您可以看到四个类别,它们可以帮助您改进代码:

  • 公约:违反编程标准

  • 重构:重构相关检查

  • 警告:特定于Python的问题

  • 错误:代码中可能存在错误

这些类别中的每一个都指示警报类型和发生潜在问题的线路。例如,它告诉我们第129行太长,或者我们导入了Numpy,但在代码中根本没有使用它。

这些建议有助于共享干净的代码。我们建议您在发布代码之前使用此面板来润色代码。

最后一句话

在这个研讨会中,我们已经迈出了使用Spyder进行科学计算的第一步。我们已经看到了如何从一个问题或怀疑中提出一个假设。这个问题也可能出现在对一些数据的探索中,可以通过计算一些度量(如平均值、中位数、标准差)或绘制一些曲线图来完成。

通常,为了回答这个问题,我们必须处理一些数据(例如,用于构建认知能力测试)。

最后,我们尝试通过一些统计检验来建立变量之间的关系。这些测试的结果是否支持我们最初的假设。

在本研讨会中,您学习了如何执行以下操作:

  • 设置CONDA环境。

  • 使用IPython控制台和编辑器编写和测试代码。

  • 下载数据集。

  • 在变量资源管理器中检查对象。

  • 以图形方式浏览数据集。

  • 使用绘图窗格在绘图之间浏览。

  • 研究数据并将其与假设相关联。

  • 操作Pandas DataFrame中的数据。

  • 使用专用库对数据执行统计测试。

  • 使用代码分析提高代码可读性。

Spyder有许多功能可以帮助您进行数据分析。您可以在我们的 official documentation

感谢您结束本次研讨会!我们希望您会发现它对您有帮助,并提供了丰富的信息。

如果您对Spyder财务分析入门感兴趣,可以访问研讨会 Financial Data Analysis with Spyder

家庭作业

如果您想检查您所学到的内容,我们建议您分析数据,尝试回答以下问题: 不同的星座会影响认知能力测试的结果吗? 您可以检查Python脚本 scientific-computing-astro.py 如果你有任何疑问。

进一步阅读

有关使用的数据集的说明,请参阅以下内容 paper

  • 柯克加德,E.O.W.,和Bjerrekær,J.D.(2016)。 OKCupid数据集:约会站点用户的一个非常大的公共数据集 。开放式差异心理学。doi:10.26775/odp.2016.11.03*

下面是一本用R学习统计的非常有趣的书:

  • 菲尔德,A.,Miles,J.,&Field,Z.(2012)。 使用R发现统计信息 。圣贤出版公司。