HENAU 2021届新生大数据分析

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HENAU 2021届新生大数据分析相关的知识,希望对你有一定的参考价值。

导入科学计算库

# 导入科学计算库
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
import os
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ['SimHei']
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 忽略警告
import warnings
warnings.filterwarnings('ignore')
# 设置显示风格
plt.style.use('fivethirtyeight')

读取新生数据

# 读取新生数据
data = pd.read_excel('./data/2021级新生信息-信管学院.xlsx')
data.head()
河南农业大学在校学生名册Unnamed: 1Unnamed: 2Unnamed: 3Unnamed: 4Unnamed: 5Unnamed: 6Unnamed: 7Unnamed: 8Unnamed: 9Unnamed: 10
02021-2022学年第一学期NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1年级:2021NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2院(系)/部:信息与管理科学学院NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3专业:信息与计算科学NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4班级:信计21-1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
data.tail()
河南农业大学在校学生名册Unnamed: 1Unnamed: 2Unnamed: 3Unnamed: 4Unnamed: 5Unnamed: 6Unnamed: 7Unnamed: 8Unnamed: 9Unnamed: 10
7272110122121NaN2001-12-23汉族河南省河南省郑州市新郑市新港办事处隆港社区2单元1号楼10楼3号451164共青团员NaN本科
7282110122122NaN2004-02-20汉族河南省河南省新乡市长垣县恼里镇西沙窝村85号453400共青团员NaN本科
7292110122123NaN2003-08-04汉族河南省河南省商丘市柘城县邵元乡周元村476200共青团员NaN本科
7302110122124NaN2004-02-01汉族河南省河南省信阳市光山县斛山乡卢湾村朱小湾465450共青团员NaN本科
7312110122125NaN2004-07-15回族河南省河南省商丘市民权县曙光路292号476800群众NaN本科
data.tail()
河南农业大学在校学生名册Unnamed: 1Unnamed: 2Unnamed: 3Unnamed: 4Unnamed: 5Unnamed: 6Unnamed: 7Unnamed: 8Unnamed: 9Unnamed: 10
7272110122121NaN2001-12-23汉族河南省河南省郑州市新郑市新港办事处隆港社区2单元1号楼10楼3号451164共青团员NaN本科
7282110122122NaN2004-02-20汉族河南省河南省新乡市长垣县恼里镇西沙窝村85号453400共青团员NaN本科
7292110122123NaN2003-08-04汉族河南省河南省商丘市柘城县邵元乡周元村476200共青团员NaN本科
7302110122124NaN2004-02-01汉族河南省河南省信阳市光山县斛山乡卢湾村朱小湾465450共青团员NaN本科
7312110122125NaN2004-07-15回族河南省河南省商丘市民权县曙光路292号476800群众NaN本科

数据预处理

读完数据发现不对劲儿了!!!

# 获取列名
data.columns
Index(['河南农业大学在校学生名册', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4',
       'Unnamed: 5', 'Unnamed: 6', 'Unnamed: 7', 'Unnamed: 8', 'Unnamed: 9',
       'Unnamed: 10'],
      dtype='object')
# 修改列名
data.columns = ['学号','姓名','性别','出生日期','民族','生源省份','通讯地址','邮政编码','政治面貌','籍贯','培养层次']
data.head()  # 这种为多余读取出的表头
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
02021-2022学年第一学期NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1年级:2021NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2院(系)/部:信息与管理科学学院NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3专业:信息与计算科学NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4班级:信计21-1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
data.tail()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
7272110122121NaN2001-12-23汉族河南省河南省郑州市新郑市新港办事处隆港社区2单元1号楼10楼3号451164共青团员NaN本科
7282110122122NaN2004-02-20汉族河南省河南省新乡市长垣县恼里镇西沙窝村85号453400共青团员NaN本科
7292110122123NaN2003-08-04汉族河南省河南省商丘市柘城县邵元乡周元村476200共青团员NaN本科
7302110122124NaN2004-02-01汉族河南省河南省信阳市光山县斛山乡卢湾村朱小湾465450共青团员NaN本科
7312110122125NaN2004-07-15回族河南省河南省商丘市民权县曙光路292号476800群众NaN本科
# 删除多余的表头
del_rows = data.dropna(axis='rows')  # 多余行删除
del_rows.head()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
6学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
42学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
78学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
114学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
150学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
del_rows.index  # 这些行不要罢了
Int64Index([  6,  42,  78, 114, 150, 186, 222, 258, 294, 330, 366, 402, 439,
            476, 513, 551, 588, 626, 663, 700],
           dtype='int64')
