计算机毕设 基于大数据的高考数据分析 - python 大数据 可视化

# 1 前言

🚩 基于大数据的高考数据分析

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

1 课题背景

本期我们通过分析2017-2019年山东省高考考生考试成绩分布数据以及双一流大学(985/211)录取山东省考生数据,通过数据可视化分析山东省考生高考成绩主要集中在哪些区间、本科上线率有多少、双一流大学录取最低分各是多少、考生报考比较多的专业有哪些。

2 具体实现

所有考生及各学科总分分布图

#部分代码
colors = ["#00BCD4","#ea1d5d", "#ffb900", "#4FC3F7"]
L1 = (
    Line()
    .add_xaxis(df['分数段'])
    .add_yaxis("所有考生本段人数",df['所有考生本段人数'],symbol_size=0.5,)
    .set_series_opts(
        areastyle_opts=opts.AreaStyleOpts(opacity=1, color=colors[0]),
        label_opts=opts.LabelOpts(is_show=False),
        markarea_opts=opts.MarkAreaOpts(
            data=[
                opts.MarkAreaItem(
                    name="本科线", x=(435, 437),y=(0,2000),
                    label_opts=opts.LabelOpts(color=colors[1]),
                    itemstyle_opts=opts.ItemStyleOpts(color=colors[1])
                )
            ]
        )
    )

在这里插入图片描述
在这里插入图片描述
本科上线人数占比

# 指定柱子颜色的js代码
color_function = """
        function (params) {
            if (params.value == 51.22) 
                return '#0097A7';
            else return '#E91E63';
        }
        """

cols = ['所有考生', '选考物理', '选考化学', '选考生物', '选考历史', '选考地理', '选考政治']
rate_data = []
for i in cols:
    rate_data.append(round(df.loc[df['分数段']>435][i+'累计人数'].tolist()[-1]/df[i+'累计人数'].tolist()[-1]*100,2))
df_rate_data = pd.DataFrame([rate_data],columns=cols)
df_rate_data = df_rate_data.T.sort_values(0,ascending=False)
b1 = (
     Bar()
     .add_xaxis(df_rate_data.index.tolist()[::-1])
     .add_yaxis('', df_rate_data[0].values.tolist()[::-1], category_gap='40%')
     .set_series_opts(
         label_opts=opts.LabelOpts(
            position='insideRight',
            vertical_align='middle',
            font_size=14,
            font_weight='bold',                                                
            formatter='{c} %'),
            itemstyle_opts={
                'opacity': 0.9,
                'shadowBlur': 10,
                'shadowOffsetX': 10,
                'shadowOffsetY': 10,
                'shadowColor': 'rgba(125,0, 255, 0.5)',
                'barBorderRadius': [30, 15, 30, 15],
                'color':JsCode(color_function)
            }
      )
      .set_global_opts(
           xaxis_opts=opts.AxisOpts(
               position='top', 
                axislabel_opts=opts.LabelOpts(font_size=16, color=colors[3]),
                axisline_opts=opts.AxisLineOpts(
                     is_show=False,linestyle_opts=opts.LineStyleOpts(width=2, color=colors[3]))
                ),
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(font_size=16, color=colors[3]),
                axisline_opts=opts.AxisLineOpts(
                    is_show=False,
                    linestyle_opts=opts.LineStyleOpts(width=2, color=colors[3])
                ),),          

          title_opts=opts.TitleOpts(title="本科上线人数占比", pos_top="3%", pos_right="center",
                                 title_textstyle_opts=opts.TextStyleOpts(color=colors[2], font_size=20),),         
      )
      .reversal_axis()
     )
grid1 = Grid(init_opts=opts.InitOpts(width='1000px', height='600px',bg_color='#0d0735'))
grid1.add(b1, is_control_axis_index=False, grid_opts=opts.GridOpts(pos_left='15%', pos_right='15%', pos_top='17%'))
grid1.render_notebook()

在这里插入图片描述
各学生考生比例

