2 Exploratory Data Analysis
(ns assignment.eda
(:require
[clojure.math.combinatorics :as combo]
[fastmath.stats :as stats]
[scicloj.kindly.v4.kind :as kind]
[scicloj.ml.dataset :as ds]))Load data
(defonce concrete-data
(ds/dataset "data/Concrete_Data.csv"
{:key-fn (fn [colname]
(-> colname
(clojure.string/replace #"\.|\s" "-")
clojure.string/lower-case
(clojure.string/split #"\-\(|\--\(|\(")
first
keyword))}))(ds/info concrete-data)data/Concrete_Data.csv: descriptive-stats [9 11]:
| :col-name | :datatype | :n-valid | :n-missing | :min | :mean | :max | :standard-deviation | :skew | :first | :last |
|---|---|---|---|---|---|---|---|---|---|---|
| :cement | :float64 | 1030 | 0 | 102.00 | 281.16786408 | 540.0 | 104.50636449 | 0.50948118 | 540.00 | 260.9 |
| :blast-furnace-slag | :float64 | 1030 | 0 | 0.00 | 73.89582524 | 359.4 | 86.27934175 | 0.80071690 | 0.00 | 100.5 |
| :fly-ash | :float64 | 1030 | 0 | 0.00 | 54.18834951 | 200.1 | 63.99700415 | 0.53735391 | 0.00 | 78.3 |
| :water | :float64 | 1030 | 0 | 121.80 | 181.56728155 | 247.0 | 21.35421857 | 0.07462838 | 162.00 | 200.6 |
| :superplasticizer | :float64 | 1030 | 0 | 0.00 | 6.20466019 | 32.2 | 5.97384139 | 0.90720257 | 2.50 | 8.6 |
| :coarse-aggregate | :float64 | 1030 | 0 | 801.00 | 972.91893204 | 1145.0 | 77.75395397 | -0.04021974 | 1040.00 | 864.5 |
| :fine-aggregate | :float64 | 1030 | 0 | 594.00 | 773.58048544 | 992.6 | 80.17598014 | -0.25300960 | 676.00 | 761.5 |
| :age | :int16 | 1030 | 0 | 1.00 | 45.66213592 | 365.0 | 63.16991158 | 3.26917740 | 28.00 | 28.0 |
| :concrete-compressive-strength | :float64 | 1030 | 0 | 2.33 | 35.81796117 | 82.6 | 16.70574196 | 0.41697729 | 79.99 | 32.4 |
(def response :concrete-compressive-strength)(def regressors
(ds/column-names concrete-data (complement #{response})))^kind/vega
(let [data (ds/rows concrete-data :as-maps)
column-names (ds/column-names concrete-data)]
{:data {:values data}
:repeat {:column column-names}
:spec {:mark "bar"
:encoding {:x {:field {:repeat "column"} :type "quantitative"}
:y {:aggregate "count"}}}})^kind/vega
(let [data (ds/rows concrete-data :as-maps)
column-names (ds/column-names concrete-data)]
{:data {:values data}
:repeat {:column column-names}
:spec {:width 60 :mark "boxplot"
:encoding {:y {:field {:repeat "column"} :type "quantitative" :scale {:zero false}}}}})(let [columns (ds/column-names concrete-data)]
(for [column columns]
(vector column (count (stats/outliers (get concrete-data column))))))([:cement 0]
[:blast-furnace-slag 2]
[:fly-ash 0]
[:water 9]
[:superplasticizer 10]
[:coarse-aggregate 0]
[:fine-aggregate 5]
[:age 59]
[:concrete-compressive-strength 4])2.0.1 Pairs-plots.
^kind/vega
(let [data (ds/rows concrete-data :as-maps)
column-names (ds/column-names concrete-data)]
{:data {:values data}
:repeat {:column column-names
:row column-names}
:spec {:height 100 :width 100
:mark "circle"
:encoding {:x {:field {:repeat "column"} :type "quantitative" :scale {:zero false}}
:y {:field {:repeat "row"} :type "quantitative" :scale {:zero false}}}}})(let [combos (combo/combinations regressors 2)]
(for [[x y] combos]
(assoc {} [x y] (stats/correlation (get concrete-data x) (get concrete-data y)))))({[:cement :blast-furnace-slag] -0.2752159110303216}
{[:cement :fly-ash] -0.3974673408068984}
{[:cement :water] -0.081586748464108}
{[:cement :superplasticizer] 0.09238617275378022}
{[:cement :coarse-aggregate] -0.10934899412490102}
{[:cement :fine-aggregate] -0.22271784866558753}
{[:cement :age] 0.08194602387182141}
{[:blast-furnace-slag :fly-ash] -0.3235799005063863}
{[:blast-furnace-slag :water] 0.10725202721109249}
{[:blast-furnace-slag :superplasticizer] 0.0432704187610415}
{[:blast-furnace-slag :coarse-aggregate] -0.2839986119592143}
{[:blast-furnace-slag :fine-aggregate] -0.28160267061419436}
{[:blast-furnace-slag :age] -0.044246019304454105}
{[:fly-ash :water] -0.2569840228651458}
{[:fly-ash :superplasticizer] 0.37750314590136597}
{[:fly-ash :coarse-aggregate] -0.009960827842262435}
{[:fly-ash :fine-aggregate] 0.07910849096499861}
{[:fly-ash :age] -0.15437051606792704}
{[:water :superplasticizer] -0.6575329076284498}
{[:water :coarse-aggregate] -0.1822936018614345}
{[:water :fine-aggregate] -0.4506611741300146}
{[:water :age] 0.2776182215210028}
{[:superplasticizer :coarse-aggregate] -0.26599914818628756}
{[:superplasticizer :fine-aggregate] 0.2226912299131872}
{[:superplasticizer :age] -0.192700028043472}
{[:coarse-aggregate :fine-aggregate] -0.17848095742332457}
{[:coarse-aggregate :age] -0.0030158803467434966}
{[:fine-aggregate :age] -0.15609470264758582})(for [[x y] (mapv (fn [r] [response r]) regressors)]
(assoc {} [x y] (stats/correlation (get concrete-data x) (get concrete-data y))))({[:concrete-compressive-strength :cement] 0.4978319193241562}
{[:concrete-compressive-strength :blast-furnace-slag]
0.13482926149740534}
{[:concrete-compressive-strength :fly-ash] -0.1057549162973129}
{[:concrete-compressive-strength :water] -0.2896333849853036}
{[:concrete-compressive-strength :superplasticizer]
0.36607882718852003}
{[:concrete-compressive-strength :coarse-aggregate]
-0.1649346144601096}
{[:concrete-compressive-strength :fine-aggregate]
-0.16724124729005832}
{[:concrete-compressive-strength :age] 0.3288730007799831})