↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
作者:吴忠强,Datawhale优秀学习者
所谓机器学习和深度学习, 背后的逻辑都是数学, 所以数学基础在这个领域非常关键, 而统计学又是重中之重, 机器学习从某种意义上来说就是一种统计学习。
大纲如下:
数理统计的基础(基础概念, 统计量与抽样分布, 常用统计量)
-
描述性统计(数据集中趋势和离散趋势, 分布特征, 偏度与峰度)
数理统计基础
基础概念
在数理统计中, 总体就是研究对象的全体, 通常用一个随机变量表示, 组成总体的每个基本单元叫个体, 而总体中包含的个体总数就是总体容量。
代表性:每个 与 同分布
-
独立性: 是相互独立的随机变量。
样本是具有两重性,即当在一次具体地抽样后它是一组确定的数值。但在一般叙述中样本也是一组随机变量,因为抽样是随机的。
一般地,用 , 表示随机样本,它们取到的值记为 称为样本观测值。一般情形下, 两次观测, 样本值是不同的。
样本作为随机变量,有一定的概率分布,这个概率分布称为样本分布。显然,样本分布取决于总体的性质和样本的性质。
统计量与抽样分布
数理统计的任务是采集和处理带有随机影响的数据,或者说收集样本并对之进行加工,以此对所研究的问题作出一定的结论,这一过程称为统计推断。从样本中提取有用的信息来研究总体的分布及各种特征数就是构造统计量的过程, 因此,统计量是样本的某种函数。
常用的统计量
1. 样本均值
2. 样本方差
3. k阶样本原点矩
设 是总体 的一个简单随机样本,称
为样本的 阶原点矩(可以看到 时,相当于样本均值),通常用样本的无阶原点矩来估计总体分布的 阶原点矩。
4. k阶样本中心矩
设 是总体 的一个简单随机样本, 为样本均值,称
为样本的 阶中心矩,通常用样本的 阶中心矩来估计总体分布的 阶中心矩。
5. 顺序统计量
三种重要的抽样分布
在使用统计量进行统计推断的时候常常需要知道它的分布, 统计量的分布称为抽样分布, 有三个非常重要的统计量的分布我们需要知道, 因为在参数估计和检验假设等其实都有这三个分布的影子或者依赖于这三个分布, 这三个分布就是 分布、 分布和 分布。
1. 分布
设 是来自总体 的样本, 则称统计量
服从自由度为 的 分布, 记为 。自由度指的独立变量的个数。概率密度函数长这样:
其中
2. 分布
设 ,且 相互独立,则称随机变量
服从自由度为 的 分布。它的概率密度函数:
概率密度函数图像如下:
3. 分布
设 且 独立,则称随机变量
的 分布, 记
描述性统计
数据集中趋势的度量
1. 平均数
2. 中位数
3. 频数
指同一观测值在一组数据中出现的次数(掷骰子中,一共掷了20次,出现数字5的次数)
4. 众数(mode)
5. 百分位数
这个箱线图可以看到数据的下面几个性质:
中心位置:中位数所在的位置是数据集的中心
散布程度:全部数据落在 之内, 在区间 , , , 的数据个数各占1/4。区间较短时表示落在该区间的点较为集中, 反之较为分散。
对称性:若中位数位于箱子的中间位置,则数据分布较为对称。若 离 的距离较 离 的距离大,则表示数据分布向左倾斜,反之数据右倾斜,且能看出分布尾部的长短。
箱线图特别适用于比价两个或者两个以上数据集的性质。当然箱线图也可以帮助我们检测是否存在异常值(不寻常的过大或者过小), 第一四分位数 和第三四分位数 之间的距离记为IQR, 也就是四分位数间距, 若数据小于 IQR或者数据大于 IQR,就疑似异常
好了, 关于上面的这些内容,下面看一波python实现了。
首先是列表的元素求均值, 中位数, 众数, 频数:由于众数numpy中没有直接实现的函数, 所以可以调用scipy包的stats或者自己实现:
# 实现众数 但这个不能返回多个众数, 如果有多个众数的话, 需要得到一个众数的次数, 然后根据频数返回多个。
def mode(lst):
if not lst:
return
return max(lst, key=lambda v: lst.count(v))
a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22]
a_mean = np.mean(a) #均值
a_med = np.median(a) #中位数
a_mode = stats.mode(a)[0][0] # 众数 也是只能返回一个
a_mode1 = mode(a)
print("a的平均数:",a_mean)
print("a的中位数:",a_med)
print('a的众数', a_mode, a_mode1)
# 频数
b = {k: a.count(k) for k in set(a)}
b # {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 43: 1, 12: 2, 11: 1, 52: 1, 22: 3, 23: 1}
# 基于频数这个, 再写一个求众数的, 这个可以返回多个
def mode_duo(d):
if len(d) == 0:
return
max_values = max(d.values()) # 找到了众数对应的次数
return [key for key in d if d[key]==max_values]
a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22, 1, 1]
b = {k: a.count(k) for k in set(a)}
mode_duo(b) # 1 22
## 当然还可以转成Series然后求众数, 有多个的话也可以都返回来, 这个是最简单的方式
pd.Series(a).mode()
下面看看分位点的情况, 把a转成Series, 用describe()函数就可以看到分位点:
pd.Series(a).describe()
## 结果:
count 16.000000
mean 14.750000
std 15.316658
min 1.000000
25% 2.750000
50% 11.500000
75% 22.000000
max 52.000000
dtype: float64
## 还可以借助plt画出箱型图
import matplotlib.pyplot as plt
plt.boxplot(pd.Series(a))
下面我们再看看如何根据IQR去掉异常值:异常值可以截尾, 也可以直接去掉:
"""这里包装了一个异常值处理的代码,可以随便调用"""
def outliers_proc(data, col_name, scale=1.5):
"""
用于截尾异常值, 默认用box_plot(scale=1.5)进行清洗
param:
data:接收pandas数据格式
col_name: pandas列名
scale: 尺度
"""
data_col = data[col_name]
Q1 = data_col.quantile(0.25) # 0.25分位数
Q3 = data_col.quantile(0.75) # 0,75分位数
IQR = Q3 - Q1
data_col[data_col < Q1 - (scale * IQR)] = Q1 - (scale * IQR)
data_col[data_col > Q3 + (scale * IQR)] = Q3 + (scale * IQR)
return data[col_name]
num_data['power'] = outliers_proc(num_data, 'power')
上面是截尾异常值, 接收的是pandas的一列, 因为有时候异常值多了的话暴力删除可能不太好。当然下面的代码直接删除掉异常值, 接收的是一个DataFrame, 然后判断有几列都出现异常的时候才删除这个样本。
# 检测异常值并将其舍弃,返回删除的列
def detect_and_remove_outliers(df):
"""这个方法按列检查异常值,并保存所在的行,如果某个行有两个以上的异常值,就删除该行"""
outliers = []
col = list(df)
#checking interquartile range IQR for all columns
for c in col:
Q1 = df[c].quantile(0.25) # 0.25分位数
Q3 = df[c].quantile(0.75)
IQR = Q3 - Q1
outliers.extend(df[(df[c] < Q1 - (1.5 * IQR)) | (df[c] > Q3 + (1.5 * IQR) )].index)
#returning keys for count of occurrences in the list outlier key value pairs
return list(k for k,v in Counter(outliers).items() if v >2)
remove_list = detect_and_remove_outliers(data)
data_remove = data.drop(remove_list, axis=0)
数据离散趋势的度量
表示数据分散(离散,差异)程度的特征量有方差,标准差,极差以及变异系数等。
1. 方差
2. 极差
4. 四分位数差
它也是度量样本分散性的重要数字特征,特别对于具有异常值的数据,它作为分散性具有稳健性。
下面是方差, 标准差, 变异系数的numpy实现。
a = [1,2,4,5,3,12,12,23,43,52,11,22,22,22]
a_var = np.var(a) #方差
a_std1 = np.sqrt(a_var) #标准差
a_std2 = np.std(a) #标准差
a_mean = np.mean(a) #均值
a_cv = a_std2 /a_mean #变异系数
print("a的方差:",a_var)
print("a的方差:",a_std1)
print("a的方差:",a_std2)
print("a的变异系数:",a_cv)
5. 偏度与峰度
偏度(skewness):也称为偏态,是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。直观看来就是密度函数曲线尾部的相对长度。偏度刻画的是分布函数(数据)的对称性。关于均值对称的数据其偏度系数为0,右侧更分散的数据偏度系数为正,左侧更分散的数据偏度系数为负。样本偏度系数如下:
正态分布的偏度为0, 两侧尾部长度对称。
左偏
右偏
峰度系数如下:
下面是一波python实现:
data = list(np.random.randn(10000)) #⽣生成标准正态分布的随机数(10000个)
plt.hist(data, 1000, facecolor='g', alpha=0.5) # alpha表示透明度
plt.show()
s = pd.Series(data) #将数组转化为序列列
print('偏度系数',s.skew()) # 0.0024936359680932723
print('峰度系数',s.kurt()) # -0.05970174780792892
结果如下:
写到最后
本文电子版教程 后台回复 概率统计 获取
“为数学之美点赞↓
本文分享自微信公众号 - 气象学家(Meteorologist2019)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4579644/blog/4352855