지난번 포스팅에서 선형독립 또는 1차 독립 (linearly independent), 선형종속 또는 1차 종속 (linearly dependent) 에 대해서 알아보았습니다.

 

이번 포스팅에서는 기저 (basis)와 차원 (dimension)에 대해서 알아보겠습니다.  선형독립의 정의를 알지못하면 기저를 이해할 수 없으며, 선형독립과 기저의 개념이 헷갈릴 수도 있습니다. 따라서 혹시 선형독립(linearly independent)에 대해서 잘 모르고 있거나 가물가물하다면 이전 선형독립 포스팅을 다시 한번 살펴보시길 바랍니다.

(☞ 선형독립(linearly independent), 선형종속(linearly dependent) 바로가기)

 

 

기저(basis, 基底)란 어떤 벡터공간 V의 벡터들이 선형독립이면서 벡터공간 V 전체를 생성할 수 있다면 이 벡터들의 집합을 말합니다.  다른 말로 표현하자면, 기저는 "R^m의 임의의 원소를 표현하기 위해 필요한 최소한의 벡터로 이루어진 집합"입니다.

 

 

[ 기저의 정의 (definition of basis) ]

 

 

 

 

 

위의 정의에 따라, 기저인 예와 기저가 아닌 예를 아래에 들어보겠습니다.  실제 예를 보시면 이해가 좀더 쉬울 것입니다.

 

  • 기저인 예 (example of a basis)

     : 2 차원 (2 dimension)

 

 

 

 

  : 3차원 (3 dimension)

 

 

 

 

  • 기저가 아닌 예 (not a basis)

   : 2차원 (2 dimension)

     --> 2차원의 임의의 원소를 표현하는데 필요한 최소한의 벡터는 2개인데 반해, 아래의 예는 4개의 벡터로 구성되어 있으므로 군더더기 벡터가 2개나 더 있는 셈입니다.  그러므로 "m차원의 임의의 원소를 표현하기 위해 필요한 최소의 벡터로 이루어진 집합"인 기저(basis)가 아닌 것입니다.

 

 

 

 

 

 

   : 3차원 (3 dimension)

  --> 3차원의 임의의 원소를 표현하기 위해서 필요한 최소한의 벡터는 3개인데요, 아래의 예는 3개의 벡터로 되어 있으므로 위의 2차원 예와는 조금 다른 경우입니다. 아래의 예는 3개 벡터의 세번째 원소가 모두 '0'으로 되어 있어서 3차원의 세번째 차원을 표현할 방법이 없으므로 기저가 아닌 경우입니다. 즉, 위의 2차원 예에서는 해가 2개 이상이어서 기저가 아닌 경우이며, 아래의 3차원 예의 경우는 해가 아예 하나도 존재하지 않기 때문에 기저가 아닌 경우입니다.  물론, 위의 2차원 예에서처럼 3차원(R^3)인데 원소가 '0'이 아닌 벡터가 3개를 초과한다면 군더더기 벡터가 존재하게 되어 기저가 아니게 되겠지요.

 

 

 

 

 

 

아래의 R^3의 두 벡터 (1, 0, 0), (0, 1, 0) 역시 기저가 아닙니다.  3차원의 임의의 원소를 표현하기 위한 최소한의 벡터 개수는 3개인데 반해 2개 밖에 없어서 1개가 모자라기 때문입니다. 세번째 차원의 원소 (0, 0, 1)을 표현할 방법이 없으므로 기저의 정의를 만족시키지 못합니다.

  

 

 

 

바로 위의 예가 기저가 아니라고 했는데요, 그러면 R^3의 두 벡터 (1, 0, 0), (0, 1, 0)은 선형독립일까요?  선형독립이지요.  기저는 아닌데 선형독립인 예입니다.

 

 

 

 

 

아래에 선형독립과 기저의 정의를 복습하는 의미에서 다시 한번 정리하여 보았습니다.  선형독립(linearly independent)은 제로벡터(zero vector) (0, 0, ..., 0)에 한정된 개념인데 반해, 기저(basis)s는 R^m (m dimension)의 모든 벡터를 대상으로 하는 개념입니다.

 

 

[ 선형독립 vs. 기저  정의 (definition of linearly independent and basis) ]

 

 

 

 

벡터공간, 부분공간, 차원(dimension)에 대해서는 나중에 추가로 덧붙여서 설명하겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

 

 

728x90
반응형
Posted by Rfriend
,

이번 포스팅에서는 선형독립 혹은 1차 독립(linearly independent)과 선형종속 혹은 1차 종속(linearly dependent)에 대해서 알아보겠습니다. 

 

선형독립 혹은 1차 독립 (linearly independent) 개념은 나중에 이어서 소개할 기저(base)와 차원(dimension), 행렬의 계수(rank)와 선형연립방정식의 존재성(existence), 유일성(uniqueness), 가우스 소거법(Gauss Jordan Elimination)과의 관계 등에 줄줄이 연관이 되어있으므로 정확히 이해하는 것이 필요합니다.  선형독립에 대한 이해가 집의 주춧돌인 셈입니다.  집을 지을 때 주춧돌이 부실하면 나중에 집이 무너지는 수가 있습니다.  차원을 정의하고 선형연립방정식 푸는데 가장 밑에 받쳐주는 개념이 선형독립(linearly independent) 개념이므로 배워야 합니다.  

 

 

[ 선형독립과 선형대수의 관계 ]

(relation between linearly independent/dependent and linear algebra)

 

 

 

 

 

 

다변량통계분석 책을 보면 선형독립(linearly independent) 개념이 텍스트로만 해서 3~5줄로 설명이 되어있습니다. 그래서 선형대수를 따로 배우지 않은 분이라면 처음에는 이게 뭔소리인가 하고 이해하기 매우 힘들것 같습니다. 어디에 쓰는지, 왜 배우는지도 잘 모를것 같기도 하구요. 하지만 처음에는 이해가 잘 안되더라도 중요한 개념이므로 2번, 3번 계속 읽어보시고 다른 자료도 찾아서 공부해두시면 좋겠습니다.  (공과 대학원 준비하는 분이라면 행렬의 계수(rank)를 비롯한 선형대수 문제는 구술시험 반드시 나온다에 500원 걸겠습니다. 그만큼 중요하다는 얘기입니다.)  선형독립(linearly independent) 정의가 다음번에 포스팅할 기저(base)와 좀 헷갈릴 수 가 있으므로 정확히 이해하시기 바랍니다.

 

텍스트로 선형독립(linearly independent)을 정의하면 아래와 같습니다. 좀 어렵지요? ^^;

 

 

 

 

위의 텍스트 정의와 똑같은데요, 이걸 좀더 쉽게 풀어서 벡터를 직접 입력해서 다시 한번 설명하자면 아래와 같습니다. 

 

 

 

 

선형독립의 개념을 좀더 쉽게 이해할 수 있도록 아래에 기하하적인 해석을 덧붙여서 선형독립인 예와 선형종속인 예를 몇 개 들어보겠습니다. 

 

 

(1) R^2 의 두 벡터 (1, 0), (0, 1)은 선형독립임.

 

 

 

 

(2) R^3 의 두 벡터 (1, 0, 0), (0, 1, 0) 은 선형독립임.

 

 

 

 

 

(3) R^3의 세 벡터 (1, 0, 0), (0, 1, 0), (0, 0, 1)은 선형독립임.

 

 

 

 

아래는 선형종속(linearly dependent) 예입니다.

 

(4) R^3 의 세 벡터 (1, 0, 0), (0, 1, 0), (2, 1, 0)은 선형종속임.

 

 

 

 

제로벡터 (0, 0, 0) 에 대한 R^3 의 세 벡터 (1, 0, 0), (0, 1, 0), (2, 1, 0)의 해가 (c1=0, c2=0, c3=0) 말고도 (c1=2, c2=1, c3=-1), (c1=-2, c2=-1, c3=1) 등도 추가로 더 있으므로 선형종속 혹은 1차 종속 (linearly dependent)가 됩니다. 

 

해 (c1=2, c2=1, c3=-1) 을 좌표로 그려보면 아래와 같습니다. 돌고, 돌고, 돌아서 제로벡터 (0, 0, 0)으로 돌아왔음을 알 수 있습니다.

 

 

 

 

또 다른 해 (c1=2, c2=-1, c3=1) 을 좌표로 그려보면 아래와 같습니다.  이 해 역시 돌고, 돌고, 돌아서 제로벡터 (0, 0, 0)으로 돌아왔음을 알 수 있습니다.

 

 

 

 

 

 

(5) R^3 의 네 벡터 (1, 0, 0), (0, 1, 0), (0, 0, 1), (2, 2, 2)는 선형종속임.

 

 

 

위의 R^3의 네 벡터에 대한 해 (c1=2, c2=2, c3=2, ㅊ4=-1) 을 좌표로 그려보면 아래와 같습니다.  이 해 역시 돌고, 돌고, 돌아서 제로벡터 (0, 0, 0)으로 돌아왔음을 알 수 있습니다.  좌표의 이동 경로가 좀 헷갈릴 수도 있는데요, 색깔을 참조해서 유심히 살펴보시기 바랍니다.

 

 

 

수식 입력이랑 그래프 그리다보니 시간 엄청 걸리네요. 헉, 헉... ^^;

 

다음 포스팅에서는 기저(base)에 대해서 소개하고, 선형독립과 비교를 해보겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

 

728x90
반응형
Posted by Rfriend
,

연봉을 통해서 본 숫자와 심리에 대한 단상

 

 

 직장생활을 하다 보면 기업 경영은 곧 숫자 싸움이라는 생각을 하게 됩니다. 손익계산서 와 대차대조표를 모르고서 경영을 논할 수는 없는 노릇이지요. 동시에 회사 조직도 사람이 모인 곳인지라 세 사람만 모이면 사내정치가 존재하고 직원간의 관계, 감정이 또한 알게 모르게 조직 성과에 큰 영향을 미칩니다.

 

마케팅, CRM을 하는 분이든 아니면 다른 직종에 있는 분이든 공통적으로 성공적인 직장생활을 하려면 숫자와 심리, 좌뇌와 우뇌, 과학과 예술을 아우를 수 있는 능력이 요구된다는 생각이 듭니다.

 

 

 

 예전에 우연히 연봉에 관련된 신문기사를 보다가 이 생각, 저 생각을 해보았었는데요, 숫자와 심리에 대해서 이 신문기사를 시작으로 해서 생각해 볼 거리를 풀어보고자 합니다. , 그럼 오래된 신문기사 먼저 보시지요. (매년 아래와 유사한 오류를 범하는 신문기사가 나오곤 합니다)

 

 

`슈퍼 벤처` 평균 연봉 3400만원…근속연수 4.4

 

취업포털 잡코리아가 지난해 매출액 1000억원을 넘긴 벤처기업 242곳 중 금융감독원에 사업보고서를 제출한 150개 기업의 ‘직원현황’을 분석한 결과 매출액 1000억원을 돌파한 슈퍼 벤처 기업 중 평균 직원 급여액(*연봉과 수당, 인센티브 등이 모두 포함된 실 지급액)이 가장 높은 곳은 ‘엔에이치엔’인 것으로 조사됐다.

엔에이치엔의 직원 1인 평균 급여액은 6450여만원으로 이는 슈퍼 벤처기업의 평균 급여액인 3400여만원보다 3000만원 가량 높은 수준이다.

 

엔에이치엔 다음으로 직원 1인 평균 급여액이 높은 곳은 △2위 엔씨소프트 (6300여만원), 3위 아이엠 (5800만원) 4, 홈캐스트 (5600여만원) 5위 에스에프에이 (5200여만원) 순이었다.

 

이외에도 직원 1인 평균 급여액이 높은 상위 기업으로는 △에스에프에이와 △티에스엠텍 이 5200여만원 △이니시스 5000여만 원 △성광벤드와 △다음커뮤니케이션 4800여만원 △메디슨 4700여만원 순이었다.

 

(* 출처: 한국경제신문, ’10.8.4일 자 기사)

 

 

 

