数据科学家实操之路-阿里云开发者社区

开发者社区> 开发与运维> 正文

数据科学家实操之路

简介: Kaggle最近进行了一项旨在评估数据科学和机器学习当前发展状况的调查。 他们收到了将近17000份答卷,并利用这些答卷做出了大量的分析。

更多深度文章,请关注:https://yq.aliyun.com/cloud


Kaggle最近进行了一项旨在评估数据科学和机器学习当前发展状况的调查。 他们收到了将近17000份答卷,并利用这些答卷做出了大量的分析。对于调查结果的分析报告,我并不感兴趣,我只是想看看这些调查结果是否对我这种想知道如何成为数据科学家的人来说是否有用。

如果你对分析过程并不感兴趣,而只想看看17000个行业专业人士的说法,那么请跳到本文的最后一节阅读结论。 否则,请继续阅读下文,看看我是如何得出结论的。

1. 导入和预处理

1.1. 导入数据

library(data.table)library(dplyr, warn.conflicts =FALSE)library(ggplot2)library(tibble)

results <- as.tibble(suppressWarnings(fread("../input/multipleChoiceResponses.csv")))

1.2. 数据预处理

在分析过程中遇到的许多职位和专业的名字都很长,因此,我缩短了其中一些名字的长度,这样可以让图表更具可读性。我删除了其中的非法字符,并将工作满意度转换为数字。

results$CurrentJobTitleSelect[results$CurrentJobTitleSelect =="Software Developer/Software Engineer"]<-"Software Engineer"
results$CurrentJobTitleSelect[results$CurrentJobTitleSelect =="Operations Research Practitioner"]<-"Operations Research"

results$MajorSelect[results$MajorSelect =="Engineering (non-computer focused)"]<-"Engineering"
results$MajorSelect[results$MajorSelect =="Information technology, networking, or system administration"]<-"Information technology"
results$MajorSelect[results$MajorSelect =="Management information systems"]<-"Information systems"

results_names <-names(results)
results_names[results_names =="WorkMethodsFrequencyA/B"]<-"WorkMethodsFrequencyABTesting"
results_names[results_names =="WorkMethodsFrequencyCross-Validation"]<-"WorkMethodsFrequencyCrossValidation"names(results)<- results_names

results$JobSatisfaction <-suppressWarnings(as.numeric(substr(results$JobSatisfaction, start =1, stop =2)))

1.3. 主题

在整个分析过程中,我需要显示多个数据,因此,我这里要提一下这个可以让图表变得更漂亮的东西。我将在大多数的图表中都使用这个主题。

jack_theme <- theme(
    plot.background = element_rect(fill ="#eeeeee"),
    panel.background = element_rect(fill ="#eeeeee"),
    legend.background = element_rect(fill ="#eeeeee"),
    legend.title = element_text(size =12, family ="Helvetica", face ="bold"),
    legend.text = element_text(size =9, family ="Helvetica"),
    panel.grid.major = element_line(size =0.4, linetype ="solid", color ="#cccccc"),
    panel.grid.minor = element_line(size =0),
    plot.title = element_text(size =20, family ="Helvetica", face ="bold", hjust =0.5, margin = margin(b =20)),
    axis.title = element_text(size =14, family ="Helvetica", face ="bold"),
    axis.title.x = element_text(margin = margin(t =20)),
    axis.title.y = element_text(margin = margin(r =20)),
    axis.ticks = element_blank(),
    plot.margin = unit(c(1,1,1,1),"cm"))

2. 开始

2.1. 编程语言

许多新手问自己的第一个问题是他们应该学习哪种编程语言。 在这个图表中,我们可以看到各个职位的被调查者们是如何看待Python和R语言的。

results %>%
    rename(Language = LanguageRecommendationSelect, title = CurrentJobTitleSelect)%>%
    filter(Language =="R"| Language =="Python")%>%
    filter(title !="")%>%
    group_by(title, Language)%>%
    count()%>%
    ggplot(aes(title, n, color = Language))+
    ggtitle("Python vs. R by Job Title")+
    labs(x ="Job Title", y ="Count")+
    geom_point(size =4)+
    jack_theme +
    theme(
        axis.text.x = element_text(angle =330, hjust =0),
        axis.title.x = element_text(margin = margin(t =12)))