color_series = ['#C9DA36','#37B44E','#1E91CA','#6A368B','#D5225B','#CF7B25']
df1=df.iloc[-1,[i%2==0 and i!=0 for i in range(len(df.columns))]]
subj_data = [round(i/df1.values.tolist()[-1]*100,2) for i in df1.values.tolist()][:-1]
subj_name = ['物理','化学','生物','历史','地理','政治']
df_subj = pd.DataFrame(subj_data,index=subj_name,columns=['比例'])
df_subj.sort_values('比例',ascending=False,inplace=True)
P = (
    Pie(init_opts=opts.InitOpts(width='1000px', height='600px',bg_color='#0d0735'))
    .add(
        "",
        [list(z) for z in zip(df_subj.index, df_subj['比例'])],
        radius=["25%", "70%"],
        center=["50%", "50%"],
        rosetype="radius",
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_colors(color_series)
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}%",font_size=16))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各学科\n考生比例", pos_top="45%", pos_right="center",
                                 title_textstyle_opts=opts.TextStyleOpts(color=colors[2], font_size=28),),   
        legend_opts=opts.LegendOpts(is_show=False),
    )
)
P.render_notebook()

在这里插入图片描述
985/211大学(理工类)录取最低分数

#双一流高校的名单
double_first_list = ['北京大学','中国人民大学','清华大学','北京航空航天大学','北京理工大学','中国农业大学',
                     '北京师范大学','中央民族大学','南开大学','天津大学','大连理工大学','吉林大学','哈尔滨工业大学',
                     '复旦大学','同济大学','上海交通大学','华东师范大学','南京大学','东南大学','浙江大学',
                     '中国科学技术大学','厦门大学','山东大学','中国海洋大学','武汉大学','华中科技大学','中南大学'
                     ,'中山大学','华南理工大学','四川大学','重庆大学','电子科技大学','西安交通大学','西北工业大学','兰州大学'
                     ,'国防科技大学','东北大学','郑州大学','湖南大学','云南大学','西北农林科技大学','新疆大学']

data_dir = '/home/mw/input/2206085359/'
all_files = []
for dirpath, dirnames, files in os.walk(data_dir):
    all_files += files
all_files = [file for file in all_files if '2020' not in file]

#历年的数据
df_merge_year = pd.DataFrame()
for file in all_files:
    df_tmp = pd.read_excel(os.path.join(data_dir, file),header=2)
    df_tmp = df_tmp[df_tmp['院校名称'].isin(double_first_list)]
    df_year = df_tmp.groupby(['院校名称'])['录取最低分'].min().reset_index()
    df_year = pd.merge(df_year, df_tmp, on =['院校名称','录取最低分'], how = 'inner')
    df_year = df_year[['院校名称','录取最低分', '专业名称','最低位次','平均分']]
    df_year['年份'] = re.findall('\d+',file)[0]
    df_year['类别'] = re.findall('((.*))',file)[0]
    df_year['标签'] = df_year['年份'] + df_year['类别']
    df_merge_year = pd.concat([df_year, df_merge_year])

df_merge_year = df_merge_year.replace('前20名内',20)
sci_2019 = df_merge_year.loc[df_merge_year['标签'] == '2019理工类',['院校名称', '录取最低分','年份','最低位次']]
sci_2018 = df_merge_year.loc[df_merge_year['标签'] == '2018理工类',['院校名称', '录取最低分','年份','最低位次']]
sci_2017 = df_merge_year.loc[df_merge_year['标签'] == '2017理工类',['院校名称', '录取最低分','年份','最低位次']]
sci_2019 = sci_2019.sort_values('录取最低分')

df_score_pos = pd.merge(sci_2019,sci_2018,on = '院校名称')
df_score_pos = pd.merge(df_score_pos,sci_2017,on = '院校名称')
df_score_pos.columns = ['院校名称', '2019年录取最低分','2019年','2019年最低位次',
                         '2018年录取最低分','2018年','2018年最低位次',
                         '2017年录取最低分','2017年','2017年最低位次']
df_score_pos = df_score_pos.astype({'2019年最低位次':'int', '2018年最低位次':'int', '2017年最低位次':'int'})

