分類這個章節的重點在於掌握多種不同數據類型,例如:連續(身高、長度)、等第(名次)、項目(種類)等。這個章節的相關程式碼在 Chapter 04,主要使用著名的鐵達尼號資料集(data about the passengers on the Titanic)。
如同往常,先來看看資料的具體內容及「骯髒」程度。
(defn load-data [file]
(-> (io/resource file)
(str)
(iio/read-dataset :delim \tab :header true)))
(defn ex-4-1 []
(i/view (load-data :titanic)))
資料包含了蠻多的類別資料,例如::sex
、:pclass
(座艙等級)、以及:embarked
(登船口),有一些欄位則比較混亂,例如 :ticker
、boat
、:body
。有些資料可以當成離散,也可當成連續,例如伴侶數量 :sibsp
。
我們可以通過頻率表來觀察資料分布的狀況。
(defn frequency-table [sum-column group-columns dataset]
(->> (i/$ group-columns dataset)
(i/add-column sum-column (repeat 1))
(i/$rollup :sum sum-column group-columns)))
(defn ex-4-2 []
(->> (load-data "titanic.tsv")
(frequency-table :count [:sex :survived])))
;; | :survived | :sex | :count |
;; |-----------+--------+--------|
;; | n | male | 682 |
;; | n | female | 127 |
;; | y | male | 161 |
;; | y | female | 339 |
上面的程式輸出的結果是生還者數量跟性別的關聯性。
在一個兩變數的表格中,我們可以計算類別對另一類別所造成的影像為何(假如有關聯)。
(defn frequency-map [sum-column group-cols dataset]
(let [f (fn [freq-map row]
(let [groups (map row group-cols)]
(->> (get row sum-column)
(assoc-in freq-map groups))))]
(->> (frequency-table sum-column group-cols dataset)
(:rows)
(reduce f {}))))
於是我們就可以用這個頻率表下去計算我們所需要的值!
(defn ex-4-3 []
(->> (load-data "titanic.tsv")
(frequency-map :count [:sex :survived])))
;; {"female" {"y" 339, "n" 127}, "male" {"y" 161, "n" 682}}