단원 홈

Ⅱ. 데이터 준비와 분석5차시

튀는 값은 틀린 값인가,
다른 이야기인가

규칙으로 찾고 사람이 판정한다

따릉이 기록 한 줄에 "4분 동안 143km"라고 적혀 있습니다. 자전거로는 불가능한 값이지요. 그런데 이상해 보이는 줄이 모두 틀린 줄은 아닙니다 — 어떤 줄은 다른 쓰임이고, 어떤 줄은 정말 그랬고, 어떤 줄은 기록되지 않은 빈칸입니다. 규칙으로 명단을 뽑고, 사람이 판정하고, 그 판정이 결론을 얼마나 바꾸는지까지 잽니다.

  • [12데과02-02]
  • 50분네 정거장
  • 새 도구RobustScaler (scikit-learn)
  • 자료따릉이 대여이력 한 주 1,195,687행 · 표본 2,000행
Ⅱ 단원 지도5 / 14차시
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14

학습 목표

  1. 개념에서

    튀는 값을 네 부류(오류 · 다른 집단 · 진짜 극단 · 기록의 빈칸)로 가르고, 부류마다 다른 처리를 말할 수 있다.

  2. 손으로

    상식 규칙 · IQR 울타리 · RobustScaler를 같은 자료에 돌려, 서로 다른 행을 잡는다는 것을 확인할 수 있다.

  3. 확인에서

    처리 방식이 대푯값을 얼마나 바꾸는지 재고, 보고서에 함께 적을 세 가지를 쓸 수 있다.

1
여는 장면 · 5분

기록 두 줄 — 둘 다 이상한데, 틀린 칸이 다르다

2024년 6월 둘째 주(6월 10일 월요일 ~ 16일 일요일), 서울 따릉이는 1,195,687번 빌려졌습니다. 그 한 주의 기록에서 두 줄을 꺼내 보겠습니다. 둘 다 한눈에 "이상하다" 싶은 줄인데, 이상한 까닭이 서로 다릅니다.

표 1한 주에서 꺼낸 두 줄대여이력 원본 칸 그대로 · 아래 두 줄은 우리가 계산한 값
칸줄 ㉮줄 ㉯
대여일시2024-06-10 20:03:372024-06-14 08:42:17
대여 대여소청구아파트 앞
(구로구 고척동)
디지털미디어 시티역 4번출구
(은평구)
반납일시2024-06-10 20:08:132024-06-14 10:37:33
반납 대여소고척아이파크아파트 106동 앞
(구로구 고척동)
칸이 비어 있다 (\N)
이용시간(분)411,430
이용거리(M)143,433.893,494.00
분으로 잰 시속2,151.50.02
두 시각으로 잰 시속1,870.91.82

줄 ㉮는 4분 동안 143km를 갔다고 적혀 있습니다. 그런데 두 대여소는 같은 동(구로구 고척동)에 있어요 — 공개된 대여소 목록의 위경도로 재면 직선거리 419m, 기록된 거리는 그 약 340배입니다. 거리 칸이 틀렸습니다. 줄 ㉯는 11,430분, 곧 여드레 가까이 탄 것으로 적혀 있지만 대여·반납 두 시각의 차는 115.3분입니다. 이쪽은 이용시간 칸이 틀렸고, 반납 대여소 칸도 비어 있습니다. 자료: 서울 열린데이터광장 따릉이 대여이력(OA-15182, 공공누리 제1유형) 2024-06-10~16 · 대여소 위경도는 같은 광장의 대여소 정보. 두 줄 모두 한 주 1,195,687행 안에 실제로 있는 줄이다(3정거장이 쓰는 표본 2,000행에는 들어 있지 않다).

두 줄을 고치거나 빼는 것은 어렵지 않습니다. 어려운 것은 그다음입니다 — 어디까지가 "틀린 줄"인가? 2시간 넘게 탄 줄은? 주말에 한강을 따라 29km를 달린 줄은? 같은 대여소에 그대로 돌려놓아 이동거리가 0인 줄은? 이 줄들은 이상해 보이지만 틀린 줄이 아닐 수 있습니다.

먼저 예측

오늘 우리는 표본 2,000줄에서 "이상해 보이는 줄"을 규칙으로 뽑아 하나씩 판정합니다. 그 전에 한 문장으로 적어 두세요 — 이상해 보이는 줄을 모두 빼면 "한 번 탈 때 평균 몇 분"은 올라갈까요, 내려갈까요? 그리고 얼마나 바뀔까요?

체크포인트 1

같은 "이상한 줄"이라도 틀린 칸이 다르다는 것을 보았다. 이제 이상한 줄을 찾는 규칙을 만든다.

다음 정거장 · 개념 15분 →
2
개념 · 15분

규칙은 명단을 주고, 판정은 사람이 한다

2-1튀는 값은 네 부류다

튀는 값(이상치)은 "다른 값들과 동떨어진 값"입니다. 동떨어졌다는 것은 관찰이지 판정이 아니에요. 왜 동떨어졌는지를 묻고 나서야 무엇을 할지 정할 수 있습니다. 까닭은 크게 넷입니다.

넷을 가르는 일은 자동으로 되지 않습니다. 같은 "거리 0"이라도 같은 대여소에 되돌린 7줄은 '다른 쓰임'이고, 다른 대여소로 갔는데 거리가 0인 39줄은 '기록되지 않은 빈칸'입니다 — 둘을 가르려면 다른 열(반납 대여소, 대여·반납 두 시각)을 맞대 봐야 해요.

규칙규칙이 뽑아낸 것은 살펴볼 목록이다. 무엇을 뺄지는 목록을 하나씩 판정한 뒤에 정하고, 뺀 줄 수와 기준을 보고서에 적는다.

표 2튀는 값 네 부류 — 이 차시에서 실제로 만나는 줄부류가 정해져야 처리가 정해진다
부류무엇인가이 차시의 실제 줄처리
오류 있을 수 없는 값줄 ㉮ — 4분에 143km(두 대여소는 419m 거리)고치거나 뺀다
다른 집단 쓰임이 다른 값같은 대여소에 되돌린 7행(거리 0)나눠서 본다
진짜 극단 드물지만 실제인 값139분에 29.1km(시속 12.5) 같은 긴 라이딩둔다
기록의 빈칸 0이 아니라 '모름'다른 대여소로 갔는데 거리 0 39행빈칸(NaN)으로 바꾼다