이 신문 기사를 읽어보시고 어떤 생각이 드시는지요?  30초 정도 시간 내셔서 어떤 생각이 드시는지 정리를 해보시면 좋겠습니다.

:

:

:

:

:

생각해보셨어요? 제일 먼저 , 내 연봉은 00기업의 평균 연봉 수준이군 이라고 생각하셨지요? 그렇지요? 또 어떤 생각이 드셨나요? 29초 정도 더 드릴 테니 생각해보시지요. ‘숫자와 심리라는 관점에서 말이지요. 너무 심각하게는 말고요.

:

:

:

:

:

, 그럼 숫자와 심리 중 먼저 숫자에 대해서 제가 했던 이런 저런 생각들을 나눠보도록 하겠습니다.

 

 

(1) 연봉 관련 신문기사에 대해 숫자가지고 태클 걸며 놀아 보기

 

국내 경제활동인구라면 대다수가 알고 있을 법한 한국경제신문사에서 작성한 기사이다 보니 신뢰가 많이 가지요. 게다가 경제활동인구의 대다수가 알고 있을 법한 평균을 다룬 기사이다 보니 별 어려움 없이 이해할 수 있겠다 싶습니다. 그럼에도 삐딱선을 좀 타보자면요,

 

첫째, 연봉을 비교하는데 있어서 산술평균을 사용하는 것이 맞는가 하는 의문이 드네요(기사에는 산술평균이라고 명시되지 않았으며, 제가 추측한 거예요). 평균에도 보면 산술평균, 중앙값, 최빈수의 세 가지가 있잖아요. 세 개의 통계량 중에서 어떤 것을 사용할지 결정하려면 모집단의 분포인지를 알아야 하잖아요.

특히, ‘산술평균통계량의 경우 종 모양의 정규분포를 띠어야만 의미가 있지요. 그런데 연봉은 정규분포가 아니라 한쪽으로 꼬리가 길게 늘어서고 치우친 멱함수 분포에 더 가까운 편이지요. CRM 하시는 분들은 아주 친근할 텐데요, 20:80의 법칙 혹은 파레토의 법칙의 가장 대표적인 대상이 바로 소득 분포일 테니깐요. 파레토라는 경제학자가 보니 이탈리아 국민의 20% 80%의 소득의 소유하고 있다면서요. 이처럼 꼬리가 한쪽으로 치우친 분포에서는 산술평균보다는 중앙값이나 최빈수를 평균의 통계량으로 사용하는 것이 왜곡을 줄이고 대표값을 산정하는 방법이겠지요. 산술평균은 아웃라이어에 상당히 민감한 통계량이잖아요.

 

둘째, 연봉을 제대로 비교하려면 동종업계 내 직급 및 연차 별로 구분해서 비교를 해야겠지요. 이러한 세부 구분 없이 하나로 퉁쳐서평균을 내면 비교하는 의미가 퇴색해버리지요. 신문기사에 보면 NHN 직원 1인 연 평균 급여액이 6,450만원이라고 나와있는데요, 사원, 대리, 과장, 부장, 임원의 연봉을 모두 포함했을 때의 연봉 평균이라면 이것을 어떻게 받아들여야 할런지요? NHN에도 기획, 개발, 영업, 서비스 파트 등이 나뉘어 있을 테고 각 파트 간에 연봉 차이도 상당할 터인데 이들 구분 없이 모두 포함해서 연봉 평균을 산정했다면 연봉을 비교하는데 있어 무슨 의미가 있을런지요? 만약 ‘00산업 00직종 00직급 00년차의 연봉하는 식으로 확인해서 비교해 볼 수 있으면 가장 좋을 텐데요, 연봉이 인비 사항이니 욕심이 과한 거겠죠?

 

셋째, Sampling 문제가 있어 보입니다. 설마 전수조사를 했을 리도 없고 조사를 하려고 해도 자신의 연봉을 알려줄 리 만무할 터, 보아하니 잡코리아에 등록한 회원들이 자신의 연봉을 입력하면 이를 근거로 평균을 계산한 듯 합니다(거짓 숫자를 입력해도 이를 잡아낼 방법도 없겠네요). 이러하다면 이는 Random sampling이 아니라 자기 발로 걸어 들어와 자기 손으로 자기 연봉을 입력한 사람들의 Sampling이 되는 것이겠지요. 제대로 하려고 한다면 앞서 말한 것처럼 산업, 직종, 직급, 년차 별 Stratified random sampling을 해야만 하겠지요.

 

넷째, 그러고 보니 연봉의 정의에 대해서 체크를 안하고 여기까지 왔네요. 위의 신문기사에 보니 연 평균 급여액이라는 용어를 쓰고 연 평균 급여액 = 연봉 + 수당 + 인센티브라고 되어 있네요. 반면에 기사의 헤드라인에는 슈퍼벤처 평균 연봉 3,400만원이라고 뽑아놓았네요. 저의 경우 예전에 연봉 협상할 때는 기본급에 수당은 포함하고 인센티브는 제외였던 거 같은데요, 기사 본문이 맞고 헤드라인은 잘못되었네요. ‘슈퍼벤처 평균 급여액 (연봉+인센티브) 3,400만원이라고 수정하는 게 맞겠지요. 성과급이야 회사 전체의 성과가 얼마나 될지 회계연도가 끝나봐야 아는 것이고 각 조직 별, 개인 별로 인사고과를 어떻게 평가 받느냐에 따라 달라지는 만큼 당연히 연초에 결정이 되는 연봉에서는 빼고 회계연도 끝난 후에 별도로 산정해야겠지요.

 

여기까지 이런 저런 생각을 하다 보면 앞의 신문기사가 영 시원찮아 보입니다. 뭔가 의미 있는 정보를 주는 것도 아니고, 그렇다고 안주는 것도 아니고 말이지요. 가만히 보니 첫 줄에 취업포털 잡코리아라는 회사에서 분석한 보고서를 인용한 것이라고 하는 군요. 결국 좀더 상세한 정보를 원한다면 취업포털 잡코리아에 방문해서 확인해보는 수밖에 없겠네요.

 

하야, ‘잡코리아에 방문해보니 연봉정보메뉴 바가 눈에 띠여 클릭을 하니 회원만 볼 수 있다고 하네요. 회원가입이야 무료니 이 참에 회원가입 했어요. 다시 연봉정보메뉴를 클릭하니 유료이므로 결제를 하라고 나오는 군요. 만약 저의 연봉 정보를 입력하면 할인을 해준다는 메시지도 나오는군요.  이제야 그림이 명확해 졌습니다. 제가 구멍이 숭숭 뚫린 신문기사에 궁시렁 거리며 혹시나 하고 신문기사 제공자인 잡코리아에 들어와 회원가입하고 유료 연봉검색 서비스에 가입하게끔 하는 일련의 유도 낚시에 엮였다는 것을요. ^^; 조사 결과를 볼 때 가장 처음 해야 할 일, 또 가장 중요한 일은 바로 누가 왜그 조사를 해서 발표(보고)하느냐를 확인하는 것이겠네요. 무슨 Sampling이 맞는지, 무슨 통계량이 맞는지 등은 그 다음 이겠네요.

 

잡코리아 사이트에서 게재된 연봉의 정의를 보니 연봉 = 기본급 + 수당 + 상여금, 단 성과금은 제외라고 되어있네요. 이걸 보면 아무래도 연봉에 성과급이 포함된 급여액이라고 나오는 신문기사의 본문 내용이 잘못되고 도리어 제가 잘못 뽑았다고 말한 헤드라인이 맞는 것 같다는 생각이 드네요. 신문기사 소스인 잡코리아에서는 성과급(인센티브)을 제외한 연봉정보만을 회원한테 요구하고 있으니 말입니다. 아주 헷갈리는 상황이 되어버렸습니다.

 

여기까지는 연봉에 대해서 다룬 신문기사를 가지고 이리저리 딴지를 걸면서 숫자를 보고 평가하고 의사 결정한다는 것이 제대로 하려면 그리 녹록하지 않은 일이라는 것에 대해서 살펴보았습니다. 그럼 이제 사람의 심리에는 어떤 면들이 있는지 몇 조각을 떼어서 엿보도록 하겠습니다. 심리학과 행동경제학 하시는 분들이 아주 재미있는 실험들과 조사를 많이 했네요. 소개합니다.

 

 

 

(2) 연봉 관련 심리에 대한 몇 개의 단면들 엿보기

  
 
첫째, 연봉 협상에 있어 준거점이 중요한 역할을 합니다. 아래의 설문조사 결과를 보시지요. 카너먼과 크네시가 벤쿠버와 토론토 시민 중에서 무작위로 전화 설문을 했다고 합니다.

 

l  질문1: 작은 커피숍에 종업원이 1명 있다. 그 가게에서 6개월 간 시급 9달러를 받고 일하고 있다. 가게는 순조롭게 운영되고 있었는데 근처 공장의 폐쇄로 실업자가 증가했다. 이 때문에 다른 가게에서 커피숍 종업원과 같은 일을 하는 사람을 시급 7달러에 고용하기 시작했다. 가게 규모는 커피숍과 같았다. 그러자 커피숍 주인도 시급을 7달러로 내렸다.

[
수용할 수 있다 17%,     불공정하다 83%
]


l  질문1-1: (마지막 부분 이외는 질문1과 동일) 커피숍 종업원이 그만 뒀기 때문에 커피숍 주인은 시급 7달러로 신규채용을 하기로 했다.

[
수용할 수 있다 73%,     불공정하다 27%]

 

(* 출처: 『행동경제학』, 도모노 노리오)

 

 

위의 설문결과를 보면 현재 종업원의 임금이 준거점이 되어서 공정 여부를 평가하는데 매우 큰 영향을 미치고 있음을 알 수 있습니다. 혹시 임금 협상을 하셔야 하는 분이라면 해당 업계/직책/직급/연차의 연봉 준거점을 파악하는 것이 연봉 협상전략을 수립하는데 있어 일차적으로 해야 할 일이겠네요. 심리는 숫자와 같이 가야겠네요.

조사결과를 보니, 기업의 인사 담당자가 질문1-1처럼 신규 채용의 경우 기존 선임자의 임금 준거점이 적용되지 않으며 새로운 기준을 적용하겠다고 주장한다면 신규 채용자는 상당히 난처할 것 같습니다. ^^’

 

 둘째, 남과 비교하기 시작하면 합리성은 눈이 멀기 시작한다는 점입니다. 합리적인 의사결정을 위해서는 이것 참 조심해야겠습니다. 아래의 조사결과를 보시지요.

 

두 곳에서 일자리를 제의 받았다고 상상해보자. 노동 시간, 업무 내용, 업무 장소, 장래 전망 등은 두 일자리가 똑같다. 유일한 차이점은 자신이 받는 보수와 동료 사원들이 받는 보수의 차이뿐이다.

 

A회사는 연봉이 5,000만 원인데, 동료 사원들의 연봉은 3,000만 원이다.

 

B회사는 연봉이 6,000만 원인데, 동료 사원들의 연봉은 8,000만 원이다.

 

여러분이라면 A회사와 B회사 중 어느 쪽을 선택하겠는가? 조사 결과에 따르면, 대부분의 사람은 A회사를 선택했다.

(*
출처: 59초』, 리처드 와이즈먼)

 

 

절대 금액만 놓고 봤을 때는 B회사가 A회사보다 무려 1,000만원이나 더 많습니다. 하지만 조사 결과 대부분의 사람이 A회사를 선택했다고 합니다. A회사를 선택한 대부분의 사람들이 제정신이 아니라서 그랬을까요? 여러분이라면 A회사보다 절대금액이 1,000만원 많은 B회사를 선택하시겠습니까, 아니면 동료 사원보다 상대적으로 연봉이 2,000만원 더 많은 A회사를 선택하시겠습니까?

 

과시적 소비라는 용어를 만들었으며 명품 경제학의 디딤돌을 놓았던 괴짜 경제학자 소스타인 베블런의 『유한계급론(The Theory of Leisure Class: An Economic Study in the Evolution of Institutions)』에 보면,

