데이터 과학

회귀 분석 활용

속성 하나로 예측할 때와 일곱으로 예측할 때,
무엇이 얼마나 달라지는지 직접 측정해 봅니다.

학습 목표

  1. 실제 데이터에 단순 회귀 분석과 다중 회귀 분석을 각각 수행하고 결정 계수를 비교할 수 있다.
  2. 독립 변수를 늘렸을 때 결정 계수가 달라지는 까닭을 데이터의 맥락에서 설명할 수 있다.
  3. 결정 계수가 높다는 것만으로 좋은 모델이라 말할 수 없는 경우를 찾아낼 수 있다.
  4. 예측에 쓸 속성을 고를 때 무엇을 검토해야 하는지 설명할 수 있다.

어떤 선수를 데려와야 할까?

데이터 준비부터 모델 비교까지 한 번에 해 봅니다.

문제 상황

여러분이 축구 동아리의 매니저가 되었습니다. 새 부원을 뽑아야 하는데, 한 사람을 볼 때 무엇을 봐야 할지 막막합니다. 발이 빠른 사람? 키가 큰 사람? 지금 잘하는 사람? 앞으로 늘 것 같은 사람?

다행히 프로 축구 선수들의 데이터가 공개되어 있습니다. 거기에는 선수의 여러 속성과 함께 게임 제작사가 추정해 매긴 선수의 가치(몸값)가 들어 있습니다. 그렇다면 이렇게 물을 수 있습니다 — 어떤 속성을 보아야 선수의 가치를 잘 맞힐 수 있을까?

「가치가 얼마쯤 될까」는 숫자를 묻는 물음이니 회귀 분석입니다. 그리고 이번에는 속성을 하나만 쓸 때와 여럿 쓸 때가 얼마나 다른지 직접 측정해 비교하는 것이 목표입니다.

순서 하는 일 내용
1문제 정의하기부원을 뽑을 때 어떤 속성을 봐야 할까?
2데이터 수집하기공개된 축구 선수 데이터셋을 내려받는다
3데이터 불러오기오렌지에 올리고 산점도로 모양을 먼저 살핀다
4단순 회귀 분석속성 하나로 가치를 예측한다
5다중 회귀 분석속성 일곱으로 가치를 예측한다
6결과 해석하기여섯 개의 결정 계수를 나란히 놓고 읽는다

이번 데이터는 1만 7천여 건으로 크고, 독립 변수의 개수를 우리가 바꿔 가며 실험합니다.

실습 순서 2 · 3 — 데이터를 열어 봅시다

분석을 시작하기 전에 무엇이 들어 있는지 먼저 봅니다.

내려받을 데이터

축구 게임에 실린 선수 데이터입니다. 내려받으면 CLEAN_FIFA23_official_data.csv 파일이 생깁니다.
kaggle.com/datasets/kevwesophia/fifa23-official-datasetclean-data

데이터셋 전체(17,660명)를 씁니다.

File 위젯으로 열고 정보란을 확인합니다

데이터 17,660건, 속성 24개, 결측치 없음이라고 나오면 제대로 열린 것입니다. 그다음 Value(선수 가치)의 역할을 target으로 바꾸고 Apply를 누릅니다. 우리가 맞혀야 할 값을 알려 주는 설정입니다.

이번 실습에서 쓸 속성은 이렇습니다.

속성 무엇을 담고 있나
Potential잠재력 — 앞으로 이 선수가 도달할 수 있다고 보는 수준
Overall능력치 — 지금 이 선수의 수준
Age나이
Height키
International Reputation명성 — 국제적으로 얼마나 알려져 있는가
Wage주급
Skill Moves기술 보유 수 — 구사할 수 있는 기술의 가짓수
Value선수 가치 — 우리가 맞혀야 할 종속 변수

Scatter Plot으로 모양을 먼저 봅니다

File에 Scatter Plot을 이어 가로축에 Potential, 세로축에 Value를 놓아 보세요. 분석을 실행하기 전에 그림부터 보는 습관이 중요합니다. 점들이 곧게 이어지지 않는 데이터라면 그림만 보고도 직선이 맞지 않는다는 것을 알 수 있습니다.

잠재력(가로) · 선수 가치(세로) 직선을 그으면 이렇게 됩니다

그림에서 미리 읽어 둘 것

