马自达mx5,开掘数据中的信息 -- 数据探究之描述性计算!内附python教程共享,大年初三

频道:推荐新闻 日期: 浏览:172

在现在这个大数据年代,数据的价值得到遍及的认可。可是,数据为什么有价值呢?假如,数据仅仅静静地躺在服务器中,又或是默默地流动在网络中,它们又能带来什么?

数据就好像海滨的沙子,潮起潮落,年月轮转,它们也仅仅是沙子罢了;但假如有猎奇的孩子在沙滩上游玩,他们或许能发现沙子下埋藏的美丽贝壳,又或许能用沙子垒成风趣的玩具城堡;假如来了位手工精深的匠人,他就能将沙子变魔术般变成晶莹剔透的玻璃;假如来的是一群勤劳才智的人们,他们就能将沙子与水泥混组成巩固的混凝土,然后盖起一座城。

你必定发现了,数据要通过加工和挖掘,变成有用的信息,才具有真实的价值。四百年前,在天文学和占星术还牵扯不清的年代,作为天文学家和占星术士的第谷几十年如一日地观测天体运转数据,其精度可谓达到了肉眼观测的极限。可是让这些数据真实发挥价值的却是第谷的弟子开普勒,通过很多的数据剖析,开普勒发现了行星的椭圆运转轨道,然后又得出了开普勒三规律。

数据剖析的宗旨,一直是挖掘数据中的有价值的信息,更进一步是将信息转换为知识,最难的是将知识升华为洞见。做为数据剖析的序幕,让咱们首要用描述性核算学的办法来探求数据中隐含的信息。

在上一篇《数据剖析的流程》中,咱们讲到将运用美国行为危险要素监控体系BRFSS数据,来企图答复这么一个问题:现在美国的有钱人们是更胖仍是更瘦呢?那么接下来,咱们将从数据的中心趋势、相对方位、离散度、相关性四个方面,运用核算量和核算图两种办法,来挖掘BRFSS数据中的信息。

描述性核算食人尸乐队内容纲要


数据导入

首要,咱们导入相应的Python模块和BRFSS数据。假如你想亲手实践一下,也能够在此处github中下载数据和源代码。

import pandas as pd # 导入各类模块
import nu桦甸青年mpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import brfss
%马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三config InlineBackend.figure_forma马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三t = 'retina' # 设置图画明晰度
df = brfss.ReadBrfss() # 导入 BRFSS 数据

数据以DataFrame的格局存储,每一行是一个受访者的查询数据,每一列是一项特点,咱们先选取bmi和income两列。其间bmi列代表BMI指数,用来衡量人的胖瘦程度,BMI指数越高人越胖。income列代表收入水平,这儿分了8级,别离用数字1到8代表,8级是年家庭收入逾越7.5万美元的人群,在这儿咱们将8级的人群界说为有钱人,其他1-7级的人群界说为一般人。下面列出了前5行数据,能够感触下数据的大致姿态。

bmi_income = df[['bmi','income']].dropna() # 选取bmi和income两列数据,并放弃缺失的数据。
bmi_income.head() # 显现前5行数据

前5行数据

上面几行内容并不能展示出数据的全貌,所以咱们运用info()办法,能够得到该数据一共有343092行,每一列都是浮点类型数据,且没有缺失值。

bmi_income.info()

Int64Index: 343092 entries, 0 to 441455
Data columns (total 2 columns):
bmi 343092 non-null float64
income 343092 non-null float64
dtypes: float64(2)
memory usage: 7.9 MB

接着咱们提取收入水平为8级的有钱人们的bmi数据,存入变量bmi_rich中,相应的其他一般人的bmi数据存入变量bmi_ord中。

bmi_rich = bmi_income[bmi_income.income == 8]['bmi']
bmi_ord = bmi_income[bmi_income.income != 8]['bmi']

用describe()办法查看这两类人群的bmi数据在核算方面的信息,包含样本量(count)、均值(mean)、标准差(std)、最大(max)和最小(min)值,以及分位数。

