数据分析师—技术面试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析师—技术面试相关的知识,希望对你有一定的参考价值。

数据分析师—技术面试三月份开始找实习,到现在已经有半年的时间了,在这半年的时间中,该经历的基本上都已经经历,春招实习时候,拿到了7

参考技术A 数据分析师—技术面试
三月份开始找实习,到现在已经有半年的时间了,在这半年的时间中,该经历的基本上都已经经历,春招实习时候,拿到了7个offer,校招时候,成功的拿下一份心仪的工作,结束了我的秋招旅程。对于面试,技术层面即算法、软件等等,业务层面就是忽悠(毕竟没有做过完整的项目),但是也要有自己的逻辑和思考方式(这方面我也有很大的欠缺),下面将自己的面试经历梳理为技术层面和业务层面,来分享给大家。
技术面试
一、软件

1. R语言的文件读取:csv文件的读取方式(read.csv),txt文件的读取方式(read.table)
2. R语言中一些小函数的作用
①apply函数:1代表调用每一行的函数,0代表调用每一列的函数(注意其用法和Python的区别)
②runif函数:生成均匀分布的随机数
③sample(,return = TRUE):随机有放回的抽样
3. Python中list列表和元组的最大区别:元组的值不可以改变,但是列表的值是可以改变的。
4.数据库中表的连接方式
①内部连接:inner join
②外部连接:outer join
③左连接:left join
注:对于数据分析,建议大家无论是R,Python,sql都有自己一套流程化的体系,这一体系可以很好的帮助你解决实际中的问题。
二、算法

