在求职的道路上,当你过了笔试的第一道坎,紧接着尤为重要的就是面试,它将直面公司技术主管与HR。现整理python数据分析与挖掘相关面试题如下(代码已亲试),供自己与有需要的同仁共同学习提高。
活到老,学到老!(梭伦) 终身学习!
面试题
python数据分析
1 列举几个常用的python分析数据包及其作用
数据处理和分析:NumPy, SciPy, Pandas
机器学习:SciKit
可视化: Matplotlib, Seaborn
2 在python中如何创建包含不同类型数据的dataframe
利用pandas包的DataFrame函数的serias创建列然后用dtype定义类型:
df = pd.DataFrame({'x': pd.Series(['1.0', '2.0', '3.0'], dtype=float), 'y': pd.Series(['1', '2', '3'],
dtype=int)})
3 归一化
归一化方法:最小-最大规范化、零-均值规范化、小数定标规范化
作用1:消除量纲,在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。
作用2:提升模型的收敛速度,狭长的标量场经过标准化后变得比较圆,这样会大大提升计算的收敛速度。
4 如何处理缺失数据?(如果缺失的数据不可得,将采用何种手段收集?)
1)删除样本或删除字段
2)用中位数、平均值、众数等填充
3)插补:同类均值插补、多重插补、极大似然估计
4)用其它字段构建模型,预测该字段的值,从而填充缺失值(注意:如果该字段也是用于预测模型中作为特征,那么用其它字段建模填充缺失值的方式,并没有给最终的预测模型引入新信息)
5)onehot,将缺失值也认为一种取值
6)压缩感知及矩阵补全
5 如何避免决策树过拟合
1)限制树深
2)剪枝
3)限制叶节点数量
4)正则化项
5)增加数据
6)bagging(subsample、subfeature、低维空间投影)
7)数据增强(加入有杂质的数据)
8)早停
6 怎么做恶意刷单检测
分类问题用机器学习方法建模解决,我想到的特征有:
1)商家特征:商家历史销量、信用、产品类别、发货快递公司等
2)用户行为特征:用户信用、下单量、转化率、下单路径、浏览店铺行为、支付账号
3)环境特征(主要是避免机器刷单):地区、ip、手机型号等
4)异常检测:ip地址经常变动、经常清空cookie信息、账号近期交易成功率上升等
5)评论文本检测:刷单的评论文本可能套路较为一致,计算与已标注评论文本的相似度作为特征
6)图片相似度检测:同理,刷单可能重复利用图片进行评论
7 讲下 K-Means算法的原理及改进,遇到异常值怎么办?评估算法的指标有哪些?
1)k-means原理:选k个点开始作为聚类中心,然后剩下的点根据距离划分到类中;找到新的类中心;重新分配点;迭代直到达到收敛条件或者迭代次数。 优点是快;缺点是要先指定k,同时对异常值很敏感。
在最小化函数误差的基础上将数据划分为预定的类树K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。
< size=5>2)聚类方法主要有:
a. 层次聚类
b. 划分聚类:kmeans
c. 密度聚类
d. 网格聚类
e. 模型聚类:高斯混合模型
3)改进:
a. kmeans++:初始随机点选择尽可能远,避免陷入局部解。方法是n+1个中心点选择时,对于离前n个点选择到的概率更大。
b. mini batch kmeans:每次只用一个子集做重入类并找到类心(提高训练速度)
c. ISODATA:对于难以确定k的时候,使用该方法。思路是当类下的样本小时,剔除;类下样本数量多时,拆分。
d. kernel kmeans:kmeans用欧氏距离计算相似度,也可以使用kernel映射到高维空间再聚类。
4)遇到异常值
a. 使用密度聚类或者一些软聚类的方式先聚类,剔除异常值。不过本来用kmeans就是为了快,这么做有些南辕北辙。
b. 局部异常因子LOF:如果点p的密度明显小于其邻域点的密度,那么点p可能是异常值。
c. 多元高斯分布异常点检测
d. 使用PCA或自动编码机进行异常点检测:使用降维后的维度作为新的特征空间,其降维结果可以认为剔除了异常值的影响(因为过程是保留使投影后方差最大的投影方向)
e. isolation forest:基本思路是建立树模型,一个节点所在的树深度越低,说明将其从样本空间划分出去越容易,因此越可能是异常值。是一种无监督的方法,随机选择n个sumsampe,随机选择一个特征一个值。
8 SVM的优缺点
1)优点:
a. 能应用于非线性可分的情况
b. 最后分类时由支持向量决定,复杂度取决于支持向量的数目而不是样本空间的维度,避免了维度灾难
c. 具有鲁棒性:因为只使用少量支持向量,抓住关键样本,剔除冗余样本
d. 高维低样本下性能好,如文本分类
2)缺点:
a. 模型训练复杂度高
b. 难以适应多分类问题
c. 核函数选择没有较好的方法论
9 hadoop原理和mapreduce原理
1)Hadoop原理:采用HDFS分布式存储文件,MapReduce分解计算,其它先略
2)MapReduce原理:
a. map阶段:读取HDFS中的文件,解析成的形式,并对 进行分区(默认一个区),将相同k的value放在一个集合中。
b. reduce阶段:将map的输出copy到不同的reduce节点上,节点对map的输出进行合并、排序。
10 简述多线程、多进程
进程:
1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程:
1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
应用:
1、IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间
2、CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势
11 一个网站销售额变低,你从哪几个方面去考量?
1)首先要定位到现象真正发生的位置,到底是谁的销售额变低了?这里划分的维度有:
a. 用户(画像、来源地区、新老、渠道等)
b. 产品或栏目
c. 访问时段
2)定位到发生未知后,进行问题拆解,关注目标群体中哪个指标下降导致网站销售额下降:
a. 销售额=入站流量下单率客单价
b. 入站流量 = Σ各来源流量转化率
c. 下单率 = 页面访问量转化率
d. 客单价 = 商品数量*商品价格
3)确定问题源头后,对问题原因进行分析,如采用内外部框架:
a. 内部:网站改版、产品更新、广告投放
b. 外部:用户偏好变化、媒体新闻、经济坏境、竞品行为等
12 还有用户流失的分析,新用户流失和老用户流失有什么不同?
1)用户流失分析:
a. 两层模型:细分用户、产品、渠道,看到底是哪里用户流失了。注意由于是用户流失问题,所以这里细分用户时可以细分用户处在生命周期的哪个阶段。
b. 指标拆解:用户流失数量 = 该群体用户数量*流失率。拆解,看是因为到了这个阶段的用户数量多了(比如说大部分用户到了衰退期),还是这个用户群体的流失率比较高
c. 内外部分析:
I. 内部:新手上手难度大、收费不合理、产品服务出现重大问题、活动质量低、缺少留存手段、用户参与度低等
II. 外部:市场、竞争对手、社会环境、节假日等
2)新用户流失和老用户流失有什么不同:
a. 新用户流失:原因可能有非目标用户(刚性流失)、产品不满足需求(自然流失)、产品难以上手(受挫流失)和竞争产品影响(市场流失)。
新用户要考虑如何在较少的数据支撑下做流失用户识别,提前防止用户流失,并如何对有效的新用户进行挽回。
b. 老用户流失:原因可能有到达用户生命周期衰退期(自然流失)、过度拉升arpu导致低端用户驱逐(刚性流失)、社交蒸发难以满足前期用户需求(受挫流失)和竞争产品影响(市场流失)。
老用户有较多的数据,更容易进行流失用户识别,做好防止用户流失更重要。当用户流失后,要考虑用户生命周期剩余价值,是否需要进行挽回。
13 怎么向小孩子解释正态分布
(随口追问了一句小孩子的智力水平,面试官说七八岁,能数数)
1)拿出小朋友班级的成绩表,每隔2分统计一下人数(因为小学一年级大家成绩很接近),画出钟形。然后说这就是正态分布,大多数的人都集中在中间,只有少数特别好和不够好
2)拿出隔壁班的成绩表,让小朋友自己画画看,发现也是这样的现象
3)然后拿出班级的身高表,发现也是这个样子的
4)大部分人之间是没有太大差别的,只有少数人特别好和不够好,这是生活里普遍看到的现象,这就是正态分布
14 淘宝办了一次促销活动,从哪些方面来评价这次活动是否成功,结合支付宝来考虑了这个问题
1)明确目标:拉新?促活?提客单?
2)根据目的确定核心指标
3)效果评估:
a. 自身比较:活动前与活动中比较
b. 与预定目标比
c. 与同期其它活动比
d. 与往期同类活动比
4)持续监控:
a. 检查活动后情况,避免透支消费情况发生
b. 如果是拉新等活动,根据后续数据检验这批新客的质量
15 柴静的穹顶之下前段时间很火,你来分析一下为什么能这么火?
1)明确问题:“火”这里有三个方面:
a. 微博上传播大
b. 媒体曝光量大
c. 线下传播与讨论多
2)分析原因(对(1)中abc三种情况分别分析,先用a举例):
传播能力 = 初始曝光能力 * 裂变能力
初始曝光能力是由于柴静自身有巨大的曝光能力,裂变能力是因为信息满足了传播者的需求。对传播者需求进行分析:
a. 内部:信息对传播者有影响(价值、震撼、鼓动等)、信息传播对传播者有利(内在想警醒别人、外在的社会形象、参与社会讨论等)
b. 外部:PEST
16 Linux基本命令
1)目录操作:ls、cd、mkdir、find、locate、whereis等
2)文件操作:mv、cp、rm、touch、cat、more、less
3)权限操作:chmod+rwx421
4)账号操作:su、whoami、last、who、w、id、groups等
5)查看系统:history、top
6)关机重启:shutdown、reboot
7)vim操作:i、w、w!、q、q!、wq等
17 SQL的数据类型
1)字符串:char、varchar、text
2)二进制串:binary、varbinary
3)布尔类型:boolean
4)数值类型:integer、smallint、bigint、decimal、numeric、float、real、double
5)时间类型:date、time、timestamp、interval
18 如何写SQL求出中位数平均数和众数(除了用count之外的方法)
1)中位数:
方案1(没考虑到偶数个数的情况):
set @m = (select count(*)/2 from table)
select column from table order by column limit @m, 1
方案2(考虑偶数个数,中位数是中间两个数的平均):
set @index = -1
select avg(table.column) from (select @index:=@index+1 as index, column from table order by column) as t
where t.index in (floor(@index/2),ceiling(@index/2))
2)平均数:select avg(distinct column) from table
3)众数:select column, count(*) from table group by column order by column desc limit 1(好像用到count了)
19 现有一个数据库表Tourists,记录了某个景点7月份每天来访游客的数量如下: id date visits 1 2017-07-01 100 …… 非常巧,id字段刚好等于日期里面的几号。现在请筛选出连续三天都有大于100天的日期。 上面例子的输出为: date 2017-07-01 ……
select t1.date
from Tourists as t1, Tourists as t2, Tourists as t3
on t1.id = (t2.id+1) and t2.id = (t3.id+1)
where t1.visits >100 and t2.visits>100 and t3.visits>100
20 在一张工资表salary里面,发现2017-07这个月的性别字段男m和女f写反了,请用一个Updae语句修复数据 例如表格数据是: id name gender salary month 1 A m 1000 2017-06 2 B f 1010 2017-06
update salary
set gender = replace('mf', gender, '')
21 统计教授多门课老师数量并输出每位老师教授课程数统计表
设表class中字段为id,teacher,course
1)统计教授多门课老师数量
select count(*) from class
group by teacher having count(*) > 1
2)输出每位老师教授课程数统计
select teacher, count(course) as count_course
from class
group by teacher
22 表user_id,visit_date,page_name,plat 统计近7天每天到访的新用户数 统计每个访问渠道plat7天前的新用户的3日留存率和7日留存率
1)近7天每天到访的新用户数
select day(visit_date), count(distinct user_id)
from table
where user_id not in
(select user_id from table
where day(visit_date) < date_sub(visit_date, interval 7day))
2)每个渠道7天前用户的3日留存和7日留存
三日留存
先计算每个平台7日前的新用户数量
select t1.plat, t1.c/t2.c as retention_3
(select plat, count(distinct user_id)
from table
group by plat, user_id
having day(min(visit_date)) = date_sub(now(), interval 7 day)) as t1
left join
(select plat, count(distinct user_id) as c
from table
group by user_id having count(user_id) > 0
having day(min(visit_date)) = date_sub(now(), interval 7 day)
and day(max(visit_date)) > date_sub(now(), interval 7 day)
and day(max(visit_date)) <= date_sub(now(), interval 4day)) as t2
on t1.plat = t2.plat
23 请找出数列4,9,23,60,157的下一项(A)
A 411
B 314
C 425
D ABC均错
603-23=157,1573-60=411
python程序解析
1 以下代码的输出?
def multipliers():
return [lambda x: i * x for i in range(4)]
print ([m(2) for m in multipliers()])
[6, 6, 6, 6]
原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数 multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。
2 以下代码的输出
def foo(i=[]):
i.append(1)
return i
print(foo())
print(foo())
[1]
[1, 1]
新的默认列表仅仅只在函数被定义时创建一次。当foo没有被指定的列表参数调用的时候,其使用的是同一个列表。
3 创建三角级数类,阅读下列代码回答问题
import numpy as np
import matplotlib.pyplot as plt
class trigonometric_function:
tra_1 = 6
tra_2 = 12
def __init__(self,a,k,l):
self.const1 = a
self.const2 = k
self.const3 = l
def Additive_term(self,x):
self.summand_s = np.sin(self.const2*x + self.tra_1)
self.summand_c = np.cos(self.const3*x + self.tra_2)
def trigon_sum(self,m,n):
sum_1 = sum([sum([self.const1*(self.summand_s**i)*(self.summand_c**j) for i in range(m)]) for j in range(n)])
return sum_1
def draw_pic(self,data):
fig,axes_1 = plt.subplots(1,1,dpi=140,figsize=(6,4))
axes_1.plot(x,data)
f1=trigonometric_function(3,4,6)#类的实例化
x=np.linspace(-5,5,500)#生成500个-5到5之间的点
f1.Additive_term(x)#生成普通三角函数sin和cos
data=f1.trigon_sum(4,5)#生成三角级数数据
f1.draw_pic(data)
plt.show()
a.请在代码中找出类变量、实例变量、方法、对象
类变量:tra1,tra2,const1,const2,const3,summand_s,summand_c
实例变量:x,a,k,l,m,n,data(通常前面没有self.)
方法(属性): Additive_term、trigon_sum、draw_pic
对象:方法、类变量和实例变量
b.self 什么意思?
self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
说明:本文是从相关博文的分享总结与补充而来,如有疑问,还望各位同仁与前辈指正。