PDF:概率密度函数(probability density function), 在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。
PMF : 概率质量函数(probability mass function), 在概率论中,概率质量函数是离散随机变量在各特定取值上的概率。
CDF : 累积分布函数 (cumulative distribution function),又叫分布函数,是概率密度函数的积分,能完整描述一个实随机变量X的概率分布。
z分数(z-score),也叫标准分数(standard score)是一个数与平均数的差再除以标准差的过程。z=(x-μ)/σ。
1.Q-Q图,反应数据是否呈正态分布
Q-Q图(Quantile-Quantile Plot,样本分位数-总体分位数)是一种散点图,它描述了样本分位数与观测值确实服从正态分布时所观察到的分位数之间的关系,可用来检验正态性假定是否成立。当各点近似分布在一条直线附近时,可认为正态性假设成立;反之,则不成立。
QQ图反应的是样本数据的分位数和指定分布的分位数的关系,用于比较两个数据的分布情况
使用scipy.stats.probplot进行绘制:
qq=probplot(probplot_data, fit=True)
使用`probplot_data`数据集绘制概率图或Q-Q图,并在图形中拟合一个理论分布(默认为正态分布)
返回一个元组(tuple),其中包含两个数组。第一个数组是样本数据的分位数(quantiles),第二个数组是对应的理论分位数(theoretical quantiles)。如果参数fit为True,则还会返回一个斜率和截距,用于拟合理论分位数和样本分位数之间的线性关系,斜率表示该线性关系的斜率,即理论分位数对样本分位数的影响程度。截距表示该线性关系的截距,即当样本分位数为0时,理论分位数的取值。
通过 plt.plot(qq[0][1], qq[0][0])用来画图,其中纵坐标是标准化的理论分位数,也就是z-score,如果想用cumulative_probabilities来表示Q-Q图的纵坐标,那么就进行如下转换:
#定义你想展示的cumulative_probabilities数值:
cumulative_probabilities = [0.0001, 0.001, 0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.95, 0.99, 0.999, 0.9999]
# 计算对应的Z分数:
z_scores = [stats.norm.ppf(prob) for prob in cumulative_probabilities]
#PS:`stats.norm.ppf`是SciPy库中的一个函数,用于计算正态分布的百分位点(也称为分位数)`stats.norm.ppf(q, loc=0, scale=1)`用于计算给定累积概率`q`下的正态分布的百分位点。 `q`:累积概率,取值范围为0到1。 `loc`:正态分布的均值,默认值为0。 `scale`:正态分布的标准差,默认值为1。 函数返回的结果是给定累积概率下的对应百分位点的数值。
#将纵坐标对应的z-score改为 cumulative_probabilities数值:
plt.yticks(z_scores, cumulative_probabilities)
2.hist图 可以查看数据分布情况
fig, axs = plt.subplots(3, 2, figsize=(10, 10))
for i, column in enumerate(columns):
title = column
bin_range = bin_ranges.get(column, (0.2, 1.5))
hist_data = data[column][(data[column] > bin_range[0]) & (data[column] < bin_range[1])]
axs[i // 2, i % 2].hist(hist_data, bins=30, range=bin_range, density=True, alpha=0.7)
#`hist_data`:要绘制直方图的数据。`bins`:指定直方图的箱子数量。默认值为30,表示将数据分成30个等宽的区间。`range`:指定直方图的数据范围。 `density`:指定是否将直方图的纵轴标准化为概率密度。默认值为False,表示纵轴表示直方图的计数。如果设置为True,纵轴将表示概率密度。
plt.tight_layout()
其中如果density=True,那么纵轴是概率密度,而概率密度函数的取值可以大于1,这是因为概率密度函数并不是概率。概率密度函数的主要目的是描述随机变量在不同取值处的概率密度大小,而不是直接表示概率。因此,概率密度函数的取值大小并没有严格的上限。 概率密度函数的面积才表示概率。对于连续随机变量,概率密度函数的面积在整个定义域上积分等于1。
如果想让纵轴代表概率值,可以做以下改变:
weights = np.ones_like(hist_data)/float(len(hist_data))
plt.hist(hist_data, weights=weights)