精华内容
下载资源
问答
  • python爬取前程无忧和拉勾数据分析岗位并分析

    万次阅读 多人点赞 2018-03-05 23:14:40
    分析数据分析岗位的招聘情况,包括地区分布、薪资水平、职位要求等,了解最新数据分析岗位的情况。 环境:python 3.6 设计的工具:Tableau工具(主要是生成图方便,用matplotlib也可以达到同样的效果) 二、数据...

    一、明确需求

    分析数据分析岗位的招聘情况,包括地区分布、薪资水平、职位要求等,了解最新数据分析岗位的情况。

    环境:python 3.6

    设计的工具:Tableau工具(主要是生成图方便,用matplotlib也可以达到同样的效果)

    二、数据采集

     首先编写爬虫,这里主要是爬取前程无忧和拉勾网,直接上前程无忧的代码:

    关于前程无忧爬虫代码,网上有很多教程,不过大部分只取了地区、职位、工资和日期这几个字段,没有涉及到岗位要求和岗位职责,因为要了解职位的需求以及后面方便画词云,我就自己写了一个代码。说一下拉勾和前程无忧两者的区别,前程无忧爬了2000页,不过大概只有前24页是跟数据分析有关的岗位,拉勾网的数据量比较少,全国主要城市爬下来,一共也才2000多条,而且基本集中在北京上海杭州。调整一下前程无忧爬虫格式跟拉勾一样,把两个表格合并起来一起分析。

    # -*- coding:utf-8 -*-
    import urllib
    import re, codecs
    import time, random
    import requests
    from lxml import html
    from urllib import parse
    
    key = '数据分析'
    key = parse.quote(parse.quote(key))
    headers = {'Host': 'search.51job.com',
               'Upgrade-Insecure-Requests': '1',
               'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    
    
    def get_links(page):
        url = 'http://search.51job.com/list/000000,000000,0000,00,9,99,' + key + ',2,' + str(page) + '.html'
        r = requests.get(url, headers, timeout=10)
        s = requests.session()
        s.keep_alive = False
        r.encoding = 'gb18030'
        reg = re.compile(r'class="t1 ">.*? <a target="_blank" title=".*?" href="(.*?)".*? <span class="t2">.*?<span class="t4">(.*?)</span>', re.S)
        links = re.findall(reg, r.text)
        return links
    
    
    # 多页处理,下载到文件
    def get_content(link,salary):
        r1 = requests.get(link, headers, timeout=10)
        s = requests.session()
        s.keep_alive = False
        r1.encoding = 'gb18030'
        t1 = html.fromstring(r1.text)
        l=[]
        try:
            job = t1.xpath('//div[@class="tHeader tHjob"]//h1/text()')[0]
            company = t1.xpath('//p[@class="cname"]/a/text()')[0]
            label = t1.xpath('//div[@class="t1"]/span/text()')
            education = t1.xpath('//div[@class="cn"]/p[2]/text()')[2]
            salary = salary
            area = t1.xpath('//div[@class="cn"]/p[2]/text()')[0]
            companytype = 'Null'
            workyear = t1.xpath('//div[@class="cn"]/p[2]/text()')[1]
            describe = re.findall(re.compile(r'<div class="bmsg job_msg inbox">(.*?)任职要求', re.S), r1.text)
            require = re.findall(re.compile(r'<div class="bmsg job_msg inbox">.*?任职要求(.*?)<div class="mt10">', re.S),
                                 r1.text)
            try:
                file = codecs.open('51job.xls', 'a+','utf-8')
                item = str(company) + '\t' + str(job) + '\t' + str(education) + '\t' + str(label) + '\t' + str(
                    salary) + '\t' + str(companytype) + '\t' + str(workyear) + '\t' + str(area) + '\t' + str(
                    workyear) + str(describe) + '\t' + str(require) + '\n'
                file.write(item)
                file.close()
                return True
            except Exception as e:
                print(e)
                return None
            # output='{},{},{},{},{},{},{},{}\n'.format(company,job,education,label,salary,area,describe,require)
            # with open('51job.csv', 'a+', encoding='utf-8') as f:
            # f.write(output)
        except:
            print('None')
        print(l)
        return l
    
    
    for i in range(1, 2):
        print('正在爬取第{}页信息'.format(i))
        try:
            # time.sleep(random.random()+random.randint(1,5))
            links = get_links(i)
            for link in links:
                url=link[0]
                salary=link[1]
                get_content(url,salary)
                # time.sleep(random.random()+random.randint(0,1))
        except:
            continue
            print('有点问题')

    2019.09:因为后来51job修改了网络结构,我稍微调整了一下代码。如果写入Excel是乱码的话,右键-打开方式选择记事本-另存为-编码选择ANSI,再用Excel打开就可以了。后面如果网络结构换了,修改一下xpath内容就可以了。

     

    三、数据探索和预处理:

     

     

    数据爬取完了,大概有十万条数据,看起来还不错。

     

    然而问题来了:

    1.数据有重复,需要去重。

    2.岗位不是全部是数据分析,也有招聘店长、销售、运营之类的岗位,需要去除无关数据。

    利用pandas模块,短短几行代码就可以实现了,而且数据很快。

    # -*- coding: UTF-8 -*-
    import pandas as pd
    import numpy as np
    
    data=pd.read_excel('51joball.xlsx',sheet_name='Sheet1',header=0)
    df=pd.DataFrame(data)
    df=df[True- df.公司.duplicated()]#去重
    df=df[df.职位.str.contains(r'.*?数据.*?|.*?分析.*?')]#提取包含数据或者分析的岗位
    df.to_excel('new51job.xlsx')

    接下来还有一个问题需要处理,就是数据规范化,薪资待遇这栏,有的是千/月,有的是万每年,有的是元/天,有的是K每月,不规划化,无法进行分析。地区这一栏,有的有区,有的没区,我们规划到城市这个级别就好了。这里利用xlrd模块读取Excel表格,当然换成pandas一样也可以。

    #coding:utf8
    import xlrd
    import codecs
    import re
    #加载Excel数据,获得工作表和行数
    def load_from_xlsx(file):
        data = xlrd.open_workbook(file)
        table0 = data.sheet_by_name('Sheet1')
        nrows = table0.nrows
        return table0, nrows
    #利用正则表达式提取月薪,把待遇规范成千/月的形式
    def get_salary(salary):
        if '-'in salary: #针对1-2万/月或者10-20万/年的情况,包含-
            low_salary=re.findall(re.compile('(\d*\.?\d+)'),salary)[0]
            high_salary=re.findall(re.compile('(\d?\.?\d+)'),salary)[1]
            if u'万' in salary and u'年' in salary:#单位统一成千/月的形式
                low_salary = float(low_salary) / 12 * 10
                high_salary = float(high_salary) / 12 * 10
            elif u'万' in salary and u'月' in salary:
                low_salary = float(low_salary) * 10
                high_salary = float(high_salary) * 10
        else:#针对20万以上/年和100元/天这种情况,不包含-,取最低工资,没有最高工资
            low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]
            high_salary=""
            if u'万' in salary and u'年' in salary:#单位统一成千/月的形式
                low_salary = float(low_salary) / 12 * 10
            elif u'万' in salary and u'月' in salary:
                low_salary = float(low_salary) * 10
            elif u'元'in salary and u'天'in salary:
                low_salary=float(low_salary)/1000*21#每月工作日21天
        return low_salary,high_salary
    
    def main():
        data = load_from_xlsx(r'new51job.xlsx')
        table, nrows = data[0], data[1]
        print('一共有{}行数据,开始清洗数据'.format(nrows))
        for i in range(1,nrows):
            id=table.row_values(i)[0]
            company=table.row_values(i)[1]
            position = table.row_values(i)[2]
            education = table.row_values(i)[3]
            welfare = table.row_values(i)[4]
            salary=table.row_values(i)[5]
            area = table.row_values(i)[6][:2]#地区取到城市,把区域去掉
            companytype = table.row_values(i)[7]
            companysize = table.row_values(i)[8]
            field = table.row_values(i)[9]
            experience = table.row_values(i)[10]
            responsibility = table.row_values(i)[11]
            requirement = table.row_values(i)[12]
            if salary:#如果待遇这栏不为空,计算最低最高待遇
                getsalary=get_salary(salary)
                low_salary=getsalary[0]
                high_salary=getsalary[1]
            else:
                low_salary=high_salary=""
            print('正在写入第{}条,最低工资是{}k,最高工资是{}k'.format(i,low_salary,high_salary))
            output = '{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n'.format(id, company, position, education, welfare,low_salary, high_salary, area, companytype,companysize, field, experience, responsibility,requirement)
            f=codecs.open('51jobanaly.xls','a+')
            f.write(output)
            f.close()
    if __name__=='__main__':
        main()

    看看清洗之后的效果

    四、数据可视化与分析

    1.各地区招聘公司数量和平均待遇。

        用tebleau生成地理图十分方便强大。可以看出不论是招聘公司的数据还是平均待遇水平主要都是北上广深杭州占优势。成都紧随其后。

    2.公司类型

    可以看出招聘的公司主要是民营企业和一些创业公司为主。

    3.公司规模和公司领域

    可以看出招聘公司的规模在50-500人规模为主,招聘的领域主要是互联网公司,金融紧随其后。

    4.经验和学历要求

    学历这里主要是大专本科为主,要求不算很高。

    5岗位要求和岗位职责

    直接生成现在最流行的词云,具体代码看python生成词云

     

     

    展开全文
  • 本次主要围绕数据分析岗位的招聘情况, 进行一个简单的数据分析环境win8, python3.7, pycharm, jupyter notebook正文1. 明确分析目的了解数据分析岗位的最新招聘情况, 包括地区分布, 学历要求, 经验要求, 薪资水平等....

    本次主要围绕数据分析岗位的招聘情况, 进行一个简单的数据分析

    环境

    win8, python3.7, pycharm, jupyter notebook

    正文

    1. 明确分析目的

    了解数据分析岗位的最新招聘情况, 包括地区分布, 学历要求, 经验要求, 薪资水平等.

    2. 数据收集

    这里借助爬虫, 爬取招聘网站的招聘信息, 进而分析出相关的薪资以及招聘要求.

    2.1 目标站点分析

    通过对目标站点的分析, 我们需要确定目标站点的请求方式, 以及网页结构.

    2.2 新建scrapy项目

    1. 在cmd命令行窗口中任意路径下执行以下代码, 比如在"D:\python\Tests"目录下新建zhaopin项目.

    d:

    cd D:\python\Tests

    scrapy startproject zhaopin

    2. 在完成了zhaopin项目创建之后, 接下来就是在zhaopin项目文件夹中新建spider爬虫主程序

    cd zhaopin

    scrapy genspider zhaopinSpider zhaopin.com

    这样就完成项目zhaopin的创建, 开始编写我们的程序吧.

    2.3 定义items

    在items.py文件中定义需要爬取的招聘信息.

    importscrapyfrom scrapy.item importItem, FieldclasszhaopinItem(Item):#define the fields for your item here like:

    #name = scrapy.Field()

    JobTitle = Field() #职位名称

    CompanyName = Field() #公司名称

    CompanyNature = Field() #公司性质

    CompanySize = Field() #公司规模

    IndustryField = Field() #所属行业

    Salary = Field() #薪水

    Workplace = Field() #工作地点

    Workyear = Field() #要求工作经验

    Education = Field() #要求学历

    RecruitNumbers = Field() #招聘人数

    ReleaseTime = Field() #发布时间

    Language = Field() #要求语言

    Specialty = Field() #要求专业

    PositionAdvantage = Field() #职位福利

    2.4 编写爬虫主程序

    在zhaopinSpider.py文件中编写爬虫主程序

    importscrapyfrom scrapy.selector importSelectorfrom scrapy.spiders importCrawlSpiderfrom scrapy.http importRequestfrom zhaopin.items importzhaopinItemclassZhaoPinSpider(scrapy.Spider):

    name= "ZhaoPinSpider"allowed_domains= ['zhaopin.com']

    start_urls= ['https://xxxx.com/list/2,{0}.html?'.format(str(page)) for page in range(1, 217)]defparse(self, response):'''开始第一页

    :param response:

    :return:'''

    yieldRequest(

    url=response.url,

    callback=self.parse_job_url,

    meta={},

    dont_filter=True

    )defparse_job_url(self, response):'''获取每页的职位详情页url

    :param response:

    :return:'''selector=Selector(response)

    urls= selector.xpath('//div[@class="el"]/p/span')for url inurls:

    url= url.xpath('a/@href').extract()[0]yieldRequest(

    url=url,

    callback=self.parse_job_info,

    meta={},

    dont_filter=True

    )defparse_job_info(self, response):'''解析工作详情页

    :param response:

    :return:'''item=Job51Item()

    selector=Selector(response)

    JobTitle= selector.xpath('//div[@class="cn"]/h1/text()').extract()[0].strip().replace(' ','').replace(',',';')

    CompanyName= selector.xpath('//div[@class="cn"]/p[1]/a[1]/text()').extract()[0].strip().replace(',',';')

    CompanyNature= selector.xpath('//div[@class="tCompany_sidebar"]/div/div[2]/p[1]/text()').extract()[0].strip().replace(',',';')

    CompanySize= selector.xpath('//div[@class="tCompany_sidebar"]/div/div[2]/p[2]/text()').extract()[0].strip().replace(',',';')

    IndustryField= selector.xpath('//div[@class="tCompany_sidebar"]/div/div[2]/p[3]/text()').extract()[0].strip().replace(',',';')

    Salary= selector.xpath('//div[@class="cn"]/strong/text()').extract()[0].strip().replace(',',';')

    infos= selector.xpath('//div[@class="cn"]/p[2]/text()').extract()

    Workplace= infos[0].strip().replace('  ','').replace(',',';')

    Workyear= infos[1].strip().replace('  ','').replace(',',';')if len(infos) == 4:

    Education= ''RecruitNumbers= infos[2].strip().replace('  ', '').replace(',',';')

    ReleaseTime= infos[3].strip().replace('  ', '').replace(',',';')else:

    Education= infos[2].strip().replace('  ', '').replace(',',';')

    RecruitNumbers= infos[3].strip().replace('  ', '').replace(',',';')

    ReleaseTime= infos[4].strip().replace('  ', '').replace(',',';')if len(infos) == 7:

    Language, Specialty= infos[5].strip().replace('  ',''), infos[6].strip().replace('  ','').replace(',',';')elif len(infos) == 6:if (('英语' in infos[5]) or ('话' in infos[5])):

    Language, Specialty= infos[5].strip().replace('  ','').replace(',',';'), ''

    else:

    Language, Specialty= '', infos[5].strip().replace('  ','').replace(',',';')else:

    Language, Specialty= '', ''Welfare= selector.xpath('//div[@class="t1"]/span/text()').extract()

    PositionAdvantage= ';'.join(Welfare).replace(',', ';')

    item['JobTitle'] =JobTitle

    item['CompanyName'] =CompanyName

    item['CompanyNature'] =CompanyNature

    item['CompanySize'] =CompanySize

    item['IndustryField'] =IndustryField

    item['Salary'] =Salary

    item['Workplace'] =Workplace

    item['Workyear'] =Workyear

    item['Education'] =Education

    item['RecruitNumbers'] =RecruitNumbers

    item['ReleaseTime'] =ReleaseTime

    item['Language'] =Language

    item['Specialty'] =Specialty

    item['PositionAdvantage'] =PositionAdvantageyield item

    2.5 保存到csv文件

    通过pipelines项目管道保存至csv文件

    classJob51Pipeline(object):defprocess_item(self, item, spider):

    with open(r'D:\Data\ZhaoPin.csv','a', encoding = 'gb18030') as f:

    job_info= [item['JobTitle'], item['CompanyName'], item['CompanyNature'], item['CompanySize'], item['IndustryField'], item['Salary'], item['Workplace'], item['Workyear'], item['Education'], item['RecruitNumbers'], item['ReleaseTime'],item['Language'],item['Specialty'],item['PositionAdvantage'],'\n']

    f.write(",".join(job_info))return item

    2.6 配置setting

    设置用户代理, 下载延迟0.5s, 关闭cookie追踪, 调用pipelines

    USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'DOWNLOAD_DELAY= 0.5COOKIES_ENABLED=False

    ITEM_PIPELINES={'job51.pipelines.Job51Pipeline': 300,

    }

    2.7 运行程序

    新建main.py文件, 并执行以下代码

    from scrapy importcmdline

    cmdline.execute('scrapy crawl zhaopin'.split())

    这样开始了数据爬取, 最终爬取到9000多条数据, 在分析这些数据之前, 先看看数据都是什么样, 进入数据概览环节.

    3. 数据概览

    3.1 读取数据

    importpandas as pd

    df= pd.read_csv(r'D:\aPython\Data\DataVisualization\shujufenxishiJob51.csv')#由于原始数据中没有字段, 需要为其添加字段

    df.columns = ['JobTitle','CompanyName','CompanyNature','CompanySize','IndustryField','Salary','Workplace','Workyear','Education','RecruitNumbers', 'ReleaseTime','Language','Specialty','PositionAdvantage']

    df.info()

    抛出异常: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte

    解决办法; 用Notepad++将编码转换为utf-8 bom格式

    转换之后, 再次执行

    抛出异常: ValueError: Length mismatch: Expected axis has 15 elements, new values have 14 elements

    解决办法: 在列表['JobTitle.....PositionAdvantage']后面追加'NNN', 从而补齐15个元素.

    追加之后, 再次执行, 执行结果为:

    RangeIndex: 9948 entries, 0 to 9947

    Data columns (total 15 columns):

    JobTitle 9948 non-null object

    CompanyName 9948 non-null object

    CompanyNature 9948 non-null object

    CompanySize 9948 non-null object

    IndustryField 9948 non-null object

    Salary 9948 non-null object

    Workplace 9948 non-null object

    Workyear 9948 non-null object

    Education 7533 non-null object

    RecruitNumbers 9948 non-null object

    ReleaseTime 9948 non-null object

    Language 901 non-null object

    Specialty 814 non-null object

    PositionAdvantage 8288 non-null object

    NNN 0 non-null float64

    dtypes: float64(1), object(14)

    memory usage: 1.1+ MB

    可以了解到的信息: 目前的数据维度9948行X15列,  Education, Language, Specialty, PositionAdvantage有不同程度的缺失(NNN是最后添加, 仅仅是用来补齐15元素), 14个python对象(1个浮点型)

    3.2 描述性统计

    由于我们所需信息的数据类型都是python对象, 故使用以下代码

    #注意是大写的字母o

    df.describe(include=['O'])

    从以下信息(公司名称部分我没有截图)中可以得到:

    职位名称中'数据分析师'最多, 多为民营公司, 公司规模150-500人最多, 行业领域金融/投资/证券最多, 薪资中6-8千/月最多,  大多对工作经验没有要求, 学历要求多为本科, 多数均招1人等信息.

    职位名称的种类就有4758种, 他们都是我们本次分析的数据分析师岗位吗, 先来确认下:

    zhaopin.JobTitle.unique()

    array(['零基础免费培训金融外汇数据分析师', '数据分析师(周末双休+上班舒适)', '数据分析师', ...,

    '数据分析实习(J10635)', '数据分析实习(J10691)', '数据分析实习(J10713)'], dtype=object)

    这仅仅显示了职位名称中的一部分,而且还都符合要求, 换种思路先看20个

    JobTitle = zhaopin.groupby('JobTitle', as_index=False).count()

    JobTitle.JobTitle.head(20)

    0 (AI)机器学习开发工程师讲师

    1 (ID67391)美资公司数据分析

    2 (ID67465)美资公司数据分析

    3 (ID67674)500强法资汽车制造商数据分析专员(6个月)

    4 (ID67897)知名500强法资公司招聘数据分析专员

    5 (Senior)DataAnalyst

    6 (免费培训)数据分析师+双休+底薪

    7 (实习职位)BusinessDataAnalyst/业务数据分析

    8 (急)人力销售经理

    9 (提供食宿)银行客服+双休

    10 (日语)股票数据分析员/EquityDataAnalyst-Japanese/

    11 (越南语)股票数据分析员/EquityDataAnalyst-Vietnam

    12 (跨境电商)产品专员/数据分析师

    13 (韩语)股票数据分析员/EquityDataAnalyst-Korean

    14 ***数据分析

    15 -数据分析师助理/实习生

    16 -数据分析师助理/统计专员+双休五险+住宿

    17 -无销售不加班金融数据分析师月入10k

    18 -金融数据分析师助理6k-1.5w

    19 -金融数据分析师双休岗位分红

    Name: JobTitle, dtype: object

    可以看到还有机器学习开发讲师, 人力销售经理, 银行客服等其他无效数据.

    现在我们对数据有了大致的认识, 下来我们开始数据预处理.

    4. 数据预处理

    4.1 数据清洗

    数据清洗的目的是不让有错误或有问题的数据进入加工过程, 其主要内容包括: 重复值, 缺失值以及空值的处理

    4.1.1 删除重复值

    如果数据中存在重复记录, 而且重复数量较多时, 势必会对结果造成影响, 因此我们应当首先处理重复值.

    #删除数据表中的重复记录, 并将删除后的数据表赋值给zhaopin

    zhaopin = df.drop_duplicates(inplace =False)

    zhaopin.shape

    (8927, 15)

    对比之前的数据, 重复记录1021条.

    4.1.2 过滤无效数据

    我们了解到职位名称中存在无效数据, 我们对其的处理方式是过滤掉.

    #筛选名称中包含'数据'或'分析'或'Data'的职位

    zhaopin = zhaopin[zhaopin.JobTitle.str.contains('.*?数据.*?|.*?分析.*?|.*?Data.*?')]

    zhaopin.shape

    (7959, 15)

    4.1.3 缺失值处理

    在pandas中缺失值为NaN或者NaT, 其处理方式有多种:

    1. 利用均值等集中趋势度量填充

    2. 利用统计模型计算出的值填充

    3. 保留缺失值

    4. 删除缺失值

    #计算每个特征中缺失值个数zhaopin.isnull().sum()

    JobTitle 0

    CompanyName 0

    CompanyNature 0

    CompanySize 0

    IndustryField 0

    Salary 0

    Workplace 0

    Workyear 0

    Education 1740

    RecruitNumbers 0

    ReleaseTime 0

    Language 7227

    Specialty 7244

    PositionAdvantage 1364

    NNN 7959

    dtype: int64

    -- Education: 缺失值占比1740/7959 = 21.86%, 缺失很有可能是"不限学历", 我们就用"不限学历"填充

    zhaopin.Education.fillna('不限学历', inplace=True)

    -- Language: 缺失值占比7227/7959 = 90.80%, 缺失太多, 删除特征

    -- Specialty: 缺失值占比7244/7959 = 91.02%, 同样缺失很多, 删除

    zhaopin.drop(['Specialty','Language'], axis=1, inplace = True)

    -- PositionAdvantage: 缺失占比1364/7959 = 17.14%, 选用众数中的第一个'五险一金'填充

    zhaopin.PositionAdvantage.fillna(zhaopin.PositionAdvantage.mode()[0], inplace = True)

    -- NNN: 没有任何意义, 直接删除

    zhaopin.drop(["NNN"], axis=1, inplace = True)

    最后, 检查缺失值是否处理完毕

    zhaopin.isnull().sum()

    JobTitle 0

    CompanyName 0

    CompanyNature 0

    CompanySize 0

    IndustryField 0

    Salary 0

    Workplace 0

    Workyear 0

    Education 0

    RecruitNumbers 0

    ReleaseTime 0

    PositionAdvantage 0

    dtype: int64

    4.2 数据加工

    由于现有的数据不能满足我们的分析需求, 因此需要对现有数据表进行分列, 计算等等操作.

    需要处理的特征有: Salary, Workplace

    1. Salary

    将薪资分为最高薪资和最低薪资, 另外了解到薪资中单位有元/小时, 元/天, 万/月, 万/年, 千/月, 统一将其转化为千/月

    importre#将5种单元进行编号

    zhaopin['Standard'] = np.where(zhaopin.Salary.str.contains('元.*?小时'), 0,

    np.where(zhaopin.Salary.str.contains('元.*?天'), 1,

    np.where(zhaopin.Salary.str.contains('千.*?月'), 2,

    np.where(zhaopin.Salary.str.contains('万.*?月'), 3,4))))#用'-'将Salary分割为LowSalary和HighSalary

    SalarySplit = zhaopin.Salary.str.split('-', expand =True)

    zhaopin['LowSalary'], zhaopin['HighSalary'] = SalarySplit[0], SalarySplit[1]#Salary中包含'以上', '以下'或者两者都不包含的进行编号

    zhaopin['HighOrLow'] = np.where(zhaopin.LowSalary.str.contains('以.*?下'), 0,

    np.where(zhaopin.LowSalary.str.contains('以.*?上'), 2,1))#匹配LowSalary中的数字, 并转为浮点型

    Lower = zhaopin.LowSalary.apply(lambda x: re.search('(\d+\.?\d*)', x).group(1)).astype(float)#对LowSalary中HighOrLow为1的部分进行单位换算, 全部转为'千/月'

    zhaopin.LowSalary = np.where(((zhaopin.Standard==0)&(zhaopin.HighOrLow==1)), Lower*8*21/1000,

    np.where(((zhaopin.Standard==1)&(zhaopin.HighOrLow==1)), Lower*21/1000,

    np.where(((zhaopin.Standard==2)&(zhaopin.HighOrLow==1)), Lower,

    np.where(((zhaopin.Standard==3)&(zhaopin.HighOrLow==1)), Lower*10,

    np.where(((zhaopin.Standard==4)&(zhaopin.HighOrLow==1)), Lower/12*10,

    Lower)))))#对HighSalary中的缺失值进行填充, 可以有效避免匹配出错.

    zhaopin.HighSalary.fillna('0千/月', inplace =True)#匹配HighSalary中的数字, 并转为浮点型

    Higher = zhaopin.HighSalary.apply(lambda x: re.search('(\d+\.?\d*).*?', str(x)).group(1)).astype(float)#对HighSalary中HighOrLow为1的部分完成单位换算, 全部转为'千/月'

    zhaopin.HighSalary = np.where(((zhaopin.Standard==0)&(zhaopin.HighOrLow==1)),zhaopin.LowSalary/21*26,

    np.where(((zhaopin.Standard==1)&(zhaopin.HighOrLow==1)),zhaopin.LowSalary/21*26,

    np.where(((zhaopin.Standard==2)&(zhaopin.HighOrLow==1)), Higher,

    np.where(((zhaopin.Standard==3)&(zhaopin.HighOrLow==1)), Higher*10,

    np.where(((zhaopin.Standard==4)&(zhaopin.HighOrLow==1)), Higher/12*10,

    np.where(zhaopin.HighOrLow==0, zhaopin.LowSalary,

    zhaopin.LowSalary))))))#查看当HighOrLow为0时, Standard都有哪些, 输出为2, 4

    zhaopin[zhaopin.HighOrLow==0].Standard.unique()#完成HighOrLow为0时的单位换算

    zhaopin.loc[(zhaopin.HighOrLow==0)&(zhaopin.Standard==2), 'LowSalary'] = zhaopin[(zhaopin.HighOrLow==0)&(zhaopin.Standard==2)].HighSalary.apply(lambda x: 0.8*x)

    zhaopin.loc[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4), 'HighSalary'] = zhaopin[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4)].HighSalary.apply(lambda x: x/12*10)

    zhaopin.loc[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4), 'LowSalary'] = zhaopin[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4)].HighSalary.apply(lambda x: 0.8*x)#查看当HighOrLow为2时, Srandard有哪些, 输出为4

    zhaopin[zhaopin.HighOrLow==2].Standard.unique()#完成HighOrLow为2时的单位换算

    zhaopin.loc[zhaopin.HighOrLow==2, 'LowSalary'] = zhaopin[zhaopin.HighOrLow==2].HighSalary.apply(lambda x: x/12*10)

    zhaopin.loc[zhaopin.HighOrLow==2, 'HighSalary'] = zhaopin[zhaopin.HighOrLow==2].LowSalary.apply(lambda x: 1.2*x)

    zhaopin.LowSalary , zhaopin.HighSalary = zhaopin.LowSalary.apply(lambda x: '%.1f'%x), zhaopin.HighSalary.apply(lambda x: '%.1f'%x)

    2. Workplace

    对工作地区进行统一

    #查看工作地有哪些

    zhaopin.Workplace.unique()#查看工作地点名字中包括省的有哪些, 结果显示全部为xx省, 且其中不会出现市级地区名

    zhaopin[zhaopin.Workplace.str.contains('省')].Workplace.unique()#将地区统一到市级

    zhaopin['Workplace'] = zhaopin.Workplace.str.split('-', expand=True)[0]

    3. 删除重复多余信息

    zhaopin.drop(['Salary','Standard', 'HighOrLow'], axis = 1, inplace =True)

    到目前为止, 我们对数据处理完成了, 接下来就是分析了.

    5. 可视化分析

    5.1 企业类型

    importmatplotlibimportmatplotlib.pyplot as plt

    CompanyNature_Count=zhaopin.CompanyNature.value_counts()#设置中文字体

    font = {'family': 'SimHei'}

    matplotlib.rc('font', **font)

    fig= plt.figure(figsize = (8, 8))#绘制饼图, 参数pctdistance表示饼图内部字体离中心距离, labeldistance则是label的距离, radius指饼图的半径

    patches, l_text, p_text = plt.pie(CompanyNature_Count, autopct = '%.2f%%', pctdistance = 0.6, labels = CompanyNature_Count.index, labeldistance=1.1, radius = 1)

    m , n= 0.02, 0.028

    for t in l_text[7: 11]:

    t.set_y(m)

    m+= 0.1

    for p in p_text[7: 11]:

    p.set_y(n)

    n+= 0.1plt.title('数据分析岗位中各类型企业所占比例', fontsize=24)

    可以看出招聘中主要以民营企业, 合资企业和上市公司为主.

    5.2 企业规模

    CompanySize_Count =zhaopin.CompanySize.value_counts()

    index, bar_width= np.arange(len(CompanySize_Count)), 0.6fig= plt.figure(figsize = (8, 6))

    plt.barh(index*(-1)+bar_width, CompanySize_Count, tick_label = CompanySize_Count.index, height =bar_width)#添加数据标签

    for x,y inenumerate(CompanySize_Count):

    plt.text(y+0.1, x*(-1)+bar_width, '%s'%y, va = 'center')

    plt.title('数据分析岗位各公司规模总数分布条形图', fontsize = 24)

    招聘数据分析岗位的公司规模主要以50-500人为主

    5.3 地区

    from pyecharts importGeofrom collections importCounter#统计各地区出现次数, 并转换为元组的形式

    data =Counter(place).most_common()#生成地理坐标图

    geo =Geo("数据分析岗位各地区需求量", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')

    attr, value=geo.cast(data)#添加数据点

    geo.add('', attr, value, visual_range=[0, 100],visual_text_color='#fff', symbol_size=5, is_visualmap=True, is_piecewise=True)

    geo.show_config()

    geo.render()

    可以看出北上广深等经济相对发达的地区, 对于数据分析岗位的需求量大.

    参考自: https://blog.csdn.net/qq_41841569/article/details/82811153?utm_source=blogxgwz1

    5.4 学历和工作经验

    fig, ax = plt.subplots(1, 2, figsize = (18, 8))

    Education_Count=zhaopin.Education.value_counts()

    Workyear_Count=zhaopin.Workyear.value_counts()

    patches, l_text, p_text= ax[0].pie(Education_Count, autopct = '%.2f%%', labels =Education_Count.index )

    m= -0.01

    for t in l_text[6:]:

    t.set_y(m)

    m+= 0.1

    print(t)for p in p_text[6:]:

    p.set_y(m)

    m+= 0.1ax[0].set_title('数据分析岗位各学历要求所占比例', fontsize = 24)

    index, bar_width= np.arange(len(Workyear_Count)), 0.6ax[1].barh(index*(-1) + bar_width, Workyear_Count, tick_label = Workyear_Count.index, height =bar_width)

    ax[1].set_title('数据分析岗位工作经验要求', fontsize= 24)

    学历要求多以本科,大专为主, 工作经验要求中无工作经验要求为主, 可见招聘主要面向的是应届毕业生.

    5.4 薪资水平

    1. 薪资与岗位需求关系

    fig = plt.figure(figsize = (9,7))#转换类型为浮点型

    zhaopin.LowSalary, zhaopin.HighSalary =zhaopin.LowSalary.astype(float), zhaopin.HighSalary.astype(float)#分别求各地区平均最高薪资, 平均最低薪资

    Salary = zhaopin.groupby('Workplace', as_index = False)['LowSalary', 'HighSalary'].mean()#分别求各地区的数据分析岗位数量,并降序排列

    Workplace = zhaopin.groupby('Workplace', as_index= False)['JobTitle'].count().sort_values('JobTitle', ascending =False)#合并数据表

    Workplace = pd.merge(Workplace, Salary, how = 'left', on = 'Workplace')#用前20名进行绘图

    Workplace = Workplace.head(20)

    plt.bar(Workplace.Workplace, Workplace.JobTitle, width= 0.8, alpha = 0.8)

    plt.plot(Workplace.Workplace, Workplace.HighSalary*1000, '--',color = 'g', alpha = 0.9, label='平均最高薪资')

    plt.plot(Workplace.Workplace, Workplace.LowSalary*1000, '-.',color = 'r', alpha = 0.9, label='平均最低薪资')#添加数据标签

    for x, y in enumerate(Workplace.HighSalary*1000):

    plt.text(x, y,'%.0f'%y, ha = 'left', va='bottom')for x, y in enumerate(Workplace.LowSalary*1000):

    plt.text(x, y,'%.0f'%y, ha = 'right', va='bottom')for x, y inenumerate(Workplace.JobTitle):

    plt.text(x, y,'%s'%y, ha = 'center', va='bottom')

    plt.legend()

    plt.title('数据分析岗位需求量排名前20地区的薪资水平状况', fontsize = 20)

    可以看出, 随着需求量的减少, 薪资水平也有所降低.

    2. 薪资与经验关系

    #求出各工作经验对应的平均最高与平均最低薪资

    Salary_Year = zhaopin.groupby('Workyear', as_index = False)['LowSalary', 'HighSalary'].mean()#求平均薪资

    Salary_Year['Salary'] = (Salary_Year.LowSalary.add(Salary_Year.HighSalary)).div(2)#转换列, 得到想要的顺序

    Salary_Year.loc[0], Salary_Year.loc[6] = Salary_Year.loc[6], Salary_Year.loc[0]#绘制条形图

    plt.barh(Salary_Year.Workyear, Salary_Year.Salary, height = 0.6)for x, y inenumerate(Salary_Year.Salary):

    plt.text(y+0.1,x, '%.2f'%y, va = 'center')

    plt.title('各工作经验对应的平均薪资水平(单位:千/月)', fontsize = 20)

    工作经验越丰富, 薪资越高.

    3. 薪资与学历关系

    #计算平均薪资

    Salary_Education = zhaopin.groupby('Education', as_index = False)['LowSalary', 'HighSalary'].mean()

    Salary_Education['Salary'] = Salary_Education.LowSalary.add(Salary_Education.HighSalary).div(2)

    Salary_Education= Salary_Education.sort_values('Salary', ascending =True)#绘制柱形图

    plt.bar(Salary_Education.Education, Salary_Education.Salary, width = 0.6)for x,y inenumerate(Salary_Education.Salary):

    plt.text(x, y,'%.2f'%y, ha = 'center', va='bottom')

    plt.title('各学历对应的平均工资水平(单位:千/月)', fontsize = 20)

    学历越高, 对应的薪资水平越高

    总结

    1. 数据分析岗位中企业类型以民营企业, 合资企业和上市公司为主, 企业规模多为50-500人.

    2. 数据分析岗位的学历要求以本科,大专为主, 经验中无工作经验占多数, 可见主要面向的是应届毕业生.

    3. 北上广深杭等经济相对发达的地区对数据分析岗位的需求量大, 且薪资水平较高于其他地区; 学历越高, 经验越丰富对应的薪资水平也会增高.

    标签:

    版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

    展开全文
  • 关于主要城市数据分析岗位招聘信息的分析前言分析思路 前言 随着互联网的飞速发展,用户积累的数据越来越多,企业从大数据中挖掘有价值的信息似乎成了主流,加上各种营销,导致许多人想转行数据分析师,认为入门门槛...

    前言

    随着互联网的飞速发展,用户积累的数据越来越多,企业从大数据中挖掘有价值的信息似乎成了主流,加上各种营销,导致许多人想转行数据分析师,认为入门门槛相对较低、工资高于大多传统行业岗位,当然我也是其中一个,为了避免被各种营销带节奏,还是分析了解一下数据分析师目前的大概行情吧,比如薪资待遇如何,工作内容是什么,去哪座城市机会好等等。

    使用工具:Xmind(思维导图)、Excel(数据处理清洗)、Tableau(数据可视化)、Pycharm(词云)

    数据来源:Kesci网(【爬遍拉钩,带你看看数据分析师的真实现状】

    分析思路

    在这里插入图片描述

    数据获取

    目前,还没学习爬虫,使用他人爬取数据进行分析。

    打开Kesci网,注册账号,搜索下载数据集。

    数据清洗加工

    打开结果如下:
    在这里插入图片描述

    删除无效数据

    使用排序和删除重复值功能将无用数据和缺失值较多的行列删除并去重。

    在这里插入图片描述

    数据加工

    删除无用重复数据后,对数据进一步加工,比如说薪资6K-12K,拆分为最低薪资、最高薪资、平均薪资。

    • 薪资:最低薪资、最高薪资、平均薪资(转化为数值)
    1.利用FIND、LEFT、MID函数提取最高和最低薪资
    最低薪资 = LEFT(H2,FIND("-",H2,1)-1)
    最高薪资 = MID(H2,FIND("-",H2,1)+1,3)
    
    2.利用SUBSTITUTE函数将薪资转换为数值
    最低薪资 = SUBSTITUTE(I2,"k","")*1000
    最高薪资 = SUBSTITUTE(K2,"k","")*1000
    
    3.求平均薪资
    平均薪资 = (J2+L2)*0.5
    

    结果如下:
    在这里插入图片描述

    • 公司领域:只保留第一个主要所属行业。

    观察这一列数据,发现行业之间用逗号(“,”)空格(“ ”),竖线(“丨”)分开,直接用分列功能进行加工,保留第一个行业信息。
    在这里插入图片描述
    最终加工结果如下:
    在这里插入图片描述

    数据分析

    公司分析

    位置分布

    在这里插入图片描述
    颜色越红,圆形越大,说明招聘岗位数量越多。从图中可以看出,招聘数据分析岗位的公司主要分布在北京、成都、武汉、上海等城市,大多数岗位分布在南方中部及沿海一线发达城市。

    融资情况

    在这里插入图片描述
    其中不需要融资和为融资的公司需求量大一些,其他发展阶段的公司需求比较均匀。

    行业分布

    在这里插入图片描述
    目前,是互联网+大数据时代,许多公司的用户会产生大量数据,需要相关人才利用数据去驱动业务,为企业创造价值,所以来说这些行业数据分析师需求大,入职这些行业的机会也比较多。

    岗位分析

    学历要求

    在这里插入图片描述

    数据分析岗位的主要要求学历是本科,可能是以下两点原因:

    1.该行业涉及高等数学、各种业务知识等,要求知识水平高。

    2.行业更新发展快,需要应聘者有较高的学习能力。

    工作经验

    在这里插入图片描述
    从图中得知数据分析岗位经验主要集中在1-5年,企业偏招聘3-5年工作经验的数据分析师,可能由于业务能力各方面比较成熟,能够为企业创造更多的价值,而1-3年工作经验的数据分析师,业务能力相对弱一些,可能作为重点培养对象。

    做到这里的时候,心里面哇凉哇凉的,像我这种没有工作经验的转行应届毕业生该何去何从,数量占比还不到10%。

    职业诱惑

    python代码如下:

    import matplotlib.pyplot as plt
    from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
    import jieba
    import numpy as np
    from PIL import Image
    
    text = open(r'C:\Users\Administrator\Desktop\gwyq.txt').read()
    
    wordlist = jieba.cut(text,cut_all = True)  #分词
    wl = " ".join(wordlist)
    wc = WordCloud(
        scale=4,
        width=1000,                 #设置图片宽度
        height= 800,                #设置图片高度
        background_color = 'white', #设置图片背景颜色
        max_words = 20,				#设置词语数目							
        stopwords = STOPWORDS,      #停用词 默认
        max_font_size = 200,		#设置最大字号
        margin= 1,					#设置词语边缘
        font_path = "C:\Windows\Fonts\simfang.ttf", #设置字体
    
    )
    wc.generate(wl)
    
    image_colors = ImageColorGenerator(backgrim)
    plt.rcParams['figure.dpi'] = 10000     #设置清晰度,原来默认dpi100
    plt.rcParams['savefig.dpi'] = 10000
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    wc.to_file('cy1.png') # 导出当前文件夹
    

    在这里插入图片描述
    大部分公司拥有双休、带薪休假、年终奖这些诱惑。

    岗位要求

    python代码如下:

    import matplotlib.pyplot as plt
    from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
    from PIL import Image
    
    text = open(r'C:\Users\Administrator\Desktop\gwyq.txt').read()
    ws = set(STOPWORDS)    # 设置屏蔽词语
    ws.add("岗位职责")
    ws.add("任职资格")
    ws.add("任职要求")
    ws.add("岗位要求")
    ws.add("工作职责")
    ws.add("职位描述")
    ws.add("职位要求")
    ws.add("数据分析")
    ws.add("数据挖掘")
    ws.add("数据运营")
    wc = WordCloud(
        scale=4,
        width=1000,
        height= 800,
        background_color = 'white',
        max_words = 100,
        stopwords = ws,
        max_font_size = 200,
        margin= 1,
        font_path = "C:\Windows\Fonts\simfang.ttf",
    )
    wc.generate(text)
    
    plt.rcParams['figure.dpi'] = 10000
    plt.rcParams['savefig.dpi'] = 10000
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    wc.to_file('cy2.png')
    
    

    在这里插入图片描述
    对于岗位要求这一块,涉及到SQL、Python、BI、SPSS等数据分析工具,对应聘者的学历和数学知识也有一定的要求。

    薪资分析

    薪资与城市

    在这里插入图片描述
    对于这几个主要城市来说,其中北京、杭州、上海、深圳这几个城市的工资要高于总体的平均工资,这几个城市是经济发展最强的城市,人才聚集,薪资偏高,如果想要高薪职业,可以优先考虑选择这几个城市,当然竞争压力和生活压力也会很大。

    城市、经验与薪资

    考虑到北京、成都、武汉、上海这四个城市招聘岗位多,就业机会大,下面以这四个城市分析。
    在这里插入图片描述
    根据自己的工作经验和所在城市估计自己大概的期望薪资,如果自己的工作年限范围工资偏低,可选择性跳槽。

    城市、行业与薪资

    同上,重点以招聘岗位较多的行业为主进行分析。

    在这里插入图片描述
    如果是进入金融行业做数据分析,优先考虑上海。其他行业的数据分析,去北京待遇更好。

    分析总结

    综合上面的分析,提出以下建议:

    1.数据分人员需要掌握一些技能,比如SQL、Python、SPSS等工具。

    2.就业城市可以优先考虑去北京,就业机会大、待遇好。

    3.应届毕业生、转行人员向自己相关行业转行,以学习经验为主。

    4.1-3年工作人员需要提升自身的业务能力及分析能力才能更好的竞争高薪;3-5年的工作经验的人员,在某个领域已经有很深的资历,可以考虑管理岗发展。

    展开全文
  • 某招聘网爬取的数据分析数据,有助于想转数据分析岗位的新手入手分析行业。
  • 数据分析岗位需求分析报告

    千次阅读 2018-09-05 18:09:09
    5.数据分析岗位分布情况 5.1公司的城市分布 5.2公司的融资情况  5.3岗位福利状况  ​ 6.数据分析岗位的发展状况 6.1各城市平均薪资待遇 6.2不同融资阶段平均工资待遇 7.数据分析师岗位招聘要求 7.1统计量...

    1.前言

    2.用到的工具

    3.网页结构分析

    4.数据预处理

    5.数据分析岗位分布情况

    5.1公司的城市分布

    5.2公司的融资情况 

    5.3岗位福利状况 

    ​ 6.数据分析岗位的发展状况

    6.1各城市平均薪资待遇

    6.2不同融资阶段平均工资待遇

    7.数据分析师岗位招聘要求

    7.1统计量描述 

    7.2学历与职位需求

    7.3学历水平与工资

    7.4工作经验与职位需求

    7.5工作经验与工资

    8.附录(详细代码):

    8.1数据特征部分代码

    8.2数据预处理部分代码 

    8.3绘制词云图

    8.4数据分析岗位要求部分代码

    8.5拉勾网数据爬取部分代码

    1.前言

    "大数据",这个字眼是近几年比较火的一个名词,数据的价值正在各行各业发挥着越来越大的价值,销售行业通过销售数据的分析,对客户行为的画像(给客户贴标签),指定相应的销售策略提高销售业绩;以淘宝、京东商城等为代表的电商平台通过客户的购买行为,自动推荐符合客户"需求"的产品;以信贷公司、银行业等为主的金融公司通过分析客户的信用评估,对客户进行分级"打分",优先放款给"优质客户",等等。似乎,正在以一种偶像般的存在,影响着每一个人、每一个行业,鼓动着每一个"蠢蠢欲动"的人。然而,大多数的时候这个名词都被人误解或者过分渲染了。"管它黑猫白猫,能抓住老鼠的都是好猫",换句话说:管它是大数据还是一般数据,能支持经营管理决策的都是好数据。所以,从企业自身而言,首要任务是充分利用自身数据,推动经营决策。而对于个人,应该充分结合实际情况,认真做好自己的职业规划,而不是盲目跟风。结合自身的优势,忠于企业和个人,尽最大限度的发挥自身价值为企业和社会贡献出自己的一份力量。

    本文笔者以一名正在转行路上的身份,爬取了拉勾网数据分析职位的前100页,共计1500条的招聘信息,通过数据挖掘,统计建模等方法,对数据分析职位特点及现状做一个分析。

    2.用到的工具

    Spyder3.6

    requests: 下载网页

    pandas:数据分析库

    numpy:数组操作

    matplotlib:绘图

    wordcloud、jieba:生成中文词云

    rcParams:使绘图能显示中文字体

    3.网页结构分析

    打开搜狗高速浏览器,在拉勾网首页搜索的“数据分析”职位,鼠标右击查看网页源文件,通过搜索相关关键字可以发现, 职位信息并不在源代码里。进一步抓包分析,点击审查元素(快捷键F12),可以发现职位信息隐藏于JSON的文件里,结合数据格式,我们选择用字典方法直接读取数据。


    运行程序得到如下数据:(代码见附录)
    因为文件是csv格式文件,建议用notepad或者WPS打开(直接用office Excel不支持会出现乱码)

    4.数据预处理

    为了保证后续分析的正常进行,需要对数据进行预处理。观看数据可以得出如下操作步骤:
    (1).数据分析职位中可能存在"实习生岗位",需要对其进行剔除。
    (2).表中的"工作经验"属于范围值,在此对其进行平均化处理。
    (3).表中的"工资"也属于范围,在此也对其进行平均化处理,取中间值。
    (4).删除冗余列,保存到新的表格。
    处理后得到如下数据表:(代码见附录)

    5.数据分析岗位分布情况

    5.1公司的城市分布

    由下图可以看出:北京数据分析师岗位需求占据了47.2%,上海地区21.9%,杭州地区9.6%,深圳地区8.6%,广州地区,南京地区等地区的岗位需=需求量紧随其后,基本上主要集中在一线城市和强二线城市中。


    5.2公司的融资情况 

    下图中可以看出,在招聘公司中:不需要融资的公司、上市公司、C轮融资阶段的公司对数据分析师的岗位需求量最大,A轮、D轮、B轮、未融资等阶段的公司紧随其后。说明发展相对成熟,稳健的公司有更大可能性需要数据分析岗位的人才。

    5.3岗位福利状况 

    针对爬取的拉勾网数据的职位福利,,进行jieba分词,并制作词云。出现频率最高的依次是:弹性工作、发展空间、氛围、工资等,从图中词频的频率可以看出,招聘岗位更注重职位的发展与员工的体验,其次是工资水平与各类奖金。

     
    6.数据分析岗位的发展状况

    6.1各城市平均薪资待遇

    从图中可以看出各城市平均工资最高的是北京20.1469,其次上海、杭州、深圳、广州、南京、紧随其后,其中长春的平均工资值得商榷,因为从上数据分析师岗位需求上来看,长春的数据分析师需求量非常小。在此处作为异常值处理。

    6.2不同融资阶段平均工资待遇

    由下图可以看出,不同融资阶段公司对数据分析师给出的平均薪资略有不同,D轮、C轮、B轮、上市公司平均工资相对较大y一些。

    7.数据分析师岗位招聘要求

    7.1统计量描述 

    count    1469.000000
    mean        3.167461
    std         1.909803
    min         0.000000
    25%         2.000000
    50%         4.000000
    75%         4.000000
    max         7.500000
    工作年限平均值为3.167年,中位数是4年,大致可以说明企业要求有一定工作经验的占据多数。
    mean       17.497958
    std         8.431887
    min         1.500000
    25%        11.500000
    50%        15.000000
    75%        22.500000
    max        80.000000
    平均工作为8.431k,中位数为15k,大致可以看出,地区间存在两级分化比较严重,岗位偏集中,工资偏两极。下面作进一步分析。

    7.2学历与职位需求

    由下图比例可以看出,招聘单位85.7%要求入门是本科学历,本科学历数据分析岗市场需求量第一,大专学历7.3%排名第二,相应的硕士学历反而要求不高。也从间接的方面看出,公司可能更看重数据分析的经验能力。

    7.3学历水平与工资

    可以看出,数据分析师岗位学历水平与平均薪资成正比关系,学历越高,工资越高,硕士工资20k左右,本科平均工资17.5k左右,相差不大,但是大专学历平均工资却只有10k左右。差距较为明显。平时好好学习还是有一定好处的(哈哈)。

    7.4工作经验与职位需求

    表中可以看出工作经验与职位需求成正比关系。3-5年和1-3年的数据分析师岗位需求量最大,前者占比43.6%,后者占比35.1%,说明数据分析岗位更看重数据分析经验。企业所需培养的成本相对较小,所以企业更愿意招揽此类人才。相对应的,经验过少和5-10年的工作者是两个极端,无工作经验或者1年以下的求职者培养起来需要更大的成本。后者则需要更大的招聘成本。

     

    7.5工作经验与工资

    由下图可看出:工作经验与平均工资水平成正比,相关工作年限越长,平均工资也越高。

     

    8.附录(详细代码):

    8.1数据特征部分代码

    import pandas as pd  
    import matplotlib.pyplot as plt
    # 读取数据  
    df = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8')  #读取数据,编码处理
    #1.统计量描述
    fb=df['经验'].describe()
    fb2=df['平均工资'].describe()
    print(fb,fb2)  #输出统计量
    plt.rcParams['font.sans-serif']=['SimHri']  #用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] ## 指定默认字体:解决plot不能显示中文问题
    #2.绘制城市分布的饼图(取前10)
    count = df['城市'].value_counts() 
    count=count[0:10]       #取序列前10的城市绘制饼图
    plt.pie(count, labels = count.keys() ,labeldistance=1.4,autopct='%2.1f%%') 
    plt.axis('equal')  # 使饼图为正圆形  
    plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))  #添加图例,并设置图例位置
    plt.savefig('location.jpg')  
    plt.show() 
    #2.绘制城市分布的柱状图,柱状图绘制前15名
    count1 = df['城市'].value_counts() 
    count1=count1[0:15]       #取序列前15的城市绘制柱状图
    plt.bar(count1.keys(),count1)
    plt.savefig('城市柱状图15名.jpg')  
    plt.show() 
    #3.绘制融资阶段柱状图
    count2 = df['融资阶段'].value_counts()
    plt.bar(count2.keys(),count2)
    plt.savefig('融资阶段分布.jpg')  
    plt.show()
    #4.绘制学历与职位需求的关系
    count3 = df['学历要求'].value_counts() 
    plt.pie(count3, labels = count3.keys() ,labeldistance=1.4,autopct='%2.1f%%') 
    plt.axis('equal')  # 使饼图压缩为正圆形  
    plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))  #添加图例,并设置图例位置
    plt.savefig('学历与职位需求关系.jpg')  
    plt.show() 
    #5.绘制工作经验与职位需求的柱状图
    count4 = df['工作经验'].value_counts() 
    plt.bar(count4.keys(),count4)
    plt.savefig('工作经验与职位需求.jpg')  
    plt.show()
    
    
    

    8.2数据预处理部分代码 

    #数据预处理
    import pandas as pd  
    # 读取数据  
    df = pd.read_csv('D:/baogao/lagou_data.csv', encoding = 'utf-8') 
    # 数据清洗,剔除实习岗位  
    df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)  
    # 正则表达式将csv文件字符串转化为列表,再取区间的均值  
    pattern = '\d+'  
    df['工作年限'] = df['工作经验'].str.findall(pattern)  
    avg_work_year = []  
    for i in df['工作年限']:  
        # 如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0  
        if len(i) == 0:  
            avg_work_year.append(0)  
        # 如果匹配值为一个数值,那么返回该数值  
        elif len(i) == 1:  
            avg_work_year.append(int(''.join(i)))  
        # 如果匹配值为一个区间,那么取平均值  
        else:  
            num_list = [int(j) for j in i]  
            avg_year = sum(num_list)/2  
            avg_work_year.append(avg_year)  
    df['经验'] = avg_work_year 
    df=df.drop('工作年限',1)  #删除工作年限数据列(冗余数据)  
    df['salary'] = df['工资'].str.findall(pattern)  #字符串转化为列表,取区间平均值作为薪资
    avg_salary = []  
    for k in df['salary']:  
        int_list = [int(n) for n in k]  
        avg_wage = (int_list[1]+int_list[0])/2 
        avg_salary.append(avg_wage)  
    df['平均工资']=avg_salary
    df= df.drop('salary',1) #删除salary数据列(冗余数据) 
    df= df.drop('工资',1)  ##删除工资数据列(冗余数据) 
    # 将清洗后的数据保存,以便后续使用  
    df.to_csv('lagou_data2.csv', index = False) 
    
    

    8.3绘制词云图

    #绘制词云图
    import  numpy as np
    from  PIL import  Image
    import  jieba
    from wordcloud import  WordCloud,ImageColorGenerator,STOPWORDS
    import  matplotlib.pyplot as plt
    df = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8')  #读取数据并编码处理
    text = ''  
    for line in df['职位福利']:  
        text += line  #使用jieba模块将字符串分割为单词列表
    f=open("D:/baogao/职位福利.txt","a+")       #以追加的方式创建一个文本文件
    f.write(text)    #写人职位福利文本内容
    f.write("\n")   # 写完通过\n进行换行
    f.close()     #关闭文档
    from random import randint
    #封装改变颜色函数
    def random_color_func(word=None, font_size=None, position=None,  orientation=None, font_path=None, random_state=None):
            h  = randint(120,250)
            s = int(100.0 * 255.0 / 255.0)
            l = int(100.0 * float(randint(60, 120)) / 255.0)
            return "hsl({}, {}%, {}%)".format(h, s, l)
    #用一张图片作为词云的模板
    maskcolud=np.array(Image.open(r"D:/baogao/0.jpg"))
    #打开要生成词云的文字文件的位置
    nedcloudpath=open("D:/baogao/职位福利.txt","rb").read()
    #打开之后用jieba切割
    jiebapath=jieba.cut(nedcloudpath,cut_all=True)
    #以空格为分割
    jiebapathsplit=" ".join(jiebapath)
    #设置词云对应属性
    produCloud=WordCloud(
        width=300,
        height=300,
        background_color="white",
        mask=maskcolud,
        font_path='C:\windows\Fonts\STZHONGS.TTF',
        max_words=200,
        stopwords=STOPWORDS,
        max_font_size=60,
        random_state=50,
        scale=0.5,
        color_func=random_color_func
    ).generate(jiebapathsplit)
    ImageColorGenerator(maskcolud)
    #对词云进行显示
    produCloud.to_file('ciyu.jpg') 
    plt.imshow(produCloud)
    plt.axis("off")
    plt.show()
    
    

    8.4数据分析岗位要求部分代码

    #薪酬影响因素分析
    import pandas as pd  
    import numpy as np
    import matplotlib.pyplot as plt
    # 读取数据  
    df1 = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8')  #原来的gbk不能用!!!
    c1=df1['城市'].count()
    #1.计算学历水平与工资关系,绘制柱状图
    df2=df.groupby('学历要求')['平均工资'].agg([np.mean])  #agg函数分组统计
    count3=pd.Series(df2['mean'],df2.index) #将dataframe数据库转化为序列series
    count3=count3.sort_values(ascending=False)  #降序排列
    plt.title("学历水平与平均薪资")
    plt.xlabel("学历水平")
    plt.ylabel("平均工资")
    plt.bar(count3.keys(),count3)
    plt.savefig('学历与工资关系.jpg')  #保存为图片
    plt.show()
    #2.计算工作经验与平均工资关系
    df3=df.groupby('工作经验')['平均工资'].agg([np.mean])
    count5=pd.Series(df3['mean'],df3.index) #将dataframe数据框转化为序列series
    count5=count5.sort_values(ascending=False)
    plt.title("工作经验与平均薪资")
    plt.xlabel("工作经验")
    plt.ylabel("平均工资")
    plt.bar(count5.keys(),count5)
    plt.savefig('工作经验与平均工资关系.jpg')  
    plt.show()
    #3.计算不同融资阶段的工资水平
    df4=df.groupby('融资阶段')['平均工资'].agg([np.mean])
    count6=pd.Series(df4['mean'],df4.index) #将dataframe转化为序列
    count6=count6.sort_values(ascending=False)
    plt.title("融资阶段与平均薪资")
    plt.xlabel("融资阶段")
    plt.ylabel("平均工资")
    plt.bar(count6.keys(),count6)
    plt.savefig('融资阶段与工资关系.jpg')  
    plt.show()
    #4.计算不同城市平均工资分布状况
    df5=df.groupby('城市')['平均工资'].agg([np.mean])
    count7=pd.Series(df5['mean'],df5.index) #将dataframe转化为序列
    count7=count7.sort_values(ascending=False)
    count7=count7[0:15]  #取排名前15位
    plt.title("不同城市薪资")
    plt.xlabel("城市")
    plt.ylabel("平均工资")
    plt.bar(count7.keys(),count7)
    plt.savefig('不同城市与工资关系.jpg')  
    plt.show()

    8.5拉勾网数据爬取部分代码

    #拉勾网全国前100页数据分析师招聘数据爬取
    import requests  
    import math  
    import pandas as pd  
    import time  
    def get_json(url,num):  
        my_headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
                'Host': 'www.lagou.com',
                'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?px=default&city=%E5%85%A8%E5%9B%BD',
                'X-Anit-Forge-Code': '0',
                'X-Anit-Forge-Token': 'None',
                'X-Requested-With': 'XMLHttpRequest'
                }
        my_data = {  
                'first': 'true',  
                'pn':num,  
                'kd':'数据分析'}  
        res = requests.post(url, headers = my_headers, data = my_data)  
        res.raise_for_status()  
        res.encoding = 'utf-8'  
        # 得到包含职位信息的字典  
        page = res.json()  
        return page  
    def get_page_num(count):  
        #计算要抓取的页数 
        # 每页15个职位,向上取整  
        res = math.ceil(count/15)  #得到大于或等于该数值的最小整数
        # 拉勾网最多显示30页结果  
        if res > 100:  
            return 100  
        else:  
            return res  
    def get_page_info(jobs_list):  
        '''''对一个网页的职位信息进行解析,返回列表''' 
        page_info_list = []  
        for i in jobs_list:  
            job_info = []
            job_info.append(i['city']) 
            job_info.append(i['companyFullName'])  
            job_info.append(i['companyShortName'])  
            job_info.append(i['companySize'])  
            job_info.append(i['financeStage'])  
            job_info.append(i['district'])  
            job_info.append(i['positionName'])  
            job_info.append(i['workYear'])  
            job_info.append(i['education'])  
            job_info.append(i['salary'])  
            job_info.append(i['positionAdvantage'])  
            page_info_list.append(job_info)  
        return page_info_list  
    #返回特定信息构建表格
    def main():  
        url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false'  
        # 先设定页数为1,获取总的职位数  
        page_1 = get_json(url,1)  
        total_count = page_1['content']['positionResult']['totalCount']  
        num = get_page_num(total_count)  
        total_info = []  
        time.sleep(40)  #间隔40秒
        print('职位总数:{},页数:{}'.format(total_count,num))  
        for n in range(1,num+1):  
            # 对每个网页读取JSON, 获取每页数据  
            page = get_json(url,n)  
            jobs_list = page['content']['positionResult']['result']  
            page_info = get_page_info(jobs_list)  
            total_info += page_info  
            print('已经抓取第{}页, 职位总数:{}'.format(n, len(total_info)))  
            # 每次抓取完成后,暂停一会,防止被服务器拉黑  
            time.sleep(40)  
        #将总数据转化为data frame再输出  
        df = pd.DataFrame(data = total_info,columns = ['城市','公司全名','公司简称','公司规模','融资阶段','区域','职位名称','工作经验','学历要求','工资','职位福利'])   
        df.to_csv('lagou_jobs.csv',index = False)  
        print('已保存为csv文件.')  
    if __name__== "__main__":   
        main()      
    

     

     

     

    展开全文
  • 基于文本挖掘的数据分析岗位人才需求分析.pdf
  • 爬取boss热门城市数据分析岗位进行数据分析 前言 看了这么久的博客,还是第一次写博客。 朋友圈看到某培训班统计的数据分析岗位的平均薪资已经达到13k左右了。 这篇文章的数据来源是来自boss直聘的热门城市的“数据...
  • 作为一名2020届即将毕业的大学生来说,我觉得下半学期最重要的两件事情就是找实习和顺利毕业。...拿这个来说,我主要想知道数据分析岗位在那个城市分布较多?平均薪资多少?学历要求情况?技术要求是什么 ?等问题...
  • 用python分析国内数据分析岗位的需求
  • 某招聘网站数据分析岗位分析报告,针对地区、薪资、工作年限等展开分析,后附有转行建议
  • 数据分析岗位内部人的建议,可以少走很多弯路这次我请到了在数据分析岗位的一位大佬,最近也面试了很多准备转行过来的小伙伴,他从数据分析岗位内部人士的角度来解读,什么是数据分析岗位,需要那些技能,那些注意...
  • 用集搜客爬取拉钩网上深圳市数据分析岗位信息进行数据分析
  • 本次主要围绕数据分析岗位的招聘情况, 进行一个简单的数据分析 环境 win8, python3.7, pycharm, jupyter notebook 正文 1. 明确分析目的 了解数据分析岗位的最新招聘情况, 包括地区分布, 学历要求, 经验要求, ...
  • 一、明确需求分析数据分析岗位的招聘情况,包括地区分布、薪资水平、职位要求等,了解最新数据分析岗位的情况。环境:python 3.6设计的工具:Tableau工具(主要是生成图方便,用matplotlib也可以达到同样的效果)二、...
  • 数据分析岗位 统计分析:大数定律、抽样推测规律、秩和检验、回归、预测; 可视化辅助工具:excel、BI工具、python 大数据处理框架:Hadoop、storm、spark 数据库:SQL、MySql、DB 数据仓库:SSIS、SSAS 数据...
  • BOSS招聘网站数据分析岗位分析详情 数据来源于BOSS招聘网站,仅供学习 #导包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import re #中文显示及负号显示 plt.rcParams[‘font.sans-...
  • 关于数据分析岗位的工作思考

    千次阅读 2020-01-05 23:38:35
    对于数据分析岗位,涉及的工作内容,自己理解应该是有4个方面:数据来源、数据分析算法、数据应用、数据安全。 总结一下,欢迎大家批评指正。 数据分析工作是根据业务部门的需求,对企业经营数据进行分析,在分析...
  • 数据分析遵循一定的流程,不仅可以保证数据分析每一个阶段的工作内容有章可循,而且还可以让分析最终的结果更加准确,更加有说服力。一般情况下,数据分析分为以下几个步骤: 业务理解,确定目标、明确分析需求; ...
  • 对上篇文章(点击回顾)爬取的拉勾网数据分析岗位招聘信息进行数据分析和可视化操作。 1. 导入工具库 import pandas as pd import matplotlib.pyplot as plt import matplotlib from wordcloud import WordCloud 2....
  • 物流管理岗位与数据分析岗位整体薪酬分布,谁高谁低?2.随着工作年限增长,哪种岗位获得的职业收入更多?3.如何规划职业得到更好的职业收入前景?二、数据获取与理解本次选取的数据为前程无忧...
  • 数据分析岗位求职经验分享

    千次阅读 多人点赞 2018-12-20 18:03:14
    数据分析岗位求职经验分享 个人简介 2016年就读 北航 电子与通信专业 硕士 2017年实习于中国电信研究院-云计算与大数据部 2018年实习于滴滴出行-数据科学部 2018年 秋招 拿到滴滴-数据科学部;美团-快驴事业部;百度...
  • Python数据分析岗位招聘情况

    千次阅读 2019-08-06 15:39:08
    了解数据分析岗位的最新招聘情况, 包括地区分布, 学历要求, 经验要求, 薪资水平等. 数据收集 这里借助爬虫, 爬取招聘网站的招聘信息, 进而分析出相关的薪资以及招聘要求. 2.1 目标站点分析 通过对目标站点的分析, ...
  • 为了掌握数据分析相关岗位的招聘需求、薪资待遇、技能要求等方面的信息,本文对拉勾网上数据分析岗位的招聘信息进行了收集、处理和分析,整体的思路如下:数据收集使用Python进行数据的收集,本文爬取了拉勾网2019年...
  • 爬取某招聘网站数据分析职位的相关数据,用SQL分析, 1. 爬取数据 打开搜狗高速浏览器,在拉勾网首页搜索的“数据分析”职位,鼠标右击查看网页源文件,通过搜索相关关键字可以发现, 职位信息并不在源代码里。进一步抓...
  • 数据分析师大家都知道近年来非常火爆的岗位,目前一二线基本上所有企业都会配备数据分析岗位。而运营岗已经是老牌岗位了,下到运营专业,上到运营总监。目前数据分析师要求懂业务,运营岗位要求会数据分析。但两个...
  • 数据分析 1、数据读取 #导入相关模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt import re#正则解析 from wordcloud import WordCloud import warnings warnings....
  • ◆◆◆ ◆◆前言数据分析岗位,的确是最近两年最火爆、话题度最高的岗位。根据从业经验、技能要求的不同,可细分为数据分析工程师、数据分析师、数据专员。小编我特别荣幸于2017年7月份...
  • 一、进行拉勾网的【数据分析岗位】分析整体步骤如下: 数据采集 数据清洗 分析 二、清晰知道,要进行什么分析?我们需要什么信息呢? 我们要对拉勾网的 【数据分析岗位】 上海地区行业需求情况进行分析,需要知道...
  • 数据分析岗位招聘分析

    千次阅读 2019-12-19 23:46:47
    学习实践数据分析,形成完整报告。 分析目标:从行业、城市、学历、经验分析薪资及需求量分布情况 数据获取 集搜客获取拉勾【数据分析】为关键词的职位列表,根据列表职位详情地址爬取职位详情,435条记录,删除重复...
  • 我是贝贝: 物流管理与数据分析,一个是原来...1.物流管理岗位与数据分析岗位整体薪酬分布,谁高谁低? 2.随着工作年限增长,哪种岗位获得的职业收入更多? 3.如何规划职业得到更好的职业收入前景? 二、数据获...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,916
精华内容 1,566
关键字:

数据分析岗位