尽管理解均值、方差、相关性和其他描述性统计量的公式是基本的,但对于任何大于小规模数据集的数据而言,手动计算很快就会变得不切实际。这时,Python 的数据分析库,特别是 Pandas,就成了数据科学家和机器学习实践者的必需工具。Pandas 提供了高效且易用的函数,用于对通常存储在 Series 或 DataFrame 对象中的数据计算大量描述性统计量。假设您的数据已加载到 Pandas DataFrame 中。如果您正在跟着操作,可以这样创建一个示例 DataFrame:import pandas as pd import numpy as np # 创建示例数据 data = {'ExamScore': [78, 85, 92, 65, 72, 88, 95, 81, 76, 80, np.nan, 83], 'StudyHours': [5, 6, 8, 3, 4, 7, 9, 5.5, 4.5, 5, 2, 6], 'SleepHours': [7, 6.5, 7.5, 8, 7, 6, 7, 7.5, 8, 6.5, 9, 7]} df = pd.DataFrame(data) print(df)这会创建一个 DataFrame df,其中包含不同学生的考试分数、学习时长和睡眠时长,包括一个缺失的考试分数(np.nan)。.describe() 方法:快速概览通常,使用 Pandas 审视数值数据集的第一步是使用 .describe() 方法。它为 DataFrame 中每个数值列(或单个 Series)提供了集中趋势、离散程度和分布形状的简洁概括。# 获取数值列的汇总统计 summary_stats = df.describe() print(summary_stats)运行此代码将产生类似于以下内容的输出: ExamScore StudyHours SleepHours count 11.000000 12.000000 12.000000 mean 81.363636 5.833333 7.208333 std 8.737508 1.991495 0.793394 min 65.000000 2.000000 6.000000 25% 77.000000 4.500000 6.500000 50% 81.000000 5.750000 7.000000 75% 86.500000 7.000000 7.500000 max 95.000000 9.000000 9.000000注意以下几点:count:显示非缺失值的数量。ExamScore 有 11 个,反映了 np.nan。mean:平均值。std:标准差,衡量离散程度。min, max:最小值和最大值。25%, 50%, 75%:这些是四分位数(百分位数)。第 50 个百分位数是中位数。.describe() 方法非常适合快速了解数据的分布和规模。计算单独的统计量虽然 .describe() 很方便,但您通常需要特定的统计量。Pandas 为此提供了专用方法。您可以将它们应用于整个 DataFrame(为每个列计算统计量)或单个 Series(特定列)。集中趋势度量# 计算每列的均值 means = df.mean() print("均值:\n", means) # 计算 'ExamScore' 列的中位数 median_score = df['ExamScore'].median() print(f"\n考试分数中位数: {median_score}") # 计算 'SleepHours' 的众数 # 如果有多个值出现频率最高,众数可能返回多个值 modes_sleep = df['SleepHours'].mode() print("\n睡眠时长众数:\n", modes_sleep)这些函数(.mean()、.median()、.mode())默认自动处理缺失值(由 skipna=True 参数控制)。离散度和位置度量# 计算每列的方差 variances = df.var() print("方差:\n", variances) # 计算 'StudyHours' 的标准差 std_study = df['StudyHours'].std() print(f"\n学习时长标准差: {std_study:.4f}") # 计算最小值和最大值 min_values = df.min() max_values = df.max() print("\n最小值:\n", min_values) print("\n最大值:\n", max_values) # 计算 'ExamScore' 的特定百分位数(例如,第 10 和第 90 个) p10 = df['ExamScore'].quantile(0.10) p90 = df['ExamScore'].quantile(0.90) print(f"\n考试分数第 10 个百分位数: {p10}") print(f"考试分数第 90 个百分位数: {p90}") # 计算 'ExamScore' 的四分位距(IQR) q1 = df['ExamScore'].quantile(0.25) q3 = df['ExamScore'].quantile(0.75) iqr = q3 - q1 print(f"考试分数的 IQR: {iqr}").quantile(q) 方法多功能,可以查找任何百分位数,其中 $q$ 在 0 到 1 之间。范围可以通过用 .max() 的结果减去 .min() 的结果来简单计算。分布形状度量偏度和峰度分别告诉您分布的不对称性和尖峭程度。# 计算每列的偏度 skewness = df.skew() print("偏度:\n", skewness) # 计算 'StudyHours' 的峰度 kurt_study = df['StudyHours'].kurt() # 费舍尔定义(正态分布为 0) # kurt_study = df['StudyHours'].kurtosis() # 与 .kurt() 相同 print(f"\n学习时长的峰度: {kurt_study:.4f}")正偏度表示尾部延伸向更高值,而负偏度表示尾部延伸向更低值。峰度衡量“尾部厚度”;更高的峰度意味着与正态分布相比,有更多异常值或更厚的尾部。相关性分析为了解数值变量对之间的线性关系,请在 DataFrame 上使用 .corr() 方法。# 计算列之间的成对相关性 correlation_matrix = df.corr() print("\n相关矩阵:\n", correlation_matrix)这将输出一个相关矩阵,其中每个单元格 $(i, j)$ 包含列 $i$ 和列 $j$ 之间的皮尔逊相关系数。对角线元素始终为 1(变量与自身的关联)。 ExamScore StudyHours SleepHours ExamScore 1.000000 0.946434 -0.394137 StudyHours 0.946434 1.000000 -0.417979 SleepHours -0.394137 -0.417979 1.000000从中我们可以看到 ExamScore 和 StudyHours 之间存在强正相关($0.95$),这表明学习时间更多的学生往往获得更高的分数。StudyHours 和 SleepHours 之间存在中等负相关,这可能表明在这个样本中,更多的学习时间可能与较少的睡眠相关。请记住,相关性不代表因果关系!描述性统计量的可视化尽管数值概括很重要,但数据可视化通常能提供更深刻的理解。Pandas 与 Matplotlib 集成,可以直接从 DataFrames 或 Series 进行快速绘图。对于更自定义或高级的图表,通常使用 Seaborn 或 Plotly 等库。以下是在计算统计量后,如何使用 Plotly 快速可视化 ExamScore 分布的方法:{"layout": {"title": "考试分数分布", "xaxis": {"title": "考试分数"}, "yaxis": {"title": "频率"}, "bargap": 0.1, "template": "plotly_white"}, "data": [{"type": "histogram", "x": [78, 85, 92, 65, 72, 88, 95, 81, 76, 80, 83], "marker": {"color": "#228be6"}}]}直方图显示了样本数据中考试分数的频率分布。该直方图通过视觉方式展示分数分布的形状,补充了数值统计量(如均值、中位数、偏度)。有效地使用 Pandas 可以让您快速地从原始数据过渡到有意义的统计概括,为机器学习工作流程中的进一步分析、可视化和模型构建奠定基础。