Kruskal's Relative Importance / Driver Analysis (Not to be confused with Joseph's Distance Measure algorithm)
This package provides a python implementation of Kruskal's Algorithm
To calculate the inverse it uses the Moore–Penrose pseudoinverse which permits highly correlated independent variables to be passed as well as variables that have zero variance. It is up to the user of this library to ensure they are comfortable with this. N.B. if the normal matrix inversion would work, that is used, the psuedoinverse is only applied if the former fails.
Kruskals is distributed via pypi and can be installed like:
pip install Kruskals
Alternatively, you can clone the repository and install via
pip install -e path/to/your/checkout
from Kruskals import Kruskals
# drivers score can be calculated straight from numpy:
>>> import Kruskals
>>> import numpy as np
>>> ndarr = np.array([
... [1, 2, 3, 4, 5, 6],
... [6, 5, 4, 3, 8, 1],
... [1, 1, 9, 1, 1, 1],
... [9, 2, 2, 2, 2, 2],
... [3, 3, 3, 9, 3, 3],
... [1, 2, 2, 9, 1, 4]
... ])
>>> arr = np.array([1, 2, 3, 4, 5, 6])
>>> Kruskals.Kruskals(ndarr, arr).driver_score()
array([ 0.14721238, 0.44397682, 0.23979013, 0.62492599, 0.71898045,
0.31662422])
# or from a pandas dataframe:
>>> import pandas as pd
>>> df = pd.DataFrame(ndarr)
>>> df.columns = ['a', 'b', 'c', 'd', 'e', 'f']
>>> df
a b c d e f
0 1 2 3 4 5 6
1 6 5 4 3 8 1
2 1 1 9 1 1 1
3 9 2 2 2 2 2
4 3 3 3 9 3 3
5 1 2 2 9 1 4
>>> ind_cols = ['a', 'b', 'c', 'd', 'e']
>>> Kruskals.Kruskals.from_pandas_df(df, ind_cols, 'f').driver_score_to_series()
driver
a 0.382246
b 0.267348
c 0.485063
d 0.262053
e 0.165562
Name: score, dtype: float64
# it also supports directional drivers (determined by the correlation coefficient between
# each independent variable, and the dependent)
>>> Kruskals.Kruskals.from_pandas_df(df, ind_cols, 'f').driver_score_to_series(directional=True)
driver
a -0.382246
b -0.267348
c -0.485063
d 0.262053
e -0.165562
Name: score, dtype: float64
You can play around with the repo by cloning and running this from the command line:
python -m Kruskals tests/data/kruskals_data.csv y x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20
This prints out the distance metrics for each column (in the same order). It can run about 50 columns within 10 seconds.
Kruskals uses pytest
for its unit testing. The tests can be run from the root of a checkout with:
py.test