<原创:大师兄> 2020-03-05
“业务理解篇”上线之后,不少朋友就迫不及待的想要看“数据理解篇”。今天,我就要给大家开启“数据分析零基础系列(2):数据理解篇”。
开篇之前,我还是希望和大家继续聊聊数据和业务的那些事情,因为它实在太重要了。纵览各行各业的数据应用情况,数据的价值,始终是要建立在具体的业务场景之上,尤其是依赖于那些带有强烈不确定性的业务场景,不确定性越高,数据需求越强,创造的价值潜力就越大。
比如疫情期间,北京要求外地返京人士隔离14天,那怎么能够精准识别某个人是否在北京隔离了14天,除了小区居委会开的证明,也可通过运营商收集到的用户地理位置数据,精准判断一个人的行为轨迹,来识别个人最近14天的活动范围。这个数据对于在疫情期间,做好人口的流动管理,非常有价值。
所以,我始终坚持,场景第一,数据第二,算法第三。
天底下算法都是一个老师教出来的,都是确定的,可学习的,各种算法的组合也都是确定的,所以说算法最不会造成一个人或者一个企业的竞争优势。往往数据的独特性和唯一性,能够形成比较大的竞争优势。比如很多企业看不到消费者的消费记录,支付宝,它牛逼,它能看到,所以它能把征信做的很牛逼,使用简单的逻辑回归,都能做的比别人好。但是假如有一个好的场景,不做数据分析都能赚钱,做数据分析就更赚钱了。比如淘宝,流量够大了,不做数据分析,随便看看昨天什么卖的好,今天就推荐什么,虽不是最优,但也差不到哪去。
言归正传,我们今天好好聊聊“数据理解”。
数据理解是从原始数据集开始熟悉和了解数据,并初步探索数据知识,或者挖掘有深层含义的数据子集来形成对隐藏信息的假设。数据理解可以理解为数据的可行性研究,即通过先期的基本数据认识来确定当前数据条件是否可以满足数据挖掘所需条件并初步判断如何实现的问题。
数据理解阶段,需要确定源数据标准如数据来源、范围、状态或者时间性特征,数据集基本特征如数据类型、最大值、最小值、均值、标准差、偏度、唯一性、有效记录数及数据分布规律等。接下来,给大家展示七种方法来帮助大家理解数据。
简单地查看前几行数据
审查数据的行数和列数
审查字段的数据类型
查看分类字段的分布情况
通过描述统计分析数据
理解各字段的相关性
审查各字段的分布状况
模拟数据集生成
首先,为了便于理解这些方法,模拟一个虚拟数据集给大家示例下,该数据集共769行和9列,具体的Python代码如下:
import numpy as np
import pandas as pd
pd.set_option('display.float_format', lambda x: '%.3f' % x)#显示3位小数
perg=np.random.randint(0,27,size=769)
plas=np.random.randint(0,199,size=769)
pres=np.random.randint(0,122,size=769)
skin=np.random.randint(0,99,size=769)
test=np.random.randint(0,846,size=769)
mass=np.random.uniform(0,68,size=769)
pedi=np.random.uniform(0,2.5,size=769)
age=np.random.randint(21,81,size=769)
Class=np.random.randint(0,2,size=769)
data=pd.DataFrame()
data['perg']=perg
data['plas']=plas
data['pres']=pres
data['skin']=skin
data['test']=test
data['mass']=mass
data['pedi']=pedi
data['age']=age
data['Class']=Class
简单地查看前几行数据
对数据的简单审视,是加强对数据理解最有效的方法之一。通过对数据的观察,可以提前了解数据有哪些字段,每个字段属于什么数据类型,是整数型,还是浮点型,还是字符型,这些发现有助于对数据进行整理。接下来通过一个简单的例子展示一下如何查看数据。这个例子是查看前10行数据。代码如下:
import numpy as np
import pandas as pd
#简单查看数据,显示前10行
peek=data.head(10)
perg plas pres skin test mass pedi age Class
0 23 81 66 2 817 52.550 0.055 35 0
1 20 84 45 52 558 37.238 1.955 67 1
2 15 14 89 2 593 17.838 0.300 78 1
3 22 42 90 80 325 51.667 0.479 24 0
4 10 50 13 22 328 65.769 0.887 62 0
5 8 89 30 60 754 56.617 0.328 71 0
6 8 48 90 12 582 23.732 2.192 31 1
7 5 180 48 96 169 54.091 2.002 59 1
8 5 169 95 93 220 46.859 0.079 39 1
9 22 26 86 15 680 6.406 1.700 66 0
审查数据的行数和列数
在数据分析中,数据量过大,假如分析工具选择不合适,分析效率会比较低。数据量过小,假如数据有太多的特征,会导致分析结果有效性比较低。所以,我们需要要注意数据的行和列,必须对所拥有的数据非常了解,要知道有多少行和多少列。通过DataFrame的shape属性,可以很方便地查看数据集中有多少行和多少列。代码如下:
import numpy as np
import pandas as pd
print(data.shape)
(769, 9)
审查字段的数据类型
类型是数据很重要的一个属性。数据的类型,直接会影响到模型的选择。比如,分类模型,会要求字符串转化成数值型,以便于计算和分类。可以通过DataFrame的Type属性来查看每一个字段的数据类型。代码如下:
import numpy as np
import pandas as pd
print(data.dtypes)
perg int32
plas int32
pres int32
skin int32
test int32
mass float64
pedi float64
age int32
Class int32
dtype: object
查看分类字段的分布情
在分类算法中,需要知道每个分类的数据大概有多少条记录,以及数据分布是否平衡。如果数据分布的平衡性很差,需要在数据加工阶段(抽样)进行数据处理,来提高数据分布的平衡性。利用Pandas的属性和方法,可以很方便地查看数据的分布情况。代码如下:
import numpy as np
import pandas as pd
print(data.groupby('Class').size())
Class
0 382
1 387
dtype: int64
通过描述统计分析数据
描述性统计可以给出一个更加直观、更加清晰的视角,以加强对数据的理解。在这里可以通过DataFrame的describe()方法来查看描述性统计的内容。这个方法给我们展示了八方面的信息:数据记录数、平均值、标准方差、最小值、下四分位数、中位数、上四分位数、最大值。这些信息主要用来描述数据的分布情况。代码如下:
import numpy as np
import pandas as pd
pd.set_option('display.width', 100)
print(data.describe())
perg plas pres skin test mass pedi age Class
count 769.000 769.000 769.000 769.000 769.000 769.000 769.000 769.000 769.000
mean 12.770 99.945 59.559 49.843 421.537 34.420 1.236 49.191 0.503
std 7.870 56.267 34.603 28.696 240.698 19.250 0.730 17.826 0.500
min 0.000 0.000 0.000 0.000 0.000 0.126 0.000 21.000 0.000
25% 6.000 50.000 30.000 25.000 214.000 18.486 0.581 33.000 0.000
50% 13.000 101.000 60.000 50.000 431.000 34.398 1.214 48.000 1.000
75% 19.000 150.000 89.000 74.000 631.000 51.427 1.905 65.000 1.000
max 26.000 198.000 121.000 98.000 845.000 67.826 2.497 80.000 1.000
理解各字段的相关性
各字段的相关性是指数据的两个字段是否互相影响,以及这种影响是什么方式的等。通用的计算两个字段的相关性的方法是皮尔逊相关系数,皮尔逊相关系数是度量两个变量间相关程度的方法。它是一个介于1和-1之间的值,其中,1表示变量完全正相关,0表示无关,-1表示完全负相关。在数据挖掘建模过程中,当数据的关联性比较高时,有些算法(如线性回归、逻辑回归等)的性能会降低。所以在开始训练算法前,查看一下字段的关联性是一个很好的方法。当数据字段的相关性比较高时,应该考虑对特征进行降维处理。下面通过使用DataFrame的corr()方法来计算数据集中数据属性之间的关联关系矩阵。代码如下:
import numpy as np
import pandas as pd
print(data.corr(method='pearson'))
perg plas pres skin test mass pedi age Class
perg 1.000 -0.011 -0.008 -0.029 0.001 0.023 0.052 0.017 0.012
plas -0.011 1.000 0.009 0.031 0.062 0.023 0.050 0.004 0.024
pres -0.008 0.009 1.000 -0.041 0.034 -0.025 0.008 0.017 -0.004
skin -0.029 0.031 -0.041 1.000 0.000 -0.012 -0.041 0.018 -0.032
test 0.001 0.062 0.034 0.000 1.000 -0.007 -0.057 0.072 0.054
mass 0.023 0.023 -0.025 -0.012 -0.007 1.000 -0.022 0.013 -0.002
pedi 0.052 0.050 0.008 -0.041 -0.057 -0.022 1.000 -0.055 0.010
age 0.017 0.004 0.017 0.018 0.072 0.013 -0.055 1.000 -0.061
Class 0.012 0.024 -0.004 -0.032 0.054 -0.002 0.010 -0.061 1.000
审查各字段的分布情况
通过分析数据的高斯分布情况来确认数据的偏离情况。高斯分布又叫正态分布,是在数据、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响。高斯分布的曲线呈钟形,两头低,中间高,左右对称。在高斯分布图中,y轴两点之间的面积是发生的概率。很多算法都会假定数据遵循高斯分布,先计算数据的高斯偏离状况,再根据偏离状况准备数据。我们可以使用DataFrame的skew()方法来计算所有数据属性的高斯分布偏离情况。代码如下:
import numpy as np
import pandas as pd
print(data.skew())
perg 0.034
plas -0.037
pres -0.027
skin -0.030
test -0.032
mass -0.047
pedi 0.043
age 0.105
Class -0.013
dtype: float64
掌握这些方法后,在审查数据的时候,还需要记住以下几个小技巧。
审查数据:通常描述性分析给出的数据对数据的理解是不充分的,应该多观察和思考数据的特点,找到数据的内在联系和对解决问题有什么益处。
问为什么:审查数据后多问几个“为什么”,如你是如何看到和为什么看到这些数据的特殊性的,这些数据和问题如何关联到一起的,以及这些数据和我们的问题有什么关系等。
写下想法:写下自己通过观察得到的想法,将观察到的数据各维度的关联关系和我们的想法都记录下来。例如,数据代表什么,将采用什么样的技术继续挖掘数据等。写下的这些想法将会给新的尝试带来极大的参考价值。
数据分析或者数据挖掘中,通过对数据的理解,可以选择有效的算法来建立模型。本篇文章介绍了七种方法来观察和理解数据,这为发现数据的特征和选择合适的算法提供了思路。大家也可以尝试用另外一种观察数据的有效手段,就是通过Python的Matplotlib包提供的可视化图表来展示数据,以便于发现数据的特征。
以上介绍,对于零基础的数据分析小白,也会很困惑,里面涉及到理论知识,都是统计学中的基本概念,所以要求大家必须熟练掌握统计学的基础知识。另外一个,就是Python工具,这是数据分析的常用工具,需要大家掌握。
发表评论 取消回复