一、离散程度度量

衡量数据分散程度的指标:

  1. 极差(Range):最大值与最小值之差

  2. 四分位差(IQR):Q3(75%)与Q1(25%)之差

  3. 方差(Variance):数据点与均值的平均平方差

  4. 标准差(Standard Deviation):方差的平方根

  5. 变异系数(CV):标准差与均值的比值(用于比较不同量纲数据)

import numpy as np
import pandas as pd

data = pd.Series([10, 12, 23, 23, 16, 23, 21, 16])

# 离散程度计算
statistics = {
    "极差": data.max() - data.min(),
    "四分位差": data.quantile(0.75) - data.quantile(0.25),
    "方差": data.var(),
    "标准差": data.std(),
    "变异系数": data.std() / data.mean()
}

print(pd.DataFrame(statistics, index=["值"]))

二、标准化值(Z-Score)

将数据转换为均值为0、标准差为1的标准分布:

from scipy.stats import zscore

# 计算Z-Score
data_z = zscore(data)
print("标准化值:\n", data_z)

# 判断离群点(通常 |Z| > 3 为离群值)
outliers = data[np.abs(data_z) > 2]
print("离群点:\n", outliers)

三、分布形态分析

  1. 偏度(Skewness)

    • 正偏(右偏):均值 > 中位数,长尾在右

    • 负偏(左偏):均值 < 中位数,长尾在左

  2. 峰度(Kurtosis)

    • 描述分布尖锐程度(与正态分布相比)

    • 高峰厚尾(K>0)、低峰薄尾(K<0)

from scipy.stats import skew, kurtosis

print(f"偏度: {skew(data):.4f}")  # >0 右偏,<0 左偏
print(f"峰度: {kurtosis(data):.4f}")  # 正态分布峰度≈0

四、描述性统计图表

1. 箱线图(Boxplot) - 展示离散程度与离群点

import matplotlib.pyplot as plt
import seaborn as sns

sns.boxplot(data=data, orient='h')
plt.title("数据分布箱线图")
plt.show()

2. 直方图 + KDE(核密度估计) - 展示分布形态

sns.histplot(data, kde=True, color='skyblue')
plt.axvline(data.mean(), color='r', linestyle='--', label=f'均值={data.mean():.2f}')
plt.axvline(data.median(), color='g', linestyle='-', label=f'中位数={data.median():.2f}')
plt.title("直方图与密度估计")
plt.legend()
plt.show()

3. Q-Q图(Quantile-Quantile Plot) - 检验正态性

from scipy.stats import probplot

probplot(data, plot=plt)
plt.title("Q-Q 图")
plt.show()

4. 小提琴图(Violin Plot) - 箱线图与KDE的结合

sns.violinplot(data=data, inner="quartile")
plt.title("小提琴图")
plt.show()

五、综合案例:房价数据分析

# 加载示例数据集
df = sns.load_dataset('tips')

# 1. 离散程度分析
print("总账单离散指标:")
print(f"标准差: {df['total_bill'].std():.2f}")
print(f"四分位差: {df['total_bill'].quantile(0.75) - df['total_bill'].quantile(0.25):.2f}")

# 2. 标准化处理
df['total_bill_z'] = zscore(df['total_bill'])

# 3. 分布形态分析
print(f"偏度: {skew(df['total_bill']):.2f}")
print(f"峰度: {kurtosis(df['total_bill']):.2f}")

# 4. 多图表展示
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
sns.boxplot(data=df, x='total_bill', ax=axes[0])
sns.histplot(df['total_bill'], kde=True, ax=axes[1])
probplot(df['total_bill'], plot=axes[2])
plt.tight_layout()
plt.show()

关键输出解读:

  • 箱线图:箱体代表IQR,须线延伸至1.5×IQR外的离群点

  • Q-Q图:数据点越接近对角线,越符合正态分布

  • 偏度 > 0:数据右偏(均值被高值拉高)

  • 峰度 > 0:分布比正态分布更尖峰(尾部更厚)


通过上述分析,可全面掌握数据分布特征,为后续统计分析(如假设检验、回归建模)奠定基础。

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