数据分析mysql⾯试题_数据分析岗⾯试题【收集】
神奇的知识增加中>_
⼀、统计知识
1.贝叶斯公式【补充】
条件概率:
引申:
补充:
P(A|B)——在B条件下 A 的概率.即事件A 在另外⼀个事件B已经发⽣条件下的发⽣概率。
P(AB)——事件A、B同时发⽣的概率,即联合概率.联合概率表⽰百两个事件共同发⽣的概率.A 与 B 的联合概率表⽰为 P(AB) 或者 P(A,B)
由条件概率可得:
由此得到贝叶斯公式的常规形式:
朴素贝叶斯的理解:在已知⼀些概率的情况下,由果索因
案例:⼀⽇某超市发⽣盗窃案,嫌疑⼈甲发⽣盗窃的可能性为10%,嫌疑⼈⼄发⽣盗窃的可能性为90%,⽬击者称盗窃者是甲,⽬击者证⾔可信度为80%,那么现在请估算出⽬击者证⾔的准确度。
这⾥先假设:
嫌疑⼈甲发⽣盗窃的可能性为P(A)=10%,
嫌疑⼈⼄发⽣盗窃的可能性为P(B)=90%,
⽬击者称盗窃者是甲可信度为P(C|A)=80%(解释:因为是建⽴在认为盗窃者就是甲的条件之上再判断⽬击者的话是否可信,所以P(C)指的是⽬击者证⾔可信度)
那么⽬击者指证⼄的可信度为P(C|B)=20%,
那么⽬击者证词正确的概率为 :
四舍五⼊正确率30.77%
全概率公式
若事件
⼜因为条件概率公式,可进⼀步得:
group by的用法及原理详解全概率公式和贝叶斯公式的结合
⼆、SQL知识
如何写SQL求出中位数、平均数和众数(除了⽤count之外的⽅法)?我⽤的MYSQL,⽤上⾯链接⾥作者的代码⾏不通,所以修改了⼀下。
利⽤下⾯这个表:可以看到中位数⽤红框标记出了
完整代码:
未考虑偶数:
SET @rownum=0; --设置序号列的标准代码
SELECT * FROM(
SELECT @rownum:=@rownum+1 as rownum, `成绩表`.* FROM `成绩表`
ORDER BY `成绩` )Y --将加⼊序号列的临时表命名为Y
wnum= (SELECT(count(*)+1) DIV 2 FROM `成绩表`)
结果:
逐步分解:
SELECT @rownum:=@rownum+1 as rownum , `成绩表`.* FROM `成绩表`
ORDER BY `成绩`
该段代码运⾏结果:
count(*)计数⾏数,+1是解决奇数⾏的情况
通⽤代码:
考虑偶数情况:
set @index = -1;
select avg(`成绩`) from
(select @index:=@index+1 as rownum, `成绩`
from `成绩表` order by `成绩`) as t
wnum in (floor(@index/2),ceiling(@index/2));
结果:
注解:
floor(@index/2):举例:floor(12.4)=12 floor(12.6)=12
ceiling(@index/2):举例:ceiling(12.4)=13 ceiling(12.6)=13
三、模型知识
1.如何避免决策树过拟合限制树深
剪枝
限制叶节点数量
正则化项
增加数据
bagging(subsample、subfeature、低维空间投影)
数据增强(加⼊有杂质的数据)
早停
2.SVM的优点
优点:能应⽤于⾮线性可分的情况
最后分类时由⽀持向量决定,复杂度取决于⽀持向量的数⽬⽽不是样本空间的维度,避免了维度灾难具有鲁棒性:因为只使⽤少量⽀持向量,抓住关键样本,剔除冗余样本
⾼维低样本下性能好,如⽂本分类
缺点:模型训练复杂度⾼
难以适应多分类问题
核函数选择没有较好的⽅法论
3.Kmeans的原理初始化k个点
根据距离点归⼊k个类中
更新k个类的类中⼼
重复②③,直到收敛或达到迭代次数
四、业务知识
1.如何分析次⽇留存率下降的问题
业务问题关键是问对问题,然后才是拆解问题去解决。
1. 两层模型
从⽤户画像、渠道、产品、⾏为环节等⾓度细分,明确到底是哪⾥的次⽇留存率下降了
2. 指标拆解
次⽇留存率 = Σ 次⽇留存数 / 今⽇获客⼈数
3. 原因分析
内部:运营活动
产品变动
技术故障
设计漏洞(如产⽣可以撸⽺⽑的设计)
外部:竞品
⽤户偏好
节假⽇
社会事件(如产⽣舆论)
2.处理需求时的⼀般思路是什么,并举例明确需求,需求⽅的⽬的是什么
拆解任务
制定可执⾏⽅案
推进
验收
3.Mysql⽤户消费⾏为分析+回购率复购率company_sql.csv
266.7K ·
百度⽹盘
order_info_utf.csv
20.7M ·
百度⽹盘
dataAnalyst_sql.csv
734.1K ·
百度⽹盘
user_info_utf.csv
1.3M ·
百度⽹盘
1)统计不同⽉份的下单⼈数
SELECT month(paidTime),COUNT(DISTINCT userid) FROM order_info_utf WHERE isPaid='已⽀付'
GROUP BY MONTH(paidTime);
2)统计⽤户三⽉份的回购率和复购率
复购率:⼀段时间内购买次数超过⼀次的占⽐
回购率:下⼀时间周期再次购买的⼈数占⽐
复购率:
SELECT COUNT(ct) ,COUNT(IF(ct>1,1,null)) , COUNT(IF(ct>1,1,null))/COUNT(ct) '复购率'
FROM(
SELECT userid ,COUNT(userid) as ct
FROM order_info_utf
WHERE isPaid='已⽀付' AND month(paidTime)=3
GROUP BY userid) t;
注意:这⾥⼀定要给临时表创建⼀个名字(如这⾥的t),否则会报错。
回购率:这串代码效率极低,我的已经卡死了
SELECT t1.m,COUNT(t1.m),COUNT(t2.m) FROM
(SELECT userid ,DATE_FORMAT(paidTime,'%Y-%m') AS m from order_info_utf
WHERE isPaid='已⽀付'
GROUP BY userid,DATE_FORMAT(paidTime,'%Y-%m')) t1
LEFT JOIN
(SELECT userid ,DATE_FORMAT(paidTime,'%Y-%m') AS m from order_info_utf
WHERE isPaid='已⽀付'
GROUP BY userid,DATE_FORMAT(paidTime,'%Y-%m')) t2
on t1.userid=t2.userid AND t1.m=DATE_SUB(t2.m,INTERVAL 1 MONTH)
GROUP BY t1.m;
3)统计男⼥⽤户的消费频次是否有差异
SELECT sex, avg(ct) FROM(
SELECT o.userid, sex, COUNT(1) as ct
FROM order_info_utf o
INNER JOIN(
SELECT * FROM user_info_utf
WHERE sex<>'')t
ON o.userid=t.userid
GROUP BY userid, sex) tt
GROUP BY sex;
*count⼩常识:
对于 count(主键 id) 来说,InnoDB 引擎会遍历整张表,把每⼀⾏的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按⾏累加。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论