勝率與薪資,球隊(duì)是否有競爭性優(yōu)勢

討論的問題:綜合考慮勝率與薪資赃承,OKA球隊(duì)相比其他的球隊(duì)是否有競爭性優(yōu)勢妙黍。
數(shù)據(jù)來源:http://seanlahman.com/files/database/lahman-csv_2014-02-14.zip
1、從網(wǎng)絡(luò)上下載需要的CSV文檔瞧剖,這里采用request,stringIO,zipfile進(jìn)行數(shù)據(jù)提仁眉蕖:

def getZIP(zipFileName):
    #以字節(jié)的方式請(qǐng)求
    r = requests.get(zipFileName).content
    #創(chuàng)建內(nèi)存文件
    s = StringIO.StringIO(r)
    zf = zipfile.ZipFile(s,'r')
    return zf
url = 'http://seanlahman.com/files/database/lahman-csv_2014-02-14.zip'
zf = getZIP(url)

數(shù)據(jù)展示如下:

['SchoolsPlayers.csv', 'SeriesPost.csv', 'Teams.csv',       'TeamsFranchises.csv', 'TeamsHalf.csv', 'AllstarFull.csv', 'Appearances.csv', 'AwardsManagers.csv', 'AwardsPlayers.csv', 'AwardsShareManagers.csv', 'AwardsSharePlayers.csv', 'Batting.csv', 'BattingPost.csv', 'Fielding.csv', 'FieldingOF.csv', 'FieldingPost.csv', 'HallOfFame.csv', 'Managers.csv', 'ManagersHalf.csv', 'Master.csv', 'Pitching.csv', 'PitchingPost.csv', 'readme2013.txt', 'Salaries.csv', 'Schools.csv']

這里把需要的salaries和teams這兩個(gè)CSV文件讀取出來:

salaries = pd.read_csv(zf.open(tablenames[tablenames.index('Salaries.csv')]))
print salaries.head()
teams = pd.read_csv(zf.open(tablenames[tablenames.index('Teams.csv')]))
#這里只需要這幾列
teams = teams[['yearID', 'teamID', 'W']]
print teams.head()
     yearID teamID lgID   playerID   salary
0    1985    BAL   AL    murraed02  1472819
1    1985    BAL   AL     lynnfr01  1090000
2    1985    BAL   AL    ripkeca01   800000
3    1985    BAL   AL     lacyle01   725000
4    1985    BAL   AL    flanami01   641667
   yearID teamID   W
0    1871    PH1  21
1    1871    CH1  19
2    1871    BS1  20
3    1871    WS3  15
4    1871    NY2  16

接下來計(jì)算各個(gè)隊(duì)每年的總工資,并把兩個(gè)列表合并起來抓于,W代表勝場:

#一般情況下做粤,聚合數(shù)據(jù)都需要唯一的分組鍵組成的索引,但也可以通過向groupby傳入as_index=False以禁用該功能
totleSalaries = salaries.groupby(['yearID','teamID'],as_index=False).sum()
print totleSalaries.head()
#how="inner"指當(dāng)左右兩個(gè)對(duì)象存在不重合的鍵時(shí)捉撮,inner 代表交集怕品;outer 代表并集;on指的是用于連接的列索引名稱,如果沒有指定且其他參數(shù)也未指定則以兩個(gè)DataFrame的列名交集做為連接鍵
joined = pd.merge(totleSalaries, teams, how="inner", on=['yearID', 'teamID'])
print joined.head()
 yearID    teamID    salary
0    1985    ATL   14807000
1    1985    BAL   11560712
2    1985    BOS   10897560
3    1985    CAL   14427894
4    1985    CHA    9846178
   yearID teamID    salary   W
0    1985    ATL  14807000  66
1    1985    BAL  11560712  83
2    1985    BOS  10897560  81
3    1985    CAL  14427894  90
4    1985    CHA   9846178  85

接下來畫出各個(gè)球隊(duì)每年總的薪水和獲勝次數(shù)的關(guān)系圖,并標(biāo)記處OKA這只球隊(duì):

teamName ='OAK'
years = np.arange(2000,2004)
for year in years:
    df = joined[joined['yearID'] == year]
    print df
    #畫出薪資和勝場的散點(diǎn)圖
    plt.scatter(df['salary'] / 1e6,df['W'])
    plt.title(str(year)+'年'+'勝場與薪資')
    plt.xlabel('總薪水(百萬)')
    plt.ylabel('勝場')
    plt.xlim(0, 180)
    plt.ylim(30, 130)
    plt.grid()
    #標(biāo)記出OKA球隊(duì)
    plt.annotate(teamName,
                 xy=(df['salary'][df['teamID'] == teamName] / 1e6, df['W'][df['teamID'] == teamName]),
                 xytext=(-20, 20), textcoords='offset points', ha='right', va='bottom',
                 bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
                 arrowprops=dict(arrowstyle='->', facecolor='black', connectionstyle='arc3,rad=0'))
    plt.show() 
