【牛客】摩拜2018校招数据分析工程师笔试解析
* 选择题都有正确答案,后面五道大题均是我的答案,欢迎大家讨论纠正!
(https://www.nowcoder.com/test/11453292/summary)
一、选择题
1、在Shell编程中,下面哪个表示上一步所运行程序的返回值()
答:$?
2、在SQL语言中,子查询是( )
答:嵌入到另一个查询语句之中的查询语句
3、从一副牌(52张,不含打小怪)里抽出两张牌,其中一红一黑的概率是
答:26/51
解析:C2,1 * C26,1 * C26,1 / C52,2(C2,1表示两个任选一个不排列的可能数,后面同)
4、SQL中,下列涉及空值的操作,不正确的是?( )
答:name= NULL
解析:NULL不可以用等于号
5、Mysql查询时,只有满足联接条件的记录才包含在查询结果,这种联接是()。
答:内连接
6、在shell中变量的赋值有四种方法,其中,采用name=12的方法称 。
答:直接赋值
7、A表字段a 类型int中有100条记录,值分别为1至100。如下语句
SELECT a FROM A WHERE a BETWEEN 1 AND 50 OR (a IN (25,70,95) AND a BETWEEN 25 AND 75)
则如下哪个值在这个sql语句返回的结果集中?
答:30
解析:我选的51,主要是看错题目,题目说下列哪个数在返回结果,返回结果是1-50和75,所以答案是30.(太奸诈了==!)
8、已知表T1中有2行数据,T2中有3行数据,执行SQL语句,“select a.* from T1 a,T2 b”后,返回的行数为
答:6
解析:因为没有设置连接条件,所以默认笛卡尔积2*3=6
9、从“产品”表里查询出价格高于产品名称为“一次性纸杯”的产品价格的记录,此SQL语句为?
答:SELECT * FROM 产品WHERE 价格>(SELECT 价格FROM 产品WHERE 产品名称=’ 一次性纸杯’);
10、shell不仅仅是用户命令解释器,同时一种强大的编程语言,linux缺省的shell是什么
答:bash
11、想要了解上海市小学生的身高,需要抽取500个样本,这项调查中的样本是?
答:从中抽取的500名学生的身高
12、一组数据,均值>中位数>众数,问这组数据
答:右偏
解析:一般在正态分布,矮的一遍为偏向方,因为每个取值概率小,故取值会变多。
13、SQL语言允许使用通配符进行字符串匹配的操作,其中‘%’可以表示
答:0、1或多个字符
14、关于正态分布,下列说法错误的是:
答:正态分布的偏度为0,峰度为1
15、人患癌症的概率为1/1000.假设有一台癌症诊断仪S1,通过对它以往的诊断记录的分析,如果患者确实患有癌症它的确诊率为90%,如果患者没有癌症,被诊断成癌症的概率是10%。某人在被诊断为癌症后,他真正患癌症的概率为()
答:1/112
解析:
根据贝叶斯公式
设A:癌症诊断仪给出癌症诊断。B1:病人是癌症患者。B2 病人不是癌症患者。
则P(A|B1)=90%,P(A|B2)=10%
P(B1|A)=P(A|B1)*P(B1)/P(A)=P(A|B1)*P(B1)/(P(A|B1)*P(B1)+P(A|B2)*P(B2))=(90%*1/1000)/((90%*1/1000)+(10%*999/1000))=1/112
16、设随机变量X,Y不相关,且EX=2,EY=1,DX=3,则E(X(X+Y-2))=()
答:5
解析:E(X(X+Y-2))=EX^2+EXY-2EX=DX+(EX)^2+EXEY-2EX=3+2*2+2*1-2*2=5
17、某种产品,合格品率为0.96,一个合格品被检查成次品的概率是0.02,一个次品被检查成合格品的概率为0.05,问题:求一个被检查成合格品的产品确实为合格品的概率()
答:0.9978
解析:公式见15,0.98*0.96/(0.05*0.04+0.98*0.96)
18、以下关于PMF(概率质量函数),PDF(概率密度函数),CDF(累积分布函数)描述错误的是()
答:PDF描述的是连续型随机变量在特定取值区间的概率
解析:特定取值的概率
19、在Logistic Regression 中,如果同时加入L1和L2范数,会产生什么效果()
答:可以做特征选择,并在一定程度上防止过拟合
解析:l1使得大部分系数趋于零,l2使大部分系数等于零
20、假设x1和x2是两个以0为均值,1为标准差的正态分布,那么x1+x2的概率密度分布是()?
答:以0为均值,sqrt(2)为标准差的正态分布
解析:正态分布的可加性,均值,方差相加
21、Nave Bayes是一种特殊的Bayes分类器,特征变量是X,类别标签是C,它的一个假定是:()
答:特征变量X的各个维度是类别条件独立随机变量
22、在一个含有group by的查询sql中,同时存在having和where,sql在解析执行的时候,先执行的是哪一个?
答:where
解析:执行顺序:SELECT <变量名> FROM <表名> WHERE <条件> GROUP BY <变量名> HAVING <条件> ORDER BY <变量名> LIMIT a,b;
23、SQL查询语句中where、group by、having 这些关键字区别和用法总结错误的是( )
答:HAVING 子句用来从分组的结果中筛选列
其他正确选项:HAVING在查询语句中必须依赖于GROUP BY;
WHERE 子句用来限制 select 语句从表中指定选取得行;
GROUP BY 子句用来分组 WHERE子句的输出结果集
24、执行以下 SQL ,下面哪个名字会被查询出来()
1 |
|
答:JACKSON
解析:第二个字母为A的会被查找出来
25、There are 3 doors, behind which are two goats and a car.
You pick a door (call it door A). You’re hoping for the car of course.
The game show host examines the other doors (B & C) and always opens one of them with a goat (Both doors might have goats; he’ll randomly pick one to open)
So what is the chance of winning the game if you switch doors?
答:2/3
解析:1/3*0+2/3*1=2/3
二、编程题
26、有如下两张表格Orders, City_conf,表格结构如下
Orders
Id | Coupon_fee | Order_fee | Citycode |
1 | 2.0 | 1.0 | 010 |
2 | 1.0 | 0.5 | NA |
3 | 1.0 | 2.0 | 021 |
4 | 2.0 | 0.5 | 182 |
5 | 1.0 | 1.5 | *&……%¥# |
6 | 0 | 1.0 | 99999 |
...... | ...... | ...... | ...... |
City_conf
Name | Citycode | Area |
北京 | 010 | North |
苏州 | 0512 | East |
深圳 | 0755 | South |
成都 | 027 | West |
...... | ...... | ...... |
Orders表示订单表,包括优惠券金额,订单金额及产生订单的城市代码(注:城市代码包括已开城市Citycode及乱码/NA/不在已开城市代码中的数字)。City_conf表示摩拜所开城市列表,包括城市名称,城市代码及所属大区。请统计每个城市优惠券cover的订单费用。(注:1. 如果优惠券金额大于订单金额则cover的是订单费,否则为优惠券金额。2. 所有归不到城市列表中的订单统一为others)
答:
Orders['cover'] = Orders['Order_fee'].apply(lambda x: str(x)) + '_' + Orders['Coupon_fee'].apply(lambda x: str(x))
Orders['cover'] = Orders['cover'].apply(lambda x: x.split('_')[1] if x.split('_')[0] > x.split('_')[1] else x.split('_')[0])
citylist = City_conf['Citycode']
Orders['city'] = Orders.[Citycode'].apply(lambda x: x if x in citylist else 'others')
Covers = Orders[['cover', 'city']]
Covers['cover'] = Covers['cover'].astype('float')
covers_sum = Covers.groupby('city').sum().reset_index()
27、有如下两张表格Metro,Orders,表格结构如下
Metro
Name |
Lng |
Lat |
中关村地铁站 |
121.442132 |
24.22421 |
望京地铁站 |
121.0284938 |
24.09839 |
。。。。 |
。。。。 |
。。。。 |
Orders
Id |
Lng |
Lat |
Time |
1 |
121.442132 |
24.22421 |
2017-07-01 22:11:14 |
2 |
121.0284938 |
24.09839 |
2017-07-01 22:11:15 |
。。。。 |
。。。。 |
。。。。 |
|
Metro表示地铁站列表,包括地铁站站名及经纬度坐标等字段。Oders表示订单表,包括开锁经纬度坐标及开锁时间等字段。 请统计每个地铁站周边1km范围内的订单,找出7月1日早上7:00-9:00期间 出行量最大的前10个地铁站。(先验知识:经度和纬度的小数点后两位相等即表示在一公里范围内)
import pandas as pd
Metro['lng'] = Metro['Lng'].apply(lambda x: str(x)[0:6])
Metro['lat'] = Metro['Lat'].apply(lambda x: str(x)[0:6])
Orders['lng'] = Orders['Lng'].apply(lambda x: str(x)[0:6])
Orders['lat'] = Orders['Lat'].apply(lambda x: str(x)[0:6])
table = pd.merge(Orders[['Id', 'Time', 'lng', 'lat']], Metro[['Name', 'lng', 'lat']], on=['lng', 'lat'])
table = table[['Id', 'Time', 'Name']]
table['day'] = Orders['Time'].apply(lambda x: str(x).split(' ')[0][5:])
table['hour'] = Orders['Time'].apply(lambda x: str(x).split(' ')[1][0:5])
table = table[table['day'] == '07-01']
table = table[table['hour'] >= '07:00' & table['hour'] < '09:00']
table_top10 = table[['Id', 'Name', 'Time']].copy()
table_top10['count'] = 1 table_top10 = table_top10.groupby('Id').count().reset_index().sort_values(asending=False).head(10)
三、简述题
28、请写出在数据预处理过程中如何处理以下问题
1) 为了预测摩拜每天订单数,我们建立了一个线性回归模型,其中有一个自变量为天气类型(分类变量),分为晴、阴、雾霾、沙尘暴、雨、雪等6种类型,请问如何处理这种变量
<o:p> </o:p>
<o:p> </o:p>
2) 仍然是1) 中的线性回归模型,其中有一个自变量为每天红包车的数量,但是这个变量有1/4的数据是缺失值,请写出至少两种处理缺失值的方法
<o:p> </o:p>
<o:p> </o:p>
3) 依然是1) 中的模型,其中自变量有4个,他们的相关系数矩阵如下:
请问是否有问题?如有,请写出解决方法
1)答:因为天气为离散变量,取值之间几乎没有相关性也没有方向,如果此时应该转换为哑变量,例将晴设置为变量,若晴天则为1,否则为0,此时需要注意的是,为了防止生成的哑变量之前存在相关性,只需要对前面n-1(设离散取值为n)个变量生成哑变量,当前n-1个变量取值均为0时,则表示第n个天气。
2)答:i:因为红包车的数量可看做为离散变量,所以可以用该变量全部取值的均值进行替代;
ii:可按照某个方式分组,再以组的均值进行填充,如以用户id分组,然后用改用户在该变量取值的均值进行填充。
3)答:由相关系数图可知,变量2和变量3之间存在较大的负相关性,会影响模型的结果。
可选择用逐步回归法进行自动判断剔除该变量,或者直接剔除该变量,比较提出前后模型的表现效果,若变好则剔除。
29、摩拜单车的车锁寿命(以小时计)为一随机变量,服从以标准差为300的正态分布。在一批样品中随机抽取 n = 25个车锁进行测试,得出平均寿命为10380小时。
1) 请计算总体平均车锁寿命miu的95%置信区间(confidence interval)
<o:p> </o:p>
2) 在上面的研究中,假设我们有99%的信心认为误差界限(margin of error)不大于60小时,则需要随机抽取多少个车锁才能达到这一结果。
注:
1)答:以双边检验为例:interval = [10380 -1.96*300/sqrt(25), 10380 + 1.96*300/sqrt(25)] = [10262.4, 10497.6]
2)答:60 = 2.575*300/sqrt(n) => n = 165.756 = 166
30、你在公交车站A等3路车,公交车到达车站符合泊松过程,且平均到达时间为10分钟(lambda = 0.1/min)。假设公交车已经运营了一段时间,并且你在随机一个时间到达公交车站,请问
1) 等下一辆车来,你平均需要等多长时间?写出等车时间的概率密度函数
<o:p> </o:p>
2) 等第a辆车来,你平均需要等多长时间?写出等车时间的概率密度函数
<o:p> </o:p>
3) 接2),你在公交车站A等到第a辆3路车来,坐车到公交车站B等6路车,再等b辆6路车来,假设6路公交车到达车站也符合泊松过程,且平均到达时间也为10分钟。设第一阶段等待时间为T1,第二阶段等待时间为T2,则第一阶段等车时间占总共等车时间的比例为W = T1/(T1+T2),请写出W的概率密度函数。(答案有误,尚未解出答案)
1)答:
下一辆车来的时间:p(x=1) = e^0.1 * 0.1 / 1
因为随即一个时间到达公交站,所以服从均匀分布,故平均等待时间为0.5*p(x=1)=0.05*e^0.1
2)答:p(x=a) = e^0.1 * 0.1^a / (a!)
3)答:
p(t1=k1) = e^0.1 * 0.1^k1 / (k1!)
p(t2=k2) = e^0.1 * 0.1^k2 / (k2!)
已知两个泊松分布之和认为泊松分布,且参数相加
则p(t1+t2=k) = e^0.2 * 0.2^k / (k!)
设U=t1, V=t1+t2
则t1=U, t2=V-U
雅克比行列式为1
f(U, V)=f(U<u, V<v)=f(t1<u, t1+t2<v)