描述性统计指标含义
numpy/scipy包中求相应统计指标的方法:
利用Python进行描述统计分析时,用到numpy库/scipy库
1. 中心位置:均值、中位数(分位数)、众数
- 均值(mean(data)):描述了样本观测数据取值相对集中程度
- 众数(mode(data)):样本中出现频率最高的数
- 中位数(median(data)):描述了样本观测数据的中间位置
- 分位数:将一列数由小到大排序,如果有n个数,则四分之一分位数记为第n0.25个数,四分之三分位数记为第n0.75个数,p分位数就是第np个数.如果np不是整数则往最接近的较大的整数上归,样本的0.5分位数就是样本的中位数。
2. 发散程度:最值、极差、方差、标准差、变异系数
-
最大最小值
-
极差(ptp(data)):最大值-最小值,作为样本观测数据变异程度大小的一个简单度量
-
方差(var(data))\标准差(std(data)):描述样本观测数据变异程度的大小(注意此处两个方差,式1代表样本的方差(即用样本的方差估计总体方差时是除以n-1,pandas包中求std即默认除n-1),式2代表数据的方差(numpy中std即除n))
-
变异系数mean(data)/std(data):方差和平均值的比值,衡量数据变异程度。
3. 偏差程度:z-分数、偏度、峰度
- z-分数((data[]-mean(data))/std(data)):衡量偏差的统计值,测量值距均值相差的标准差数目(当绝对值大于3记为异常)
- 偏度(skewness):反映总体分布的对称信息,偏度越接近0,说明分布越对称,否则越偏斜。
i. 若偏度为负,说明样本服从左偏分布(概率密度的左尾巴长,顶点偏向右边)
ii. 反之. - 峰度(kurtosis):反映总体分布密度曲线在其峰值附近的陡峭程度(根据样本2阶和4阶中心距计算)
i. 正态分布的峰度为3,如果样本峰度大于3,说明总体分布密度曲线在其峰值附近比正态分布来得陡
ii. 小于 3,说明总体分布密度曲线在其峰值附近比正态分布平缓。
(当数据集偏度或峰度过大时,可能需要进行对数化处理)
4. 相关程度:相关系数、协方差
- 协方差(cov(data,bias=1)):描述变量间相互关系,两随机向量X,Y之间的协方差定义为cov(X,Y)=E[(X-E(X))(Y-E(Y))],E表示数学期望
- 相关系数(corrcoef(data)):先对变量进行标准化变换,然后再计算协方差,把先标准化变换后做协方差运算定义为变量间的相关系数。
i. 相关系数是一个无单位的量,绝对值不超过1,它描述了变量间的线性相关程度
ii. 当变量间相关系数为0时,变量间不存在线性趋势关系,但可能存在非线性趋势关系
iii. 当变量间相关系数的绝对值为1时,一个变量是另一变量的线性函数;当变量间相关系数越接近1时,变量间线性趋势越明显
iv. 在用协方差描述变量间的相关程度时会受到变量的量纲和数量级的影响,即使对于同样的一组变量,当变量的量纲和数量级发生变化时,协方差也会随之改变。
用python进行描述性统计
本案例探究BMI指数与身高、体重等因素的关系。(BMI通过体重公斤数除以身高米数平方得出的数值,用以衡量人体胖瘦程度以及是否健康的标准)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import brfss
%config InlineBackend.figure_format='retina' #设置图像清晰度
df=brfss.ReadBrfss() #导入brfss数据
#选取bmi和income两列数据,并舍弃缺失值
bmi_income=df[['bmi','income']].dropna()
bmi_income.head(3)
>>>
> bmi income
0 40.18 3.0
1 25.09 1.0
3 28.19 8.0
bmi_income.info() #查看数据基本信息
bmi_income['income'].value_counts()
bmi_rich=bmi_income[bmi_income.income==8]['bmi']
bmi_ord=bmi_income[bmi_income.income!=8]['bmi']
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.030000
50% 27.370000
75% 31.620000
max 97.650000
Name: bmi, dtype: float64
中心趋势
- 均值:
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
- 中位数:
median_rich=bmi_rich.median()
median_ord=bmi_ord.median()
print('BMI median of rich people: %.2f' % median_rich)
print('BMI median of ordinary people: %.2f' % median_ord)
>>>
>BMI median of rich people: 26.57
BMI median of ordinary people: 27.37
- 众数:
mode_rich=bmi_rich.mode().iloc[0]
mode_count_rich=np.count_nonzero(bmi_rich==mode_rich)
mode_ord=bmi_ord.mode().iloc[0]
mode_count_ord=np.count_nonzero(bmi_ord==mode_ord)
print('BMI mode of rich people: %.2f(counts %d)' % (mode_rich,mode_count_rich))
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)
- 均值的差值:
print('mean difference(rich-ordinary): %.2f' % (mean_rich-mean_ord))
>>>
>mean difference(rich-ordinary): -1.09
- 直方图:
fig=plt.figure(figsize=(12,8))
#绘制富人bmi数据直方图
p1=fig.add_subplot(211)
plt.hist(bmi_rich,bins=50,rwidth=0.9)
plt.xlabel('BMI')
plt.xlim((0,80))
plt.ylabel('Counts')
plt.title('BMI histogram of rich people')
#绘制普通人bmi数据直方图
p2=fig.add_subplot