百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

可用于任何数据集的3种出色的可视化技术

bigegpt 2024-08-14 14:51 2 浏览

同时学习一些关于足球的知识

可视化效果很棒。 但是,很难制作出良好的可视化效果。

此外,要将这些可视化呈现给更多的受众,需要花费时间和精力。

我们都知道如何制作条形图,散点图和直方图,但是我们并没有花太多精力来美化它们。

这伤害了我们-我们在同行和管理人员中的信誉。 您现在不会感觉到,但是它确实发生了。

另外,我发现重用代码非常重要。 每次访问新数据集时,我都需要重新开始吗? 图的一些可重用概念可以帮助我们快速找到有关数据的信息。

在这篇文章中,我还将讨论3种很酷的视觉工具:

  • 与图的分类相关性
  • 配对图 pairplot
  • 使用Seaborn的Swarmplots和图注解。

简而言之,这篇文章是关于有用和可表达的图形的。

我将在kaggle上使用FIFA19完整球员数据集中的数据-最新FIFA19数据库中注册的每个球员的详细属性。

由于数据集有很多列,因此我们将只关注分类和连续列的子集。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
# We dont Probably need the Gridlines. Do we? If yes comment this line
sns.set(style="ticks")
player_df = pd.read_csv("../input/data.csv")
numcols = [
 'Overall',
 'Potential',
'Crossing','Finishing',  'ShortPassing',  'Dribbling','LongPassing', 'BallControl', 'Acceleration',
       'SprintSpeed', 'Agility',  'Stamina',
 'Value','Wage']
catcols = ['Name','Club','Nationality','Preferred Foot','Position','Body Type']
# Subset the columns
player_df = player_df[numcols+ catcols]
# Few rows of data
player_df.head(5)

这是一个格式良好的数据,但是我们需要对工资Wage和身价Value列(因为它们在欧元中并且包含字符串)进行一些预处理,以使其成为数字,以便我们进行后续分析。

def wage_split(x):
    try:
        return int(x.split("K")[0][1:])
    except:
        return 0
player_df['Wage'] = player_df['Wage'].apply(lambda x : wage_split(x))
def value_split(x):
    try:
        if 'M' in x:
            return float(x.split("M")[0][1:])
        elif 'K' in x:
            return float(x.split("K")[0][1:])/1000
    except:
        return 0
player_df['Value'] = player_df['Value'].apply(lambda x : value_split(x))

图类别的相关性:

用简单的术语来说,"相关性"是两个变量如何一起移动的度量。

例如,在现实世界中,收入和支出呈正相关。 如果一个增加,另一个也会增加。

学习成绩和视频游戏使用率呈负相关。 一个增加表示另一个减少。

因此,如果我们的预测变量与目标变量正相关或负相关,那么它就很有价值。

当我们尝试理解数据时,不同变量之间的相关性是一件很不错的事情。

我们可以轻松地使用Seaborn创建一个很好的相关图。

corr = player_df.corr()
g = sns.heatmap(corr,  vmax=.3, center=0,
            square=True, linewidths=.5, cbar_kws={"shrink": .5}, 
            annot=True, fmt='.2f', cmap='coolwarm')
sns.despine()
g.figure.set_size_inches(14,10)
    
plt.show()

但是,您注意到任何问题吗?

是的,此图仅计算"数值"列之间的相关性。

如果我的目标变量是俱乐部或职位怎么办?

我希望能够获得三种不同情况之间的相关性,并且我们使用以下相关性度量来计算这些相关性:

1.数值变量

我们已经采用了Pearson的相关性形式,可以衡量两个变量如何一起移动。 范围是[-1,1]

2.类别变量

对于类别-类别案例,我们将使用Cramer’s V 。 它是两个离散变量的互相关,并与具有两个或多个级别的变量一起使用。 这是一个对称的度量,因为按变量顺序无所谓。 Cramer(A,B)== Cramer(B,A)。

例如:在我们的数据集中,俱乐部和国籍必须以某种方式关联。

让我们使用堆叠图进行检查,这是了解分类变量与分类变量之间分布的一种极好的方法。 我们使用数据的子集,因为此数据中有很多国籍和俱乐部。

我们只保留最好的团队(保留波尔图足球俱乐部只是为了获得更多样本和多样性)和最常见的国籍。

俱乐部的偏好在很大程度上和国籍相关:了解前者有助于预测后者。

我们可以看到一个球员是否属于英格兰,那么他更有可能在切尔西或曼联踢球,而不是在巴塞罗那足球俱乐部,拜仁慕尼黑或波尔图踢球。

