前言
軟科中國大學排名以專業、客觀、透明的優勢贏得了高等教育領域和社會的廣泛關注和認可,本次將利用Python對我國大學排名和分布情況進行一番研究。
import requests import parsel import csv f = open('排名.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.DictWriter(f, fieldnames=['名次', '學校名稱', '綜合得分', '星級排名', '辦學層次']) url = 'http://m.gaosan.com/gaokao/265440.html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' } response = requests.get(url=url, headers=headers) response.encoding = response.apparent_encoding selector = parsel.Selector(response.text) trs = selector.css('#page tr') for tr in trs: dit = {} ranking = tr.css('td:nth-child(1)::text').get() dit['名次'] = ranking school = tr.css('td:nth-child(2)::text').get() dit['學校名稱'] = school score = tr.css('td:nth-child(3)::text').get() dit['綜合得分'] = score star = tr.css('td:nth-child(4)::text').get() dit['星級排名'] = star level = tr.css('td:nth-child(5)::text').get() dit['辦學層次'] = level csv_writer.writerow(dit) print(dit) f.close()
- Pandas — 數據處理
- Pyecharts — 數據可視化
from pyecharts.charts import Map,Bar,Pie from pyecharts import options as opts import pandas as pd
df = pd.read_csv('中國大學綜合排名.csv',index_col=0) df.head()
df.dtypes
# 各省份大學數量 df_counts = df.groupby('省市').count()['排名'] df0 = df_counts.copy() # 進行降序排列 並在當前df0上進行修改 df0.sort_values(ascending=False, inplace=True) df0
# 統計每個省份大學的數量以及平均分 # 算出平均分 df_means0 = df.groupby('省市').mean()['總分'] # 取兩位小數 df_means = df_means0.round(2) # 合並上面的大學數量跟平均分 df1 = pd.concat([df_counts, df_means], axis=1) # 改變列名 df1.columns = ['數量', '平均分'] # 通過 平均分 進行降序排列 並在當前df1上進行修改 df1.sort_values(by=['平均分'], ascending=False, inplace=True) df1
d1 = df1.index.tolist() d2 = df1['數量'].values.tolist() d3 = df1['平均分'].values.tolist() bar0 = ( Bar() .add_xaxis(d1) .add_yaxis('數量', d2) .add_yaxis('平均分數', d3) .set_global_opts( title_opts=opts.TitleOpts(title='中國大學排名'), yaxis_opts=opts.AxisOpts(name='量'), xaxis_opts=opts.AxisOpts(name='省份'), ) ) bar0.render_notebook()
df1.sort_values(by=['平均分'], inplace=True) d1 = df1.index.tolist() d2 = df1['數量'].values.tolist() d3 = df1['平均分'].values.tolist() bar1 = ( Bar() .add_xaxis(d1) .add_yaxis('數量', d2) .add_yaxis('平均分數', d3) # 坐標軸翻轉 .reversal_axis() # 數值顯示靠右 .set_series_opts(label_opts=opts.LabelOpts(position='right')) .set_global_opts( title_opts=opts.TitleOpts(title='中國大學排名'), yaxis_opts=opts.AxisOpts(name='省份'), xaxis_opts=opts.AxisOpts(name='量'), ) ) bar1.render_notebook()
弗羅倫斯·南丁格爾(Florence Nightingale),一位著名的英國護士,同時她也是一位統計學家,很多人沒有想到吧?
她被號稱為數據可視化的鼻祖,就是數據可視化的祖師爺,你可能也沒有想到吧?
她是英國皇家統計學會的第一個女成員,也是美國統計協會的名譽會員。
克里米亞戰爭時期,南丁格爾發現大多數士兵不是陣亡,而是因為飢餓、營養不良、衛生條件差和野戰醫院的條件差才死於其戰傷。
於是她向上級報告了克里米亞戰爭的醫療條件,同時申請一批醫療物質來改變醫療條件。由於國會議員不會閱讀統計報告,所以她的申請一直得不到批准。於是她改用了極座標餅圖的形式來展示戰地醫院的病人死亡率在不同季節的變化,重新提交這個申請報告,沒想到馬上就得到了批准。這是這批物質改善了戰地醫院的衛生條件,僅此一項改革就大大地提高了受傷戰士的生存率。
后被這個圖就被稱為南丁格爾玫瑰圖,南丁格爾也被尊稱為數據可視化鼻祖
name = df_counts.index.tolist() count = df_counts.values.tolist() c0 = ( Pie() .add( '', [list(z) for z in zip(name, count)], # 餅圖的半徑,數組的第一項是內半徑,第二項是外半徑 # 默認設置成百分比,相對於容器高寬中較小的一項的一半 radius=['20%', '60%'], # 讓圖在這個位置顯示 center=['50%', '65%'], # 是否展示成南丁格爾圖,通過半徑區分數據大小,有'radius'和'area'兩種模式。 # radius:扇區圓心角展現數據的百分比,半徑展現數據的大小 # area:所有扇區圓心角相同,僅通過半徑展現數據大小 rosetype="radius", # 顯示標簽 label_opts=opts.LabelOpts(is_show=False), ) .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {c}')) ) c0.render_notebook()
provinces = df0.index.tolist() num = df0.values.tolist() c1 = ( Pie() .add('', [list(z) for z in zip(provinces, num)], radius=['30%', '105%'], rosetype='area' ) .set_global_opts( title_opts=opts.TitleOpts(title='中國大學排名'), legend_opts=opts.LegendOpts(is_show=False), toolbox_opts=opts.ToolboxOpts() ) .set_series_opts( label_opts=opts.LabelOpts( # 是否顯示標簽 is_show=True, # 設置標簽位置 position="inside", font_size=12, formatter='{b}: {c}', # 斜體 font_style='italic', # 加粗 font_weight='bold', # 微軟的雅黑字體 font_family='Microsoft YaHei' ) ) ) c1.render_notebook()
大學數量較多的省市:江蘇、山東、河南、河北、北京、遼寧 、陝西、四川 、廣東 、湖南 、湖北、浙江等地(只看學校數量),后期探索可根據學校排名
排名前20的大學較前一年的波動較小(這也符合常理,畢竟前幾的學校都是多年沉淀下來的)
西部地區大學數量較少
本數據集不包含港、澳、台大學(網站未統計)