我和杰德在这里。我们要聊聊山地车的悬架系统,还会介绍一些我们在JMP里发现的实用工具,这些工具帮助我们理解悬架系统和网上一些评测之间的关联。这次演讲其实源于去年的Discovery Summit。我和杰德碰面后,我特别想知道“Functional Data Explorer是什么?我该如何使用它?它能给我带来哪些好处?”杰德比较了解我,就跟我聊起了山地车。这对我来说很有吸引力,让我很兴奋。最终,就有了今天的演讲。
关于我们和本次演示,先做个免责声明。我们与任何自行车公司均无关联,也绝非业内专家。我们从Bike Radar网站收集了一些评测文章,并参考了他们的评测方法。然后,我们从一款名为Linkage的软件中提取了一些悬挂曲线数据,这款软件在网上可以找到。
我不会建议你通过这次演示来决定接下来该买哪辆自行车。这并非我们的目的。我们的目的是展示JMP中一些非常酷炫且强大的工具,帮助你理解一些传统方法难以掌握的数据。
在正式开始之前,我们先来简单了解一下山地自行车及其工作原理。山地自行车通常配备前避震和后避震。前避震非常简单,它只是沿着前叉进行线性上下运动。后避震则复杂得多。后轮上下运动,通常通过某种连杆机构将这种运动传递到位于车架中间的减震器。这种连杆机构可以具备多种不同的特性,我们将逐一介绍其中五个主要特性。
但最容易理解的可能还是杠杆比。也就是说,如果车轮移动一毫米,减震器会压缩多少?减震器是否也压缩了一毫米?如果是,那么杠杆比就是 1。如果减震器压缩的距离远小于车轮移动的距离,那么杠杆比就会更高,并且这个值会随着车轮的整个行程而变化。随着车轮的移动,这个值也会变化,因此你可以得到一条曲线或函数数据,它定义了自行车的连杆机构。
我们提取了五条这样的曲线。第一条是防下沉曲线。它与自行车加速时车身的运动状态有关。当你踩踏板时,你的踩踏动作会导致自行车前倾、下沉还是保持相对水平?防下沉曲线反映了悬架系统对加速力的反应。
防抬头是自行车性能中的一个重要方面,它指的是当你刹车减速时,自行车是否会向前倾斜?它的悬架是否会压缩?防抬头也是自行车设计师用来调整自行车性能或改善其骑行表现的参数之一。
我们刚才简单聊了聊杠杆比。杠杆比指的是车轮转动多少时,减震器压缩多少。杠杆比真正有趣的地方在于(我们会在演示的最后部分详细讨论),它是针对特定减震器进行调校的。自行车有气压减震和螺旋弹簧减震,根据你使用的减震器类型,你会看到不同的杠杆比曲线。重要的是,杠杆比是可以调校的,但这种调校并非孤立进行,而是很大程度上取决于你使用的减震器类型。
轴距轨迹是另一个需要考虑的因素。当车轮向上运动时,它是大幅后移,还是垂直上下运动,还是略微前移?在这个图中,你可以看到 Y 轴表示车轮的移动距离,X 轴表示车轮的前后位置。车轮初始位置为零。在这张蓝色图表中,你可以看到车轮最初会略微后移,然后再前移。你可以想象一下,当你沿着小路骑行时,如果你向前行驶,你肯定希望车轮后移避开障碍物,而不是前移撞上障碍物。轴距轨迹的概念很容易理解,它对自行车性能的益处也显而易见。
最后一种情况是踏板回弹。当车轮转动时,踏板与车轮之间的距离有时会略微增大,这会导致踏板向后移动。这通常不是好事,它会让你在骑行时感到不舒服。
这些就是我们感兴趣的曲线。这就是我们感兴趣的空间,我们可以通过链接来获取所有这些信息。现在的问题是,我们如何获取评论?我目前还在使用 JMP 18 之前的版本,但我可以编写一个 Python 脚本,我不会详细讲解这个脚本的工作原理。如果有人有任何问题,欢迎随时联系我。我很乐意解答。简单来说,我的桌面上有一个 Python 脚本,JMP 会运行它。这个 Python 脚本会连接到 Bike Radar,收集大量评论,然后生成几个 JMP 数据表供我们查看。
首先是这个汇总表。它提供了关于自行车评测的大量元数据,包括自行车型号、评测类型(完整评测、长期评测或首次骑行评测)以及发布日期。此外,它还提供了一些短期评价、总体评分、URL、自行车类型以及作者信息。最后是评测正文部分,同样包含自行车型号、具体章节以及评测正文。
我们收集的每篇评测都包含三个部分:爬坡部分、下坡部分和总结部分。每辆自行车都有这三个部分,因此我们可以考察它的爬坡性能如何?它爬坡顺畅吗?下坡性能如何?它下坡平稳吗?最后,评测员对这辆自行车的总体感受如何?
我们已经讨论了我们将要用于分析的两个组成部分。我们有曲线,我们可以用这个联动软件生成这些曲线,我们还有评论。
但是现在,我们如何将所有这些信息转换成 JMP 可以理解并进行分析的形式呢?为此,我们从链接中得到了一个图像。问题是,我们如何将这个图像转换成 JMP 可以理解的形式?
JMP 的一个很棒的功能(也是我最近才发现的)是它可以打开图像。你需要运行一些 JSL 代码才能做到这一点。但如果你这样做,你就能得到一张图像,然后可以得到一个表格,其中包含像素的 X 和 Y 坐标。这些坐标表示像素在空间或图像中的位置,然后它会给出图像中每个像素的红色、绿色和蓝色值。
太好了。但这仍然没有完全达到我们想要的效果。我们需要这条曲线,但我们可以做得更好。如果我们能找出所有蓝色值,就能……好的,我们可以得到所有蓝色值,然后如果我们能将它们映射到这个图空间中,我们就能生成一条曲线。
我非常喜欢 Workflow Builder。它让我的工作轻松很多,因为我可以直接用图形化的方式操作并获得结果。所以我快速创建了一个 K 均值聚类工作流。这张图很实用,因为它只有三种颜色。如果我们生成三个分组,并将这些聚类的公式保存到表格中,现在我们就可以从这个表格中获得 X 和 Y 坐标的图表,然后根据聚类公式为它们着色。可以看到,第一个聚类公式对应的是所有蓝色像素。我们可以用它来开始计算:“好的,这些是蓝色像素。那么,它们的位置在哪里呢?我们知道它们在图像中的全局位置。我们需要将它们映射到图表上的位置。”
我不会深入探讨这个问题,因为它有点复杂,但我会向你们展示我们最终定稿的剧本是什么样子的。
它会显示图像,然后提示:“好的,你需要输入该图的 Xmin、Xmax、Ymin 和 Ymax 值。” 我要输入的是 Xmin 到 Xmax 的范围,Ymin 到 Ymax 的范围是 0.45 到 1.35。点击“确定”。最终结果是……需要把所有数据都拖到这里。最终会得到一个数据表,其中包含 X 值、Y 值,以及我们正在查看的房产和自行车信息。这只是一个示例图像。你可以看到,这是我们最初的图。这是我们提取出来的图。我们通过输入这些值,观察蓝色像素,然后计算“好的,根据我们的全局位置,它是如何映射到我们定义的 0 到 130 毫米范围内的”。
毋庸置疑,这并非一个完美的过程,但它确实能很好地展现每条曲线的走向。这需要一些时间。我和杰德在一个晚上花了几个小时输入数字,但过了一会儿,我们就得到了所有可以用来分析的曲线。
现在我们来谈谈,“好的,我们如何处理这些文本?我们如何将文本转换成我们可以使用的形式?”
谢谢,兰登。正如兰登所说,我们已经有了文本,并且将文件保存为三个独立的 CSV 文件:一个用于记录爬升过程,一个用于记录结论,一个用于记录下降过程。这些文件我都保存在桌面上了。如果你还不知道的话,有一个非常实用的功能叫做“导入多个文件”。我们之前就用过这个功能。不过为了节省时间,我打算稍微取巧一下,直接运行脚本来完成。这个脚本实际上把这三个文件导入到了一个 JMP 文件中。通过一些右键菜单的修改,我可以把文件名分别改成“结论”、“下降”和“爬升”。
现在我的数据已经格式化完毕,可以开始使用了。所谓“可以开始使用了”,是什么意思呢?我们需要把每个字段中的文本转换成数字,这样我们才能进行处理和统计分析。JMP 的一个我最喜欢但又不太常用的功能就是文本浏览器。它其实非常简单。如果某一列中有文本,那么,嗯,就是文本本身。我们可以忽略其他所有内容,因为我们不会用到其他任何东西。这项任务相当简单。
顺便提一下,情感分析是 JMP Pro 的功能。如果您安装了 JMP Pro,就可以使用这项情感分析功能,它会遍历所有文本,并为其分配一个情感评分或感觉评分。我们立刻就能看出,评论者普遍对这些自行车持积极态度。
但我想指出一点,这里涉及到文本筛选的概念。我向下滚动看到“pedal bobbing”这个词,听起来很奇怪。它不是在告诉鲍勃踩踏板。在山地自行车运动中,“pedal bobbing”指的是踩踏板时悬架上下晃动,这是一种不好的现象。JMP 会考虑“pedal bobbing”这个奇怪的词吗?默认情况下不会,但添加起来非常容易。我打算在情感分析中使用它。我要管理这些情感词条。我可以输入“pedal bobbing”,然后给它打-50分,把它添加进去。然后你会发现,当我点击“确定”后,分数会略微变化。虽然这很简单,但也很耗时。
我有一些词语。这实际上是兰登在周六做的,他浏览了文档,整理了所有情感词语,并将它们保存到一个文本文件中。基本上是手动操作了一次。然后 JMP 会将它们复制到剪贴板,我可以按 Ctrl+V 粘贴。点击“确定”后,现在会进行调整。我也可以用文本文件对否定词和加强词做同样的事情。但与其让你们看着我复制粘贴,我还是走个捷径吧。
现在,所有针对此语料库或此文档集进行本地化的文本都已准备就绪。语言已就绪,因此我们可以开始信任这些分数。既然我信任这些分数,我想对它们进行一些处理。要进行处理,最简单的方法可能是点击红色三角形并单击“保存文档分数”。执行此操作后,转到表格,之前只有文本的表格现在多了几列,分别显示正面和负面情感的数量以及总体情感值。
现在我差不多准备好了。接下来我只需要用制表函数把数据更好地整理一下,这样爬坡数据就能分成总体正负两部分。结论部分也一样,要分成总体正负两部分以及下坡数据。如果我把这些数据做成数据表,现在就可以开始处理了。我有了每辆自行车的数据,以及爬坡、下坡和总体的数据。这意味着我可以用图表生成器来比较下坡和爬坡的总体表现。我可以这样说:“这些是自行车。如果我要得出结论,这些是爬坡和下坡都表现出色的自行车。” 简而言之,我现在可以开始处理这些数据了,它们被视为具有性能指标的数据。好了,我们回到兰登那里。
好的,谢谢你,杰德。我这里有杰德制作的那张表格,我们可以看到,表格里有自行车的图片,还有我们对整体感受的分析,包括爬坡、下坡和结尾这三个类别的正面和负面感受。我们已经有了这些信息。另外,我们还分析了所有图片,并生成了这个曲线图。
目前这张表格针对每辆自行车,包含了各项属性,例如防下沉。如果我滚动浏览,可以看到还有防抬升、后轮行程以及所有其他不同的属性。然后是……X轴表示自行车当前行程的位置,Y轴表示该位置对应的属性值。
我们注意到这些自行车的行程差异很大。有些自行车的行程是 100 毫米,或者说车轮可以移动 100 毫米,而有些自行车的行程是 180 毫米。这给我们造成了一些问题,所以我们实际上将所有行程都标准化到了 0 到 1 之间。因此,我们不再关注车轮移动了多远,而是关注自行车行程所占的比例。是行程的 50%,还是最小行程?
现在,为了在函数式数据浏览器中查看这些数据,我们希望它的格式稍作调整。我们将把行程值设为序数值,然后就可以使用制表工具了。我和 Jed 在这个项目中大量使用了制表工具。我们可以选择自行车,然后添加行程,获取该属性,最后得到“Y 值是多少?”
我们把这些数据做成一个数据表,看起来有点乱,因为每个数值对应的位置并不完全一致,所以这里有很多缺失值。比如,踏板回弹有值,但其他数值都没有。杠杆比也有值,但其他数值都没有。结果发现这样看起来不太美观,但实际上并不会导致任何问题。当我们把这些数据导入到函数数据浏览器(Functional Data Explorer)时,它会很好地处理这些缺失值,不会给我们造成任何问题。所以我们觉得这样挺好。
接下来,我们需要将这张表与包含所有自行车评价分数的表连接起来。最简单的方法是使用虚拟连接。您可以在这里调用链接 ID,然后在这里创建一个链接引用,这样我的系统就干净了。我这就把它打开。
您可以看到,这里是我们所有的曲线数据。包括自行车的行程位置、平均防抬升、防下沉、杠杆比、踏板回弹和后轮轨迹。此外,这里还有我们所有的感受评分。
现在,我们要把这些数据导入到功能数据浏览器(Functional Data Explorer)中,并开始分析这些情感与曲线形状之间的关系。如果我们进入“专业建模功能数据浏览器”,现在就来看其中一条曲线。我们来看后轮路径。X轴输入是归一化的行程,自行车名称作为ID。接下来,真正的关键在于将所有情感得分添加到补充字段中。
现在,当功能数据浏览器运行时,这些曲线非常漂亮,因为它们非常平滑,而且是由连杆机构生成的,所以B样条曲线拟合得非常好。我们可以用B样条曲线拟合所有这些曲线,可以看到,大部分变化都集中在形状函数1上。如果我们看一下诊断图,可以看到分量1的变化很大,而分量2的变化不大。然后我们可以把鼠标悬停在这里,可以看到:“好的,这是一辆自行车,如果我们观察它,会发现它的车轴轨迹向前移动了很多。而在另一端,我们看到车轴轨迹向后移动了很多。这就是我们的两个极端情况。”
现在,完成上述步骤后,我们可以利用附加数据来分析我们的 B 样条曲线。由于我们添加了 Z 个额外的因子,因此可以进行功能性 DOE 分析。该分析能够建立情感得分与后向路径之间的关系。由于这些术语很长,所以可能不太容易理解。但前三个术语分别代表我们对攀岩的总体情感、积极情感和消极情感。
如果我们只关注爬坡,并且希望爬坡的整体评价非常好,负面评价也非常好或非常低,那么我们的自行车行驶轨迹大概是这样的,或者说,我们的后方路径大概是这样的。你可以看到,这是一条相当标准的后方路径。它既没有向前移动很远,也没有向后移动很远。所以你可以大致了解一下后方路径。我们可以对每条不同的路径重复这个过程。我们已经这样做了,并且保存了这些预测公式。
最后,我们将所有这些结合起来,构建了一个分析器,该分析器将向我们展示,根据我们所有的评论和我们收集的所有曲线,评论和曲线是如何联系起来的?
这是我们的结论部分,包括正面评价、负面评价和总体评价,以及爬坡的正面评价、负面评价和总体评价,还有下坡的正面评价、负面评价和总体评价。我们来看一个例子:“我们想要一辆特别擅长下坡的自行车。”所以我们要考察下坡的总体表现。我们不希望下坡的负面评价太多,我们希望下坡的正面评价很高。
这有什么作用呢?如果我们把这条后轮轨迹和之前看到的后轮轨迹进行比较,这条轨迹的弧度要大得多。这很合理。这就像骑自行车时,后轮在遇到路面障碍物时会向后移动,避开障碍物一样。比如下坡时撞到石头,后轮就会向后移动。
我还要指出一点,那就是杠杆比。我之前也提到过。山地车的避震器类型有很多种,有弹簧避震器,也有气压避震器。这里就不赘述细节了,这就是弹簧避震器的典型杠杆比。如果你去看看所有专注于速降的山地车,你会发现它们都配备了弹簧避震器。目前行业的大趋势就是在速降山地车上安装弹簧避震器,因为它的性能非常出色,我们的数据也证实了这一点。
我们也可以反过来考虑。我们现在不太在意下坡,但我们想要的是极佳的爬坡性能。我们想派一辆自行车去参加世界杯。现在我们的后轮轨迹和防抬升角度都略有不同。杠杆比,这种杠杆比在气压避震系统中更为常见,你会在专注于爬坡的自行车上看到这种配置,因为它更轻。它在爬坡性能方面也会更胜一筹。
这里的想法是,我们并不是要展示“好的,这就是设计自行车的正确方法”,而是要展示“好的,我们有一些非常复杂的数据”。我们有来自网站评论员的评价,有以图表形式呈现的曲线,利用 JMP,我们可以将所有这些数据整合起来,并生成一个仪表盘,这个仪表盘能够很好地帮助我们理解“好的,这就是评论和这些杠杆比率之间的联系”,以及一些能够帮助我们全面理解并进行更严谨分析的信息,而不仅仅是“嗯,我认为它应该是这样的”。
以上就是我们想分享的内容。如有任何疑问,欢迎随时联系我们。感谢您的时间。