精华内容
下载资源
问答
  • 用Python进行数据分析的好处是,它的数据分析库目前已经很全面了,有NumPy、pandas、SciPy、scikit-learn、StatsModels,还有深度学习、神经网络的各类包。基本上能满足部分的企业应用。用Python的好处是从数据...

    用Python进行数据分析的好处是,它的数据分析库目前已经很全面了,有NumPy、pandas、SciPy、scikit-learn、StatsModels,还有深度学习、神经网络的各类包。基本上能满足大部分的企业应用。用Python的好处是从数据抽取、数据收集整理、数据分析挖掘、数据展示,都可以在同一种Python里实现,避免了开发程序的切换。

    这里就和大家分享我做的一个应用实例。解决问题:自动进行销售预测,提高准确率,减少人工一个一个SKU进行预测分析。最终的效果如下图:

    20171208220919_49342.png

    1、用到的工具

    当然我们只需要用Python和一些库就可以了。

    pandas:数据整理

    numpy:pandas的前提,科学计算

    MySQLdb:mysql数据库链接

    statsmodels:统计建模

    pylab:图形处理

    flask:web框架

    2、Flask的安装

    请参考 http://docs.jinkan.org/docs/flask/,在Flask的app目录下建立一个forecasting.py的python文件,在Flask的app的templates目录下建立一个forecastin.html的模版文件,两个文件的内容如下:

    forecasting.py

    # -*- coding: utf-8 -*-

    from app import app

    from flask import render_template

    @app.route('/forecasting/')

    def forecasting(item=None):

    return render_template("forecasting.html")

    forecastin.html

    Hello World

    Hello World

    在DOS窗口运行

    python d:pyflaskrun.py

    在浏览器打开http://127.0.0.1:5000/就可以看到forecasting.html模版的内容显示了。

    20171208221016_31673.png

    接下来我们从头建一个预测模型。

    3、建立数据库并填写数据

    CREATE TABLE `sale` (

    `SaleMonth` datetime DEFAULT NULL,

    `Sale` float DEFAULT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    数据自己录入啦。

    4、相关库的引入

    我们现在在之前第2点建立的文件的基础上进行修改,

    在forecasting.py的头部引入以下库

    # -*- coding: utf-8 -*-

    from app import app

    from flask import render_template

    import pylab

    import pandas as pd

    import numpy as np

    from pandas import Series,DataFrame

    import MySQLdb

    import pandas.io.sql as sql

    import statsmodels.api as sm

    import time

    import datetime

    from dateutil.relativedelta import relativedelta

    import random

    5、定义路由

    @app.route('/forecasting/')

    意思就是我们访问例如http://127.0.0.1:5000/forecasting/2的地址对于就是解析到forecasting.py文件,其中是可变的URL部分,如上面的URL的2

    6、定义函数

    def forecasting(lag=None):

    其中lag就是接受URL中的参数,我们定义lag是自回归函数的滞后期数

    7、数据库链接

    conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='bi',charset='utf8')

    str_sql = "select SaleMonth as Month,Sale from sale order by SaleMonth"

    sale=sql.read_sql(str_sql,conn)

    8、数据处理

    我们整理数据以适合使用。

    ##//数据处理

    #转换数据中的月份为日期类型,并把它定义为pandas索引

    sale.Month = pd.to_datetime(sale.Month)

    sale = sale.set_index("Month")

    ##//提取最大月份和最小月份

    start = min(sale.index)

    end = max(sale.index)

    ##定义预测的月份,在最大月份的基础上加1-4

    pre_start =end+relativedelta(months=1)

    pre_end =end+relativedelta(months=4)

    #必要的转换

    pre_start =pre_start.strftime('%Y-%m-%d')

    pre_end =pre_end.strftime('%Y-%m-%d')

    #生成时间序列,从最小月份到最大月份

    i = pd.date_range(start, end, freq='MS')

    df = DataFrame(i,i)

    #定义列、定义索引index名

    df.columns = ['T']

    df.index.names =['Month']

    #把sale与df合并,通过索引

    rs = pd.merge(sale,df,left_index=True,right_index=True,how='outer')

    #删除临时列T,并把rs转换为html,方便后面输出到模版中

    del rs['T']

    data = rs.to_html()

    9、数据预测

    ##预测

    #对rs进行对数变换

    rs = np.log(rs)

    #对rs进行自回归,lag是自回归的滞后因子,来自函数的lag参数,即来自RUL的参数

    r = sm.tsa.AR(rs).fit(maxlag=lag, method='mle', disp=-1)

    #对未来四个月进行预测

    fcst_lg = r.predict(start,pre_end)

    #对预测的结果进行指数变换,因为之前做了对数变换

    fcst = np.exp(fcst_lg)

    #转换fcst为pandas的DataFrame格式

    fcst = DataFrame(fcst)

    #定义列名和索引,用于和原来的rs合并

    fcst.columns=['fcst']

    fcst.index.names =['Month']

    #合并fcst和rs到rs_out

    rs_out = pd.merge(sale,fcst,left_index = True,right_index = True,how='outer')

    #rs_out转换为记录格式,再转换为html格式,以方便输出到模版中显示

    #取得最后的4行作为预测的显示输出,不知道为什么rs_out[-4:-1]这个输出漏了最后一行

    rs_fcst = rs_out[-4:-1]

    rs_fcst = rs_fcst.to_html()

    rs2 = rs_out.to_records()

    rs_out = rs_out.to_html()

    10、数据整理

    我使用了echart web图标框架进行显示。

    ##以下是处理表格数据输出到echart的json格式

    tmp=u""

    tmp1=""

    tmp2=""

    tmp3=""

    for t in rs2:

    #tmp1 += "{'label':'" + str(t.Month.year)+"/"+str(t.Month.month) + "','value':'" + str(t.Qty) + "'},"

    #tmp1 += ""

    tmp1 += "'"+str(t.Month.year)+"/"+str(t.Month.month)+"',"

    #tmp2 += ""

    tmp2 += str('%.0f' % t.Sale) +","

    #tmp3 += ""

    tmp3 += str('%.0f' % t.fcst) +","

    tmp +=""+tmp1+""

    tmp +=u""+tmp2+""

    tmp +=u""+tmp3+""+""

    tmp1 = tmp1[:-1]

    tmp2 = tmp2[:-1]

    tmp2 = tmp2.replace('nan',''-'')

    tmp3 = tmp3[:-1]

    tmp=u'''{

    title : {text: '测试',subtext: '纯属虚构'},

    tooltip : {trigger: 'axis'},

    legend: {data:['实际销售','预测销售']},

    toolbox: {

    show : true,

    feature : {

    mark : {show: false},dataView : {show: true, readOnly: false},

    magicType : {show: true, type: ['line', 'bar']},

    restore : {show: true},saveAsImage : {show: false}

    }

    },

    calculable : true,

    dataZoom : {show : true,realtime : true,start : 0,end : 100},

    xAxis : [{type : 'category',data : [%s]}],

    yAxis : [{type : 'value',min : 5000,scale : true}],

    series : [

    {

    name:'实际销售',type:'bar',data:[%s],

    markPoint : {

    data : [{type : 'max', name: '最大值'},{type : 'min', name: '最小值'}]

    },

    markLine : {data : [{type : 'average', name: '平均值'}]}

    },

    {

    name:'预测销售',type:'line',data:[%s],

    }

    ]

    };''' %(tmp1,tmp2,tmp3)

    11、生成公式

    生成一个公式能更直观显示变量之间的关系。

    #生成动态公式图片

    rp = r.params

    ftext=''

    i=0

    for rp1 in rp:

    if (i==0) and (rp1>0) :const = '+' + str(("%.4f" % rp1))

    if (i==0) and (rp1<0) :const = str(("%.4f" % rp1))

    if (i==1):ftext = ftext + str(("%.4f" % rp1))+'y_{t-'+str(i)+'}'

    if (i>1) and (rp1>0):ftext = ftext + '+' + str(("%.4f" % rp1))+'y_{t-'+str(i)+'}'

    if (i>1) and (rp1<0):ftext = ftext + str(("%.4f" % rp1))+'y_{t-'+str(i)+'}'

    i +=1

    f = r'$y_{t}='+ftext+const + '$'

    f2 = r'$y=ln(w_{t})$'

    fig = pylab.figure()

    #设置背景为透明

    fig.patch.set_alpha(0)

    text = fig.text(0, 0, f)

    # 把公式用公式图片的方式保存

    dpi = 300

    fig.savefig('d:/py/formula.png', dpi=dpi)

    # Now we can work with text's bounding box.

    bbox = text.get_window_extent()

    width, height = bbox.size / float(dpi/4) + 0.005

    # Adjust the figure size so it can hold the entire text.

    fig.set_size_inches((width, height))

    # Adjust text's vertical position.

    dy = (bbox.ymin/float(dpi))/height

    text.set_position((0, -dy))

    # Save the adjusted text.

    url = 'D:/py/Flask/app/static/images/1.png'

    fig.savefig(url, dpi=dpi)

    12、输出到模版

    把py程序中的在模版中用到的结果输出到模版。

    return render_template("forecasting.html",r=r,rs_out=rs_out,tmp=tmp,lag=lag,f=f,f2=f2,rs_fcst=rs_fcst)

    13、设计模版

    我们可以用{{变量名}}来接受来自py程序的变量。

    分析结果

    // 路径配置

    require.config({

    paths:{

    'echarts' : '/static/ECharts/build/echarts',

    'echarts/chart/bar' : '/static/ECharts/build/echarts',

    'echarts/theme/macarons':'/static/ECharts/src/theme/macarons',

    }

    });

    require(

    [

    'echarts',

    'echarts/theme/macarons',

    'echarts/chart/bar', // 使用柱状图就加载bar模块,按需加载

    'echarts/chart/line' // 使用柱状图就加载bar模块,按需加载

    ],

    function (ec,theme) {

    // 基于准备好的dom,初始化echarts图表

    var myChart = ec.init(document.getElementById('main'),theme);

    var option = {{tmp | safe}}

    myChart.setOption(option);

    }

    );

    .right{text-align: right}

    body{font-size: 12px;background:white}

    Summary of AR Results

    Lag length:

    {{r.k_ar}}

    Samples:

    {{r.nobs}}

    Model:

    AR

    -----------------------------------------

    AIC:

    {{'%.4f' % r.aic}}

    BIC:

    {{'%.4f' % r.bic}}

    FPE:

    {{'%.4f' % r.fpe}}

    HQIC:

    {{'%.4f' % r.hqic}}

    ----------------------------------------------------------

    Results for equation

    ==========================================================

    X

    coefficient

    std.error

    t-stat

    p-value

    {% for i in range(lag+1) %}

    {% if i==0 %}

    const

    {% else %}

    Y(t-{{i}})

    {% endif %}

    {{'%.4f' % r.params[i]}}

    {{'%.4f' % r.bse[i]}}

    {{'%.4f' % r.tvalues[i]}}

    {{'%.4f' % r.pvalues[i]}}

    {% endfor %}

    ----------------------------------------------------------

    预测

    ==========================================================

    {{rs_fcst | safe}}

    1.png?"

    14、实际应用

    在这各例子中,我们只是对一个产品、一个模型、一个参数进行了预测。

    在实际应用中,可以批量对产品、多个模型、多种参数进行预测,写一个判定预测模型好坏的算法,自动确定每种产品的最优模型和参数,定期自动计算各产品的预测值。

    希望这个思路能帮到大家。

    展开全文
  • Kaggle竞赛的“泰坦尼克号预测生还”是进行Pandas数据分析非常好的案例,虽然CSDN有很多大神已经做了非常高深的机器学习的建模研究,但是我还是想从一个比较基础的提升Pandas使用角度来做一篇总结~ 今天主要想了解的...
    公众号: 数据小斑马,关注即可获得价值1000元的数据分析学习资料
    

    Pandas系列目录(文末有超大惊喜):
    Pandas数据分析①——数据读取(CSV/TXT/JSON)
    Pandas数据分析②——数据清洗(重复值/缺失值/异常值)
    Pandas数据分析③——数据规整1(索引和列名调整/数据内容调整/排序)
    Pandas数据分析④——数据规整2(数据拼接/透视)
    Pandas数据分析⑤——数据分组与函数使用(Groupby/Agg/Apply/mean/sum/count)
    Pandas数据分析⑥——数据分析实例(货品送达率与合格率/返修率/拒收率)

    Kaggle竞赛的“泰坦尼克号预测生还”是进行Pandas数据分析非常好的案例,虽然CSDN有很多大神已经做了非常高深的机器学习的建模研究,但是我还是想从一个比较基础的提升Pandas使用角度来做一篇总结~
    今天主要想了解的有:
    1、不同性别、舱位和年龄的分布情况
    2、不同性别、舱位和登录港口的获救比例比较,找到生还比例更高的特征有哪些

    一、数据清洗

    公众号: 数据小斑马,关注即可获得价值1000元的数据分析学习资料
    

    ①筛选列

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    data = pd.read_csv('train.csv')
    print(data.info())
    

    在这里插入图片描述
    先看看各个特征代表的是什么意思:

    PassengerId => 乘客ID,这个不会影响到存活,可删除
    Pclass => 乘客等级(1/2/3等舱位)
    Name => 乘客姓名,不会影响,可删除
    Sex => 性别
    Age => 年龄
    SibSp => 堂兄弟/妹个数
    Parch => 父母与小孩个数
    Ticket => 船票信息 ,不会影响,可删除
    Fare => 票价
    Cabin => 客舱 ,不会影响,可删除
    Embarked => 登船港口

    data.drop(['PassengerId', 'Ticket','Cabin'],axis=1,inplace=True)
    print(data.info())
    print(data.isnull().sum())
    

    在这里插入图片描述 在这里插入图片描述

    发现Age和Embarked有缺失值,Age缺失较多,达177个,年龄是分析相当重要的特征,不能删除,可以用填充法,这里选择填充均值;Embarked由于缺失值较少,直接删除或者填充都行, 这里选择删除。

    data.Age = data.Age.fillna(data.Age.mean())
    data.dropna(subset=['Embarked'],how='any',axis=0,inplace=True)
    print(data.isnull().sum())
    

    在这里插入图片描述
    二、数据规整
    ①性别转换为数值,便于后续进行分析

    print(data.Sex.unique())
    data.loc[data['Sex']=='male','Sex']=0
    data.loc[data['Sex']=='female','Sex']=1
    

    ②登录港口转换成数值,便于后续分析

    print(data.Embarked.unique())
    data.loc[data['Embarked']=='S','Embarked'] = 0
    data.loc[data['Embarked']=='C','Embarked'] = 1
    data.loc[data['Embarked']=='Q','Embarked'] = 2
    
    pd.options.display.max_rows=None
    pd.options.display.max_columns=None
    print(data.describe())
    

    在这里插入图片描述

    三、数据分析

    公众号: 数据小斑马,关注即可获得价值1000元的数据分析学习资料
    

    ① 存活人数分布

    # 存活情况
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['font.serif'] = ['SimHei']
    fig,axes = plt.subplots(2,3,figsize=(20,30))
    plt.subplot(2,3,1)
    data['Survived'].value_counts().plot(kind='Bar',alpha=0.8)
    plt.title('存活人数')
    

    在这里插入图片描述
    大概有330人获救,比例1/3左右

    ②不同船舱的人数分布

    # 不同船舱的人数分布
    plt.subplot(2,3,2)
    data['Pclass'].value_counts().plot(kind='Bar',alpha=0.8)
    plt.title('不同船舱人数')
    

    在这里插入图片描述
    3等舱人数最多,这也符合人们的收入情况

    ③存活和遇难的年龄分布

    # 统计存活和遇难的年龄分布
    plt.subplot(2,3,3)
    plt.scatter(data['Survived'],data['Age'],alpha=0.8)
    plt.title('存活和遇难年龄分布')
    

    在这里插入图片描述
    获救与遇难的年龄分布都比较广,没有太大区别
    ④不同港口登录的人数分布

     #不同港口登录的人数分布
    plt.subplot(2,3,4)
    data['Embarked'].value_counts().plot(kind='Bar',alpha=0.8)
    plt.title('不同港口登录的人数分布')
    

    在这里插入图片描述
    S港口获救的人数最多,可能有距离上的优势,其余两个人数较少

    ⑤不同舱位的年龄分布

     # 不同舱位的年龄分布
    plt.subplot(2,3,5)
    data['Age'][data['Pclass']==1].plot(kind='kde',label='1')
    data['Age'][data['Pclass']==2].plot(kind='kde',label='2')
    data['Age'][data['Pclass']==3].plot(kind='kde',label='3')
    plt.title('不同舱位的年龄分布')
    plt.legend(loc='best')
    

    在这里插入图片描述

    一等舱和二等舱年龄要稍长一些,三等舱要年轻化一点,这与不同年龄段累计财富比较一致

    ⑥不同非直系亲属数量的人数分布

    # 不同非直系亲属数量的人数分布
    plt.subplot(2,3,6)
    data['SibSp'].value_counts().plot(kind='bar')
    plt.title('不同非直系亲属数量的人数分布')
    

    在这里插入图片描述
    没有非直系亲属一起前行的占了绝大部分,其次是与一位同行的
    在这里插入图片描述

    公众号: 数据小斑马,关注即可获得价值1000元的数据分析学习资料
    

    ⑦ 不同性别的获救情况分布

    # 不同性别的获救情况分布
    survive_0 = data['Survived'][data['Sex']==0].value_counts()
    survive_1 = data['Survived'][data['Sex']==1].value_counts()
    data1 =pd.DataFrame({'获救': survive_1,'未获救': survive_0})
    data1.plot(kind='Bar',stacked=True)
    plt.title('不同性别的获救比例')
    

    在这里插入图片描述
    从图上可看出,船上的男性大概是女性的1.5倍,男性获救的比例不到20%,女性获救的比例达到70%以上,说明船上的男士真的很绅士,把存活的机会留给了女性

    ⑧ 不同等级舱位的获救情况

    # 不同等级舱位的获救情况
    survive_0 = data['Pclass'][data['Survived']==0].value_counts()
    survive_1 = data['Pclass'][data['Survived']==1].value_counts()
    data2 =pd.DataFrame({'获救': survive_1,'未获救': survive_0})
    data2.plot(kind='Bar',stacked=True)
    plt.title('不同等级舱位的获救比例')
    

    在这里插入图片描述
    船舱等级越高,获救比例越高,说明越有钱,越容易得救

    ⑨不同登录港口的获救情况

    # 不同登录港口的获救情况
    survive_0 = data['Embarked'][data['Survived']==0].value_counts()
    survive_1 = data['Embarked'][data['Survived']==1].value_counts()
    data3 =pd.DataFrame({'获救': survive_1,'未获救': survive_0})
    data3.plot(kind='bar',stacked=True)
    plt.title('不同登录港口的获救比例')
    plt.show()
    

    在这里插入图片描述
    S港口登录的人数最多,但是获救的比例却最低,C港口获救的比例是最高的,大概60%,Q港口为35%左右

    上述就是基于Survived,Sex,Age,Embarked等字段的描述性分析,可以发现女生、头等舱、从C港口登录的乘客获救可能性更高,后续还会用机器学习的方法建模,找到最佳特征。


    本人互联网数据分析师,目前已出ExcelSQLPandasMatplotlibSeaborn机器学习统计学个性推荐关联算法工作总结系列。


    微信搜索并关注 " 数据小斑马" 公众号,回复“python”就可以免费领取下方利用python进行数据分析、python数据分析与挖掘实战等9本经典书籍
    在这里插入图片描述

    展开全文
  • 导读:企业当前需要什么样的数据分析人才?这些人才应该具备怎样的能力和素质?数据分析师挣多少钱?下面的分析过程正在试图给你答案。希望本文能够为你今后的学习和求职提供指导,也...
        

    640?wx_fmt=gif&wxfrom=5&wx_lazy=1

    导读:企业当前需要什么样的数据分析人才?这些人才应该具备怎样的能力和素质?数据分析师挣多少钱?下面的分析过程正在试图给你答案。希望本文能够为你今后的学习和求职提供指导,也为正在学习数据分析和找工作的朋友们提供一定的参考价值。


    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1



    01 项目背景


    在学习数据分析的路上,少不了经常逛知乎,写这篇文章的启发来源于@BigCarrey 的一篇文章《数据分析师挣多少钱?“黑”了招聘网站告诉你!》,该文章给了我一些帮助,让我了解了数据分析岗位相关的信息,但同样也留给我一些疑问,该文章分析的数据分析师所需技能的结果丝毫没有R的踪影,尽管是一年前的分析,我觉得应该不可能不存在。


    因此,抱着证实R语言这款工具的想法,以及希望了解当前企业对数据分析岗位的需求,开始了一次针对招聘网站的数据分析岗位招聘数据的分析与挖掘实践,避免自己所学习的方向与企业实际需求脱轨。


    此实例采用R语言作为分析工具,下面展现的是我整个分析过程。



    02 目标


    1. 了解企业当前需要什么样的数据分析人才,以及应该具备的能力和素质。

    2. 分析的结果为今后的学习和求职提供指导,也为正在学习数据分析和找工作的朋友们提供一定的参考价值。



    03 问题的分解


    1. 不同地区,数据分析岗位的需求分布以及对应的薪资分布

    2. 不同经验,数据分析岗位的需求分布以及对应的薪资分布

    3. 不同学历,数据分析岗位的需求分布以及对应的薪资分布

    4. 不同企业规模,数据分析岗位的需求分布以及对应的薪资分布

    5. 探索数据分析岗位对应的工具型技能与对应的薪资水平

    6. 探索数据分析岗位对应非工具型能力的需求



    04 数据集的定义


    640?wx_fmt=jpeg

    ▲表1:数据分析岗位信息表


    640?wx_fmt=jpeg

    ▲表2:数据分析岗位技能关键词表



    05 数据获取


    数据来源:拉勾网

    数据范围:互联网行业、数据分析岗位

    数据集:全国数据分析岗位招聘信息数据集(采集样本量:449)

    工具:爬虫

    时间:所有数据截止2018年3月12日

    数据集获取方式:请关注公众号数说物语(ID:DataTalk_)回复【拉勾网】即可获取下载链接和密码



    06 数据处理


    步骤1:加载原始数据


    640?wx_fmt=jpeg


    步骤2:识别缺失值


    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    图1. aggr缺失值识别图


    幸运的是该数据集不存在缺失值,这是很少遇到的情况。


    步骤3:数据清洗


    640?wx_fmt=jpeg

    640?wx_fmt=jpeg


    步骤4:文本挖掘


    文本挖掘工具:jiebaR包


    说明:


    在进行正式挖掘之前测试了一下jiebaR的关键词(keywords)分词器,测试的结果发现SQL,Python等词在jiebaR词典中的IDF值均为11.7392,但“R”这个字符无论如何(即使自定义了用户字典,或者在idf字典中添加R的idf值)都无法被分词器识别为关键词,猜测可能是默认R的词性标注或者算法实现方法的原因。但因为R是数据分析师的重要工具,识别不出来是不可容忍的,因此要另求出路。


    测试代码如下:


    640?wx_fmt=jpeg


    结果如下:


    640?wx_fmt=png


    解决办法:


    关键词算法的实现原理是TF-IDF算法,TF为词频,IDF为逆文档率(词的权重),因此TF-IDF=TF*IDF为衡量是否关键词的指标,若控制IDF,则TF-IDF的值与TF值成正比关系,简单来说TF值可以代替TF-IDF值。


    由于此次分析的是数据分析师的工具和技能,因此只考虑SQL,PYTHON,R,SAS等常用且类似的词的分析,又因为该类词在jiebaR分词器识别出来的IDF值均是同级别的(即使可能存在有差异也在此假设其等值),因此这部分词汇的关键指标的衡量可以简化为出现的词频,即TF值,这个可以通过jiebaR的默认分词器(不是关键词分词器)来处理即可,最终解决R关键词识别的问题。


    文本挖掘思路:


    1、工具型技能的关键词:采用默认分词器的词频TF值

    2、非工具型能力或素质的关键词:采用关键词分词器的TF-IDF值

    代码如下:


    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg


    到此数据处理的过程基本完成,处理后干净的数据如下:


    640?wx_fmt=jpeg



    07 分析的结果


    数据分析代码:


    具体代码可以前往该链接查看整个过程:RPubs - 分析实例:企业需要什么样的数据分析人才http://rpubs.com/Joffy_Z/DA_analysis


    描述统计信息:


    640?wx_fmt=jpeg


    问题一:不同地区,数据分析岗位的需求分布以及对应的薪资分布


    640?wx_fmt=jpeg

    640?wx_fmt=jpeg


    • 总的来说数据分析师的平均薪资比较好,工作1年以上拿到10k月薪的机会还是比较大

    • 在需求量前5的城市中,北京和深圳的平均薪资是最高的,广州的平均薪资最低

    • 需求量在第二梯度的城市中,长沙和成都的平均薪资较低,但武汉、厦门、郑州也有不错的薪资表现,二线城市也是一个可以考虑的选择

    • 需要注意的是苏州的需求量相对于其他城市是非常低的,但其平均薪酬接近深圳,是可以值得关注的城市


    问题二:不同经验,数据分析岗位的需求分布以及对应的薪资分布


    640?wx_fmt=jpeg


    • 跟预想的差不多,薪资随工作经验的增加而有一个稳定的增长

    • 但企业对最大的数据求集中在3-5年经验的数据分析师,这对于转型进入数据分析的人来说不是一个好的消息

    • 转行需要更有充足的准备,且要不断寻找能够积累经验的项目来做。


    问题三:不同学历,数据分析岗位的需求分布以及对应的薪资分布


    640?wx_fmt=jpeg


    • 企业似乎更加注重分析师的实践经验,而不是学历的高低,但至少需要具备本科以上的学历,数据分析还是需要具备一定的理论基础

    • 在薪资方面,相对与本科来说,硕士及以上学历在获取高薪方面并没有太大的优势,能够解决实际问题才是数据分析师拿高薪的关键,而非深奥的理论知识

    • 大专学历的分析师还是有机会,重点在于增加自己的工作经验才是本质上与其他分析师拉开距离的关键,当然,理论知识也不能落下


    问题四:不同企业规模,数据分析岗位的需求分布以及对应的薪资分布


    640?wx_fmt=jpeg

    640?wx_fmt=jpeg


    • 150人规模以下的企业需求量较少,但给出的薪资较高(甚至有异常的高薪),该类企业可能处于快速融资且高速的发展阶段,需要有丰富经验的数据分析专家来建设整个数据体系

    • 50~150人规模的企业适合有足够经验的分析师且想要创业的人,对自己职位以及薪酬均会有明显的提升,但最大的风险就是该类企业容易失败,特别在互联网行业,因此更不建议作为转型新人的首选

    • 对于转型的新人,尽可能往大企业走,越大规模的企业,整个体系越成熟,因此可以在150人以上的规模从上往下选择自己合适的企业才是比较科学的方式,且需求量巨大


    问题五:数据分析岗位对应的工具型技能与对应的薪资水平


    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg


    • SQL和Excel几乎是每个数据分析师要掌握的基础技能,大多数企业都有自己的数据库体系或者系统平台,因此企业工作人员读取和处理数据还是以数据库和Excel为主

    • R,Python是两个最热门的开源数据分析工具,且当前R语言在需求仍然不低,因此核心掌握两门语言的其中一门都会让数据分析师具备有力的竞争优势

    • 除此之外工作经验较低的数据分析师还需要掌握一些BI可视化分析工具

    • 工作经验较高的数据分析师需要掌握主流的关系型数据库系统和NoSQL,以及Hadoop,Hive,Spark等大数据工具

    • 掌握Hadoop,Hive,Spark,R,Python等技能是获取高薪必备条件


    问题六:数据分析岗位对应非工具型能力的需求


    声明:此处数据涉及到岗位细分和难以衡量的原因,并没有进行深入分析,词云本身不具备太高的数据分析价值,仅作为可视化关键词的分布情况的工具;阅读者需要根据自身岗位以及所处的工作定位查看关键词的情况,这里的大小表示关键词出现的频次。


    640?wx_fmt=jpeg


    通过资料的收集,了解到数据分析岗位主要有偏工程方向和偏业务方向两个类型,透过词云可以大概了解到如下信息:


    • 偏工程方向的数据分析师对“数据挖掘”、“数据建模”、“模型分析”等能力要求较高

    • 偏业务方向的数据分析师对“业务分析”、“运营分析”、“产品分析”、“用户分析”等能力要求较高

    • 两个类型共同需要“逻辑思维”、“沟通”、“分析报告”、“统计分析”、“团队合作”等关键能力



    08 总结


    1. 从地域来看,北京、深圳、上海、杭州、广州应该是数据分析师的首选城市,苏州是一个值得关注的城市,外部数据了解到苏州的GDP仅次于一线城市,此处结果平均薪资接近北京和深圳,但需求量较低,想要苏州发展的朋友可以关注其动态。

    2. 从总体需求来看,企业更加需要具备多年工作经验,且动手能力强、解决实际问题的分析人才,随着工作经验的增加,其对应的薪资也有可观的增长。

    3. 从大环境看,外部资料了解到,自助式分析工具的逐步完善与人工智能技术的突破,也可能使得企业现有业务人员能够上手基础的分析工作,导致企业对经验较低的分析师需求减少。

    4. 从企业规模看,150人以上规模的企业更加适合新人进去锻炼,一方面企业已经完成了基本的数据体系架构,且越大的企业数据量级越大,另一方面,企业需要逐步培养强大的数据分析团队来支撑业务的增长。

    5. 从分析师个人的角度,则需要更加关注自身成功项目经验的积累,这是升职加薪的必备条件,且需要思考未来自身的发展路径,提前做好准备,相对于业务方向,大数据工程师方向会有更可观的薪资。

    6. 从能力的角度,数据分析师需要掌握SQL,Excel,R,Python四个必备的工具(R和Python可以选择其一为主要工具),新人可以注重BI,PPT等office工具的技能,如果是大数据挖掘,越往后则需要更加关注hadoop,Hive,Spark等工具;

    7. 数据分析师个人还需要注重逻辑思维、表达沟通、分析报告等关键能力



    09 建议


    1. 对于想要转型的数据分析师新人,转型之前尽可能做好项目经验的积累,尽量做到跨岗不跨行,在自己熟悉的领域学习数据分析

    2. 企业比较看重经验和动手能力,面试的时候尽可能展示你的作品或者案例,如果当前没有,则需要在日常学习,练习,积累

    3. 可以掌握一些可视化工具和数据可视化的思维,熟练掌握报告和表达的技巧,数据分析的工具多样,方式多样,只有能够正确解读数据且让对方看懂听懂才是有价值的



    10 不足


    本次分析并没有按照分析报告的方式来呈现,文章中以个人的整个分析过程来撰写,希望能够与各位朋友一起交流学习,如果你不同意我文章中的观点,欢迎指正交流。


    文章中我附上了我的数据集以及分析的代码链接,有兴趣的朋友可以重复我的过程,甚至做更加深入有趣的分析,如果有新的发现和观点,希望也能让我知道,向你们学习。



    11 局限


    数据仅采集到449份样本,数据量相对少一点,因此数据分析的结果需要大家用怀疑的心态来看待,且仅局限在互联网行业,相对于其他行业,本文章的分析结果只能作为一个参考。


    感谢您的阅读,您的建议和留言会让我做得更好。


    作者:乔飞(Joffy Zhong):咨询顾问 写作爱好者 数据分析 互联网创业者 R语言中文社区专栏作者

    来源:数说物语(ID:DataTalk_)


    推荐阅读


    日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···

    看完此文再不懂区块链算我输:手把手教你用Python从零开始创建区块链

    为什么要学数学?因为这是一场战略性的投资

    180页PPT,讲解人工智能技术与产业发展



    Q: 数据分析师所需的技能,你get到了吗?

    欢迎留言与大家分享

    觉得不错,请把这篇文章分享给你的朋友

    转载 / 投稿请联系:baiyu@hzbook.com

    更多精彩文章,请在公众号后台点击“历史文章”查看

    640?wx_fmt=jpeg

    展开全文
  • 作者简介IntroductionJoffy Zhong:咨询顾问 | 写作爱好者 | 数据分析 | 互联网创业者 R语言中文社区专栏作者知乎ID:https://www.zhihu.com/people/joffy/posts 往期回顾:数据分析项目实战:大型商场销售预测(带...
        

    640?wx_fmt=gif&wxfrom=5&wx_lazy=1

    作者简介Introduction

    Joffy Zhong:咨询顾问 | 写作爱好者 | 数据分析 | 互联网创业者 R语言中文社区专栏作者

    知乎ID:https://www.zhihu.com/people/joffy/posts


    往期回顾:

    数据分析项目实战:大型商场销售预测(带你挤进比赛前100名)

    640?wx_fmt=gif&wxfrom=5&wx_lazy=1

    背景介绍

    大家好,我是乔飞

    我曾为一些中小企业做过管理咨询,其中部分模块涉及到人力资源,这也是我在工作过程中比较感兴趣去研究的领域,包括人才的成长与管理等,此次分析是基于一个有意思的数据集,去探索企业员工流失的影响因素,如果你有合适的员工数据集,可以延用此文的分析思路。

    本次分析的数据集来自IBM数据科学家创建的虚构的员工流失数据(你可以在这里拿到数据:SAMPLE DATA: HR Employee Attrition and Performance)

    员工流失是困扰企业的众多关键问题之一,在这次分析中,我将努力开展以下工作内容:

    • 对一些重要的变量进行快速可视化及探索性分析,特别是与基础信息、收入、晋升、满意度、绩效和工作与生活平衡等相关的变量(西方文化讲究Work-life Balance)

    • 分析导致员工流失的因素,并探索各个变量的影响程度

    • 通过有效的算法构建模型,用于预测员工是否要辞职

    最终目标是使用分析的过程和结果,有助于在利用真实数据集进行建模预测分析的时候减少员工流失,辅助人力资源团队进行关键的干预工作,让管理层指导哪些因素影响了“留人”,反过来促进企业做好“选人”“育人”“用人”。

    结论和建议:

    • 员工离开背后的主要原因很可能是投入与回报的失衡;加班,工作的投入带来的回报是否不匹配,检查公司是否有有效的加班政策。

    • 在某种程度上,工作与生活的不平衡也是造成员工离开的原因,检查员工背后认为自身工作与生活不平衡的原因也许是一个有效的手段;例如加班,离家远的情况重复出现,是否有的远程工作的支持。

    • 高薪也许不是关键的保障,在探索分析的结果显示,拥有员工优先认股权,是员工更为关注的另一个报酬形式。

    • 年龄和任职过的公司等因素似乎与离职率高有较大的关系,这给人力资源部门的同事提供了识人方面的有效信息;当然这仅仅是虚构数据集的结果,分析请以公司真实数据,往往有公司就是有吸引年轻人的文化。

    • 最后,如果能得到公司员工的一个新数据集,就可以根据建立好的模型计算概率并查看哪些员工确实容易离开

    整个过程是一次较简单的探索分析和建模的过程,如果你感兴趣可以自行建模或者在此基础上优化,欢迎与我交流。

    数据集

    该数据集由1470行/数据点和35列/属性组成,部分变量描述的理解上会存在一定的文化差异。

    重点关注的变量说明:

    640?wx_fmt=jpeg

    探索性数据分析

    #加载需要的包

     library(ggplot2)

     library(grid)

     library(gridExtra)

     library(plyr)

     library(rpart)

     library(rpart.plot)

     library(randomForest)

     library(caret)

     library(gbm)

     library(survival)

     library(pROC)

     library(DMwR)

     library(scales)

     #加载数据

     Attr.df <- read.csv("HR-Employee-Attrition.csv",header = TRUE)

     str(Attr.df)

     #查看描述统计信息

     summary(Attr.df)

    输出结果:

    640?wx_fmt=png

    640?wx_fmt=png

    640?wx_fmt=png

    从描述统计信息看:

    • 企业员工不流失与流失的比例约为 5:1

    • 企业员工平均年龄约为36岁

    • 企业员工平均收入约为6500美元,中值为4919美元,中值更能反映企业薪资水平

    探索基础信息Gender,Age,Department,JobLevel,Education等变量与员工流失的关系

    g1 <- ggplot(Attr.df, aes(x = Age, fill = Attrition)) +

      geom_density(alpha = 0.7)

    g2 <- ggplot(Attr.df, aes(x = NumCompaniesWorked, fill = Attrition)) +

      geom_density(alpha = 0.7)

    g3 <- ggplot(Attr.df, aes(x = YearsAtCompany, fill = Attrition)) +

      geom_density(alpha = 0.7)

    g4 <- ggplot(Attr.df, aes(x = TotalWorkingYears, fill = Attrition)) +

      geom_density(alpha = 0.7)

    grid.arrange(g1, g2, g3, g4, ncol = 2, nrow = 2)

    640?wx_fmt=jpeg

    流失员工的特征:

    • 年龄较低的流失率较高,主要集中在小于30岁的员工

    • 在任职超过5家公司的员工群体中,该类员工的离职率高

    • 在公司工作时间短的员工流失率高,年数小于4年的较为集中

    • 工龄低的员工流失率高,集中在工龄小于7年左右的员工

    其可能的原因在于年轻的员工更倾向于多尝试,且对未来目标相对迷茫,高流失率也意味着此类员工难以在短期形成对企业价值观的长期认同;当然此处无法有定论知道IBM真实的原因,因为年轻员工也需要大平台的机会,不能排除上司文化或者不公平对待等因素,毋庸置疑需要再深入分析,人力资源将重点关注于年轻的员工将会有好的发现。

    g5 <- ggplot(Attr.df, aes(x= Gender,fill = Attrition)) +

      geom_bar(position = "fill") +

      labs(y="Percentage") + scale_y_continuous(labels=percent)

    g6 <-ggplot(Attr.df, aes(x= JobLevel,fill = Attrition)) +

      geom_bar(position = "fill") +

      labs(y="Percentage") + scale_y_continuous(labels=percent)

    g7 <- ggplot(Attr.df, aes(x= Education,fill = Attrition)) +

      geom_bar(position = "fill") +

      labs(y="Percentage") +  scale_y_continuous(labels=percent) 

     g8 <- ggplot(Attr.df, aes(x= Department,fill = Attrition)) +

      geom_bar(position = "fill") +

      labs(y="Percentage") + scale_y_continuous(labels=percent)

    grid.arrange(g5, g6, g7, g8, ncol = 2, nrow = 2)

    640?wx_fmt=jpeg

    • 低等级职位的员工的流失率高,主要集中在等级为1的职位

    • 学历和性别似乎没有差异

    • 销售部门的员工较其他部门员工的流失率高

    其结果对应了一线工作人员,且可能与业务人员的工作性质有一定的联系,如何降低流失率则可以重点关注销售部,进行深入的分析和挖掘潜在的原因。

    探索收入、投入等变量与员工流失的关系

    g9 <- ggplot(Attr.df, aes(x = MonthlyIncome, fill = Attrition)) +

      geom_density(alpha = 0.7) 

     g10 <- ggplot(Attr.df, aes(x= JobInvolvement,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent)

    grid.arrange(g9, g10, ncol = 2)

    640?wx_fmt=jpeg

    • 收入低的员工流失率高,收入在10000美元左右的员工的流失率也不低

    • 工作投入的员工流失率高

    收入在10000美元左右会有一个小峰,表示处于该水平的员工也存在流失率高的问题,其可能原因在于该类员工为企业的精英人才,可能有更高的追求或者因素导致离开,可以作为重点关注的对象。

    付出与回报总是员工的惯性思维,这一点值得探索;因此在正确了解收入对流失的影响之前,先来看一下付出和回报之间的关系。

    ggplot(Attr.df, aes(x= JobInvolvement, y=MonthlyIncome, group = JobInvolvement)) +

      geom_boxplot(aes(fill = factor(..x..)),alpha=0.7) +

      theme(legend.position="none",plot.title = element_text(hjust = 0.5)) +

      facet_grid(~Attrition) +

     ggtitle("Attrition")

    640?wx_fmt=jpeg

    这是一个非常有意思的结果,对于收入高或低,这不能准确说明收入低就是员工流失的原因,但这里我们可以发现,投入与回报差异较大的,越容易流失,因此企业更需要关注那些投入多但回报少的员工,这类员工也许不是不努力,而是没有掌握正确的工作方式,应当给予更大的帮助,例如培训,工作指导等;薪资往往是回报的其中一种。

    探索员工优先认股权,涨薪,升职等变量与员工流失关系

    g11 <- ggplot(Attr.df, aes(x = PercentSalaryHike, fill = Attrition)) +

      geom_density(alpha = 0.7) 

     g12 <- ggplot(Attr.df, aes(x= TrainingTimesLastYear,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent) 

     g13 <- ggplot(Attr.df, aes(x = YearsSinceLastPromotion, fill = Attrition)) +

      geom_density(alpha = 0.7) 

     g14 <- ggplot(Attr.df, aes(x= StockOptionLevel,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent) 

     grid.arrange(g11, g12, g13, g14, ncol = 2)

    640?wx_fmt=jpeg

    流失员工的特征:

    • 没有员工优先认股权的员工流失率较高

    • 上一年没有参与培训的员工流失率高,但相对其他有参与培训的员工的并不算特别高

    从加薪、培训、和升职的角度看,好像并没有很强的关系说明能够影响员工的流失,也许正是因为这些手段在员工看到是理所当然的,应有的福利回报,或许有可能给得越多员工可能还是认为不够,适得其反。反观员工优先认股权对于员工来源是有效的手段,有认股权的员工相对来说较稳定,因为那是未来触手可及的利益,有利益的捆绑,重点在于捆绑。

    探索与满意度相关的变量与员工流失的关系

    g15 <- ggplot(Attr.df, aes(x= JobSatisfaction,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

              stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent) 

     g16 <- ggplot(Attr.df, aes(x= RelationshipSatisfaction,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition), 

               stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent) 

     g17 <- ggplot(Attr.df, aes(x= EnvironmentSatisfaction,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent) 

     grid.arrange(g15, g16, g17,  ncol = 2)

    640?wx_fmt=jpeg

    满意度的观察结果来说比较直接,三个满意度变量都显示了低满意度是离开的原因。

    探索工作和生活平衡相关的变量与员工流失的关系

    g18 <- g20 <- ggplot(Attr.df, aes(x= OverTime,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +  labs(y="Percentage") + scale_y_continuous(labels=percent) 

     g19 <- ggplot(Attr.df, aes(x= WorkLifeBalance,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +  labs(y="Percentage") + scale_y_continuous(labels=percent) 

     g20 <- ggplot(Attr.df, aes(x= BusinessTravel,  group=Attrition)) +

      geom_bar(aes(y = ..prop.., fill = Attrition),

               stat="count", alpha = 0.7,position = "identity",color="black") +

      labs(y="Percentage") + scale_y_continuous(labels=percent) 

     g21 <- ggplot(Attr.df, aes(x = DistanceFromHome, fill = Attrition)) +

      geom_density(alpha = 0.7)

    640?wx_fmt=jpeg

    流失员工的特征:

    • 经常加班的员工相对于不加班的员工流失率非常高

    • 认为工作与生活平衡水平为1的员工流失率较高

    • 频繁出差的员工流失率较高高

    • 距离家较远的员工流失率较高

    加班是最为影响生活质量的因素,其结果也是最明显,在加班与不加班的员工中,流失率的差异非常大;工作与生活较不平衡的员工流失率也会高一点;出差比较频繁的员工也容易流失,上班距离较远的员工也容易流失,总体而言,工作与生活的平衡这一类因素对员工流失的影响较为严重。

    训练用于预测的模型(决策树)

    #建模(决策树) 

    set.seed(3221) 

     # 删除不需要的几个变量

     levels(Attr.df$JobRole) <- c("HC", "HR", "Lab", "Man", "MDir", "RsD", "RsSci", "SlEx", "SlRep")

     levels(Attr.df$EducationField) <- c("HR", "LS", "MRK", "MED", "NA", "TD")

     Attr.df <- Attr.df[c(-9,-10,-22,-27)]

     # 创建训练集和测试集

     n <- nrow(Attr.df)

     rnd <- sample(n, n * .70)

     train <- Attr.df[rnd,]

     test <- Attr.df[-rnd,]

     # 建模

     dtree <- rpart(Attrition ~., data = train)

     preds <- predict(dtree, test, type = "class")

     rocv <- roc(as.numeric(test$Attrition), as.numeric(preds))

     rocv$auc prop.table(table(test$Attrition, preds, dnn = c("Actual", "Predicted")),1)

    输出:

    # Area under the curve: 0.6438 

    #

    # Predicted

    # Actual         No        Yes 

    #    No  0.95430108 0.04569892

    #    Yes 0.66666667 0.33333333

    AUC(曲线下面积)为0.6438,比较低;灵敏度(查全率)为0.333,也比较低,如果用这个模型来直接预测,也许不会得到什么结果,但决策树确实是一个有用的工具,该模型易于理解,我们可以绘制决策树图来看看是否有所发现。

    #Prunning & plotting the tree

     dtreepr <- prune(dtree, cp = 0.01666667)

     predspr <- predict(dtreepr, test, type = "class")

     rocvpr <- roc(as.numeric(test$Attrition), as.numeric(predspr))

     rocvpr$auc rpart.plot(dtreepr,

               type = 4,

               extra = 104,

               tweak = 0.9,

               fallen.leaves = F,

               cex=0.7)

    640?wx_fmt=jpeg

    这是修剪过的决策树,修剪后的AUC为0.633,没有损失多少精确度。

    透过决策树我们可以发现,几乎加班、收入和员工优先认股权占据了最主要的原因,通过前面的探索性分析也得到了类似的发现。

    用随机森林和GBM建模(提升模型)

    set.seed(2343) 

     # Random forest

     fit.forest <- randomForest(Attrition ~., data = train)

     rfpreds <- predict(fit.forest, test, type = "class")

     rocrf <- roc(as.numeric(test$Attrition), as.numeric(rfpreds))

     rocrf$auc

    AUC  0.5757

    set.seed(3433)

     # 定义10折交叉检验的控制器用于下面所有GBM模型的训练

     ctrl <- trainControl(method = "cv",

                         number = 10,

                         summaryFunction = twoClassSummary,

                         classProbs = TRUE) #GBM gbmfit <- train(Attrition ~.,

                    data = train,

                    method = "gbm",

                    verbose = FALSE,

                    metric = "ROC",

                    trControl = ctrl)

     gbmpreds <- predict(gbmfit, test)

     rocgbm <- roc(as.numeric(test$Attrition), as.numeric(gbmpreds))

     rocgbm$auc

    AUC  0.5915

    对于随机森林和GBM的方法,AUC值小于单一决策树模型的AUC值的情况较少见,这显然说明单一的树拟合得更好或者更稳定的情况。(我们需要的是一个AUC值大于0.75的模型)

    通过加权、上下采样等方式优化GBM模型

    我们可能需要解样本失衡的问题,请注意,如果结果变量类别之间的比例是1:10或更高,通常会考虑这一点; 在此数据集Attrition结果变量中YES与NO的比例是1:5,但仍然可能是合理的,因为我们已经在决策树中看到我们的主要问题是预测那些实际离开的人(敏感度)。

    下面将尝试不同的技术:加权(降低少数群体中的错误,这里是离开的全体),下采样(从大多数类中随机删除实例),向上采样(在少数群体中随机复制实例)

    #设置与前面GBM建模控制器一直的种子

     ctrl$seeds <- gbmfit$control$seeds

     # 加权GBM

     # 设置权重参数,提高离开群体的样本权重,平衡样本

     model_weights <- ifelse(train$Attrition == "No", 

                            (1/table(train$Attrition)[1]),

                            (1/table(train$Attrition)[2])) weightedfit <- train(Attrition ~ .,

                          data = train,

                          method = "gbm",

                          verbose = FALSE,

                          weights = model_weights,

                          metric = "ROC", 

                          trControl = ctrl)

     weightedpreds <- predict(weightedfit, test)

     rocweight <- roc(as.numeric(test$Attrition), as.numeric(weightedpreds))

     rocweight$auc

     # UP-sampling 向上采样

     ctrl$sampling <- "up" set.seed(3433)

     upfit <- train(Attrition ~.,

                   data = train,

                   method = "gbm",

                   verbose = FALSE,

                   metric = "ROC",

                   trControl = ctrl)

     uppreds <- predict(upfit, test)

     rocup <- roc(as.numeric(test$Attrition), as.numeric(uppreds))

     rocup$auc


     # DOWN-sampling 向下采样

     ctrl$sampling <- "down"

     set.seed(3433)

     downfit <- train(Attrition ~.,

                     data = train,

                     method = "gbm",

                     verbose = FALSE,

                     metric = "ROC",

                     trControl = ctrl)

     downpreds <- predict(downfit, test)

     rocdown <- roc(as.numeric(test$Attrition), as.numeric(downpreds))

     rocdown$auc

    输出:

    weightedfit AUC : 0.7803

    upfit AUC :0.7387

    downfit AUC :0.7505

    结果中,weightedfit 模型表现最好,也可以看出来,通过优化,会比单纯的BGM或随机森林的方式要好,AUC从0.5757上升到0.7803,因此后续将采用表现最好的模型weightedfit进行预测。从下面的结果可以看到,灵敏度(查全率)提升到了72%,如果将它与RF(15.9%),GBM(18.8%)或决策树(33%)的灵敏度进行比较,它确实做得更好。当然,上诉分析仅用了较为简单的方式来建模和优化,有兴趣的朋友可以尝试不同的做法。

    prop.table(table(test$Attrition, weightedpreds, dnn = c("Actual", "Predicted")),1)

     #      Predicted

    #Actual        No       Yes

    #   No  0.8360215 0.1639785

    #   Yes 0.2753623 0.7246377

    利用建立好的模型解决问题

    如何使用模型?模型算法给出了一大堆数值,复杂的算法不容易解释,在实际应用中,可以通过如下几个方面来解决问题:

    • 检查变量重要性列表,并查看哪些因素总体上有助于确定员工离开的结果;这对确定人力资源或管理层应该在哪里开展工作是有帮助的;

    • 利用模型来计算每个人离开的可能性。通过计算出来的可能性,我们可以对应的生成一个新的变量,例如:一个人离开的可能性高,且有较高的绩效评级,又为公司做出杰出贡献,那么这几个变量就可以生成新的变量,建立一个重点关注指标,帮助管理人员理解需要哪些人员是重点关注对象,并以一种机智的方式进行管理或交谈。

    • 也可以根据这些计算出的概率评估公司的组织架构,例如可以评估哪个部门或角色离开的可能性最高,然后在指导公司的工作方向,或者对该部门或角色进行额外的分析,以制定合适的策略。

    1、列出模型中的变量重要性列表:

     varImp(weightedfit)

      gbm variable importance

      only 20 most important variables shown (out of 44)

      Overall OverTimeYes                      100.00

      MonthlyIncome                     57.94

      JobLevel                          56.12

      Age                               41.13

      NumCompaniesWorked                34.17

     JobSatisfaction                   33.12

     YearsAtCompany                    25.67

     JobInvolvement                    24.50

     DistanceFromHome                  24.09

     EnvironmentSatisfaction           23.28

     StockOptionLevel                  22.58

     YearsWithCurrManager              22.55

     DailyRate                         21.87

     RelationshipSatisfaction          16.20

     YearsSinceLastPromotion           16.11

     BusinessTravelTravel_Frequently   15.20

     WorkLifeBalance                   14.90

     PercentSalaryHike                 13.58

     MonthlyRate                       13.23

     HourlyRate                        12.25

    影响员工流失的前5个因素是:

    • 经常加班

    • 月收入

    • 工作等级

    • 年龄

    • 任职过的公司数

    加班和月收入在前面探索性分析和决策树建模输出的结果就可以明显发现这两个因素的影响,结果上看起来,公司确实应该对那些加班然后离开的人和那些月收入较低的人采取一些工作(这也可能与工作水平、工作的投入有关,前面的月收入和投入的关系图表里也有明显的相关性)。

    还需要研究一下年龄和任职过的公司数,是否是招聘策略的问题还是企业文化的问题?这点需要深入研究。当然,如果企业经常雇佣自由职业者等因素,这点也会对分析结果造成一定的误导。如果不是,那从结果上看,确实越年轻的人不稳定性就越高。

    最后前面我们关注过工作与生活平衡相关的变量,与之相关的四个变量WorkLifeBalance,DistanceFromHome,OverTime,BusinessTravel都在重要性列表内,可见该关联性对员工离开事实的影响,我们应该关注。

    2、利用模型预测探索工作投入高,收入低的人是否更有可能离开

    weightedprobs <- predict(weightedfit, test, type = "prob")

     test$Prediction <- weightedprobs$Yes ggplot(test,

           aes(x=MonthlyIncome, y=Prediction,color=factor(JobInvolvement))) +

      geom_point(alpha=0.7) +

      geom_smooth(method = "lm") +

      facet_wrap(~ JobInvolvement) +

      theme(legend.position="none")+

      ggtitle("JobInvolvement") +

      theme(plot.title = element_text(hjust = 0.5))


    640?wx_fmt=jpeg结果还是有点意外,在测试集中,预测的结果是,投入高,收入低的人离开的可能性较低,其回归线的斜率较低,趋于平缓,再次猜测工作投入较高的员工似乎对企业比较有归属感,或者说该类员工的第一回报可能是精神和成长层面的,如果有兴趣可以在此处深入探索,逐步探索出那些可以牢牢留住员工的因素。

    3、利用模型预测哪些部门和工作角色离开的可能性较高:

    ggplot(test,

           aes(x=JobRole, y=Prediction, fill=JobRole)) +

      geom_boxplot(alpha=0.5) +

      theme(legend.position="none")+ scale_y_continuous(labels=percent)

    640?wx_fmt=jpeg

    可以看出从预测的结果来看,销售代表/业务人员离开公司的可能性很高,平均超过了50%,这是为什么?这是否是行业性质决定还是岗位性质?人力资源的工作者需要做点事情来干预了,并仔细研究和探索其中原由。

    有兴趣的朋友可以接着探索深入的原因。


    感谢数据分析大神 Aljaž 提供的启发与帮助

    感谢GA文章知识提供的帮助

    A Complete Tutorial on Tree Based Modeling from Scratch (in R & Python)(https://www.analyticsvidhya.com/blog/2016/04/complete-tutorial-tree-based-modeling-scratch-in-python/)


    感谢您的阅读。

    本次分析不是很完整和充足,如果有足够的时间和精力,我们还可以往更有意义的方向与探索:

    1、探索企业最关心的精英人才的流失率,并预测哪些精英人才要离开,毕竟企业无法将所有的精力放在所有人身上,已经可以采用二八法则,关注企业核心20%的精英员工。在此范围进行深入的专题分析。

    2、探索哪些人更愿意留在企业,挖掘的重点放在让员工关心的因素,促使他们不离开的原因,辅助人力资源做好企业的用人工作,特别是在企业文化方面的构建和新人的培养方面,有效从整体上减低人员的管理成本。


     往期精彩内容整理合集 

    2017年R语言发展报告(国内)

    R语言中文社区历史文章整理(作者篇)

    R语言中文社区历史文章整理(类型篇)

    640?wx_fmt=jpeg

    公众号后台回复关键字即可学习

    回复 R                  R语言快速入门及数据挖掘 
    回复 Kaggle案例  Kaggle十大案例精讲(连载中)
    回复 文本挖掘      手把手教你做文本挖掘
    回复 可视化          R语言可视化在商务场景中的应用 
    回复 大数据         大数据系列免费视频教程 
    回复 量化投资      张丹教你如何用R语言量化投资 
    回复 用户画像      京东大数据,揭秘用户画像
    回复 数据挖掘     常用数据挖掘算法原理解释与应用
    回复 机器学习     人工智能系列之机器学习与实践
    回复 爬虫            R语言爬虫实战案例分享

    展开全文
  • 由于数据量太以及数据属性的多样性,导致经典的统计分析方法已经无法适用,必须采用以机器学习理论为基础的大数据分析方法。目前,大数据分析的方法已经被广泛用于商业智能(BI)领域,并取得了令人非常满意的效果...
  • python数据分析之爬虫五:实例

    千次阅读 2018-08-12 20:06:09
    实例一:淘宝商品比价定向爬虫 打开淘宝,输入衬衫,链接为: https://s.taobao.com/searchq=%E8%A1%AC%E8%A1%AB&amp;imgfile=&amp;js=1&amp;stats_click=search_radio_all%3A1&amp;initiative_id...
  • 基于音悦台网站榜单的数据爬取与分析 本实验代码:进入 一、研究背景 在互联网发展初期,网站相对较少,信息查找比较容易。然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,这时为满足...
  • 实例演示--探索性数据分析(EDA)

    千人学习 2017-07-10 20:17:20
    购买课程后,添加小助手微信(微信号:csdn500)回复【唐宇迪】 进入学习群,获取唐宇迪老师答疑 案例课程,实例演示如何使用Python工具包进行探索性数据分析。基于真实数据集从零开始进行可视化数据分析,对单变量...
  • Wireshark 分析 UDP 数据实例

    万次阅读 2013-07-20 20:02:59
    先说个人的一点见解:真实地去分析一个协议的数据帧,还是对照着“TCP/IP详解卷1:协议”上的四层模型更加合适(四层模型见这儿:点击打开链接),按照 OSI 7层模型的话有些东西对应起来会比较困惑。
  • 网络数据爬取实例教程

    万次阅读 2017-10-21 23:08:28
    前言 ...数据分析前言一般而言,网络数据爬取是指基于http/https/ftp协议的数据下载——翻译成白话,就是从特定网页上获取我们需要的数据。想象一个浏览网页的过程,大致可以分为两个步骤: 在浏览器
  • Wireshark网络分析实例集锦 淘宝店地址:http://item.taobao.com/item.htm?spm=686.1000925.1000774.13.dKy1GR&id=39996125569 试读文档下载 第一章下载地址: http://pan.baidu.com/s/1hqqrJJQ...
  • 1、当点击运行之后,出现“字段未知或者具有未实例化的类型”的提示 2、点击导出前的这张表 3、将”字段”对应的“值”改为“读取”,然后点击“确定” 4、最后点击运行 ...
  • 数据可视化实例阅读分析

    千次阅读 2019-06-21 13:08:25
    从教材或网络上找一个可视化实例,简要分析实例。 要求: (1)根据可视化图反推出该图所依据的数据表并绘出,指出表中各列数据的属性(即类型)N,O,Q型(5分); (2)找出可视化图形中的所有视觉变量(3分);...
  • Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。前文分享了疫情相关新闻数据爬取,并进行中文分词处理及文本...
  • 分析师确定好需求,基于需求确定好数据维度后,接下来要考虑的就是获取数据了。...常见的获取外部数据的渠道有:1 互联网公开数据 2 付费数(数据提供商)3 网络采集数据 4 通过人脉获取数据 5 通过猎头等...
  • R语言网络数据分析

    万次阅读 2016-10-17 11:38:35
    R语言的网络数据分析,既可分析internet网的大量数据,例如电信数据,又可建立图数据结构,然而R语言的图结构称为网络格式数据,包括节点属性。
  • 维度建模实例 库存管理业务建模案例 1. 选定某一业务过程,如:库存管理业务 2.根据各用户的需求(关注的主题),定义该业务处理的粒度。 主题一:矿厂中每种产品库存水平的日快照 主题二:每种特定产品的...
  • R语言数据分析、展现与实例(03)

    千次阅读 2017-03-01 21:46:01
    R语言进阶——数据展现传统表格 二维结构 数字与文字为主 缺乏润色 现代信息图 以人眼敏感的视觉元素为主 信息高度密集 何为美 新颖 充实 高效 美感 学习经典元素周期表 - 元素周期表的天才之处:通过元素的编排...
  • 注:移动通信网络的信号覆盖逻辑上被设计成由若干六边形的基站小区相互邻接而构成的蜂窝网络面状服务区 目标: (1)对用户的历史定位数据,采用数据挖掘技术,对基站进行分群。 (2)对不同的商圈分群进行特征...
  • 大数据分析技术方案

    万次阅读 2018-06-11 23:58:30
    大数据分析技术方案lWX471878的博客http://xinsheng.huawei.com/cn/blog/detail_80005.html李万鸿Fire ! Fire! Fire!一.目标现在已经进入大数据时代, 数据是无缝连接网络世界与物理世界的DNA。发现数据DNA、重组数据...
  • 大数据分析工程师大纲

    千次阅读 2018-07-25 15:58:31
    大数据分析工程师大纲       阶段一、业务数据分析师 课程一、数据挖掘/分析师之硬技能 - 必备常用工具使用与高级技巧 本部分内容主要介绍了数据挖掘、分析师、数据产品经理必备的常用工具的,主要有 ...
  • 随着互联网、移动互联网和物联网的发展,我们已经切实地迎来了一个...Hadoop在可伸缩性、健壮性、计算性能和成本上具有无可替代的优势,事实上已成为当前互联网企业主流的大数据分析平台。   一、培训对象 1,
  • 图解Wireshark协议分析实例

    千次阅读 2016-05-19 15:58:32
    分析实例来自于 https://wiki.wireshark.org/SampleCaptures 一 MPTCP协议相关分析 文件iperf-mptcp-0-0.pcap,打开文件; MPTCP,全称Multipath TCP,多径TCP。MPTCP协议是一种利用多条路径并发传输的传输层...
  • 数据挖掘与数据分析

    万次阅读 多人点赞 2018-05-28 13:58:14
    一、数据挖掘和数据分析概述 数据挖掘和数据分析都是从数据中提取一些有价值的信息,二者有很多联系,但是二者的侧重点和实现手法有所区分。 数据挖掘和数据分析的不同之处: 1、在应用工具上,数据挖掘一般要通过...
  • 今天闲的没事干,想试着分析iOS应用的网络数据传输方式。以前就曾经想过这么做,但是由于无法得到iPhone的联网数据,一直没成功。今天尝试了一下,没想到居然比较顺利。
  • 随着互联网的飞速发展,用户积累的数据越来越多,企业从大数据中挖掘有价值的信息似乎成了主流,加上各种营销,导致许多人想转行数据分析师,认为入门门槛相对较低、工资高于大多传统行业岗位,当然我也是其中一个,...
  • 本文介绍基于最简单的操作流程保存Python网络爬虫抓取的数据,通过2个完整的代码示例来介绍爬虫抓取的数据是如何保存到数据仓库中。 存储Mysql应用实例 #coding=utf-8 import urllib import urllib.request import ...
  • Python金融大数据分析——第5章 数据可视化 笔记

    万次阅读 多人点赞 2018-06-26 20:36:45
    第5章 数据可视化 5.1 二维绘图 5.1.1 一维数据集 按照给定的x和y值绘图 import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline # 如果是在控制台上执行代码,这行如果报错,下面的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 289,482
精华内容 115,792
关键字:

互联网大数据分析实例