이산화 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""이산화(같은 폭 칸 나누기) 검증.
문서: 08.이산화 (예시, 카드 C2)
주장:
1. 값 (4, 8, 15, 21, 21, 24, 25, 28, 34)를 폭 10인 세 칸 [4,14), [14,24), [24,34]로 나누면
칸에 든 값은 (4, 8), (15, 21, 21), (24, 25, 28, 34)로 개수가 2, 3, 4다.
같은 개수로 나누는 비닝(05.데이터 정제)과 달리 칸마다 개수가 다르다.
2. 칸 평균으로 바꾸면 (6, 6, 19, 19, 19, 27.75, ...).
"""
import statistics as st
def equal_width(xs, k):
lo, hi = min(xs), max(xs); w = (hi - lo) / k
idx = [min(int((x - lo) // w), k - 1) for x in xs]
return [[x for x, i in zip(xs, idx) if i == j] for j in range(k)]
def main():
xs = [4, 8, 15, 21, 21, 24, 25, 28, 34]
b = equal_width(xs, 3)
assert b == [[4, 8], [15, 21, 21], [24, 25, 28, 34]]
means = [st.mean(c) for c in b]
assert means == [6, 19, 27.75]
print("[OK] 폭 10인 세 칸:", b, "칸 평균", means)
# 카드 C2: 나이 (13, 15, 16, 19, 20, 21, 22, 25, 30, 33, 35, 36, 40, 45, 46, 52, 70) 폭 20, 13 시작
ages = [13, 15, 16, 19, 20, 21, 22, 25, 30, 33, 35, 36, 40, 45, 46, 52, 70]
lo = 13
lab = [min((a - lo) // 20, 2) for a in ages]
counts = [lab.count(i) for i in range(3)]
assert counts == [9, 7, 1]
print("[OK] 카드 C2: [13,33), [33,53), [53,73] 칸의 개수", counts)
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()