MySQL留存率和復(fù)購率的場景分析
發(fā)布日期:2023/1/28 16:21:07 瀏覽量:
轉(zhuǎn)自博客網(wǎng) 原文鏈接 https://www.cnblogs.com/chengyj/p/17068406.html 如有侵權(quán)請(qǐng)聯(lián)系我們刪除
實(shí)際工作中常見的業(yè)務(wù)場景是求次日留存率,還有一些會(huì)對(duì)次日留存率增加限制,例如求新用戶的次日留存率或者求活躍用戶留存率。另外,留存率和復(fù)購率看起來都是統(tǒng)計(jì)重復(fù)出現(xiàn)的概率,但實(shí)際求解方法是不一樣的。
【場景】:次日留存率、復(fù)購率
【知識(shí)點(diǎn)】:留存率的定義、復(fù)購率的定義、多表連接、date_sub(dt1, interval 1 day) = dt2、datediff(dt1, dt2) = 1
一、分析思路
1、留存率如何定義?
次日留存率 = (當(dāng)天活躍的用戶第二天又活躍了的用戶數(shù))/(當(dāng)天活躍的用戶數(shù))
常見的場景是求次日留存率,本文以次日留存率為例。
擴(kuò)展: 第N日留存率 = (當(dāng)天活躍的用戶第N天又活躍了的用戶數(shù))/(當(dāng)天活躍的用戶數(shù))
舉個(gè)例子:如果用戶1在1號(hào)、2號(hào)、3號(hào)活躍;用戶2在1號(hào)、2號(hào)活躍。那么次日留存率是多少?
- 先把上面的活躍記錄按照日期、活躍用戶、次日留存用戶數(shù)整理成下表:
日期 活躍用戶 次日留存用戶數(shù) 1號(hào) 用戶1、用戶2 2 2號(hào) 用戶1、用戶2 1 3號(hào) 用戶1 0 總計(jì) 5 3 次日留存率 = 3/5。
2、如何判斷當(dāng)日活躍的用戶次日又有活躍記錄?
同一個(gè)表看成兩個(gè)表做連接,使用
![]()
這樣就得到用戶當(dāng)日和次日的活躍記錄。
- 用戶當(dāng)日、次日活躍記錄表
用戶 當(dāng)日 次日 用戶1 1號(hào) 2號(hào) 用戶2 1號(hào) 2號(hào) 用戶1 2號(hào) 3號(hào) 用戶2 2號(hào) None 用戶1 3號(hào) None
3、計(jì)算次日留存率
次日留存率 = 次日留存用戶數(shù) / 當(dāng)日活躍用戶數(shù)
![]()
二、實(shí)例
下面就以三個(gè)實(shí)例講清楚什么是次日留存率、新用戶的次日留存率和復(fù)購率。
三種問題的區(qū)別:
| 問題 | 描述 | 特點(diǎn) | 使用方法 |
|---|---|---|---|
| 次日留存率 | 次日留存率為當(dāng)天活躍的用戶數(shù)中第二天又活躍了的用戶數(shù)占比 | 固定時(shí)間的記錄 | 先獲取用戶、當(dāng)日和第n日活躍時(shí)間記錄表,后按照留存率公式進(jìn)行計(jì)算 |
| 新用戶次日留存率 | 新用戶的次日留存率為當(dāng)天新增的用戶數(shù)中第二天又活躍了的用戶數(shù)占比 | 限制條件的留存率 | 先獲取新用戶、當(dāng)日和第n日活躍時(shí)間記錄表,后按照留存率公式進(jìn)行計(jì)算 |
| 復(fù)購率 | 復(fù)購率指用戶在一段時(shí)間內(nèi)對(duì)某商品的重復(fù)購買比例 | 一段時(shí)間內(nèi)的記錄 | 先獲取根據(jù)商品、購買人分組,按照購買時(shí)間排序后的購買記錄表,后按照復(fù)購率公式進(jìn)行計(jì)算 |
(1)計(jì)算次日留存率
題目: 現(xiàn)在運(yùn)營想要查看用戶在某天刷題后第二天還會(huì)再來刷題的平均概率。請(qǐng)你取出相應(yīng)數(shù)據(jù)。
示例:question_practice_detail
| id | device_id | quest_id | result | date |
|---|---|---|---|---|
| 1 | 2138 | 111 | wrong | 2021-05-03 |
| 2 | 3214 | 112 | wrong | 2021-05-09 |
| 3 | 3214 | 113 | wrong | 2021-06-15 |
| 4 | 6543 | 111 | right | 2021-08-13 |
| 5 | 2315 | 115 | right | 2021-08-13 |
| 6 | 2315 | 116 | right | 2021-08-14 |
| 7 | 2315 | 117 | wrong | 2021-08-15 |
| …… |
根據(jù)示例,你的查詢應(yīng)返回以下結(jié)果:
| avg_ret |
|---|
| 0.3000 |
求解代碼:
- 用戶當(dāng)日、次日活躍記錄表
擴(kuò)展:
前往查看:MySQL 日期函數(shù)、時(shí)間函數(shù)在實(shí)際場景中的應(yīng)用
(2)計(jì)算新用戶的次日留存率
問題:統(tǒng)計(jì)2021年11月每天新用戶的次日留存率(保留2位小數(shù))
用戶行為日志表tb_user_log。(uid-用戶ID, artical_id-文章ID, in_time-進(jìn)入時(shí)間, out_time-離開時(shí)間, sign_in-是否簽到)
| id | uid | artical_id | in_time | out_time | sign_cin |
|---|---|---|---|---|---|
| 1 | 101 | 0 | 2021-11-01 10:00:00 | 2021-11-01 10:00:42 | 1 |
| 2 | 102 | 9001 | 2021-11-01 10:00:00 | 2021-11-01 10:00:09 | 0 |
| 3 | 103 | 9001 | 2021-11-01 10:00:01 | 2021-11-01 10:01:50 | 0 |
| 4 | 101 | 9002 | 2021-11-02 10:00:09 | 2021-11-02 10:00:28 | 0 |
| 5 | 103 | 9002 | 2021-11-02 10:00:51 | 2021-11-02 10:00:59 | 0 |
| 6 | 104 | 9001 | 2021-11-02 11:00:28 | 2021-11-02 11:01:24 | 0 |
| 7 | 101 | 9003 | 2021-11-03 11:00:55 | 2021-11-03 11:01:24 | 0 |
| 8 | 104 | 9003 | 2021-11-03 11:00:45 | 2021-11-03 11:00:55 | 0 |
| 9 | 105 | 9003 | 2021-11-03 11:00:53 | 2021-11-03 11:00:59 | 0 |
| 10 | 101 | 9002 | 2021-11-04 11:00:55 | 2021-11-04 11:00:59 | 0 |
注:
- 次日留存率為當(dāng)天新增的用戶數(shù)中第二天又活躍了的用戶數(shù)占比。
- 如果in_time-進(jìn)入時(shí)間和out_time-離開時(shí)間跨天了,在兩天里都記為該用戶活躍過,結(jié)果按日期升序。
輸出示例:
示例數(shù)據(jù)的輸出結(jié)果如下
| dt | uv_left_rate |
|---|---|
| 2021-11-01 | 0.67 |
| 2021-11-02 | 1.00 |
| 2021-11-03 | 0.00 |
解釋:
11.01有3個(gè)用戶活躍101、102、103,均為新用戶,在11.02只有101、103兩個(gè)又活躍了,因此11.01的次日留存率為0.67;
11.02有104一位新用戶,在11.03又活躍了,因此11.02的次日留存率為1.00;
11.03有105一位新用戶,在11.04未活躍,因此11.03的次日留存率為0.00;
11.04沒有新用戶,不輸出。
分析思路
1、如何計(jì)算新用戶的次日留存率?
新用戶的次日留存率 = (當(dāng)日活躍且次日仍活躍的新用戶數(shù))/(當(dāng)日活躍的新用戶數(shù))
- 先把上面的活躍記錄按照日期、活躍用戶、次日留存用戶數(shù)、每天的次日留存率整理成下表:
日期 活躍用戶 次日留存新用戶 每天的次日留存率 1號(hào) 101、102、103 101、103 2/3 = 0.67 2號(hào) 101、103、104 104 1/1 = 1 3號(hào) 104、105 None 0
2、如何判斷當(dāng)日活躍的新用戶次日又有活躍記錄?
同一個(gè)表看成兩個(gè)表做連接,使用
![]()
這樣就得到新用戶當(dāng)日和次日的活躍記錄。
- 新用戶當(dāng)日、次日活躍記錄表
用戶 當(dāng)日 次日 101 1號(hào) 2號(hào) 102 1號(hào) None 103 1號(hào) 2號(hào) 104 2號(hào) 3號(hào) 105 3號(hào) None
3、計(jì)算每天的次日留存率
每天的次日留存率 = 次日留存用戶數(shù) / 當(dāng)日活躍用戶數(shù)在求每天的次日留存率時(shí),注意需要分組,使用group by。
![]()
求解代碼:
- 新用戶當(dāng)日、次日活躍記錄表
(3)計(jì)算復(fù)購率
問題:請(qǐng)統(tǒng)計(jì)零食類商品中復(fù)購率top3高的商品。
商品信息表tb_product_info。(product_id-商品ID, shop_id-店鋪ID, tag-商品類別標(biāo)簽, in_price-進(jìn)貨價(jià)格, quantity-進(jìn)貨數(shù)量, release_time-上架時(shí)間)
| id | product_id | shop_id | tag | int_ | quantity | release_time |
|---|---|---|---|---|---|---|
| 1 | 8001 | 901 | 零食 | 60 | 1000 | 2020-01-01 10:00:00 |
| 2 | 8002 | 901 | 零食 | 140 | 500 | 2020-01-01 10:00:00 |
| 3 | 8003 | 901 | 零食 | 160 | 500 | 2020-01-01 10:00:00 |
訂單總表tb_order_overall。(order_id-訂單號(hào), uid-用戶ID, event_time-下單時(shí)間, total_amount-訂單總金額, total_cnt-訂單商品總件數(shù), status-訂單狀態(tài))
| id | order_id | uid | event_time | total_amount | total_cnt | status |
|---|---|---|---|---|---|---|
| 1 | 301001 | 101 | 2021-09-30 10:00:00 | 140 | 1 | 1 |
| 2 | 301002 | 102 | 2021-10-01 11:00:00 | 235 | 2 | 1 |
| 3 | 301011 | 102 | 2021-10-31 11:00:00 | 250 | 2 | 1 |
| 4 | 301003 | 101 | 2021-10-02 10:00:00 | 300 | 2 | 1 |
| 5 | 301013 | 105 | 2021-10-02 10:00:00 | 300 | 2 | 1 |
| 6 | 301005 | 104 | 2021-10-03 10:00:00 | 170 | 1 | 1 |
訂單明細(xì)表tb_order_detail。(order_id-訂單號(hào), product_id-商品ID, price-商品單價(jià), cnt-下單數(shù)量)
| id | order_id | product_id | price | cnt |
|---|---|---|---|---|
| 1 | 301001 | 8002 | 150 | 1 |
| 2 | 301011 | 8003 | 200 | 1 |
| 3 | 301011 | 8001 | 80 | 1 |
| 4 | 301002 | 8001 | 85 | 1 |
| 5 | 301002 | 8003 | 180 | 1 |
| 6 | 301003 | 8002 | 140 | 1 |
| 7 | 301003 | 8003 | 180 | 1 |
| 8 | 301013 | 8002 | 140 | 2 |
| 9 | 301005 | 8003 | 180 | 1 |
場景邏輯說明:
- 用戶將購物車中多件商品一起下單時(shí),訂單總表會(huì)生成一個(gè)訂單(但此時(shí)未付款, status-訂單狀態(tài)- 訂單狀態(tài)為0表示待付款),在訂單明細(xì)表生成該訂單中每個(gè)商品的信息;
- 當(dāng)用戶支付完成時(shí),在訂單總表修改對(duì)應(yīng)訂單記錄的status-訂單狀態(tài)- 訂單狀態(tài)為1表示已付款;
- 若用戶退貨退款,在訂單總表生成一條交易總金額為負(fù)值的記錄(表示退款金額,訂單號(hào)為退款單號(hào),訂單狀態(tài)為2表示已退款)。
注:復(fù)購率指用戶在一段時(shí)間內(nèi)對(duì)某商品的重復(fù)購買比例,復(fù)購率越大,則反映出消費(fèi)者對(duì)品牌的忠誠度就越高,也叫回頭率
此處我們定義:某商品復(fù)購率 = 近90天內(nèi)購買它至少兩次的人數(shù) ÷ 購買它的總?cè)藬?shù)
近90天指包含最大日期(記為當(dāng)天)在內(nèi)的近90天。結(jié)果中復(fù)購率保留3位小數(shù),并按復(fù)購率倒序、商品ID升序排序
輸出示例:
示例數(shù)據(jù)的輸出結(jié)果如下:
| product_id | repurchase_rate |
|---|---|
| 8001 | 1.000 |
| 8002 | 0.500 |
| 8003 | 0.333 |
解釋:
商品8001、8002、8003都是零食類商品,8001只被用戶102購買了兩次,復(fù)購率1.000;
商品8002被101購買了兩次,被105購買了1次,復(fù)購率0.500;
商品8003被102購買兩次,被101和105各購買1次,復(fù)購率為0.333。
分析思路
1、如何計(jì)算每個(gè)商品的復(fù)購率?
某商品復(fù)購率 = 近90天內(nèi)購買它至少兩次的人數(shù) / 購買它的總?cè)藬?shù)
- 先把上面的購買記錄按照商品、購買用戶、購買次數(shù)、每個(gè)商品的復(fù)購率整理成下表:
商品 購買用戶 購買次數(shù) 8001 102 2 8002 101 2 8002 105 1 8003 101 1 8003 102 2 8003 105 1 由表可知每個(gè)商品的復(fù)購率分別為1.000、0.500、0.333。
2、統(tǒng)計(jì)每個(gè)商品的購買用戶和購買次數(shù)
統(tǒng)計(jì)每個(gè)貨物用戶的購買記錄。利用窗口函數(shù)根據(jù)貨號(hào)、用戶分組按購買時(shí)間排序![]()
這樣就得到每個(gè)商品的用戶購買記錄排序表。
- 每個(gè)商品的用戶購買記錄排序表
商品 用戶 按照購買時(shí)間排序 8001 102 1 8001 102 2 8002 101 1 8002 101 2 8002 105 1 8003 101 1 8003 102 1 8003 102 2 8003 104 1
3、統(tǒng)計(jì)復(fù)購率top3高的商品及復(fù)購率
在求商品的復(fù)購率時(shí),注意需要分組,使用group by。
![]()
求解代碼:
- 每個(gè)商品的用戶購買記錄排名表
三、適用場景
(1)留存率
留存率的作用
留存率是用于反映網(wǎng)站、互聯(lián)網(wǎng)應(yīng)用或網(wǎng)絡(luò)游戲的運(yùn)營情況的統(tǒng)計(jì)指標(biāo),其具體含義為在統(tǒng)計(jì)周期(周/月)內(nèi),每日活躍用戶數(shù)在第N日仍啟動(dòng)該App的用戶數(shù)占比的平均值。其中N通常取2、4、8、15、31,分別對(duì)應(yīng)次日留存率、三日留存率、周留存率、半月留存率和月留存率。
留存率常用于反映用戶粘性,當(dāng)N取值越大、留存率越高時(shí),用戶粘性越高。
實(shí)際應(yīng)用:
游戲直播行業(yè)中,在資本的扶持下游戲直播行業(yè)穩(wěn)定增長,斗魚、虎牙雙巨頭格局形成。
受短視頻進(jìn)軍游戲直播的沖擊,斗魚、虎牙新安裝用戶規(guī)模同比有下降趨勢,但斗魚新安裝轉(zhuǎn)化率同比微增。提高用戶留存率成為游戲直播行業(yè)發(fā)展的關(guān)鍵,斗魚、虎牙活躍用戶留存率同比均有不同程度的提高。
游戲直播行業(yè)逐漸完善收入模式,變現(xiàn)能力不斷增強(qiáng)。 [1]
在藥物代謝動(dòng)力學(xué)中指:每隔t小時(shí)體內(nèi)留存藥量占原藥量的比率。是除了半衰期(T1/2)外另一描述藥物消除規(guī)律的參數(shù)。
如何提高留存率?
- 1、營銷活動(dòng)刺激
營銷活動(dòng)能夠刺激用戶消費(fèi),而一個(gè)好的購物體驗(yàn)絕對(duì)能夠大幅度提升用戶的留存和復(fù)購率。所以,有很多商家會(huì)通過優(yōu)惠券、滿減等營銷活動(dòng),以此來拉進(jìn)與顧客之間的距離,實(shí)現(xiàn)用戶的積累和留存。
常見的活動(dòng)有拼團(tuán)、打折等。另外可以設(shè)置限時(shí)活動(dòng),這樣除了給人一種緊迫感之外,也能在短時(shí)間里聚集起用戶,調(diào)動(dòng)用戶的活躍性,提升點(diǎn)擊率。
- 2、簽到打卡機(jī)制
簽到玩法在很多app上也能看到,讓用戶連續(xù)簽到7 天、21 天、40 天等,將會(huì)獲得不同的獎(jiǎng)品福利。
通過簽到活動(dòng)讓用戶逐漸形成每天打開app看一看的習(xí)慣。如果用戶使用體驗(yàn)很好,那用戶留存率將直線上升,從而逐漸形成穩(wěn)定的客戶群體。
- 3、優(yōu)質(zhì)內(nèi)容互動(dòng)
優(yōu)質(zhì)的內(nèi)容是留住用戶的關(guān)鍵,用戶對(duì)你的內(nèi)容有需求才會(huì)來使用,如果有一天內(nèi)容不再優(yōu)質(zhì)了,用戶得不到想要的東西,自然來的就少了。
- 4、承諾留存獎(jiǎng)勵(lì):
這種方法常見于一些知識(shí)付費(fèi)類的社群,設(shè)置二十天的課程,堅(jiān)持聽完二十天并認(rèn)真做好筆記的最終退還學(xué)費(fèi)或者贈(zèng)送一份超值大禮品。
- 5、履行承諾:
為了吸粉,為了引流,你的宣傳文案中,設(shè)置了懸念也好或是承諾了效果也好,一定拋出了不少噱頭,當(dāng)粉絲真的到來了之后,就是時(shí)候還債了,承諾了“進(jìn)群領(lǐng)紅包”的就要發(fā)紅包了,吹噓了“十天瘦十斤”的就要運(yùn)用專業(yè)只是為用戶進(jìn)行介紹了??偠灾疅o論怎樣都得讓用戶覺得你就是文案中宣傳的那么回事,不能讓用戶進(jìn)群之后發(fā)現(xiàn)你是夸大宣傳的。
- 6、設(shè)置懸念:
對(duì)你承諾的內(nèi)容做一份詳細(xì)的時(shí)間規(guī)劃,把你能提供的價(jià)值做一個(gè)詳略得當(dāng)?shù)牟鸱郑褍r(jià)值提供的時(shí)間戰(zhàn)線控制得不長不短,最有吸引力的內(nèi)容放在最開始展示,這樣以來能讓用戶剛進(jìn)群就被吸引住,并對(duì)日后的內(nèi)容有很大的期待,這樣以來自然不會(huì)輕易退群。
(2)復(fù)購率
復(fù)購率的作用
商品復(fù)購率指消費(fèi)者對(duì)該品牌寶貝或者服務(wù)的重復(fù)購買次數(shù),重復(fù)購買率越多,則反應(yīng)出消費(fèi)者對(duì)品牌的忠誠度和信賴度就越高,反之則越低。
復(fù)購率有兩種計(jì)算技巧:一種是所有購買過寶貝的顧客,以每個(gè)人人為獨(dú)立單位重復(fù)購買寶貝的次數(shù);另一種是按交易計(jì)算,即重復(fù)購買交易次數(shù)與總交易次數(shù)的比值。
復(fù)購率高有哪些作用?
1、提高回頭率。當(dāng)新的消費(fèi)者對(duì)店鋪的整體情況有了一些了解,對(duì)寶貝的性價(jià)比進(jìn)行分析之后,應(yīng)該不會(huì)排斥對(duì)店鋪的關(guān)注。這樣一來,讓他們?cè)僖淮侮P(guān)注店鋪,應(yīng)該不會(huì)有哪些難度。
2、提高店鋪的權(quán)重。老客戶對(duì)店鋪的寶貝有一些了解,對(duì)店鋪服務(wù)也會(huì)很滿意。第二次再來購買時(shí),幾乎不會(huì)給差評(píng)。多一個(gè)好評(píng),對(duì)店鋪權(quán)重的提高會(huì)有很大幫助。
3、提高訪客價(jià)值。平時(shí),店鋪需要花錢做直通車、鉆展以及淘寶聯(lián)盟等推廣,拼命吸引訪客,爭取提高轉(zhuǎn)化率。有了老客戶,一切都變得不一樣了。既然老客戶第二次或者第N次進(jìn)店,一定是有所需求,會(huì)帶來訪客和成交量。說不定還會(huì)推薦新客戶,帶來更多的免費(fèi)訪客。
4、提高客單價(jià)。對(duì)于新客戶來說,不太了解店鋪的寶貝以及服務(wù),不敢輕易下手。但是老客戶不同,每一次看到套餐設(shè)置,復(fù)購率真的會(huì)提高。
5、如果用戶丟失嚴(yán)峻,缺少忠誠度,粘性低,這時(shí)候就要考慮“復(fù)購率”。
如何提高復(fù)購率?
- 1、剖析用戶行為數(shù)據(jù)
從購物行為來說,用戶購買行為45%的決議都是出于習(xí)慣,未曾經(jīng)過思考。怎么養(yǎng)成用戶的購買習(xí)慣,這就需要對(duì)用戶的全體概況進(jìn)行了解,包括累計(jì)用戶、新增用戶、訂單量、閱讀量、購買用戶數(shù)、重復(fù)購買率等等。
分析這些信息能夠看出:哪些用戶只閱讀,從未下單,甚至連下單期望都沒有;哪些用戶是忠實(shí)用戶:看的多,買的也多;哪些用戶有大量的收藏、加購行為,但并未下單;哪些用戶會(huì)有相似的購買、閱讀行為等等,了解這些數(shù)據(jù)也為制定營銷計(jì)劃提供有利的數(shù)據(jù)支撐。
- 2、解讀用戶行為數(shù)據(jù),把握用戶喜愛
借助數(shù)據(jù)剖析工具,調(diào)查用戶的閱讀、購買、收藏等重要行為數(shù)據(jù),然后分析用戶購買了哪些商品,哪些商品看了(或許收藏了)但沒購買,明確用戶喜歡的商品。
- 3、根據(jù)用戶行為,進(jìn)行精準(zhǔn)推薦
根據(jù)會(huì)員行為,尋覓二次出售時(shí)機(jī)。此外,還能夠根據(jù)產(chǎn)品之間的相關(guān)性,進(jìn)行產(chǎn)品推薦和套裝,提高單個(gè)訂單的出售額,添加出售時(shí)機(jī)。
- 4、滿意度調(diào)查,精準(zhǔn)提升質(zhì)量
對(duì)于已經(jīng)購買過商品的老用戶來說,獲取用戶的聯(lián)系手段是最簡單不過的了,所以需要提升用戶對(duì)于商品的用后體驗(yàn),比如定期對(duì)老用戶進(jìn)行商品使用滿意調(diào)查,根據(jù)反饋提高商品的質(zhì)量和客服人員的服務(wù)質(zhì)量;
- 5、關(guān)注微信賬號(hào)
引導(dǎo)用戶關(guān)注店鋪或賣家的微信公眾賬號(hào),以此可以第一時(shí)間獲取店鋪的最新消息;
- 6、針對(duì)老用戶的店鋪活動(dòng)
在節(jié)假日設(shè)置一些假日活動(dòng),店鋪活動(dòng),老用戶會(huì)有折上折之類的活動(dòng);
- 7、建立獎(jiǎng)勵(lì)機(jī)制
如果新上線的商品或爆款商品,引導(dǎo)用戶參加好評(píng)曬照片,后臺(tái)設(shè)置抽獎(jiǎng)或贈(zèng)送超級(jí)會(huì)員卡等。
對(duì)于一些中小商家來說,想維護(hù)好老用戶,就要送一些優(yōu)惠券。當(dāng)他們第一次購買物品時(shí),送一些代金券,可以刺激他們?cè)僖淮蝸韽?fù)購。不用給予太大的優(yōu)惠力度,幾塊錢的代金券,會(huì)讓顧客感到很高興。
馬上咨詢: 如果您有業(yè)務(wù)方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗(yàn)積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生