Python 数据统计完全指南:从数据清洗到统计分析的完整流程

本指南将系统性地介绍使用Python进行数据统计的全过程,从原始数据清洗到高级统计分析。我们将使用Python核心库(如pandas、numpy、scipy和matplotlib),确保每一步都结构清晰、代码可复现。指南分为四个主要阶段:数据清洗数据预处理统计分析完整流程示例。每个阶段包含理论解释、数学公式(使用LaTeX格式)和Python代码实现。


1. 数据清洗

数据清洗是处理原始数据中的错误、缺失和不一致性的第一步。目标是获得干净、可靠的数据集。

  • 处理缺失值:缺失值会影响后续分析,常用方法包括删除或填充。数学上,缺失值比例可表示为:
    $$\text{缺失率} = \frac{\text{缺失值数量}}{\text{总数据点数量}} \times 100%$$
    在Python中,使用pandas库处理:

    import pandas as pd
    
    # 加载数据(示例:CSV文件)
    df = pd.read_csv('data.csv')
    
    # 检查缺失值
    missing_rate = df.isnull().sum() / len(df) * 100
    print(f"缺失值比例:\n{missing_rate}")
    
    # 填充缺失值(例如用均值填充)
    df_filled = df.fillna(df.mean())
    
    # 或删除缺失值(如果缺失率低)
    df_dropped = df.dropna()
    

  • 处理重复值:重复记录会导致分析偏差,使用去重方法。

    # 删除重复行
    df_unique = df.drop_duplicates()
    
    # 检查去重后数据大小
    print(f"原始数据行数:{len(df)}, 去重后行数:{len(df_unique)}")
    

  • 数据类型转换:确保数值列正确转换(如字符串转浮点数)。

    # 转换数据类型(示例:将'price'列转为float)
    df['price'] = pd.to_numeric(df['price'], errors='coerce')
    

关键点:清洗后数据应无缺失、无重复且类型一致。使用df.info()验证数据结构。


2. 数据预处理

预处理阶段将清洗后的数据转换为适合分析的格式,包括标准化、归一化和异常值处理。

  • 标准化(Z-score):使数据符合标准正态分布,公式为:
    $$z = \frac{x - \mu}{\sigma}$$
    其中$\mu$是均值,$\sigma$是标准差。

    from sklearn.preprocessing import StandardScaler
    
    # 标准化数值列
    scaler = StandardScaler()
    df_scaled = scaler.fit_transform(df[['feature1', 'feature2']])
    df_scaled = pd.DataFrame(df_scaled, columns=['feature1_scaled', 'feature2_scaled'])
    

  • 归一化(Min-Max):将数据缩放到[0,1]范围,公式为:
    $$x_{\text{norm}} = \frac{x - \min(x)}{\max(x) - \min(x)}$$

    from sklearn.preprocessing import MinMaxScaler
    
    # 归一化数值列
    minmax_scaler = MinMaxScaler()
    df_normalized = minmax_scaler.fit_transform(df[['feature1', 'feature2']])
    df_normalized = pd.DataFrame(df_normalized, columns=['feature1_norm', 'feature2_norm'])
    

  • 处理异常值:使用统计方法(如IQR)检测并移除异常值。IQR公式为:
    $$\text{IQR} = Q_3 - Q_1$$
    异常值定义为:$x < Q_1 - 1.5 \times \text{IQR}$ 或 $x > Q_3 + 1.5 \times \text{IQR}$。

    # 计算IQR并过滤异常值
    Q1 = df['feature'].quantile(0.25)
    Q3 = df['feature'].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    df_clean = df[(df['feature'] >= lower_bound) & (df['feature'] <= upper_bound)]
    

关键点:预处理后数据应分布均匀,无偏差。可视化验证(如箱线图)推荐使用seaborn库。


3. 统计分析