data = data.drop(del_rows.index, axis=0)  # 按照行索引删除
data.head()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
02021-2022学年第一学期NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1年级:2021NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2院(系)/部:信息与管理科学学院NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3专业:信息与计算科学NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4班级:信计21-1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
# 接着删除上面这些多余的,但是需要填充姓名与籍贯的NAN,不然全部行都删除了
data['姓名'] = 'BoyOrGirl'
data['籍贯'] = 'Sorry&Secret'
data.head()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
02021-2022学年第一学期BoyOrGirlNaNNaNNaNNaNNaNNaNNaNSorry&SecretNaN
1年级:2021BoyOrGirlNaNNaNNaNNaNNaNNaNNaNSorry&SecretNaN
2院(系)/部:信息与管理科学学院BoyOrGirlNaNNaNNaNNaNNaNNaNNaNSorry&SecretNaN
3专业:信息与计算科学BoyOrGirlNaNNaNNaNNaNNaNNaNNaNSorry&SecretNaN
4班级:信计21-1BoyOrGirlNaNNaNNaNNaNNaNNaNNaNSorry&SecretNaN
data = data.dropna(axis='rows')
data.head()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
72110104001BoyOrGirl2003-10-05汉族河南省河南省周口市淮阳县北关淮中新村466700共青团员Sorry&Secret本科
82110104002BoyOrGirl2003-09-17汉族河南省河南省信阳市商城县金刚台大道东段农业农村局502室465350共青团员Sorry&Secret本科
92110104003BoyOrGirl2003-08-04汉族河南省河南省南阳市宛城区官庄镇官庄街473131共青团员Sorry&Secret本科
102110104004BoyOrGirl2003-04-13汉族河南省河南省平顶山市宝丰县闹店镇连店村467400共青团员Sorry&Secret本科
112110104005BoyOrGirl2003-05-29汉族河南省河南省商丘市虞城县城关镇立业家园小区4号楼一单元二楼476300群众Sorry&Secret本科
# 重置索引,从0开始
data.reset_index(drop=True, inplace=True)
data.head()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
02110104001BoyOrGirl2003-10-05汉族河南省河南省周口市淮阳县北关淮中新村466700共青团员Sorry&Secret本科
12110104002BoyOrGirl2003-09-17汉族河南省河南省信阳市商城县金刚台大道东段农业农村局502室465350共青团员Sorry&Secret本科
22110104003BoyOrGirl2003-08-04汉族河南省河南省南阳市宛城区官庄镇官庄街473131共青团员Sorry&Secret本科
32110104004BoyOrGirl2003-04-13汉族河南省河南省平顶山市宝丰县闹店镇连店村467400共青团员Sorry&Secret本科
42110104005BoyOrGirl2003-05-29汉族河南省河南省商丘市虞城县城关镇立业家园小区4号楼一单元二楼476300群众Sorry&Secret本科

数据分析

男女比例

count = data.groupby(['性别'])['姓名'].count()  # 分组聚合二者不可分
count.head()
性别
女    200
男    411
Name: 姓名, dtype: int64
count.values
array([200, 411], dtype=int64)
count.plot(kind='barh', figsize=(20, 8), color=['c', 'b']) 
plt.xlabel('人数', fontsize=15)
plt.ylabel('性别', fontsize=15)
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
for y, x in enumerate(count.values):  # 显示对应数据
    plt.text(x+5, y-0.05, "%s" %x, fontsize=18)
    
plt.title('boy&girl分布柱状图', fontsize=16)
plt.show()

count.values[0]
200
# 获取男女人数
man=count.values[1]
woman=count.values[0]
# 计算比例
man_perc=man/(woman+man)
woman_perc=woman/(woman+man)

#添加名称
labels=['男','女']
#添加颜色
colors=['blue','red']

# 设置画布大小
plt.figure(figsize=(15, 8))
# labels 名称 colors:颜色,explode=分裂  autopct显示百分比
paches,texts,autotexts=plt.pie([man_perc,woman_perc],labels=labels,colors=colors,explode=(0,0.05),autopct='%0.1f%%')
#设置饼状图中的字体颜色
for text in autotexts:
    text.set_color('white')
    
#设置字体大小
for text in texts+autotexts:
    text.set_fontsize(20)
    
plt.show()

绘制环形图

count
性别
女    200
男    411
Name: 姓名, dtype: int64
count.values
array([200, 411], dtype=int64)
# 设置画布大小
plt.figure(figsize=(10, 5))

labels = count.index
values = count.values
# Give color names
# 画饼图,label设置标签名,colors代表颜色
# 自定义颜色,如果颜色长度和数据长度不一致,则会循环使用颜色,即'red','green','red','green'
# 要把离心率设置远一点,怕第二个饼图挡住这个百分率
plt.pie(values, labels=labels, colors=['skyblue','blue'], wedgeprops=dict(width=0.3, edgecolor='w'), autopct='%.1f%%', pctdistance=0.8) 
 
# 设置等比例轴,x和y轴等比例
plt.axis('equal') 
plt.show()

参考:https://blog.csdn.net/LuohenYJ/article/details/108348697

