01왜 '닮았다'를 숫자로 바꾸나
사람은 누가 자기와 닮았는지 느낌으로 압니다. 하지만 컴퓨터는 느낌이 없습니다. 아는 건 숫자뿐입니다. 그래서 '닮은 사람 찾기'는 결국 사람을 숫자로 바꾸고, 숫자끼리의 거리를 재는 일이 됩니다.
우리가 만든 방식은 세 단계입니다. 먼저 스무고개처럼 20문항을 묻고, 그 답을 7개 성향 축의 숫자로 요약하고, 그 숫자가 가까운 사람을 찾습니다. 이 교재는 그 각 단계에서 어떤 수학이 쓰이는지, 그리고 어디서 틀리기 쉬운지를 다룹니다.
먼저 못을 박아둘 한 가지
이 교재 전체를 관통하는 원칙이 있습니다. 수학적으로 가까운 사람과 실제로 닮은 사람은 다릅니다. 거리가 0에 가깝다고 두 사람이 정말 닮았다는 뜻은 아닙니다. 그건 '우리가 고른 7개 축과 20개 질문의 기준으로' 가까울 뿐입니다. 축과 질문이 엉성하면, 정교한 거리 계산은 엉성함을 정교하게 포장할 뿐입니다.
그래서 숫자(유사도 %)를 객관적인 적합도처럼 보여주기 전에, 축과 질문이 정말 그 사람을 담고 있는지부터 확인합니다. 이 순서를 뒤집으면 바넘 효과(13장)에 빠집니다.
02사람을 좌표로 바꾸기
7개 성향 축은 곧 7개의 숫자입니다. 한 사람은 그 7개 숫자의 묶음, 즉 7차원 공간의 점 하나가 됩니다. 키와 몸무게 두 숫자로 사람을 평면 위 점으로 찍을 수 있는 것과 같습니다. 축이 많아져 눈으로 못 그릴 뿐, 거리 계산은 2차원이나 7차원이나 똑같은 공식입니다.
저울을 맞춰야 한다 — 정규화
문제는 축마다 범위가 다르다는 점입니다. 어떤 축은 0-100, 어떤 축은 1-5라면, 숫자가 큰 축이 거리 계산을 혼자 지배합니다. 그래서 각 축을 같은 저울에 올립니다. 흔히 표준화(평균 0, 표준편차 1로 변환)나 정규화(0-1 사이로 압축)를 씁니다.
| 축 | 원점수 범위 | 표준화 전 | 표준화 후 |
|---|---|---|---|
| 활동성 | 0-100 | 82 | +1.1 |
| 신중함 | 1-5 | 4 | +0.9 |
| 개방성 | 1-5 | 2 | -1.0 |
표준화 전에는 '활동성 82'가 '신중함 4'를 압도하지만, 표준화 후에는 셋이 비슷한 무게로 경쟁합니다. 이 과정을 빼먹으면 '제일 범위가 넓은 축이 곧 성격'이 되어 버립니다.
03두 사람이 얼마나 가까운가
두 점 사이의 '가까움'을 재는 자는 하나가 아닙니다. 대표적으로 세 가지입니다.
- 유클리드 거리 — 두 점을 잇는 직선의 길이. 가장 직관적이고 흔히 씁니다.
- 맨해튼 거리 — 축을 따라 꺾어 간 이동량의 합. 한 축에서의 큰 차이가 과하게 벌어지는 걸 줄여 줍니다.
- 코사인 유사도 — 두 점을 원점에서 본 화살표의 '각도'. 세기(크기)는 무시하고 성향의 방향만 봅니다. '둘 다 활동적인데 한 명이 더 셀 뿐'을 닮은 것으로 칠 때 유용합니다.
무엇을 고르느냐가 결과를 바꾼다
같은 두 사람이라도 유클리드로는 1등이 코사인으로는 3등일 수 있습니다. 지표 선택은 정답이 있는 게 아니라 '닮았다'를 무엇으로 정의할지에 대한 디자인 결정입니다.
그래서 '가장 닮은 사람'이라는 결과에는 반드시 숨은 전제가 붙어 있습니다 — "이 거리 자(尺)로 쟀을 때". 결과를 보여줄 때 이 전제를 숨기지 않습니다.
04질문이 주는 정보
좋은 질문은 사람을 많이 갈라 주는 질문입니다. 모두가 같은 답을 하는 질문은 아무것도 알려 주지 않습니다. 20문항은 한정된 자원이라, 한 칸도 정보 없는 질문에 쓰면 아깝습니다.
엔트로피와 정보이득
엔트로피는 '아직 얼마나 모르는가'의 양입니다. 후보가 많고 고르게 흩어져 있을수록 큽니다. 질문 하나를 던져 후보가 좁혀지면 엔트로피가 줄어드는데, 그 줄어든 양이 정보이득입니다. 정보이득이 큰 질문부터 묻는 게 효율적입니다.
조건부 확률
답은 서로 독립이 아닙니다. '아침형이다'에 답하면 '밤샘을 즐긴다'의 가능성은 자동으로 낮아집니다. 이미 아는 답을 고려해 다음 질문의 실제 정보량을 다시 계산해야 합니다(다음 장).
주의: 정보가 많은 질문과 '좋은 성격 질문'은 다릅니다. 사람을 잘 가르는 질문이 꼭 의미 있는 성향을 재는 건 아닙니다. 가르는 힘(4장)과 재는 대상의 타당성(7장)은 따로 확인합니다.
05사람마다 다른 20문항
문항이 90개쯤 있고 그중 20개를 고른다면, 두 가지 길이 있습니다. 모두에게 같은 20개를 묻거나(고정), 앞 답에 따라 다음 질문을 바꾸거나(적응형)입니다.
적응형 — 의사결정 트리
적응형은 의사결정 트리처럼 움직입니다. 지금까지의 답을 놓고, 남은 후보 문항 중 조건부 엔트로피를 가장 많이 줄여 줄 질문을 매번 다시 고릅니다. 같은 20문항이라도 사람마다 받는 질문이 달라집니다.
탐색과 활용
여기엔 균형이 필요합니다. 이미 좁혀진 쪽을 더 확인할지(활용), 아직 안 본 축을 열어 볼지(탐색)입니다. 활용만 하면 첫 몇 답이 사람을 한 방향으로 가둬 버리고, 탐색만 하면 20문항을 산만하게 씁니다.
적응형의 대가: 사람마다 받은 질문이 다르면, 두 사람을 나중에 비교하기가 까다로워집니다. 서로 다른 시험을 본 셈이기 때문입니다 — 8장에서 다룹니다.
06답할 때마다 추정 좁히기
적응형 질문의 바탕에는 베이지안 추론이 있습니다. 처음엔 "이 사람의 성향은 잘 모른다"는 넓은 추정에서 시작합니다. 답이 하나 들어올 때마다 그 추정을 조금씩 갱신합니다.
스무고개와 같다
스무고개에서 "동물인가요?"에 "네"가 나오면 머릿속 후보가 확 줄어듭니다. 같은 일을 숫자로 합니다.
- 사전확률 — 답을 받기 전의 추정(아직 넓음)
- 증거 — 방금 받은 답 하나
- 사후확률 — 답을 반영해 좁아진 새 추정. 이게 다음 질문의 사전확률이 된다
이걸 20번 반복하면 넓던 추정이 한 점 근처로 모입니다. 수식 없이 보면 '답을 받을 때마다 지도를 다시 그리는 일'입니다.
단, 좁아진다고 '맞다'는 아닙니다. 처음 가정(사전확률)이 치우쳐 있으면, 확신만 커진 채 엉뚱한 곳으로 좁혀질 수 있습니다.
077개 축은 무엇을 재는가
여기서부터가 진짜 어려운 부분입니다. 거리 계산은 코드로 금방 되지만, 그 7개 축이 정말 뭔가를 재는지는 코드로 증명되지 않습니다.
구성개념 타당도
축에 '개방성'이라고 이름 붙이는 건 쉽습니다. 그 축의 점수가 실제 개방성과 관련 있다는 걸 보이는 건 어렵습니다. 이름과 측정은 별개입니다. 이름만 그럴듯한 축은 '측정'이 아니라 '명명'일 뿐입니다.
신뢰도 — 검사·재검사
같은 사람이 일주일 뒤 다시 답했는데 점수가 크게 달라지면, 그 점수는 성향이 아니라 그날의 기분·문항 해석을 잰 것입니다. 최소한 다시 해도 비슷하게 나와야 측정이라 부를 수 있습니다.
문항반응이론(IRT)
질문마다 사람을 구분하는 힘이 다릅니다. 어떤 질문은 성향을 예민하게 가르고, 어떤 질문은 거의 못 가릅니다. 모든 문항을 같은 무게로 더하면, 둔한 질문이 예민한 질문의 신호를 묻어 버립니다.
정직한 태도: 타당도·신뢰도를 아직 검증하지 못했다면, 축에 거창한 이름을 붙이거나 점수를 '성격 분석'처럼 제시하지 않습니다. 검증 전에는 "우리가 이렇게 묶어 봤다" 수준으로만 말합니다.
08거짓 · 빈 답 걸러내기
응답은 깨끗하지 않습니다. 사람은 좋아 보이려 답하고, 귀찮으면 대충 찍고, 질문마다 다른 질문을 받기도 합니다.
응답 편향
| 유형 | 어떤 답 | 드러나는 신호 |
|---|---|---|
| 사회적 바람직성 | '좋은 사람'처럼 보이는 답만 | 긍정 문항에 쏠림 |
| 무성의(직선 응답) | 전부 같은 보기만 선택 | 분산이 거의 0, 초단시간 응답 |
| 중앙 쏠림 | 늘 '보통'만 고름 | 양 끝 보기를 안 씀 |
결측 데이터
적응형이라 두 사람이 서로 다른 질문에 답했다면, 겹치지 않는 축은 직접 비교할 수 없습니다. 방법은 둘 중 하나인데 둘 다 한계가 분명합니다. 공통으로 답한 축만으로 비교하면(교집합) 비교 근거가 얇아지고, 안 답한 축을 추정으로 채우면(보간) 추정 오차가 그대로 유사도에 섞입니다.
그래서 "유사도 92%"를 띄울 때, 그게 7축을 다 비교한 92%인지 2축만 겹친 92%인지는 전혀 다른 숫자입니다. 이 차이를 사용자에게 감추지 않습니다(11장).
09가장 가까운 사람 찾기
이제 내 점 둘레에서 가까운 사람을 고릅니다. 가장 단순한 방법은 최근접 이웃(KNN) — 모든 사람과의 거리를 재서 가까운 K명을 뽑는 것입니다. 사람이 적을 땐 이걸로 충분합니다.
사람이 많아지면
후보가 수만 명이 되면 매번 전부와 거리를 재는 건 느립니다. 그래서 추천 시스템은 두 단계로 나눕니다.
- 후보 생성 — '대충 가까운' 수백 명을 빠르게 추린다(벡터 인덱싱)
- 정밀 순위 — 추린 후보만 제대로 계산해 순서를 매긴다
벡터 인덱싱은 공간을 미리 칸으로 나눠 두어, 먼 칸은 아예 안 보고 건너뛰는 기법입니다. 전부 비교 대신 '가까운 칸만' 보기 때문에 수만 명이어도 빠릅니다.
지금 '나랑 닮은 사람 찾기'는 사용자가 적어 로컬 데이터로 전부 비교해도 됩니다. 인덱싱은 사람이 늘면 그때 넣을 최적화이지, 처음부터 필요한 건 아닙니다 — 없는 규모를 미리 만들지 않습니다.
10정말 맞는지 어떻게 아나
알고리즘을 만들면 '잘 되는 것 같다'는 느낌이 듭니다. 느낌은 증거가 아닙니다. 검증은 네 가지 도구로 합니다.
몬테카를로 시뮬레이션
가상의 응답자 수천 명을 만들어 알고리즘에 통과시킵니다. 거리 계산·순위가 의도대로 도는지, 극단적인 입력에 안 깨지는지를 값싸게 확인할 수 있습니다.
합성 데이터의 함정
하지만 내가 만든 가상 데이터로 잘 된다는 건 거의 의미가 없습니다. 가상 데이터는 내 가정을 그대로 되돌려주기 때문입니다. '비슷한 사람은 비슷하게 답한다'고 가정하고 데이터를 만들면, 알고리즘은 당연히 그들을 묶습니다. 이건 내 가정의 확인이지 현실의 확인이 아닙니다.
오프라인 평가와 A/B
진짜 확인은 현실 데이터로 합니다. '실제로 닮은 쌍'이라는 정답이 일부라도 있으면 정확도를 잴 수 있고(오프라인 평가), 질문 선택 방식 두 개를 실제 사용자에게 나눠 보여 어느 쪽이 나은지 비교할 수 있습니다(A/B 테스트).
시뮬레이션 통과는 "버그가 없다"는 뜻이지 "진짜 닮은 사람을 찾는다"는 뜻이 아닙니다. 둘을 섞어 말하지 않습니다.
11공정성과 설명
매칭은 사람에 대한 판단이라, 조용히 누군가에게 불리할 수 있습니다.
편향·공정성
소수의 답변 패턴을 가진 사람은 늘 '가까운 사람이 없는' 쪽으로 밀릴 수 있습니다. 다수와 다르게 답했다는 이유만으로 매칭이 불리하면, 그건 성향 차이가 아니라 알고리즘의 편향입니다. 유형별로 매칭 품질이 고른지 따로 봐야 합니다.
설명 가능성과 불확실성
결과는 큰 숫자 하나로 끝내지 않습니다. 왜 이 사람이 매칭됐는지(어떤 축이 가까웠는지)와 무엇은 모르는지(몇 개 축만 겹쳤는지, 표본이 적은지)를 같이 보여줍니다.
- "92%" 대신 "7축 중 5축이 가깝습니다 — 나머지 2축은 아직 답이 부족해요"
- 표본이 적으면 "지금은 후보가 적어 참고용입니다"
숫자를 크게, 불확실성을 작게 쓰면 사용자는 과신합니다. 우리는 반대로 씁니다.
12운영과 확장
출시 뒤에 생기는 문제들입니다.
콜드 스타트
초반엔 사용자도 데이터도 적습니다. 비교할 사람이 몇 명뿐이면 '가장 닮은 사람'이라는 말이 무색해집니다. 이 시기엔 결과를 단정하지 말고 참고용임을 분명히 합니다.
피드백 루프
사용자 반응(매칭을 좋아했는지)으로 알고리즘을 다듬을 수 있습니다. 하지만 이미 많이 노출된 유형이 더 자주 추천되고, 그래서 더 학습되는 식으로 편향이 스스로 커질 수 있습니다. 반응을 반영하되 쏠림을 견제하는 장치가 필요합니다.
개인정보·데이터 최소화
성향 응답은 민감한 데이터입니다. 꼭 필요한 만큼만 받고, 식별정보와 분리해 저장하고, 사용자가 언제든 쉽게 삭제할 수 있게 합니다. 적게 모을수록 지킬 것도 적습니다.
13바넘 효과를 피하는 설계
바넘 효과는 "당신은 겉으론 단단하지만 속은 여린 편"처럼 누구에게나 맞는 말을 개인 분석으로 느끼는 현상입니다. 혈액형·별자리 설명이 '내 얘기 같은' 이유가 이것입니다. 사람은 그럴듯하기만 하면 정확하다고 느낍니다.
매칭도 같은 함정에 빠진다
유사도 '94%'를 화면 한가운데 크게 띄우면, 그 숫자의 근거가 얇아도 사용자는 믿습니다. 숫자·그래프·퍼센트는 그 자체로 '과학처럼' 보이기 때문입니다. 이게 가장 쉬운 거짓말이고, 가장 흔한 함정입니다.
우리가 지키는 선
- 지어낸 점수·후기·통계·궁합률을 결과에 넣지 않는다
- 두루뭉술해서 누구에게나 맞는 문장을 '개인 분석'으로 내밀지 않는다
- 불확실하면 불확실하다고 적는다 — 확신은 근거가 있을 때만
- 유사도는 "우리가 이 축·이 자로 쟀을 때 가깝다"이지 "객관적으로 닮았다"가 아니다
이건 '나랑 닮은 사람 찾기' 하나의 규칙이 아니라, 이지에이전시가 만드는 모든 결과물에 적용하는 선입니다. 숫자는 정직할 때만 힘이 있습니다.
14셀프 체크
매칭·추천을 설계하기 전과 후에, 아래 질문에 스스로 답할 수 있는지 봅니다. 하나라도 "아직 모른다"면, 그 부분은 결과를 단정하지 않습니다.
설계 전
- 7개 축은 각각 무엇을 재는가? 그 이름이 타당하다는 근거가 있는가?
- 20문항은 무작위인가 적응형인가? 적응형이라면 무엇을 기준으로 다음 질문을 고르는가?
- 질문의 '가르는 힘'과 '재는 대상의 타당성'을 따로 확인했는가?
- '닮았다'를 어떤 거리 자(유클리드·코사인 등)로 정의했는가? 왜 그걸 골랐는가?
설계 후
- 서로 다른 질문을 받은 두 사람을 어떤 방식으로 비교하는가? 그 한계를 아는가?
- 같은 사람이 다시 답하면 결과가 비슷하게 나오는가(신뢰도)?
- '가장 닮은 사람'이라는 결과를 무슨 데이터로 검증할 수 있는가?
- 합성 데이터가 아니라 현실 데이터로 확인했는가?
- 특정 유형에게 매칭이 불리하지 않은가(공정성)?
- 결과에 불확실성과 '왜 매칭됐는지'를 함께 보여주는가?
- 민감한 응답을 최소한으로 모으고, 쉽게 삭제할 수 있는가?
이 체크리스트의 목적은 '점수를 못 믿게' 하려는 게 아니라, 믿을 수 있는 점수만 점수처럼 보여주려는 것입니다. 수학적으로 가까운 사람과 실제로 닮은 사람 사이의 거리를, 설계로 좁히는 일입니다.