| import numpy as np |
|
|
| def analyze_3d_data(data): |
| """ |
| 3Dデータポイントのリストを受け取り、トリム平均とSTD法による外れ値を返す |
| |
| Args: |
| data: [(x1, y1, z1), (x2, y2, z2), ...] 形式のリスト |
| |
| Returns: |
| dict: |
| { |
| 'trimmed_mean': (x_mean, y_mean, z_mean), # トリム平均 |
| 'std_outliers': { |
| 'x': [x_outlier1, x_outlier2, ...], # x座標の外れ値 |
| 'y': [y_outlier1, y_outlier2, ...], # y座標の外れ値 |
| 'z': [z_outlier1, z_outlier2, ...] # z座標の外れ値 |
| }, |
| 'trimmed_data': { |
| 'x': [x1, x2, ...], # トリム平均に使用したx座標データ |
| 'y': [y1, y2, ...], # トリム平均に使用したy座標データ |
| 'z': [z1, z2, ...] # トリム平均に使用したz座標データ |
| } |
| } |
| """ |
|
|
| |
| x_coords = [point[0] for point in data] |
| y_coords = [point[1] for point in data] |
| z_coords = [point[2] for point in data] |
|
|
| def trimmed_data_and_mean(coords): |
| """ |
| 最小値と最大値を除外したデータとトリム平均を返す |
| """ |
| coords_sorted = sorted(coords) |
| trimmed_coords = coords_sorted[1:-1] |
| return trimmed_coords, np.mean(trimmed_coords) |
|
|
| |
| x_trimmed, x_trimmed_mean = trimmed_data_and_mean(x_coords) |
| y_trimmed, y_trimmed_mean = trimmed_data_and_mean(y_coords) |
| z_trimmed, z_trimmed_mean = trimmed_data_and_mean(z_coords) |
|
|
| def detect_outliers_std(data, multiplier=2): |
| """ |
| 標準偏差に基づく外れ値検出 (multiplier=2) |
| """ |
| mean = np.mean(data) |
| std = np.std(data) |
| lower_bound = mean - multiplier * std |
| upper_bound = mean + multiplier * std |
| outliers = [x for x in data if x < lower_bound or x > upper_bound] |
| return outliers |
|
|
| |
| x_outliers_std = detect_outliers_std(x_trimmed, multiplier=2) |
| y_outliers_std = detect_outliers_std(y_trimmed, multiplier=2) |
| z_outliers_std = detect_outliers_std(z_trimmed, multiplier=2) |
|
|
| return { |
| 'trimmed_mean': (round(x_trimmed_mean,2), round(y_trimmed_mean,2), round(z_trimmed_mean,2)), |
| 'std_outliers': { |
| 'x': x_outliers_std, |
| 'y': y_outliers_std, |
| 'z': z_outliers_std, |
| }, |
| 'trimmed_data': { |
| 'x': x_trimmed, |
| 'y': y_trimmed, |
| 'z': z_trimmed |
| } |
| } |
| """ |
| # 使用例 (元のデータを使用) |
| data = { |
| 'hgbr-15': [-5.4, 1.56, -2.92], |
| 'hgbr-45': [-4.5, 1.2, -1.76], |
| 'hgbr-90': [1.58, 1.82, -3.35], |
| 'lgbm-15dart': [-6.18, 3.11, -2.46], |
| 'lgbm-15': [-5.65, 1.76, -2.59], |
| 'lgbm-45': [-7.18, 1.42, -2.71], |
| 'lgbm-90': [-3.58, 3.94, -2.5], |
| } |
| |
| # 辞書型のデータをリスト型に変換 |
| data_list = list(data.values()) |
| |
| # 関数を呼び出し |
| result = analyze_3d_data(data_list) |
| |
| # 結果を表示 |
| print("トリム平均:", result['trimmed_mean']) |
| print("STD法による外れ値 (multiplier=2):") |
| print(" x:", result['std_outliers']['x']) |
| print(" y:", result['std_outliers']['y']) |
| print(" z:", result['std_outliers']['z']) |
| print("トリム平均に使用したデータ:") |
| print(" x:", result['trimmed_data']['x']) |
| print(" y:", result['trimmed_data']['y']) |
| print(" z:", result['trimmed_data']['z']) |
| """ |
|
|