一、高管数据集

1.1 介绍

数据集 | 90w条中国上市公司高管数据

90w 条中国上市公司高管简历,数据源-新浪财经,统计的日期范围1990-2021年。

1.2 字段

数据集的字段含,大多是从「个人简历」中计算衍生出来的。

- ID
- 姓名
- 证券代码
- 统计截止日期
- 个人简历
- 国籍
- 籍贯
- 籍贯所在地区代码
- 出生地
- 出生地所在地区代码
- 性别
- 年龄
- 毕业院校
- 学历  1=中专及中专以下; 2=大专; 3=本科; 4=硕士研究生; 5=博士研究生; 6=其他(以其他形式公布的学历,如荣誉博士、函授等); 7=MBA/EMBA
- 专业
- 职称
- 是否领取薪酬
- 报告期报酬总额
- 年末持股数
- 是否高管团队成员
- 是否董事会成员
- 是否独立董事
- 是否兼任董事长和CEO
- 是否监事
- 具体职务

1.3 应用价值

这里粘贴部分应用高管数据论文

  • 何瑛,于文蕾,戴逸驰,王砚羽.高管职业经历与企业创新[J].管理世界,2019,35(11):174-192.
  • 杨林,和欣,顾红芳.高管团队经验、动态能力与企业战略突变:管理自主权的调节效应[J].管理世界,2020,36(06):168-188+201+252.
  • 周楷唐,麻志明,吴联生.高管学术经历与公司债务融资成本[J].经济研究,2017,52(07):169-183.
  • 陆瑶,张叶青,黎波,赵浩宇.高管个人特征与公司业绩——基于机器学习的经验证据[J].管理科学学报,2020,23(02):120-140.
  • 柳光强,孔高文.高管经管教育背景与企业内部薪酬差距[J].会计研究,2021,(03):110-121.
  • 郑建明,孙诗璐,李金甜.高管文化背景与企业债务成本——基于劳模文化的视角[J].会计研究,2021,(03):137-145.



二、代码案例

用Python实现以下五个技术难题,主要对高管简介进行操作

  1. 读取xlsx文件(90w高管数据)
  2. 简介文本中是否含指定词语(例如找出有【清华大学】求学经历的高管)
  3. 大学高管数量排行榜
  4. 统计文本中指定词语出现次数(例如统计每位高管内【大学】出现次数)
  5. 找出每位高管的出生年份(用正则表达式)
  6. 统计每位高管经历的时间点个数 …

2.1 导入数据

import pandas as pd

df = pd.read_excel('高管数据.xlsx')
#剔除「个人简历」字段中的缺失值
df.dropna(subset=['个人简历'], inplace=True)
df.head()

2.2 简介文本长度

df['个人简历'].str.len()

#新增一个字段length,将简介文本长度保存到length中
#df['length'] = df['个人简历'].str.len()
0         161
1         154
2         395
3         306
4         335
         ... 
900882     40
900883     54
900884     71
900885     41
900886     62
Name: 个人简历, Length: 736970, dtype: int64

2.3 简介文本中是否含指定词语

例如找出有【清华大学】求学经历的高管,这里直接使用**Series.str.contains()**方法来直接搜某字段(Series)是否含某个词

  • len(df[df['个人简历'].str.contains('清华大学')]) 保留有「清华大学」学习经历的高管
  • len(df[df['个人简历'].str.contains('北京大学')]) 保留有「北京大学」学习经历的高管
  • len(df[df['个人简历'].str.contains('清华大学|北京大学')]) 保留有「清华大学」或「北京大学」学习经历的高管
  • len(df[df['个人简历'].str.contains('清华大学') & df['个人简历'].str.contains('北京大学')]) 保留同时有「清华大学」和「北京大学」学习经历的高管

第三个(北大清华)表达式的数量应该是最多的(前两者之和), 第四个表达式是最少。 注意, 逻辑【或|】【且&】可以有任意多个

#统计有【清华大学】学习经历的高管人数
len(df[df['个人简历'].str.contains('清华大学')])

Run

10377

len(df[df['个人简历'].str.contains('北京大学')])

Run

8709

len(df[df['个人简历'].str.contains('清华大学|北京大学')])

Run

18647

len(df[df['个人简历'].str.contains('清华大学') & df['个人简历'].str.contains('北京大学')])