bmi_rich.describe()
count 110259.000000
mean 27.450733
std 5.900353
min 12.050000
25% 23.690000
50% 26.570000
75% 30.040000
max 97.650000
Name: bmi, dtype: float64
bmi_ord.describe()
count 232833.000000
mean 28.537320
std 6.971436
min 12.020000
25% 24.03鬼子你等着0000
50% 27.370000
75% 31.620000
max 97.650000
Name: bmi, dtype: float64

目前为止,咱们对所剖析的数据有了抽象的感觉,那么接下来让咱们逐个细心研讨一番。


中心趋势

假如要用一个数字来代表一组数据,你会用什么呢?你首要想到的大约会是管用均匀值,咱们日子中常常运用均值的概念,比方某某国家的人均收入,人均寿数,某个职业的均匀薪水等等,不乏其人。当然除了均值,还有中位数和众数,都能够用来代表一组数据的中心趋势。

  • 均值:

因为存储两类人群的bmi数据bmi_rich和bmi_ord都是Pandas中的Series数据类型,所以咱们运用mean()办法来求管用均匀值。经核算,有钱人们的BMI指数均值为27.45,薛雪薛柔一般人的则是28.54,从均值上看,好像有钱人们更瘦一些。

mean_rich = bmi_rich.mean() # 核算均值
mean_ord = bmi_ord.mean()
print('BMI mean of rich people: %.2f' % mean_rich)
print('BMI mean of ordinary people: %.2f' % mean_ord)
BMI mean of rich people: 27.45
BMI mean of ordinary 川岛雪肤people: 28.54
  • 中位数

假如将数据从小到大按顺序摆放,那么处于中心的那个数便是中位数。假如样本总量是偶数,中心就存在两个数,那么中位数便是这二者的均匀值。当数据中出现反常违背中心的值时,中位数就比均值更具代表性。比方咱们常觉得自己的收入拖了全国人民的后腿,那是因为用了均匀值作为过错的比较目标,假如将那些占比虽少但动辄就要先赚它1个亿的超级富豪们从核算中去除,那么你或许会得到不少安慰。

相同,运用median()办法可核算中位数。将这儿得到的中位数和上面的均值作比较,你能得出什么定论呢?先考虑一下,咱们后边揭晓答案。

median_rich = bmi_rich.median() # 核算中位数
median_ord = bmi_ord.median()
print('BMI median of rich people: %.2f' % median_rich)
print('BMI median of ordi马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三nary people: %.2f' % median_ord)
BMI median of rich people: 26.57
BMI median of ordinary people: 27.37
  • 众数

正如其名,众数便是数量最多的那一个数,比方推举中最多的那个票数,商家最热销产品的销售量。众数一般是用在不接连的分类数据中,但假如用在接连数据中,一般是将接连数据区分红多个区间,核算每个区间的数据量,然后得出数量最多的那个区间。

在这儿,BMI指数本是接连数值,但因为只准确到小数点后两位,所以也能够将之看成是离散不接连的,又因为咱们数据的样本量十分之大,所以这儿也能够用mode()得到bmi的众数。

# 核算有钱人的众数
mode_rich = bmi_rich.mode().iloc[0]
mode_count_rich = np.sum(bmi_rich == mode_rich)
print('BMI mode of rich people: %.2f (counts %d)' % (mode_rich, mode_count_rich))
# 核算一般人的众数
mode_ord = bmi_ord.mode().iloc[0]
mode_count_ord = np.sum(bmi_ord == mode_ord)
print('BMI mode of ordinary people: %.2f (counts %d)' % (mode_ord, mode_count_ord))
BMI mode of rich吴悦彤 people: 26.63 (counts 1246)
BMI mode of ordinary people: 26.63 (counts 2766)
  • 均值的差值

还记得咱们进行数据探求的初衷吗?便是找到有钱人胖瘦问题的答案。最简略的衡量办法,是核算两类人群BMI指数均值的差。