index_list = df_score_pos[['院校名称','2017年录取最低分']].drop_duplicates()['院校名称'].tolist()
data1_2017 = df_score_pos[['院校名称','2017年录取最低分']].drop_duplicates()['2017年录取最低分']
data1_2018 = df_score_pos[['院校名称','2018年录取最低分']].drop_duplicates()['2018年录取最低分']
data1_2019 = df_score_pos[['院校名称','2019年录取最低分']].drop_duplicates()['2019年录取最低分']

df_score = pd.DataFrame([index_list, data1_2017.values.tolist(), data1_2018.values.tolist(), data1_2019.values.tolist()]).T
df_score.columns=['院校名称', '2017年最低分', '2018年最低分', '2019年最低分']
df_score['最低平均分'] = (df_score['2017年最低分']+df_score['2018年最低分']+df_score['2019年最低分'])/3
df_score['最低平均分'] = df_score['最低平均分'].astype('float').round(2)

x_data = df_score['院校名称'].values.tolist()
y_score_2017 = df_score['2017年最低分'].values.tolist()
y_score_2018 = df_score['2018年最低分'].values.tolist()
y_score_2019 = df_score['2019年最低分'].values.tolist()
y_score_mean = df_score['最低平均分'].values.tolist()

在这里插入图片描述

985/211大学(理工类)录取最低位次

line2 = (
    Line()
    .add_xaxis(y_pos_mean)
    .add_yaxis(
        series_name = '平均最低位次', 
        y_axis = x_data,
        symbol ="diamond",
        symbol_size=14,
        z=10,
        linestyle_opts=opts.LineStyleOpts(color="#FFEB3B", width=3),
        itemstyle_opts=opts.ItemStyleOpts(border_width=2, border_color="#C62828", color="#FFEB3B"),
        label_opts=opts.LabelOpts(color='#FFEB3B',position='right'),      
    )
)

bar2 = (
    Bar()
    .add_xaxis(x_data)
    .add_yaxis("2017年", y_pos_2017, color='#EC407A')
    .add_yaxis("2018年", y_pos_2018, color='#26A69A')
    .add_yaxis("2019年", y_pos_2019, color='#3F51B5')
    .set_series_opts(
         label_opts=opts.LabelOpts(
            position='inside',
            vertical_align='middle',
         ),
        itemstyle_opts={
            'opacity': 0.9,
            'shadowBlur': 5,
            'shadowOffsetX': 5,
            'shadowOffsetY': 5,
            'shadowColor': 'rgba(125,0, 125, 0.5)',
            'barBorderRadius': [0, 15, 15, 0],
        }
      )
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=True, trigger='axis', axis_pointer_type='cross'),        
        datazoom_opts=opts.DataZoomOpts(orient="vertical",range_start=80,range_end=100),
        title_opts=opts.TitleOpts(
            title='985/211大学(理工类)录取最低位次',
            subtitle='<制图@公众号:Python当打之年>',
            pos_left='center',
            pos_top='1%',
            title_textstyle_opts=opts.TextStyleOpts(color='#ffb900', font_size=18),
            subtitle_textstyle_opts=opts.TextStyleOpts(color='#009bbb', font_size=12),
        ),
        legend_opts=opts.LegendOpts(pos_left="center", pos_top='7%'),
        xaxis_opts=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(font_size=14, color='#c2ff00'),
            axisline_opts=opts.AxisLineOpts(
                is_show=False,
                linestyle_opts=opts.LineStyleOpts(width=2, color='#DB7093'))),
        yaxis_opts=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(font_size=14, color='#c2ff00'),
            axisline_opts=opts.AxisLineOpts(
                is_show=False,
                linestyle_opts=opts.LineStyleOpts(width=2, color='#DB7093')
            ),
        )

    )
    .reversal_axis()    
)

bar2.overlap(line2)
grid = Grid(init_opts=opts.InitOpts(width='1000px', height='1200px',bg_color='#0d0735'))
grid.add(bar2, opts.GridOpts(pos_top="10%",pos_left="15%", pos_right="15%"), is_control_axis_index=True)
grid.render_notebook()

在这里插入图片描述

985/211大学(文史类)录取最低分数

