【Python實作】生活中的資料科學,用模型挑出高C/P智慧型手機

--

Let’s build a pricing model

動機與資料科學問題

目前用的手機是升大學的時候買的(使用3年左右了),最近發現螢幕很難手動關閉,然後也有不少的破裂,最主要還是自己其實蠻多蘋果產品,但是都沒有把手機跟電腦等做整合(一直被說假果粉XD),考慮趁著這一次換手機就一次換成IOS 系統,所以最近有在看手機。但是其實我本身是個很懶得研究功能性產品的人,通常我都是了解哦氣炸鍋很方便、哦手機可以打電話、傳訊息、拍照等等…但是不太會很仔細研究各家的差異,最主要還是問認識的人並且做一下比較,通常能滿足我需求的排在首位,再來才是比較價格。這一次其實也蠻懶得研究要買什麼手機,頂多有初步鍾意的品牌,所以我就在想:「好,能不能把我的消費決策轉為一個模型,再讓模型學到我的決策智慧,並且讓它變成一個手機達人」。

手機電商網站截圖

把決策變為模型聽起來很困難,實際上卻很簡單,比如說電商網站常常會提供依照價格排序、依照品牌排序等等… 這其實就是一個很簡單的決策方式,因為這代表了你比較看重價格或者品牌,進階一點的還可以讓消費者選擇使用場景、搭配優惠等等…其實就是一連串的filter,而我的決策方式也很簡單,只要把模型訓練好,轉為一個可以判斷手機價格的模型,再來依照價格排序,最後我再根據需求(比如螢幕一定要幾吋以上)做後續挑選就完成了!於是就決定來做這件事情,大概花了一個下午左右(6小時)

  • 原始問題:該買哪一隻手機?
  • 資料科學問題:建立訂價的迴歸模型,並且根據pricing model 來挑選CP值高的手機。

商學訂價與資料科學

Pricing model is just a regression analysis

什麼叫做CP值高呢?這樣說吧,這個想法來自於我認為手機的各類參數反應了製作手機的成本,而成本會佔據消費性產品的定價很大一部分解釋力,尤其是消費性電子產品,這個原因是毛利率訂價的方法以及對供應鏈管理的需求,品牌也佔了一個很重要因素,關於訂價的方法在商學中是個博大精深的領域,總之我會這樣假設:

如果一個模型能夠學習到關於手機訂價的知識,那麼該模型的估價與實際價格的價差最小的產品,其實就反應了「手機產品」的「價值」與「價格」是最接近的,此時挑出來的手機就是滿足消費者價格與價值期望的最優消費決策產品

上面這段想法是我在思考把資料科學與商學院的學科結合起來時想出的一個假說,也就是說,本次的分析其實都建立在以上的假說為真的情況下,模型確實能夠捕捉到足夠的資訊反映出產品價值。我先在這邊放上模型最後幫我挑選出的產品(我讓模型在每個品牌都幫我挑選一個),大家可以查查看這些產品分別的評價:

模型將各品牌都挑出它認為最好的手機

資料收集與清洗

看一下手機相關的資料,這邊就挑選種類比較齊全的手機電商網站即可,值得一提的是因為也蠻多雜牌機,所以我有挑選了大概前二十名常見的品牌,差不多爬下400筆左右的手機資料開始分析:

爬下資料後存成excel

想一起動手實作的朋友,資料在右手邊點這哦:資料區

由於這種消費性電子產品很容易有「研發迭代」的版本差異,所以在合併資料的時候其實會有非常多的missing data,在第一次的EDA了解到這點後,我是選擇把20%以上missing的資料欄位都在讀入時直接去除,並且對價格做簡單的整理(有些價格抓不到會顯示 “— — — -” ):

剛開始我們必須進行EDA,除了了解資料之外,還可以得到許多data cleansing 的Todo work,比如說:

  1. 資料很髒,這種沒有統一口徑的資料架構就會很多問題(missing data非常多)

如上所述,資料的缺失情況很嚴重,因為網站的資料表並沒有完全規格化,導致有些手機有該欄位資料,但有些沒有,猜測因為手機商品的關係(功能獨特),所以沒有的話就「真的沒有這個功能」,並不代表說「資料缺失」,好比有些手機有支援5G,但有些沒有,那麼沒有支援5G的手機其實在5G的欄位就會是缺失的。

2. 網站人為資料key in 錯誤

nana?
還被Google 糾正XD

還有這種人為key 錯的資料,比如nana-SIM其實是nano-SIM data。

3. 資料沒有規整化,輸入資料沒有統一

類似這樣:四核心其實可以改成4 ,雙核心改成2。這就是我們要清洗的對象。