1.png

正如我们所看到的,在几乎所有的场景中,初学者对Python的喜欢程度都超过了R,对于数据科学家、软件开发人员和机器学习工程师来说,尤其如此。 不过,统计学家更喜欢R。研究员也更喜欢R,但我认为这是由于样本太小的原因导致的。

2.2. 专业和可能的职位

我还没上大学,所以还没有选择专业。 但是,我在直觉上认为,有些专业比其他专业更具担任某些职位的可能性。 下面的图表可以用来证实或反驳我的观点,我们来看下某个专业的人们有多大的比例从事某个职位。

results %>%
    rename(Major = MajorSelect, title = CurrentJobTitleSelect)%>%
    filter(title !="", Major !="")%>%
    group_by(title, Major)%>%
    summarize(n = n())%>%
    mutate(freq = n /sum(n)*100)%>%
    ggplot(aes(x = title, y = freq, fill = Major, label =ifelse(freq >8,round(freq),"")))+
    ggtitle("Major vs. Job Title")+
    labs(x ="Job Title", y ="Frequency (%)")+
    geom_bar(stat ="identity", position = position_stack())+
    geom_text(position = position_stack(vjust =0.5))+
    scale_y_continuous(expand =c(0,0))+
    jack_theme +
    theme(
        axis.title.x = element_text(margin = margin(t =8)),
        axis.text.x = element_text(angle =320, hjust =0))

2.png

我的直觉基本上是正确的,专业是预测某人未来会从事哪些工作的最好依据。其中一些趋势是显而易见的:计算机科学专业的人倾向于成为计算机科学家、程序员和软件工程师,而数学专业则倾向于成为统计学家和预测模型师。大部分物理学专业都进入了研究领域,而非计算机科学工程专业的人则称自己为工程师。

我个人非常喜欢这个图表,每个专业的人都涵盖了所有的职位。对我来说,这表明不管你在学校里学的是什么专业,只要有激情,你就可以做好你想做的事。

3. 学什么

3.1. 学习资源

调查问卷中有一个问题是关于学习资源对学习数据科学的用处有多大。在下一张图表中,我绘制了每个学习资源受欢迎程度和有用性之间的关系。受欢迎度是回答这个问题的人数,有用性则是答案和回答者数量的的加权平均值。如果答案是“非常有用”,则权重为1,“有点有用”权重为0.5,如果没有用处,则权重为零。在这个图表中,我们不仅可以看到哪里的资源最有用,而且可以知道哪里的资源被过度使用或利用不足。

# Get all column names that begin with "LearningPlatformUsefulness"
platforms <-grep("^LearningPlatformUsefulness",names(results), value=T)

names <-c()
popularities <-c()
scores <-c()for(platform in platforms){
    usefulness <- results %>%
        group_by_(platform)%>%
        count()# Popularity = the number of people who responded to this question
    popularity <- usefulness[[2]][2]+ usefulness[[2]][3]+ usefulness[[2]][4]# Usefulness = a weighted average determining the usefulness of this platform
    score <-(usefulness[[2]][2]*0+ usefulness[[2]][3]*0.5+ usefulness[[2]][4]*1)/ popularity
    
    names <-c(names,gsub("LearningPlatformUsefulness","", platform))
    popularities <-c(popularities, popularity)
    scores <-c(scores, score)}

scores_df <-data.frame(
    Popularity = popularities,
    Usefulness = scores,
    Name =names)

ggplot(scores_df, aes(x = Usefulness, y = Popularity))+
    ggtitle("Effectiveness of Learning Methods")+
    geom_point()+
    geom_text(aes(label = Name, family ="Helvetica"), nudge_y =200)+
    jack_theme

3.png

从上图中我们可以看出一些浅显的结果。 播客、时事通讯和会议在有用性方面是最低的,而Kaggle竞赛、Stack Overflow、在线课程,以及项目的得分最高。 我们也可以看到,虽然很多人喜欢看YouTube教程和阅读博客帖子,但这可能并不是学习数据科学最有效的方法。

