做個精明消費者 : Python 簡單數據科學日常應用例子

Brian Tsang

Brian Tsang

2019-03-27

前言

相信讀者或多或少都會有需要去香港超級市場購買家居日常用品的經驗.而從小我們都知道貨比三家,格價理財的基本消費原則. 不知道讀者會否知道香港有消費者委員會, 在消費者委員會的網上推出了網上格價一覽通, 讓我們每日得到六間超級市場的相同貨品的價格資料.

Picture1.png

如何透過Python數據科學協助你精明消費?

數據科學比較通俗的看法是把數據和程式當成項目來管理. 在一個項目中,我們會希望可以使用數據及演算法為我們得出有意義的知識, 從而在有限的資源條件下做出相對明智的決策.

我們可以參考坊間一些機構提出的數據科學工作流程來建立我們的數據科學項目管理,當中流程如下:

  1. 設定數據項目目標
  2. 收集相關有用數據
  3. 對數據進行整理
  4. 使用演算法和模型分析數據
  5. 分享分析結果
  6. 盡量把工作流程自動化

因應數據項目的需求大小, 我們可能會選擇把項目做大一些或者做細一些. 因應這十幾年世界經濟正處於相對上世紀來說比較急速散亂的發展, 市場上出現了有如精益創業等提出如何在低風險下做出成功的產品, 故我們可以參考精益創業的方向, 把我們每一個數據科學項目先從低成本中建立, 當急速轉變的市場出現需求時就試試把該項目擴大成為市場受歡迎的項目. 好! 我們現在就把數據科學項目管理的工作流程應用在如何成為精明超級市場清費者.

步驟1: 設定數據項目目標

我們希望能找出同一件貨品在哪一間超市購買比較經濟

Screen Shot 2019-03-27 at 2.42.33 PM.png

如上圖, 我們知道如果只是購買 ”嘉頓 Garden超軟蛋糕 - 雲呢拿味 8片”, 百佳應該是次選

步驟2: 收集相關有用數據

在這裡我們可以應用網路爬蟲的程式來自動化我們的工作

如果可以把網上的數據放入可以做分析的環境例如Python 或者 Excel 的話, 我們就可以進行數據模型了

透過 Python 我們可以寫以下33行編碼, 然後在 Python IDE (例如 Visual Studio Code, Thonny, Jupyter Notebook) 中運行, 就可以把資料放到 df 中和supermarket.csv 中了

當然, 能夠完全明白這33行編碼需要時間去多認識 Python libraries 及當中的原理. 然後我們就可以自制化當中的細節

#%%
import requests
import lxml.html as lh
import pandas as pd

url = 'http://www3.consumer.org.hk/pricewatch/supermarket/'
page = requests.get(url)
doc = lh.fromstring(page.content)

tr_elements = doc.xpath('//tr')
tr_elements = tr_elements[18:]
col = []

i = 0
for t in tr_elements[1]:
    i += 1
    name = t.text_content()
    col.append((name, []))

for j in range(1, len(tr_elements)):
    T = tr_elements[j]
    if len(T) != 11:
        break
    i = 0
    for t in T.iterchildren():
        data = t.text_content()
        if i > 0:
            try:
                data = int(data)
            except:
                pass
        col[i][1].append(data)
        i += 1

Dict = {title: column for (title, column) in col}
df = pd.DataFrame(Dict)

columnsTitles = [
    "最後更新日期", "分類", "牌子", "貨品(可按入瀏覽詳情)", "惠康", "MarketPlace", "百佳", "屈臣氏", "大昌食品", "AEON", "選擇"
]
new_df = df.reindex(columns=columnsTitles)
new_df.to_csv("supermarket.csv", encoding="utf-8-sig")

步驟3: 數據整理

數據在分析環境中會有不同的存留形式, 很多時候就是需要做好數據整理才能把數據放入演算法及數學模型中. 以下是我們把惠康的文字價格轉為數值價格的編碼

new_col = []
for i in range(len(l)):
    temp = l[i]
    if len(temp) > 8:
        temp = temp.replace('\xa0$ ', '')
    else:
        temp = temp.replace('$ ', '')
    
    if temp == '--':
        temp = 0 

    temp = float(temp)
    new_col.append(temp)

df['new_welcome'] = new_col
df.head()

Screen Shot 2019-03-27 at 2.40.41 PM.png

步驟4: 數據分析

如何可以找出所有會出現價格不一樣的貨品呢? 就是平均值跟每一間超市的價格有差異! 如圖, 我們見到第二行就出現了平均值有差異的情況, 也代表可有更加經濟的選購目標了

Picture3.png

步驟5: 分享分析結果

分享分析結果是為了讓其他的項目關注者了解分析結果是否合理, 應如何作出合適的修正. 我們現在初步的分析是不完整的,而完整的分析有待重整了.

步驟6: 盡量把工作流程自動化

我們最後的產品是可以回答我們設定的目標, 在這個項目中,我們可能需要的是一個每日都更新的Excel表, 而這個表格會出現有較為經濟的貨品. 經過以下的簡單編碼, 我們可以把Excel 表做出來

Picture4.png

Picture5.png

留言

延伸閱讀

HTTP:互聯網的共同語言

如何成為 Programmer (四):適合新手的語言

Data Science? AI ? Machine Learning? 到底有何分別?

有一種病叫Excel病