본문 바로가기

DM ML AD

데이터 미신 하나. 데이터는 엄격해야 한다.

오랫동안 데이터 관련 업무를 해왔지만, 관련된 모든 것을 완벽하게 알고 있는 것은 아니다. 그저 일을 하면서 느낀 의견일 뿐이고, 어쩌면 다른 많은 데이터 분석가들은 동의하지 않을지도 모른다.

많은 일반인들은 데이터는 매우 정확한 것이다라는 인식을 가진 것같다. 특히 일반 개발자들과 일을 하다보면 대략적인 데이터 관련 로직/알고리즘을 스케치해서 알려주면 세세한 부분까지 내가 알려줬던 내용을 그대로 구현하려는 경향이 있다. 데이터 관련 전문성/경험의 부족에 따른 것일 수도 있고, 그냥 시각의 차이일 수도 있다. 데이터 분석의 결과는 매우 정확하고 그것을 반드시 따라야 한다는 생각을 가졌는지도 모른다.

그런데 분석 업무를 하다보면 엄격하게 정확한 데이터에 기반해서 의사를 결정하기도 하지만, 많은 경우 분석가의 감이나 경험에 의존하기도 한다. 해결해야할 문제를 검토하고 관련된 데이터를 수집하다 보면 대강 이렇게 로직을 만들고 이정도의 파라메터를 설정하면 된다는 그런 감 또는 경험치가 있다. 데이터가 보여주는 완벽한 궤적의 함수를 구하기 보다는 그냥 대강 SQRT를 씌우거나 LOG를 취하는 등의 데이터 변형을 시켜서 적용해 본다. 예를들어, scale-free 네트워크에서 빈도는 폭발하기 때문에 그런 종류의 시스템에서 나온 데이터라면 그냥 LOG를 취한다는 거다. 적당히 값을 키우고 싶을 때는 그냥 제곱을 적용해보고 더 급격히 증가하는 걸 원하면 세제곱을 해보기도 한다. 그런 경험치 함수를 적용해서 로직을 개발하는 경우가 많다. 실제 데이터가 그렇게 말해주기 때문에 그런 수식/로직이 나오지 않을 때가 많다는 거다.

대략적인 로직을 정해서 구현할 개발자들에게 알려줄 때, 어떤 변수의 범위가 필요할 때 특정 값을 지정해주는 경우도 있지만 대략 10정도보다 크면 된다라고 말하는 경우가 있다. 사실 11이 좋을지 9가 더 좋을지 나도 모른다. 그냥 안전한 수치를 정하는 것이고, 또 실제 구현해서 테스트하면서 11이 더 좋은 것 같으면 그냥 11로 해도 된다는 의미도 있다. 그런데 최종적으로 구현된 것을 보면 무조건 '10'으로 고정돼있는 걸 본다. 물론 데이터를 보고 값을 정해서 알려주는 것이 내 역할이기는 하지만, 상대방에게 자유도를 주기 위해서 대략적인 걸 말하는데 상대는 그렇지가 않은 것같다. 정확한 스펙과 순서를 요구한다.

아주 미세한 차이가 큰 (역)효과를 내는 분야가 있다. 달에 우주선을 쏘아올리는 경우 0.01도를 잘못 적으면 그 우주선은 우주 미아가 될 수도 있다. 그런데, 현실에서 우리가 만나는 많은 데이터 문제들이 그렇게 세밀하지가 않다. 하루에 '데이터'라는 쿼리가 1000번 들어오는 것과 1001번 들어오는 것은 별로 큰 차이가 없다. 광고 CTR을 0.1%를 올리는 것은 매출에 큰 영향을 준다. 그러나 광고 노출에서 어떤 조건을 10을 두는 것과 10.1 또는 11로 두는 것에 따라서 실제 광고 CTR이 0.1% 이상 차이가 나는 경우가 많지가 않다. (물론 중요한 변수인 경우는 차이를 낼 수도 있고, 여러 변수들이 복합적으로 작용해서 예상치 못한 결과를 줄 수는 있다. 그러나 그렇게 중요한 변수라면 이미 잘 통제되고 있거나 더 정확한 실험 등으로 값을 특정했을 거다.)

그리고 현실에서 정확한 수치가 아닌 것을 원하는 경우가 있다. 예를들어, 최적화 문제/식을 잘 풀었더니 X = 10.56이 나왔다고 치자. 그런데, 원래 문제의 도메인이 정수형이었다면, 즉 Integer program이었다면 10.56은 틀린 답이다. 10이나 11이 돼야 한다. 만약 제고관리나 생산관리 등에서 오늘 하루동안 완성해야하는 자동차의 대수가 100.56대가 나왔다면 100대를 만들고, 나머지 한대는 0.56만큼 미완성품으로 만들어둬야 하는 게 아니다. 이런 경우 하루에 100대를 생산하거나 101대를 생산하라고 명령이 내려져야 한다. (반제품 상태로 나둬도 되는 경우라서 조금 모호하긴 하다.) 최적화 식을 통해서 내일 컴퓨터 8.4대가 필요하다는 값이 나왔다면 당연히 9대를 가져올 거다. 극단적인 예처럼 보이지만, 현실에서는 정확한 수치보다는 그 상황에 맞는 그럴 듯한 수치가 필요한 경우가 많다.

데이터를 다루는 사람들은 늘 직관의 선물을 감사히 받아들여야 한다. (다음 이야기에서 정확한 분야나 숫자는 의미가 없다) 초보 분석가가 며칠동안 고생해서 8.347이라는 해를 구했는데, 상사는 그냥 빈둥거리며 놀다가 한 8.5정도 나오지 않을까?라고 직관적으로 얘기하는데 어렵게 구한 값과 별로 차이가 없었다 등의 풍문이 많다를. 직관/경험이 맞고 데이터가 틀렸다는 얘기가 아니다. 데이터가 주는 정확함에 너무 집착하지 않았으면 한다는 얘기다. 초기의 미세한 차이가 향후에 큰 차이를 만들어낼 수도 있다. 그런 경우라면 중간에 변화의 폭이 커지는 사이에 조정을 해주면 되는 것이지 처음부터 엄격할 필요는 없다. (물론, 중간에 미세 조정이 불가한 경우도 있겠지만...) 그리고 데이터가 정확하다고 믿겠지만, 데이터 내에 부정확함을 내포하기 때문에 데이터가 거짓은 아니지만 진실을 얘기하지 않는 경우도 많다. 어차피 대부분의 분석은 모집단 전체가 아니라 (편향될 수 밖에 없는) 샘플을 사용한다. 빅데이터도 데이터가 많아져서 부정확함을 상쇄시킬 가능성이 높아진 것이지, 데이터 자체의 부정확함은 여전히 존재한다. 그리고 머신러닝에서 사용하는 대부분의 알고리즘도 처음에는 랜덤에서 시작하기도 하고, 같은 데이터로 여러 번 같은 프로그램을 돌려도 다른 결과값을 내주기도 한다. (물론 그런 랜덤성을 최대한 없애고 결과의 일관성을 확보하도록 알고리즘이 발전하고 각종 트릭들이 보완되는 거다.)

부정확함은 어느 곳에든지 존재한다. 그렇기 때문에 데이터는 정확하다는 것은 일종의 미신이다. 처음에는 모호함이 주는 자유를 즐겨라라는 것을 적고 싶었는데, 뒤로 갈수록 뉘앙스가 달라졌다. 개발자들은 데이터 전문가들을 무조건 믿지는 말아야 한다. 엄격한 것이 틀렸을 가능성이 더 높다.

===
반응형