부에 대한 욕망은 그 본질적 속성 때문에 한 개인의 경우에도 충족되기 힘들다. 하물며 부에 대한 평균적 일반적 욕망의 충족이야 말할 나위도 없다. 아무리 폭 넓게, 평등하게, 또는 공정하게부가 나누어지고 공동체의 부가 일반적으로 아무리 증가한다고 해도, 재화를 축적하는 일에서 다른 모든 사람을 능가하려고 하는 만인의 욕망에 근거를 둔, 그러한 욕구를 충족하는 데 이르지 못한다

 

라고 말하고 있습니다. ‘합리적 인간을 상정하는 주류 경제학에서는 개인의 효용을 단지 각 개인이 소유(또는 소비)하는 재화의 절대적인 양을 가지고 판단, 평가한다고 가정하고 있습니다. 하지만 사람들을 유심히 관찰한 베블런이 보기에는 주류경제학이 말하는 것처럼 부()는 절대적 수치가 중요한 것이 아니라 다른 모든 사람을 능가하려고 하는 욕망에 사람들이 좌지우지된다고 말하고 있습니다.

 이쯤 되면 나도 남들의 시선을 의식하고 비교하며 사는 사회적 인간이지. 비록 B회사 보다는 연봉이 1,000만원 적지만 A회사에 가면 동료 사원보다 2,000만원 많이 받을 수 있으니 더 행복할거야. A회사 선택할래라고 자연스레 고백하게 되지 않으세요? 인간은 호모 이코노미쿠스이전에 남들과 비교하는 호모 컴페어쿠스(이런 용어가 있는지 모르겠네요. ^^;)’니깐요. 행여 남편에게 “내 친구 남편은 사업하면서 일년에00를 번다던데 자기는 월급이 이것밖에 안돼?”라거나 친한 친구에게 내 연봉은 00인데 너는 그것밖에 안되냐? 우리회사 옮겨라등의 말을 했다가는 어떤 상황이 벌어질지 예상이 안되는 분이 계시나요? 그랬다가는 관계가 절단날수도 있다는 점 유념하시길.

 

 셋째, 임금협상을 할 때는 먼저 무리하게 요구하라는 전략을 고려해 보셔야 겠네요. 설득의 심리학에서는 이를 상호성을 이용한 일보 후퇴, 이보 전진 전략(rejection-then-retreat)’이라는 근사한 명칭을 사용하고 있습니다. 아래의 사례를 같이 보시지요.

 

만일 당신이 당구대를 파는 사람이라면, 329달러짜리 모델과 3000달러짜리 모델 중 어떤 것을 먼저 광고하겠는가? 아마 당신은 먼저 값이 싼 것을 광고하여 사람들이 상점을 찾게 한 후 기회를 봐서 비싼 것을 권유해야 한다고 생각할지도 모른다. 그러나 Brunswick회사의 판촉담당 이사로 새로 부임한 Kelley는 당신의 생각이 옳지 않다고 지적하고 있다.

그는 그의 주장을 증명하기 위하여 실제적으로 한 판매점에서 실험을 하였다. 처음 1주일 동안은 손님들에게 가장 싼 모델로부터 시작하여 점차 비싼 모델을 소개시켜 주는 전통 기법의 판매 전략이 사용되었다. 이 기간 동안에 팔린 당구대의 평균 가격은 550달러였다. 그러나 그 다음 1주일 동안은 손님들이 어떤 모델을 원하든지 상관없이 그들에게 3000달러짜리 최고급 모델을 먼저 보여 주고 점진적으로 보다 값이 싼 모델을 소개하는 판매 전략이 사용되었다. 그 결과, 이 기간 동안 팔린 당구대의 평균 가격은 1000달러를 넘었다. (“Quote”, 1975, p.62)

 

(*출처: 『설득의 심리학』, 로버트 치알디니)

 

 

위의 먼저 무리한 요구를 하라는 전략이 비단 당구대를 파는 데에만 효과가 있지는 않겠지요. 이러한 일보 후퇴 이보 전진 전략이 자신의 결정에 대한 책임감과 만족감을 불러일으킨다고 합니다. 만약 연봉 협상을 앞둔 분이라면 협상 시에 인사 담당자에게 합의 사항에 대한 만족감을 줄 수 있다면 좋지 않겠어요? 일단 높게 부르고, 그 연봉 수준으로 합의되면 더할 나위 없이 좋겠구요, 하향 조정이 되어 결국 마음속으로 지원자가 원하는 목표 수준이 되었다 하더라도 나쁠 게 없겠지요. , 업계의 임금 기준점 분포를 훨씬 넘어선 너무나도 무리한 요구는 아예 면접 기회조차 주어지지 않을 수도 있다는 점은 유념하시구요. ^^’ 결국 여기서도 심리는 숫자와 같이 가야겠네요.

 

 넷째, 협상 시 BATNA(Best Alternative to Negotiated Agreement: 협상이 결렬되었을 때 당신이 가질 수 있는 최상의 대안)를 개선하고 활용하는 것이 무척 중요하다는 점도 빼놓을 수 없겠네요. 아래의 까르푸 매각 협상 사례를 보시지요.

 

프랑스의 할인점 체인인 한국까르푸는 2006년 한국에 있는 모든 점포를 이랜드에 팔고 완전히 철수했다. 그런데 업계에서 입을 모아 하는 이야기는 그들이 아주 좋은 값을 받고 성공적으로 매각했다는 것이었다. 사실 까르푸는 한국 내 경영에 완전히 실패한 기업이었다. 망해서 철수하는 기업이 어떻게 좋은 값을 받을 수 있었을까? 바로 BATNA를 끊임없이 개선하고 그것을 적절히 상대방에게 알려 준 덕분이었다. 도대체 어떻게 했을까?

1996년 한국에 진출한 까르푸는 처음 생각과 다르게 10년 가까이 한국 시장에서 고전을 면치 못하고 있었다. 이윽고 사업 매각설이 나돌 정도로 상황이 악화되었다. 하지만 한국까르푸는 회사를 팔아 치울 것이라는 시장의 예측과 달리 점포 수를 계속 확대했다. 어려운 상황에 처해있던 회사가 왜 점포 수를 늘렸을까? 이러한 의문은 BATNA의 개념으로써 충분히 설명이 가능하다.

당시 롯데마트 측과 물밑 협상을 추진하며 이미 일본 시장 퇴출 과정에서 거의 헐값 수준으로 회사를 매각했던 교훈을 뼛속 깊이 새긴 경영진은 '어떻게 하면 한국까르푸의 가치를 높일 수 있을 까?' 고민했다.

고민 끝에 그들이 선택한 것이 바로 BATNA. 한국까르푸는 BATNA를 개선하기 위해 국내 할인점 업계 1위 신세계 이마트를 끌어들이고 싶었다. 하지만 당시 이마트 입장에서는 롯데마트가 한국까르푸를 인수해도 별로 타격 받을 것이 없다는 입장이었다.

한국까르푸는 이러한 이마트의 판단에 영향을 미칠 수 있는 방법이 무엇일지 궁리했고, 그 결과로 나온 조치가 바로 신규 점포 개점을 통한 규모 확대였다. 즉 롯데마트와 한국까르푸의 합병으로 1위인 이마트와의 격차를 근소하게 만들면 이마트가 불안을 느낄 수 밖에 없을 것이라는 생각이었다.

한국까르푸의 생각은 정확하게 맞아 떨어졌고, 매각이 공식화되면서 이마트도 본격적으로 인수전에 뛰어들게 되었다. 한국까르푸는 2005년 한해 동안 점포 수를 크게 확대함으로써 롯데마트와의 협상에서 이마트를 자신의 BATNA로 개발한 것이다.

 

(*출처: 『협상 카리스마』, 전성철)

 

 

 협상의 가장 기본이 되는 것으로 빠지지 않는 두 가지가 있다면 바로  ‘Win-Win의 창의적 대안 개발과 함께 ‘BATNA’를 들 수 있지요. 연봉 협상을 할 때 아니면 말고요라고 말할 수 있는 BATNA가 있다면 시간에 쩔쩔매며 끌려 다니지는 않겠지요. 좋은 BATNA와 함께 “00까지 결정해서 알려주세요. 그때까지 결정해주시지 않으면 00회사로 선택하도록 하겠습니다라는 희소성의 법칙을 곁들이면 협상에 아주 유리해지겠지요.

 

 다섯째, 임금의 하방경직성(下方硬直性)’ 입니다. 일단 정해지만 내리기는 어렵다는 것이지요. 아래의 설문조사 결과를 같이 보시지요.

 

l  질문2: 어떤 소기업에 여러 명의 종업원이 일하고 있다. 그들의 임금은 그 지역에서는 평균 수준이다. 최근 실적이 이전보다 좋지 않다. 경영자는 내년부터는 임금을 10% 정도 내리기로 했다.

[
수용할 수 있다 39%,   불공정하다 61%
]


l  질문2-1: 어떤 소기업에 여러 명의 종업원이 일하고 있다. 그들에게는 매년 임금의 10% 정도가 보너스로 지급되었다. 그들의 임금은 그 지역에서는 평균 수준이다. 최근 실적이 이전보다 좋지 않다. 경영자는 금년부터 보너스를 지급하지 않기로 했다.

[
수용할 수 있다 80%,   불공정하다
20%]

(* 출처: 『행동경제학』, 도모노 노리오)

 

 

질문2와 질문2-1은 임금의 금액이 거의 같다고 볼 수 있지만 종업원의 수용도에 있어서는 큰 차이를 보이고 있습니다. 기업 입장에서는 외부 경영환경의 급격한 악화라든지 신규사업 실패, 경쟁의 격화 등으로 인한 경영 악화 시에 생존할 수 있기 위한 방편으로 HR유연화에 대한 니즈가 상당히 클 텐데요, 위의 조사결과를 봤을 때는 성과보상체계를 수립함에 있어 고정급의 비중을 줄이고 변동급(성과급)의 비중을 늘리는 것이 한 방편이 되겠네요.

, 직원들의 임금을 깍는 수단으로서 이를 활용한다면 직원들의 저항이 만만치 않을 터, 고성과에 대해서는 높은 보상을 약속하는 성과보상체계여야 노사간 원만한 합의가 이루어지겠지요.

 
여섯째, 대부분의 사람은 점점 좋아짐을 선호한다고 하는 군요.

 

로엔스틴과 프렐렉은 총액이 일정하더라도 임금이 시간의 경과와 함께 상승하는 쪽을 선호한다는 것을 발견했다. 그들은 6년간 근무한 회사에서(전체적으로는 임금 총액이 같다.) 처음에는 임금이 낮은 편이지만 점점 상승하는 패턴, 처음에는 임금이 높지만 점점 하락하는 패턴 중 어느 쪽을 선택할지를 일반인들에게 물었다. 답변자 중 하강 패턴을 선택한 사람은 불과 12%였으며, 과반수 이상이 점점 상승하는 패턴을 선호했다.

(*
출처: 『행동경제학』, 도모노 노리오)

 

 

합리적으로 생각하는 사람이라면 처음에는 임금이 높고 그 후 하강하는 패턴을 선택하겠지요. 왜냐하면 처음에 높은 임금을 받으면 그 돈으로 복리 적금에 넣어둔다든지 채권을 사 둘 수도 있고, 하다못해 중간에 퇴사를 한다고 했을 때도 점차 증가하는 패턴 대비 더 많은 임금을 받게 되는 것이잖아요. 하지만 이렇게 상대적으로 훨씬 좋은 하강 패턴을 선택한 사람은 불과 12%밖에 안되었다고 하네요. 왜냐, ‘점차 좋아지는 맛이 없기 때문이라는군요.

 