另外,因為我們想建立迴歸模型,對於消費性產品的價格,我自己覺得不用特別做什麼特徵工程(因為很多參數規格的資料都有,這些會成為製造品的成本,所以用這些原生變數相對好解釋),重點反而是資料清洗,所以很多變數其實是連續的,但因為有單位的關係會被判斷為類別資料,這也要我們手動去除。通常我會先了解一下資料清洗要做哪些事情,再一口氣寫好程式,這樣會比較看得清資料清洗的階段步驟:

值得一提的是,在這份資料中有非常多複合變數,好比說衛星定位:

內部就包含了A-GPS, BeiDou等等很多變數,這邊有一個方式是把這種變數當作文字特徵去做Embedding,再把Embedding vector當作X,這邊因為我覺得變數已經夠多,且資料量並不大怕overfit,所以直接去除。

除此之外,我們也需要注意高基數特徵,比如處理器型號就太多了,這邊就可以思考用”合併”的方式來解決。這裡有兩種方式:

  1. 把品牌抽出,比如Snapdragon 855,Snapdragon 845其實都是Snapdragon
  2. 把小品牌合併為”Other”

我們決定用哪一種方法呢? 這邊就要用到EDA來觀察了,首先分析型號數:

品牌跟型號非常多,很混亂

因為我對手機處理器其實不太懂,也完全不了解,所以這邊有花了大概3分鐘了解一下手機處理器的市場來處理這段序列,發現:

其實很多資料稍微Google一下就可以很快知道
  1. Snapdragon:Snapdragon就是美國高通公司(Qualcomm)推出的處理器平台
  2. MT/Helio : 2015年3月,聯發科發表Helio新品牌,往後手機晶片從MT系列更名為Helio系列。分X和P兩系列:其中X系列為旗艦,而P系列為次級(省電),G系列為中階電競。

但是如果合併成MT、Snapdragon的方式,有什麼問題呢?那就是他隔壁的變數「處理器品牌」基本上跟他表達的資訊量是一致的,這樣留下兩個變數就沒什麼意義,可以擇一。就相當於無法用到「處理器型號」這個變數,所以看來這也不是一個好方法。

結合外部資料 — 資料科學的常見做法:

在搜尋手機處理器市場的時候,我發現了這張圖:

source : https://www.techcenturion.com/smartphone-processors-ranking?fbclid=IwAR1PHBTB_ZDeq_BgU_-HIciwdyapxzUnqeLD9S73nzhQOAHim9reQm2T_3ZA

這張圖是國外評測網站 Tech Centurion 對手機處理器性能的評分,我們可以看到A13 Bionic是表現最優的,除此之外還有整個處理器的排名:所以這邊就有一個想法可以是:

另外建立處理器對評分的字典,再mapping到我們的處理器資料上,藉此讓模型學到專家系統所評測出的處理器性能,把原本看似為類別資料的「處理器型號」轉為連續的量化資料。

或者我們也可以將這些處理器資料換為ordernal type,比如用1,2,3…的排名去編碼處理器型號。

透過認識資料的過程做特徵工程

不只如此,我們可以找到這則3C科技的報導,摘要為:「基本上獲評達120分以上的行動處理器,就遊戲應用、CPU使用率與使用體驗來說,皆有達水準級以上的效能表現。至於介於90分至120分的行動處理器,以中階等級機款為主力,可符合一般用戶需求。低於90分以下的處理器,則多為低階手機所搭載。」也就是說:

將處理器型號作為連續變數之後,還可以根據這段rule把變數分段,分為[120 , 90 ,90以下] 三個區間,作為特徵工程的一部分,藉此讓模型學到所謂的「高中低階」效能表現。

所以這個方法顯然比較好一點(用評測分數取代原本處理器變數),但是這樣看起來很費工,會嗎?

通過爬蟲來快速取得可用的外部資料

資料科學經常需要使用外部資料來讓模型學到更多資訊。通過上面這張圖,我找到了原網站,發現有整理好的表格就在網站上,直接動手爬下來吧(pandas 可以直接抓網頁表格)!這樣我們就不用手動key in data到excel再讀進來了:

好,如此一來簡短幾行就可以把外部資料讀進來並清洗完成。接著再mapping到原本資料表就大功告成:

合併外部資料完成
還有一些缺失值可以處理

這邊還有一些缺失值,比如手機處理器品牌就不是真的缺失(因為你上網就查得到),不過因為要填這個我覺得好麻煩XD 所以這邊就直接把品牌跟處理器用眾數處理。

迴歸建模

將類別資料做One hot encoding(比如手機品牌、處理器品牌) 連續特徵做一般化,就可以把資料準備好拿去建模囉,這邊就選擇Kaggle比賽的大神器XGboost,也是我非常喜歡的模型!

表現最好的是xgboost

modeling的部分,我們用blending來疊一下前四名(性能比較接近):

MAE來到2929,做blending對模型還是比較好的。

檢查residual plot之後可以發現其實模型的改進空間蠻明顯,就是outlier的問題:

