【秋招】拼多多_資料分析崗_面試題整理
1. 貝葉斯公式複述並解釋應用場景
1)P(A|B) = P(B|A)*P(A) / P(B)
2)如搜尋query糾錯,設A為正確的詞,B為輸入的詞,那麼:
a. P(A|B)表示輸入詞B實際為A的概率
b. P(B|A)表示詞A錯輸為B的概率,可以根據AB的相似度計算(如編輯距離)
c. P(A)是詞A出現的頻率,統計獲得
d. P(B)對於所有候選的A都一樣,所以可以省去
2. 如何寫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:[email protected]+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(emmm,好像用到count了)
3. 學過的機器學習演算法有哪些
略。
4. 如何避免決策樹過擬合
1)限制樹深
2)剪枝
3)限制葉節點數量
4)正則化項
5)增加資料
6)bagging(subsample、subfeature、低維空間投影)
7)資料增強(加入有雜質的資料)
8)早停
5. 樸素貝葉斯的理解
2)理解:樸素貝葉斯是在已知一些先驗概率的情況下,由果索因的一種方法
3)其它:樸素的意思是假設了事件相互獨立
6. SVM的優點
1)優點:
a. 能應用於非線性可分的情況
b. 最後分類時由支援向量決定,複雜度取決於支援向量的數目而不是樣本空間的維度,避免了維度災難
c. 具有魯棒性:因為只使用少量支援向量,抓住關鍵樣本,剔除冗餘樣本
d. 高維低樣本下效能好,如文字分類
2)缺點:
a. 模型訓練複雜度高
b. 難以適應多分類問題
c. 核函式選擇沒有較好的方法論
7. Kmeans的原理
1)初始化k個點
2)根據距離點歸入k個類中
3)更新k個類的類中心
4)重複(2)(3),直到收斂或達到迭代次數
8. 對拼多多有什麼瞭解,為什麼選擇拼多多
略。
9. 口答兩個SQL題(一個跟留存率相關,一個要用到row number)
1)留存率:略
2)mysql中設定row number:
SET @row_number = 0; SELECT (@row_number:[email protected]_number + 1) AS num FROM table
10. 業務場景題,如何分析次日留存率下降的問題
業務問題關鍵是問對問題,然後才是拆解問題去解決。
1)兩層模型:從使用者畫像、渠道、產品、行為環節等角度細分,明確到底是哪裡的次日留存率下降了
2)指標拆解:次日留存率 = Σ 次日留存數 / 今日獲客人數
3)原因分析:
1)內部:
a. 運營活動
b. 產品變動
c. 技術故障
d. 設計漏洞(如產生可以擼羊毛的設計)
2)外部:
a. 競品
b. 使用者偏好
c. 節假日
d. 社會事件(如產生輿論)
11. 處理需求時的一般思路是什麼,並舉例
1)明確需求,需求方的目的是什麼
2)拆解任務
3)制定可執行方案
4)推進
5)驗收
12. 為什麼選擇拼多多
略。
13. 用過拼多多下單沒,感受如何
略。
14. 可以接受單休和加班麼
略。
15. 為啥要選資料分析方向(我簡歷上寫的是資料探勘工程師。。。)
略。
16. 開始聊專案,深究專案,我研究生階段的方向比較偏,所以面試的三分之二時間都是在給他講專案,好在最後他終於聽懂了,thx god、、、
略。
17. hadoop原理和mapreduce原理
1)Hadoop原理:採用HDFS分散式儲存檔案,MapReduce分解計算,其它先略
2)MapReduce原理:
a. map階段:讀取HDFS中的檔案,解析成<k,v>的形式,並對<k,v>進行分割槽(預設一個區),將相同k的value放在一個集合中
b. reduce階段:將map的輸出copy到不同的reduce節點上,節點對map的輸出進行合併、排序
18. 還有啥問題要問的?於是我出於本能的問了一句“為啥不寫程式碼!” 然後面試官說“時間不夠了。。。。”
略。
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.
現有A表,有21個列,第一列id,剩餘列為特徵欄位,列名從d1-d20,共10W條資料! 另外一個表B稱為模式表,和A表結構一樣,共5W條資料 請找到A表中的特徵符合B表中模式的資料,並記錄下相對應的id 有兩種情況滿足要求: 1 每個特徵列都完全匹配的情況下。 2 最多有一個特徵列不匹配,其他19個特徵列都完全匹配,但哪個列不匹配未知
解:(這題不懂怎麼解)
select A.id,
((case A.d1 when B.d1 then 1 else 0) +
(case A.d2 when B.d2 then 1 else 0) +
...) as count_match
from A left join B
on A.d1 = B.d1
22.
我們把使用者對商品的評分用稀疏向量表示,儲存在資料庫表t裡面: t的欄位有:uid,goods_id,star uid是使用者id;goodsid是商品id;star是使用者對該商品的評分,值為1-5。 現在我們想要計算向量兩兩之間的內積,內積在這裡的語義為:對於兩個不同的使用者,如果他們都對同樣的一批商品打了分,那麼對於這裡面的每個人的分數乘起來,並對這些乘積求和。 例子,資料庫表裡有以下的資料: U0 g0 2 U0 g1 4 U1 g0 3 U1 g1 1 計算後的結果為: U0 U1 2*3+4*1=10 ……
解:
select uid1, uid2, sum(result) as dot
from
(select t1.uid as uid1, t2.uid as uid2, t1.goods_id, t1.star*t2.star as result
from t as t1, t as t2
on t1.goods_id = t2.goods_id) as t
group by goods_id
23.
微信取消關注分析,題目太長了,沒記錄
略。
24. 統計教授多門課老師數量並輸出每位老師教授課程數統計表
解:設表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
25. 四個人選舉出一個騎士,統計投票數,並輸出真正的騎士名字
解:設表tabe中欄位為id,knight,vote_knight
select knight from table
group by vote_knight
order by count(vote_knight) limit 1
26. 員工表,宿舍表,部門表,統計出宿舍樓各部門人數表
解:設員工表為employee,欄位為id,employee_name,belong_dormitory_id,belong_department_id;
宿舍表為dormitory,欄位為id,dormitory_number;
部門表為department,欄位為id,department_name
select dormitory_number, department_name, count(employee_name) as count_employee
from employee as e
left join dormitory as dor on e.belong_dormitory_id = dor.id
left join department as dep on e.belong_department_id = dep.id
27. 給出一堆數和頻數的表格,統計這一堆數中位數
解:設表table中欄位為id,number,frequency
set @sum = (select sum(frequency)+1 as sum from table)
set @index = 0
set @last_index = 0
select avg(distinct t.frequecy)
from
(select @last_index := @index, @index := @index+frequency as index, frequency
from table) as t
where t.index in (floor(@sum/2), ceiling(@sum/2))
or (floor(@sum/2) > t.last_index and ceiling(@sum.2) <= t.index)
28. 中位數,三個班級合在一起的一張成績單,統計每個班級成績中位數
解:設表table中欄位為id,class,score
select t1.class, avg(distinct t1.score) as median
from table t1, table t2 on t1.id = t2.id
group by t1.class, t1.score
having sum(case when t1.score >= t2.score then 1else 0 end) >=
(select count(*)/2 from table where table.class = t1.class)
and
having sum(case when t1.score <= t2.score then 1else 0 end) >=
(select count(*)/2 from table where table.class = t1.class)
29. 交易表結構為user_id,order_id,pay_time,order_amount
寫sql查詢過去一個月付款使用者量(提示 使用者量需去重)最高的3天分別是哪幾天
寫sql查詢做昨天每個使用者最後付款的訂單ID及金額
1)select count(distinct user_id) as c from table group by month(pay_time) order by c desc limit 3
2)select order_id, order_amount from ((select user_id, max(pay_time) as mt from table group by user_id where DATEDIFF(pay_time, NOW()) = -1 as t1) left join table as t2 where t1.user_id = t2.user_id and t1.mt == t2.pay_time)
30. PV表a(表結構為user_id,goods_id),點選表b(user_id,goods_id),資料量各為50萬條,在防止資料傾斜的情況下,寫一句sql找出兩個表共同的user_id和相應的goods_id
select * from a
where a.user_id exsit (select user_id from b)
(這題不太懂,sql中如何防止資料傾斜)
31. 表結構為user_id,reg_time,age, 寫一句sql按user_id隨機抽樣2000個使用者 寫一句sql取出按各年齡段(每10歲一個分段,如(0,10))分別抽樣1%的使用者
1)隨機抽樣2000個使用者
select * from table order by rand() limit 2000
2)取出各年齡段抽樣1%的使用者
set @target = 0
set @count_user = 0
select @target:[email protected]+10 as age_right, *
from table as t1
where t1.age >[email protected] and t1.age < (@target)
and t1.id in
(select floor(count(*)*0.1) from table as t2
where t1.age >[email protected] and t1.age < (@target)
order by rand() limit ??)
(mysql下按百分比取數沒有想到比較好的方法,因為limit後面不能接變數。想到的方法是先計算出每個年齡段的總數,然後計算出1%是多少,接著給每一行加一個遞增+1的行標,當行標=1%時,結束)
32. 使用者登入日誌表為user_id,log_id,session_id,plat,visit_date 用sql查詢近30天每天平均登入使用者數量 用sql查詢出近30天連續訪問7天以上的使用者數量
1)近三十天每天平均登入使用者數量
select visit_date, count(distince user_id)
group by visit_date
2)近30天連續訪問7天以上的使用者數量
select t1.date
from table t1, table t2, ..., table t7
on t1.visit_date = (t2.visit_date+1) and t2.visit_date = (t3.visit_date+1)
and ... and t6.visit_date = (t7.visit_date+1)
33. 表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