프로운동선수들이나 연애인들 중에 보면 눈이 번쩍 뜨일 만큼의 고액연봉 계약을 했다가 그만큼의 역할을 못해내고 먹튀라는 오명을 뒤집어 쓴 경우가 가끔 있잖아요. 실력과 성과가 뒷받침 되지 않은 상태에서 협상전략과 술수로 너무 높은 연봉을 받은 나머지 점점 좋아짐을 맛볼 수 없게 되는 경우라면 일하는 사기에 문제가 될 수도 있겠지요?


 
일곱째, 성과급을 포함한 임금의 격차가 점점 커지고 있는 사회 추세와 정의의 관점에서 의문을 제기하고 있는 글을 소개합니다.

 

 2007년에 미국 주요 기업 최고경영자들은 노동자들보다 평균 344배나 많은 보수를 받았다. 대체 무슨 자격으로 임원들이 직원들보다 그렇게 많은 돈을 받았을까? 이들 대부분이 열심히 일하고 재능을 발휘한다. 하지만 이 점을 생각해보자. 1980년에 최고경영자들은 그들이 고용한 노동자들보다 겨우 마흔두 배 많은 수익을 올렸다. 그렇다면 임원들이 1980년에는 지금보다 재능이 적고 일도 덜 했을까? 아니면 원래 소득 격차라는 게 재능이나 기술과는 무관하게 우연히 발생하는 것일까?

 미국 임원의 보수를 다른 나라와 비교해보자. 미국 최대 기업의 최고경영자들은 연봉이 평균 1330만 달러(2004~06년 자료)에 이르는데 반해, 유럽의 최고경영자들은 660만 달러, 일본은 150만 달러다. 미국의 최고경영자는 유럽의 최고경영자보다 두 배, 일본의 최고경영자보다 아홉 배 많은 보수를 받을 자격이 있는가? 아니면 이 차이는 최고경영자가 발휘하는 노력이나 재능과는 무관한 요소들을 반영하는가?

 

(*출처: 『정의란 무엇인가』, 마이클 샌델)

 

 

 미국의 경영자에게만 한정된 이야기가 아닙니다. 아래의 신문기사를 보시지요.

 

교통사고 소송 과정에서 삼성전자 부사장의 연봉이 공개됐다. 2008년 한 해 동안 급여와 성과급을 더해 102,000만원의 연봉을 받았다고 한다. 삼성전자 직원 1인당 평균연봉 6,780만원(2009년 본사 기준) 15, 도시가구 중위(中位)소득 3,626만원(통계청 2010) 28배였다. 연봉이 1,000만원 이하인 우리나라 전체 근로자 26.3%(4503,432명ㆍ2008년 과세대상자)와 비교하면 100배 이상이다.
 
사장급 CEO의 연봉은 여기서 몇 배가 더 뛴다. 지난해 삼성전자 사업보고서에 따르면 최지성 사장 등 4명의 사내이사에게 1인당 평균 108억원이 지급됐다. 월급의 15%를 자진 삭감하겠다고 밝혀 화제가 된 어윤대 KB금융지주 회장의 연봉은 성과급을 포함해 15억원 안팎으로 전해졌다.

 

(*출처: ‘10억 연봉은 정의로운가칼럼, 고재학 한국일보 논설위원, ’10.8.13)

 

 

 국내의 척박한 인문사회과학 도서 시장을 감안할 때 신기하고도 놀랍게도 베스트셀러 반열에 오른 책 정의란 무엇인가와 한국일보 칼럼에서는 경영층의 고액 연봉이 정의로운가라고 질문을 던지고 있습니다.

 

여러분은 정의라는 안경로 억대 연봉을 바라보시는지요, 아니면 이라는 안경으로 바라보시는지요? 연봉 1천 만원, 1, 그리고 10억 등 편차가 이리도 큰데 여러분은 현재 어느 위치에 있고 또 앞으로 어느 위치를 목표로 뛰고 계시는지요?

 

요즘 신문에 보니 감사 결과 최근 4년간 재정난을 겪은 서울시 산하 5대 공기업이 임직원에게 2,600억 원대의 성과급 잔치를 벌였다면서 공분을 감추지 않고 있네요. ‘08년에 미국에서도 무리하게 파생상품에 투자했다가 국민의 세금 1,730억 달러의 공적 자금으로 겨우 회생한 AIG가 위기를 초래한 바로 그 부서의 임원들에게 상여금으로 16500만 달러를 지급하고 다른 직원 73명에게도 100만 달러 이상의 상여금을 지급해서 미국 국민들의 분노의 대상이 되었던 적이 있지요. 결국 연봉 10이 문제가 아니라 그에 합당한 성과를 냈는가, 그만큼의 연봉을 받을 만한 자격이 있는가의 문제라는 생각이 듭니다.

 

샐러리맨의 꿈이 억대 연봉이라고들 하지요. 억대 연봉을 받는 분들을 주위에서 살펴보면 사업을 하는 분이던가, 기업의 임원이던가, 이도 저도 아니면 영업을 하는 분들인 듯 하네요. 억대 연봉 받을 수 있는 날이 오기를 기원합니다.

 

 

 

글을 마치며

 

 연봉이라는 하나의 주제를 가지고 숫자와 심리’, ‘과학과 예술에 대해서 생각해 볼 수 있는 단상을 풀어보았습니다. ‘연봉이라는 것이 상당히 민감한 주제인 만큼 글을 읽는 내내 좌뇌와 우뇌를 왔다 갔다 하면서 이성과 감정에 여러 흔적과 잔상을 남기지 않았을까 추측해봅니다.

 

숫자와 심리의 두 마리 토끼를 같이 이용해야만 제대로 된 연봉 협상도 하고 더 나아가서는 기업경영도 할 수 있다는 취지로 얘기를 풀어보았는데요, 마지막으로 연봉에 관해서는 행복과 평안을 위해 마음 공부도 꼭 필요하겠다는 점 강조하고 싶네요.

 

경제학자 Barry Schwart Sheena S. Iyengar는 대학 4년생의 구직활동에 대해 조사했다. 결과는 다양한 직업군에서 선택할 수 있는 학생일수록 구직활동에 대한 만족도가 낮은 것으로 나타났다. 특히 최고의업무를 추구하는 학생들이 적당한업무를 추구하는 학생에 비해 실제로 업무 내용이나 조건이 훨씬 더 좋은 직책이 내정되어 있음에도 불구하고 만족도가 낮았다. 그런 학생들일수록 낙담, 불안, 욕구불만, 후회 등의 감정이 더 두드러졌다.


(*
출처: ‘행동경제학’, 도모노 노리오)

 

 

여러분은 연봉에 관한 한최고의선택을 위해 가능한 많은 선택대안을 검토하고 끊임없이 확인하는최대화 인간인지요. 아니면 일단 적당한선택대안을 찾고 나면 만족하는 만족화 인간인지요?

 

최대화 인간은 자신의 선택에 대한 만족도가 낮고 그래서 행복도가 낮다고 하네요. 현재에 감사할 줄 알고 만족할 줄 아는 마음, 삶의 지혜로 행복한 삶 일궈나가시길 바랍니다.

 

 

 

 

 

[ 에필로그 ]

 

 보통은 글 쓰는데 수첩에 키워드 몇 개 적어놓고는  밤에 1~3시간동안 일사천리로 쓰고는 합니다. 그런데 위의 글은 몇 줄 쓰다 말다를 반복하다가 결국 이틀이나 걸렸어요. 시간이 그동안의 칼럼 대비 왕창 늘어진, 힘겹게 쓴 클인데도 지금 다시 읽어보니 '숫자와 심리'라는 주제에 딱 부합한다기 보다는 각 소재들이 따로 노는 듯한 인상을 받게 되네요.  '숫자와 심리'가 같이 가야지 된다는 얘기를 하고 싶었는데 그게 잘 전달이 안된듯 합니다.  '숫자와 심리'보다는 '연봉'이라는 소재에 더 포커스가 가게 된 구조인듯 해서요. 

 

'연봉'과 관련해서는 위의 칼럼 내용과는 별도로 에필로그를 빌어 따로 몇자 적습니다.

 첫째, 위의 칼럼에서는 연봉협상과 관련된 심리 실험(조사) 자료를 몇 개 소개하기는 했습니다만 국내의 현실에서는 연봉 '협상'이라는게 없다고 할 수도 없지만 있다고 하기에도 애매합니다.  개별 연봉협상이라기 보다는 연말에 인사고과 결과에 연동이 되어서 시스템적으로 다음해 연초가 되면 연봉이 계산이 되어서 날아오고(?) 각 개인은 '동의합니다' 버튼을 클릭하는 수순을 밟게 되지요.  결국 연봉 상승은 위에 제가 칼럼에서 쓴 '협상 비법'에 좌우된다기 보다는 '평소에 잘하자, 성과 내고 인정받자'는 상식에 좌우된다는게 더 현실에 맞겠지요. '인생 한방'은 로또에는 있을 지언정 회사생활에서는 '평소에 꾸준히 신뢰 쌓고 평판 쌓는 길' 밖에 없다는 생각이 듭니다.

 

 둘째, 연봉이 오르는 수준을 보면 사원에서 대리, 대리에서 과장 등 직급이 변동할 때 Big jump 합니다. 그리고 임원 승진할 때 연봉과 함께 다양한 처우 개선이 Quantum jump 하지요.  임원이 아닌 경우라면 자기 사업하거나 아니면 영업직에 있으면서 성과급을 받는 경우가 고액연봉이 가능하겠지요.  억대 연봉의 비결은 자기 사업하거나, 임원 승진, 아니면 영업직 중 하나일 가능성이 많겠지요.  사업을 하든, 임원 승진을 하던, 영업을 하던 이를 감당할 만한 실력과 인맥이 없으면 1년을 채 못 버티고 나가 떨어질 자리들 입니다. 따라서 연봉에 연연해 단기적인 한방을 꿈꾸기 보다는 평소에 실력, 경험, 인맥을 차곡차곡 쌓아가면서 내공을 다지는게 우선이라는 생각입니다.  그러다보면 연봉은 따라오게 되어있습니다. Big jump 든 Quantum jump든 말이지요.

 

 셋째, 연봉 협상이 협상답게 진행되는 경우가 이직할 경우일텐데요, 이건 참 신중해야 한다고 생각합니다.(승진과 고액연봉 제안을 받은 스카우트라면 축하드립니다!)  면접이나 연봉협상 관련된 외국의 번역서들을 보면 "2~3년 마다 이직을 통해서 몸 값을 올려라"라는 조언을 하고 있는데요, 국내의 경우 외국(특히, 미국)과는 조직문화가 상당히 다른만큼 번역서의 내용을 곧이 곧대로 들었다가는 나중에 낭패를 볼 수 있다고 생각합니다.  이력서상에 단기간에 회사를 여러곳 옮긴 경우 '능력이 많아서 여기저기 스카우트 되었군'이라고 생각하기 보다는 '뭔가 문제가 있어서 적응을 잘 못했나?'라고 생각하는 경우가 많은 듯 합니다. 입장바꿔 생각해보면 쉽게 유추할 수 있습니다. 그리고 회사 일이라는게 혼자서 할 수 있는 일은 거의 없습니다. 대다수가 팀 플레이이고 팀 간 협업이고 회사간 거래이다보니 사람과 사람간의 관계, 신뢰가 성과를 내는데 매우 매우 중요한 역할을 합니다. 이러한 관계, 신뢰가 제대로 쌓이려면 적어도 3년은 아기를 키우 듯 정성을 쏟으며 키워가야 하는 바, '연봉'이라는 단기적인 꿀에 현혹이 되어서 그동안 쌓아온 관계, 신뢰를 뒤로 하고 새로운 곳에 가서 처음부터 다시 시작하는 것이 더 나을 지, 특히 관계를 중시하는 한국적인 상황에서 어느쪽이 더 유리한지에 대해서는 심사숙고할 필요가 있습니다.  이직하지 않고 한 회사에서 장기근속하는 사람을 무능한 사람으로 본다고 말하고 있는 외국 번역서는 한국 조직문화와는 맞지 않습니다.  회사에 대한 로열티를 중시하는 한국 기업문화를 간과해서는 안된다고 봅니다.

 

 넷째, 피치 못할 사정으로 이직을 해야 할 경우 위 칼럼에서 말한 것처럼 반드시 'BATNA(Best Alternative To Negociated Agreement)'를 염두에 두셔야 겠지요. 어딘가에 적을 두지 않은 상태에서 연봉협상을 할 경우 고용하는 측 입장에 끌려다닐 수 밖에 없습니다.  HR담당자는 담당자의 심성이 나빠서가 아니라 담당하는 자리의 업무 자체가 입사지원자의 결점을 찾고 연봉을 깍는 것을 미션으로 부여받은 자리입니다.  입사희망자가 BATNA가 없는 상황일 경우, 즉 현재 적이 없거나(무직상태이거나) 해당 업체 단 한곳 만 입사지원(혹은 연봉협상 중이거나) 한 상태임을 파악했을 경우 시간을 끌면서 입사지원자의 애간장을 태우며 연봉협상을 유리한 국면으로 끌고 갈 것이 틀림없습니다. 그렇게 하라고 교육을 받았을 테니깐요, 그리고 그게 그 담당자의 일이기 때문입니다.  이직은 정말 신중하게 고려하시되, 피치못할 경우는 부지런히 BATNA를 개발하고 개선하시기 바랍니다.

 

 다섯째, 자신이 추구하는 라이프스타일, 가치에 대해서 혼자만의 시간을 내어서 조용한 가운데 내면의 소리를 들어보는 시간을 가지면 좋겠습니다. '돈' 말고도 추구할 가치가 많거든요.  사실, '돈'은 추구할 '가치'라기 보다는 '수단'이자 '결과'인 셈이지요.  무엇을 위해 돈을 버나, 무엇을 위해 일을 하나 곰곰히 생각해보는 시간을 가져보면 좋겠습니다. 한두해 일하다 말거 아니잖아요? 

 

