统计学是数据分析的基石,也是数据分析师的根本。学了统计学,你会发现很多时候的分析并不靠谱。比如很多人都喜欢用平均数去分析一个事物的结果,但是这往往是粗糙的,不准确的。如果学了统计学,那么我们就能以更多更科学的角度看待数据。用统计学作为数据分析的支撑和方向,使得分析结果更加有底气。本文主要分享描述性统计
理论结合对应的python实现方式,更好的帮助大家将统计学应用到实际工作中。
什么是描述性统计
描述性统计是通过图表或数学方法,对数据资料进行整理、分析,并对数据的分布状态、数字特征和随机变量之间关系进行评估和描述的方法。
一、描述性统计——位置度量【数据集中在哪里】
1、平均值
import pandas as pd
df = pd.DataFrame([3000,4000,4500,5000,5500,6000,20000],columns=['salary'])
df.mean()
缺点:极易受异常值的影响
解决:结尾均值或者取中位数
-
结尾均值
: 将数据进行从小到大排序后,按照一定比例去掉两端数据,只使用中间部分数据来取平均值。数据量大一般前后取5%,数据量少去头尾即可。
df[df['salary'].isin([df['salary'].min(),df['salary'].max()])==False].mean()
平均值的两个误区 !
①加权平均:给平台用户打分(近三个月的消费频次R,消费间隔F、消费金额M)
df_user = pd.DataFrame({'user_id':[1,2,3,4,5],'R':[3,6,7,10,7],'F':[10,5,9,2,6],'M':[5000,6500,7000,3500,100]})
df_user
这时我们要和业务沟通,可以依据业务经验给这三个维度一个权重值,注意权重总和为1
假如现在的权重值是【0.2,0.3.0.5】
将用户ID 为 1 用户的F值提升了1倍,总的评分才上升了3,这样的结果明显不够准确,这是大家很容易忽略的一点,造成这个问题的原因是因为量纲不一致,RF和M的值相差过大。可以通过对原始数据进行标准化和归一化解决。
-
标准化(Standardization)
:将数据转换成均值为0,标准差为1的分布,并非一定是正态的,数值没有固定范围。
-
归一化1(Normalization)
:将一列数据变化到某个固定区间中,通常这个区间是【0,1】 -
归一化2(Mean Normalization)
:范围【-1,1】,将分子的Xmin换成Xmean即可。
使用:若对数据范围有严格要求,用归一化(存在极端最大和最小值需要做截尾处理),其余用标准化。
# 标准化
#x 代表每个值,data代表一组数据
def standardization(x,data):
value = (x - data.mean())/(data.std())
return value
# 归一化1
def normalization1(x,data):
value = (x - data.min())/(data.max() - data.min())
return value
# 归一化2
def normalization2(x,data):
value = (x - data.mean())/(data.max() - data.min())
return value
df_user['old'] = df_user['R']*0.2+df_user['F']*0.3+df_user['M']*0.5
df_user['new']=(df_user['R'].map(lambda x:standardization(x,df_user['R'])))*0.2+(df_user['F'].map(lambda x:standardization(x,df_user['F']))*0.3+
(df_user['M'].map(lambda x:standardization(x,df_user['M'])))*0.5)
df_user
通过标准化数据会发现,ID是1 的用户排名变成了第二,虽然消费金额不高,但是消费频次是最高的,所以对应评分是高的。标准化和归一化主要的目的,是帮助我们解决量纲不一致的问题,加权平均之前要解决量纲不一致问题,而加权平均应用场景是打分,用来做精准营销和广告投放等。
②均值使用的误区
第一天,有10 个用户,共充值了50块钱,人均充值了5块钱
第二天,有15个用户,共充值了90块钱,人均充值了6块钱
第三天,有8个用户,总共充值了64块钱,人均充值了8块钱
问这三天的日平均消费金额是多少?
2、中位数
将数据从小到大排序,取中间的数(偶数:中间两个数的平均值)
中位数代表一个样本,种群和概率分布中的一个数值,将其划分为上下相等两部分,中位数和均值越接近,说明异常值较少。
3、众数
出现次数最多的数(占比例最大,适用于非数值型数据)
4、数据分布
- 对称分布:平均值=中位数=众数
- 左偏分布:平均值<中位数<众数
- 右偏分布:众数<中位数<平均值
注:左偏右偏是针对平均数来说的,不是视觉上
5、百分位数和四分位数
解决数据如何散布再从最小值到最大值的区间上的信息,第p个百分位数,表示至少有p%的观测值小于或者等于该值,且至少有(100-p)%的观测值大于或者等于该值
解释:至少有51%的观测值小于或等于5030,至少有49%的观测值大于5030
四分位数:第一四分位数Q1,第二四分位数Q2,第三四分位数 Q3
Q1 = 25%百分位数
Q2 = 50%百分位数 = 中位数
Q3 = 75%百分位数
二、描述性统计——变异程度度量【解决数据集中或分散程度怎么样】
1、标准差
标准差是一组数值自平均值分散开来的程度的一种测量概念。一个较大的标准差,代表大部分的数值和平均值差距较大;一个较小的标准差,代表这些数值和平均值接近。
- 案例:教练想选一个发挥稳定的球员,该选谁?
df2 = pd.DataFrame({'A':[20,30,25,35,35],'B':[10,50,55,15,20],'C':[15,30,40,45,20]})
print('A的历史平均分:',df2['A'].mean())
print('B的历史平均分:',df2['B'].mean())
print('C的历史平均分:',df2['C'].mean())
print('A的标准差:',np.std(df2['A']))
print('B的标准差:',np.std(df2['B']))
print('C的标准差:',np.std(df2['C']))
结论:标准差越小,代表发挥越稳定,选A。
2、极差
极差 = 最大值 - 最小值 , 极易受到异常值的影响
3、四分位间距
- IQR = Q3 - Q1
- 作为变异程度的一种独立,能够克服异常值的影响
4、偏度(Skewness)
偏度是统计数据分布偏斜方向和程度的度量,是统计数据分布的非对称程度的数字特征。
- 当 SK>0时,值越大,右偏程度越高
- 当 SK<0时,值越小,左偏程度越高
- 当 SK=0时,对称分布
5、峰度(Kurtosls)
峰度是指次数分布曲线顶峰的尖顶程度,是次数分布的又一重要特征,通常以正态
分布为标准。
- 当变量值的次数在众数周围分布的比较集中,使次数分布区曲线正态分布曲线顶峰更为"尖峭",称为尖顶峰度。当K > 0 ,数据尖峰,两侧存在离群值。
- 当变量值的次数在众数周围分布的比较分散,使次数分布区曲线正态分布曲线顶峰更为"平缓,称为平顶峰度。当K < 0 ,数据平峰,数据相对不集中,离群值较少。
- 当 K=0时,趋于正态分布。
# random.randn 生成标准正态分布
d = list(np.random.randn(10000))
data = pd.Series(d)
data.plot(kind='hist',density=True,edgecolor='black')
data.plot(kind='kde',color='red')
print('偏度',data.skew())
print('峰度',data.kurtosis())
结果说明:峰度和偏度接近于0,说明数据是服从正态分布的对称分布曲线。
6、单变量探索
- 数值变量:查看数据分布情况、是否有异常值和量纲问题
①五|八数概括法
最小值、第一分位数、正位数、第三四分位数、最大值
②直方图
③箱线图
-
分类变量
统计学:怎么做异常值检测?
异常值:有时数据集包含一个或多个数值异常大或异常小的观测值,这样的极端值称为异常值。
①Ksigma法
②箱线图法(用的多)
Ksigma法
- 5sigma:切比雪夫定理
在任意一个数据集中
所有的数据中,至少有3/4(或75%)的数据位于平均数2个标准差范围内。
[mean - 2*std,mean + 2*std]
所有的数据中,至少有8/9(或88.9%)的数据位于平均数3个标准差范围内。
所有的数据中,至少有24/25(或96%)的数据位于平均数5个标准差范围内。
- 3sigma:经验法则(用的多)
当数据集符合正态分布时
那么有68.3%的数据位于平均数1个标准差范围内。
那么有95.5%的数据位于平均数2个标准差范围内。
那么有99.7的数据位于平均数3个标准差范围内。
def Ksigma(k,data_list):
error_list = []
avg = np.mean(data_list)
std = np.std(data_list)
t_up = avg - k*std
t_down = avg + k*std
print('上限',t_up,'下限',t_down)
for i in data_list:
if (i<t_up ) or (i>t_down):
error_list.append(i)
return error_list
3sigma虽然是常用的,但是存在一定的缺点:①数据是服从正态分布的或者近正态分布②输出的正常区间容易受异常值影响,而导致结果不准。
如何检验是否是正态分布:峰度和偏度接近0
箱线图法
能弥补Ksigma的缺点
①计算第一分位数Q1 和 第三分位数Q3
②计算IQR = Q3 -Q1
③输出正常区间[Q1-1.5IQR,Q3+1.5IQR]
def NumOutlier(data_list):
error_list = []
iqr = np.quantile(data_list,0.75) - np.quantile(data_list,0.25)
t_up = np.quantile(data_list,0.25)-1.5*iqr
t_down = np.quantile(data_list,0.75)+1.5*iqr
print('上限',t_up,'下限',t_down)
for i in data_list:
if (i<t_up ) or (i>t_down):
error_list.append(i)
return error_list
异常值的常用处理方法
- 删除
- 中位数替代
- 用前后两个观测值的平均值修正
7、双变量探索
①散点图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.family'] = 'SimHei'
sca = pd.read_excel(r'C:\Users\cherich\Desktop\test_datas.xlsx',sheet_name='时长与成绩')
ti = sca['时长']
score = sca['成绩']
plt.figure(figsize=(6,4),dpi=80)
plt.scatter(ti,score,s=100,c='#6699ff',marker='*')
plt.title('学习时长和成绩之间的关系',fontsize=20,pad=10)
plt.xlabel('时长')
plt.ylabel('成绩')
plt.show()
②皮尔逊相关系数
- 目的:计算两个数值型变量的线性关系,当两个变量非线性时,相关系数为0。
- 取值范围:[-1,1],正数代表正相关,负数代表负相关
- 相关系数分类:
0.8~1.0 极强正相关
0.6~0.8 强相关
0.4~0.6 中等程度相关
0.2~0.4 弱相关
0~ 0.2 极弱相关或无关 - 使用皮尔逊相关系数的前提:
两个变量之间具有线性关系
变量是数值型
异常值较少
样本数最好大于30
样本的标准差不能为0
案例:成绩和学习时长之间的关系,应如何计算?
第一步:观察是否有线性关系
第二步:看是否有异常值
第三步:看标准差是否为0
第四步:计算相关系数
结果说明:极强相关怎么理解?最终计算出的结果是一个概率值,本案例中可以理解为影响成绩的因素 92% 是和学习时长有关。
③ 斯皮尔曼相关系数
- 它能解决皮尔逊相关系数不能解决的问题,比如皮尔逊能解决线性相关问题,斯皮尔曼能解决非线性相关问题
- 目的:根据等级资料研究两个变量间相关关系的方法,它是根据两列成对等级的各对等级数之差来进行计算的
- 取值范围:[-1,1],正数代表正相关,负数代表负相关
- 优点:处理非线性,对异常值不敏感,可用于定序型离散值变量
定序型变量:具有内在固有大小或者高低循序,一般用数字和字符来表示。如职称有高、中、低,用1,2,3表示;比如年龄段有老、中、青,用A、B、C来表示。
- 缺点:处理线性时,精确度和效率都不如皮尔逊
如何选择相关系数
- ①连续数据、线性关系、正态分布用皮尔逊最恰当
- ②上述任意一条件不满足,就用斯皮尔曼相关系数
- ③两个定序测量数据之间也用斯皮尔曼相关系数
如何判定相关还是因果关系?
相关:是两个或两个以上变量之间互相影响的的程度,核心是互为相关,同时存在没有先后顺序。
因果:前一个事件对后一个事件的作用和强度,核心点是有先后顺序的。
相关关系和因果关系的判断依据:因果关系是一定(粗暴理解相关系数为1),相关关系是一个概率问题。
8、双变量离散程度的度量——变异系数
应用场景:当需要比较两组数据离散程度大小的时候,如果两组数据的测量尺度相差太大或者量纲不同时,使用标准差不合适,此时就应该消除测量尺度和量纲的影响,而变异系数就能做到这一点,它是原始数据标准差与原始数据平均数的比。
公式:标准差/平均数
- 缺点:当平均数接近于0的时候,微小的扰动也会对变异系数产生巨大的影响,因此造成精度不足。
以上主要介绍了集中趋势的度量、离散程度的度量、分布形态的度量。当业务人员/老板拿到一堆数据,丢到你面前,让你分析。这时你不会不知所措,也不会不知道从哪一步开始整理这些数据。你可以通过概括性的度量指标,来帮我们从更科学的角度发现数据问题,开展数据分析工作。
最后,感觉文章对你有帮助的小伙伴,记得点赞、关注噢!