数据科学必备用Python进行描述性统计数据分析详解

在大数据和人工智能时代,数据科学和机器学习在许多科技领域都变得必不可少。处理数据的一个必要方面是能够直观地描述、总结和表示数据。Python 统计库是全面、流行且广泛使用的工具,可帮助处理数据。

对于数据的基础描述我们可以进行下面的操作:

  • 使用哪些数字量来描述和总结数据集。
  • 在 Python 中计算描述性统计。
  • 使用 Python 库获取描述性统计信息。
  • 可视化数据集。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

数据科学必备用Python进行描述性统计数据分析详解

文章目录

; 什么是描述性统计

描述性统计是关于描述和总结数据。

使用两种主要方法:

  • 定量方法以数字方式描述和总结数据。
  • 可视化方法用图表、绘图、直方图和其他图表来说明数据。

可以将描述性统计应用于一个或多个数据集或变量。当描述和总结单个变量时,执行单变量分析。当搜索一对变量之间的统计关系时,进行双变量分析。同样多变量分析同时涉及多个变量。

度量类型

描述性统计分析需要理解的度量类型有:

  • 集中趋势即数据的中心,包括平均值、中位数和众数。
  • 可变性即分布情况,包括方差和标准差。
  • 相关性或联合变异性即数据集中一对变量之间的关系,包括协方差和相关系数。

总体和样本

在统计中总体是所有元素或项目的集合。总体通常很大,这使得它们不适合收集和分析数据。这就是为什么统计学家通常试图通过选择和检查该总体的代表性子集来对总体做出一些结论。

总体的这个子集称为样本。理想情况样本应在令人满意的程度上保留总体的基本统计特征。这样将能够使用样本来收集有关总体的结论。

异常值

异常值是与从样本或总体中获取的大多数数据显着不同的数据点。通常造成异常数据原因有数据的自然变化、观察系统行为的变化、数据收集错误。

异常值没有精确的数学定义。必须依靠经验、有关主题的知识和常识来确定数据点是否为异常值以及如何处理。

Python 的统计库

数据科学必备用Python进行描述性统计数据分析详解
  • Python 的 statistics 是用于描述性统计的内置 Python 库。如果数据集不是太大或者能依赖导入其他库,那么可以使用它。
  • NumPy 是一个用于数值计算的第三方库,针对单维和多维数组进行了优化。主要类型是称为的数组类型 ndarray。该库包含许多用于统计分析的案例。
  • SciPy 是一个基于 NumPy 的第三方科学计算库。与 NumPy 相比提供了额外的功能,包括 scipy.stats 用于统计分析。
  • Pandas 是一个基于 NumPy 的第三方数值计算库,擅长处理带有对象的标记一维 (1D) 数据和带有Series对象的二维 (2D) DataFrame数据 。
  • Matplotlib 是一个用于数据可视化的第三方库,与 NumPy、SciPy 和 Pandas 结合使用效果会直观表达结果。

; Python 统计入门

既然要做描述性统计分析,就一定要先学习统计学相关的基础内容,否则概念都不知道是无法下手操作的,甚至连对应的三方库都不知道哪里去找。

建议先看一下下面的内容之后回来看如何进行python操作,如果你已经对统计有初步的了解了可以跳过这个部分。

计算描述性统计

导入应用的三方包。

import math
import statistics
import numpy as np
import scipy.stats
import pandas as pd

随机创建一些数据,通常缺失值用 nan 表示。表示的方法有很多种,常用的有float(‘nan’)、math.nan、np.nan。

x = [1.0, 5, 7.5, 4, 99.1]
x_with_nan = [1.0, 5, 7.5, math.nan, 4, 99.1]

同时创建 np.ndarray 和 pd.Series 对象。

两个 NumPy 数组(y和y_with_nan)和两个 Pandas Series(z和z_with_nan),这些都是一维值序列。

y, y_with_nan = np.array(x), np.array(x_with_nan)
z, z_with_nan = pd.Series(x), pd.Series(x_with_nan)

y
array([ 8. ,  1. ,  2.5, 4. , 28. ])

