首页 > 其他分享 >数据科学案例:从数据收集到探索性数据分析

数据科学案例:从数据收集到探索性数据分析

时间:2022-09-05 09:59:17浏览次数:90  
标签:数据分析 function 需要 探索性 dd 数据 我们 页面

数据科学案例:从数据收集到探索性数据分析

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

Image by Author.

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

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

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

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

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

第一部分:制定问题。

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

第二部分:获取数据。

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

抓取过程的一个重要步骤是检查我们的网页,以了解我们需要操作的数据和所有 html 元素的位置。我不会在这里详细介绍如何做到这一点,但请记住,这就是 ** html标签'** 类名 和 ** 身份证** 将在本文的这一部分中使用的那个被发现。

步骤 1:从网页中检索数据

让我们做所有的导入:

Importing all the components we will need.

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

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

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

 页面 **=** [  
 “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 秒,但您可以更改它以适应您的情况)。 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/15486/43050509

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

相关文章

  • TensorLayer出现数据形状转换错误
    参考链接:TensorLayer/tutorial_cifar10_cnn_static.pyatmaster·tensorlayer/TensorLayer(github.com)1.错误部分使用TensorLayer来进行CIFAR-10数据集上的图像......
  • Sentinel-3(哨兵3)数据处理
     Sentinel-3(哨兵3)卫星是欧空局(ESA)和欧洲委员会(EC)卫星项目,该卫星搭载OLCI(海陆色度仪)和SLSTR(海陆表面温度辐射计),可提供全球多光谱中等分辨率海洋/陆地观测能力。海洋方面,可......
  • ENVI中高分六号WFV数据大气校正方法
    高分六号于2019年3月21日正式投入使用,它是一颗低轨光学遥感卫星,具有高分辨率、宽覆盖、高质量和高效成像等特点,配置2米全色/8米多光谱高分辨率相机(PMS)、16米多光谱中分辨率......
  • [MySQL]查询所有表数据量
    1.所有表mysql>SELECTTABLE_NAME,TABLE_ROWSFROMinformation_schema.`TABLES`->WHERETABLE_SCHEMA=(SELECTdatabase())->ORDERBYTABLE_ROWSDESC;......
  • Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
    在上篇文章的基础上:Vue学习之--------深入理解Vuex之getters、mapState、mapGetters1、在state中新增用户数组2、新增Person.vue组件提示:这里使用nanoid来生成新用户......
  • 关系型、非关系型数据库存储选型盘点大全
      工作中总是遇到数据存储相关的Bug工单,新需求开发设计中也多多少少会有数据模型设计和存储相关的问题。经过几次存储方案设计选型和讨论后发现需要有更全面的思考......
  • SQL SERVER数据库常用命令
    创建数据库:  命令:createdatabase数据库名; 示例:createdatabasestudent;删除数据库: 命令:dropdatabase数据库名; 示例:dropdatabase student;新建表格:......
  • MySQL 指定ip和端口连接数据库,并修改数据库密码
    一、指定ip和端口连接数据库找到本机所安装的mysql目录,在开始,输出cmd,cd D:\ProgramFiles\MySQL\mysql-8.0.29-winx64\bin\ 进入当前版本目录    命令......
  • 自动化测试如何管理测试数据
    前段时间,知识星球里有同学问到:自动化case越多,测试数据越多,数据的管理成本也越来越高,是否需要一个数据池来专门管理测试数据?这是一个好问题,也是很多测试同学在自动化测试......
  • 如何成为一名数据工程师:完整的路线图
    如何成为一名数据工程师:完整的路线图关于如何学习数据工程的完整路线图。Photoby这是工程RAEngon不飞溅什么是数据工程?数据工程是设计和构建用于大规模收集、存......