Run

439

2.4 大学高管数量排行榜

#测试列表(凭记忆手动输入的大学,各位可以自己设计测试列表)
test_universitys = ['清华大学', '北京大学', '中国人民大学', '浙江大学', 
                    '上海交通大学', '西安交通大学', '同济大学', '南开大学', '天津大学', 
                    '武汉大学', '华中科技大学', '中国科学技术大学', '南京大学',
                    '中山大学', '中南大学', '四川大学', '重庆大学', '兰州大学', '湖南大学', 
                    '山东大学', '吉林大学', '大连理工大大学', '东北大学', '北京航空航天大学', '中国地质大学']


print('大学高管人数排行')

uni_infos = []
for university in test_universitys:
    num = len(df[df['个人简历'].str.contains(university)])
    uni_infos.append((university, num))
    
uni_infos = sorted(uni_infos, key=lambda k:k[1], reverse=True)
uni_infos

Run

大学高管人数排行

[('清华大学', 10377),
 ('北京大学', 8709),
 ('中国人民大学', 7012),
 ('浙江大学', 5816),
 ('中山大学', 4065),
 ('上海交通大学', 3844),
 ('武汉大学', 3578),
 ('南京大学', 3272),
 ('西安交通大学', 2972),
 ('南开大学', 2716),
 ('湖南大学', 2502),
 ('华中科技大学', 2356),
 ('同济大学', 2089),
 ('吉林大学', 2044),
 ('四川大学', 1934),
 ('山东大学', 1847),
 ('中南大学', 1615),
 ('天津大学', 1598),
 ('重庆大学', 1440),
 ('北京航空航天大学', 1334),
 ('东北大学', 1241),
 ('中国科学技术大学', 842),
 ('兰州大学', 745),
 ('中国地质大学', 437),
 ('大连理工大大学', 0)]

2.5 统计文本中指定词语出现次数

例如统计每位高管内【大学】出现次数

df['个人简历'].str.count('大学')

Run

0         0
1         2
2         0
3         0
4         0
         ..
900882    0
900883    0
900884    0
900885    0
900886    0
Name: 个人简历, Length: 736970, dtype: int64

print('高管总人数: ', len(df))
#简历中无「大学」字眼
print('无大学经历高管人数:' , len(df[df['个人简历'].str.count('大学')==0]))
#简历中有「大学」字眼
print('有大学经历高管人数:' , len(df[df['个人简历'].str.count('大学')>0]))

Run

高管总人数:  736970
无大学经历高管人数: 515172
有大学经历高管人数: 221798

#有些企业单位名字中带有「大学」,但这类企业非常少。
#「大学」词语出现次数可以近似看做学习经历次数
#如此, 1可以看做本科学历,2看做研究生学历, 3看做博士学历
df['个人简历'].str.count('大学').value_counts(normalize=True).plot(kind='bar')

png


2.6 找出每位高管的出生年份(用正则表达式)

df['个人简历'].str.findall('\d{4}')

Run

0                                                    [1969]
1                      [1965, 1984, 1986, 1990, 1994, 1995]
2         [1972, 1998, 1999, 2000, 2015, 2002, 2016, 200...
3         [1960, 1982, 1989, 1990, 1991, 1991, 2002, 200...
4         [1962, 2009, 1985, 1996, 1996, 2008, 1993, 200...
                                ...                        
900882                                                   []
900883                                                   []
900884                                                   []
900885                                                   []
900886                                                   []
Name: 个人简历, Length: 736970, dtype: object

def birth_year(years):
    try:
        #返回出生年份
        return years[0]
    except:
        #没有年份的,返回0
        return 0
    
    
#高管出生年份
df['个人简历'].str.findall('\d{4}').apply(birth_year)

Run

0         1969
1         1965
2         1972
3         1960
4         1962
          ... 
900882       0
900883       0
900884       0
900885       0
900886       0
Name: 个人简历, Length: 736970, dtype: object

#高管时间点个数(感觉可以看做经历的个数)
df['个人简历'].str.findall('\d{4}').apply(lambda ys: len(set(ys)))

Run

0          1
1          6
2         10
3         10
4          8
          ..
900882     0
900883     0
900884     0
900885     0
900886     0
Name: 个人简历, Length: 736970, dtype: int64



获取代码

点击下载ipynb代码文件



广而告之