Ⅱ-4 에서 가져옴네 번째 부류는 4차시의 '없음'과 '모름' 그대로입니다. 0은 "0km를 탔다"는 값이고, 빈칸은 "얼마인지 적지 않았다"는 모름이에요. 둘을 같은 0으로 읽으면 평균이 조용히 내려갑니다.

2-2두 열을 합쳐야 보이는 이상함

표본 2,000줄에서 46분쯤 탄 줄은 52줄(45~50분 칸), 24.3km쯤 간 줄은 3줄(24~26km 칸)입니다. 둘 다 드물긴 해도 있을 수 있는 값이라 한 열씩 보는 규칙으로는 걸리지 않아요. 그런데 이 둘이 같은 줄에 있으면 이야기가 달라집니다 — 46분에 24.3km면 시속 31.7, 공공자전거로는 낼 수 없는 속도입니다. 한 열씩 볼 때는 안 보이던 이상함이 두 열을 나눈 값에서 드러납니다.

이렇게 있는 열로 새로 만든 열을 파생 변수라고 합니다(Ⅰ-5에서 시속을 만들어 보았지요). 그림 1의 오른쪽처럼 가로를 이용시간, 세로를 이용거리로 놓으면 원점을 지나는 직선의 기울기가 곧 시속이 됩니다. 기울기가 가파를수록 빠른 줄이에요.

그림 1한 열씩 볼 때와 두 열을 함께 볼 때주황 = 표본에서 단 하나뿐인 시속 30 초과 줄
한 열씩 보면둘 다 드물지만 있는 값이다이용시간(분)52줄030609012046분이용거리(km)3줄0816243224.3km막대 높이 = √(그 칸의 줄 수) — 꼬리 쪽 칸도 보이게 두 열을 함께 보면기울기 = 거리 ÷ 시간 = 시속03060901200816243246분 24.3km시속 31.7불가능 지대시속 30km 선이용시간(분)세로: 이용거리(km) 한 열씩 보면둘 다 드물지만 있는 값이다이용시간(분)52줄030609012046분이용거리(km)3줄0816243224.3km막대 높이 = √(그 칸의 줄 수) — 꼬리 쪽 칸도 보이게 두 열을 함께 보면기울기 = 거리 ÷ 시간 = 시속03060901200816243246분 24.3km시속 31.7불가능 지대시속 30km 선이용시간(분)세로: 이용거리(km)

왼쪽 두 띠에서는 주황 막대가 꼬리의 다른 막대들 사이에 섞여 있습니다 — 드물긴 해도 혼자 튀지는 않아요. 오른쪽에서만 선 위로 올라갑니다. 한 열을 지키는 규칙으로는 이 줄을 못 잡습니다. 자료: 표본 2,000행(따릉이 대여이력 2024-06-10~16에서 무작위로 뽑은 줄) — 막대·점은 그 값 그대로 그렸다

불가능한 곳을 어떤 모양으로 가르느냐가 결과를 크게 바꿉니다. 한 주 1,195,687행 전체에 세 가지 울타리를 쳐 보면 이렇습니다.

표 3울타리의 모양이 바꾸는 것한 주 1,195,687행 · 빨강 = 분으로 잰 시속 60 초과 632행 · 노랑 = 시속 25~60 4,738행 · 회색 = 시속 25 이하 1,190,317행
울타리쓰는 열잡은 빨강억울하게 갇힌 회색
가로선 — 20km 넘으면 불가능거리만58 / 6325,071
세로선 — 9분 안쪽이면 불가능시간만572 / 632512,156
원점 직선 — 시속 30 넘으면 불가능두 열632 / 6320

가로선은 멀리 간 줄을, 세로선은 짧게 탄 줄을 잡습니다. 우리가 잡고 싶은 것은 빨리 간 줄이에요. '빠르다'는 두 열을 나눈 값이라, 두 열을 함께 쓰는 비스듬한 선만 회색을 하나도 가두지 않습니다. 자료: 한 주 1,195,687행 전수 집계(원장 phen_week_l05.py) — 3정거장 실험실이 화면에서 다시 세는 값과 같다

2-3통계 규칙 하나 — IQR 울타리와 그 가정

상식 규칙은 자료를 아는 사람이 만듭니다. 자료를 모를 때 쓰는 일반 규칙도 있어요. 가장 널리 쓰이는 것이 IQR 1.5배 울타리입니다 — 값을 크기순으로 줄 세워 아래 4분의 1 자리를 Q1, 위 4분의 1 자리를 Q3라 하고, 그 사이 폭 IQR = Q3 − Q1의 1.5배만큼 밖으로 나간 곳을 울타리로 삼습니다.

표본 2,000행의 이용시간은 Q1 6분 · Q3 25분이니 울타리는 25 + 1.5 × 19 = 53.5분입니다. 밖으로 나간 줄이 196행(9.8%)이에요. 한 주 전체로 재도 Q1 · Q3 · 울타리가 똑같고, 밖은 115,396행(9.7%)입니다.

그런데 1.5배라는 숫자는 좌우가 비슷한 모양을 염두에 두고 정해진 값입니다. 이용시간처럼 오른쪽으로 꼬리가 긴 자료에서는 정상적인 긴 대여가 통째로 울타리 밖으로 밀려나요. 그래서 밖 196행 가운데 182행이 상식 규칙에 하나도 안 걸립니다.

규칙IQR 울타리는 분포의 모양을 먼저 보고 쓴다. 한쪽으로 긴 자료에서는 '밖'이 곧 '틀림'이 아니다.

표본 2,000행이용시간(분)
53.5분0분125분
울타리 밖 196행그중 상식으로 멀쩡 182행

막대 = 5분 칸 인원(322 · 517 · 333 · 198 …) — 코드 ③이 읽는 같은 표본