data.head()
学号姓名性别出生日期民族生源省份通讯地址邮政编码政治面貌籍贯培养层次
02110104001BoyOrGirl2003-10-05汉族河南省河南省周口市淮阳县北关淮中新村466700共青团员Sorry&Secret本科
12110104002BoyOrGirl2003-09-17汉族河南省河南省信阳市商城县金刚台大道东段农业农村局502室465350共青团员Sorry&Secret本科
22110104003BoyOrGirl2003-08-04汉族河南省河南省南阳市宛城区官庄镇官庄街473131共青团员Sorry&Secret本科
32110104004BoyOrGirl2003-04-13汉族河南省河南省平顶山市宝丰县闹店镇连店村467400共青团员Sorry&Secret本科
42110104005BoyOrGirl2003-05-29汉族河南省河南省商丘市虞城县城关镇立业家园小区4号楼一单元二楼476300群众Sorry&Secret本科

民族分布

nation_data = data.groupby('民族')['民族'].count()
nation_data
民族
回族       7
布依族      1
朝鲜族      1
汉族     598
苗族       1
蒙古族      3
Name: 民族, dtype: int64
nation_data.values
array([  7,   1,   1, 598,   1,   3], dtype=int64)

绘制柱状图

nation_data.plot(kind='barh', figsize=(20, 8)) 
plt.xlabel('人数', fontsize=15)
plt.ylabel('民族', fontsize=15)
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
for y, x in enumerate(nation_data.values):  # 显示对应数据
    plt.text(x+5, y-0.05, "%s" %x, fontsize=18)
    

plt.title('民族分布柱状图', fontsize=16)
plt.show()

绘制环形图

# Libraries
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(15, 8), subplot_kw=dict(aspect="equal"))

# 类别名
recipe = ["225 g flour",
          "90 g sugar",
          "1 egg",
          "60 g butter",
          "100 ml milk",
          "1/2 package of yeast"]

data1 = [225, 90, 50, 60, 100, 5]

# startangle 设置方向
wedges, texts = ax.pie(data1, wedgeprops=dict(width=0.5), startangle=-40)

# 每一类别说明框
# boxstyle框的类型,fc填充颜色,ec边框颜色,lw边框宽度
bbox_props = dict(boxstyle="square,pad=0.3", fc='white', ec="black", lw=0.72)
# 设置框引出方式
kw = dict(arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props, zorder=0, va="center")

# 添加标签
for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    # 设置方向
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    # 设置标注
    ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
                horizontalalignment=horizontalalignment,color='black', **kw)

ax.set_title("Matplotlib bakery: A donut")

plt.show();

# 设置画布大小
plt.figure(figsize=(10, 5))

# 类别名
recipe = nation_data.index
# 数据
data1 = nation_data.values

fig, ax = plt.subplots(figsize=(20, 8), subplot_kw=dict(aspect="equal"))

# startangle 设置方向
wedges, texts = ax.pie(data1, wedgeprops=dict(width=0.5), startangle=-40)

# 每一类别说明框
# boxstyle框的类型,fc填充颜色,ec边框颜色,lw边框宽度
bbox_props = dict(boxstyle="square,pad=0.1", fc='white', ec="black", lw=0.72)

# 设置框引出方式
kw = dict(arrowprops=dict(arrowstyle="-"),bbox=bbox_props, zorder=0, va="center")

# 添加标签
for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1
    y = np.sin(np.deg2rad(ang)+1)
    x = np.cos(np.deg2rad(ang))
    # 设置方向
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    # 设置标注
    ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 2*y),horizontalalignment=horizontalalignment,color='black', **kw)

ax.set_title("民族分布")
# # 设置等比例轴,x和y轴等比例
# plt.axis('equal') 
plt.show()
<Figure size 720x360 with 0 Axes>

# 设置画布大小
plt.figure(figsize=(10, 5))

labels = nation_data.index
values = nation_data.values
# Give color names
# 画饼图,label设置标签名,colors代表颜色
# 自定义颜色,如果颜色长度和数据长度不一致,则会循环使用颜色,即'red','green','red','green'
# 要把离心率设置远一点,怕第二个饼图挡住这个百分率
plt.pie(values, labels=labels, colors=['skyblue','green','red','blue'], wedgeprops=dict(width=0.5, edgecolor='w'), autopct='%.1f%%', pctdistance=0.8) 
 
# 设置等比例轴,x和y轴等比例
plt.axis('equal') 
plt.show()

生源省份分布

data.groupby('生源省份')['生源省份'].count()

以上是关于HENAU 2021届新生大数据分析的主要内容,如果未能解决你的问题,请参考以下文章

清北2021级新生大数据对比!北大强基计划超30%为竞赛破格录取

2021年第三届全国高校计算机能力挑战赛大数据应用赛

LUA 2020-2021届毕业展演完美落幕

拥有5大核心竞争力的华为云GaussDB,成SACC2021最靓那一个…

取消“996”大裁员年终奖缩水,这届互联网人没有余粮?

第九届中国Hadoop大数据峰会议程