점들이 곧게 늘어서 있지 않습니다. 왼쪽에서는 바닥에 붙어 있다가 오른쪽 끝에서 갑자기 치솟습니다. 잠재력이 조금만 더 높아도 가치가 몇 배로 뛰는 구간이 있다는 뜻입니다. 이런 모양에 직선을 그으면 잘 맞을 리가 없습니다. 분석을 실행하기 전에 이미 결과를 절반쯤 짐작할 수 있습니다.

실제 축구 선수의 데이터는 어떻게 모을까요?

유럽 프로 축구에서는 선수들이 훈련과 경기 중에 센서가 든 조끼를 입습니다. 위성 위치 확인 장치로 어디를 얼마나 뛰었는지를 측정하고, 가속도 센서와 심박 센서로 얼마나 빠르게 방향을 바꾸었는지, 심장이 얼마나 뛰었는지까지 기록합니다. 이렇게 모이는 항목이 아주 많습니다. 우리나라 축구 국가 대표 팀과 프로 리그에서도 이런 장비를 씁니다. 데이터는 저절로 생기지 않습니다. 누군가 측정하기로 정하고, 장비를 붙이고, 쌓아야 생깁니다.

실습 순서 4 — 속성 하나로 예측해 보기

먼저 잠재력 하나만 가지고 가치를 맞혀 봅니다.

여기서 새 위젯이 하나 나옵니다. Select Columns는 24개 속성 가운데 무엇을 쓸지 고르는 위젯입니다. 이번 실습의 주인공이라 할 수 있습니다. 여기서 속성을 넣었다 뺐다 하며 결과가 어떻게 달라지는지 볼 것이기 때문입니다.

File

데이터를 연다

Select Columns

쓸 속성을 고른다

Data Sampler

70% 와 30% 로

Linear Regression

직선을 긋는다

Tree

구간을 나눈다

kNN

이웃에게 묻는다

Predictions

성능을 채점한다

이번 흐름에서 눈여겨볼 위젯 두 개

  • Select Columns가 새로 들어왔습니다. 속성이 24개나 되니 고르는 단계가 필요합니다.
  • Linear Regression이 추가되었습니다. 이번에는 세 모델을 같은 조건에서 비교하기 위해 오렌지 안에서 함께 실행합니다.

Select Columns를 이렇게 설정합니다

구분 고를 속성
Features — 독립 변수 Potential  하나만
Target — 종속 변수 Value

그다음 Data Sampler를 이어 70%로 모델을 만들고 30%로 채점하도록 맞춥니다. 세 모델을 모두 Predictions에 잇고, 남겨 둔 30% 데이터도 함께 잇습니다.

결정 계수를 적어 둡시다 — 단순 회귀

쓴 속성 Linear Regression Tree kNN
잠재력 하나

실습 순서 5 — 속성을 일곱으로 늘려 보기

다른 것은 그대로 두고 속성만 늘립니다. 그래야 무엇이 원인인지 알 수 있습니다.

이번에는 Select Columns만 다시 열어 Features에 속성을 여섯 개 더 넣습니다. 나머지 배선은 전혀 건드리지 않습니다. 위젯을 새로 만들 필요도 없습니다. 설정을 바꾸면 데이터가 다시 흘러 결과가 저절로 갱신됩니다.

구분 고를 속성
Features — 독립 변수 Potential · Overall · Age · Height · International Reputation · Wage · Skill Moves  일곱 개
Target — 종속 변수 Value — 그대로 둡니다

왜 하나만 바꾸어야 할까요

속성을 늘리면서 동시에 나누는 비율도 바꾸고 k값도 바꾸면, 결과가 달라졌을 때 무엇 때문인지 알 수 없습니다. 그래서 한 번에 하나만 바꿉니다. 과학 실험에서 조건을 하나만 바꾸는 것과 같은 이유입니다.

결정 계수를 적어 둡시다 — 다중 회귀

쓴 속성 Linear Regression Tree kNN
잠재력 하나
일곱 속성

위 칸에는 앞에서 적어 둔 값을 옮겨 적으세요. 여섯 칸이 다 차야 다음으로 갑니다.

어느 정도 값이 나오면 정상인가요?

대략 이런 크기로 나옵니다. 소수점 아랫자리는 Data Sampler가 어느 행을 떼어 두었는지에 따라 달라집니다. 처음 설정대로 Replicable (deterministic) sampling이 체크되어 있으면 같은 설정에서는 늘 같은 행이 뽑혀 값도 같고, 체크를 풀면 실행할 때마다 달라집니다. 중요한 것은 자릿수와 방향입니다.

  • Linear Regression — 잠재력 하나일 때 0.2대, 일곱 속성일 때 0.7대. 가장 크게 좋아집니다.
  • Tree — 잠재력 하나일 때도 0.7대, 일곱 속성일 때 0.9를 넘습니다.
  • kNN — 0.6대에서 0.7대로 완만하게 오릅니다.