print("mean difference (rich - ordinary) : %.2f" % (mean_rich - mean_ord))
mean difference (rich - ordinary) : -1.09

上面的核算通知咱们,有钱人的BMI均值比一般人小了1左右,那么咱们是否能够以为有钱人更瘦呢?是不是无法振振有词地下定论,究竟咱们只用了一个数值来代表整体数据,这个均值有多牢靠呢?让咱们持续深化下去。

  • 直方图

假如将BMI数据等分红若干个区间,核算落入每个区间的数据的数量,就能够得到下面的直方图,横轴代表BMI指数的值,纵轴是每个区间内数据量。直方图能够反映数据的整体散布状况,从图中能够看出人们的BMI指数大致会集在20到40之间,当然也有反常挨近100的人,仅仅数量十分少。一起也能十分直观地qq大盗找到众数,便是最高的那个竖条地点的区间。值得注意的是,直方图中区间区分的不同,也会影响图形的姿态和众数,特别是在数据量较少的状况下。

fig = plt.figure(figsize=(14,4))
# 制作有钱人bmi数据的直方图
p1 = fig.add_subplot(121)
plt.hist(bmi_rich, bins=50, rwidth=0.9)
plt.xlabel('BMI')
plt.ylabel('Counts')
plt.title('BMI histogram of rich people')
# 制作一般人bmi数据的直方图
p2 = fig.add_subplot(122)
plt.hist(bmi_ord, bins=50, rwidth=0.9)
plt.xlabel('BMI')
plt.ylabel('Counts')
plt.title('BMI histogram of ordinary people')
plt.show()

直方图1

为了更明晰地比较两类人群的数据散布,咱们将上面两个直方图合在一起,一起截取了BMI取值在10到60之间的数据。用紫色代表的一般人群的散布整体上比用赤色代表的有钱人的散布更向BMI值大的方向违背,这让咱们好像更坚信有钱人更瘦一些,因为现在让咱们得出定论的不是单单一个数值,而是许多数据组成的图。可是在直方图中好像看的还不行清楚,有没有更明晰的图来表明呢?显着咱们也有更好的东西,但在此之前,让咱们先来看下直方图中所反映的数据散布的一个性质:偏度。

plt.hist(bmi_rich, bins=50, range=(10,60), normed=True, label='rich', alpha=0.4, color='red')
plt.hist(bmi_ord, bins=50, range=(10,60), normed=True, label='ordinary', 马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三alpha=0.4, color='blue')
plt.legend()
plt.xlabel('BMI')
plt.ylabel('probability density')
plt.title('BMI histogram')
plt.show()

直方图2

  • 偏度

细心调查BMI散布的直方图,尽管数值会集在20到40之间,可是在其右边有一条细细长长的尾巴,咱们称这样的散布是右偏的,核算其偏度也是一个正数。之前在得到BMI散布的均值和中位数时,我曾留下一个悬念,比较发现中位数比均值偏小,这正是右偏散布的特性。不仅如此,在右偏散布中,衡量数据中心趋势的三个量联系如下:众数 < 中位数 < 均值。咱们从下图中能够明晰的看出这一联系。

# 核算众数区间
bin_edge = np.arange(10,60,1)
counts, bins = np.histogram(bmi_rich, bin_edge)
mode_left = bins[np.argmax(counts)]
mode_right = bins[np.argmax(counts)+1]
mode_middle = (mode_left + mode_right) / 2
print('mode range: (%.2f, %.2f)' % (mode_left, mode_right))
print('median: %.2f' % median_rich)
print('mean: %.2f' % mean_rich)
# 核算偏度
print('skewness: %.2f' %bmi_rich.skew())
# 做图
plt.axvline(x=mean_rich, linewidth=1, color='red', label='mean')
plt.axvline(x=median_rich, linewidth=1, color='green', label='median')
plt.axvline(x=mode_middle, linewidth=1, color='blue', label='mode')
plt.legend()
plt.hist(bmi_rich, bins=bin_edge, range=(10,60), rwidth=0.9, alpha=0.5)
plt.xlabel('BMI')
plt.ylabel('Counts')
plt.title('BMI distribution of rich people')
plt.show()
mode range: (25.00, 26.00)
median: 26.57
mean: 27.45
skewness: 2.58

