1장 들어가기

데이터 과학은 수 많은 데이터 속에서 필요한 답을 찾는 방법을 연구하는 과학이며, 데이터 과학자는 난잡한 데이터로부터 필요한 정보를 이끄러 내는 사람을 가리킨다.

핵심 인물 찾기

아래 코드에서 idname이 연결되어 있음을 직관적으로 알 수 있다.

친구관계가 아이디(id)로 구성된 튜플을 이용하여 제시된다.

친구관계를 네트워크 그림으로 나타내면 다음과 같다.

아래 포지션이 멋진 네트워크 이미지 생성해줌.

주의: 임의의 포시션을 사용하려면 아래 명령문 주석처리 할 것.

알아두기

friendship_pairs에 사용된 리스트 자료형은 검색 기능이 매우 비효율적이다. 반면에 dict 자료형은 보다 빠른 검색 기능을 제공한다. dict 자료형을 이용하여 아래처럼 친구관계를 나타낼 수 있다.

{ 0 : 0번의 친구들 리스트,
  1 : 1번의 친구들 리스트,
  ...
  9 : 9번의 친구들 리스트 }

알아두기: 조건제시법

dict 자료형 값(객체)를 생성하는 방법은 나중에 자세히 설명한다. 결과는 다음과 같다.

특정 사용자의 친구 수는 다음 함수를 이용하여 구할 수 있다.

알아두기

위 네트워크 그림에서 알 수 있듯이 0번 아이디의 친구는 2명임을 확인할 수 있음.

사용자들의 친구 수를 모두 합한 결과는 다음과 같다.

사용자들의 평균 친구 수는 다음과 같다.

가장 많은 사람과 친구 관계를 맺은 사용자는 가장 많은 친구 수를 갖는 사용자이다. 리스트의 정렬 기법을 활용한다.

알아두기

연결 중심성(degree centrality)

연결 중심성은 네트워크 모델에서 사용되는 거리 개념의 일종이며, 네트워크 모델의 중심인물 찾기에 활용된다. 연결 중심성을 기준으로 친구 관계를 표현하면 다음과 같다.

위 그림은 4번 id를 가진 Thor가 네트워크의 중심이라는 인상을 준다. 하지만 Thor는 두 명의 친구가 있지만 보다 많은 친구를 가진 다른 사용자가 존재한다. 22장에서 중심성의 다양한 개념을 살펴볼 것이다.

알아두기

친구 추천

친구 추천 기능을 어떻게 구현할 것인가, 즉 친구 추천을 위해 어떤 모델을 사용할 것인가를 고민한다. 예를 들어, 친구의 친구들의 목록을 다음과 같이 확인할 수 있다.

주의

0번 아이디를 가진 Hero의 친구의 친구 리스트는 다음과 같다.

함수 이름에 bad 단어 사용 이유는 첫째, 0번 아이디 스스로 자신의 친구의 친구가 되고, 둘째, 3번 아이디의 경우처럼 두 친구의 친구가 되어 두 번 언급되기 때문이다.

친구 공유

반면에 서로 아는 친구관계를 알아보는 일도 흥미로운 주제이다. 다만 여기서도 앞서 언급한 문제를 피해야 하며 진정으로 친구의 친구만 선택해야 한다.

예를 들어, 3번 아이디인 Chi(카이)의 친구들인 1, 2, 4번 아이디는 Chi와 Chi의 친구관계에 있는 자신들을 제외하고 0번 아이디 또는 5번 아이디를 친구로 둔다. 즉, 0번 아이디와 5번 아이디 순수한 3번 아이디의 친구의 친구 관계를 맺는다. 이를 달리 해석하면 0번 아이디와 3번 아이디는 서로 친구는 아니지만 한 명 이상의 친구를 공유한다.

친구관계 네트워크 모델에서 확인할 수 있듯이 0번 아이디와 (3번 아이디인) Chi는 2명의 친구를 공유하고, 5번 아이디와 Chi는 1명의 친구를 공유함을 알 수 있다. 실제로 아래 실행결과가 동일한 결과를 보여준다.

알아두기

공통 관심사

사용자들의 관심사를 모아둔 데이터가 다음과 같다.

예를 들어, 0번 아이디와 9번 아이디는 친구 관계는 아니지만 둘 모두 Java와 Big Data에 관심이 있다.

특정 분야에 관심을 갖는 사용자 찾기는 꽤 쉽다.

예를 들어, Big Data에 관심 있는 사용자들은 0번, 8번, 9번 아이디이다.

리스트(list) 대신에 사전(dict) 자료형 활용해야 하는 경우

data_scientists_who_like 함수를 여러 번 호출하거나 사용자 데이터가 매우 클 경우, 위 작업은 매우 비효율적이 된다. 아래와 같이 사용자들의 관심사를 한 번만 훑은 다음에 관련 정보를 dict 자료형으로 저장해 두는 것이 좋다.

