网络招聘信息的分析与挖掘

网络招聘信息的分析与挖掘

问题1:根据招聘职位的工作性质和内涵,试分析目前所需要的人才中可以分为哪些职业类型和专业领域?

解答思路:针对该问题,主要定位附件1中的PositionFirstType和PositionName记忆PositionType这三列属性进行分析。

python代码如下:

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')
PositionFirstType = data['PositionFirstType']
print(PositionFirstType.value_counts())
print('='*20)

PositionName = data['PositionName']
print(PositionName.value_counts())
print('='*20)

PositionType = data['PositionType']
print(PositionType.value_counts())

数值结果如下:

技术       219514
市场与销售    108832
运营        88086
设计        37682
产品        33612
职能        32784
金融         8987
Name: PositionFirstType, dtype: int64
====================
产品经理                    9820
Java                    9431
web前端                   7589
UI设计师                   6957
测试工程师                   6663
                        ... 
语音信号处理资深算法工程师              1
采购经理-休闲食品/糕点方面(商城模块)       1
Cobol开发工程师 Shell           1
业务员/销售代表(华北片区)             1
营销策划经理(创意经理)               1
Name: PositionName, Length: 110921, dtype: int64
====================
后端开发      91999
销售        57235
运营        53880
市场/营销     38231
前端开发      33178
          ...  
机械工程师         1
cto           1
出纳            1
广告设计师         1
绩效考核经理        1
Name: PositionType, Length: 124, dtype: int64

对应PositionFirstType属性的可视化结果如下:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import pandas as pd


def img_grearte():
    data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')
    positional_name = data['PositionFirstType'].tolist()
    word = WordCloud(background_color="white",
                     width=800,
                     height=800,
                     font_path='simhei.ttf',
                     ).generate(str(positional_name))
    word.to_file('../result/test.png')
    print("词云图片已保存")

    plt.imshow(word)  # 使用plt库显示图片
    plt.axis("off")
    plt.show()


img_grearte()

在这里插入图片描述

对应PositionName属性的可视化结果如下:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import pandas as pd


def img_grearte():
    data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')
    positional_name = data['PositionName'].tolist()
    word = WordCloud(background_color="white",
                     width=800,
                     height=800,
                     font_path='simhei.ttf',
                     ).generate(str(positional_name))
    word.to_file('../result/test.png')
    print("词云图片已保存")

    plt.imshow(word)  # 使用plt库显示图片
    plt.axis("off")
    plt.show()


img_grearte()

在这里插入图片描述

对应PositionType属性的可视化结果如下:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import pandas as pd


def img_grearte():
    data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')
    positional_name = data['PositionType'].tolist()
    word = WordCloud(background_color="white",
                     width=800,
                     height=800,
                     font_path='simhei.ttf',
                     ).generate(str(positional_name))
    word.to_file('../result/test.png')
    print("词云图片已保存")

    plt.imshow(word)  # 使用plt库显示图片
    plt.axis("off")
    plt.show()


img_grearte()

在这里插入图片描述