3정거장 실험실에서 [IQR 울타리 53.5분]을 켜면 이 세로선을 화면에서 볼 수 있습니다. 선 밖 196점 가운데 불가능 지대에 든 점은 0개인데, 그 196행을 다 빼면 평균은 21.26분에서 14.40분으로 내려갑니다. 수업에서는 이 장면을 여기서 1분 30초 동안 함께 봅니다.

2-4숫자 둘을 나란히 놓으면 보인다

같은 자료에서 나온 두 숫자가 다르면, 그 차이가 곧 우리가 한 결정의 크기입니다.

표본 · 울타리 밖 196행을 다 빼면
21.26평균(분)
→
14.40평균(분)
그대로21.26분다 뺌14.40분

10행 가운데 하나를 뺐더니 평균이 3분의 1쯤 줄었다.

표본 · 거리 0인 46행을 빼면
21.26평균(분)
인데
21.59평균(분)
그대로21.26분빼면21.59분

빼면 오른다 — 짧은 대여만 골라 뺀 셈이기 때문이다.

한 주 · 시속 30을 넘는 줄
2,286분으로 재면(행)
→
1,088초시계로 재면(행)
분으로2,286행초시계로1,088행

이상한 줄의 절반 넘게는 초를 버린 '분'이 만들었다.

표본 · 기록이 '1분'인 대여의 속도
1.00두 시각으로(배)
vs
1.67분으로(배)
시계1.00배분1.67배

이용시간이 정수 분이라 버린 초만큼 속도가 부풀었다.

자료: 위 네 쌍의 숫자는 모두 3정거장 코드 ② · ③ · ⑤가 찍는 값이거나 한 주 전수 집계값이다.

튀는 줄을 판정하는 네 물음 — 차례로

  1. 다른 열같은 줄의 다른 칸이 같은 말을 하나 — 두 시각은? 반납 대여소는?
  2. 무리그런 줄이 혼자인가 여럿인가 — 여럿이면 '다른 집단'일 수 있다
  3. 있을 수 있나세상의 제약으로 가능한 값인가 — 자전거 속도 · 이용권 시간
  4. 적혔나0인가, 적히지 않은 것인가 — 빈칸을 0으로 읽지 않았나(Ⅱ-4)

이 네 물음에 답한 결과가 판정표입니다. 3정거장 미션 ⑤에서 실제로 채워 보고, Ⅲ-1에서는 모델이 크게 빗나간 날에, Ⅳ-3에서는 보고서의 '지우지 않은 까닭'에 같은 표를 다시 씁니다.

체크포인트 2

튀는 값을 네 부류로 가르고, 규칙 셋(상식 · IQR · 도구)이 서로 다른 줄을 잡는다는 것을 말할 수 있다.

다음 정거장 · 손으로 20분 →
3
손으로 · 20분

규칙 셋을 돌리고, 걸린 줄을 판정한다

오늘의 장비

RobustScaler — 튀는 값에 덜 흔들리는 자

지금까지 흩어짐은 평균과 표준편차로 쟀습니다. 둘 다 값 하나가 멀리 있으면 그쪽으로 끌려가요. scikit-learn 의 RobustScaler는 중앙값과 IQR로 자를 만듭니다 — 오늘 손으로 그은 울타리와 같은 재료입니다. 처음 실행은 몇 초 멈춥니다(scikit-learn 을 처음 받는 중 · 쪽마다 한 번).

부르는 모양

from sklearn.preprocessing import RobustScaler

rs = RobustScaler().fit(t[["분"]])
rs.center_[0]   # 가운데 = 중앙값
rs.scale_[0]    # 폭 = IQR

오늘 쓰는 것 넷

fit
자료를 보고 두 숫자(가운데 · 폭)를 기억한다
center_
기억한 가운데 — 중앙값
scale_
기억한 폭 — IQR
transform
값을 그 자의 눈금으로 옮긴다

pandas 로 직접 하는 것과 다른 셋

  1. 두 숫자를 기억한다fit 한 자를 다른 자료에 그대로 다시 댈 수 있다
  2. 여러 열을 한 번에열마다 제 가운데·폭으로 — 오늘은 한 열만 쓴다
  3. 판정은 하지 않는다눈금만 바꿀 뿐, 어디서 자를지는 사람이 정한다

대가 — 기억한 두 숫자를 내가 읽지 않으면, 무엇으로 잰 눈금인지 모른 채 숫자만 보게 됩니다.

1

불가능 지대를 내 손으로 긋고, 규칙 셋으로 센다

8분

여는 장면에 적어 둔 내 예측입니다. 오늘 이 문장이 몇 분쯤 빗나가는지 끝에서 확인합니다.

실험실을 열기 전에 하나 더 짐작해 두세요 — 표본 2,000행 가운데 2시간 이상 탄 줄은 몇 행일까요? 6시간 이상이면? 이동거리가 0인 줄은?

점 구름 위로 한 획을 그어 '자전거로는 갈 수 없는 곳'을 갈라 보세요. 손을 떼면 획이 곧은 선으로 맞춰지고, 그 선이 무엇을 잡고 무엇을 가두는지를 한 주 119만 행으로 세어 줍니다. 도전 셋을 풀면 카드가 스스로 닫힙니다.

시뮬레이터

불가능 지대

한 획으로 울타리를 긋는다 — 내 선은 무엇을 잡고 무엇을 가두나

  1. 1점 구름 위로 한 획을 그으면 왼쪽 위가 불가능 지대로 칠해진다
  2. 2예측 두 칸을 정하고 잠근다
  3. 3초시계를 켜고 핀을 옮겨 거리 0이 끝나는 자리를 찾는다
보기
내 획
예측 ① 초시계로 다시 재면
예측 ② 표본의 단 하나뿐인 빨간 줄(46분 24.3km)은
예측 잠그기
초시계 — 가로축을 두 시각의 차로
핀 — 거리 0이 끝나는 자리
개념 2-3의 세로선
분으로 잰 자 · 전체 0~240분점 구름 위로 한 획을 그어 보세요

불가능 지대 = 내가 그은 선의 왼쪽 위(짧게 탔는데 멀리 간 곳) · 빨강 = 분으로 잰 시속 60 초과 632행 · 회색 = 시속 25 이하 1,190,317행 — 회색이 갇히면 억울한 행이다