애플의 스티브잡스가 1980년대 매킨토시 개발팀을 독려하면서 즐겨한 말이 있습니다.

 

"We're here to put a dent in the universe."

("우리는 우주에 흔적을 남기기 위해 여기에 있다")

 

당신은 왜 일을 하시는지요?  잠시 짬을 내서 진지하게 고민해보시면 좋겠습니다. 

소명의식을 가지고 혼을 담아 일하시는 분들이 보면 결과적으로 고액연봉도 받는 경우를 종종 보게 됩니다.

무엇이 먼저고 무엇이 결과인지 곰곰히 생각해보면 좋겠습니다.

728x90
반응형
Posted by Rfriend
,

이전 포스팅에서 벡터는 "힘(magnitude)"과 "방향(direction)"을 가진 양이라고 정의를 했습니다. 이번 포스팅에서는 벡터를 가지고 점(dot), 축(axis), 직선(line), 평면(space), 3차원 공간(3 dimensional space), n차원 공간(n dimensional space)를 나타내는 방법을 알아보겠습니다.

 

앞으로 선형독립, 기저, 랭크(RANK), 고유값(Eigen value), 고유벡터(Eigen vector) 등에 대해서 소개할 텐데요, 이번 시간은 잠깐 쉬어가면서 기본 개념을 잡아보는 시간을 생각하면 좋겠습니다. 

 

3차원까지는 이해가 가는데 n차원이라고 하면 이게 무슨 소리인지, 벡터로는 어떻게 표현하는지, 다차원분석을 한다고 하는데 n차원으로 생각한다는 것이 무엇인지 조금이나마 감을 잡는데 이번 포스팅이 도움이 되면 좋겠습니다. 

 

단위벡터(unit vector)를 사용해서, 상수 c와 단위벡터의 곱의 집합으로 표현합니다.  벡터를 사용해서 파동 곡선 함수라든지 타원형 함수 등도 표현할 수 있습니다는 정도만 알아두시구요, 상세 내용은 sine, cosine 등의 삼각함수도 나오고 해서 좀 어려울듯 하니 생략하겠습니다.

 

  • 벡터로 점 표현하기 (representing a dot by a vector)

 점(3, 0)과 점(0, 3)을 벡터로 나타내면 아래와 같습니다.

 

 

 

 

 

  • 벡터로 축 표현하기 (representing an axis by a vector)

 x1축과 x2축을 각 각 벡터로 나타내면 아래와 같습니다.

 

 

 

 

 

  • 벡터로 직선 표현하기 (representing a line by vector)

x1 = 4인 직선을 벡터로 나타내보겠습니다.

 

 

 

 

x2 = 5인 직선을 벡터로 나타내면 아래와 같습니다.

 

 

  • 벡터로 2차원 평면 표현하기 (representing 2 dimensional space by vector)

x1 축과 x2 축에 수평인 벡터로 이루어진 2차원 평면입니다.  

 

 

 

 

단위벡터가 아닌 벡터를 사용해도 2차원 평면을 표현할 수 있습니다.  중/고등학교 때 좌표 개념을 배울 때는 단위벡터를 가정합니다.  그렇다보니 아래처럼 단위벡터가 아닌 벡터를 사용한 2차원 평면 좌표에 대해서는 굉장히 낯설게 느껴질 것 같습니다.  그런데 나중에 벡터, 선형사상을 가지고 확대나 회전,  평형이동 등에 활용할 때 아래의 예시 개념을 활용합니다.  게임 개발하거나 CAD 설계 하는 분이라면 일상적으로 사용하는 개념입니다.

 

 

  • 벡터로 3차원 공간 표현하기 (representing 3 dimensional space by vector)

 

 

 

 

 

 

  • 벡터로 n차원 공간 표현하기 (representing n dimensional space by vector)

4차원 이상의  n차원 공간을 상상하기가 쉽지 않을텐데요, 이를 벡터의 집합으로 표현하면 아래와 같습니다. 2차원, 3차원 공간을 벡터로 표현했던 위의 집합을 보면 n차원의 벡터 표현도 이해가 될 것입니다.

 

 

다음번 포스팅에서는 차원(dimension)을 정의하는데 꼭 필요한 개념인 선형독립(linear independence), 선형종속(linear dependence)에 대해서 알아보겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

728x90
반응형
Posted by Rfriend
,

작년 연말 휴가기간에 재미있고 유익하게 읽었던 책 한권 추천하고자 합니다.

 

"유시민의 글쓰기 특강", 유시민 저, 생각의길, 2015년.

 

한때는 장관이었고, 국회의원이자 정당의 정치인이기 했으며, 방송인이자 신문 칼럼리스트이기도 했던, 지금은 자신을 "지식소매상"이라고 하는 유시민씨를 잘 아실 것입니다.  TV 토론프로그램에서 가끔 볼 수 있는 유시민씨의 촌철살인 말은 "사이다"같은 느낌을 주곤 하지요.

 

그 유시민씨가 자신의 이름을 걸고 글쓰기 특강을 책에 풀어놓았습니다. 다른 책도 아니고 "글쓰기"에 대한 책을 자신의 이름을 걸고 쓴다는게 보통 자신감이 아니면 쓰기 힘들 것 같습니다.

 

저자는 글쓰기가 타고난 재능이라기 보다는 훈련을 통해서 갈고 닦을 수 있는 기술이라고 말하고 있습니다.  우리의 삶에서 "말하기"와 "글쓰기"를 빼놓고는 성공적인 경제생활, 사회생활, 학창생활을 일궈나가기가 힘들기 때문에 "훈련을 통해서 좋아질 수 있다"는 저자의 말은 반갑지 않을 수 없습니다.

 

 

 

 

 

이 책 읽으면서 공감하고 유용한 내용이라고 생각했던 점들을 다시 한번 복기하는 차원에서, 그리고 이 책을 소개하는 차원에서 이번 포스팅에서 몇 자 적어봅니다.

 

책은 첫번째 포문은 "취향을 두고 논쟁하지 말라", 그리고 "주장은 반드시 논중하라", "처음부터 끝까지 주제에 집중하라" 입니다.  속된 말로 "개취(개인취향)"라는 말도 있는데요, 취향가지고 논쟁을 시작하는한 100% 지게 되어있다는 점을 몇 가지 사례를 들어서 강조하고 있습니다. 내가 하는 말이, 상대방이 하는 말이 "취향"에 관한 것인지 아니면 "주장"에 관한 것인지 분별해야 겠습니다.

 

 

본문에서 글쓰기의 철칙으로 4가지를 들고 있습니다. 앞서 말한 내용의 반복이고 강조입니다. 그만큼 중요하기 때문이겠지요.

첫째, 무슨 이야기를 하는지 주제가 분명해야 한다.

둘째, 그 주제를 다루는 데 꼭 필요한 사실과 중요한 정보를 담아야 한다.

셋째, 그 사실과 정보 사이에 어떤 관계가 있는지 분명하게 나타내야 한다.

넷째, 주제와 정보와 논리를 적절한 어휘와 문장으로 표현해야 한다.

 

 

실명을 들어서 잘못된 사례를 지적하고, 위의 원칙에 입각해서 새로 고쳐쓴 글을 보여주면서 비교하는 것이 저로서는 신선하고 이해가 쉽기도 했습니다만, 좀 불편하기도 했습니다. 실명을 대놓고 공개석상에서 까는 걸 별로 안해봐서...ㅋㅋ

 

 

글쓰기의 두번째 철칙은

쓰지 않으면 잘 쓸 수 없다. 많이 쓸수록 더 잘 쓰게 된다.

입니다.  "수학에는 왕도가 없다"는 말이 있는데요, 글쓰기에도 왕도는 없으며, "글쓰기 근육"을 훈련을 통해 길러야 한다고 저자는 말하고 있습니다.  저도 일주일에 1~3편 정도 글을 쓰는 블로거로서 꽤 공감하는 말입니다.

 

 

그리고, 많이 쓰는 것과 함께 "좋은 책"을 많이 읽을 것을 권하고 있습니다. 말을 하던, 글을 쓰던 그 핵심에 주제와 논리가 명확하고 알맹이(컨텐츠)가 있으려면 "독서"가 꼭 필요하다는 것입니다.

 

훌륭한 글은 뚜렷한 주제 의식, 의미 있는 정보, 명료한 논리, 적절한 어휘와 문장이라는 미덕을 갖추어야 한다. 만약 이 네 가지 미덕을 갖추는 데 각각 서로 다른 후년이 필요하다면 글쓰기는 너무나 어렵고 복잡해서 보통 사람은 할 수 없는 일이 될 것이다. 다행히 그렇지가 않다. 이 네 가지는 따로따로 배우고 익히는 게 아니다. 넷 모두 한꺼번에 얻거나, 하나도 얻지 못하거나, 둘 중 하나다.

 

독해력을 기르는 방법은 독서뿐이다. 결국 글쓰기의 시작은 독서라는 것이다. 독해력은 글쓰기뿐만 아니라 모든 지적 활동의 수준을 좌우한다. 눈으로 텍스트를 읽고 이해하지 못하는 사람은 텔레비전을 보거나 강연을 들을 때도 핵심을 잘 파악하지 못한다.

 

요즘 지하철 타고 다니다 보면 스마트폰으로 열심히 인터넷 기사를 보거나 게임을 하거나 음악을 듣는 사람은 많이 봅니다. 하지만 책 읽는 사람은 참 드뭅니다.  이전 독서일기 포스팅 중에 "생각하지 않는 사람들"이라는 책을 소개했던 적이 있는데요, 요즘의 책읽기를 멀리하는 세태에서는 저자의 "책읽기" 권고가 일종의 경고로도 들립니다.

 

그러면 "무슨 책을 읽으면 좋은가?"라는 질문이 떠오를텐데요, 유시민씨가 추천하는 전략적 독서목록 32권을 한번 들여다 보시지요. 아래 목록을 보면 알겠지만, 스펙트럼이 참 넓습니다. 교양인이자 지식인의 품격을 갖추기 위한 좋은 길잡이가 될 것 같습니다. 저는 아래 32권 중에서 12권 읽었고, 책을 사놓기만 해놓고 읽지 않고 것이 2권 있네요.  저는 소위 고전에 속하는 책들은 거의 안 읽었네요. ^^;

 

- 라인홀드 니버, <도덕적 인간과 비도덕적 사회>, 문예출판사