直方图3

已然有右偏,那天然也有左偏,其偏度为负值,性质也与右偏相反。下面给出了咱们研讨的样本人群收入水平的散布,是一个左偏的散布。

# 收入水平的散布
print('skewness: %.2f' %bmi_income.income.skew())
bins = np.arange(1,10)
plt.hist(bmi_income.income, align='left', bins=bins, rwidth=0.9)
plt.title('income distribution')
plt.xlabel('income level')
plt.ylabel('counts')
plt.show()
skewness: -0.74

收入水平的直方图


相对方位

  • ECDF图

在比较两类人群的bmi数据时,咱们先后运用了均值和直方图,这两者其实都是对数据信息的紧缩。均值将信息紧缩到一个数值,而丢掉了大部分信息量;相比之下直方图则保留了更多的信息量,仅仅将数据紧缩到一个个接连的区间中。这也便是为什么之前咱们在比较两类人的直方图时,总有看不逼真的感觉。那么有没有什么办法能显现一切的数据点呢?这便是下面所示的经历累积散布函数图:ECDF(Empirical Cumulat野猫口神龙事情ive Distribution Function)。

将BMI数据从小到大摆放,并用排名除以总数核算每个数据点在一切数据中的方位占比。比方一共100个数据中排第20位的数据,其方位占比为20/100=0.2 。将一切的数据以BMI值为横坐标,方位占比数值为纵坐标描画于图中,就得到了ECDF图。

def ecdf(data): # 核管用据的ECDF值
x = np.sort(data)
y = np.arange(1, len(x)+1) / len(x)
return (x,y)
def plot_ecdf(data, xlabel=None , ylabel='ECDF', label=None): # 制作ECDF图

x, y = ecdf(data)

_ = plt.plot(x, y, marker='.', markersize=3, linestyle='none', label=label)
_ = plt.legend(markerscale=4)
_ = plt.xlabel(xlabel)
_ = plt.ylabel(ylabel)
plt.margins(0.02)
plot_ecdf(bmi_rich,label='rich')
plot_ecdf(bmi_ord, xlabel='BMI',label='ordi太阳女战士nary')
plt.show()

ECDF图

ECDF图中显现了一切的数据点及其在样本中所在的方位,从上图中能够明晰地看到一般人群(绿色点)比有钱人(蓝色点)的散布更靠右,即向BMI变大的方向偏移。

  • 分位数

在ECDF图中咱们能够得到许多信息,比方最大和最小北京丝足会所值。

print('min: ', bmi_rich.min())
print('max: ', bmi_rich.max())
min: 12.05
max: 97.65

因为ECDF图的纵坐标的特点,咱们从图中也能够得到恣意份额所对应的分位数。比方中位数,便是占比为50%的分位数。别的经常用到的还有25%和75%所对应的四分位数,而这两者的差值,称为IQR(Interquartile range),它能够看做样本变异性的衡量。

q1 = bmi_rich.quantile(0.25)
q2 = bmi_rich.quantile(0.5)
q3 = bmi_rich.quantile(0.75)
IQR = q3 - q1
print('25%: ', q1)
print('50%: ', q2)
print('75%: ', q3)
print('IQR: %.2f' % IQR)
25%: 23.69
50%: 26.57
75%: 30.04
IQR: 6.35
  • 箱图(box plot)

更直观反映分位数的是箱图,图中直接画出了中位数、四分位数和IQR,而且从中还能发现离群值,它们是数据中反常大或反常小的数值。在箱图的上下两边别离有两道篱笆,它们的数值别离是Q1-1.5IQR和Q3+1.5IQR,其间Q1,Q3是四分位数。而处于这两道篱笆之外的数值能够看做反常值。

