理解哑变量( dummy variable )
- 哑变量只有0或者1两个取值
- 哑变量就像是一个开关
比如有一个函数: y=30+1.2x+5m, 其中 x 是变量,m是哑变量。那么:
- x=1,m=0时,y=31.2
- x=2,m=0时,y=32.4
- x=3,m=0时,y=33.6
- x=4,m=1时,y=39.8
- x=5,m=0时,y=36
从这组值的变化关系,我们对哑变量m有了比较直观的一个认识。如果要放到现实生活的场景中来理解,可以举这样一个栗子:一支篮球队中有个神经刀,他发挥好时,真的是挡不住,一个当5个用,还有个全明星,一个当1.2个用。全明星级的球员,表现稳定,所以随着上场时间x不断增加,对球队的贡献也不断增加,而神经刀则是一般不发挥,发挥的时候效果是5 ;而其他角色球员加到一起,一场球下来,总共的贡献值就是30分左右。
这支球队的发挥水准 y 就可以用函数 y=30+1.2x+5m 来表达,其中 m=0 or 1。
含有哑变量的回归拟合
首先模拟生成一组数据,(x,y)点分布在 y=30+1.2x+5m 周边。
%matplotlib inline
import numpy as np
import statsmodels.api as sm
import matplotlib as mpl
import matplotlib.pyplot as plt
# 一场篮球赛48分钟,分100个样本时间段来考察
nsample=100
x=np.linspace(0,48,nsample)
# 假定神经刀同学在 10-22, 35-39分钟时爆发
m=np.zeros(nsample,int)
m[10:22]=1
m[35:39]=1
# 假定全明星同学打满全场,设定影响系数
beta=[30,1.2,5]
X=np.column_stack((x,m))
X=sm.add_constant(X)
# 创造一点偶发影响因素
e=np.random.normal(size=nsample)
# 计算每一个时间段的总和影响值
y=np.dot(X,beta)+e
mpl.rcParams['figure.figsize']=(960/72,480/72)
plt.plot(x,y,'o',color='pink')
plt.xlabel('minutes')
plt.ylabel('score')
plt.grid(True)
plt.savefig('output/basketball01.jpg')
从图像上看,随机模拟这个球队一场球下来,得分大概在90分左右。
回归拟合
model=sm.OLS(y,X)
result=model.fit()
print result.params
[ 29.92106943 1.20047889 5.40786752]
打印结果表明,拟合函数为:y=29.92+1.20x+5.41m ,这与之前的 y=30+1.2x+5m 基本是吻合的。下面,再将函数图形绘制出来,与前面的散点图叠加。
plt.plot(x,y,'o',color='pink',label='score')
plt.plot(x,result.fittedvalues,'b--',label='line')
plt.grid(True)
plt.legend(loc='best')
plt.savefig('output/basketball02.jpg')
结论
拟合结果与随机模拟的现实非常接近。后续还可以扩展,将不同的球员结合不同的哑变量表示出来,更全面的反应一支球队的状况。