line1 = (
    Line()
    .add_xaxis(y_score_mean)
    .add_yaxis(
        series_name = '最低平均分', 
        y_axis = x_data,
        symbol ="diamond",
        symbol_size=14,
        z=10,
        linestyle_opts=opts.LineStyleOpts(color="#FFEB3B", width=3),
        itemstyle_opts=opts.ItemStyleOpts(border_width=2, border_color="#C62828", color="#FFEB3B"),
        label_opts=opts.LabelOpts(color='#FFEB3B',position='right'),      
    )
)

bar1 = (
    Bar()
    .add_xaxis(x_data)
    .add_yaxis("2017年", y_score_2017, color='#EC407A')
    .add_yaxis("2018年", y_score_2018, color='#26A69A')
    .add_yaxis("2019年", y_score_2019, color='#3F51B5')
    .set_series_opts(
         label_opts=opts.LabelOpts(
            position='inside',
            vertical_align='middle',
         ),
        itemstyle_opts={
            'opacity': 0.9,
            'shadowBlur': 5,
            'shadowOffsetX': 5,
            'shadowOffsetY': 5,
            'shadowColor': 'rgba(125,0, 125, 0.5)',
            'barBorderRadius': [0, 15, 15, 0],
        }
      )
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=True, trigger='axis', axis_pointer_type='cross'),        
        datazoom_opts=opts.DataZoomOpts(orient="vertical",range_start=70,range_end=100),
        title_opts=opts.TitleOpts(
            title='985/211大学(文史类)录取最低分数',
            subtitle='<制图@公众号:Python当打之年>',
            pos_left='center',
            pos_top='1%',
            title_textstyle_opts=opts.TextStyleOpts(color='#ffb900', font_size=18),
        ),
        legend_opts=opts.LegendOpts(pos_left="center", pos_top='7%'),
        xaxis_opts=opts.AxisOpts(
            min_=400,
            axislabel_opts=opts.LabelOpts(font_size=14, color='#c2ff00'),
            axisline_opts=opts.AxisLineOpts(
                is_show=False,
                linestyle_opts=opts.LineStyleOpts(width=2, color='#DB7093'))),
        yaxis_opts=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(font_size=14, color='#c2ff00'),
            axisline_opts=opts.AxisLineOpts(
                is_show=False,
                linestyle_opts=opts.LineStyleOpts(width=2, color='#DB7093')
            ),
        )
    )
    .reversal_axis()    
)

bar1.overlap(line1)
grid = Grid(init_opts=opts.InitOpts(width='1000px', height='1200px',bg_color='#0d0735'))
grid.add(bar1, opts.GridOpts(pos_top="10%",pos_left="15%", pos_right="15%"), is_control_axis_index=True)
grid.render_notebook()

在这里插入图片描述

985/211大学(文史类)录取最低位次
在这里插入图片描述

  • 985/211大学(文史类)录取平均最低位次最高的前三甲学校:清华大学(20),北京大学(29),复旦大学(91)
  • 中华人民大学(118),上海交通大学(144),浙江大学(172)紧随其后评论

985/211大学录取数量前15的理工类专业
在这里插入图片描述

985/211大学录取数量前15的文史类专业
在这里插入图片描述

实现原理

涉及到的库

Pandas — 数据处理

行数据填充,重置列索引,去除前2行

import re
import os
import pandas as pd

df.loc[0] = df.loc[0].fillna(method = 'ffill')
df.iloc[:,0] = df.iloc[:,0].fillna('')
df.columns = df.loc[0] + df.loc[1]
df = df[2:]
df.head(20)

Pyecharts — 数据可视化

简介

Echarts是由百度研发,可以生成直观、生动、可交互、可高度个性化定制的Web数据可视化图表的可视化库。具有着开源、丰富的可视化类型、深度交互式探索、动态数据、绚丽特效等优点。2018年全球著名开源社区Apache基金会宣布Echarts项目全票通过进入Apache孵化器。

特性

  • 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
  • 囊括了 30+ 种常见图表,应有尽有
  • 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
  • 可轻松集成至 Flask,Django 等主流 Web 框架
  • 高度灵活的配置项,可轻松搭配出精美的图表
  • 详细的文档和示例,帮助开发者更快的上手项目
  • 多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持

最后

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值