4.数据统计描述性分析

本文最后更新于 2025年7月27日 晚上

初始化与加载数据

首先,我们导入 pandas 库,并加载本期练习所需的数据集 2020年中国大学排名.xlsx

1
2
3
4
import pandas as pd

# 加载数据
df = pd.read_excel("2020年中国大学排名.xlsx")

数据探索

这部分将通过排序、统计和可视化等多种手段,对大学排名数据进行探索性分析。

1. 查看数据

  • 题目: 查看数据前 10 行。
  • 答案:
    1
    df.head(10)
  • 解释:
    • df.head(n) 用于显示 DataFrame 的前 n 行,这里 n=10。这能帮助我们快速预览数据的主体内容和列名,对数据建立初步印象。

2. 修改索引

  • 题目: 将索引修改为 学校名称 列。
  • 答案:
    1
    df.set_index('学校名称', inplace=True)
  • 解释:
    • set_index() 方法可以将 DataFrame 的某一列或多列设置为新的行索引。
    • inplace=True 参数会直接在原始 DataFrame 上进行修改,而不会返回一个新的 DataFrame。这样做可以节省内存。修改后,我们就可以通过学校名称(如 df.loc['清华大学'])来直接访问数据行,更加直观。

3. 查看数据量

  • 题目: 计算数据框的 行 * 列,总共单元格的数量。
  • 答案:
    1
    df.size
  • 解释:
    • df.size 属性返回 DataFrame 中元素的总数,即 行数 × 列数。这与返回 (行数, 列数) 元组的 df.shape 不同。size 告诉我们数据集中总共有多少个数据点。

4. 数据排序

  • 题目: 将数据按照总分升序排列,并展示前20个学校(即倒数20名)。
  • 答案:
    1
    df.sort_values(by='总分', ascending=True).head(20)
  • 解释:
    • sort_values() 是用于排序的核心方法。
    • by='总分' 指定了我们根据哪一列进行排序。
    • ascending=True 表示升序排列。默认值为 True,所以当需要升序时也可以省略。
    • .head(20) 链式调用,紧接着选取排序后结果的前 20 行。

5. 数据排序

  • 题目: 将数据按照 高端人才得分 降序排序,展示前 10 位。
  • 答案:
    1
    df.sort_values(by='高端人才得分', ascending=False).head(10)
  • 解释:
    • 与上一题类似,但 ascending=False 表示降序排列,即将分值高的排在前面。

6. 分列排名

  • 题目: 查看各项得分最高的学校名称。
  • 答案:
    1
    2
    3
    4
    # 筛选出所有得分列
    score_cols = df.columns[3:]
    # 使用 idxmax() 找到每列最大值对应的索引(即学校名称)
    df[score_cols].idxmax()
  • 解释:
    • idxmax() 是一个非常实用的函数,它会返回每列中最大值第一次出现的索引。因为我们已经将“学校名称”设置为了索引,所以结果直接就是学校的名字。这比先找到最大值再去找对应的学校要高效得多。

7. 统计信息|均值

  • 题目: 计算总分列的均值。
  • 答案:
    1
    df['总分'].mean()
    • 解释:
    • .mean() 方法用于计算 Series 或 DataFrame 列的算术平均值。

8. 统计信息|中位数

  • 题目: 计算总分列的中位数。
  • 答案:
    1
    df['总分'].median()
  • 解释:
    • .median() 方法用于计算中位数。中位数是将数据排序后位于中间位置的那个值,它比均值更能抵抗极端值(异常值)的影响。

9. 统计信息|众数

  • 题目: 计算总分列的众数。
  • 答案:
    1
    df['总分'].mode()
  • 解释:
    • .mode() 方法用于计算众数,即数据集中出现次数最多的那个值。
    • 注意它返回的是一个 Series,因为数据中可能存在多个众数(出现次数相同)。

10. 统计信息|部分

  • 题目: 计算 总分、高端人才得分、办学层次得分的最大最小值、中位数、均值。
  • 答案:
    1
    2
    3
    cols = ['总分', '高端人才得分', '办学层次得分']
    stats_to_calc = ['max', 'min', 'median', 'mean']
    df[cols].agg(stats_to_calc)
  • 解释:
    • .agg() (aggregate 的缩写) 是一个极其强大的函数,它允许你对指定的列同时应用一个或多个聚合函数。
    • 我们只需要将目标列和想计算的统计函数名称列表传入即可,代码非常整洁。

11. 统计信息|完整

  • 题目: 查看数值型数据的统计信息(均值、分位数等),并保留两位小数。
  • 答案:
    1
    df.describe().round(2)
  • 解释:
    • df.describe() 我们在上一期已经学过,用于生成描述性统计摘要。
    • .round(2) 方法可以链式调用,将结果中的所有数值四舍五入到指定的小数位数(这里是两位),使输出更美观、易读。

12. 统计信息|分组

  • 题目: 计算各省市总分均值。
  • 答案:
    1
    df.groupby('省市')['总分'].mean()
  • 解释:
    • groupby() 是 Pandas 的核心功能之一,用于实现“分割-应用-合并” (Split-Apply-Combine) 的操作。
    • df.groupby('省市'): 首先根据“省市”列将数据分割成不同的组。
    • ['总分']: 然后在每个组内,选取“总分”这一列。
    • .mean(): 最后对每个组的“总分”计算均值,并将结果合并成一个新的 Series。

