打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
数据科学必备统计基础用Python描述你的数据的正确姿势
userphoto

2022.06.19 福建

关注

在大数据和人工智能时代,数据科学和机器学习在许多科技领域都变得必不可少。处理数据的一个必要方面是能够直观地描述、总结和表示数据。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 mathimport statisticsimport numpy as npimport scipy.statsimport 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)yarray([ 8. , 1. , 2.5, 4. , 28. ])y_with_nanarray([ 8. , 1. , 2.5, nan, 4. , 28. ])z0 8.01 1.02 2.53 4.04 28.0dtype: float64z_with_nan0 8.01 1.02 2.53 NaN4 4.05 28.0dtype: float64

集中趋势测度

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

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

上述三种均值的实现方法可以参考下面这篇内容。

Mr数据杨:『迷你教程』数据分析师常用的三大均值统计方法0 赞同 · 0 评论文章

  • 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]# statistics.mode() statistics.multimode()模式mode_ = statistics.mode(u)mode_ = statistics.multimode(u)# scipy.stats.mode() 模式u = np.array(u)mode_ = scipy.stats.mode(u)mode_# Pandas Series对象.mode()模式u= pd.Series(u)u.mode()

变异性测量

  • Variance,样本方差量化了数据的分布。它以数字方式显示数据点与平均值的距离。您可以将数据集 的样本方差用 元素数学表示为 的样本均值。计算总体方差的方法类似于样本方差。但是必须在分母中使用 而不是 - 1:Σᵢ( ᵢ - mean( ))² / 。在这种情况下 是整个总体中的项目数。与样本方差的区别使用 statistics.pvariance(),且 (n - 1) 替换为 n 。
# 常规获取方式n = len(x)mean_ = sum(x) / nvar_ = sum((item - mean_)**2 for item in x) / (n - 1)# statistics.variance() 模式var_ = statistics.variance(x)var_ =statistics.variance(x_with_nan)# np.var() 或​.var() 模式  ddof(自由度)var_ = np.var(y, ddof=1)var_ = y.var(ddof=1)var_ = np.nanvar(y_with_nan, ddof=1) # 跳过 nan 值# Pandas Series对象.var()模式z.var(ddof=1) z_with_nan.var(ddof=1) # 默认跳过nan值
  • Standard deviation,样本标准差是数据传播的另一种度量。它与样本方差有关,因为标准偏差 是样本方差的正平方根。标准差通常比方差更方便,因为它与数据点具有相同的单位。总体标准差是指整个总体,总体方差的正平方根。与样本标准差的区别使用 statistics.pstdev()
# 常规获取方式std_ = var_ ** 0.5# statistics.stdev() 模式,自动忽略 nan 值std_ = statistics.stdev(x)# np.std() 或​​.std() 模式 ddof(自由度)var_ = np.std(y, ddof=1)var_ = y.std(ddof=1)var_ = np.std(y_with_nan, ddof=1) # 跳过 nan 值# Pandas Series对象.std()模式z.std(ddof=1)z_with_nan.std(ddof=1) # 默认跳过nan值
  • Skewness,样本偏度衡量数据样本的不对称性。偏度有几种数学定义。使用 元素计算数据集 偏度的一种常用表达式是 ( ² / (( − 1)( − 2))) (Σᵢ( ᵢ − mean( ))³ / ( ³))。更简单的表达式是 Σᵢ( ᵢ − mean( ))³ / (( − 1)( − 2) ³),其中 = 1, 2, …, 和 mean( ) 是 。
'''左偏分布(负偏态)中:mean(平均数)<median(中位数)<mode(众数)右偏分布(正偏态)中:mode(众数)<median(中位数)<mean(平均数)'''# 常规获取方式x = [1.0, 1, 6.5, 41, 28.5]n = len(x)mean_ = sum(x) / nvar_ = sum((item - mean_)**2 for item in x) / (n - 1)std_ = var_ ** 0.5skew_ = (sum((item - mean_)**3 for item in x)* n / ((n - 1) * (n - 2) * std_**3))skew_0.8025583716578066   # 数值为正则右侧甩尾# scipy.stats.skew() 模式y, y_with_nan = np.array(x), np.array(x_with_nan)scipy.stats.skew(y, bias=False)0.8025583716578066scipy.stats.skew(y_with_nan, bias=False)nan# Pandas Series对象.skew()模式z, z_with_nan = pd.Series(x), pd.Series(x_with_nan)z.skew()0.8025583716578066z_with_nan.skew()0.8025583716578066
  • Percentiles,样本 百分位数是数据集中的元素,使得数据集中 % 的元素小于或等于该值。此外(100 - )% 的元素大于或等于该值。如果数据集中有两个这样的元素,那么样本 百分位数就是它们的算术平均值。每个数据集都有三个四分位数,它们是将数据集分为四个部分的百分位数。