- 레이첼 카슨, <침묵의 봄>, 에코리브리

- 리처드 도킨수, <만들어진 신>, 김영사, <이기적 유전자>, 을유문화사

- 리처드 파인만 강의, 폴 데이비스 서문, <파인만의 여섯 가지 물리 이야기>, 승산

- 마이클 샌델, <정의란 무엇인가>, 김영사

- 막스 베버, <프로테스탄트 윤리와 자본주의 정신>, 다락원

- 소스타인 베블런, <유한계급론>, 우물이있는집

- 스티븐 핑커 외 지음, 존 브록만 엮음, <마음의 과학>, 와이즈베리

- 슈테판 츠바이크, <다른 의견을 가질 권리>, 바오

- 신영복, <강의>, 돌베개

- 아널드 토인비, <역사의 연구>, 동서문화사

- 앨빈 토플러, <권력이동>, 한국경제신문

- 에드워드 카, <역사란 무엇인가>, 까치글방

- 에른스트 슈마허, <작은 것이 아름답다>, 문예출판사

- 에리히 프롬, <소유냐 존재냐>, 홍신문화사

- 장 지글러, <왜 세계의 절반은 굶주리는가>, 갈라파고스

- 장하준, <그들이 말하지 않는 23가지>, 부키

- 재레드 다이아몬드, <총, 균, 쇠>, 문학사랑

- 정재승, <정재승의 과학 콘서트>, 어크로스

- 제임스 러브록, <가이아>, 갈라파고스

- 존 스튜어트 밀, <자유론>, 책세상

- 존 케네스 갤브레이스, <불확실성의 시대>, 홍신문화사

- 진중권, <미학 오디세이>, 휴머니스트

- 최재천, <생명이 있는 것은 다 아름답다>, 효형출판

- 칼 마르크스, 프리드리히 엥겔스, <공산당선언>, 책세상

- 칼 세이건, <코스모스>, 사이언스북

- 케이트 밀렛, <성性 정치학>, 이후

- 토머스 모어, <유토피아>, 서해문집

- 한나 아렌트, <예루살렘의 아이히만>, 한길사

- 헨리 데이비드 소로우, <시민의 불복종>, 은행나무

- 헨리 조지, <진보와 빈곤>, 비봉출판사

 

 물론 저자가 읽은 책의 한도 내에서 추천한 책들이라는 한계에 대해서는 저자 또한 분명 말하고 있습니다.  제 개인적인 경험으로는, 책을 자꾸 읽다보면 "좋은 책"을 선별하는 안목도 생기고, 읽고 싶은 책이 스스로 가치를 뻗어나가면서 자연스럽게 자신만의 관심사와 필요에 기반한 도서목록이 줄을 서기 시작하더군요.  저자가 추천하는 도서목록은 참고는 하되 간략한 질문형식의 소개글을 보고 흥미가 땡기는 책들을 골라서 읽기 시작하면 되겠지요.

 

 

저자는 "독자의 마음을 움직이는 글"을 쓰려면 독자가 "편하고 쉽게 이해할 수 있는 글"을 써야 한다고 말합니다. "우리말"을 제대로 알고 써야만 독자가 쉽고 편하게 이해할 수 있겠지요?  "우리말" 바로쓰기를 위한 교재로 이오덕 선생의 책 <우리글 바로쓰기>와 박완서님의 '토지' 소설책을 강력히 권하고 있습니다.

 

저자는 중국과 일본 글자말의 오남용, 영어 문법 (수동태, 주어의 위치 등...)에만 있는 어법의 잘못된 사용 등에 대해서 예를 들어가면서 지적을 합니다.

 

 

마지막으로 "글은 단문이 좋다"는 저자의 특강을 소개하는 것으로 이번 독서일기를 마칠까 합니다.  제가 이 책을 읽으면서 제일 뜨끔했던게 바로 이 부분입니다.  제 블로그 글들을 보면 단문보다는 복문이 훨씬 더 많거든요. ^^;  유시민씨는 이 책을 쓸 때 자신의 특강 내용대로 단문으로 주로 책을 썼습니다. 그래서인지 한결 읽기 수월합니다. 군더기기가 별로 없습니다.

 

 

수험생을 위한 <유시민의 글쓰기 특강, 논술 시험편> 책도 조만간 출간할 것이라고 합니다.  논술시험을 앞둔 학생이라면 기대해봄직 하겠습니다.

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 그래프에 추가적인 정보를 입력하는 낮은 수준의 그래프 함수(low level graphic functions) 중에서

(1) 제목, XY축 Label 추가하는 title()

(2) XY축의 형태를 변환하는 axis(side, ...)

(3) 직선 연결, 추가 : lines(x, y), abline(a, b), abline(h=y), abline(v=x)

(4) 점 추가 : points(x, y)

(5) 문자 추가 : text(x, y, labels, ...), mtext()

(6) 범례 추가 : legend(x, y, legend, ...)

에 대해서 알아보았습니다.

 


이번 포스팅에서는 낮은 수준의 그래프 함수 네번째로 (7) 다각형 추가 : polygon(x, y, ...) 에 대해서 소개하겠습니다.



[ 낮은 수준의 그래프 함수 (Low level graphic function) ]

 

 

 

다각형을 그리는 polygon() 함수의 일반적인 사용법은 다음과 같습니다.

 

polygon(x, y = NULL, density = NULL, angle = 45,
        border = NULL, col = NA, lty = par("lty"),
        ..., fillOddEven = FALSE) 

 

 

 구분

기능 설명 

 x, y

  다각형의 좌표의 벡터

 density

  다각형 안을 채우는 음영 선의 밀도 (default 는 NULL)

 angle

  음영있는 선의 각도 (수평선을 기준으로 해서 반시계방향)

 border

  다각형 테두리의 색깔

 col

  다각형을 채우는 색깔 (default 는 NA)

 lty

  par() 에서 사용하는 선 유형

  : 0=blank, 1=solid (default), 2=dashed, 3=dotted, 4=dotdash,

    5=longdash, 6=twodash

 ...

  추가로 그래프 모수 사용 가능

 fillOddEven

  다각형의 음영을 논리적으로 조절하는 모드 (default 는 FALSE)

 

 

 

두 개의 삼각형을 테두리의 색깔(border)과 선 유형(lty), 다각형을 채우는 색깔(col), 다각형을 채우는 선의 밀도(density)와 각도(angle), 색깔(col)을 달리해서 그려보겠습니다.

 

x와 y의 좌표값의 중간에 "NA" value가 들어갔음에 주의해서 보시기 바랍니다.

> ##-------------------------------------
> ## polygon : polygon(x, y, ...)
> ##-------------------------------------
> 
> # Multiple polygons from NA values
> 
> plot(c(1, 6), c(-3.5, 3.5), type = "n")
> x <- c(1, 2, 3, NA, 4, 4, 6)
> y <- c(1, -3, 2, NA, -3, 3, -3)
> polygon(x, y,
+         col = c("yellow", "blue"),
+         border = c("black", "red"),
+         lwd = 2, 
+         lty = c("dotted", "solid"))
> title("Multiple polygons from NA values")

 

 

 

 

 

 

아래의 다각형은 위와 R script가 거의 동일한데요, 단 한가지 차이점이라면 x, y의 좌표값에 "NA" value가 없다는 점입니다.  "NA" value가 없다보니 R은 중간에 다각형을 분리하지를 못하고, 그냥 하나의 색깔, 선 유형, 다각형 채우는 색을 계속 사용하고 있습니다.

 

> ## what if no NA value
> plot(c(1, 6), c(-3.5, 3.5), type = "n")
> x <- c(1, 2, 3, 4, 4, 6)
> y <- c(1, -3, 2, -3, 3, -3)
> polygon(x, y,
+         col = c("yellow", "blue"),
+         border = c("black", "red"),
+         lwd = 2, 
+         lty = c("dotted", "solid"))
> title("Multiple polygons without NA value")

 

 

 

 

 

 

이번에는 다각형 안의 음영을 선으로 채우는 방법을 소개하겠습니다. density 로 선의 밀도(숫자가 클 수록 촘촘해짐)를 지정하고, angle 로 선의 각도(수평선을 기준으로 반시계방향)를 지정하면 됩니다.

 

> # Line-shaded polygons
> plot(c(1, 6), c(-3.5, 3.5), type = "n")
> x <- c(1, 2, 3, NA, 4, 4, 6)
> y <- c(1, -3, 2, NA, -3, 3, -3)
> polygon(x, y,
+         col = c("yellow", "blue"),
+         border = c("black", "red"),
+         lwd = 2, 
+         lty = c("dotted", "solid"), 
+         density = c(10, 20), 
+         angle = c(45, -45))
> title("Multiple polygons with Line-shaded density")

 

 

 

 

 

 

아래 다각형은 x, y 좌표값이 위에서 든 예시와는 좀 다르지요?  두개의 좌표값들 간의 거리에 색깔을 채워넣은 형태의 그래프인데요, polygon() 함수로 이런 그래프도 그릴 수 있다는 예시로 보면 좋겠다 싶어서 www.math.cula.edu 사이트에서 참조하였습니다.

 

> ## Color-shaded polygon
> # exmaple source : http://www.math.ucla.edu/~anderson/rw1001/library/base/html/polygon.html
> n <- 100
> xx <- c(0:n, n:0)
> yy <- c(c(0,cumsum(rnorm(n))), rev(c(0,cumsum(rnorm(n)))))
> plot   (xx, yy, type="n", xlab="Time", ylab="Distance")
> polygon(xx, yy, col="gray", border = "red")
> title("Distance Between Brownian Motions")

 

 

 

 * R script source : http://www.math.ucla.edu/~anderson/rw1001/library/base/html/polygon.html

 

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 그래프에 추가적인 정보를 입력하는 낮은 수준의 그래프 함수(low level graphic functions) 중에서

(1) 제목, XY축 Label 추가하는 title()

(2) XY축의 형태를 변환하는 axis(side, ...)

(3) 직선 연결, 추가 : lines(x, y), abline(a, b), abline(h=y), abline(v=x)

(4) 점 추가 : points(x, y)

(5) 문자 추가 : text(x, y, labels, ...), mtext()

에 대해서 알아보았습니다.

 


이번 포스팅에서는 낮은 수준의 그래프 함수 네번째로 (6) 범례 추가 : legend(x, y, legend, ...) 에 대해서 소개하겠습니다.



[ 낮은 수준의 그래프 함수 (Low level graphic function) ]

 

 

 

범례를 추가하는 legend()함수의 일반적인 사용법은 아래와 같습니다.

 

legend(x, y = NULL, legend, fill = NULL, col = par("col"),
       border = "black", lty, lwd, pch,
       angle = 45, density = NULL, bty = "o", bg = par("bg"),
       box.lwd = par("lwd"), box.lty = par("lty"), box.col = par("fg"),
       pt.bg = NA, cex = 1, pt.cex = cex, pt.lwd = lwd,
       xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1,
       adj = c(0, 0.5), text.width = NULL, text.col = par("col"),
       text.font = NULL, merge = do.lines && has.pch, trace = FALSE,
       plot = TRUE, ncol = 1, horiz = FALSE, title = NULL,
       inset = 0, xpd, title.col = text.col, title.adj = 0.5,
       seg.len = 2) 

 

 

옵션이 굉장히 많지요?  ^^;  그래프에 관한한 R 가지고 못하는게 거의 없다는게 바로 이런 겁니다.  그런데 이걸 다 설명하자니 시간이 너무 오래걸릴것 같기도 하고 대부분은 아마 거의 사용할 일이 없을 것 같기도 합니다.  그래서 많이 사용하는 옵션 위주로 몇 개만 선별해서 어려움없이 사용할 수 있는 정도로만 설명하겠습니다.

 

 

 구분

