Data Science with R in 4 Weeks - Week 1 - Day1

这会是一个比较长的系列。重点放在如何用R来进行复杂的数据和业务分析,包括:基本数据分析,数据可视化,常用的数据分析模型,及一个长案例。

主要还是使用美国NBA联盟的数据。

Download from:http://opensourcesports.com/files/basketball/BasketballDB-20130121.zip


Week 1 -Day 1

Reading in Data

数据分析的第一步就是读入你要分析的数据。temp <- read.csv("basketball_players.csv"); 

目前我们读入的数据是,每个球员在自己的所有职业赛季里面每个赛季的表现。

Viewing data

head(temp), tail(temp), 这两个命令分别显示temp的头几行和最后几行

如果想看文件的summary,就summary(temp);

想看每个列的名字,colnames(temp)

如果想看有多少行,nrow(temp)

如果想看有多少列,ncol(temp)

或者dim(temp)

想看每个列的数据是什么类型, str(temp)

安装package

如果install.packages("xx")不能成功的话,则先把要用的package下载下来。

(1) 然后放到你的根目录;放到别的目录也行,只是后面要指明路径

(2)在terminal中,输入  sudo R CMD INSTALL package.tar.gz;记得把package换成你要用的package的名字


Analyzing Data

例子1: 一共有多少球员呢?

x <- count(temp, vars=c("playerID") -  每个playerID出现多少次

nrow(x)  - 唯一不重复的playerID

x <- aggregate(temp, by=list(temp$playerID), length)

dim(x)

例子2: 每个赛季有多少球员?

test <- aggregate(temp, by=list(temp$year), length)

注意,这样虽然能得到正确的结果,但得到的结果其实并不简介和干净。 可以采用

x <- aggregate(temp["year"], by=list(temp$year), length), 得到的结果是:

Group.1 year

1    1937  142

2    1938  124

3    1939  112

4    1940  92

5    1941  95

6    1942  68

这样的结果虽然是对的,按还不是完全正确的,因为我们用的是year做count,而原始数据里面恰好每个球员在每一年的数据都是一条记录,所以count year和count player是一样的结果。

正确的做法是:

> y <- aggregate(temp["playerID"], by=list(temp$year), length)

> head(y)

Group.1 playerID

1    1937      142

2    1938      124

3    1939      112

4    1940      92

5    1941      95

6    1942      68

下面再看一些其他的例子。 球队的表现怎么样?我们是使用的数据basketball_teams.csv

关注csv里面各项的注释,请参考:

http://stats.nba.com/player/#!/201599/?p=deandre-jordan

例子3: 历史上,单赛季场均得分最高的球队是哪只,是哪年?历史上,单赛季场均丢分最多的球队是哪只,是哪年

对这个问题,我们希望先计算出每个球队在过去赛季里面的场均得分,然后将场均得分这一列加入到原来的数据里面,最后在找出是那个球队场均得分最多,也就是排序。

team <- read.csv("basketball_teams.csv")

teamdata <- as.data.frame(team) - convert to datafram

teamdata["new_column"] <- NA   -  add a new column and filled with NA

teamdata$new_column <- teamdata$o_pts / teamdata$games - calculate 

newdata <- teamdata[order(-teamdata$new_column),] - 排序

这里还有一个问题,有些team 打了0场比赛,在计算的时候会将他们的值记做无穷大,怎么出去这些数据呢?所以我们要重新处理一下计算数据

teamdata$new_column <- ifelse(teamdata$game == 0, NA, teamdata$o_pts / teamdata$games)  : 如果game是0的话,结果是NA,而不是无穷大

summary(teamdata$new_column) 我们发现,最大的原来是是126.50

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's

0.00  94.77  102.60  98.32  109.50  126.50      90

重新排序。

如果只想输出球队名称和场均得分的话:

> stas <- newdata[,c("name", "new_column")]

输出结果是这样子的:

name new_column

234          Oakland Oaks  126.4872

555        Denver Nuggets  126.4756

152 Philadelphia Warriors  125.4375

198    Philadelphia 76ers  125.2222

130        Boston Celtics  124.4933

601        Denver Nuggets  123.7439

还有一个问题。上面的结果给出的是所有球队的表现,我们如果只想看到得分最高的呢?这个问题实际是:how to Return row of Data Frame based on value in a column - R

http://stackoverflow.com/questions/24831580/return-row-of-data-frame-based-on-value-in-a-column-r

y <- stas[which(stas$new_column == max(stas$new_column, na.rm= TRUE)), ]

> head(y)

name new_column

234 Oakland Oaks  126.4872

最小值:

y <- stas[which(stas$new_column == min(stas$new_column, na.rm= TRUE)), ]

name new_column

89 Baltimore Bullets          0


丢分最多的球队的R code:

temp <- read.csv("basketball_teams.csv")

teamdata <- as.data.frame(temp)

teamdata$new_column <- ifelse(teamdata$games == 0, NA, teamdata$d_pts / teamdata$games)

stats <- teamdata[, c("name","year","new_column")]

> y <- stats[which(stats$new_column == max(stats$new_column, na.rm= TRUE)), ]

> y

name year new_column

769 Denver Nuggets 1990  130.7683

答案是1990年的丹佛掘金队。那个赛季,他们平均每场丢掉(让对手)得到 130.

例子4:历史上,单赛季胜率最高的球队是哪只,是哪一年?历史上,败率最高的球队是哪只,是哪一年?

和前面相似的code。只是我们要找的是球队的胜率,而不是单场得分和丢分的效率。

temp <- read.csv("basketball_teams.csv")

teamdata <- as.data.frame(temp)

teamdata$new_column <- ifelse(teamdata$games == 0, NA, teamdata$won / teamdata$games)

stats <- teamdata[, c("name","year","new_column")]

> y <- stats[which(stats$new_column == max(stats$new_column, na.rm= TRUE)), ]

结果是这两只球队胜率最高。

name year new_column

1445    Chicago Gears 1947          1

1448 Houston Mavericks 1947          1

查看原始数据后会发现,Chicago Gears在1947年打了8场比赛,赢了8场比赛,所以胜率是1.


例子5: 芝加哥公牛队历史的胜率是什么样子的?

和前面的code稍微不同的是,这次我们需要输出的是公牛队的胜率,而不是所有球队的胜率。

因为我们要根据一些条件来选出想要的row,所以,可以用subset的命令:

http://stackoverflow.com/questions/1536590/how-to-select-rows-from-data-frame-with-2-conditions

具体的code:

> temp <- read.csv("basketball_teams.csv")

> teamdata <- as.data.frame(temp)

> teamdata$new_column <- ifelse(teamdata$games == 0, NA, teamdata$won / teamdata$games)

> stats <- teamdata[, c("name","year","new_column")]

z <- subset(stats, stats$name == "Chicago Bulls")

会看到,结果是这个样子的:

> head(z)

name year new_column

193 Chicago Bulls 1966  0.4074074

214 Chicago Bulls 1967  0.3536585

238 Chicago Bulls 1968  0.4024390

263 Chicago Bulls 1969  0.4756098

289 Chicago Bulls 1970  0.6219512

317 Chicago Bulls 1971  0.6951220

推荐阅读更多精彩内容