내가 그은 획읽힌 규칙잡은 빨강갇힌 회색
아직 없음———
억울하게 갇힌 회색—행
잡은 빨강—
내 선—
한 주에서 걸린 행—
표본에서 걸린 줄—
빼면 평균21.26분
도전 1

빨강 569행(90%) 넘게 잡으면서 갇힌 회색은 50행 이하인 획을 그어라. 가로선으로도 세로선으로도 되지 않는다.

도전 2

예측 두 칸을 잠그고 초시계를 켜라 — 한 주 2,286행은 몇 행이 되는가? 표본의 단 하나뿐인 빨간 줄은 살아남는가?

도전 3

초시계를 켠 채 핀을 옮겨, 거리 0인 대여가 뚝 끊기는 자리를 ±5초 안으로 맞혀라. 아래 10초 칸 막대가 절벽을 보여 준다.

자료: 따릉이 대여이력(OA-15182) 2024-06-10~16 한 주 1,195,687행 — 거리·시간·속도 칸 개수표와 빨간 점 632개, 그리고 코드 ①~⑤가 읽는 표본 2,000행을 쪽 안에 실었다. 화면의 '잡은 빨강 · 갇힌 회색'은 어림이 아니라 한 주 전수를 다시 센 값이다(원장 phen_week_l05.py와 같은 식).

기본 실험실에서 이름 붙인 선을 코드로 옮깁니다. 빈칸 ①에 '자전거로 낼 수 없는 시속'을 채우고 ▶ 실행해, 상식 규칙 셋에 걸린 줄을 세어 보세요.

도전 r_long 의 120을 360(6시간)으로 바꿔 보세요 — 0행이 나옵니다. 그런데 같은 주 전체 1,195,687행에는 6시간 넘은 대여가 264행 있어요(0.022% → 2,000행이면 기대 0.44행). '0행'은 '없다'는 뜻일까요?

탐구 규칙 셋을 '분만 쓰는 것' · '거리만 쓰는 것' · '두 열을 함께 쓰는 것'으로 가르고, 두 열을 함께 써야만 보이는 이상함이 있는 까닭을 한 줄로 적어 보세요.

여는 장면의 줄 ㉮를 '오류'라고 말하려면 열을 맞대야 하고, 그 근거는 이다. 한 열만 보면 이기 때문이다.

확인 문제 1에 적어 제출 →

도전에서 본 '6시간 이상 0행'은 확인 문제 6에서 다시 묻습니다.

2

초시계 — 두 시각으로 다시 재면

2분

이용시간 칸은 정수 분입니다. 90초를 탔으면 '1분'으로 적히지요 — 30초가 버려집니다. 그렇다면 기록이 '1분'인 대여의 분으로 잰 속도는 실제보다 빠를까요, 느릴까요? 얼마나?

기본 대여·반납 두 시각의 차를 초로 재어 속도를 다시 계산합니다. 빈칸 ②에는 실험실에서 핀을 꽂은 자리(초)를 넣으세요.

도전 빈칸의 180을 120과 240으로 바꿔 보세요 — 120초면 53.8% 대 1.6%, 240초면 22.3% 대 0.3%가 됩니다. 절벽이 가장 가파른 자리가 곧 기록 규칙입니다.

탐구 이용시간(분)이 두 시각의 차와 1분 넘게 어긋난 줄이 표본에 셋 있고, 셋 다 반납 대여소 칸이 비어 있습니다(예: 기록 60분 · 두 시각 135.9분). 이 줄들의 '분'을 믿어도 될까요? 무엇으로 확인하겠습니까?

다른 대여소로 갔는데 거리가 0인 39행은 이 아니라 이다. 근거는 이고, 그래서 이 줄들은 처리해야 한다.

확인 문제 2에 적어 제출 →
3

통계 규칙 — 이용시간에 IQR 울타리를 친다

2분

자료를 모르는 사람이 쓰는 일반 규칙을 같은 표본에 걸어 봅니다. 2,000행 가운데 몇 %가 울타리 밖으로 나갈까요? 그리고 그중 상식 규칙에도 걸리는 줄은 몇 행일까요?

기본 빈칸 ③에 울타리 식의 나머지 절반을 채우세요 — 울타리 = Q3 + 1.5 × IQR, 그리고 IQR = Q3 − Q1 입니다.

도전 1.5를 3으로 바꾸면 울타리가 82.0분, 밖이 89행으로 줄어듭니다. 그런데 규칙에도 걸린 줄은 14행 그대로예요 — 문턱을 두 배로 해도 상식 규칙이 잡은 줄은 달라지지 않습니다.

탐구 한 주 전체 1,195,687행으로 재도 Q1 6 · Q3 25 · 울타리 53.5분이 똑같습니다. 표본과 전체의 울타리가 같은데도 '밖'을 모두 빼면 안 되는 까닭은 무엇일까요?

IQR 울타리가 주는 것은 목록이지 목록이 아니다. 이용시간 분포가 이기 때문이다.

확인 문제 3에 적어 제출 →
4

같은 울타리를 도구로 — 버티는 자, RobustScaler

3분

손으로 그은 울타리와 같은 재료(중앙값 · IQR)로 도구가 자를 만듭니다. 2시간 이상인 14행을 빼고 다시 재면 평균·표준편차와 중앙값·IQR 가운데 어느 쪽이 더 크게 움직일까요?

기본 fit 이 기억한 두 숫자를 먼저 읽고, 빈칸 ④에 울타리(분)를 이 자의 눈금으로 옮길 나눗수를 채우세요. 코드 ③의 중앙값·IQR과 같은 숫자가 나오는지 봅니다.

도전 빼는 줄을 '2시간 이상'에서 울타리 밖 196행으로 바꿔 보세요 (("울타리 밖 뺌", t[t["분"] <= fence]) 한 줄을 더합니다) — 평균 21.3 → 14.4, 표준편차 25.3 → 12.2, 그리고 버티던 가운데도 11.5 → 10.0으로 움직입니다. 많이 빼면 버티는 자도 흔들립니다.

탐구 RobustScaler 대신 StandardScaler(평균 · 표준편차)로 같은 울타리를 만들면 무엇이 달라질까요 — 긴 꼬리가 그 자를 어느 쪽으로 끌어당길지 생각해 보세요.