# 制作箱图
bmi_income['income_level'] = bmi_income.income.apply(lambda x: 'rich' if x==8 else 'ordinary')
sns.boxplot(x='income_level', y='bmi', data=bmi_income, palette="Set3")
plt.show()

箱图


离散度

在比较有钱人和一般人BMI的均值后,让咱们不敢妄下定论的还有一点,爱拉尼卫浴便是咱们忧虑这样的差值是不是足够大,大到足以逾越每组人群自身的动摇性呢?

  • 方差和标准差

数据环绕均值的上下动摇,也能够看做是数据的离散程度,咱们运用方差和标准差来衡量。标准差是方差的平方根,代表数据中一切点间隔均值的均匀间隔,其公式界说如下:

标准差公式

这儿分母中运用N-1而非N,是因为当运用样本数据估测整体的标准差时,需进行Bessel批改。

运用var()和std()办法核算方差和标准差。

var_rich = bmi_rich.var()
std_rich = bmi_rich.std()
print(' For rich people: Variance = %.2f, Standard deviation = %.2f' % (var_rich, std_rich))
var_ord = bmi_ord.var()
std_ord = bmi_ord.std()
print(' For ordinary华润水泥供货商门户 people: Variance = %.2f, Standard deviation = %.2f' % (var_ord, std_ord))
For rich people: Variance = 34.81, Standard deviation = 5.90
For ordinary people: Variance = 48.60, Standard deviation = 6.97
  • **Cohen's d **

当考虑了样本数据的离散度后,就能够更精准的衡量两类人群BMI值的差异,即运用一个新的德米亚尼量:Cohen's d,它能够简略看做是均值的差值除以两个样本归纳的标准差。其公式界说如下:

Cohen's d 公式

依据上面的公式,咱们界说函数cohen_d()来核算BMI数据的Cohen‘s数值。

def cohen_d(data1, data2):
n1 = len(data1)
n2 = len(data2)
x1 = np.mean(data1)
x2 = np.mean(data2)
var1 = np.var(data1, ddof=1)
var2 = np.var(data2, ddof=1)
sp = np.sqrt(((n1-1)*var1+(n2-1)*var2)/(n1+n2-2))
return (x1-x2)/sp
print("Cohen's d: %.3f" %cohen_d(bmi_rich, bmi_ord))
Cohen's d: -0.163

这儿得到的Cohen’s d的绝对值是0.163, 这个值是大是小呢?首要咱们需要对Cohen's d有一个大约的数值规模概念,当它的值为0.8代表有较大的差异,0.5位列中等,0.2较小,0.01则十分之小。所孙耀奇以这儿核算出的0.163代表两类人群的BMI值有差异,可是差异较小。

可是到这儿咱们能够得出有钱人更瘦的定论了吗?且慢,目前为止咱们看上海鸿凯投资有限公司到差异显着是存在的,但要下十分必定的定论,仍是不行火候。这个问题需要等后续讲到推论核算时才干彻底解决。


相关性

之前咱们调查的都是单个变量(主要是BMI指数)的核算学性质,接下来咱们调查下两个变量之间的联系。

  • 协方差

协方差(Covariance)是衡量两个变量的整体差错,方差能够看做是两个变量相一起的特殊状况。其公式如下:

协方差公式

下面运用 numpy 中的cov()函数来核算样本人群中身高和体重的协方差。

df2 = df[['height','weight', 'bmi' ]].dropna() #从datafrme中取身高、体重和bmi三列数据
height = df2.height
weight = df2.weight
bmi = df2.bmi
np.cov(height,weight) # 核算协方差
array([[ 1.12563400e-02, 1.08190764e+00],
[ 1.08190764e+00, 4.67153513e+02]])

这儿得到的结果是一个2乘2的对称矩阵,对角线上的数值别离代表两个变量各自的方差,而处于榜首行第二列的数值正是这两个变量的协方差。

  • 相联系数

