又在kaggle上找到了一个有趣的NBA数据分析的案例,原文基于python实现,而且代码不是很长,非常好的学习素材,但是在重复原文身高分布直方图的过程中遇到了一些问题,暂时还没有找到原因,下面记录的是自己用R语言实现的过程
(学英语学英语 Exploratory Data Analysis EDA 探索性数据分析)
数据集可直接在kaggle下载Simple NBA EDA | Kaggle,数据集包含3922位球员,8个变量,分别是:X序号,Player(姓名),height(身高cm),weight(体重kg),collage(大学),born(出生的年份),birth_city(出生的城市),birth_state(出生的州)
#查看当前所在路径
getwd()
#更改到数据集所在路径
setwd("../Python_practice/a_kind_of/kaggle_pratice/")
#读入数据
players<-read.csv("Players.csv")
#查看数据维度
dim(players)
#数据集的列名
colnames(players)
#删除缺失数据所在的行
players<-na.omit(players)
函数is.na()可以用来检测是否存在缺失值,比如
y<-c(1,2,3,NA)
is.na(y)
返回的结果为c(FALSE,FALSE,FALSE,TRUE)
用which()函数输出那个一个位置是TRUE,比如
which(is.na(y))
返回结果为 4
函数complete.cases()可用来识别矩阵或者数据框中没有缺失值的行,如果每行都包含完整的数据则返回TRUE;如果每行有一个或者多个缺失数据则返回FALSE。函数na.omit()可以删除所含缺失数据所在的行。
接下来用以身高为横坐标,体重为纵坐标画一幅简单的散点图,添加中位数辅助线,并分别为身高最高和最矮,体重最重和最轻添加数据标签。
p1<-ggplot(players,aes(x=height,y=weight))+geom_point(col="blue")+
geom_vline(xintercept=median(players$height),linetype="dashed")+
geom_hline(yintercept=median(players$weight),linetype="dashed")+
theme_bw()+
labs(title="NBA Players Height&Weight",x="Height(cm)",y="Weight(Kg)")
添加数据标签
X<-c(which(players$height==min(players$height)),
which(players$height==max(players$height)),
which(players$weight==min(players$weight)),
which(players$weight==max(players$weight)))
df<-players[X,]
#使用ggrepel添加数据标签
library(ggrepel)
p2<-p1+
geom_point(data=df,aes(x=df$height,y=df$weight),color="red")+
geom_text_repel(data=df,aes(label=df$Player))
由上图我们可以看出最矮的球员是小虫博格斯,最轻,最重,最高的球员这几个名字还真没有听过。。。
NBA球员身高体重分布直方图
p3<-ggplot(players,aes(height))+
geom_histogram(binwidth=5,fill="blue")+
geom_vline(xintercept=mean(players$height),linetype="dashed")+
theme_bw()+labs(x="Height in Cm",y="")+
scale_y_continuous(expand=c(0,0))+
geom_point(aes(x=200,y=800),col="white")
p3
p4<-ggplot(players,aes(weight))+
geom_histogram(binwidth=5,fill="green")+
geom_vline(xintercept=mean(players$weight),linetype="dashed")+
theme_bw()+labs(x="Weight in kg",y="")+
scale_y_continuous(expand=c(0,0))+
geom_point(aes(x=100,y=750),col="white")
p4
library(ggtree)
multiplot(p3,p4,ncol=2)
PS:柱状图如何根据高低排序暂时们还没有找到解决办法!
collages giving maximum players(向NBA输送最多球员的大学)
df_1<-table(players$collage)
df_1<-as.data.frame(df_1)
df_2<-df_1[which(df_1$Freq>40),]
df_2
ggplot(df_2,aes(x=Var1,y=Freq))+geom_col(fill="blue")+
theme(axis.text.x=element_text(angle=45,vjust=1,hjust=1))+
ylab("")+xlab("")+
geom_text(aes(label=Freq),vjust=-0.5)
杜克大学,加州大学洛杉矶分校(UCLA),北卡,堪萨斯,肯塔基等等都是响当当的篮球名校,接下来还探索了球员出生地所在的州的分布情况,内容和统计球员所在的大学差不多,内容就不再重复。
补充:
之前有一个问题是怎样让柱状图画的时候从大到小排序,找到一篇教程How to plot factors in a specified order in ggplot
代码:
set.seed(357)#设置随机数种子,保证每次随机生成的数据一致
x<-data.frame(name=as.factor(sample(letters,10)),val=runif(10))#生成数据集,sample()是取样函数,runif()生成均匀分布的随机数
library(ggplot2) #加载
ggplot(x,aes(x=name,y=val))+geom_bar(stat="identity")+theme_bw()
如果想要从小到大的顺序的话
x$name<-factor(x$name,level=x$name[order(x$val)]))
ggplot(x,aes(x=name,y=val))+geom_bar(stat="identity")+theme_bw()
另一种方法reorder()
ggplot(x,aes(x=reorder(name,val),y=val))+geom_bar(stat="identity")+theme_bar()
效果和上面一样,如果想要从大到小排序该怎么做呢???第一种level的方法应该可以实现,用reorder()不知道该怎么做,又出现一个问题,另外geom_bar()函数里的stat参数到底是干什么用的呀???