옵션 기능 

 x, y

  범례를 추가할 위치를 설정하는 3가지 방법

  (1) x, y 좌표를 입력하면 범례 사각형의 왼쪽 상단이 그 지점에 위치함

  (2) locator(1)을 입력하면 커서를 가리키는 지점에 범례 생성

  (3) 위치를 나타내는 아래의 9개 단어 중 하나를 선택해서 입력

    : "bottomright", "bottom", "bottomleft", "left", "topleft",

      "top", "topright", "right" and "center"

 legend

  길이가 1보다 큰 문자(character) 혹은 범례를 담은 벡터(expression vector)

 col

  색깔 지정 벡터

 lty

  선 유형 지정 벡터

 lwd

  선 두께 지정 벡터

 pch

  기호 지정 벡터

...

  그래픽 모수 추가 설정 가능

 

 

 

MASS 패키지에 내장된 Cars93 데이터프레임의 차종(Type) 별로 차 무게(Weight)와 고속도로 연비 (MPG.highway) 변수를 사용해서 산포도를 그려보겠습니다. 그리고 차종(Type) 그룹에 대한 범례(legend)를 추가해보겠습니다.

 

 

(1) x, y 좌표를 직접 입력하여 범례 위치 설정

 

> # to use Cars93 dataframe
> library(MASS)
> 
> # scatter plot
> attach(Cars93)
> 
> # adding points with different characters by condition
> plot(Weight, MPG.highway, type = 'n') # blank plot
> 
> # Type = Compact
> points(Weight[Type == "Compact"], MPG.highway[Type == "Compact"], pch = 0)
> 
> # Type = Large
> points(Weight[Type == "Large"], MPG.highway[Type == "Large"], pch = 1)
> 
> # Type = Midsize
> points(Weight[Type == "Midsize"], MPG.highway[Type == "Midsize"], pch = 17, col = "yellow")
> 
> # Type = Small
> points(Weight[Type == "Small"], MPG.highway[Type == "Small"], pch = 3)
> 
> # Type = Sporty
> points(Weight[Type == "Sporty"], MPG.highway[Type == "Sporty"], pch = 9)
> 
> # Type = Van
> points(Weight[Type == "Van"], MPG.highway[Type == "Van"], pch = 15, col = "blue")
> 
> title("adding legend to the plot")
> 
> 
> # adding legend to topright side
> legend(x = 3500, y = 50, 
+        c("Compact", "Large", "Midsize", "Small", "Sporty", "Van"), 
+        col = c("black", "black", "yellow", "black", "black", "blue"), 
+        pch = c(0, 1, 17, 3, 9, 15)
+ )
>

 

 

> detach(Cars93)

 

 

 

 

(2) 위치를 나타내는 말을 직접 입력하여 범례 위치 설정

 

> library(MASS)
> # scatter plot
> attach(Cars93)
> # adding points with different characters by condition
> plot(Weight, MPG.highway, type = 'n') # blank plot
> # Type = Compact
> points(Weight[Type == "Compact"], MPG.highway[Type == "Compact"], pch = 0)
> 
> # Type = Large
> points(Weight[Type == "Large"], MPG.highway[Type == "Large"], pch = 1)
> 
> # Type = Midsize
> points(Weight[Type == "Midsize"], MPG.highway[Type == "Midsize"], pch = 17, col = "yellow")
> 
> # Type = Small
> points(Weight[Type == "Small"], MPG.highway[Type == "Small"], pch = 3)
> 
> # Type = Sporty
> points(Weight[Type == "Sporty"], MPG.highway[Type == "Sporty"], pch = 9)
> 
> # Type = Van
> points(Weight[Type == "Van"], MPG.highway[Type == "Van"], pch = 15, col = "blue")
> 
> title("adding points with different characters by Car Types")
> 
> 
> # adding legend to topright side
> legend("topright", 
+        c("Compact", "Large", "Midsize", "Small", "Sporty", "Van"), 
+        col = c("black", "black", "yellow", "black", "black", "blue"), 
+        pch = c(0, 1, 17, 3, 9, 15)
+        )
> 

 


> detach(Cars93)

 

 

 

다음번 포스팅에서는 다각형(polygon)을 추가하는 방법에 대해서 소개하겠습니다.

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 그래프에 추가적인 정보를 입력하는 낮은 수준의 그래프 함수(low level graphic functions) 중에서

(1) 제목, XY축 Label 추가하는 title()

(2) XY축의 형태를 변환하는 axis(side, ...)

(3) 직선 연결, 추가 : lines(x, y), abline(a, b), abline(h=y), abline(v=x)

(4) 점 추가 : points(x, y)

에 대해서 알아보았습니다.

 


이번 포스팅에서는 낮은 수준의 그래프 함수 네번째로 (5) 문자 추가 : text(x, y, labels, ...), mtext() 에 대해서 소개하겠습니다.



[ 낮은 수준의 그래프 함수 (Low level graphic function) ]

 

 

 

그래프에 문자를 추가할 때 text() 함수와 mtext() 함수를 사용합니다. 차이점은 text()가 그래프 내에 문자를 추가할 때 사용하는 반면, mtext()는 외부 마진 영역(1 하단, 2 좌측, 3 상단, 4 우측)에 문자를 추가할 때 사용한다는 것입니다.

 

 

text() 함수와 mtext() 함수의 일반적인 사용법은 아래와 같습니다.

 

함수 (function)

사용법 (usage)

 text()

  text(x, y, labels = , pos = , ... )

 mtext()

  mtext("text to place", side = , line = , adj, outer = , ... )

 

 

 함수

옵션 

기능 설명 

 text()

x, y

  문자를 추가할 위치의 x, y좌표.

  단, x, y 좌표 대신에 locator(1) 을 입력하면 커서로 지적하는

  곳에 문자를 추가함

 labels = " "

  추가할 문자

 pos =

  좌표를 기준으로 문자를 입력할 상대적인 위치

   : 1=below, 2=left, 3=above(default), 4=right

 ...

  폰트, 색깔, 크기 등의 그래프 모수 지정

 mtext()

 "text to place"

  추가할 문자

 side =

  문자를 추가할 위치

   : 1=bottom, 2=left, 3=top(default), 4=right

 line =

  문자와 그래프와의 마진 거리

  (to indicate the line in the margin starting with 0 and moving out)

 adj =

  adj=0 : 왼쪽/아래쪽 정렬,

  adj=1 : 위쪽/오른쪽 정렬,

  생략 : 중앙 정렬

  (adj=0 for left/bottom alignment or adj=1 for top/right alignment)

 outer =

  outer=TRUE : 외부마진에 문자 추가

  outer=FALSE : 내부마진에 문자 추가

 ...

  폰트, 색깔, 크기 등의 그래프 모수 지정

 

 

 

MASS 패키지에 내장되어있는 Cars93 데이터프레임의 차 무게 (Weight), 고속도로 연비 (MPG.highway) 변수를 활용해서 산점도를 그리고, 모델명(Model) 변수를 가지고 text를 추가해보겠습니다.

 

> ##-------------------------------------------
> ## adding text to the plot : text(), mtext()
> ##-------------------------------------------
> 
> ## adding text within a plot : text()
> library(MASS)
> attach(Cars93)
> str(Cars93)
'data.frame':	93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...
> 
> plot(Weight, MPG.highway, main = "scatter plot of MPG.highway ~ Weight")
>

 

 
 
> text(x = Weight, y = MPG.highway, labels = Model, pos = 3, cex = 0.5)

 

 

 

 

 

text(x, y, ) 좌표 대신에 text(locator(1), ) 옵션을 사용하면 커서로 문자가 들어갈 위치를 콕 찍어서 지정할 수 있습니다.  reproducible research 관점에서 보면 추천할 만한 방법은 아닌데요, x, y 좌표를 정확히 모르거나, 한번만 간편하게 그래프 그려서 볼 목적이라면 큰 문제는 없겠습니다.

 

 

> # placing text at the point of cursor : locator(1)
> text(locator(1), labels = "Low Mileage Per Gallon")
 

 

> detach(Cars93)

 

 

 

 

다음으로 mtext() 를 사용해서 그래프 외부 마진 영역에 문자를 추가해보는 예제입니다. 

title() 함수로 제목을 추가하는 것과 유사한 측면이 있는데요, mtext()의 경우 여러 개의 그래프를 결합했을 때 외부마진에 그래프 전체를 아우리는 제목을 자유롭게 추가할 수 있다는 유용한 장점이 있습니다.

 

 

> ## places text in one of the four margins : mtext()
> 
> # Save default par values
> op <- par(no.readonly = TRUE)
> 
> # combining 2 graphs in 1 row
> par(mfrow = c(1,2), # 1 row, 2 windows
+     oma = c(2, 2, 4, 1)) # outer margin
> 
> 
> attach(Cars93)
> 
> plot(Weight, MPG.highway, main = "MPG.highway ~ Weight") # plot 1
> plot(Horsepower, MPG.highway, main = "MPG.highway ~ Horsepower") # plot 2
> 

 


> 
> mtext("MPG.highway by Weight, Horsepower", 
+       side = 3, # which margin to place text. 1=bottom, 2=left, 3=top, 4=right
+       line = 1, # to indicate the line in the margin starting with 0 and moving out
+       adj = 2, # adj=0 for left/bottom alignment or adj=1 for top/right alignment
+       cex = 2, # font size
+       outer = TRUE) # outer = TRUE : to place text at outer margin
>

 

 

> > detach(Cars93) > > # Reset par to the default values at startup > par(op)

 

 

다음번 포스팅에서는 범례(legend) 추가하는 방법에 대해서 알아보겠습니다.

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 그래프에 추가적인 정보를 입력하는 낮은 수준의 그래프 함수(low level graphic functions) 중에서

(1) 제목, XY축 Label 추가하는 title()

(2) XY축의 형태를 변환하는 axis(side, ...)

(3) 직선 연결, 추가 : lines(x, y), abline(a, b), abline(h=y), abline(v=x)

에 대해서 알아보았습니다.

 


이번 포스팅에서는 낮은 수준의 그래프 함수 네번째로 (4) 점 추가 : points(x, y) 에 대해서 소개하겠습니다.



[ 낮은 수준의 그래프 함수 (Low level graphic function) ]

 

 

 

points() 함수의 일반적인 사용법은 다음과 같습니다.

 

points(x, y = NULL, type = "p", ...) 

 

 구분

기능 설명 

 x, y

 x, y 좌표 벡터

 (coordinate vectors of points to plot) 

 type = "p"

 그래프 유형 = "점 그래프" 

 ...

 기호 모양(pch), 색깔(col), 크기(cex) 등의 그래프 모수 (parameters) 사용

 

 

 

MASS 패키지에 내장되어 있는 Cars93 데이터프레임의 차량 무게(Weight), 고속도로 연비 (MPG.highway), 차종 (Type) 변수를 사용해서 점을 추가하는 그래프를 실습해보겠습니다.

 

높은 수준의 그래프 함수 중에서 plot(x, y, type = 'p') 로 하면 점 그래프 (points plot)을 그릴 수 있습니다.  아래에 plot(x, y, type = 'p')로 그린 산점도와 points(x, y) 함수로 점을 추가한 그래프 예시를 들어보았습니다.  정확히 두 개 그래프가 일치합니다. 

 

> ##-----------------------------------------
> ## adding points() : point(x, y)
> ##-----------------------------------------
> 
> # to use Cars93 dataframe
> library(MASS)
> str(Cars93)
'data.frame':	93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...
> 
> # scatter plot
> attach(Cars93)
> 
> plot(Weight, MPG.highway, type = 'p') # points plot

 

 

 

> # adding points to the current plot > plot(Weight, MPG.highway, type = 'n') # blank plot > points(Weight, MPG.highway) # exactly the same with the upper points plot

 

 

 

 

 

그러면 왜 굳이 points() 라는 낮은 수준의 함수를 가지고 점을 추가하려고 하는 것인지 의문이 들것입니다. 그 이유는 points() 함수를 가지고 필요에 따라서 순차적으로 점을 추가할 수 있고, 조건을 부여하고 그래프 모수 중에 색깔이나 기호 모양 등을 다르게 해서 탐색적 분석을 진행하는데 유용하기 때문입니다.  물론 plot(x, y, type = 'p')로 원하는 그래프를 그릴 수 있다면 points() 함수를 사용할 필요는 없겠지요.  아래에 points()의 몇 가지 사용 형태를 보시고 필요한 상황에 맞게 골라 쓰면 되겠습니다.

 