了解了协方差的概念后,就能够马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三运用Pearson相联系数来衡量两个变量的相关性,它的界说是协方差除以两个变量各自的标准差,公式如下:

相联系数公式

Pearson相联系数的取值规模在-1到1之间,0代表无相关性,正数代表正相关,负数代表负相关,绝对值越大,相关性越高。

这儿运用 numpy 中的corrcoef()函数核算身高和体重的相联系数。

np.corrcoef(height, weight)[0,1] # 核算Pearson相联系数马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三
0.47180417408477093

得到0.47的相联系数,可见身高和体重之间是存在一些相关性的。咱们将身高和体重别离做为横坐标和纵坐标,数据作于下方的散点图中,能够看出跟着身高的增加,体重的整体趋势有上升,但联系不是特别显着。

# 制作身高、体重的散点图
plt.ios科学上网plot(height,weight, marker='.', linestyle='none', alpha = 0.05)
plt.xlabel('height (m)')
plt.ylabel('weight (kg)')
plt.title('correlation of weight and height')
plt.show()

身高-体重散点图

相同,咱们核算得到BMI值和体重的相联系数为0.87,有十分激烈的正相关性,马自达mx5,挖掘数据中的信息 -- 数据探求之描述性核算!内附python教程同享,大年初三从它们的散点图中也能看出来。

# 核算BMI值和体重的相联系数
corr = np.corrcoef(weight, bmi)
print('Pearson correlation coefficient: %.2f' % corr[0,1] )
# 制作BMI值和体重的散点图
plt.plo小叽叽t(weight,bmi, marker='.', linestyle='none', alpha = 0.05)
plt.xlabel('weight (kg)')
plt.ylabel('BMI')
plt.title('correlation of weight and BMI')
plt.show()
Pearson correlation coefficient: 0.87

BMI-体重散点图

别忘了BMI指数的核算公式便是体重除以身高的平方,那么BMI和体重的正相关性也很天然了,即越重的人BMI值或许越高。那么你是不是觉得BMI和身高具有负相关性呢?从BMI公式看形似有或许,但实践核算得出BMI和身高的相联系数只要-0.006,弱小到能够疏忽的程度。其实从知识中也能够判别,BMI已然是胖瘦的衡量,高的人并不必定胖啊。

# 核算BMI值和身高的相联系数
corr = np.corrcoef(height, bmi)
print('Pearson correlation coefficient: %.4f' % corr[0,1] )
# 制作BMI值和身高的散点图
plt.plot(height,bmi, marker='.', linestyle='none', alpha = 0.05)
plt.xlabel('height (m)')
plt.ylabel('BMI')
plt.title('correlation of BMI and height')
plt.show()
Pearson correlation coefficient: -0.0060

BMI-身高散点图


总结

本文别离从核算量和核算图两种视角来调查数据,查看了数据的中心趋势、相对方位、离散程度和相关性。核算量包含:衡量中心趋势的均值、中japanfoot位数、众数,衡量相对方位的分位数,衡量离散程度的方差和标准差,以及衡量相关性的Pearson相联系数。核算图则包含直方图、ECDF图、箱图和散点图。

一起,环绕有钱人是胖仍是瘦的问题,咱们选用了均值的差值和Cohen's d数值来衡量这一作用量,一起也选用直方图和ECDF图这类可视化的办法得出了有钱人更瘦一些的调查,可是这些都仅仅描述性核算学的办法,真实要得出定论还需要推论核算学的协助,这会在后续的系列文章中触及。


数据探求系列目录:

  1. 开篇:数据剖析流程
  2. 挖掘数据中的信息 - 描述性核算剖析(本文)
  3. 核算散布
  4. 参数估计
  5. 假设检验

参阅书本

  • 《Think St贝尔吉罗斯ats 2》
  • 《核算学》,William Mendenhall著

最终,想学习Python的小伙伴们!

请重视+私信回复:“学习”就能够拿到一份我为我们预备的Python学习材料!

pytyhon学习材料

python学习材料