所以这里有一些信息。 Cramer’s V 捕获相同的信息。

如果所有俱乐部的每个国籍的球员比例相同,那么Cramer’s V 为0。

例如,如果每个俱乐部都喜欢单一国籍的Cramer’s V == 1,则所有英格兰球员都在曼联踢球,所有德国人都在拜仁慕尼黑打球,等等。

在所有其他情况下,范围为[0,1]

3.数值和分类变量

对于分类连续的情况,我们将使用"相关比率"。

在不进行过多数学的情况下,它可以衡量色散。

给定一个数字,我们可以找出它属于哪个类别?

例如:

假设我们的数据集中有两列:SprintSpeed和Position:

  • GK: 58(De Gea),52(T. Courtois), 58(M. Neuer), 43(G. Buffon)
  • CB: 68(D. Godin), 59(V. Kompany), 73(S. Umtiti), 75(M. Benatia)
  • ST: 91(C.Ronaldo), 94(G. Bale), 80(S.Aguero), 76(R. Lewandowski)
  • 如您所见,这些数字可以很好地预测它们所属的类别,因此具有很高的相关比率。

    如果我知道冲刺速度超过85,则可以肯定地说该球员是ST(前锋)。

    该比率也为[0,1]

    执行此操作的代码来自dython软件包。 我不会在您可以在我的Kaggle内核中找到的代码中写太多。 最终结果如下所示:

    player_df = player_df.fillna(0)
    results = associations(player_df,nominal_columns=catcols,return_results=True)

    它不漂亮吗?

    仅通过查看这些数据,我们就可以对足球有很多了解。 例如:

    • 运动员的位置与运球能力高度相关。 您不会在后面玩梅西。 对?
    • 传球和控球相比,运球的价值更重要。 规则是总是传球。 内马尔,我在看着你。
    • 俱乐部和工资具有较高的相关性。 可以预料的。
    • 身体类型和首选脚部高度相关。 这是否意味着如果您是精益,那么您很可能是左撇子? 没什么意义。 人们可以进一步调查。

    此外,我们可以通过这个简单的图表找到大量信息,而在没有分类变量的典型相关图中看不到该信息。

    我把它留在这里。 人们可以更多地查看图表,并找到更有意义的结果,但重点是,这使生活变得更容易。

    配对图 Pairplot

    虽然我谈论了很多相关性,但这是一个善变的指标。

    为了理解我的意思,让我们看一个例子。

    Anscombe的四重奏包含四个数据集,它们具有几乎相同的1的相关性,但是分布却非常不同,并且在绘制图形时看起来也非常不同。

    因此,有时绘制相关数据变得至关重要。 并分别查看分布。

    现在,我们的数据集中有许多列。 将它们全部绘制成图表会非常费力。

    不,这是一行代码。

    filtered_player_df = player_df[(player_df['Club'].isin(['FC Barcelona', 'Paris Saint-Germain',
           'Manchester United', 'Manchester City', 'Chelsea', 'Real Madrid','FC Porto','FC Bayern München'])) & 
                          (player_df['Nationality'].isin(['England', 'Brazil', 'Argentina',
           'Brazil', 'Italy','Spain','Germany'])) 
                         ]
    # Single line to create pairplot
    g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage']])

    非常好。 我们可以在这张图中看到很多东西。

    • 工资和身价高度相关。
    • 其他大多数值也都相关。 但是,潜力与身价的趋势并不寻常。 我们可以看到随着达到特定的潜在阈值,该值如何呈指数增长。 此信息可能有助于建模。 可以对电位进行一些转换以使其更相关吗?

    注意:没有分类列。

    我们可以做得更好吗? 我们永远可以。

    g = sns.pairplot(filtered_player_df[['Value','SprintSpeed','Potential','Wage','Club']],
                     hue = 'Club')

    如此多的信息。 只需将hue参数添加为分类变量Club。

    • 波尔图的工资分配偏向下方。
    • 我看不到波尔图球员的价值分布如此陡峭。 波尔图的球员总是会寻找机会。
    • 在潜力与工资图表上查看许多粉红色点(切尔西)如何构成聚类。 切尔西有很多低薪的高潜力球员。 需要更多关注。

    我已经知道工资/价值子图中的一些要点。

    工资500k的蓝点是梅西。 而且,比梅西更具价值的橘色点是内马尔。

    尽管此hack仍然无法解决分类问题,但我对分类变量的分布很感兴趣。 虽然个别。

    群图 SwarmPlots

    如何看待分类数据与数值数据之间的关系?

    输入图片Swarmplot,就像它们的名字一样。 为每个类别绘制了大量的点,并在y轴上分散了一些点,使它们更易于查看。

    它们是我目前绘制这种关系的最爱。

    g = sns.swarmplot(y = "Club",
                  x = 'Wage', 
                  data = filtered_player_df,
                  # Decrease the size of the points to avoid crowding 
                  size = 7)
    # remove the top and right line in graph
    sns.despine()
    g.figure.set_size_inches(14,10)
    plt.show()

    为什么不使用Boxplots? 中位数在哪里? 我可以画吗? 明显。 将条形图叠加在顶部,我们有一个漂亮的图形。

    g = sns.boxplot(y = "Club",
                  x = 'Wage', 
                  data = filtered_player_df, whis=np.inf)
    g = sns.swarmplot(y = "Club",
                  x = 'Wage', 
                  data = filtered_player_df,
                  # Decrease the size of the points to avoid crowding 
                  size = 7,color = 'black')
    # remove the top and right line in graph
    sns.despine()
    g.figure.set_size_inches(12,8)
    plt.show()

    非常好。 我们可以在图表上看到各个点,可以看到一些统计数据,并可以明确地了解工资差异。

    最右边的点是梅西。 但是,我不必在图表下方的文本中告诉您。 对?

    此图将在演示文稿中显示。 你老板说。 我想在这张图上写梅西。 进入图片注释。

    max_wage = filtered_player_df.Wage.max()
    max_wage_player = filtered_player_df[(player_df['Wage'] == max_wage)]['Name'].values[0]
    g = sns.boxplot(y = "Club",
                  x = 'Wage', 
                  data = filtered_player_df, whis=np.inf)
    g = sns.swarmplot(y = "Club",
                  x = 'Wage', 
                  data = filtered_player_df,
                  # Decrease the size of the points to avoid crowding 
                  size = 7,color='black')
    # remove the top and right line in graph
    sns.despine()
    # Annotate. xy for coordinate. max_wage is x and 0 is y. In this plot y ranges from 0 to 7 for each level
    # xytext for coordinates of where I want to put my text
    plt.annotate(s = max_wage_player,
                 xy = (max_wage,0),
                 xytext = (500,1), 
                 # Shrink the arrow to avoid occlusion
                 arrowprops = {'facecolor':'gray', 'width': 3, 'shrink': 0.03},
                 backgroundcolor = 'white')
    g.figure.set_size_inches(12,8)
    plt.show()
    • 见那里的波尔图。 用这么小的工资预算与巨人竞争。
    • 皇家和巴塞罗那有那么多高薪球员。
    • 曼城的工资中位数最高。
    • 曼联和切尔西相信平等。 许多参与者聚集在相同的工资水平上。
    • 我很高兴,虽然内马尔比梅西更受重视,但梅西和内马尔之间的工资差异很大。

    在这个疯狂的世界中有种常态。


    结论

    因此,回顾一下,在本文中,我们讨论了如何计算和读取不同变量类型之间的相关性,绘制数值数据之间的相关性,以及使用Swarmplots,使用数值数据绘制类别数据。 我喜欢我们如何在Seaborn中将图表元素彼此叠加。

    如果您喜欢这篇文章,请点赞。


    (本文翻译自Rahul Agarwal的文章《3 Awesome Visualization Techniques for every dataset》,参考:https://towardsdatascience.com/3-awesome-visualization-techniques-for-every-dataset-9737eecacbe8)

    相关推荐

    为3D手游打造, Visual Studio Unity扩展下载

    IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

    由ArcMap属性字段自增引出字段计算器使用Python的技巧

    1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

    微软首次回答 HoloLens 相关问题,终于爆料了

    fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...

    C#指针的应用(c#指针类型)

    C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...

    C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)

    C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...

    欢迎回来:Fortran意外重回流行编程语言20强榜单

    TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...

    C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案

    简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...

    C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤

    在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...

    C# (一)状态机模式(状态机代码实现)

    最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...

    C# 中 Predicate 详解(c#中的replace)

    Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...

    C#中$的用法?(c#中&&什么意思)

    文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...

    C#并行编程:Parallel类(c# 并行处理)

    在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...

    颠覆认知!用Span重构foreach循环竟让数据处理快如闪电

    在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...

    Unity3D手游开发实践《腾讯桌球》客户端开发经验总结

    本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...

    .NET 7 AOT 的使用以及 .NET 与 Go 互相调用

    目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...