# Python 3.8+# statistics.quantiles() 模式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]# np.percentile() 模式y = np.array(x)np.percentile(y, 5)np.percentile(y, 95)np.percentile(y, [25, 50, 75])np.median(y)# np.nanpercentile() 忽略 nan值y_with_nan = np.insert(y, 2, np.nan)np.nanpercentile(y_with_nan, [25, 50, 75])# pd.Series对象有方法.quantile()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() 模式np.ptp(y)np.ptp(z)np.ptp(y_with_nan)np.ptp(z_with_nan)'''不同的计算方式max() 、min()  # Python 标准库amax() 、amin() # NumPynanmax() 、nanmin() # NumPy 忽略 nan.max() 、 .min() # NumPy.max() 、.min() #  Pandas 默认忽略 nan 值'''

描述性统计摘要

# scipy.stats.describe() 模块'''nobs:数据集中的观察或元素的数量minmax:具有数据集最小值和最大值的元组mean:数据集的平均值variance:数据集的方差skewness:数据集的偏度kurtosis:数据集的峰度'''result = scipy.stats.describe(y, ddof=1, bias=False)# Series对象有方法.describe()'''count:数据集中的元素数量mean:数据集的平均值std:数据集的标准差min和max:数据集的最小值和最大值25%, 50%, and 75%:数据集的四分位数'''result = z.describe()

数据对之间相关性的度量

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

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

  • 当较大的 值对应于较大的 值时,存在正相关,反之亦然。
  • 当较大的 值对应于较小的 值时,存在负相关,反之亦然。
  • 如果没有这种明显的关系,则存在弱或不存在相关性。

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

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_)

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

  • 如果相关性是正的,那么协方差也是正的。
  • 如果相关性为负,则协方差也为负。
  • 如果相关性较弱,则协方差接近于零。
# 纯 Python 中计算协方差n = len(x)mean_x, mean_y = sum(x) / n, sum(y) / ncov_xy = (sum((x[k] - mean_x) * (y[k] - mean_y) for k in range(n))/ (n - 1))# NumPy 具有cov()模块,直接返回协方差矩阵cov_matrix = np.cov(x_, y_)# PandasSeries 具有.cov()模块,计算协方差cov_xy = x__.cov(y__)cov_xy = y__.cov(x__)

相关系数

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

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

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

# Python 计算相关系数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.5r = cov_xy / (std_x * std_y)# scipy.stats.linregress()模块result = scipy.stats.linregress(x_, y_)r = result.rvalue# scipy.stats具有pearsonr()模块r, p = scipy.stats.pearsonr(x_, y_)# Numpy具有np.corrcoef()模块corr_matrix = np.corrcoef(x_, y_)# Pandas的Series有.corr()模块r = x__.corr(y__)r = y__.corr(x__)

二维数组的使用

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

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

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

Mr数据杨:「Python 数据处理基础」数据预处理连续变量10种常用方法

Mr数据杨:「Python 数据处理基础」英文文本数据预处理操作的9种常用方法

Mr数据杨:「Python 数据处理基础」数据特征处理标准化和归一化应用

Mr数据杨:「Python 数据处理基础」数据重复值的统计和处理2种常用方法

Mr数据杨:「Python 数据处理基础」数据预处理离散变量5种常用方法

Mr数据杨:「Python 数据处理基础」数据的降维以及Scikit-learn实现的14种方式

Mr数据杨:「Python 数据处理基础」数据冲突和样本的选取和处理

Mr数据杨:「Python 数据处理基础」中文文本数据预处理操作的8种常用方法

Mr数据杨:「Python 数据处理基础」数据缺失值的可视化和处理8种常用方法

Mr数据杨:「Python 数据处理基础」数据离群值的可视化和处理5种常用方法

Mr数据杨:「Python 数据处理基础」数据特征处理离散化和二值化应用

可视化数据重要性

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

数据可视化是可以让外行人通过图形的方式快速、直接的了解数据所表达的含义。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
十分钟搞定pandas
数据科学 | Pandas数据分析入门
python小技能-缺失数据处理
Python 中 NaN 和 None 的详细比较
Python数据分析、挖掘常用工具
《Python数据分析常用手册》一、NumPy和Pandas篇
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服