이제 user_ids_by_interest에는 관심사:[관심 있는 아이디 리스트] 형식으로 구성된 사전(dict) 자료형이 생성된다.

예를 들어, Big Data에 관심을 가진 사용자들의 리스트는 다음과 같다.

실제 user_ids_by_interest에 저장된 값은 다음과 같다.

사전 자료형 값에 사용될 키(key)는 활용성을 생각하고 지정해야 한다. 예를 들어, 사용자 아이디를 키로 활용하려면 다음과 같이 정의한다.

예를 들어, 3번 아이디의 관심사는 다음과 같다.

알아두기

사용자와 관심사를 공유하는 다른 사용자들을 찾아보자.

예를 들어 3번 아이디의 사용자와 공통 관심사를 갖는 사용자들과 공통 관심사의 개수는 다음과 같다.

즉, 3번 아이디와 5번, 6번 아이디는 두 개의 공통 관심사를, 2번, 4번 아이디는 한 개의 공통 관심사를 갖는다.

지금까지 알아본 공통 친구와 공통 관심사에 대한 분석을 바탕으로 "과학자 추천 시스템"의 성능을 향상시키는 방법을 23장에서 알아볼 것이다.

연봉과 경력

데이터 과학자 열 명의 연봉과 경력을 담은 리스트가 다음과 같다. 연봉은 개인정보이기에 사용자 아이디를 삭제하고 익명으로 처리하였다.

연봉과 경력 사이의 관계를 산점도를 이용하여 쉽게 표현할 수 있다. 이를 위해 먼저 연봉과 경력을 따로 분리한다.

경력(Tenures)을 x-좌표값, 연봉(Salaries)을 y-좌표값으로 사용하여 산점도를 아래와 같이 그린다.

산점도에 의하면 경력과 연봉이 서로 비례하는 것으로 보인다.

알아두기

근속 연수에 따른 평균연봉을 한 번 확인해보자.

그런데 근속 연수가 모두 다르기에 평균연봉을 확인하는 일이 전혀 의미가 없다. 따라서 경력을 아래 구간들로 나누어 확인해보자.

아래 함수는 경력별 구간지정 함수이다.

이제 연봉을 구간별로 구분하고 구간별로 구간에 속한 연봉들을 리스트로 정리한다. 즉, 구간을 키로하고 구간별 연봉들의 리스트를 키값(values)로 같는 사전 자료형을 다음과 같이 구한다.

이제 구간별 연봉 평균값을 구해 사전 자료형으로 정리한다.

알아두기

위 결과로부터 "5년 이상의 경력자가 보다 짧은 경력을 가진 이들보다 65% 이상 더 번다" 라는 정보를 확인할 수 있다.

연습문제

경력 구간을 1년 단위로 지정하라.

  1. 경력이 1년 증가할 때 연봉이 얼마나 평균적으로 어떻게 변하는가?
  2. 경력 10년차 데이터 과학자의 평균연봉이 얼마로 예상되는가?

참조

위 연습문제는 '단순 회귀 분석'과 연관되어 있다. 이후 14장에서 자세히 다룬다.

유료 계정

사용자의 유료계정 여부가 서비스 사용기간과 연관되어 보인다.

사용기간   유료계정여부
0.7      paid
1.9      unpaid
2.5      paid
4.2      unpaid
6.0      unpaid
6.5      unpaid
7.5      unpaid
8.1      unpaid
8.7      paid
10.0     paid

사용기간이 아주 짧거나 아주 길면 유료계정을, 사용기간이 평균적이면 무료계정을 사용하는 경향을 보인다.

영어 단어

따라서 유료계정 여부를 모델을 설정할 때 사용기간 정도에 맞추어 다음 함수로 모델링할 수 있다.

관심사 찾기

사용자들의 주요 관심사를 파악하려 한다.

먼저 사용자별 관심사는 앞서 보았듯이 다음과 같다.

주요관심사를 확인하는 가장 단순한 방법(모델링)은 가장 많이 언급된 관심사를 확인하는 것이다. 이럴 때는 여느때처럼 Counter 함수를 사용한다.

두 명 이상의 사용자로부터 언급된 관심사는 아래와 같이 확인할 수 있다.

세 명 이상의 사용자로부터 언급된 관심사는 아래와 같이 확인할 수 있다.

연습문제

관심사를 키로 하고 해당 관심사에 관심이 있는 사용자 수를 키값으로 갖는 사전 자료형 값을 리턴하는 함수를 작성하라.

연습문제

숫자 n을 입력하면 n명 이상으로부터 관심을 갖는 관심사를 사전자료형으로 리턴하는 함수를 작성하라.