ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据科学案例:从数据提取到探索性数据分析

2022-09-04 12:31:22  阅读:198  来源: 互联网

标签:数据分析 function 需要 探索性 dd 数据 我们 页面


数据科学案例:从数据提取到探索性数据分析

说明如何收集、清理、分析和可视化数据。

Image by Author.

您可能已经多次听到“数据科学”这个词,以至于您觉得您应该知道它的全部含义,但无论您在互联网上阅读了多少定义,您仍然不知道它到底是什么。别担心,你并不孤单。这就是为什么我将引导您完成一个小项目,以展示数据科学项目的外观。并非所有的数据科学项目看起来都一样,因为有许多不同的方法和工具可以用来做同样的事情,并且有许多不同的问题,每个问题可能需要不同的工具、方法和方法。但是这个简短的项目会让你了解在数据科学项目中执行什么样的任务、为什么以及如何执行。

什么是数据科学?简单来说,数据科学可以定义为从数据中提取意义和洞察力的过程。通常,这些是我们在数据科学项目中需要问的问题:

  • 我们试图解决或理解什么问题?
  • 从哪里获取我们需要的数据?
  • 如何从源中提取数据?
  • 我们需要清理数据吗?如果是这样,我们该怎么做?
  • 我们如何操纵数据来获得问题的答案?

需要注意的重要一点是,也可以从数据开始,在处理数据时提出问题或见解,但在大多数情况下,我们都是从问题开始的。考虑到这一点,让我们开始吧。

在这个项目中,我们将尝试分析刚果足球俱乐部的表现并进行比较。

第一部分:制定问题。

刚果当地足球俱乐部在过去几年的表现如何,哪些因素会影响他们的表现?伟大的足球国家,如法国、德国、巴西等,都有非常棒的本地俱乐部,世界各地都有数百万人关注排名靠前的比赛,这当然有助于他们国家队的表现。如果我们知道这些俱乐部在过去几年的表现,我们大概可以了解刚果国家足球队的表现。分析足球队表现的一种方法是使用 ** 胜率** ,即赢得的游戏数除以玩过的游戏总数 ** .**

第二部分:获取数据。

很明显,要获得问题的答案,我们需要数据。我们需要确定数据的来源以及检索数据的最简单方法。对于这个项目,我们将网页抓取 http://soccerstand.com, 直接进入我们需要数据的足球俱乐部的结果页面。我们将这部分分为两个步骤:第 1 步用于从每个页面获取原始数据,第 2 步用于解析每个页面以检索我们想要的特定数据。

抓取过程的一个重要步骤是检查我们的网页,以了解我们需要操作的数据和所有 html 元素的位置。我不会在这里详细介绍如何执行此操作,但请记住,这是找到本文这一部分中将使用的 html 标记的类名和 id 的方式。

第 1 步:从网页中检索原始数据

让我们做所有的导入:

Importing all the components we will need.

当我们使用我们导入的组件时,将解释这些行。

我们将使用 selenium 与 Web 浏览器进行交互,因为我们将抓取的站点是一个动态网站(某些内容仅在用户与浏览器交互时显示,例如通过滚动或单击按钮来加载数据)。在点击任何按钮之前,我们需要给浏览器一些时间来加载数据,就像人类一样,所以让我们设置我们可以等待数据加载到页面上的最长时间: max_pause = 60 #秒

让我们将要抓取的页面存储在一个列表中,因为我们需要所有感兴趣的俱乐部的结果页面,而且它们并不都在一个地方:

 页面 **=** [  
 “https://www.soccerstand.com/team/otoho-d-oyo/0GuF1aSS/results/”,  
 "https://www.soccerstand.com/team/leopard/rulf0ilK/results/",  
 “https://www.soccerstand.com/team/diables-noirs/xlWrOB3I/results/”,  
 “https://www.soccerstand.com/team/etoile-du-congo/dISk7gAI/results/”,  
 “https://www.soccerstand.com/team/cara-brazzaville/AutlQkBd/results/”  
 ]

