Akjava's picture
init
4c7255e
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'])
"""