도구가 해 준 일은 이고, 해 주지 않은 일은 이다. 그 증거는 넘는 행이 으로 같다는 것이다.

확인 문제 4에 적어 제출 →
5

걸린 줄을 판정하고, 처리가 답을 얼마나 바꾸는지 잰다

5분

규칙 셋이 뽑은 명단을 이제 사람이 판정합니다. 표 4의 여섯 줄은 모두 실제 표본에 있는 줄이에요. 판정한 뒤에는 처리가 결론을 얼마나 바꾸는지 잽니다 — 거리 0인 46행을 빼면 평균 이용시간은 오를까요, 내릴까요?

기본 처리 네 가지를 나란히 돌려 '한 번 탈 때 평균 몇 분'이 어떻게 달라지는지 봅니다. 빈칸 ⑤에는 코드 ③에서 구한 울타리 변수를 넣으세요.

도전 — 일부러 틀린 길 plans 에 "시속 30 초과만 뺌": t[t["속도"] <= 30] 을 더해 보세요(속도 열을 만드는 줄도 함께). 한 줄만 빼려 했는데 1,998행이 나옵니다 — 0분 0m 대여(목동역 2번 출구 → 3번 출구)의 속도는 NaN이고 NaN <= 30 은 거짓이라 조용히 함께 빠지거든요. ~(t["속도"] > 30) 으로 쓰면 1,999행입니다.

탐구 물음이 '한 번 탈 때 몇 분'이 아니라 '한 번 탈 때 몇 km'라면 거리 0인 줄은 어떻게 처리해야 할까요? 물음이 바뀌면 처리도 바뀝니다.

20분 밖 · 빨리 끝냈다면 규칙을 사람이 적지 않고 알고리즘에게 맡기면 어떻게 될까요? IsolationForest는 파생 변수 없이 분·거리 두 열만 보고 '쉽게 떨어져 나오는 줄'을 골라 냅니다. 골라 낸 줄이 상식 규칙과 몇 행이나 겹칠지 먼저 짐작해 보세요.

탐구 contamination=0.01 을 0.05로 바꾸면 외톨이가 100행(규칙과 겹침 15행)이 됩니다. 이 숫자는 누가 정해야 할까요? 알고리즘이 고른 '이상함'과 사람이 판정한 '틀림'은 어떻게 다른가요?

표 4를 읽으며 개념 2-4의 네 물음(다른 열 · 무리 · 있을 수 있나 · 적혔나)을 차례로 던져 보세요. 부류와 근거는 확인 문제 5의 표에 적습니다.

표 4판정할 줄 여섯 — 규칙에 걸렸다고 다 같은 줄이 아니다모두 표본 2,000행 안에 실제로 있는 줄
줄어느 규칙에 걸렸나같은 줄의 다른 칸
㉠ 개봉아이파크아파트 앞 → 강서구민올림픽체육센터 시속 30 초과 — 46분 24,280m, 시속 31.7 두 시각의 차 2,767초(46.1분) → 시계 시속 31.6 · 표본에서 이 줄 하나뿐
㉡ 양평1나들목 보행통로 입구 → 같은 곳 2시간 이상 · 거리 0 — 150분 0m 두 시각의 차 9,029초(150.5분) · 빌린 곳과 같은 대여소에 반납
㉢ 서울대학교 정문 → 같은 곳 거리 0 — 2분 0m 두 시각의 차 94초 · 같은 대여소 · 이런 줄이 표본에 7행
㉣ 신동아아파트 → 안암2교 옆 등 39행 거리 0 — 모두 다른 대여소에 반납 39행 가운데 38행이 두 시각의 차 180초 미만
㉤ 샛강생태공원방문자센터 앞 → 중앙동 동진빌딩 2시간 이상 — 139분 29,054.7m 시속 12.5 · 두 시각의 차 8,342초(139.0분)로 기록과 일치
㉥ 중랑세무서 → 반납 대여소 칸이 빔 어느 규칙에도 안 걸림 — 60분 5,855m 두 시각의 차 8,152초 = 135.9분 — 기록된 60분과 76분 어긋남

㉥은 어느 규칙에도 안 걸린 줄입니다 — 그런데 두 시각을 맞대면 이용시간 칸을 믿기 어렵습니다. 규칙이 놓치는 줄도 있다는 뜻이에요. 표본에서 이렇게 1분 넘게 어긋난 줄은 셋이고, 셋 다 반납 대여소 칸이 비어 있습니다. 자료: 표본 2,000행(원장 검산 run/l05/CHECK.txt ⓖ · ⓗ · ⓑ′′)

보고서에 '한 번 탈 때 평균 분'이라고 쓸 때, 그 숫자 옆에 함께 적어야 할 것은 과 이다.

확인 문제 5의 판정표를 채우고 제출 →
체크포인트 3

규칙 셋을 돌려 서로 다른 줄을 잡는 것을 보았고, 걸린 줄을 판정했고, 처리가 평균을 21.26 → 14.40분까지 바꾸는 것을 쟀다.

다음 정거장 · 정리·확인 10분 →
4
정리·확인 · 10분

오늘의 탐험 일지

  1. 찾은 것

    이상해 보이는 줄은 네 부류였다 — 오류 · 다른 집단 · 진짜 극단 · 기록의 빈칸. 같은 '거리 0'도 부류가 갈렸다.

  2. 도구의 한계

    규칙은 명단만 준다. IQR 울타리 밖 196행 가운데 182행은 멀쩡했고, RobustScaler 는 눈금만 바꿔 같은 196행을 가리켰다.

  3. 보고의 규칙

    대푯값 옆에 뺀 줄 수 · 기준 · 처리 전후 값을 함께 적는다. 평균은 21.26 → 14.40으로, 중앙값은 11.5 → 10.0으로 움직였다.

✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.

1. 여는 장면의 줄 ㉮("이용시간 4분, 이용거리 143,433.89m")를 오류라고 판정한 근거를 파생 변수로 설명하시오. 그리고 줄 ㉯("11,430분, 3,494m")는 틀린 칸이 다르다는 것을 어떻게 알 수 있는지 쓰시오.
📖 모범 답안

