4.数据统计描述性分析
本文最后更新于 2025年7月27日 晚上
初始化与加载数据
首先,我们导入 pandas
库,并加载本期练习所需的数据集 2020年中国大学排名.xlsx
。
1 |
|
数据探索
这部分将通过排序、统计和可视化等多种手段,对大学排名数据进行探索性分析。
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
3cols = ['总分', '高端人才得分', '办学层次得分']
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
6import 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-数据统计描述性分析/