세 모델 모두 값이 올랐다면 제대로 한 것입니다.

속성이 둘일 때는 그림으로 볼 수 있습니다

속성이 일곱이면 그림으로 그릴 수가 없습니다. 대신 다중 선형 회귀 시뮬레이터는 속성 둘까지를 그림으로 보여 줍니다. 한 속성의 그림을 그릴 때 다른 속성은 평균에 고정한다는 것, 그리고 두 속성이 거의 똑같이 움직이면 어느 쪽 몫인지 구분되지 않아 학습할 때마다 계수가 달라진다는 것을 직접 보아 두면, 일곱 개짜리 계수 표를 읽을 때 숫자 하나하나를 너무 믿지 않게 됩니다.

실습 순서 6 — 여섯 개의 숫자가 하는 말

표를 가로로 읽을 때와 세로로 읽을 때 보이는 것이 다릅니다.

가로로 읽기 — 속성을 늘리면 어떻게 되나

세 모델 모두 값이 올랐습니다. 특히 Linear Regression이 0.2대에서 0.7대로 크게 뛰었을 것입니다. 잠재력 하나만 보아서는 선수 가치의 4분의 1 남짓밖에 설명하지 못했는데, 능력치 · 명성 · 주급 같은 것들을 함께 보자 70%를 설명하게 된 것입니다.

잠재력 하나로 맞힌 프로 선수의 가치는 많이 빗나갔습니다. 동아리 매니저도 한 가지 잣대에만 기대지 말고 지금의 실력처럼 다른 것을 함께 보는 편이 낫겠습니다. 다만 이 데이터가 맞힌 것은 프로 선수의 몸값이라, 동아리 부원을 뽑는 기준을 그대로 알려 주지는 않습니다.

세로로 읽기 — 왜 트리가 직선을 이겼나

더 눈에 띄는 것은 잠재력 하나만 썼을 때입니다. 같은 속성, 같은 데이터인데 Linear Regression은 0.2대인데 Tree는 0.7대가 나옵니다. 세 배 가까이 차이가 납니다. 왜 그럴까요?

산점도에서 이미 보았습니다

잠재력과 가치의 관계는 곧게 이어지지 않았습니다. 왼쪽에서는 바닥에 붙어 있다가 오른쪽 끝에서 치솟았습니다. 직선은 이 굽음을 담을 수 없습니다. 반면 의사결정트리는 구간을 잘게 나누어 각 구간의 평균을 답하므로 굽은 모양도 계단으로 따라갈 수 있습니다.

데이터의 모양이 방법을 정한다는 말을 여기서 실제 데이터로 확인한 셈입니다.

그런데 트리가 언제나 낫다는 뜻일까요

아닙니다. 여기서 트리가 이긴 것은 이 데이터가 굽어 있었기 때문입니다. 공부 시간과 점수처럼 곧게 이어진 데이터에서는 선형 회귀와 트리가 비슷하게 맞습니다.

그리고 선형 회귀가 지고도 남기는 것이 있습니다. 「능력치가 1 높은 선수가 가치는 얼마 더 높더라」처럼 속성마다 계수를 하나씩 내주기 때문에, 어떤 속성이 얼마나 관련되는지 말로 옮길 수 있습니다. 트리는 더 잘 맞히지만 그런 문장을 주지 않습니다. 맞히는 것이 목적인지, 이해하는 것이 목적인지에 따라 고를 것이 달라집니다.

스스로 확인

Select Columns에서 속성을 하나씩 빼 가며 결정 계수를 다시 측정해 보세요. 빼도 값이 거의 안 떨어지는 속성이 있을 것입니다. 그 속성은 넣어 둘 값어치가 있을까요?

결정 계수를 높이는 것이 목표일까?

이 실습에서 가장 중요한 부분입니다.

속성을 늘렸더니 값이 올랐습니다. 그러면 속성을 더 넣으면 더 오를까요? 모델을 만든 데이터로 채점하면 거의 언제나 오릅니다. 따로 떼어 둔 데이터로 채점해도 쓸모없는 속성이 우연히 값을 조금 올려 줄 수 있습니다. 그러니 「값이 올랐다」는 것만으로는 좋아졌다는 증거가 되지 못합니다.

그럼 이번 결과는 어떻게 봐야 할까요?

