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

在大数据时代的背景下,数据分析已经成为了商业决策、科研、甚至日常生活中不可或缺的一部分。但面对海量的数据如何从中提取有用的信息,进而做出明智的决策呢?描述性统计数据分析,就是解决这一问题的关键所在。本文通过Python这一流行的编程语言提供一份详尽而易于理解的描述性统计数据分析指南。

Python凭借其丰富的库和高度可定制的特性,已经成为数据科学领域中最受欢迎的工具之一。但无论工具有多么强大,正确和高效地使用它们始终是最重要的。因此本文不仅会介绍各种描述性统计的基础概念,如度量类型、总体和样本、异常值等,还将深入探讨如何使用Python进行实际的数据分析。包括但不限于集中趋势测度、变异性测量,以及数据对之间相关性的度量等。

通过生活中的实际案例,如消费行为分析、气象数据解读等,来演示描述性统计在解决实际问题中的应用,使得即便是对数据科学和编程毫无基础的读者,也能轻松地理解和掌握这一领域的核心概念和技巧。

理解描述性统计

描述性统计是一种科学分析数据的方法,不仅仅是对数据进行描述和概括,它更是一种科学地分析和解释数据的手段。这一过程涵盖了两种主要的方法:

  • 定量分析:这种方法用数字和计算来精确描述数据的各个方面。
  • 数据可视化:这里使用图表、绘图、直方图等多种可视化工具来更直观地展现数据的特点。

描述性统计可以广泛应用于单一或多重数据集和变量。在处理单一变量时通常进行单变量分析;而在探究两个变量间的关系时,双变量分析更为合适。对于涉及多个变量的复杂数据集,多变量分析是必不可少的。

三大度量维度

要进行有效的描述性统计分析,了解以下三种主要的度量类型是必要的:

  • 集中趋势:这描述了数据的“中心”,通常通过平均值、中位数和众数来量化。
  • 可变性:这涉及到数据分布的广度或波动,常用方差和标准差来衡量。
  • 相关性或联合变异性:这是用来描述数据集中两个或多个变量间相互关系的度量,例如协方差和相关系数。

总体与样本

在统计学中,需要进行一种取舍策略,总体指的是研究对象全体的集合。由于总体通常规模庞大,直接对其进行全面分析是不现实的。因此统计学家通常会选择一个能代表总体特性的样本进行研究。这样通过样本分析所得出的结论就可以在一定程度上推广到整个总体。

异常值

异常值是需特别关注的数据点,是那些与大多数数据点有显著差异的元素。这些差异可能源自数据的自然波动、观测系统的变化或是数据收集过程中的错误。识别异常值没有固定的数学规则,而是依赖于专业经验、主题知识以及逻辑推理。

Python 中的多功能统计库

  • Statistics: 这是 Python 的内置库,专门用于进行描述性统计分析。如果您处理的数据集规模较小,或者您不需要依赖其他外部库,那么该库是一个非常方便的选择。
  • NumPy: 这是一个高效的第三方数值计算库,特别针对单维和多维数组进行了高度优化。它主要使用一种名为 ndarray 的数组类型,并提供了一系列专门用于统计分析的函数和操作。
  • SciPy: 基于 NumPy 构建的这个第三方科学计算库,提供了比 NumPy 更丰富的功能集。其中scipy.stats 模块专门用于进行复杂的统计分析。
  • Pandas: 这是另一个基于 NumPy 的第三方库,特别适用于处理带有标签的一维(1D)数据和二维(2D)数据。其主要数据结构包括一维的 Series 对象和二维的 DataFrame 对象。
  • Matplotlib: 这是一个出色的第三方数据可视化库。当与 NumPy、SciPy 和 Pandas 结合使用时,它能非常直观地展示分析结果,从而更好地解释和理解数据。

计算描述性统计

需要导入一些用于数据分析和统计计算的第三方库。

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

进行数据准备将创建几个示例数据集。在数据分析中,缺失值通常使用 nan(Not a Number)来表示。Python 提供了多种方式来生成 nan,包括 float('nan')math.nannp.nan

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

还将创建几个 NumPy 数组和 Pandas Series 对象,这些都是常用的一维数据结构。

# 创建 NumPy 数组
y, y_with_nan = np.array(x), np.array(x_with_nan)

# 创建 Pandas Series 对象
z, z_with_nan = pd.Series(x), pd.Series(x_with_nan)

# 输出 NumPy 数组和 Pandas Series
y
# Output: array([ 8. ,  1. ,  2.5, 4. , 28. ])

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

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

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

测量集中趋势:多维度解析

集中趋势的测量方法用于揭示数据集的“中心”或“平均”值,这里有多种方式来描述这一“中心”。

  • 算术平均值(Mean):这是最常用的平均数计算方法,它是所有数据点的算术平均值。数学上,数据集 x \text{x} x 的算术平均值是 Σ i = 1 n x i n \frac{\Sigma_{i=1}^{n} x_i}{n} nΣi=1nxi,其中 x i x_i xi 是数据集中的每个元素, n n n 是数据集的大小。
  • 加权平均数(Weighted Mean):这是算术平均数的一个变体,允许每个数据点有不同的权重。数学公式为: Σ i = 1 n ( w i × x i ) Σ i = 1 n w i \frac{\Sigma_{i=1}^{n} (w_i \times x_i)}{\Sigma_{i=1}^{n} w_i} Σi=1nwiΣi=1n(wi×xi),其中 w i w_i wi 是每个数据点 x i x_i xi 的权重。
  • 几何平均数(Geometric Mean):几何平均数是所有数据点的乘积的 n n n 次方根,表示为 Π i = 1 n x i n \sqrt[n]{\Pi_{i=1}^{n} x_i} nΠi=1nxi
  • 谐波均值(Harmonic Mean):谐波均值是所有数据点倒数的平均值的倒数,计算公式为 n Σ i = 1 n 1 x i \frac{n}{\Sigma_{i=1}^{n} \frac{1}{x_i}} Σi=1nxi1n
  • 中位数(Median):如果你将数据集按大小排序,中位数是位于中间的那个数。对于奇数个数据点,它是中间的数;对于偶数个,它是中间两个数的平均值。
  • 众数(Mode):众数是数据集中出现次数最多的数。如果有多个这样的数,那么这个数据集就是多模的。

