理解啞變量( dummy variable )
- 啞變量只有0或者1兩個(gè)取值
- 啞變量就像是一個(gè)開關(guān)
比如有一個(gè)函數(shù): y=30+1.2x+5m氓拼, 其中 x 是變量你画,m是啞變量。那么:
- x=1,m=0時(shí)桃漾,y=31.2
- x=2,m=0時(shí)坏匪,y=32.4
- x=3,m=0時(shí),y=33.6
- x=4,m=1時(shí)撬统,y=39.8
- x=5,m=0時(shí)适滓,y=36
從這組值的變化關(guān)系,我們對(duì)啞變量m有了比較直觀的一個(gè)認(rèn)識(shí)恋追。如果要放到現(xiàn)實(shí)生活的場(chǎng)景中來理解凭迹,可以舉這樣一個(gè)栗子:一支籃球隊(duì)中有個(gè)神經(jīng)刀,他發(fā)揮好時(shí)苦囱,真的是擋不住嗅绸,一個(gè)當(dāng)5個(gè)用,還有個(gè)全明星撕彤,一個(gè)當(dāng)1.2個(gè)用鱼鸠。全明星級(jí)的球員,表現(xiàn)穩(wěn)定喉刘,所以隨著上場(chǎng)時(shí)間x不斷增加瞧柔,對(duì)球隊(duì)的貢獻(xiàn)也不斷增加,而神經(jīng)刀則是一般不發(fā)揮睦裳,發(fā)揮的時(shí)候效果是5 造锅;而其他角色球員加到一起,一場(chǎng)球下來廉邑,總共的貢獻(xiàn)值就是30分左右哥蔚。
這支球隊(duì)的發(fā)揮水準(zhǔn) y 就可以用函數(shù) y=30+1.2x+5m 來表達(dá),其中 m=0 or 1蛛蒙。
含有啞變量的回歸擬合
首先模擬生成一組數(shù)據(jù)糙箍,(x,y)點(diǎn)分布在 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
# 一場(chǎng)籃球賽48分鐘牵祟,分100個(gè)樣本時(shí)間段來考察
nsample=100
x=np.linspace(0,48,nsample)
# 假定神經(jīng)刀同學(xué)在 10-22, 35-39分鐘時(shí)爆發(fā)
m=np.zeros(nsample,int)
m[10:22]=1
m[35:39]=1
# 假定全明星同學(xué)打滿全場(chǎng)深夯,設(shè)定影響系數(shù)
beta=[30,1.2,5]
X=np.column_stack((x,m))
X=sm.add_constant(X)
# 創(chuàng)造一點(diǎn)偶發(fā)影響因素
e=np.random.normal(size=nsample)
# 計(jì)算每一個(gè)時(shí)間段的總和影響值
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')
從圖像上看,隨機(jī)模擬這個(gè)球隊(duì)一場(chǎng)球下來,得分大概在90分左右咕晋。
回歸擬合
model=sm.OLS(y,X)
result=model.fit()
print result.params
[ 29.92106943 1.20047889 5.40786752]
打印結(jié)果表明雹拄,擬合函數(shù)為:y=29.92+1.20x+5.41m ,這與之前的 y=30+1.2x+5m 基本是吻合的掌呜。下面滓玖,再將函數(shù)圖形繪制出來,與前面的散點(diǎn)圖疊加质蕉。
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')
結(jié)論
擬合結(jié)果與隨機(jī)模擬的現(xiàn)實(shí)非常接近势篡。后續(xù)還可以擴(kuò)展,將不同的球員結(jié)合不同的啞變量表示出來模暗,更全面的反應(yīng)一支球隊(duì)的狀況禁悠。