zoukankan      html  css  js  c++  java
  • 数据分析项目-数据分析岗位近况分析

    数据读取
    理解数据
    数据清洗
    数据分析

    1、数据读取

    #导入相关模块
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import re#正则解析
    from wordcloud import WordCloud
    import warnings
    warnings.filterwarnings('ignore')
    
    #连接mysql
    import pymysql
    pymysql.install_as_MySQLdb()
    from sqlalchemy import create_engine
    engine=create_engine('mysql://user:password@localhost:3306/frogdata?charset=gbk')
    
    #读取数据
    df=pd.read_sql_query('select * from Boss_analyst',con=engine)

    2、理解数据

    字段解释

    • position - 职位

    • salary_range - 薪水区间

    • work_year - 工作经验

    • city - 城市

    • tag1 - 技能标签1

    • tag2 - 技能标签2

    • tag3 - 技能标签3

    • tag4 - 技能标签4

    • tag5 - 技能标签5

    • company_name - 公司名称

    • text - 未知

    • company_type - 公司类型

    • company_welfare -公司福利

    3、数据清洗

    对表中的position、salary_range、work_year、city、text、company_welfare字段数据进行清洗

    #观察数据的整体情况
    df.info()
     

    总共有4482条数据。tag4、tag5、company_walfare列的有存在空缺数据,但空缺不多,而且这三个指标不是关键性指标,所以暂不做处理

    #考虑到爬取的数据可能存在重复数据,此处做去重处理
    df.drop_duplicates(inplace=True)
    df.shape[0]
     

    4435 存在47条重复数据

    position 字段清洗
    #观察position字段
    df.position.unique()
     

    发现存在异常数据,这里需要对不相关的职位进行去除

    df=df.loc[df.position.str.contains('数据|分析|Data|算法|Bi|ETL')]
    df.shape[0]
     

    3423
    考虑数据类的岗位有数据运营、数据挖掘、商业分析师、算法工程师、ETL工程师等

    salary_range字段清洗
    #观察salary_range字段
    df['salary_range'].unique()
     
    数据很不规整,初步判断存在以下三种格式:'15-25K·13薪'、'15-25K'、100-150元/天 ,打算把这一列的数据拆解分为两列-最低薪水、最高薪水
    def cut_word(word,types):
        
        #把数据规整为'xx-xx'格式
        position1=word.find('K')
        position2=word.find('')
        #如果没有找到该元素,find会返回值-1
        if position1 != -1:  
            salary_range=word[:position1]
        elif position2 != -1:  
            salary_range=word[:position2]
        
        #拆分数据-最低薪水、最高薪水
        position3= salary_range.find('-')
        bottom_salary= salary_range[:position3]
        top_salary= salary_range[position3+1:]
        
        #传入types参数,接收最低薪水、最高薪水的数据
        if types == 'bottom':
            return bottom_salary
        else:
            return top_salary
    
    #利用apply函数进行数据转化
    df['bottom_salary']=df['salary_range'].apply(cut_word,types='bottom').astype('int')
    df['top_salary']=df['salary_range'].apply(cut_word,types='top').astype('int')
     
    #新增平均薪水列,方面后面做统计分析
    df['avg_salary']=df.apply(lambda x : (x.bottom_salary+x.top_salary)/2,axis=1)

    work_year字段清洗
    #观察work_year字段
    df.work_year.unique()

    work_year字段中学历数据和工作年限数据混杂在了一起,需要将其分列

    学历有7种数据格式:学历不限、中专/中技、高中、大专、本科、硕士、博士

    工作经验有三种数据格式:x-x年、x天/周x个月、经验不限。

    def cut_word1(word,types):
        #找到学历不限的学字,进行切片处理
        position1=word.find('')
        #找到学历不限的大字,进行切片处理
        position2=word.find('')
        position3=word.find('')
        position4=word.find('')
        position5=word.find('')
        position6=word.find('')
        position7=word.find('')
        
        #通过切片把数据规整为学历和工作经验两列数据
        if position1 != -1:  
            work_year=word[:position1]
            educational_background=word[position1:]
        elif position2 != -1: 
            work_year=word[:position2]
            educational_background=word[position2:]
        elif position3 != -1:
            work_year=word[:position3]
            educational_background=word[position3:]
        elif position4 != -1:
            work_year=word[:position4]
            educational_background=word[position4:]
        elif position5 != -1:
            work_year=word[:position5]
            educational_background=word[position5:]
        elif position6 != -1:
            work_year=word[:position6]
            educational_background=word[position6:]
        else:
            work_year=word[:position5-4]
            educational_background=word[position5-4:]
          
        #传入types参数,接收学历和工作年限的数据
        if types == 'education_background':
            return educational_background
        else:
            return work_year
        
    #利用apply函数进行数据转化,将学历数据新添加到'education_background'列,工作经验数据新添加到'work_year'列
    df['education_background']=df['work_year'].apply(cut_word1,types='education_background')
    df['work_year']=df['work_year'].apply(cut_word1,types='work_year')

    work_year字段已清洗完毕,转化为work_year和education_background两列数据

    #work_year中存在2天/周3个月之类的数据,判断是实习/兼职职位,这边把全职和实习的岗位数据区分开来
    df_part_time=df.loc[df.work_year.str.contains('天|周|月')]
    #全职岗位
    df_full_time=df.loc[~df.work_year.str.contains('天|周|月')]

    city字段清洗
    #观察city数据
    df_full_time['city'].unique()
     
    有些值只显示城市名称,有些细分到了区,这边把数据维度统一规整到城市名称
    #通过apply函数和if逻辑判断,把带有·点的数据的城市地区维度进行切片截取
    df_full_time['city']=df_full_time['city'].apply(lambda x :x[:x.find('·')]  if x.find('·') != -1  else x)

    text字段清洗
    #观察text字段
    df_full_time.text.unique()

    text字段包含了公司融资情况、公司类型、公司规模数据,需将其转化分列,其中公司类型已存在(company_type)
    只需转化为公司融资情况和公司规模两列
    清洗结果

    4、数据分析

    整体思路

    1. 数据类岗位整体需求

    2. 城市、学历、工作经验对薪水的影响

    3. 不同岗位对应的学历要求、薪水分布情况

    4. 公司一般会用什么福利待遇来吸引求职者

    5. 不同岗位要求的关键技能点是什么

    1、数据类岗位整体需求
    plt.figure(figsize=(16,6))
    
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
    
    #学历
    plt.subplot(2,3,1)
    df_full_time.education_background.value_counts().plot(kind='barh',alpha=0.7)
    
    #工作经验
    plt.subplot(2,3,2)
    df_full_time.work_year.value_counts().plot(kind='barh',alpha=0.7)
    
    #岗位分布
    plt.subplot(2,3,3)
    df_full_time.city.value_counts().plot(kind='pie',autopct='%.1f%%')
    
    #公司融资情况
    plt.subplot(2,3,4)
    df_full_time.company_financing .value_counts().plot(kind='barh',alpha=0.7)
    
    
    #公司类别
    plt.subplot(2,3,5)
    df_full_time.company_type.value_counts().head(6).plot(kind='barh',alpha=0.7)
    
    #薪水
    plt.subplot(2,3,6)
    #对薪水划分层次,如18K属于15-10
    bins=[0,3,5,10,15,20,30,105]
    level=['0-3','3-5','5-10','10-15','15-20','20-30','30+']
    df_full_time['avg_salary_level']=pd.cut(df_full_time.avg_salary,bins=bins,labels=level)
    df_full_time.avg_salary_level.value_counts().head(6).plot(kind='pie',autopct='%.1f%%')
    
    #调整子图的间距
    plt.tight_layout()

    要求

    分析:
    学历要求:大专是最低要求,招高中或中专/中技的极少,最好是本科及以上
    工作经验需求:偏向招聘有一定经验的求职者,尤其3-5年经验的需求最旺盛。一般工作3年以上,对于整个职业的了解会比较深入,技术趋于成熟,能够帮助做一些独立的项目
    岗位分布情况:北上广深杭对其需求都差不多,相对来说北京机会最多,广州偏少
    公司融资情况:招聘数据类岗位的一般都是达到了一定规模的大型企业
    行业分布情况:互联网行业需求是最多的,包括电商、金融。还有一些乙方公司也有一定需求,比如数据服务类、咨询类
    薪资情况:受工作经验影响较大,3年工作经验薪资一般集中在20-30K,比较可观

    省略234
    5、不同岗位要求的关键技能点是什么
    #数据运营职位相关技能list_tag1=df_full_time[df_full_time['position']=='数据运营']['tag1'].tolist()list_tag2=df_full_time[df_full_time['position']=='数据运营']['tag2'].tolist()list_tag3=df_full_time[df_full_time['position']=='数据运营']['tag3'].tolist()list_tag4=df_full_time[df_full_time['position']=='数据运营']['tag4'].tolist()list_tag5=df_full_time[df_full_time['position']=='数据运营']['tag5'].tolist()wordcloud_1=pd.Series(list_tag1+list_tag2+list_tag3+list_tag4+list_tag5).value_counts()#数据分析职位相关技能#数据挖掘职位相关技能

    岗位要求

    分析:
    数据运营类岗位要求:基本的数据分析工具要掌握,熟悉sql,理解业务和产品,会数据挖掘和建模更好

    数据分析类岗位要求:熟悉SQL、 R/Python、hive,掌握基本的数据仓库、数据挖掘、建模的知识,具备一定的业务经验

    数据挖掘类岗位要求:熟悉Python/R、Spark、Linux、Hadoop、SQL,掌握机器学习算法、数据结构等

    关注公众号:Python爬虫数据分析挖掘,免费获取更多开源项目源码

    耐得住寂寞,才能登得顶
    Gitee码云:https://gitee.com/lyc96/projects
  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/chenlove/p/13611083.html
Copyright © 2011-2022 走看看