이번에는 0.2대에서 0.7대로 올랐습니다. 속성을 넣기만 해도 생기는 찔끔 오름과는 크기가 다릅니다. 게다가 넣은 속성들이 하나같이 선수의 값어치와 관련될 만한 이유가 분명합니다. 오른 폭이 크고, 넣은 이유를 설명할 수 있을 때만 「모델이 좋아졌다」고 말할 수 있습니다.

주급을 넣어도 될까요?

우리가 넣은 일곱 속성 중에 Wage(주급)가 있습니다. 이 속성은 결정 계수를 많이 올려 줍니다. 주급이 높은 선수는 가치도 높으니 당연합니다. 그런데 바로 그 점이 문제입니다.

원인보다 결과에 가깝다

주급이 높아서 선수의 가치가 높은 것이 아니라, 가치가 높으니 구단이 주급을 많이 주는 쪽에 가깝습니다. 주급과 가치는 거의 같은 것을 두 번 측정하고 있는 셈입니다. 잘 맞히는 것이 당연합니다.

정작 필요할 때 없는 값이다

우리의 원래 문제는 「아직 데려오지 않은 사람의 값어치를 미리 알고 싶다」였습니다. 그런데 새로 데려올 사람의 주급은 데려온 뒤에야 정해집니다. 모델은 훌륭한데 정작 써야 할 순간에 넣을 값이 없는 것입니다.

속성을 고를 때 던져야 할 물음

「예측하려는 그 순간에, 이 값을 정말 알 수 있는가?」
답이 「아니오」라면 결정 계수가 아무리 높아도 쓸 수 없는 모델입니다. 성능 지표는 이런 문제를 전혀 알려 주지 않습니다. 오히려 점수가 잘 나와서 문제를 가려 버립니다.

도전 — 결정 계수를 더 높여 봅시다

Select Columns에서 속성을 넣고 빼며 결정 계수가 가장 높은 조합을 찾아보세요. 다만 조건이 하나 있습니다.

속성을 하나 넣을 때마다, 「이것이 선수 가치와 관련될 만한 이유」를 한 문장으로 말할 수 있어야 합니다.

말할 수 없는 속성으로 올린 값은 숫자만 오른 것입니다. 가장 높은 값을 만든 사람이 이기는 놀이가 아니라, 자기가 만든 값을 설명할 수 있는 사람이 이기는 놀이입니다.

스스로 확인

주급을 빼고 다시 실행해 보세요. 결정 계수가 얼마나 떨어지나요? 그리고 떨어진 쪽이 오히려 쓸모 있는 모델인 까닭을 설명해 보세요. 동아리 부원을 뽑을 때 실제로 미리 알 수 있는 것이 무엇인지 떠올리면 답이 보입니다.

핵심 정리

단순에서 다중으로

속성 하나 → 일곱

  • 선형 회귀가 0.2대에서 0.7대로 가장 크게 좋아진다
  • 속성 하나로 맞힌 선수 가치는 많이 빗나간다
  • 실험은 한 번에 하나만 바꾼다

데이터의 모양이 방법을 정한다

직선과 계단

  • 잠재력과 가치는 굽은 관계라 직선이 담지 못한다
  • 그래서 트리가 선형 회귀를 크게 앞선다
  • 단, 선형 회귀만 말로 옮길 수 있는 계수를 남긴다

숫자의 함정

결정 계수를 의심하기

  • 쓸모없는 속성을 넣어도 오를 수 있다
  • 오른 폭이 크고 넣은 이유를 말할 수 있을 때만 좋아진 것
  • 주급은 가치의 원인이 아니라 결과에 가깝다

속성을 고르는 기준

Select Columns 앞에서

  • 예측하는 그 순간에 알 수 있는 값인가
  • 왜 관련이 있다고 보는지 한 문장으로 말할 수 있는가
  • 새 위젯 — Select Columns · Linear Regression

확인 퀴즈

배운 내용을 확인해 봅시다.

Q1

24개 속성 가운데 분석에 쓸 것만 골라 내는 오렌지 위젯은?

Q2

잠재력 하나만 썼을 때 의사결정트리가 선형 회귀보다 결정 계수가 훨씬 높게 나온 까닭은?

Q3

속성을 늘렸더니 결정 계수가 올랐습니다. 이때 가장 조심해야 할 생각은?

Q4

주급을 독립 변수로 넣으면 결정 계수가 크게 오릅니다. 그런데도 문제가 되는 까닭으로 알맞지 않은 것은?

Q5

성능이 엇비슷할 때 선형 회귀를 고를 만한 까닭은?