1. 程式人生 > >【秋招】拼多多_資料分析崗_面試題整理

【秋招】拼多多_資料分析崗_面試題整理

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