줄 ㉮ — 거리 ÷ 시간으로 시속을 만들면 143.43km ÷ (4/60)시간 = 시속 2,151.5다. 두 시각으로 다시 재도 276초, 곧 시속 1,870.9. 공공자전거로는 어느 쪽으로 재도 낼 수 없는 속도다. 시간 칸을 믿고 보면 거리 칸이 틀렸다고 읽히는데, 실제로 두 대여소는 같은 동(구로구 고척동)에 있고 위경도로 잰 직선거리가 419m다. 한 열만 보면 '4분'도 '143km'도 각각은 그저 크거나 작은 값일 뿐이어서 걸리지 않는다 — 두 열을 합쳐야 불가능이 드러난다.

줄 ㉯ — 이쪽은 속도가 시속 0.02로 느릴 뿐이라 속도 규칙에 안 걸린다. 대신 다른 열이 말해 준다: 대여 08:42:17, 반납 10:37:33이므로 두 시각의 차는 115.3분인데 이용시간 칸은 11,430분(여드레 가까이)이다. 거리 3,494m를 115.3분에 갔다면 시속 1.82로 걷는 속도쯤 되니 거리 칸은 그럴듯하다. 곧 이용시간 칸이 틀렸다. 반납 대여소 칸도 비어 있어(\N) 기록이 정상으로 닫히지 않았음을 함께 알려 준다.

정리하면 두 줄 모두 '이상한 줄'이지만 ㉮는 거리 칸, ㉯는 이용시간 칸이 문제다. 어느 칸이 틀렸는지는 같은 줄의 다른 칸을 맞대야 정해진다.

2. 표본에서 이동거리가 0인 줄은 46행이고, 그 가운데 같은 대여소에 반납한 줄은 7행, 다른 대여소에 반납한 줄은 39행이다. 다른 대여소 39행을 "0km를 탔다"로 읽으면 안 되는 까닭을 코드 ②의 숫자를 근거로 쓰고, 어떻게 처리해야 하는지 쓰시오.
📖 모범 답안

다른 대여소에 반납했다면 자전거는 실제로 움직였다. 그런데 거리가 0으로 적혀 있다 — 0km를 탔다는 값이 아니라 거리를 적지 않았다는 빈칸으로 읽어야 한다.

근거는 180초 절벽이다. 코드 ②에서 3분(180초)이 안 된 대여는 43.6%가 거리 0인데, 3분을 넘은 대여는 0.3%뿐이다. 39행 가운데 38행이 3분 미만이고(한 주 전체로도 97.3%), 기준을 120초·240초로 옮기면 절벽이 흐려진다. 자연 현상이 이렇게 한 지점에서 뚝 끊기지는 않는다 — 3분이 안 된 대여는 거리를 기록하지 않는다는 기록 시스템의 규칙이 만든 자국으로 보는 것이 맞다.

처리 — '한 번 탈 때 몇 km'를 묻는 분석에서는 이 39행의 거리를 빈칸(NaN)으로 바꾼다(4차시의 '없음'과 '모름'). 0으로 두면 평균 거리가 내려가고, 통째로 빼면 짧은 대여만 골라 버리는 셈이 된다. '한 번 탈 때 몇 분'을 묻는 분석에서는 이용시간 칸이 멀쩡하므로 그대로 둔다. 같은 곳에 반납한 7행은 되돌림·짧은 산책 같은 다른 쓰임이므로 따로 모아 볼 수 있다.

3. IQR 1.5배 울타리 밖 196행 가운데 182행이 상식 규칙에는 하나도 걸리지 않았다. 이것이 IQR 규칙에 대해 말해 주는 것을 이용시간 분포의 모양과 이어서 쓰시오.
📖 모범 답안

IQR 1.5배는 좌우가 비슷한 분포를 염두에 두고 정해진 문턱이다. 그런데 이용시간은 Q1 6분 · Q3 25분인데 오른쪽으로 꼬리가 아주 길다(표본 최댓값 238분). 이런 모양에서는 폭(IQR 19분)이 몸통 기준으로 잡히므로 정상적인 긴 대여가 대량으로 '밖'이 된다 — 표본의 9.8%, 한 주 전체로도 9.7%가 밖이다.

밖 196행에서 가장 빠른 줄도 74분에 29.0km, 시속 23.5로 자전거가 충분히 낼 수 있는 속도다. 문턱을 1.5배에서 3배로 올려 울타리를 82.0분으로 옮겨도 상식 규칙에 걸린 줄 수는 14행 그대로다 — IQR이 잡아내는 것과 상식 규칙이 잡아내는 것이 애초에 다른 줄이라는 뜻이다.

그래서 IQR 울타리는 '틀린 값' 목록이 아니라 '살펴볼 값' 목록이다. 울타리를 치기 전에 분포의 모양을 먼저 그려 보고, 밖으로 나온 줄은 다른 열을 맞대어 하나씩 판정해야 한다.

4. 같은 울타리를 RobustScaler로 다시 그었더니 넘는 행이 196행으로 코드 ③과 같았다. ① 도구가 해 준 일과 ② 해 주지 않은 일을 각각 한 줄로 쓰고, ③ "이 자는 튀는 값에 버틴다"는 말이 어디까지 맞는지 코드 ④의 숫자로 밝히시오.
📖 모범 답안

① 해 준 일 — 자료를 보고 가운데 11.5분 · 폭 19.0분 두 숫자를 기억해(fit), 값을 그 자의 눈금으로 바꿔 주었다(transform). 울타리 53.5분은 눈금 2.21에 해당한다. 기억한 두 숫자는 코드 ③의 중앙값·IQR과 같은 숫자이고, 그래서 넘는 행도 같은 196행이다. 같은 자를 다른 자료(다음 주 기록, 다른 도시 기록)에 그대로 다시 댈 수 있다는 것이 도구의 값어치다.

② 해 주지 않은 일 — 어디서 자를지(왜 하필 1.5배인지)와 그 행이 오류인지는 정해 주지 않았다. 196행이 코드 ③과 똑같이 나왔다는 것이 그 증거다 — 도구는 눈금만 바꿨을 뿐 판정은 하지 않았다.

