数据集:2023-2025昆明市高校录取数据集(51校×分专业录取线)CSVXLSX资源-CSDN下载
Python代码:昆明高校录取数据可视化分析.py资源-CSDN下载
摘要:本文基于云南省 51 所高校 2023-2025 年招生录取数据(38,757 行 × 34 字段),使用 pandas 完成数据清洗与聚合,并结合 matplotlib / seaborn 绘制 10 张带图例的可视化图表,从专业分数线 Top、云南与外省生源对比、年度趋势、位次分布、院校与生源结构等维度展开分析,全程标注统计口径与数据局限。
一、环境配置与中文支持
分析环境基于 Jupyter Notebook,使用 pandas 处理数据、matplotlib 与 seaborn 绘图。中文显示需要显式指定字体,并关闭负号乱码。
# %% get_ipython().run_line_magic('matplotlib', 'inline') import numpy as np import pandas as pd import matplotlib import matplotlib.pyplot as plt import seaborn as sns 中文字体与负号显示 plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC", "WenQuanYi Micro Hei", "SimHei"] plt.rcParams["axes.unicode_minus"] = False plt.rcParams["figure.dpi"] = 120 plt.rcParams["savefig.dpi"] = 150 plt.rcParams["savefig.bbox"] = "tight" sns.set_theme(style="whitegrid", font="Noto Sans CJK SC") print("pandas", pd.version, "| matplotlib", matplotlib.version, "| seaborn", sns.version)输出结果:
pandas 2.2.3 | matplotlib 3.11.0 | seaborn 0.13.2二、数据加载与清洗
数据集中分数类字段为文本类型,缺失值以-表示。清洗时统一转为数值列,便于后续统计与绘图。
# %% import os DATA = "kunming_university_dataset.csv" def load_and_clean(path): df = pd.read_csv(path, encoding="utf-8-sig", low_memory=False) for col in ["min", "min_section", "average", "max", "proscore"]: df[col + "_num"] = pd.to_numeric(df[col].replace("-", np.nan), errors="coerce") return df df = load_and_clean(DATA) print(f"数据规模: {df.shape[0]} 行 × {df.shape[1]} 列(含清洗生成的数值列)") print("年份:", sorted(df['year'].unique())) print("高校数:", df['school_name'].nunique(), "| 生源省份:", df['local_province_name'].nunique()) core = df[(df["special_type_name"] == "本科(普通)") & df["min_num"].notna()] print(f"\n主分析口径(本科普通类 + 最低分有效): {len(core)} 条")输出结果:
数据规模: 38757 行 × 39 列(含清洗生成的数值列) 年份: [2023, 2024, 2025] 高校数: 51 | 生源省份: 31 主分析口径(本科普通类 + 最低分有效): 24439 条口径说明:云南 2023-2024 为老高考(本科一批/二批,文/理),2025 年改为新高考(本科批 B 段,物理/历史类),跨体系分数不直接可比。艺术类、体育类分数量纲不同,主分析口径已排除。
三、探索性可视化分析(10 图)
图1:年度招生记录量(本科 / 专科)
# %% fig, ax = plt.subplots(figsize=(9, 5)) counts = df.groupby(["year", "special_type_name"]).size().unstack(fill_value=0) counts = counts.reindex(columns=sorted(counts.columns)) counts.plot(kind="bar", ax=ax, color=["#4C72B0", "#DD8452"]) ax.set_title("图1 2023-2025 招生记录量(本科 / 专科)") ax.set_xlabel("年份") ax.set_ylabel("记录条数") ax.legend(title="培养层次", loc="upper left") ax.tick_params(axis="x", rotation=0) plt.tight_layout() plt.show()解读:本科记录量(29,779 条)约为专科(8,978 条)的 3.3 倍;年度记录量逐年增长,反映云南高校招生规模持续扩大。
图2:院校办学属性构成(公办/民办、本科/专科)
# %% fig, axes = plt.subplots(1, 2, figsize=(11, 4.5)) for ax, col, title in zip(axes, ["school_nature", "school_level"], ["公办 / 民办", "本科 / 专科"]): val = df[col].value_counts() val.plot(kind="pie", ax=ax, autopct="%.1f%%", startangle=90, colors=["#55A868", "#C44E52", "#8172B2"]) ax.set_title(f"图2 {title}构成") ax.set_ylabel("") plt.tight_layout() plt.show()解读:公办院校记录占 69.3%,民办占 30.7%;本科层次占 76.8%。
图3:院校办学属性组合统计(Top6)
# %% fig, ax = plt.subplots(figsize=(9, 5)) attr = df["school_attr"].value_counts().head(6) sns.barplot(data=attr.reset_index(), y="school_attr", x="count", ax=ax, palette="Blues_d", hue="school_attr", legend=False) for i, v in enumerate(attr.values): ax.text(v + 200, i, f"{v:,}", va="center", fontsize=9) ax.set_title("图3 院校办学属性组合统计(Top6)") ax.set_xlabel("记录条数") ax.set_ylabel("办学属性组合") plt.tight_layout() plt.show()解读:农林类公办、综合类公办、理工类公办是云南高校的主体;民办院校以综合类/理工类为主。
图4:云南生源各批次最低分分布(箱线图)
# %% yn = df[df["local_province_name"] == "云南"].copy() yn["批次简名"] = yn["local_batch_name"].str.replace("本科", "").str.replace("批", "") fig, ax = plt.subplots(figsize=(11, 5.5)) sns.boxplot(data=yn[yn["min_num"].notna()], x="批次简名", y="min_num", ax=ax, palette="Blues", hue="批次简名", legend=False) ax.set_title("图4 云南生源各批次最低分分布(含艺术/体育分数量纲差异)") ax.set_xlabel("批次") ax.set_ylabel("最低分") ax.tick_params(axis="x", rotation=30) plt.tight_layout() plt.show()解读:本科一批(2023-24)分数最高(约 520-574),其次为专项批/免费定向批;艺术类(约 150-290)与体育类(约 60-215)量纲完全不同,后续主口径排除。
图5:云南生源平均最低分年度趋势(2023-2025)
# %% trend = core[(core["local_province_name"] == "云南") & core["local_type_name"].isin(["文科", "理科", "历史类", "物理类"])] \ .groupby(["year", "local_type_name"])["min_num"].mean().reset_index() fig, ax = plt.subplots(figsize=(9, 5)) sns.lineplot(data=trend, x="year", y="min_num", hue="local_type_name", marker="o", ax=ax) ax.set_xticks(sorted(trend["year"].unique())) ax.set_title("图5 云南生源平均最低分年度趋势(本科普通类·文理/物历)") ax.set_xlabel("年份") ax.set_ylabel("平均最低分") ax.legend(title="科类") plt.tight_layout() plt.show()解读:文科/理科(老高考)呈上升态势(2024 高于 2023);2025 年历史类/物理类为新高考首年口径,与老高考分数不可直接跨年比较。
图6:云南生源 vs 外省生源 平均最低分对比(双体系)
# %% old = core[core["local_type_name"].isin(["理科", "文科"]) & core["local_batch_name"].isin(["本科一批", "本科二批及预科"])] new = core[(core["year"] == 2025) & (core["local_type_name"].isin(["物理类", "历史类"]))] rows = [] for t in ["理科", "文科"]: s = old[old["local_type_name"] == t] rows.append(["老高考2023-24", t, "云南", s[s["local_province_name"] == "云南"]["min_num"].mean()]) rows.append(["老高考2023-24", t, "外省", s[s["local_province_name"] != "云南"]["min_num"].mean()]) for t in ["物理类", "历史类"]: s = new[new["local_type_name"] == t] rows.append(["新高考2025", t, "云南", s[s["local_province_name"] == "云南"]["min_num"].mean()]) rows.append(["新高考2025", t, "外省", s[s["local_province_name"] != "云南"]["min_num"].mean()]) cmp = pd.DataFrame(rows, columns=["体系", "科类", "生源", "平均最低分"]) fig, ax = plt.subplots(figsize=(10, 5.5)) sns.barplot(data=cmp, x="科类", y="平均最低分", hue="生源", ax=ax, palette=["#55A868", "#C44E52"]) for i, row in enumerate(cmp.itertuples()): ax.text(i % 2 + (-0.1 if row.生源 == "云南" else 0.1), row.平均最低分 + 2, f"{row.平均最低分:.0f}", ha="center", fontsize=9) ax.set_title("图6 云南生源 vs 外省生源 平均最低分对比(分体系可比口径)") ax.set_ylabel("平均最低分(分)") ax.legend(title="生源") plt.tight_layout() plt.show()解读:老高考体系(2023-24)外省生源录取线显著更高(理科 +55 分、文科 +37 分);2025 新高考下物理类基本持平(515.1 vs 515.9),历史类云南反超约 22 分。
图7:2025 云南本科批B段 物理类 Top15 专业
# %% top = core[(core["year"] == 2025) & (core["local_province_name"] == "云南") & (core["local_batch_name"] == "本科批B段") & (core["local_type_name"] == "物理类")] pt = top.groupby("sp_name")["min_num"].agg(["count", "mean"]).query("count >= 1") \ .sort_values("mean", ascending=False).head(15) fig, ax = plt.subplots(figsize=(10, 7)) sns.barplot(data=pt.reset_index(), y="sp_name", x="mean", ax=ax, palette="YlOrRd_r", hue="sp_name", legend=False) for i, v in enumerate(pt["mean"]): ax.text(v + 1, i, f"{v:.1f}", va="center", fontsize=9) ax.set_title("图7 2025 云南本科批B段 物理类录取平均最低分 Top15 专业") ax.set_xlabel("平均最低分(分)") ax.set_ylabel("专业") plt.tight_layout() plt.show()解读:大气科学(+人工智能双学位)603 分居首,金融学/经济学双学位专业紧随其后——复合型双学位专业录取线最高。
图8:云南生源录取平均最低分 Top15 院校
# %% sch = core[core["local_province_name"] == "云南"].groupby("school_name")["min_num"] \ .agg(["count", "mean"]).query("count >= 5").sort_values("mean", ascending=False).head(15) fig, ax = plt.subplots(figsize=(10, 7)) sns.barplot(data=sch.reset_index(), y="school_name", x="mean", ax=ax, palette="GnBu_d", hue="school_name", legend=False) for i, v in enumerate(sch["mean"]): ax.text(v + 1, i, f"{v:.1f}", va="center", fontsize=9) ax.set_title("图8 云南生源录取平均最低分 Top15 院校(记录数≥5)") ax.set_xlabel("平均最低分(分)") ax.set_ylabel("院校") plt.tight_layout() plt.show()解读:云南大学 578.4 分领跑全省,昆明理工(541.0)、云南师大(538.3)、云南财大(522.5)位列其后,头部院校梯度明显。
图9:云南生源录取位次分布
# %% sec = df[(df["local_province_name"] == "云南") & df["min_section_num"].notna()] fig, ax = plt.subplots(figsize=(9, 5)) sns.histplot(sec["min_section_num"], bins=40, kde=True, color="#4C72B0", ax=ax) ax.axvline(sec["min_section_num"].median(), color="#C44E52", ls="--", lw=1.5, label=f"中位位次 {sec['min_section_num'].median():,.0f}") ax.legend() ax.set_title("图9 云南生源录取位次分布(全省排名,n=%d)" % len(sec)) ax.set_xlabel("位次(越小越靠前)") ax.set_ylabel("频数") plt.tight_layout() plt.show()解读:云南生源位次均值 85,502、中位 84,216;最优位次为云南大学汉语言文学 2023 文科全省第 1,484 名——高分考生集中投向头部院校。
图10:生源省份 Top10
# %% prov = df["local_province_name"].value_counts().head(10) fig, ax = plt.subplots(figsize=(9, 5)) sns.barplot(data=prov.reset_index(), y="local_province_name", x="count", ax=ax, palette="Purples_r", hue="local_province_name", legend=False) for i, v in enumerate(prov.values): ax.text(v + 300, i, f"{v:,}", va="center", fontsize=9) ax.set_title("图10 生源省份 Top10(全部记录)") ax.set_xlabel("记录条数") ax.set_ylabel("省份") plt.tight_layout() plt.show()解读:云南本省生源占比约 26.9% 居首,其次为四川、河北、贵州等邻近/人口大省,生源结构呈“省内为主、周边辐射”格局。
四、结论
- 规模结构:38,757 条记录覆盖 51 所高校、31 个生源省;公办 69.3%、本科 76.8%,记录量逐年增长。
- 区域对比:老高考体系下外省生源录取线显著更高(理 +55 / 文 +37 分);新高考 2025 物理类基本持平、历史类云南反超约 22 分。
- 专业热度:大气科学/金融学/经济学等双学位复合专业为 2025 物理类录取分最高,反映就业导向的专业溢价。
- 院校梯度:云南大学为录取分最高的头部院校,昆明理工/云师大构成第二梯队。
- 位次分布:录取位次右偏分布,头部 25% 考生位次优于 38,758 名;最优为云大中文系 1,484 名。
- 数据局限:跨体系分数不可直接比(2025 云南首年新高考);艺术/体育量纲独立;city_name、min_section_note 全空;average 大量缺失——分析全程标注口径,未做任何臆测填充。
全部统计均由本数据集实测计算,代码可复现。