image.png
image.png
image.png
image.png

可以看出OKA的在2000年到2004年間付出總薪水較少的情況下獲得了比較好的勝利場數(shù)巾遭,接下來用回歸分析證明這一點(diǎn)肉康,并看看更長時(shí)間內(nèi)的數(shù)據(jù)怎么樣,算出各支球隊(duì)的殘差灼舍,就能知道是否如上述推論:

teamName = 'OAK'
years = np.arange(1999, 2014)
def Residual(year):
    residData = pd.DataFrame()
    df = joined[joined['yearID'] == year]
    #原始數(shù)據(jù)橫坐標(biāo)
    x_list = df['salary'].values / 1e6
    #縱坐標(biāo)
    y_list = df['W'].values
    #最小二乘估計(jì)
    A = np.array([x_list, np.ones(len(x_list))])#構(gòu)造系數(shù)矩陣
    y = y_list
    w = np.linalg.lstsq(A.T,y)[0] #求出斜率以及縱截距吼和,w[0]斜率w[1]縱截距
    yhat = (w[0]*x_list+w[1]) # 回歸線
    residData['teamID'] = df['teamID']
    residData[year] = y - yhat
    residData.index = residData['teamID']
    residData = residData.drop(residData.columns[0], axis=1)
    #print residData
    return residData
#將dataframe放入數(shù)組
Residuals = [Residual(year) for year in years]
#按照隊(duì)名合并
Residual_df = reduce(lambda  left,right:pd.merge(left,right,how='outer',left_index=True, right_index=True),Residuals)
print Residual_df
Residual_df = Residual_df.T
Residual_df.plot(title = '各支球隊(duì)的殘差圖', figsize = (15, 8),
               color=map(lambda x: 'blue' if x==teamName else 'gray',Residual_df.columns))
plt.xlabel('年')
plt.ylabel('殘差')
plt.show()

這里主要在于如何將多個(gè)將dataframe拆分成多個(gè)小的dataframe并重新按照不重合的主鍵名合并。

image.png

如圖可以看出片仿,在2000年到2003年間纹安,OKA球隊(duì)偏移回歸線較遠(yuǎn),且殘差為正,說明其能在付出較少薪水的情況下獲得較好的成績厢岂,特別是在2002與2003年光督,偏移最遠(yuǎn),此時(shí)球隊(duì)的性價(jià)比在聯(lián)盟中應(yīng)該是最高的塔粒。但在2004年后结借,殘差往負(fù)的方向走,并持續(xù)多年卒茬,說明此時(shí)球隊(duì)成績不太好船老,但在2010年后有復(fù)蘇的趨勢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圃酵,一起剝皮案震驚了整個(gè)濱河市柳畔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郭赐,老刑警劉巖薪韩,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捌锭,居然都是意外死亡俘陷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門观谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拉盾,“玉大人,你說我怎么就攤上這事豁状∽狡” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵替蔬,是天一觀的道長告私。 經(jīng)常有香客問我,道長承桥,這世上最難降的妖魔是什么驻粟? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮凶异,結(jié)果婚禮上蜀撑,老公的妹妹穿的比我還像新娘。我一直安慰自己剩彬,他們只是感情好酷麦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉恋,像睡著了一般沃饶。 火紅的嫁衣襯著肌膚如雪母廷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天糊肤,我揣著相機(jī)與錄音琴昆,去河邊找鬼。 笑死馆揉,一個(gè)胖子當(dāng)著我的面吹牛业舍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播升酣,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舷暮,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了噩茄?” 一聲冷哼從身側(cè)響起下面,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巢墅,沒想到半個(gè)月后诸狭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡君纫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芹彬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓄髓。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舒帮,靈堂內(nèi)的尸體忽然破棺而出会喝,到底是詐尸還是另有隱情,我是刑警寧澤玩郊,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布肢执,位于F島的核電站,受9級(jí)特大地震影響译红,放射性物質(zhì)發(fā)生泄漏预茄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一侦厚、第九天 我趴在偏房一處隱蔽的房頂上張望耻陕。 院中可真熱鬧,春花似錦刨沦、人聲如沸诗宣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽召庞。三九已至岛心,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篮灼,已是汗流浹背忘古。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穿稳,地道東北人存皂。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像逢艘,于是被迫代替她去往敵國和親旦袋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容