其实每个数据预测都是有前提的,报告这个案例,预测你的工资。在这个例子中,我们的假设前提是什么?
1、 你没有换工作;
2、 你的工作不是有大幅业务变化的销售类工作;
3、 你的公司运作正常;
4、 ......
怎么预测?
虽然案例是简单了一些,但也可以针对数据分析说明一些问题。那么我们怎么预测呢?大致分两个步骤:
0、 工资数据的选择;
1、 将工资图形化;
2、 选择一种拟合工具进行拟合;
不同企业的工资发放有很大区别,有基本工资,绩效奖金,季度奖,年终将,项目将,加班费.....等等,我建议将所有固定收入加起来作为工资收入,
因为老板考虑给你加薪也是会考虑总共会需要多支出多少钱给你,至于变动的部分,因为有变动因素存在,就不好分析了。
以下是我整理的关于我的工资收入(数据经过一些处理)。
2009
| 12600 |
2010
|
14176
|
2011
|
16040
|
2012
| 19660 |
2013
|
22910
|
2014
|
25700
|
2015
|
30710
|
拿到数据后,下一步就是讲数据图形化:
图中的直线代表了你工资的上涨趋势,如果直线向上,越陡说明你工资增长速度越快,也说明你的价值被认同的越多。
下一步就是找一条直线,能够尽可能的拟合你的工资数据,至少从我的数据上来看,工作还是比较稳定,换个角度说,工作缺少冲击力。吐槽一下,不明白同样差不多的人,为什么宁可用更多的钱招聘一个新人,也不要把老员工的工资提升上去,难道呆的时间久了,员工的优点就不明显了吗,只有下一个东家才能发现,呵呵。
通过直线拟合后图形如下:
从直线上看,我们的工资增长基本是一个线性的方式,基本都处于这样一条直线上。
接下来就是对明年工资的预测了,横轴代入变量x,计算y值,结果为32292。
如果看到这里,您也想输入您的工资试试看,那么代码如下,采用Python编写,您最好直接安装winPython,直接包含了很多需要用到的包。
from scipy import stats
import numpy as np
import pylab
x = np.array([1,2,3,4,5,6,7])
y = np.array([12600, 14176, 16040, 19660, 22910, 25700, 30710])
slope, intercept, r_value, p_value, slope_std_error = stats.linregress(x, y)
print(slope);
print(intercept);
print(r_value);
print(p_value);
print(slope_std_error);
predict_y = intercept + slope * x
pred_error = y - predict_y
degrees_of_freedom = len(x) - 2
residual_std_error = np.sqrt(np.sum(pred_error**2) / degrees_of_freedom)
# Plotting
pylab.plot(x, y, 'o')
pylab.plot(x, predict_y, 'k-')
pylab.show()
new_value = intercept + slope*8;
print(new_value);
以上只是实践的部分,关于理论部分,我也稍微啰嗦几句。
从上边的实践过程可以看出,其实预测的本质是拟合现有的数据,通过拟合的函数来推测未知点的值。这个其实就和我们小时候解方程一样,已知两点,求一条直线,然后通过直线方程求另外点的值。很简单,但是这么简单的道理放在实际应用中却不简单,主要难点有:
1、 数据的干净性,一般收集的数据很可能是有误差,甚至错误数据;
2、 已知数据的量太小,如果按年来收集数据,可能只有十几组数据;
所以针对这些难点,我们有很多数据过滤的方法,因为不知道数据内在的规律,只能通过对各种函数进行尝试,然后进行拟合度评价,从而得到就已知数据来说最好的拟合函数,但实际上我们一定要时刻问自己找到的拟合函数真的符合数据规律吗?
在刚刚的描述中,涉及了一个非常重要的问题,那就是函数的参数如何确定,如何找到能够最拟合数据的函数参数,这个就是数据分析中很重要的优化问题了。
数据分析的本质就是找到最合适的函数来表达数据。