③ 버티는 것도 정도가 있다 — 2시간 이상 14행을 빼면 평균·표준편차는 21.3·25.3 → 20.4·22.9로 움직이는데 가운데·폭은 11.5·19.0 → 11.0·19.0으로 거의 그대로다. 여기까지는 "버틴다"가 맞다. 그러나 울타리 밖 196행을 모두 빼면 가운데도 11.5 → 10.0, 폭도 19.0 → 13.25로 움직인다. 많이 빼면 버티는 자도 흔들린다 — '버틴다'는 몇 개의 극단값에 대해서 하는 말이지, 자료의 10분의 1을 들어내는 일에 대한 말이 아니다.

5. 표 4의 여섯 줄을 네 부류(오류 · 다른 집단 · 진짜 극단 · 기록의 빈칸) 가운데 하나로 판정하고, 근거가 된 다른 칸을 함께 적으시오. 그리고 표 아래에, 보고서에 "한 번 탈 때 평균 ○분"이라고 쓸 때 그 숫자와 함께 적어야 할 세 가지를 코드 ⑤의 결과를 근거로 쓰시오.
줄부류근거가 된 다른 칸
㉠ 46분 24,280m
㉡ 150분 0m · 같은 곳
㉢ 2분 0m · 같은 곳
㉣ 거리 0 · 다른 곳 39행
㉤ 139분 29,054.7m
㉥ 60분 5,855m · 반납소 빈칸
📖 모범 답안

판정표(까닭이 함께 적혔으면 다른 판정도 인정된다 — 판정은 근거로 다툰다)

㉠ 오류에 가깝다 · 판정 보류 — 두 시각으로 다시 재도 시계 시속 31.6이라 초시계로도 사라지지 않는다. 공공자전거 평균 속도를 크게 넘으므로 거리 기록(위치 기록)의 오류로 보는 쪽이 자연스럽지만, 내리막이 긴 구간일 가능성이 남는다. 표본에 이 줄 하나뿐이라 결론이 크게 바뀌지 않으니 빼고 한 번, 두고 한 번 계산해 차이를 적는 것이 가장 정직하다.
㉡ 오류(또는 다른 집단) — 150분 동안 빌려 놓고 같은 대여소에 0m로 반납했다. 두 시각의 차도 150.5분으로 기록과 맞으므로 '오래 빌려 두었다'는 사실 자체는 맞다. 이동은 없었으니 이동 분석에서는 빼고, '반납을 잊은 대여'로 따로 셀 수 있다.
㉢ 다른 집단 — 2분 · 같은 대여소 · 0m. 빌렸다가 바로 되돌린 줄이다. 이런 줄이 표본에 7행 있으므로 혼자가 아니라 무리다. 틀린 값이 아니라 쓰임이 다른 값이라 따로 모아 본다.
㉣ 기록의 빈칸 — 다른 대여소에 반납했는데 거리 0. 39행 가운데 38행이 180초 미만이다(확인 문제 2). 거리는 NaN으로 바꾼다.
㉤ 진짜 극단 — 139분에 29.1km면 시속 12.5로 자전거 속도다. 두 시각의 차도 139.0분으로 기록과 맞는다. 주말 강변 라이딩 같은 실제로 일어난 긴 대여이므로 둔다. 빼면 자료가 실제보다 얌전해진다.
㉥ 오류 — 어느 규칙에도 걸리지 않았지만 두 시각의 차가 135.9분으로 기록된 60분과 76분 어긋난다. 반납 대여소 칸도 비어 있다. 규칙이 놓친 줄이라는 것이 이 줄의 교훈이다 — 규칙은 명단을 줄 뿐이다.

평균과 함께 적어야 할 세 가지 — ① 뺀 줄의 수(예: 2,000행 가운데 196행) ② 뺀 기준(예: 이용시간 IQR 1.5배 울타리 53.5분 밖) ③ 처리 전후의 값(예: 21.26분 → 14.40분). 셋을 적지 않으면 읽는 사람이 같은 자료로 같은 숫자를 다시 만들 수 없다.

덧붙여, 처리에 따라 평균은 크게(21.26 → 14.40) 중앙값은 조금(11.5 → 10.0) 움직였고, 거리 0을 빼면 평균이 오히려 21.59로 올랐다(짧은 대여만 골라 뺀 셈이라서다). 그래서 대푯값은 처리에 덜 민감한 중앙값을 쓰고, 물음에 필요한 열이 멀쩡한 줄은 빼지 않는다.

6. 코드 ①의 문턱을 2시간에서 6시간으로 올리면 표본 2,000행에서 걸리는 줄이 0행이 된다. 그런데 같은 주 전체 1,195,687행에는 264행이 있다. "표본에서 0행이니 이 규칙은 필요 없다"고 읽으면 안 되는 까닭을 비율로 계산해 밝히고, 그렇다면 문턱은 무엇을 근거로 정해야 하는지 쓰시오.
📖 모범 답안

한 주 비율은 264 ÷ 1,195,687 = 0.022%다. 2,000행을 뽑으면 기대되는 줄 수는 2,000 × 0.00022 = 0.44행 — 한 행도 안 되는 값이다. 그러니 표본에서 0행이 나오는 것이 오히려 흔한 일이고, "0행 = 그런 줄이 없다"가 아니라 "작은 표본에서는 드문 사건이 사라진다"로 읽어야 한다. (같은 이유로 표본에 한 행만 있던 '시속 30 초과'도 한 주 전체로는 2,286행이다.)

문턱은 표본에서 몇 행이 걸리느냐로 정하면 안 된다. 정해야 할 근거는 제도와 기계의 사정이다 — 따릉이 이용권의 기본 이용 시간(1시간 · 2시간권), 반납을 잊었을 때 요금이 붙기 시작하는 시점, 배터리·정비 주기 같은 것들이다. 그런 근거로 문턱을 정한 뒤, 그 문턱이 잡은 줄을 판정표로 확인한다 — 오늘 2시간 문턱이 잡은 14행에도 150분 동안 같은 자리에 세워 둔 줄(㉡)과 139분 강변 라이딩(㉤)이 섞여 있었다.

+
더 알아보기

탐험 밖의 이야기 셋

