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