這時候改進的思想就是捕捉這些額外資訊,單價特別低的手機可以考慮加上identifier,比如:「是否價格為小於10,000機型」等特徵來讓模型更好捕捉差異。

透過模型可解釋性來分析訂價

price為我們的訂價模型預測出的價格,而Label為實際價格。

我們可以引入SHAP lib來分析模型學到的特徵,由於這裡的重點並不是可解釋性AI,所以我們就簡單說明一下SHAP怎麼看:

紅色:代表該特徵值越高

藍色:代表該特徵值越低

SHAP的提升:代表此特徵對target(這邊就是price 有正向加分效果),所以比如說在螢幕解析度紅色、且SHAP很高的情況下,我們可以解釋為存在解析度高、價格就貴之間的關聯。

可惜SHAP的matplotlib沒有設定好中文顯示

非常有趣的是存在顏色少、價格比較高的關聯:

以及「主螢幕解析度」影響了幾乎每個品牌的手機訂價:

另外就是前面我們的處理器效能-特徵 對SHAP來說有非常好的效果,同時可以發現蘋果的「品牌價值」也在SHAP value下得到量化(brand_Apple對Pricing有非常高的提升效果):

解析度似乎是影響價格最主要的因素,居然不是相機!

最終結果,我們的pricing model(predict )跟實際值(price)比較:

比較預測與實際值,可以發現outlier :

為什麼模型會把HTC Exodus 1s 預測得那麼高價呢?原來是因為他跟HTC EXODUS 1-Binance的特徵幾乎一樣!也難怪模型會覺得兩者是類似的。不過這邊就表示這兩筆資料不是很優,因為predict一個低估快9000,一個要高估6000。

不過透過這種方式,我們也可以從類似的產品中找到被低估的商品。(特徵相同,但是價格不一致,那麼就可以找到潛在的套利機會。)

預測效果比較:

我們可以發現蘋果手機的價格大部分都低估了。

由於我們是把大部分的手機資料都放在一起建模,所以我們可以比較一下高估、低估的Apple 。

接著把手機價差的絕對值最小挑出(best fit),因為我們把所有的手機資料都放進模型裡了,所以學得最好的其實就代表著模型的知識反應了「價值」,而「價值」與「價格」最貼近的商品就是該品牌的高CP手機:

各品牌都挑出模型覺得最好的手幾

隨便查兩個看看評價,好比說SAMSUNG Galaxy M11:

看起來不錯
source : https://udn.com/news/story/7098/4597295

畢竟我們的分析奠基於上面模型能夠反映一定產品價值的假說,所以我還會再透過質化搜尋的方式來了解一下這樣的結果是否讓人信服。找了幾篇新聞發現評價都頗佳,那這則分析應該還算make sense,所以如果我鎖定的是Apple 品牌,完全沒有其他要求的話,就是這隻SE了。

另外我們也可以根據pricing ability來做廠商的排名:

Brand Ranking

神奇的是,可以發現就跟我順手在Google搜尋回傳的品牌排名順序差不多,下面這篇是站在出貨量、收益、銷售等指標來看,跟我們單純分析pricing strategy 的順序差不多。

ranking matching

那麼以上,就是這次的生活中的資料科學:智慧型手機訂價模型。透過模型可以幫助我們更好擬定消費決策。其實各行各業都還是有非常多的專家,有時候雖然問人是最直接、最快的方式,但是透過數據分析可以幫助我們建立自己一套基底,在產品越來越複雜時也可以讓我們的決策有所支持,不只在工作與學術上,資料科學可以幫助我們處理生活上遇到的各種問題,這也是資料科學很有趣的一點!

歡迎想學習Python資料科學、商業分析、金融知識的人一起交流!本部落格的內容全部都是基於「分享」的實作、理論兼顧文章,希望能夠幫助到所有對資料科學領域有興趣的人們,長期關注可按左手邊的Follow!若喜歡我在 Medium 的內容,可以拍個手(Claps)這邊想做個實驗,好讓我知道你/妳喜不喜歡這篇文章:
拍 10 下:簽個到,表示支持(謝謝鼓勵!)
拍 20 下:想要我多寫「商管相關」
拍 30 下:想要我多寫「資科相關」
拍 50 下:我有你這讀者寫這篇也心滿意足了!

敬請期待下一篇!或是您也可以逛逛我的其他資料科學文章:人工智慧商務系列:

Python資料科學系列:

看我用金融的概念解釋AI:

如果想跟著我實作資料科學,開始寫程式必知必會基礎系列:

--

--

戴士翔 | Dennis Dai
Finformation當資料科學遇上財務金融

外商分析顧問,Ex- Apple Data Scientist,曾在FMCG巨頭/日商管顧/MBB管顧/高成長電商從事商業分析與數位轉型,專注分享管顧、商業、數據分析的思考。分析/演講/合作歡迎來信:dennis.dai.1011@gmail.com