对于算法(分类,聚类,关联等),更是建议大家有一套流程化的体系,在面试算法的时候,是一个依次递进的过程,不要给自己挖坑,相反,更要将自己的优势发挥的淋漓尽致,把自己会的东西全部释放出来。
下面我将自己的所有面试串联起来,给大家分享一下,仅供参考。
面试官:小张同学,你好,看了你的简历,对相关算法还是略懂一些,下面开始我们的面试,有这么一个场景,在一个样本集中,其中有100个样本属于A,9900个样本属于B,我想用决策树算法来实现对AB样本进行区分,这时会遇到什么问题:
小张:欠拟合现象,因为在这个样本集中,AB样本属于严重失衡状态,在建立决策树算法的过程中,模型会更多的偏倚到B样本的性质,对A样本的性质训练较差,不能很好的反映样本集的特征。
面试官:看你决策树应该掌握的不错,你说一下自己对于决策树算法的理解?
小张:决策树算法,无论是哪种,其目的都是为了让模型的不确定性降低的越快越好,基于其评价指标的不同,主要是ID3算法,C4.5算法和CART算法,其中ID3算法的评价指标是信息增益,C4.5算法的评价指标是信息增益率,CART算法的评价指标是基尼系数。
面试官:信息增益,好的,这里面有一个信息论的概念,你应该知道的吧,叙述一下
小张:香农熵,随机变量不确定性的度量。利用ID3算法,每一次对决策树进行分叉选取属性的时候,我们会选取信息增益最高的属性来作为分裂属性,只有这样,决策树的不纯度才会降低的越快。
面试官:OK,你也知道,在决策树无限分叉的过程中,会出现一种现象,叫过拟合,和上面说过的欠拟合是不一样的,你说一下过拟合出现的原因以及我们用什么方法来防止过拟合的产生?
小张:对训练数据预测效果很好,但是测试数据预测效果较差,则称出现了过拟合现象。对于过拟合现象产生的原因,有以下几个方面,第一:在决策树构建的过程中,对决策树的生长没有进行合理的限制(剪枝);第二:在建模过程中使用了较多的输出变量,变量较多也容易产生过拟合;第三:样本中有一些噪声数据,噪声数据对决策树的构建的干扰很多,没有对噪声数据进行有效的剔除。对于过拟合现象的预防措施,有以下一些方法,第一:选择合理的参数进行剪枝,可以分为预剪枝后剪枝,我们一般用后剪枝的方法来做;第二:K-folds交叉验证,将训练集分为K份,然后进行K次的交叉验证,每次使用K-1份作为训练样本数据集,另外的一份作为测试集合;第三:减少特征,计算每一个特征和响应变量的相关性,常见的为皮尔逊相关系数,将相关性较小的变量剔除,当然还有一些其他的方法来进行特征筛选,比如基于决策树的特征筛选,通过正则化的方式来进行特征选取等。
面试官:你刚刚前面有提到预剪枝和后剪枝,当然预剪枝就是在决策树生成初期就已经设置了决策树的参数,后剪枝是在决策树完全建立之后再返回去对决策树进行剪枝,你能否说一下剪枝过程中可以参考的某些参数?
小张:剪枝分为预剪枝和后剪枝,参数有很多,在R和Python中都有专门的参数来进行设置,下面我以Python中的参数来进行叙述,max_depth(树的高度),min_samples_split(叶子结点的数目),max_leaf_nodes(最大叶子节点数),min_impurity_split(限制不纯度),当然R语言里面的rpart包也可以很好的处理这个问题。
面试官:对了,你刚刚还说到了用决策树来进行特征的筛选,现在我们就以ID3算法为例,来说一下决策树算法对特征的筛选?
小张:对于离散变量,计算每一个变量的信息增益,选择信息增益最大的属性来作为结点的分裂属性;对于连续变量,首先将变量的值进行升序排列,每对相邻值的中点作为可能的分离点,对于每一个划分,选择具有最小期望信息要求的点作为分裂点,来进行后续的决策数的分裂。
面试官:你刚刚还说到了正则化,确实可以对过拟合现象来进行很好的调整,基于你自己的理解,来说一下正则化?
小张:这一块的知识掌握的不是很好,我简单说一下自己对这一块的了解。以二维情况为例,在L1正则化中,惩罚项是绝对值之和,因此在坐标轴上会出现一个矩形,但是L2正则化的惩罚项是圆形,因此在L1正则化中增大了系数为0的机会,这样具有稀疏解的特性,在L2正则化中,由于系数为0的机率大大减小,因此不具有稀疏解的特性。但是L1没有选到的特性不代表不重要,因此L1和L2正则化要结合起来使用。
面试官:还可以吧!正则化就是在目标函数后面加上了惩罚项,你也可以将后面的惩罚项理解为范数。分类算法有很多,逻辑回归算法也是我们经常用到的算法,刚刚主要讨论的是决策树算法,现在我们简单聊一下不同分类算法之间的区别吧!讨论一下决策树算法和逻辑回归算法之间的区别?
小张:分为以下几个方面:第一,逻辑回归着眼于对整体数据的拟合,在整体结构上优于决策树;但是决策树采用分割的方法,深入到数据内部,对局部结构的分析是优于逻辑回归;第二,逻辑回归对线性问题把握较好,因此我们在建立分类算法的时候也是优先选择逻辑回归算法,决策树对非线性问题的把握较好;第三,从本质来考虑,决策树算法假设每一次决策边界都是和特征相互平行或垂直的,因此会将特征空间划分为矩形,因而决策树会产生复杂的方程式,这样会造成过拟合现象;逻辑回归只是一条平滑的边界曲线,不容易出现过拟合现象。
面试官: 下面呢我们来聊一下模型的评估,算法进行模型评估的过程中,常用的一些指标都有哪些,精度啊?召回率啊?ROC曲线啊?这些指标的具体含义是什么?
小张:精度(precision),精确性的度量,表示标记为正例的元组占实际为正例的比例;召回率(recall),完全性的度量,表示为实际为正例的元组被正确标记的比例;ROC 曲线的横坐标为假阳性,纵坐标为真阳性,值越大,表示分类效果越好。
(to be honest,这个问题第一次我跪了,虽然说是记忆一下肯定没问题,但是当时面试的那个时候大脑是一片空白)
面试官:聚类分析你懂得的吧!在我们一些分析中,它也是我们经常用到的一类算法,下面你介绍一下K-means算法吧!
小张:对于K-means算法,可以分为以下几个步骤:第一,从数据点中随机抽取K个数据点作为初始的聚类中心;第二:计算每个点到这K个中心点的距离,并把每个点分到距离其最近的中心中去;第三:求取各个类的均值,将这些均值作为新的类中心;第四:重复进行步骤二三过程,直至算法结束,算法结束有两种,一种是迭代的次数达到要求,一种是达到了某种精度。
后记
面试的水很深,在数据分析技术面的时候问到的东西当然远远不止这些,因此在我们的脑子里面一定要形成一个完整的体系,无论是对某一门编程语言,还是对数据挖掘算法,在工作中都需要形成你的闭环,在面试中更是需要你形成闭环,如何更完美的包装自己,自己好好总结吧!
附录
R语言数据处理体系:数据简单预处理个人总结
1、数据简单查看
⑴查看数据的维度:dim
⑵查看数据的属性:colnames
⑶查看数据类型:str
注:有一些算法,比如说组合算法,要求分类变量为因子型变量;层次聚类,要求是一个距离矩阵,可以通过str函数进行查看
⑷查看前几行数据:head
注:可以初步观察数据是不是有量纲的差异,会后续的分析做准备
⑸查看因子型变量的占比情况:table/prop.table
注:可以为后续数据抽样做准备,看是否产生类不平衡的问题
2、数据缺失值处理
⑴summary函数进行简单的查看
⑵利用mice和VIM包查看数据缺失值情况,代表性函数: md.pattern、aggr
⑶caret包中的preProcess函数,可以进行缺失值的插补工作,有knn、袋装、中位数方法
⑷missForest包中的missForest函数,可以用随机森林的方法进行插补
⑸可以用回归分析的方法完成缺失值插补工作
⑹如果样本量很多,缺失的数据很少,可以选择直接剔除的方法
3、数据异常值处理
⑴summary函数进行简单的查看,比如:最大值、最小值等
⑵boxplot函数绘制箱线图
4、数据抽样
⑴sample函数进行随机抽样
⑵caret包中的createDataPartition()函数对训练样本和测试样本进行等比例抽样
⑶caret包中的createFold函数根据某一个指标进行等比例抽样
⑷DMwR包中SMOTE函数可以解决处理不平衡分类问题
注:比如决策树算法中,如果样本严重不平衡,那么模型会出现欠拟合现象
5、变量的多重共线性处理
⑴结合业务,先删除那些和分析无关的指标
⑵corrgram包的corrgram函数查看相关系数矩阵
⑶caret包中的findCorrelation函数查看多重共线性
⑷如果相关性太大,可以考虑删除变量;如果变量比较重要,可以考虑主成分/因子分析进行降维处理