y_with_nan
array([ 8. ,  1. ,  2.5,  nan,  4. , 28. ])

z
0     8.0
1     1.0
2     2.5
3     4.0
4    28.0
dtype: float64

z_with_nan
0     8.0
1     1.0
2     2.5
3     NaN
4     4.0
5    28.0
dtype: float64

集中趋势测度

集中趋势的度量显示数据集的中心值或中间值。有几种定义被认为是数据集的中心。

  • Mean,样本平均值,也称为样本算术平均值或简称平均值,是数据集中所有项目的算术平均值。数据集 𝑥 的平均值在数学上表示为 Σᵢ𝑥ᵢ/𝑛,其中 𝑖 = 1, 2, …, 𝑛。是所有元素的总和 𝑥ᵢ 除以数据集中的项目数 𝑥。
  • Weighted mean,加权平均数,也称为加权算术平均数或加权平均数,是算术平均数的概括,能够定义每个数据点对结果的相对贡献。数据集 𝑥 的每个数据点 𝑥ᵢ 定义一个权重 𝑤ᵢ,其中 𝑖 = 1、2、…、𝑛 和 𝑛 是 𝑥 中的项目数。将每个数据点与相应的权重相乘,将所有乘积相加,然后将获得的总和除以权重总和:Σᵢ(𝑤ᵢ𝑥ᵢ) / Σᵢ𝑤ᵢ。
  • Geometric mean,几何平均值是数据集 𝑥 中所有 𝑛 元素 𝑥ᵢ 乘积的第 𝑛 根:ⁿ√(Πᵢ𝑥ᵢ),其中 𝑖 = 1, 2, …, 𝑛。
  • Harmonic mean,谐波均值,调和平均值是数据集中所有项目倒数的平均值的倒数:𝑛 / Σᵢ(1/𝑥ᵢ),其中 𝑖 = 1、2、…、𝑛 和 𝑛 是数据集中的项目数𝑥 𝑥x。

上述三种均值的实现方法可以参考下面这篇内容。
『迷你教程』数据分析师常用的三大均值统计方法

  • Median,样本中位数是排序数据集的中间元素。数据集可以按升序或降序排序。如果数据集的元素个数 𝑛 是奇数,那么中位数就是中间位置的值: 0.5(𝑛 + 1) 。如果 𝑛 是偶数,那么中位数就是中间两个值的算术平均值,即 0.5𝑛 和 0.5𝑛+1 位置的项目。
n = len(x)
if n % 2:
    median_ = sorted(x)[round(0.5*(n-1))]
else:
    x_ord, index = sorted(x), round(0.5 * n)
    median_ = 0.5 * (x_ord[index-1] + x_ord[index])

median_
7.5
  • Mode,样本众数是数据集中出现频率最高的值。如果没有单个这样的值则该集合是多模态的,因为它具有多个模态值。例如,在包含点 2、3、2、8 和 12 的集合中,数字 2 是众数,因为它出现两次不像其他项只出现一次。
u = [2, 3, 2, 8, 12]

mode_ = max((u.count(item), item) for item in set(u))[1]

mode_ = statistics.mode(u)
mode_ = statistics.multimode(u)

u = np.array(u)
mode_ = scipy.stats.mode(u)
mode_

u= pd.Series(u)
u.mode()

变异性测量

  • Variance,样本方差量化了数据的分布。它以数字方式显示数据点与平均值的距离。您可以将数据集 𝑥 的样本方差用 𝑛 元素数学表示为𝑥的样本均值。计算总体方差的方法类似于样本方差。但是必须在分母中使用 𝑛 而不是 𝑛 – 1:Σᵢ(𝑥ᵢ – mean(𝑥))² / 𝑛。在这种情况下 𝑛 是整个总体中的项目数。与样本方差的区别使用 statistics.pvariance(),且 (n – 1) 替换为 n 。

n = len(x)
mean_ = sum(x) / n
var_ = sum((item - mean_)**2 for item in x) / (n - 1)

var_ = statistics.variance(x)
var_ =statistics.variance(x_with_nan)