现在我们定义一个函数,它将列表中的每个链接作为参数,并为我们打开浏览器到该页面。它所做的只是打开浏览器并转到将传入的链接:

The function to open the browser and go a web page.

当我们打开网页时,我们可能必须点击横幅才能将其移开。我们定义了一个函数,它将获取一个浏览器对象(当前打开的网页)并单击带有 id 的任何横幅(它是一个 html 元素) ** 'onetrust-accept-btn-handler'** :

The function to click on any banner on the page.

注意使用 ** WebDriverWait** 和预期的条件( ** 欧共体** ) 我们之前导入的方法。上面它们的使用只是意味着当我们启动浏览器并打开我们的页面时,我们等到具有 id 的元素 ** 'onetrust-accept-btn-handler'** 出现。一旦元素出现,我们点击它。但是我们不会永远等待,并且元素实际上可能永远不会出现,所以我们使用 ** 最大暂停** 我们之前定义的变量(请记住,我们将其设置为 60 秒,但您可以更改它以适应您的情况)。

现在让我们假设我们的网页没有显示横幅,我们可以向下滚动并查看我们想要的所有内容。所以我们定义了一个函数来做这件事,加载整个网页,向下滚动直到到达我们页面的底部,当没有更多的加载时停止,就像人类会做的那样:

The function to lead the page in its full height.

我试图使该功能尽可能不言自明。

现在定义一个最终函数,它将按照所需的顺序调用上述函数,以加载传递 URL 的页面的数据:

The function to retrieve the html data.

因此,对于我们链接列表中的每个页面(我们定义为的变量 ** 页面** 之前)我们调用函数 ** 获取数据()** 检索我们每个足球俱乐部的页面。为此,我们使用列表推导,因此所有页面都存储在我们将调用的列表中 ** 来源** :

 来源 **=** [获取数据(团队) **为了** 团队 **在** 页]

我们运行代码和座椅靠背。该过程大约需要 10 分钟,具体取决于您的互联网速度。下图显示了我们代码的部分结果:

A screenshot of the output for one team. All the others look similar

第 2 步:现在我们为抓取的每个站点解析 html 内容

我们所有的页面都存储在一个列表中( ** 来源** )。我们使用另一个列表推导来获取每个页面的 Soup 对象并将它们存储在另一个我们将调用的列表中 ** ** :

 汤 **=** [BeautifulSoup(来源,“html.parser”) **为了** 资源 **在** 来源]

所有这些页面的 html 内容具有相同的结构,因此我们可以以相同的方式检索所有俱乐部的数据。这意味着我们再次检查了所有页面的 html 文本,并且我们知道我们需要的数据在哪里以及我们需要操作哪些标签。我们编写一个函数来进行解析:

The function to create Data Frames with Data for each team.

然后可以使用和重用该功能。我们将为每个俱乐部调用它,然后将我们抓取的数据保存在 csv 文件中以供将来使用(当我们需要相同的数据时,我们不需要再次抓取)。

Call the function on each soup object for each club, and save the data to csv files.

现在我们有了数据。下一阶段是探索性数据分析 (EDA),我们需要确定数据是否需要一些清理,以及它是否可以帮助我们回答问题。我们将该阶段分为两部分,第一部分用于清洁,第二部分用于分析和可视化。

第三部分:清理数据

这部分很大程度上取决于您的领域知识和您对所拥有数据的理解。我们检查了数据,发现一些名称包含括号、斜杠等,我们不需要这些。因此,我们清理了名称,但我们确保保留带有横杠 (-) 和圆点 (.) 的名称。我们编写了一个函数来做到这一点:

The function to clean clubs names

首先,我们定义一个正则表达式模式来匹配包含一个或多个单词的任何名称,该单词可选地后跟或由任意数量的空格、点或条分隔。这意味着如果文本中还有其他内容,例如括号,我们的模式将只匹配没有该内容的部分。