아래에는 차종(Type)별로 기호 모양과 색깔을 달리하면서 무게(Weight)와 고속도로 연비(MPG.highway) 산포도를 그려보겠습니다.  2차원의 x, y 공간에 차종(Type)이라는 제3의 차원을 추가해서 볼 수 있는 매우 유용한 방법입니다. 대신 Base Graphics 에서는 조건의 갯수만큼 손이 참 많이 가는 단점이 있습니다 (참고로, ggplot2 plotting system을 사용하면 조건에 따른 색이나 기호를 달리하도록 지정하는게 한 줄이면 끝나고, 범례(legend)도 알아서 추가해주므로 편합니다)

 

 

> # adding points to the current plot with pch, col, cex parameters
> plot(Weight, MPG.highway, type = 'n') # blank plot
> points(Weight, MPG.highway, pch = 15, col = "blue", cex = 1.5)
 

 

 

 

 

> # adding points with different characters by condition
> plot(Weight, MPG.highway, type = 'n') # blank plot
> 
 

 


> table(Cars93$Type)

Compact   Large Midsize   Small  Sporty     Van 
     16      11      22      21      14       9 
> 
> # Type = Compact
> points(Weight[Type == "Compact"], MPG.highway[Type == "Compact"], pch = 0)
> 

 


> # Type = Large
> points(Weight[Type == "Large"], MPG.highway[Type == "Large"], pch = 1)
> 

 


> # Type = Midsize
> points(Weight[Type == "Midsize"], MPG.highway[Type == "Midsize"], pch = 17, col = "yellow")
> 

 


> # Type = Small
> points(Weight[Type == "Small"], MPG.highway[Type == "Small"], pch = 3)
> 

 

 

> # Type = Sporty
> points(Weight[Type == "Sporty"], MPG.highway[Type == "Sporty"], pch = 9)
> 

 


> # Type = Van
> points(Weight[Type == "Van"], MPG.highway[Type == "Van"], pch = 15, col = "blue")
> 
> title("adding points with different characters by Car Types")
> 

 

 

 


> 
> # adding legend to topright side
> legend("topright", 
+        c("Compact", "Large", "Midsize", "Small", "Sporty", "Van"), 
+        col = c("black", "black", "yellow", "black", "black", "blue"), 
+        pch = c(0, 1, 17, 3, 9, 15)
+        )
> 

 

 


> detach(Cars93) 

 

 

다음번 포스팅에서는 text(), mtext() 함수로 문자(text)를 추가하는 방법에 대해서 알아보겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

728x90
반응형
Posted by Rfriend
,

지난번 포스팅에서는 그래프에 추가적인 정보를 입력하는 낮은 수준의 그래프 함수(low level graphic functions) 중에서 (1) 제목, XY축 Label 추가하는 title(), (2) XY축의 형태를 변환하는 axis(side, ...)에 대해서 알아보았습니다.


이번 포스팅에서는 낮은 수준의 그래프 함수 두번째로 (3) 직선 연결, 추가 : lines(x, y), abline(a, b), abline(h=y), abline(v=x) 에 대해서 소개하겠습니다.



[ 낮은 수준의 그래프 함수 (Low level graphic function) ]

 

 

 

MASS 패키지에 들어있는 Cars93 데이터프레임의 Weight (차의 무게)MPG.highway (고속도로 연비) 두 개의 변수를 가지고 산포도를 그린 후에, lines() 함수로 선형 회귀식을 추가해보고, abline() 함수로 x축과 y축의 평균으로 수직선과 수평선을 추가하여 보겠습니다.

 

 

line()함수의 일반적인 사용법은 다음과 같습니다.

 

lines(x, y = NULL, type = "l", ...)

 

 구분

기능 설명 

 x, y

  x, y 좌표 벡터

 (coordinate vectors of points to join)

 type = "l"

 선(line) 그래프라는 뜻임

 (character indicating the type of plotting)

 ...

 선 유형 (lty), 선 색깔 (col), 선 두께(lwd) 등의 그래프 모수 입력

 (Further graphical parameters)

 

 

 

 

abline() 함수의 사용법은 다음과 같습니다.

 

abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL,
       coef = NULL, untf = FALSE, ...) 

 구분

기능 설명 

a, b 

 절편과 기울기, 단일 값

 (the intercept and slope, single values)

 h

 y값을 지나는 수평인 직선

 (the y-value(s) for horizontal line(s).)

 v

 x값을 지나는 수직인 직선

 (the x-value(s) for vertical line(s).)

 reg

 회귀직선 추가

 (an object with a coef method)

 coef

 절편과 기울기로 이루어진 벡터

 (a vector of length two giving the intercept and slope)

 untf

 변환 안된 값을 쓸지를 묻는 옵션. 만약 y값을 로그변환한 경우 untf = TRUE 라고 설정하면 로그변환 전의 원래값 기준으로 좌표에 그래프가 그려짐

 (logical asking whether to untransform.

If untf is true, and one or both axes are log-transformed, then a curve is drawn corresponding to a line in original coordinates, otherwise a line is drawn in the transformed coordinate system. The h and v parameters always refer to original coordinates)

* 출처 : http://sites.stat.psu.edu/~dhunter/R/html/graphics/html/abline.html

 

 

 

먼저 lm() 함수를 사용해서 y = MPG.highway (고속도로 연비), x = Weight (차의 무게) 변수 간의 선형 회귀모형을 만들면 아래와 같습니다.

 

> ##------------------------------------ > ## adding lines to a plot > ##------------------------------------ > > # fitting regression model > library(MASS) # to use Cars93 dataframe > str(Cars93) 'data.frame': 93 obs. of 27 variables: $ Manufacturer : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ... $ Model : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ... $ Type : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ... $ Min.Price : num 12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ... $ Price : num 15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ... $ Max.Price : num 18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ... $ MPG.city : int 25 18 20 19 22 22 19 16 19 16 ... $ MPG.highway : int 31 25 26 26 30 31 28 25 27 25 ... $ AirBags : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ... $ DriveTrain : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ... $ Cylinders : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ... $ EngineSize : num 1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ... $ Horsepower : int 140 200 172 172 208 110 170 180 170 200 ... $ RPM : int 6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ... $ Rev.per.mile : int 2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ... $ Man.trans.avail : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ... $ Fuel.tank.capacity: num 13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ... $ Passengers : int 5 5 5 6 4 6 6 6 5 6 ... $ Length : int 177 195 180 193 186 189 200 216 198 206 ... $ Wheelbase : int 102 115 102 106 109 105 111 116 108 114 ... $ Width : int 68 71 67 70 69 69 74 78 73 73 ... $ Turn.circle : int 37 38 37 37 39 41 42 45 41 43 ... $ Rear.seat.room : num 26.5 30 28 31 27 28 30.5 30.5 26.5 35 ... $ Luggage.room : int 11 15 14 17 13 16 17 21 14 18 ... $ Weight : int 2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ... $ Origin : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ... $ Make : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ... > > # fitting regression model

> fit_1 <- lm(MPG.highway ~ Weight, data = Cars93)
> fit_1

Call:
lm(formula = MPG.highway ~ Weight, data = Cars93)

Coefficients:
(Intercept)       Weight  
  51.601365    -0.007327  

> 
> names(fit_1)
 [1] "coefficients"  "residuals"     "effects"       "rank"          "fitted.values" "assign"       
 [7] "qr"            "df.residual"   "xlevels"       "call"          "terms"         "model" 

 

 

 

 

다음으로, Weight (무게)와 MPG.highway (고속도로 연비)의 두 변수 산포도를 그리고, 위에서 만든 선형 회귀선을 추가해보겠습니다.

 

세가지 방법이 있는데요, (1) lines() 를 사용하는 방법, (2) abline(reg = ) (3) abline(a = coef[1], b = coef[2]) 를 사용하는 방법은 아래와 같습니다.  참고로, 그래프 모수(parameters)로서 색깔 지정은 col, 선 유형 지정은 lty, 선 두께 지정은 lwd 를 사용하면 됩니다.

 

> ## adding regression line to the current plot 
> # (1) lines()
> with(Cars93, plot(MPG.highway ~ Weight)) # scatter plot of MPG.highway~Weight
> lines(Cars93$Weight, fit_1$fitted.values, col = "blue")
> title("adding regression line : lines()")
>

 

 
 
> # (2) abline(reg = regression_model)
> with(Cars93, plot(MPG.highway ~ Weight))
> abline(reg = fit_1, col = "red", lwd = 3)
> title("adding regression line : abline(reg = )")

 

 

 

 

> # (3) abline(a = fit_1$coef[1], b = fit_1$coef[2])
> with(Cars93, plot(MPG.highway ~ Weight))
> abline(a = fit_1$coef[1], b = fit_1$coef[2], col = "black", lwd = 3)
> title("adding regression line : abline(a = coef[1], b = coef[2])")
 

 

> fit_1$coef # coefficients of regression model
 (Intercept)       Weight 
51.601365429 -0.007327059 
> fit_1$coef[1] # intercept
(Intercept) 
   51.60137 
> fit_1$coef[2] # slope
      Weight 
-0.007327059

 

 

 

 

 

이번에는 loess.smooth() 함수로 비모수 회귀곡선을 적합시키고, lines() 함수로 smoothed regression line을 현재 그래프에 추가해보는 방법을 소개하겠습니다.

 

 

> ## adding smoothed regression line to the current plot : lines(), loess.smooth()
> # (1) fitting non-parametric regression model
> fit_2 <- loess.smooth(x = Cars93$Weight, y = Cars93$MPG.highway)
> names(fit_2)
[1] "x" "y"
> fit_2
$x
 [1] 1695.000 1744.184 1793.367 1842.551 1891.735 1940.918 1990.102 2039.286 2088.469 2137.653 2186.837
[12] 2236.020 2285.204 2334.388 2383.571 2432.755 2481.939 2531.122 2580.306 2629.490 2678.673 2727.857
[23] 2777.041 2826.224 2875.408 2924.592 2973.776 3022.959 3072.143 3121.327 3170.510 3219.694 3268.878
[34] 3318.061 3367.245 3416.429 3465.612 3514.796 3563.980 3613.163 3662.347 3711.531 3760.714 3809.898
[45] 3859.082 3908.265 3957.449 4006.633 4055.816 4105.000

$y
 [1] 39.05844 38.65762 38.25380 37.84773 37.44017 37.03186 36.62354 36.21598 35.80991 35.40608 35.00525
[12] 34.60816 34.21556 33.82819 33.44088 33.04477 32.64639 32.25277 31.87094 31.50659 31.12467 30.72543
[23] 30.33416 29.97614 29.67667 29.41625 29.13676 28.87440 28.64798 28.41000 28.15500 27.88244 27.59175
[34] 27.28236 26.95371 26.61829 26.29738 25.97022 25.64311 25.35443 25.08312 24.80615 24.50784 24.21370
[45] 23.92687 23.64517 23.36640 23.08837 22.80889 22.52576

> 
> # (2) scatter plot, adding smoothed regression line
> with(Cars93, plot(MPG.highway ~ Weight))
> lines(fit_2$x, fit_2$y, col = "blue", lwd = 3)
> title("adding smoothed regression line: lines(), loess.smooth()")
 

 

 

 

 

 

 

> ## drawing horizontal or vertical straight lines : abline()
> with(Cars93, plot(MPG.highway ~ Weight))
> # (1) vertical line
> abline(v = mean(Cars93$Weight), col = "black", lty = 3, lwd = 2) 
> 
> # (2) horizontal line
> abline(h = mean(Cars93$MPG.highway), col = "blue", lty = 3, lwd = 2)
> 
> title("drawing horizontal or vertical straight lines : abline()")

 

 

 

 

다음번 포스팅에서는 points() 함수로 점을 추가하는 방법을 소개하겠습니다.

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 

728x90
반응형
Posted by Rfriend
,