这些方法各有利弊和适用场景,理解它们的工作原理和适用性是进行有效数据分析的关键。

变异性测量:深入理解数据分布

方差(Variance) 是一种衡量数据分布的广度的指标。它量化了数据点相对于算术平均值的偏离程度。数学表达式为:

样本方差 = Σ i = 1 n ( x i − mean ( x ) ) 2 n − 1 \text{样本方差} = \frac{\Sigma_{i=1}^{n}(x_i - \text{mean}(x))^2}{n-1} 样本方差=n1Σi=1n(ximean(x))2

其中 n n n 是样本大小, x i x_i xi 是每一个数据点, mean ( x ) \text{mean}(x) mean(x) 是算术平均值。

# 使用 Python 的多种方式来计算样本方差
var_ = statistics.variance(x)
var_ = np.var(y, ddof=1)
var_ = z.var(ddof=1)

标准偏差(Standard Deviation)是方差的平方根,用于量化数据的分布范围。其数学表达式为: s = 方差 s = \sqrt{\text{方差}} s=方差

# 计算样本标准偏差的 Python 示例
std_ = statistics.stdev(x)
std_ = np.std(y, ddof=1)
std_ = z.std(ddof=1)

偏度(Skewness) 是衡量数据分布偏斜程度的统计量。它用于识别数据分布的对称性。

# 计算样本偏度的 Python 示例
skew_ = scipy.stats.skew(y, bias=False)
skew_ = z.skew()

百分位数(Percentiles)是将数据集从小到大排序后,位于特定百分比位置的数据点。

# 计算百分位数的 Python 示例
q25, q50, q75 = np.percentile(y, [25, 50, 75])

极差(Ranges),数据范围或极差是数据集中最大值与最小值的差。

# 计算数据范围的 Python 示例
range_ = np.ptp(y)

理解这些变异性测量方法有助于更全面地了解数据的分布特性,从而进行更准确的分析和决策。

描述性统计摘要:一站式数据分析

在数据分析过程中,有时需要快速地获取数据集的核心统计指标。这些指标可以提供数据集的“大致轮廓”,帮助了解数据的分布、集中趋势和变异性。Python 中有一些工具可以方便地完成这项任务。

scipy.stats.describe() 函数提供了一种快速获取数据集多个描述性统计量的方法。它返回以下几个重要的统计量:

  • 观察数(nobs):数据集中的观察或元素数量。
  • 最小值和最大值(minmax):数据集的最小和最大值。
  • 平均值(mean):数据集的算术平均值。
  • 方差(variance):数据集的方差,表示数据点与平均值的偏离程度。
  • 偏度(skewness):衡量数据分布的偏斜程度。
  • 峰度(kurtosis):衡量数据分布的尖锐程度。
# 使用 scipy.stats.describe() 获取描述性统计摘要
result = scipy.stats.describe(y, ddof=1, bias=False)

使用 Pandas 的 .describe() 方法也提供了数据集的基础描述性统计信息,虽然不如 SciPy 全面,但对于快速了解数据集还是非常方便的。

  • 元素数量(count):数据集中的观察数。
  • 平均值(mean):数据集的平均值。
  • 标准偏差(std):数据集的标准偏差。
  • 最小值(min)和最大值(max):数据集的极值。
  • 四分位数(25%, 50%, 75%):数据集的下四分位数、中位数和上四分位数。
# 使用 Pandas 的 .describe() 方法获取描述性统计摘要
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) / n
cov_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.5
r = 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__)

二维数组的使用

在数据分析中,二维数组或表格结构是最常见的数据形式。这是因为很多现实世界的数据都是以表格的形式呈现,如电子表格、数据库表等。

NumPy 提供了一个强大的对象:ndarray,这是一个具有多维数组和矩阵能力的库。SciPy 则在 NumPy 的基础上提供了大量的数学算法和便利函数。

import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

arr[0,0]  # 访问元素
arr[:,0]  # 访问列

Pandas 提供了 DataFrame 对象,专门用于处理带标签的二维数据。它允许你执行各种操作,如分组、过滤、合并等。

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

df['A']  # 访问列
df.iloc[0]  # 访问行

数据可视化的不可或缺:让数据“说话”

数据可视化是数据分析的一个重要组成部分,它通过图形和图像的形式,让我们能够更直观地理解数据的结构和含义。

常用库和工具有

  • Matplotlib:最基础的 Python 数据可视化库。
  • Seaborn:基于 Matplotlib 的高级接口,更美观。
  • Plotly:用于创建交互式图表。
  • Bokeh:专为现代 Web 浏览器而设计,能快速、简单地创建交互式图表。

不同的图表可以展示不同的的含义

  1. 柱状图和直方图:用于描述分类数据或数据分布。
  2. 折线图:用于展示趋势和时间序列数据。
  3. 散点图:用于探究变量之间的关系。
  4. 饼图:用于描述各类别相对于总体的占比。
  5. 箱线图和小提琴图:用于展示数据的分布和异常值。
  6. 热图和相关矩阵:用于展示二维数据或变量之间的相关性。
  7. 地理信息图:用于展示地理区域相关的数据。
  • 3
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr数据杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值