括号 ** (……)** 在正则表达式模式中意味着我们将模式匹配的任何内容作为一个组,并且 ** ?P ** 意味着我们将捕获的组命名为 ** 姓名** .我们将捕获的组写在方括号内。我们将通过断言测试我们的函数是否如我们所愿:

Assertions to test our name cleaning function

我们还发现今年的比赛有不同寻常的格式。我们还需要清理日期:

The function to clean the dates.

我们为 3 种不同的格式定义了 3 种模式。第一个是带有数字的日期,如“ ** dd.dd。 dd:dd** ” 我们只需要“ ** dd.dd** “ 部分。所以我们的正则表达式使用 ** 积极前瞻 (?= )** 得到“一个或多个数字后跟一个点,然后是一个或多个数字”(我们将采用)后跟一个空格(我们不会采用)。

第二种模式适用于带有数字的日期,例如“ ** dd.dd.dddd** 别的东西”,我们只需要“ ** dd.dd.dddd** “ 部分。此正则表达式还使用 ** 正前瞻 (?=\w+)** 只参加我们想要的部分。

第三种模式适用于带有“”之类数字的日期 ** dd.dd.dddd** “ 独自的。

对于每个匹配模式,我们更改为 ** 日月年** 格式。

我们测试我们的功能:

Assertions to test our date cleaning function.

现在我们可以一次清除所有名称和日期。首先我们连接所有团队的所有数据,然后我们清理名称和日期,将 Event Date 列更改为 datetime 类型,最后更改名称 ** 刚果共和国** 和 ** 非洲** 一个。我们还负责保存新的数据框以备将来需要:

Actual cleaning of the clubs names and match dates, and a few more manipulations.

为了查看所有这些清理的结果,我们将数据框的前 10 行显示为 ** all_df.head(10)** :

The first 10 rows of our Data Frame.

第四部分:分析和可视化数据

我们注意到团队在 2017 年之前不存在,所以如果我们要比较我们的团队,我们需要使用他们都有数据的时期。

Selecting only the games played after 2016 for all teams.

我们可能还想知道打主场还是客场比赛对比赛结果有任何影响。我们不会在这里详细介绍这些细节,但让我们看看如何为此拆分数据:

Splitting Home and Away games.

我们将保留这两个数据框以备不时之需。但是现在让我们创建另一个数据框,通过连接我们的 ** ** 和 ** 离开** 数据帧。注意我们改变了列 ** 客队** 和 ** 团队之家** 至 ** 团队。**

现在让我们按团队、年份和结果对比赛进行分组,并计算每组:

这意味着对于每支球队,我们将计算每年的每场比赛结果。我们还将计数列命名为 ' ** 游戏计数** '。

接下来,我们通过将赢得的比赛总数除以每支球队每年的比赛总数来计算每年的获胜百分比:

我们打印新数据框的前 10 行 ** wins_summary.head(10)** :

从该表中,我们已经可以开始得出一些结论,但我们可能无法清楚地看到数据告诉我们什么。所以是时候可视化数据了。我们将首先添加一列来存储每个团队的颜色。

现在我们可以绘制我们的数据:

运行该代码会得到以下结果:

第五部分:我们回答了什么问题?

这是我们报告分析结果的地方。我们可以将其放入报告中,其结构将根据项目的目的而有所不同。这里必须具备的技能是讲故事。大多数人不需要或不想了解我们使用的所有方法和工具,但他们肯定想了解所有这些的含义是什么?为什么我们在编写长代码和进行大量思考时让自己如此痛苦?我们需要解释结果,并可能根据我们的分析给出一些建议。

我将把这个留给你来谈谈你认为数据告诉我们我们团队的表现以及表现不佳的可能原因。

这就是这个项目。如您所见,没有涉及机器学习,并非所有问题都需要机器学习,因为这完全取决于我们的目标。

可以找到本文的 Notebook 和抓取的数据 这里 .

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/12394/20380412

标签:数据分析,function,需要,探索性,dd,数据,我们,页面
来源: https://www.cnblogs.com/amboke/p/16654834.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有