面试技术点分析

参考链接:https://blog.csdn.net/luo981695830/article/details/82667412?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

1.数据类型有几种、有什么区别

列表  list
元组  tuple
字符串  string
数字   int,float,complex
布尔类型  True,False
字典  dict
集合 set

2.进程、线程、协程定义及区别

进程是操作系统进行资源分配和调度的基本单位,多个进程之间相互独立。
线程是CPU进行资源分配和调度的基本单位,它是比进程更小的能独立运行的基本单位
协程的调度完全由用户控制

区别

线程与进程的比较
1.线程是进程的一个执行单元,进程内至少有一个线程,在一个进程中线程是共享进程的资源,进程与进程之间相互不影响。
2.线程是CPU调度的基本单位,但进程不是
3.二者均可并发执行
4.线程不能独立执行,必须依存在应用程序中(进程)

协程与线程的比较
1.一个线程可以有多个协程,一个进程也可以单独拥有多个协程
2.线程与进程都是同步机制,而协程是异步
3.协程能保留上一次调用的状态

总结

在IO密集型一般使用多线程,CPU密集型使用多进程,强调非阻塞异步并发的一般都是使用协程

3.深浅拷贝的区别

浅拷贝是对原元素的引用,如果修改了原元素中的可变数据类型,拷贝之后的数据也会跟着改

深拷贝是原元素的数据拷贝,放入新开辟的内存地址,修改原元素对深拷贝之后的数据不会产生影响

4.常用设计模式

https://blog.csdn.net/wmj150731/article/details/81589659

5.函数式编程,对象式编程

函数式编程是从头写到尾,中间修改后面也要改(类似流水线生产,从头到尾)

对象式编程相当于组装多个功能,形成一个大功能(类似于把每个流水线生产好的部件在这里组装起来)

6.闭包、装饰器

闭包函数:定义在内部的函数引用外部函数的名字叫做闭包函数

 

 

7.名称空间的查找顺序

查找顺序:局部>>全局>>内置

函数在定义阶段就已经固定查找名字的顺序,不会因为函数的调用的位置改变而改变