13. 统计信息|相关系数

  • 题目: 计算相关系数矩阵。
  • 答案:
    1
    df.corr()
  • 解释:
    • .corr() 方法用于计算 DataFrame 中所有数值列两两之间的皮尔逊相关系数
    • 结果是一个矩阵,对角线上的值恒为 1(自身与自身相关)。矩阵中的值范围在 -1 到 1 之间,表示两列数据的线性相关程度:
      • 接近 1:强正相关(一列增加,另一列也倾向于增加)
      • 接近 -1:强负相关(一列增加,另一列倾向于减少)
      • 接近 0:无线性相关

14. 相关系数|热力图

  • 题目: 将上一题的相关性系数矩阵制作为热力图。
  • 答案:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 需要先导入可视化库
    import seaborn as sns
    import matplotlib.pyplot as plt

    # 计算相关系数
    correlation_matrix = df.corr()

    # 绘制热力图
    plt.figure(figsize=(10, 8)) # 设置画布大小
    sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
    plt.show()
  • 解释:
    • 热力图是可视化相关系数矩阵的最佳方式。
    • seaborn.heatmap():
      • 第一个参数是数据,即我们的相关系数矩阵。
      • annot=True: 在每个格子上显示数值。
      • cmap='coolwarm': 指定颜色映射方案,正相关(红色)和负相关(蓝色)一目了然。

15. 统计信息|频率

  • 题目: 计算各省市出现的次数。
  • 答案:
    1
    df['省市'].value_counts()
  • 解释:
    • .value_counts() 是一个非常便捷的方法,用于统计一个 Series 中每个唯一值出现的次数,并按频率降序排列。

16. 统计信息|热力地图

  • 题目: 结合 pyecharts 将各省市高校上榜数量进行地图可视化。
  • 答案:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 确保已安装 pyecharts: pip install pyecharts
    from pyecharts import options as opts
    from pyecharts.charts import Map

    # 1. 获取数据
    province_counts = df['省市'].value_counts()

    # 2. 准备 pyecharts 需要的数据格式:[('省份', 数量), ...]
    data_list = list(zip(province_counts.index, province_counts.values.astype(str)))

    # 3. 创建地图
    c = (
    Map()
    .add("高校上榜数量", data_list, "china")
    .set_global_opts(
    title_opts=opts.TitleOpts(title="各省市TOP500高校上榜数量"),
    visualmap_opts=opts.VisualMapOpts(max_=int(province_counts.max())),
    )
    )
    # 在 Jupyter Notebook 中可以直接显示
    c.render_notebook()
    # 或者保存为 html 文件
    # c.render("university_distribution_map.html")
  • 解释:
    • Pyecharts 是一个用于生成交互式图表的强大库。
    • 这段代码首先获取省市的计数值,然后将其转换为 Pyecharts Map 图表需要的 [(key, value), ...] 格式。
    • .add() 方法将数据添加到地图上。
    • .set_global_opts() 用于设置图表的全局选项,如图表标题、视觉映射范围等。

17. 统计信息|直方图

  • 题目: 绘制总分的直方图、密度估计图。
  • 答案:
    1
    2
    3
    4
    5
    6
    import seaborn as sns
    import matplotlib.pyplot as plt

    sns.histplot(df['总分'], kde=True)
    plt.title('总分分布直方图')
    plt.show()
  • 解释:
    • 直方图是观察单个数值变量分布的绝佳工具。
    • seaborn.histplot():
      • 第一个参数是要绘制的数据列。
      • kde=True: (Kernel Density Estimate) 会在直方图上叠加一条平滑的核密度估计曲线,更清晰地展示数据分布的形状。

2 个 pandas EDA 插件

除了手动一步步分析,社区也开发了一些强大的工具,可以一键生成详细的探索性数据分析(EDA)报告。

18. pandas_profiling

  • 解释:
    • pandas-profiling (现在叫 ydata-profiling) 是一个能自动生成交互式 EDA 报告的库。报告内容极其详尽,包括每列的统计信息、分布图、相关性、缺失值分析等等。
  • 代码:
    1
    2
    3
    4
    5
    # 如果未安装,先执行: !pip install ydata-profiling
    from ydata_profiling import ProfileReport

    profile = ProfileReport(df, title="大学排名数据分析报告")
    profile # 在 Jupyter Notebook 中,这行代码会自动渲染报告

19. sweetviz

  • 解释:
    • sweetviz 是另一个自动化 EDA 工具,它的特点是能很方便地对两个数据集(例如训练集和测试集)进行对比分析。它生成的报告同样是交互式的 HTML 文件。
  • 代码:
    1
    2
    3
    4
    5
    6
    7
    8
    # 如果未安装,先执行: !pip install sweetviz
    import sweetviz as sv

    # 分析数据集
    report = sv.analyze(df)

    # 在浏览器中显示报告
    report.show_html('sweetviz_report.html')

4.数据统计描述性分析
https://blog.wyyy.dpdns.org/2025/4-数据统计描述性分析/
作者
lwy
发布于
2025年7月27日
许可协议