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, y, 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 # トリム後のデータに対して STD 法を適用 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']) """