| | 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']) |
| | """ |
| |
|