结论:根据实验结果可以得知:(具体怎么写,你们可以根据我这个实验结果去写,只要能和结果大致对的上,都可以写,下面是我个人的写法,仅供参考。论文里面你们可以把这几个词云放进去,这样会显得比较直观

职业类型主要包括:开发类型,销售类型,运营类型,设计类型这四大类。

专业领域主要包括:计算机技术、市场营销、运营设计、产品、金融等

问题2:根据招聘单位的行业、职位、地域等特点,分析目前的人才需求情况,哪些是热门专业、职位、地域等?并展望其未来的人才需求走向。

解答思路:针对该问题,思路可以这样子,可以去统计一下各个城市对于各个专业的需求,进而可以给求职者一些建议,比如想找web前端的应该更倾向于去哪个城市寻求工作等

首先,需要确定有哪些城市,代码和对应的结果如下:

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')
City = data['City'].values

print('包含的地域有:')
for index, city in enumerate(set(City)):
    if index % 10 == 0:
        print('\n')
    print(city, end=',')
print('\n')
print('共计{}个地域'.format(len(set(City))))
包含的地域有:
马鞍山,太原,茂名,九江,内江,天水,运城,镇江,铜陵,白城,
福州,金华,日照,赤峰,绥化,黄石,南京,阳江,思茅,泸州,
威海,毕节地区,许昌,梧州,信阳,靖江,长治,宝鸡,常州,阳泉,
宿州,营口,河池,百色,拉萨,遂宁,巢湖,烟台,池州,金昌,
丽水,潮州,菏泽,郴州,景德镇,宁德,莱芜,三门峡,驻马店,昭通,
平凉,延边朝鲜族自治州,定西,南充,南宁,银川,怀化,晋中,永州,咸阳,
邢台,承德,杭州,安康,石嘴山,蚌埠,临沂,东营,六盘水,七台河,
吴忠,淮南,惠州,鸡西,澳门,泰安,天津,荆门,洛阳,青岛,
三亚,巴中,北海,延安,德州,温州,张家港,新乡,舟山,吉安,
开封,来宾,安顺,临沧,厦门,克拉玛依,西双版纳傣族自治州,安阳,西宁,江阴,
松原,大同,盐城,安庆,辽阳,淮安,邯郸,临汾,广安,焦作,
晋城,石家庄,无锡,西安,连云港,自贡,玉溪,铁岭,曲靖,凉山彝族自治州,
双鸭山,齐齐哈尔,绍兴,徐州,襄樊,遵义,嘉兴,黄冈,锦州,邵阳,
乌鲁木齐,深圳,潍坊,长春,江门,四平,商丘,鄂州,台湾,南昌,
绵阳,张家界,苏州,宜宾,唐山,红河哈尼族彝族自治州,大连,武威,德阳,株洲,
乐山,孝感,赣州,益阳,眉山,岳阳,包头,芜湖,贵港,咸宁,
梅州,哈尔滨,台州,贺州,南阳,济宁,河源,泰州,宜昌,清远,
周口,牡丹江,鞍山,广元,汕尾,廊坊,丽江,漯河,济南,宿迁,
张掖,东莞,鹰潭,香港,鹤岗,佛山,太仓,汕头,丹东,成都,
随州,日喀则地区,攀枝花,沈阳,武汉,陇南,广州,宜春,衡水,常熟,
濮阳,秦皇岛,阜阳,张家口,雅安,莆田,资阳,上海,北京,珠海,
白银,郑州,揭阳,伊春,泉州,保定,南通,呼和浩特,韶关,乌兰察布,
崇左,昆山,桂林,宁波,呼伦贝尔,扬州,贵阳,盘锦,商洛,肇庆,
南平,大庆,忻州,平顶山,合肥,朝阳,黑河,昌吉回族自治州,昆明,龙岩,
重庆,防城港,淄博,娄底,聊城,白山,云浮,湘西土家族苗族自治州,六安,酒泉,
嘉峪关,兰州,保山,葫芦岛,玉林,汉中,沧州,常德,柳州,漳州,
新余,亳州,三明,鹤壁,抚顺,衡阳,渭南,佳木斯,黄山,荆州,
宣城,钦州,德宏傣族景颇族自治州,庆阳,大理白族自治州,十堰,吉林,湛江,达州,通化,
湘潭,辽源,中山,铜川,湖州,榆林,滁州,抚州,枣庄,长沙,
海口,滨州,黔南布依族苗族自治州,黔东南苗族侗族自治州,衢州,淮北,石河子,上饶,
共计298个地域
import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')
City = data['City']
print(City.value_counts())
北京         197258
上海          88408
深圳          64516
广州          46370
杭州          41654
            ...  
防城港             1
澳门              1
达州              1
丹东              1
凉山彝族自治州         1

由于地域太多了,所以我们可以选择几个热门城市进行分析,比如北上广深分析,这里我就分析一下北京和西安这两个城市

针对北京,我们对其需求的职位进行分析,代码和结果如下:

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

beiJingData = data[data['City'] == '北京']

PositionName = beiJingData['PositionName']
print(PositionName.value_counts())
产品经理                 3576
Java                 3167
web前端                2305
测试工程师                2273
PHP                  2118
                     ... 
Web开发工程师-后端             1
网络部在线销售                 1
汽车金融风控专员                1
软件技术支持工程师(4年高薪急聘)       1
技术管理培训生(兼职,实习)          1
Name: PositionName, Length: 47778, dtype: int64

我这边是给出了具体的数据是多少,如果你们想要数据可视化,比如画个折线图,柱状图什么之类的,你们到时候可以具体的告诉我

针对西安,我们对其需求的职位进行分析,代码和结果如下:

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

beiJingData = data[data['City'] == '西安']

PositionName = beiJingData['PositionName']
print(PositionName.value_counts())
Java             150
web前端            148
PHP              114
UI设计师            113
文案策划              77
                ... 
产品策划(校园O2O平台)      1
Facebook广告投放       1
C++高级软件开发工程师       1
Java 高级程序员         1
电商金融顾问             1
Name: PositionName, Length: 1712, dtype: int64

补充:热门城市的分析,这个也就是无看看哪些城市的招聘信息多,哪些少,如果一个城市的招聘信息非常多的话,那么他大概率就是一个热门的城市。代码和结果如下:

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

City = data['City']
print(City.value_counts())
北京            197258
上海             88408
深圳             64516
广州             46370
杭州             41654
               ...  
黔东南苗族侗族自治州         1
贵港                 1
防城港                1
西双版纳傣族自治州          1
昭通                 1
Name: City, Length: 298, dtype: int64

总结:(个人意见,供参考

  1. 热门城市是北京,上海,深圳,广州,杭州,这五个城市的招聘信息最多,对人才的需求也是最多的
  2. 一线城市,比如北京,其对于人才的需求主要包括产品经理,Java,Web前端,测试工程师和PHP,可见对于大城市来讲,需求最多的岗位都是和互联网产业相关的
  3. 二线城市,比如西安,其人才需求除了Java,Web前端和PHP外,主要还包括UI设计和文案策划,且需求的人数可以说是远远小于北京,这也说明了对于二线城市及其以上的城市,互联网岗位的需求还是最大的,而传统的一些行业的需求相对较少,因此,对于未来的学生就业,我们应该更多的倾向于互联网行业,因为其需求最大。

问题3:随着数据分析/数据挖掘行业的兴起,涌现出了一些新的职位,如数据分析师、大数据分析师、数据产品经理、数据挖掘算法工程师等,试分析与预测相关职位的需求情况。

解决思路:分析一下这几个职位近几年的需求情况,然后,找其中一个职位进行预测。

代码和结果

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

dataAnalyze = data[data['PositionName'] == '数据分析师']
dataAnalyze_num = len(dataAnalyze)

bigDataAnalyze = data[data['PositionName'] == '大数据分析师']
bigDataAnalyze_num = len(bigDataAnalyze)

dataProductManager = data[data['PositionName'] == '数据产品经理']
dataProductManager_num = len(dataProductManager)

dataMining = data[data['PositionName'] == '数据挖掘算法工程师']
dataMining_num = len(dataMining)

print('数据分析师:', dataAnalyze_num)
print('大数据分析师:', bigDataAnalyze_num)
print('数据产品经理:', dataProductManager_num)
print('数据挖掘算法工程师:', dataMining_num)
数据分析师: 1042
大数据分析师: 47
数据产品经理: 407
数据挖掘算法工程师: 15

上面结果显示了近几年的各个新兴职位的需求量,其中数据分析师最多,这也就为求职者提供了一份建议,可以往数据方向的专业看齐,未来这是容易找到工作的职位

对上面的结果进行可视化:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号

name_list = ['数据分析师', '大数据分析师', '数据产品经理', '数据挖掘算法工程师']
num_list = [1042, 47, 407, 15]
plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list)
plt.show()

在这里插入图片描述
接下来,我们针对数据分析师这个职位进行需求的预测

首先需要确定每一天数据分析师这个职位的需求量,代码和结果如下:

import pandas as pd
from datetime import datetime


data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

dataAnalyze = data[data['PositionName'] == '数据分析师']

new_time = []
for time in dataAnalyze['CreateTime'].tolist():
    if time[4] == '/':
        time = time.replace('/', '-')
    if time[6] == '/':
        time = time.replace('/', '-')
    if time[7] == '/':
        time = time.replace('/', '-')
    new_time.append(time.strip()[0:11])

time_request = dict()
new_time_request = dict()
for time in new_time:
    if time in time_request.keys():
        time_request[time] += 1
    else:
        time_request[time] = 1

for k, v in time_request.items():
    date = k.split()[0]
    new_date = datetime.strptime(date, "%Y-%m-%d")
    new_time_request[new_date] = v

sorted_time_request = sorted(new_time_request.items(), key=lambda s: s[0], reverse=False)
for k, v in sorted_time_request:
    print(k, v)
2015-12-23 00:00:00 11
2015-12-25 00:00:00 5
2015-12-26 00:00:00 10
2015-12-27 00:00:00 7
2015-12-28 00:00:00 42
2015-12-29 00:00:00 42
2015-12-30 00:00:00 36
2015-12-31 00:00:00 30
2016-01-01 00:00:00 1
2016-01-02 00:00:00 2
2016-01-03 00:00:00 1
2016-01-04 00:00:00 1
2016-01-05 00:00:00 1
2016-01-06 00:00:00 1
2016-01-07 00:00:00 1
2016-01-08 00:00:00 1
2016-01-09 00:00:00 1
2016-01-10 00:00:00 1
2016-01-11 00:00:00 3
2016-01-12 00:00:00 3
2016-01-13 00:00:00 1
2016-01-14 00:00:00 1
2016-01-29 00:00:00 1
2016-01-30 00:00:00 1
2016-01-31 00:00:00 2
2016-02-16 00:00:00 1
2016-02-26 00:00:00 1
2016-02-27 00:00:00 1
2016-02-28 00:00:00 2
2016-02-29 00:00:00 1
2016-03-01 00:00:00 1
2016-03-02 00:00:00 2
2016-03-03 00:00:00 1
2016-03-04 00:00:00 29
2016-03-05 00:00:00 4
2016-03-06 00:00:00 8
2016-03-07 00:00:00 52
2016-03-08 00:00:00 38
2016-03-09 00:00:00 50
2016-03-10 00:00:00 44
2016-03-11 00:00:00 40
2016-03-12 00:00:00 4
2016-03-13 00:00:00 4
2016-03-14 00:00:00 30
2016-03-15 00:00:00 30
2016-03-16 00:00:00 21
2016-03-17 00:00:00 17
2016-03-18 00:00:00 19
2016-03-19 00:00:00 2
2016-03-21 00:00:00 29
2016-03-22 00:00:00 17
2016-03-23 00:00:00 14
2016-03-24 00:00:00 16
2016-03-25 00:00:00 11
2016-03-26 00:00:00 1
2016-03-28 00:00:00 19
2016-03-29 00:00:00 12
2016-03-30 00:00:00 15
2016-03-31 00:00:00 6
2016-04-01 00:00:00 10
2016-04-02 00:00:00 1
2016-04-04 00:00:00 2
2016-04-05 00:00:00 9

绘制这些天的数据分析师需求量的折线统计图:

代码和结果如下:

import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt


data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

dataAnalyze = data[data['PositionName'] == '数据分析师']

new_time = []
for time in dataAnalyze['CreateTime'].tolist():
    if time[4] == '/':
        time = time.replace('/', '-')
    if time[6] == '/':
        time = time.replace('/', '-')
    if time[7] == '/':
        time = time.replace('/', '-')
    new_time.append(time.strip()[0:11])

time_request = dict()
new_time_request = dict()
for time in new_time:
    if time in time_request.keys():
        time_request[time] += 1
    else:
        time_request[time] = 1

for k, v in time_request.items():
    date = k.split()[0]
    new_date = datetime.strptime(date, "%Y-%m-%d")
    new_time_request[new_date] = v

sorted_time_request = sorted(new_time_request.items(), key=lambda s: s[0], reverse=False)

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号

date_list = []
val_list = []
for date, v in sorted_time_request:
    str_date = date.strftime("%Y-%m-%d")
    date_list.append(str_date)
    val_list.append(v)

plt.plot(date_list, val_list, marker='*', c='r')
plt.xticks([])
plt.show()

在这里插入图片描述
接下来,我们针对已知的这几个数据进行一个数据预测,即预测未来的数据分析师的需求量是多少

由于只有少量的数据,所以只能做一个简单的预测

利用SVR进行预测(自己去百度SVR,做一定的介绍(全是套话),然后把我的这个实验结果放上就行了

from matplotlib import pyplot as plt
from sklearn.svm import SVR
from wordCloud.q3 import val_list

time = list(range(63))
single1 = val_list

# 需要预测的长度是多少
long_predict = 40


def svm_timeseries_prediction(c_parameter, gamma_paramenter):
    X_data = time
    Y_data = single1
    print(len(X_data))
    # 整个数据的长度
    long = len(X_data)
    # 取前多少个X_data预测下一个数据
    X_long = 1
    error = []
    svr_rbf = SVR(kernel='rbf', C=c_parameter, gamma=gamma_paramenter)
    X = []
    Y = []
    for k in range(len(X_data) - X_long - 1):
        t = k + X_long
        X.append(Y_data[k:t])
        Y.append(Y_data[t + 1])
    y_rbf = svr_rbf.fit(X[:-long_predict], Y[:-long_predict]).predict(X[:])
    for e in range(len(y_rbf)):
        error.append(Y_data[X_long + 1 + e] - y_rbf[e])
    return X_data, Y_data, X_data[X_long + 1:], y_rbf, error


X_data, Y_data, X_prediction, y_prediction, error = svm_timeseries_prediction(10, 1)
figure = plt.figure()
tick_plot = figure.add_subplot(1, 1, 1)
tick_plot.plot(X_data, Y_data, label='data', color='green', linestyle='-')
tick_plot.axvline(x=X_data[-long_predict], alpha=0.2, color='gray')
tick_plot.plot(X_prediction, y_prediction, label='data', color='red', linestyle='--')
plt.show()

在这里插入图片描述
预测的结果如上图所示:

上面这副图的绿色曲线表示的是真实的需求曲线,红色曲线表示的是预测的需求曲线,即我们可以根据红色曲线的变化去预测未来的数据分析师职位的需求量

问题4:深入分析IT人才市场的供求现状及未来的发展趋势,包括地域和职位、人才的专业和学历层次等方面的情况

思路1:可以根据地域的不同,去探究一下不同地域对于学历的要求程度,可以得出学历要求的扇形图(我们以北京和西安为例)

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

beijing_data = data[data['City'] == '北京']
print(beijing_data['Education'].value_counts())
本科      108554
大专       58961
学历不限     27136
硕士        2533
博士          54
中专          14
高中           5
初中           1
Name: Education, dtype: int64

根据结果可以绘制扇形统计图来可视化,在北京,各个学历需求的占比

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号
labels = '本科', '大专', '学历不限', '硕士', '博士', '中专', '高中', '初中'  # 每一块的标签
sizes = [108554, 58961, 27136, 2533, 54, 14, 5, 1]  # 所占百分比
explode = (0.1, 0.1, 0, 0, 0, 0, 0, 0)  # 所对应一块的分离情况
plt.pie(sizes, explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')  # 以正圆展示
plt.show()

在这里插入图片描述
接下来,我们分析西安的招聘中的学历要求,各个学历所占的百分比率

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

xian_data = data[data['City'] == '西安']
print(xian_data['Education'].value_counts())
大专      2159
本科      1808
学历不限     948
硕士        35
Name: Education, dtype: int64

可视化代码和结果:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号
labels = '大专', '本科', '学历不限', '硕士'  # 每一块的标签
sizes = [2159, 1808, 948, 35]  # 所占百分比
explode = (0.1, 0.1, 0, 0)  # 所对应一块的分离情况
plt.pie(sizes, explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')  # 以正圆展示
plt.show()

在这里插入图片描述
结论1:根据以上分析可知,对于北京而言,其招聘所需求的学历相对较广,包括本科、大专、学历不限、硕士、博士、中专、高中、初中,并且本科的需求量最高;而对于西安而言,其招聘所需求的学历相对较窄,只包括大专、本科、学历不限、硕士,并且大专的需求量最高。由此可见,越发达的城市,其对学历的包容性也越高,并且对于本科的需求量也越大;相反,对于发展中城市,其需求最多的还是大专水平,并且对于人才学历要求的多样性相对单调一些。

思路2:分析一下IT领域的一些职位的学历要求是一个什么形式(以Java职位为例)

import pandas as pd

data = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8')

java_data = data[data['PositionName'] == 'Java']
print(java_data['Education'].value_counts())
本科      4772
大专      3481
学历不限    1127
硕士        48
博士         3
Name: Education, dtype: int64

可视化:

import matplotlib.pyplot as plt

eduction_list = ['本科', '大专', '学历不限', '硕士', '博士']
number_list = [4772, 3481, 1127, 48, 3]

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于正常显示负号

plt.bar(eduction_list, number_list)
plt.show()

在这里插入图片描述
根据分析可知,对于IT行业来说,其需求最大的还是本科学历

主成分分析

主成分分析,我们首先需要把原始数据中的标签数据转化为数值数据,然后进行pca操作,具体代码如下:

import pandas as pd
import numpy as np
from typing import List
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA


def class2number(class_list: List[str]) -> np.ndarray:
    numbers = []
    s = set(class_list)
    dic = dict()
    index = 1
    for ch in s:
        dic[ch] = index
        index += 1

    for c in class_list:
        numbers.append(dic[c])

    return np.array(numbers)


if __name__ == '__main__':
    df = pd.read_csv('../data/附件1_招聘信息.csv', encoding='utf-8').dropna()
    column_names = df.columns

    matrix = []
    for name in column_names:
        numbers = class2number(df[name].tolist())
        matrix.append(numbers)
    matrix_arr = np.array(matrix)
    new_data = matrix_arr.T
    new_data = (new_data - new_data.mean()) / new_data.std()

    pca = PCA(n_components=3)
    pca.fit(new_data)
    print('贡献方差,即特征根', pca.explained_variance_)  # 贡献方差,即特征根
    print('方差贡献率', pca.explained_variance_ratio_)  # 方差贡献率
    print('成分得分系数矩阵', pca.components_)  # 成分得分系数矩阵)

    k1_spss = pca.components_ / np.sqrt(pca.explained_variance_.reshape(3, 1))

    # 因子得分
    x_tf = pca.transform(new_data)
    # 因子得分标准化
    scaler2 = StandardScaler().fit(x_tf)
    x_tf_scaler = pd.DataFrame(scaler2.transform(x_tf), columns=['FAC1', 'FAC2', 'FAC3'])
    # 正负号转化
    # 如因子4的系数与SPSS的符号相反
    k_sign = np.sign(k1_spss.sum(axis=1))
    x_tf_scaler_sign = x_tf_scaler * k_sign  # 取正负号
    # 综合得分
    rat = pca.explained_variance_ratio_
    x_tf_scaler_sign['FAC_score'] = np.sum(x_tf_scaler_sign * rat, axis=1)
    print(x_tf_scaler_sign)

实验结果如下:

贡献方差,即特征根 [3.09601765 1.24852309 0.88813106]
方差贡献率 [0.56079421 0.22615004 0.16087077]
成分得分系数矩阵 [[-1.96275936e-05 -9.56456271e-05 -6.33177275e-04  6.62213870e-07
   1.59487729e-03 -2.62947106e-07  2.39939617e-07  1.42843070e-06
   1.02201752e-08 -2.42783402e-03 -4.21011885e-07 -1.91882830e-03
  -2.17374672e-06 -1.26946436e-06 -1.80676319e-07  3.10497862e-02
   9.99511571e-01]
 [ 3.96620382e-06 -1.03958079e-04 -5.07355293e-04  7.40949921e-08
   9.99998122e-01  1.63420063e-08 -4.09047666e-08  3.24994506e-07
   5.01777797e-09 -7.74512622e-04  2.40312064e-08  5.82667172e-04
  -2.30792267e-07  9.86186323e-07 -2.68465073e-08 -2.24965835e-05
  -1.59604880e-03]
 [ 1.66995719e-05  4.25246607e-04  7.69857585e-05 -1.94467554e-07
   7.77676505e-04  2.22650330e-07  5.74434611e-09  7.66206165e-06
   1.90085773e-09  9.99995454e-01  2.22010706e-07  1.39478651e-03
  -3.13883092e-08  1.75015840e-06  2.36661881e-07 -5.97757769e-04
   2.44910525e-03]]
            FAC1      FAC2      FAC3  FAC_score
0      -1.599024  0.225387  0.193585  -0.814610
1      -1.598445  1.194323 -0.264011  -0.668774
2      -1.601253  0.170483  0.835838  -0.724957
3      -1.601067  0.353682  0.836007  -0.683395
4      -1.602361 -1.060172  0.834528  -1.004101
...          ...       ...       ...        ...
529479  1.966809 -1.030813  0.400799   0.934334
529480  1.959425 -1.030505  0.245446   0.905270
529481  1.959320 -1.031148  0.830125   0.999124
529482  1.959437 -1.031472  1.221471   1.062073
529483  1.966072 -1.031302  0.631414   0.970909

[529484 rows x 4 columns]

可以看出,3个主成分的方差贡献率综合为0.94781502>0.8,已经满足主成分分析的要求

并且:

factor1 = (-1.96275936e-05 x 1 x_1 x1)+(-9.56456271e-05 x 2 x_2 x2)+(-6.33177275e-04 x 3 x_3 x3)+(6.62213870e-07 x 4 x_4 x4)+(1.59487729e-03 x 5 x_5 x5)+(-2.62947106e-07 x 6 x_6 x6)+(2.39939617e-07 x 7 x_7 x7)+…+(-1.59604880e-03 x 17 x_{17} x17)

factor2 = …

factor3=…(自己写一下,看那个成分得分系数矩阵)

其中 x 1 x_1 x1,…, x 17 x_{17} x17分别对应附件1中的17个属性(City,Company等等)

文本聚类

将附件三中的Job_Description进行聚类,聚为两类

聚类的代码如下:

import jiagu
import random

docs = []

with open('../preprocessed_data/out2.txt', mode='r', encoding='utf-8') as f:
    sentences = f.readlines()
    for sentence in sentences:
        docs.append(sentence)

# random.shuffle(docs)

cluster = jiagu.text_cluster(docs)
for k, v in cluster.items():
    path = '../result/' + str(k) + '.txt'
    with open(file=path, mode='w', encoding='utf-8') as f:
        f.writelines(v)

对于聚类后的各个类别的文本进行词云可视化如下:

类1:
在这里插入图片描述
类2:
在这里插入图片描述
**根据可视化的结果可以看出,两类文本中,第一类只要是和产品相关,及其对应的招聘岗位只要设计的是产品领域,强调平台的重要性;而第二类文本主要是设计营销方面的品牌。

猜你喜欢

转载自blog.csdn.net/wqs12345612/article/details/112501187