3.2. 重要的工作技能

对于哪些技能在工作中最重要这个问题,我们可以使用与创建上一个图相类似的方法来创建一张新的图。在这张新图中,我同样绘制了流行度与有用性之间的关系,看看哪些技术在现实世界中使用得最多。

# Get all column names that begin with "JobSkillImportance" and end in a letter
platforms <-grep("^JobSkillImportance.*[A-z]$",names(results), value=T)

names <-c()
popularities <-c()
scores <-c()for(platform in platforms){
    usefulness <- results %>%
        group_by_(platform)%>%
        count()# Popularity = the number of people who responded to this question
    popularity <- usefulness[[2]][2]+ usefulness[[2]][3]+ usefulness[[2]][4]# Usefulness = a weighted average determining the usefulness of this platform
    score <-(usefulness[[2]][2]*1+ usefulness[[2]][3]*0.5+ usefulness[[2]][4]*0)/ popularity
    
    names <-c(names,gsub("JobSkillImportance","", platform))
    popularities <-c(popularities, popularity)
    scores <-c(scores, score)}

scores_df <-data.frame(
    Popularity = popularities,
    Usefulness = scores,
    Name =names)

ggplot(scores_df, aes(x = Usefulness, y = Popularity))+
    ggtitle("Important Skills on the Job")+
    geom_point()+
    geom_text(aes(label = Name, family ="Helvetica"), nudge_y =12)+
    jack_theme

4.png

有趣的是,MOOC在实用性方面得分最低,即使是在线课程在最后一个问题中也达到了第二高的分数。 因此,虽然课程对学习数据科学很有帮助,但其他一些学习资源对于提高你的工作技能也非常有用。 我们可以看到,对于提高数据科学工作的技能而言,有关Python、高级统计和可视化工具方面的知识的排名最高。

3.3. 现实世界中的工具

调查问卷中有一个问题是询问受访者使用某种技术的频繁程度。 我没有把这个做成一个散点图,而是把数据放在一个有多个职位的表格中,因为这些答案在本质上已经反应了受欢迎水平。

# Get all column names that begin with "WorkToolsFrequency" and end in a letter
platforms <-grep("^WorkToolsFrequency.*[A-z]$",names(results), value=T)
positions <-c("All","Data Scientist","Software Engineer","Researcher","Machine Learning Engineer")

technologies <-matrix("",10,length(positions))colnames(technologies)<- positions
rownames(technologies)<-1:10

i <-1for(position in positions){
    names <-c()
    popularities <-c()if(position =="All"){
        position_results <- results
    }else{
        position_results <- results %>% filter(CurrentJobTitleSelect == position)}for(platform in platforms){
        usefulness <- position_results %>%
            group_by_(platform)%>%
            count()# Popularity = the number of people who responded to this question
        popularity <- usefulness[[2]][2]+ usefulness[[2]][3]+ usefulness[[2]][4]+ usefulness[[2]][5]# Usefulness = a weighted average determining how much this tool was used
        score <-(usefulness[[2]][2]*1+ usefulness[[2]][3]*0.67+ usefulness[[2]][4]*0.33+ usefulness[[2]][5]*0)/ popularity
        
        names <-c(names,as.character(gsub("WorkToolsFrequency","", platform)))
        popularities <-c(popularities, popularity * score)}
    
    scores_df <-data.frame(
        Popularity = popularities,
        Name =names)
    
    technologies[, i]<-head(as.character((scores_df %>% arrange(desc(Popularity)))$Name), n =10)
    i <- i +1}

technologies

QQ_20171123114003

从这个表格中可以看出,Python、SQL、R、Jupyter、Unix和TensorFlow无处不在。而Spark、Hadoop和Tableau是数据科学家所特有的,NoSQL是软件工程师所特有的,MATLAB只有研究人员和机器学习工程师使用。 虽然其中一些结果可能很容易被猜到,但是对于那些希望在将来从事这些工作的人来说,这确实是一个很有用的表格。

3.4. 重要的工作方法

我们再一次使用了制作之前的表格的方法,但是把工作中使用的技能替换成了方法。 在这里,我们可以看到受访者使用的前10种方法。