8.python中的类可以多继承么,多继承的继承方式

可以,写多个父类就行

9.魔法方法,举例并说明

__init__   初始化函数,在创建实例对象为其赋值时使用
__new__   在__init__之前执行,真正的构造函数,并返回一个实例对象,当做参数self给__init__使用
__call__    当调用一个对象的时候,就会触发类中的__call__方法

创建对象步骤

1.首先调用__new__得到一个对象
2.__init__为这个对象添加属性
3.将对象赋值给变量

10.生成器、迭代器、可迭代对象的定义及区别

可迭代对象:内置有__iter__方法的对象就是可迭代对象
迭代器:可迭代对象执行__iter__方法得到的结果就是迭代器,迭代器既有__iter__方法又有__next__方法
生成器:用户自定义的迭代器,内部加了关键字yield,yield后面的值必须调用__next__方法才能获得
重点:
迭代器一定是可迭代对象,可迭代对象不一定是迭代器
for循环的本质:将in后面的可迭代对象调用__iter__变成迭代器,调用__next__迭代取值

11.垃圾回收机制

引用计数:当内存中的数据没有任何变量名与其有绑定关系,就会被自动回收
标记清除:当内存快要被某个应用程序占满的时候,会自动触发清除
分代回收:根据存活的时间,划分不同的等级,等级越高的垃圾回收机制扫描的频率越低

12.线程安全、死锁、GIL

线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。存在竞争的线程不安全,不存在竞争的线程就是安全的
死锁:死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
GIL:全局解释器锁,不是python的特性,是cpython中的一个概念。在一个进程中所有线程的资源是共享的,为了保证线程的数据完整性,所以使用了GIL,每次只执行一个线程。

13.解决线程不安全的办法

抢票用多线程实现,可能出现多个用户买同一张票的情况

设置锁Lock,在处理数据之前抢到锁,处理完数据之后释放锁。

14.linux常用命令,举例说明

mv  移动文件     
mv   源文件目录   目标文件目录 
mv test3 test2       把test2文件移动到test3下

grep指令和管道符|使用
查看redis的进程号    ps -ef | grep redis
杀死进程     kill  进程号


cp拷贝指令
cp   原路径   目标路径

16.http状态码

http协议四大特性

1.基于请求和响应
2.基于TCP/IP之上作用于应用层的协议
3.无状态(服务端无法保存用户的状态)
4.无链接(请求来一次就响应一次,之后立马断开连接)

请求数据格式

请求首行(标识HTTP协议版本,当前的请求方式)
请求头(一大堆k,v键值对)
/r/n
请求体(一些敏感信息)

五种响应状态码

1XX:服务端已经成功接收了你的数据正在处理,你可以继续提交额外的数据
2xx:服务端成功响应你想要的数据(请求成功200)
3xx:重定向(当你在访问一个需要登录之后才能访问的页面,你会发现窗口会自动调到登录页面) 301 302
4xx:请求错误(请求资源不存在报404,请求不合法不符合内部规定权限不够报403)
5xx:服务器内部错误(500)

17.http和https的区别

1.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
2.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
3.http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

18.网络编程、通信协议

 

19.三次握手、四次回收

 

20.http中get 和 post的区别

 

21.缓存怎么做

就是把需要经常使用的数据提前放在某个地方,可以是本机的内存,也可以放在其他地方,这样做可以减少系统开销,提高系统效率。

22.session、cookie的区别

Session是保存在服务端,用来跟踪用户的状态
Cookie是保存在客户端的,用cookie来实现session跟踪的,第一次创建session的时候,服务端会告诉客户端,在cookie里面记录一个session ID,以后每次请求把这个ID发送到服务端就知道是哪个用户了。

23.TCP UDP区别 

 

以上是关于数据分析师—技术面试的主要内容,如果未能解决你的问题,请参考以下文章

如何准备数据分析师面试?

面试技术点分析

数据库事务深入分析,最全的BAT大厂面试题整理

面试数据分析需要学习django吗?

面试系列文章

大数据技术之_29_MySQL 高級面试重点串讲_02_Mysql 简介+Linux 版的安装+逻辑架构介绍+性能优化+性能分析+查询截取分析+分区分库分表简介+锁机制+主从复制