Did I implement the data analysis part correctly? We wanted to perform Kruskal–Wallis test with a dunn's test for post hoc. There is a reports folder with 10 csv files in the reports folder, benchmarking 5 different ordered set implementations (RBTree, BTree, AVLTree, FlatSet, SplayTree
```csv
Name,Time(s),Implementation
Case1,0.002151084000,RBTree
Case1,0.003351084000,RBTree
Case1,0.003551084000,RBTree
... (100 times per impelemtation)
Case1,0.002151084000,BTree
...
Case1,0.002151084000,AVLTree
...
Case1,0.002151084000,FlatSet
...
Case1,0.002151084000,SplayTree
...
```

```python
# analysis.py

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import scikit_posthocs as sp # for dunn

def format_data(data): 
    data = data.drop(['Name'], axis=1)
    data['Index'] = data.groupby('Implementation').cumcount()
    data = data.pivot(columns='Implementation', values='Time(s)', index='Index')
    return data

# for post hoc (Tukey)
def unformat_data(data):
    data = pd.melt(data, var_name='Implementation', value_name='Time(s)')
    return data

def process_file(file): 
    data = pd.read_csv(f'../reports/{file}')
    data = format_data(data)
    
    # transform
    data = np.log(data)
    return data

def test_normality(data):
    for col in data.columns: 
        print(f"{col} normality: {stats.normaltest(data[col]).pvalue}")
        
def test_variance(data):
    print(f"Levene: {stats.levene(data['AvlTree'], data['Btree'], data['FlatSet'], data['RBTree'], data['SplayTree']).pvalue}")

def create_hist(data, i):
    plt.clf()
    plt.hist(data)
    plt.savefig(f'plots/case{i+1}_hist.png')
    
def create_scatter(data, i): 
    plt.clf()
    plt.scatter(data.index, data['AvlTree'], c='b', marker='.', label='AVL Tree', alpha=0.5)
    plt.scatter(data.index, data['Btree'], c='y', marker='.', label='BTree', alpha=0.5)
    plt.scatter(data.index, data['FlatSet'], c='r', marker='.', label='Flat Set', alpha=0.5)
    plt.scatter(data.index, data['RBTree'], c='g', marker='.', label='Red Black Tree', alpha=0.5)
    plt.scatter(data.index, data['SplayTree'], c='m', marker='.', label='Splay Tree', alpha=0.5)

    plt.title(f'Case {i}')
    plt.xlabel('Iteration')
    plt.ylabel('Time(s)')
    plt.legend()
    plt.savefig(f'plots/case{i+1}_scatter.png')
    
def create_boxplot(data, i):
    plt.clf()
    plt.boxplot(data)
    plt.xticks([1, 2, 3, 4, 5], data.columns.tolist())
    plt.ylabel('Time(s)')
    plt.savefig(f'plots/case{i+1}_box.png')
    

# kruskal-wallis test
def perform_kw(data): 
    result = stats.kruskal(data['AvlTree'], data['Btree'], data['FlatSet'], data['RBTree'], data['SplayTree'])
    print(f"kruskal-wallis pval: {result.pvalue} ({'reject' if result.pvalue < 0.05 else 'accept'} null hypothesis)")


# Dunn's test for post hoc analysis (non-parametric)
def perform_dunn(data):
    data_unformatted = unformat_data(data)
    
    result = sp.posthoc_dunn(unformat_data(data), val_col='Time(s)', group_col='Implementation')
    print("Dunn's test:")
    print(result)


def main():
    
    for i in range(10):
        print(f"CASE {i+1} ------------------------------------")
        data = process_file(f'Case{i+1}.csv')
        
        # create_hist(data, i)
        # create_scatter(data, i)
        # create_boxplot(data, i)
        
        perform_kw(data)
        perform_dunn(data)



if __name__=='__main__':
    main()
```