# Get all column names that begin with "WorkToolsFrequency" and end in a letter
methods <-grep("^WorkMethodsFrequency.*[A-z]$",names(results), value=T)
positions <-c("All","Data Scientist","Software Engineer","Researcher","Machine Learning Engineer")

technologies <-matrix("",10,length(positions))colnames(technologies)<- positions
rownames(technologies)<-1:10

i <-1for(position in positions){
    names <-c()
    popularities <-c()if(position =="All"){
        position_results <- results
    }else{
        position_results <- results %>% filter(CurrentJobTitleSelect == position)}for(method in methods){
        usefulness <- position_results %>%
            group_by_(method)%>%
            count()# Popularity = the number of people who responded to this question
        popularity <- usefulness[[2]][2]+ usefulness[[2]][3]+ usefulness[[2]][4]+ usefulness[[2]][5]# Usefulness = a weighted average determining how much this tool was used
        score <-(usefulness[[2]][2]*1+ usefulness[[2]][3]*0.67+ usefulness[[2]][4]*0.33+ usefulness[[2]][5]*0)/ popularity
        
        names <-c(names,as.character(gsub("WorkMethodsFrequency","", method)))
        popularities <-c(popularities, popularity * score)}
    
    scores_df <-data.frame(
        Popularity = popularities,
        Name =names)
    
    technologies[, i]<-head(as.character((scores_df %>% arrange(desc(Popularity)))$Name), n =10)
    i <- i +1}

technologies
- 所有人 数据科学家 软件工程师 研究人员 机器学习工程师
1 数据可视化 数据可视化 数据可视化 数据可视化 交叉验证
2 交叉验证 交叉验证 交叉验证 交叉验证 神经网络
3 逻辑回归 逻辑回归 神经网络 神经网络 数据可视化
4 决策树 随机森林 逻辑回归 逻辑回归 卷积神经网络
5 随机森林 决策树 决策树 主成分分析 自然语言处理
6 时序分析 时序分析 时序分析 时序分析 逻辑回归
7 神经网络 文本分析 文本分析 卷积神经网络 随机森林
8 主成分分析 集成方法 随机森林 决策树 决策树
9 文本分析 主成分分析 自然语言处理 支持向量机 主成分分析
10 邻近算法 GBM A/B测试 自然语言处理 集成方法

从这个表格中可以看出,每个人都在使用数据可视化、交叉验证、逻辑回归和决策树。自然语言处理和神经网络对于机器学习工程师来说使用更为频繁,而软件工程师是唯一一个经常使用A/B测试的职业。

4. 结论

如果你是一位数据科学新手,并且想入门,那么我们以上的分析为你提供了以下这些建议:

  1. 学习Python。Python和R都已经有数十年的历史了,但是正如我们在第一个图表中看到的那样,Python获得了全胜。这个结果也在第四张图中得到了支持,绝大多数的参与者都认为Python是工作中最重要的技能。我相信你很难找到一家完全不使用Python的公司,所以你应该好好学习。
  2. 计算机科学或数学专业。正如我在“专业和职位图”之后所提到的,任何一个专业在每个工作角色中都存在。然而,从图中的比例来看,计算机科学专业和数学专业的人数几乎在每一个角色中都是最多的。虽然这不是必需的,但拥有这两个专业中的任何一个或同时拥有两个专业的学历会给你带来很大的优势。
  3. 参加项目、参加课程,并参与Kaggle比赛。从“最佳学习资源的图表”中我们可以很清楚的看到,参加项目、参加在线课程以及参与Kaggle比赛是学习数据科学三个最有用的资源。
  4. 了解最流行的工具。数据科学相关的工具和库很多很多,但是这次调查让我们看到了被认为是最重要的工具和库。推荐最多的工具是Python、SQL、R、Jupyter和Unix,最值得推荐的方法是数据可视化、交叉验证逻辑回归决策树随机森林

文章原标题《How to Become a Data Scientist》,作者: Jack Cook,译者:夏天,审校:主题曲。

文章为简译,更为详细的内容请查看原文

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章