基于预处理数据,进行描述性和推断性统计分析,以提取洞察。

  • 描述性统计:计算基本统计量,如均值$\mu$、中位数、标准差$\sigma$等。
    $$\mu = \frac{1}{n} \sum_{i=1}^{n} x_i, \quad \sigma = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \mu)^2}$$

    import numpy as np
    
    # 计算描述性统计
    mean_val = np.mean(df['feature'])
    median_val = np.median(df['feature'])
    std_dev = np.std(df['feature'], ddof=1)  # ddof=1 用于样本标准差
    
    print(f"均值:{mean_val}, 中位数:{median_val}, 标准差:{std_dev}")
    
    # 使用pandas快速总结
    summary = df.describe()
    print(summary)
    

  • 推断统计:进行假设检验(如t检验),评估组间差异。t统计量公式为:
    $$t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}$$
    其中$\bar{x}$是样本均值,$\mu_0$是假设均值,$s$是样本标准差,$n$是样本大小。

    from scipy import stats
    
    # 独立样本t检验(示例:比较两组数据)
    group1 = df[df['group'] == 'A']['value']
    group2 = df[df['group'] == 'B']['value']
    
    t_stat, p_value = stats.ttest_ind(group1, group2)
    print(f"t统计量:{t_stat}, p值:{p_value}")
    
    # 解释结果:p值 < 0.05 表示显著差异
    

  • 可视化分析:使用图表展示分布和关系。

    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 直方图展示分布
    sns.histplot(df['feature'], kde=True)
    plt.title('特征分布')
    plt.show()
    
    # 散点图展示相关性
    sns.scatterplot(x='feature1', y='feature2', data=df)
    plt.title('特征间关系')
    plt.show()
    

关键点:分析后应生成报告,包括统计量和可视化。使用scipy.stats进行高级检验(如ANOVA或回归)。


4. 完整流程示例

以下是一个端到端的Python脚本,模拟从数据加载到分析的完整流程(使用示例数据)。

# 导入库
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from scipy import stats
import matplotlib.pyplot as plt

# 步骤1: 数据清洗
df = pd.DataFrame({
    'id': [1, 2, 3, 4, 5],
    'value': [10, np.nan, 30, 30, 50],  # 包含缺失和重复
    'group': ['A', 'A', 'B', 'B', 'B']
})
print("原始数据:\n", df)

# 填充缺失值
df['value'] = df['value'].fillna(df['value'].mean())
# 删除重复值
df = df.drop_duplicates(subset=['value'])
print("清洗后数据:\n", df)

# 步骤2: 数据预处理
scaler = StandardScaler()
df['value_scaled'] = scaler.fit_transform(df[['value']])
print("标准化后数据:\n", df)

# 步骤3: 统计分析
# 描述性统计
mean_val = np.mean(df['value'])
std_dev = np.std(df['value'], ddof=1)
print(f"均值:{mean_val}, 标准差:{std_dev}")

# t检验(比较组A和B)
groupA = df[df['group'] == 'A']['value']
groupB = df[df['group'] == 'B']['value']
t_stat, p_value = stats.ttest_ind(groupA, groupB)
print(f"t检验结果:t={t_stat}, p={p_value}")

# 可视化
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.boxplot(x='group', y='value', data=df)
plt.title('组间比较')
plt.subplot(1, 2, 2)
sns.scatterplot(x='id', y='value', hue='group', data=df)
plt.title('数据分布')
plt.tight_layout()
plt.show()

输出解释

  • 脚本加载数据后,清洗缺失和重复值。
  • 标准化确保数据可比。
  • t检验显示组间差异(p值 < 0.05表示显著)。
  • 可视化帮助直观理解。

结论

本指南详细介绍了Python数据统计的完整流程:

  1. 数据清洗:处理缺失、重复和类型错误。
  2. 数据预处理:通过标准化和异常值处理优化数据。
  3. 统计分析:执行描述性和推断性分析,辅以可视化。
    关键优势是使用开源库(pandas、scikit-learn、scipy)实现自动化,确保结果可靠。建议在实际项目中:
  • 使用Jupyter Notebook逐步调试。
  • 扩展至机器学习模型(如scikit-learn的回归算法)。
  • 参考文档:pandas官网, scipy教程

通过本指南,您能高效地从原始数据提取统计洞察,适用于商业分析、科研等领域。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