"""
可視化した結果に対して、２次元座標をもとにハンドで各アクションシークエンスを引き当てることも可能ですが、ここは K-means を利用して ML らしく分類してみました。

さらに K-means の結果を決定木に掛けて、その分類が行われた要因を調べました。決定木の結果は、output にセーブしたカラーの PNGイメージが見易くなっています。（下の方にあります）
決定木の結果から、imu(姿勢)に関係する特徴量が効いているように読み取れます。
"""
!pip install umap-learn
!pip install pydotplus
# ライブラリのimport
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import matplotlib.cm as cm
plt.style.use('ggplot')
%matplotlib inline
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
#from sklearn.cluster import DBSCAN
from sklearn.cluster import MiniBatchKMeans
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
import pydotplus
#import os
#for dirname, _, filenames in os.walk('/kaggle/input'):
#    for filename in filenames:
#        print(os.path.join(dirname, filename))
df_train = pd.read_csv('/kaggle/input/data-science-spring-osaka-hard-mode/train.csv')
df_test = pd.read_csv('/kaggle/input/data-science-spring-osaka-hard-mode/test_hard.csv')
df_action = pd.read_csv('/kaggle/input/data-science-spring-osaka-hard-mode/actions_hard.csv')
df_train.head(2)
df_test.head(2)
df_action.head(10)
df = pd.read_csv('/kaggle/input/data-science-spring-osaka-hard-mode/test_hard/test_hard/0000.csv')
df.tail(2)
scaler = MinMaxScaler()
df.iloc[:] = scaler.fit_transform(df)
df.tail(2)
DataFrame(df.std()).T
def add_std_as_feature(df):
    df_temp = DataFrame()
    for path in df.file_path:
        df_sensor = pd.read_csv('/kaggle/input/data-science-spring-osaka-hard-mode/test_hard/'+path)
        df_sensor = DataFrame(df_sensor.std()).T
        df_temp = pd.concat([df_temp, df_sensor])
    df_temp.columns = [col+'_std' for col in df_temp.columns]
    df_temp.index = df.index
    df = pd.concat([df, df_temp], axis=1)
    return df
#df_train = add_std_as_feature(df_train)
df_test = add_std_as_feature(df_test)
X_test = df_test
X_test.drop(['file_path'],axis=1,inplace=True)
#df_train.head(2)
X_test.tail(2)
from sklearn.preprocessing import StandardScaler
import umap

reducer = umap.UMAP(random_state=42)

y_test = reducer.fit_transform(X_test)

plt.scatter(y_test[:, 0], y_test[:, 1])
y_test.shape
"""
***K-means を使って、８つのクラスターに分類***
"""
kmeans = MiniBatchKMeans(n_clusters=8, max_iter=300)
kmeans_y_test = kmeans.fit_predict(y_test)
color=cm.brg(np.linspace(0,1,np.max(kmeans_y_test) - np.min(kmeans_y_test)+1))
for i in range(np.min(kmeans_y_test), np.max(kmeans_y_test)+1):
    plt.plot(y_test[kmeans_y_test == i][:,0],
             y_test[kmeans_y_test == i][:,1],
             ".",
             color=color[i]
             )
    plt.text(y_test[kmeans_y_test == i][:,0][0],
             y_test[kmeans_y_test == i][:,1][0],
             str(i), color="black", size=16
             )
"""
注：グラフの番号は、アクションシークエンスNo.とは一致しません。
"""
kmeans_y_test
"""
***決定木を使ってクラスターの特徴を調査***
"""
clf = DecisionTreeClassifier( random_state = 0 )
clf.classes_ = np.max(kmeans_y_test) - np.min(kmeans_y_test) + 1
clf.fit(X_test, kmeans_y_test)
dot_data = export_graphviz(clf,
                feature_names=X_test.columns, 
                class_names=['0','1','2','3','4','5','6','7'], 
                filled=True, 
                rounded=True)

graph = pydotplus.graph_from_dot_data( dot_data )

tree.plot_tree(clf);
graph.write_png( 'hardmode_umap_std.dot.png' )
"""
アウトプットしたカラーの PNG イメージの方が見易い　（更に下の方にあります）
"""