• 数据导入与预处理-第8章-实战演练-数据分析师岗位分析


    备注:本文内容来源于黑马的《数据导入与预处理》教材

    1.数据分析概述

    1.1 本章内容

    本案例数据为招聘网站上收集的有关数据分析师岗位的数据,对该数据集从数据分析的角度出发,利用pandas、pyecharts库处理与展现数据,开发一个完整的数据分析项目。

    1.2 什么是数据分析

    数据分析是指运用适当的统计分析方法对收集的大量数据进行分析,将这些数据加以汇总和理解并消化,以实现最大化地开发数据的功能,发挥数据的作用。

    1.3 数据分析的流程

    在这里插入图片描述

    1.4 使用pyecharts绘制图表

    大部分数据是以文本或数值的形式显示的,这种形式的数据不仅让人感觉十分枯燥,而且无法让人直观地看到其中的关系和规律。
    为帮助用户快速地从数据中捕获信息,可以用图表形式的数据替代诸如文本或数值形式的数据,更好地给人们传递数据内部潜在的信息。
    在这里插入图片描述

    1.4.1 pyecharts简介

    pyecharts官网有很多案例,如果使用pyecharts,可以在官网中找到相关配置
    ✨ 特性

    简洁的 API 设计,使用如丝滑般流畅,支持链式调用
    囊括了 30+ 种常见图表,应有尽有
    支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
    可轻松集成至 Flask,Django 等主流 Web 框架
    高度灵活的配置项,可轻松搭配出精美的图表
    详细的文档和示例,帮助开发者更快的上手项目
    多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持

    1.4.2安装pyecharts

    pip install pyecharts==1.9.0
    
    • 1

    1.4.3 pyecharts绘制图表过程

    使用pyecharts绘制各种图表的过程大致相同,一般可分为4步:

    创建图表类对象
    添加图表数据与系列配置项
    添加图表全局配置项
    渲染图表

    在这里插入图片描述

    1 创建图表类对象

    pyecharts库支持绘制30+个丰富的Echarts 图表,它针对每个图表均提供了相应的类,并将这些图表类封装到pyecharts.charts模块中。
    在这里插入图片描述

    前表中列举的类均代表一个常见的图表,它们可使用与类同名的构造方法创建图表实例。

    Line(init_opts=opts.InitOpts())
    
    • 1

    init_opts:表示初始化配置项,该参数需要接收一个InitOpts类的对象,通过构建的InitOpts类对象可以为图表指定一些通用的属性,比如背景颜色、画布大小等。

    构建示例

    line_demo = Line(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
    
    • 1
    2 添加图表数据与系列配置项

    系列配置项是一些针对图表特定元素属性的配置项,包括图元样式、文本样式、标签、线条样式、标记样式、填充样式等,其中每个配置项都对应一个类。
    在这里插入图片描述
    在这里插入图片描述
    使用add_xaxis()、add_yaxis()或add()方法可以添加图表数据或系列配置项。

    add_yaxis(self, series_name, y_axis, is_selected=True,  is_connect_nones=False, 
                     xaxis_index=None, yaxis_index=None, color=None, 
                     is_symbol_show=True,  symbol=None, symbol_size=4, ...)
    
    • 1
    • 2
    • 3

    y_axis:表示系列数据。
    symbol:表示标记,可以接收的取值有‘circle’(圆形)、‘rect’(矩形)、‘roundRect’(圆角矩形)、‘triangle’(三角形)、‘diamond’(菱形)、‘pin’(大头针)、‘arrow’(箭头)、‘none’(无)。
    symbol_size:表示标记的大小。

    为前面创建的line_demo对象添加一组数据,并设置折线图的标记为菱形、标记大小为10。

    line_demo.add_yaxis('', jobs_count.values.tolist(), symbol='diamond',symbol_size=10)
    
    • 1
    3 添加图表全局配置项

    全局配置项是一些针对图表通用属性的配置项,包括初始化属性、标题组件、图例组件、工具箱组件、视觉映射组件、提示框组件、数据区域缩放组件,其中每个配置项都对应一个类。
    在这里插入图片描述
    若pyecharts需要为图表设置全局配置项(InitOpts除外),则需要将全局配置项传入set_global_options()方法中。

    set_global_opts(self, title_opts=opts.TitleOpts(), legend_opts=opts.LegendOpts(),  
            tooltip_opts=None, toolbox_opts=None, brush_opts=None, xaxis_opts=None, 
            yaxis_opts=None, visualmap_opts=None, datazoom_opts=None, 
            graphic_opts=None, axispointer_opts=None)
    
    • 1
    • 2
    • 3
    • 4

    title_opts:表示标题组件的配置项,接收一个TitleOpts类的对象;
    yaxis_opts:表示y轴的配置项,接收一个AxisOpts类的对象。

    4. 渲染图表

    图表可通过两种方法进行渲染:render()和render_notebook(),其中render()方法用于将图表渲染到HTML文件;render_notebook()方法用于将图表渲染到Jupyter Notebook工具中。

    line_demo.render_notebook()  
    
    • 1

    2. 分析目标与思路

    目标驱使行动,行动决定思路。在项目伊始期间,我们需要明确项目的目标,只有明确了目标,才能保证后期的行为不会偏离方向,否则得出的分析结果将没有任何指导意义。

    2.1 分析目标

    分析数据分析师岗位的需求趋势
    分析数据分析师岗位的热门城市Top10
    分析不同城市数据分析师岗位的薪资水平
    分析数据分析师岗位的学历要求

    在明确了分析目标之后,我们需要将项目目标分解到数据分析的各个环节,方便开发人员清楚自己在各环节应该开展哪些工作。
    在这里插入图片描述

    2.2 数据收集

    熟悉数据收集的工作内容,可以熟练地使用pandas库读取文件中的数据,并筛选与分析目标关联紧密的列数据
    在开发项目之前,我们需要提前准备好分析的数据。这里直接使用从天池网站上下载的一份有关数据分析师岗位的数据(从2019年11月初到12月初),分别将这些数据保存至lagou01.csv和lagou02.xlsx文件中。数据集下载地址
    在这里插入图片描述
    观察两张表格可知,两张表格中有多列标题相同的数据,但并非每列数据都与数据分析目标有关,这里只需要保留与数据分析目标相关的部分列数据即可

    2.21 导入模块:

    import time
    import pandas as pd
    from pyecharts.charts import Bar, Line, Pie
    from pyecharts import options as opts 
    from pyecharts.globals import SymbolType, ThemeType  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2.2 导入数据

    读取lagou01.csv文件的数据

    # 读取lagou01.csv文件的数据
    recruit_obj = pd.read_csv('lagou01.csv', encoding='gbk')
    # 过滤与分析目标无关的数据,保留有关的数据
    new_df_01 = pd.DataFrame([recruit_obj['city'], 
                              recruit_obj['companyFullName'], recruit_obj['salary'], 
                              recruit_obj['companySize'], recruit_obj['district'], 
                              recruit_obj['education'], recruit_obj['firstType'], 
                              recruit_obj['positionAdvantage'], recruit_obj['workYear'], 
                              recruit_obj['createTime']]).T
    new_df_01
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出为:
    在这里插入图片描述
    读取lagou02.xlsx文件的数据

    # 读取lagou02.xlsx文件的数据
    recruit_obj2 = pd. read_excel('lagou02.xlsx',engine='openpyxl')
    new_df_02 = pd.DataFrame( [recruit_obj2['city'], recruit_obj2['companyFullName'], recruit_obj2['salary'],
                               recruit_obj2['companySize'], recruit_obj2['district'],
                               recruit_obj2['education'], recruit_obj2['firstType'], 
                               recruit_obj2['positionAdvantage'], recruit_obj2['workYear'], 
                               recruit_obj2['createTime']]).T
    new_df_02
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出为:
    在这里插入图片描述
    转换时间格式

    # 转换时间格式 
    new_df_01['createTime'] = pd.to_datetime(new_df_01['createTime'])
    new_df_02['createTime'] = pd.to_datetime(new_df_02['createTime'])
    new_df_01.head()
    
    • 1
    • 2
    • 3
    • 4

    输出为:
    在这里插入图片描述
    采用上下堆叠的方式合并数据

    # 采用上下堆叠的方式合并数据
    final_df = pd.concat([new_df_01, new_df_02], ignore_index=True)
    # 给final_df重新设置列索引的名称
    final_df = final_df.rename(columns={'city':'城市', 
                                        'companyFullName':'公司全称', 'salary':'薪资',
                                        'companySize':'公司规模', 'district':'区', 'education':'学历',
                                        'firstType':'第一类型', 'positionAdvantage':'职位优势',
                                        'workYear':'工作经验', 'createTime':'发布时间'})
    final_df
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出为:
    在这里插入图片描述

    2.3 数据预处理

    尽管从网站上采集的数据是比较规整的,但可能会存在着一些问题,无法直接被应用到数据分析中。为增强数据的可用性,我们需要对前面准备的数据进行一系列的数据清理操作,包括检测与处理重复值、检测与处理缺失值

    2.3.1. 查看数据的整体信息

    final_df.info()
    
    • 1

    输出为:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 3143 entries, 0 to 3142
    Data columns (total 10 columns):
     #   Column  Non-Null Count  Dtype         
    ---  ------  --------------  -----         
     0   城市      3142 non-null   object        
     1   公司全称    3142 non-null   object        
     2   薪资      3142 non-null   object        
     3   公司规模    3142 non-null   object        
     43135 non-null   object        
     5   学历      3142 non-null   object        
     6   第一类型    3142 non-null   object        
     7   职位优势    3142 non-null   object        
     8   工作经验    3142 non-null   object        
     9   发布时间    3142 non-null   datetime64[ns]
    dtypes: datetime64[ns](1), object(9)
    memory usage: 245.7+ KB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    info返回结果分析如下:
    在这里插入图片描述
    由于整组数据中没有数值类型的数据,所以这里不再检测异常值,而只需要检测与处理重复值、缺失值即可。

    2.3.2 重复值处理

    # 检测重复值
    final_df[final_df.isna().values==True]
    
    • 1
    • 2

    输出为:
    在这里插入图片描述
    删除重复值

    final_df = final_df.drop_duplicates()
    final_df
    
    • 1
    • 2

    输出为:
    在这里插入图片描述

    2.3.3 缺失值处理

    检测缺失值

    # 检测缺失值
    final_df[final_df.isna().values==True]
    
    • 1
    • 2

    输出为:
    在这里插入图片描述
    删除下面的空行 每行非空缺值少于4个的所在行

    # 删除下面的空行 每行非空缺值少于4个的所在行
    final_df.dropna(axis=0, how='any', thresh=4, subset=None, inplace=True) 
    # 检测缺失值
    final_df[final_df.isna().values==True]
    
    • 1
    • 2
    • 3
    • 4

    输出为:
    在这里插入图片描述

    填充值并查看

    # 填充一个指定的值
    final_df = final_df.fillna('未知')
    final_df.loc[28]
    
    • 1
    • 2
    • 3

    输出为:
    在这里插入图片描述

    2.4 数据分析与展现

    2.4.1 数据分析师岗位的需求趋势

    若希望了解数据分析师岗位的需求趋势,需要对近一个月每天的岗位招聘总数量进行统计,为直观地看到岗位需求的变化趋势,这里会将统计的数据绘制成一个折线图。

    转变时间格式

    # 转变时间格式
    final_df['发布时间'] = final_df['发布时间'].dt.strftime('%Y-%m-%d')
    final_df.head(10)
    
    • 1
    • 2
    • 3

    输出为:
    在这里插入图片描述
    统计每组中城市一列的的数量

    # 将相同日期划分为一组,并统计每组中城市一列的的数量,以得到需求量
    jobs_count = final_df.groupby(by="发布时间").agg({'城市':'count'})
    jobs_count.head(10)
    
    • 1
    • 2
    • 3

    输出为:
    在这里插入图片描述
    可视化展示

    from pyecharts.globals import WarningType
    WarningType.ShowWarning = False
    line_demo = (    
        Line(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
        # 添加x轴、y轴的数据、系列名称
        .add_xaxis(jobs_count.index.tolist())
        .add_yaxis('', jobs_count.values.tolist(), symbol='diamond', 
                      symbol_size=10)
        # 设置标题
        .set_global_opts(title_opts=opts.TitleOpts(
                             title="数据分析师岗位的需求趋势"),
                             yaxis_opts=opts.AxisOpts(name="需求数量 ( 个)",
                             name_location="center", name_gap=30))
    )
    line_demo.render_notebook()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出为:
    在这里插入图片描述

    由图可知,从2019年11月3日到2019年11月23日对应的折线呈缓慢上升的趋势,从2019年11月23日到2019年12月1日对应的折线呈快速上升的趋势,说明市场上对数据分析师岗位的需求变大。

    2.4.2 数据分析师岗位的热门城市Top10

    若希望了解数据分析师岗位需求的热门城市,需要对近一个月内每天的岗位招聘总数量进行统计,为直观地看到数据分析师岗位的需求量,这里会将统计的数据绘制成一个柱形图,并在该图中柱形的上方标注出具体的数值。

    # 查看列城市的各个值统计
    city_num = final_df['城市'].value_counts()
    city_num.head(10)
    
    • 1
    • 2
    • 3

    输出为:

    成都    416
    武汉    392
    北京    366
    上海    345
    深圳    253
    南京    228
    广州    172
    西安    164
    长沙    148
    厦门    131
    Name: 城市, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    将前10个结果转换为列表类型的数据

    # 将前10个结果转换为列表类型的数据
    city_values = city_num.values[:10].tolist()
    city_index = city_num.index[:10].tolist()
    
    • 1
    • 2
    • 3

    可视化展示

    bar_demo = (    
        Bar()
        # 添加x轴、y轴的数据、系列名称
        .add_xaxis(city_index)
        .add_yaxis("",city_values)
        # 设置标题
        .set_global_opts(title_opts=opts.TitleOpts(
    title='数据分析师岗位的热门城市Top10'),
    xaxis_opts=opts.AxisOpts(
    axislabel_opts=opts.LabelOpts(rotate=-15)),
               visualmap_opts=opts.VisualMapOpts(max_=450), 
               yaxis_opts=opts.AxisOpts(name="需求数量 ( 个)", 
               name_location="center", name_gap=30))
    )
    bar_demo.render_notebook()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出为:
    在这里插入图片描述

    由图可知,北京市、成都市、武汉市对应的柱形条最高,说明这几个城市对数据分析师岗位的需求较大,需求数量大约为400个。

    2.4.3 不同城市数据分析师岗位的薪资水平

    若希望了解不同城市的数据分析师岗位的薪资水平,需获得不同城市的数据分析师岗位的薪资平均值,为直观地看到不同城市数据分析师岗位的薪资水平,这里会将统计的数据绘制成一个柱形图,并将获得的平均值标注到柱形的上方。

    # 将数据里面的大写K转化为小写字母k
    final_df['薪资'] = final_df['薪资'].str.lower().fillna(" ")
    # 增加两列,一列是薪资范围的最大值,一列是薪资范围的最小值
    final_df["薪资最小值"] = final_df["薪资"].str.extract(r'(\d+)').astype(int)
    final_df["薪资最大值"] = final_df["薪资"].str.extract(r'\-(\d+)').astype(int)
    average_df = final_df[["薪资最小值", "薪资最大值"]]
    final_df["薪资平均值"] = average_df.mean(axis=1)
    final_df.drop(columns=["薪资"], inplace=True)
    final_df.head(10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出为:
    在这里插入图片描述
    可视化展示

    companyNum = final_df.groupby('城市')['薪资平均值'].mean().sort_values(ascending=False)
    companyNum = companyNum.astype(int)
    
    company_values = companyNum.values.tolist()
    company_index = companyNum.index.tolist()
    # 绘制柱形图
    bar_demo2 = (    
        Bar()
        # 添加x轴、y轴的数据、系列名称
        .add_xaxis(company_index)
        .add_yaxis("",company_values)
        # 设置标题
        .set_global_opts(title_opts=opts.TitleOpts(
            title='不同城市数据分析师岗位的薪资水平'),
            xaxis_opts=opts.AxisOpts(
                 axislabel_opts=opts.LabelOpts(rotate=-15)),
            visualmap_opts=opts.VisualMapOpts(max_=21),
            yaxis_opts=opts.AxisOpts(name="薪资(K)", 
    name_location="center", name_gap=30)) 
    )
    bar_demo2.render_notebook()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    输出为:
    在这里插入图片描述

    由图可知,北京市数据分析师岗位的平均薪资最高,大约为21K;上海市数据分析师岗位的平均薪资次之,大约为20K。

    2.4.4 数据分析师岗位的学历要求

    若希望了解数据分析师岗位对学历的要求,需要了解不同学历的占比情况,为直观地看到数据分析师岗位的学历要求,这里会将统计的数据绘制成一个圆环图,并将具体的比例值标注到圆环图上方。
    可视化展示

    # 数据分析师岗位对学历的要求占比
    education = final_df["学历"].value_counts()
    cut_index = education.index.tolist()
    cut_values = education.values.tolist()
    data_pair = [list(z) for z in zip(cut_index,cut_values)]
    # 绘制饼图
    pie_obj = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
        .add('', data_pair, radius=['35%', '70%'])
        .set_global_opts(title_opts=opts.TitleOpts(
             title='数据分析师岗位的学历要求'),
             legend_opts=opts.LegendOpts(orient='vertical', 
                  pos_top='15%', pos_left='2%'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
    ) 
    pie_obj.render_notebook()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出为:
    在这里插入图片描述

    由图可知,本科对应的图形所占的比例最大,说明数据分析师岗位对本科学历的需求较多;博士对应的图形所占的比例最小,说明数据分析师岗位对博士学历的需求较小。

    https://cloud.tencent.com/developer/support-plan?invite_code=1oazrmuzddbc1
    我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1oazrmuzddbc1

  • 相关阅读:
    WGAN(1)——为什么不能直接拟合原始分布Pr
    ubuntu(18.04)中安装open babel docker镜像并在php项目中调用容器中的obabel命令解析结果使用
    随手记录第十话 -- 升级SpringBoot3.0 + JDK17的踩坑记录
    unity包体相关的加密解密操作
    代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量
    Python-正则表达式入门练习笔记
    Redis快速上手篇七(集群-六台虚拟机)
    好教程推荐系列:收录常见的Qt面试题
    现在的00后,真是卷死了呀,辞职信已经写好了·····
    【大模型应用开发教程】动手学大模型应用开发,一起探索LLM Universe
  • 原文地址:https://blog.csdn.net/m0_38139250/article/details/127799513