var_ = np.var(y, ddof=1)
var_ = y.var(ddof=1)
var_ = np.nanvar(y_with_nan, ddof=1)

z.var(ddof=1)
z_with_nan.var(ddof=1)
  • Standard deviation,样本标准差是数据传播的另一种度量。它与样本方差有关,因为标准偏差 𝑠 是样本方差的正平方根。标准差通常比方差更方便,因为它与数据点具有相同的单位。总体标准差是指整个总体,总体方差的正平方根。与样本标准差的区别使用 statistics.pstdev()

std_ = var_ ** 0.5

std_ = statistics.stdev(x)

var_ = np.std(y, ddof=1)
var_ = y.std(ddof=1)
var_ = np.std(y_with_nan, ddof=1)

z.std(ddof=1)
z_with_nan.std(ddof=1)
  • Skewness,样本偏度衡量数据样本的不对称性。偏度有几种数学定义。使用 𝑛 元素计算数据集 𝑥 偏度的一种常用表达式是 (𝑛² / ((𝑛 − 1)(𝑛 − 2))) (Σᵢ(𝑥ᵢ − mean(𝑥))³ / (𝑛𝑠³))。更简单的表达式是 Σᵢ(𝑥ᵢ − mean(𝑥))³ 𝑛 / ((𝑛 − 1)(𝑛 − 2)𝑠³),其中 𝑖 = 1, 2, …, 𝑛 和 mean(𝑥) 是𝑥。