1922년 기록 58.0°C리비아 알아지지야 · 90년 동안 세계 1위기록 그대로 · 1922 ~ 2012위원회가 든 의심 다섯1장비가 그 온도를 재기에 맞지 않았다2관측자가 그 장비에 익숙하지 않았다3관측 장소의 지면이 주변을 대표하지 못했다4가까운 관측소들의 그날 값과 어긋났다5같은 자리의 뒷날 기록들과도 어긋났다2012년 취소 → 1913년 56.7°C가 세계 1위로규칙이 아니라 사람이, 90년 뒤에 판정했다
역사

90년 만에 취소된 세계 최고기온

1922년 9월 13일, 리비아 알아지지야에서 58.0°C가 관측되었다고 기록되었습니다. 이 값은 90년 동안 세계기상기구(WMO)가 인정하는 지구 최고기온이었어요. 오늘 우리가 따릉이 기록에서 한 일과 똑같은 물음이 계속 따라다녔습니다 — 이 값은 진짜 극단인가, 오류인가?

WMO는 2010년 전문가 위원회를 꾸려 원본 기록지와 당시 장비, 관측자의 이력, 주변 관측소의 같은 날 값까지 다시 살폈습니다. 2012년 위원회는 다섯 가지 의심을 들어 기록을 취소했고, 세계 최고기온은 1913년 미국 데스밸리의 56.7°C로 되돌아갔습니다. 눈여겨볼 것은 판정 방법이에요 — 값 하나만 보고 "너무 크니 이상치"라고 한 것이 아니라, 같은 사건의 다른 기록(장비 · 관측자 · 이웃 관측소 · 뒷날의 값)을 맞대어 판정했습니다. 오늘 우리가 '다른 열'을 맞댄 것과 같은 일입니다.

도해: 1922년 기록이 2012년에 취소되기까지와 위원회가 든 의심 다섯을 목록으로 그렸다. · 출처: World Meteorological Organization, “WMO assessment of the purported world record 58°C temperature extreme at El Azizia, Libya (13 September 1922)”, 2012

주문창 두 칸2005년 12월 · 도쿄증권거래소하려던 주문수량1주가격61만 엔실제로 넣은 주문수량61만 주가격1엔두 칸이 뒤바뀜범위 검사가 있었다면수량이 상장 주식 수보다 많다막는다가격이 기준가의 1000분의 1보다 낮다막는다수량 × 가격이 회사 자본보다 크다두 칸을 함께한 칸씩 보면 통과하는 값도 두 칸을 곱하면 걸린다
현장

손가락 한 번이 만든 이상치

2005년 12월 8일, 일본 미즈호증권의 한 직원이 신규 상장 종목 J-Com 주식을 "1주를 61만 엔에" 팔려다가 두 칸을 바꿔 "61만 주를 1엔에"로 주문을 넣었습니다. 그 회사가 발행한 주식 전체가 1만 4,500주뿐이었는데 말이지요. 취소 주문이 제때 처리되지 않아 손실은 약 400억 엔에 이르렀습니다.

이 값은 나중에 어떤 이상치 탐지 규칙으로도 잡아낼 수 있었을 겁니다. 문제는 언제 잡느냐예요. 분석 단계에서 잡으면 "이상한 주문이 하나 있었다"는 기록이 남을 뿐이고, 입력 단계에서 잡으면 사고 자체가 일어나지 않습니다. 그래서 데이터를 받는 자리에는 있을 수 있는 값의 범위를 미리 적어 두는 범위 검사를 둡니다 — 오늘 우리가 만든 상식 규칙을 분석이 아니라 입력에 붙인 셈이지요. 여기서도 가장 센 검사는 두 칸을 함께 보는 검사입니다. 수량과 가격을 각각 보면 통과할 수 있어도, 둘을 곱한 금액은 통과할 수 없으니까요.

도해: 주문창의 수량·가격 두 칸이 뒤바뀐 모습과, 한 칸씩 보는 검사와 두 칸을 함께 보는 검사를 나란히 그렸다. · 출처: 도쿄증권거래소·미즈호증권 사고 경과 보도(2005) 및 이후의 주문 검증 제도 개선 논의

위성 신호가 벽에 부딪히면위성건물건물곧게 온 신호벽에 튕겨늦게 온 신호한 걸음 사이에 80m를 건너뛴 점거르는 법 ① 속도 상한 ② 앞뒤 점과의 연속성지우지 말고 표시해 두고, 그 구간 거리는 빈칸으로
방법 더 깊이

GPS는 왜 튀나 — 다중 경로

따릉이의 이동거리는 자전거에 달린 단말이 위성 신호로 잰 위치를 이어 붙여 만듭니다. 그런데 높은 건물 사이에서는 위성 신호가 곧게 오지 못하고 벽에 한 번 튕겨서 도착하는 일이 생겨요. 신호는 빛의 속도로 달리므로 더 먼 길을 돌아온 만큼 늦게 도착하고, 단말은 그 지연을 "위성이 더 멀리 있다"로 해석해 위치를 수십~수백 m 옆으로 찍습니다. 이것을 다중 경로(multipath)라고 합니다.

다중 경로가 만든 점은 한 걸음 사이에 수십 m를 건너뛴 모양으로 나타납니다. 그래서 거르는 방법도 오늘 배운 것과 같아요 — 속도 상한(두 점 사이 거리 ÷ 시간이 사람이 낼 수 없는 값이면 의심)과 연속성 검사(앞뒤 점과 너무 동떨어지면 의심)입니다. 둘 다 한 점만 보지 않고 이웃한 기록과 맞대는 검사예요. 걸러 낸 점은 지우기보다 표시해 두고, 그 구간의 거리는 빈칸으로 두는 편이 안전합니다 — 오늘 '거리 0'을 NaN으로 바꾼 것과 같은 판단입니다.

도해: 곧게 온 신호와 벽에 튕겨 늦게 온 신호, 그리고 그 때문에 튀어 버린 점 하나를 그렸다. 거리는 원리를 보이기 위한 예시다. · 출처: 위성항법 교재의 다중 경로 오차 설명과 GPS 궤적 자료의 통상적인 전처리(속도 상한 · 연속성 검사) 관행