"""
左偏分布(负偏态)中:mean(平均数)

x = [1.0, 1, 6.5, 41, 28.5]
n = len(x)
mean_ = sum(x) / n
var_ = sum((item - mean_)**2 for item in x) / (n - 1)
std_ = var_ ** 0.5
skew_ = (sum((item - mean_)**3 for item in x)* n / ((n - 1) * (n - 2) * std_**3))
skew_
0.8025583716578066

y, y_with_nan = np.array(x), np.array(x_with_nan)
scipy.stats.skew(y, bias=False)
0.8025583716578066
scipy.stats.skew(y_with_nan, bias=False)
nan

z, z_with_nan = pd.Series(x), pd.Series(x_with_nan)
z.skew()
0.8025583716578066
z_with_nan.skew()
0.8025583716578066
  • Percentiles,样本 𝑝 百分位数是数据集中的元素,使得数据集中 𝑝% 的元素小于或等于该值。此外(100 – 𝑝)% 的元素大于或等于该值。如果数据集中有两个这样的元素,那么样本 𝑝 百分位数就是它们的算术平均值。每个数据集都有三个四分位数,它们是将数据集分为四个部分的百分位数。

x = [-5.0, -1.1, 0.1, 2.0, 8.0, 12.8, 21.0, 25.8, 41.0]
statistics.quantiles(x, n=2)
[8.0]
statistics.quantiles(x, n=4, method='inclusive')
[0.1, 8.0, 21.0]

y = np.array(x)
np.percentile(y, 5)
np.percentile(y, 95)
np.percentile(y, [25, 50, 75])
np.median(y)

y_with_nan = np.insert(y, 2, np.nan)
np.nanpercentile(y_with_nan, [25, 50, 75])

z, z_with_nan = pd.Series(y), pd.Series(y_with_nan)
z.quantile(0.05)
z.quantile(0.95)
z.quantile([0.25, 0.5, 0.75])
z_with_nan.quantile([0.25, 0.5, 0.75])
  • Ranges,数据范围是数据集中最大元素和最小元素之间的差异。数值型数据类似理解为极差。

np.ptp(y)
np.ptp(z)
np.ptp(y_with_nan)
np.ptp(z_with_nan)

"""
不同的计算方式
max() 、min()  # Python 标准库
amax() 、amin() # NumPy
nanmax() 、nanmin() # NumPy 忽略 nan
.max() 、 .min() # NumPy
.max() 、.min() #  Pandas 默认忽略 nan 值
"""

描述性统计摘要


"""
nobs:数据集中的观察或元素的数量
minmax:具有数据集最小值和最大值的元组
mean:数据集的平均值
variance:数据集的方差
skewness:数据集的偏度
kurtosis:数据集的峰度
"""
result = scipy.stats.describe(y, ddof=1, bias=False)

"""
count:数据集中的元素数量
mean:数据集的平均值
std:数据集的标准差
min和max:数据集的最小值和最大值
25%, 50%, and 75%:数据集的四分位数
"""
result = z.describe()

数据对之间相关性的度量

经常需要检查数据集中两个变量的对应元素之间的关系。假设有两个变量 𝑥 和 𝑦,具有相同数量的元素 𝑛。让 𝑥 中的 𝑥₁ 对应于 𝑦 中的 𝑦₁,𝑥 中的 𝑥₂ 对应 𝑦 中的 𝑦₂ 以此类推。

数据对之间相关性的度量:

  • 当较大的 𝑥 值对应于较大的 𝑦 值时,存在正相关,反之亦然。
  • 当较大的 𝑥 值对应于较小的 𝑦 值时,存在负相关,反之亦然。
  • 如果没有这种明显的关系,则存在弱或不存在相关性。
    数据科学必备用Python进行描述性统计数据分析详解

衡量数据集之间相关性的两个统计量是 协方差和相关系数

x = list(range(-10, 11))
y = [0, 2, 2, 2, 2, 3, 3, 6, 7, 4, 7, 6, 6, 9, 4, 5, 5, 10, 11, 12, 14]
x_, y_ = np.array(x), np.array(y)
x__, y__ = pd.Series(x_), pd.Series(y_)

协方差,样本协方差是量化一对变量之间关系的强度和方向的度量。

  • 如果相关性是正的,那么协方差也是正的。
  • 如果相关性为负,则协方差也为负。
  • 如果相关性较弱,则协方差接近于零。

n = len(x)
mean_x, mean_y = sum(x) / n, sum(y) / n
cov_xy = (sum((x[k] - mean_x) * (y[k] - mean_y) for k in range(n))/ (n - 1))

cov_matrix = np.cov(x_, y_)

cov_xy = x__.cov(y__)
cov_xy = y__.cov(x__)

相关系数

关于相关系数有三种不同的计算方式。

  • 连续数据 & 连续数据的计算方式
  • 连续数据 & 离散数据的计算方式
  • 离散数据 & 离散数据的计算方式

具体内容参考 「数据分析师的统计基础」双变量的相关分析

这里举例说明 连续数据 & 连续数据 的pearsonr相关系数计算方式。


var_x = sum((item - mean_x)**2 for item in x) / (n - 1)
var_y = sum((item - mean_y)**2 for item in y) / (n - 1)
std_x, std_y = var_x ** 0.5, var_y ** 0.5
r = cov_xy / (std_x * std_y)

result = scipy.stats.linregress(x_, y_)
r = result.rvalue

r, p = scipy.stats.pearsonr(x_, y_)

corr_matrix = np.corrcoef(x_, y_)

r = x__.corr(y__)
r = y__.corr(x__)

二维数组的使用

统计学家经常使用二维数据,其中包括数据库表、CSV 文件、Excel等电子表格。

  • NumPy 和 SciPy 提供了一种处理 2D 数据的综合方法。
  • Pandas 有DataFrame专门用于处理 2D 标记数据的类。

关于这方面的数据处理应用内容会有很多,建议选择一个自己擅长的就可以了,比如使用DataFrame进行处理。

可视化数据重要性

数据可视化的方法库有很多之前也提到过,这里进行一个未来汇总起来的一个数据可视化内容列表。工作中需要的数据可视化库都再这里面能知道对应的制作方法。

数据科学必备用Python进行描述性统计数据分析详解
数据可视化是可以让外行人通过图形的方式快速、直接的了解数据所表达的含义。

基于PyEcharts的数据可视化内容。

Original: https://blog.csdn.net/qq_20288327/article/details/124819502
Author: Mr数据杨
Title: 数据科学必备用Python进行描述性统计数据分析详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/698124/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球