레이블이 data analysis인 게시물을 표시합니다. 모든 게시물 표시
레이블이 data analysis인 게시물을 표시합니다. 모든 게시물 표시

2019년 5월 21일 화요일

[IT] 주소 위도 경도 변환 사이트


주소를 입력하면 위도,경도로 변환해주는 사이트
매번 찾아 쓰는 것도 귀찮고 만들면 되는데 그것도 귀찮고 


1. 다울주소전환서비스
http://www.dawuljuso.com/


2. 국토연구원
http://geeps.krihs.re.kr/geocoding/service_page


2018년 12월 20일 목요일

[IT] MS PowerBI - on-Premise 데이터 게이트웨이 사용


* 고려하게 된 배경

on-promise 내부에 있는 데이터를 클라우드에서 또는 외부(망 외부) 도구를 활용하여 데이터을 접근하고자 할때 내부 시스템 데이터에 접근하는 것이 한계가 있습니다. 이러한 방법보다 더 좋은 구성이 훨씬더 많겠으나 이러한 것도 있지 않을까 하며 찾다가 보니 한번 해봤습니다. 지극히 개인적으로 MS 제품을 잘 사용하지 않다보니 어색하기도 합니다.

- MS PowerBI Pro 버전 사용
- MS Azure 사용
- MS Office365 사용


* 상황
1. 내부의 데이터중 정제된 일부 데이터를 외부 공간으로 보내고 싶다.

2. 실제 데이터는 회사 내부 시스템 공간 데이터베이스에 있다.

3. BI 도구는 MS PowerBI 클라우드 버전을 사용한다.

4. 대시보드를 조직구성원에 일자별 업데이트된 내용으로 공유하고자 한다.

** 사전 전제 조건
MS - OFFICE365 또는 AZURE AD등 조직구성등록이 되어 있어야 가능 함


1. PowerBI - 데이터 게이트 웨이 설치 및 관리

 웹 클라우드 버전 로그인 후
 다운로드 메뉴 에서 데이터 게이트웨이 다운로드 후 설치

 * 설치 과정은 마이크로소포트에서 자세한 안내가 있다. 

 - 데이터 게이트 웨이 안내
  https://powerbi.microsoft.com/ko-kr/gateway/

 - 설치 안내 사이트
  https://docs.microsoft.com/ko-kr/power-bi/service-gateway-install 


 * 설치 과정정에서 생성하는 클라우드 Azure에서의 데이터게이트 웨이 생성이 있다.
   기존에 설치된 것이 있다면 인증 후 선택 할 수 있고 없다면 새로 생성 할 수 있다.

  현재(2018년 12월) 까지는 리전이 국내 중부/남부에는 아직 제공되지 않고 아시아 남동부로만 제공하는 것이 아쉽(?)다. 테스트 상태에서는 크게 이슈나 차이를 잘 모르겠으나 전문가가 아닌이상 더이상의 설명은 어렵겠다.


 * 설치 과정을 마무리 한 이후에 On-Premise 의 데이터 원본과 연결하는 정보를 입력하고 연결 할 수 있다.
 https://docs.microsoft.com/ko-kr/power-bi/service-gateway-manage


내부 조직원을 위한 공유로 사용을 테스트 하는 과정에서 알게 된 것인데 시각화 툴들이 아주 저렴하게 시장에 많이 나와있다. 다양한 종류들도 마찬가지이며 레포트나 대시보드를 공유하고 사용하려면 제품마다 넘어야 할 산들이 많은데 그중에 가장 큰 것이 과금체계인 것 같다. MS PowerBI 역시 클라우드에서 제공하는 공유 (Power BI Embedded)를 사용하는 경우는 비용이 기하급수로 증가 한다. 테스트 한번 해보려다 헉(!) 하고 놀랬다는 좀더 유연한 솔루션은 없는지 오늘도 찾아 헤메어 보려 한다. 

내부의 시스템에서 결국 클라우드로 전환 되어야 한다는 흐름에는 동의 하는데 아직도 망설이게 되는 것들이 과연 그것이 진정으로 비용절감인가가 몸에 와닿지 않는것은 나뿐일까.

2017년 6월 21일 수요일

[수학] 통계가 빨라지는 수학력 - 메모 1 배수 찾기


2의 배수 - 맨 끝의 숫자가 짝수
3의 배수 - 각 자릿수의 합이 3의 배수
4의 배수 - 아래 두 자리수가 4의 배수이거나 00
5의 배수 - 맨 끝의 숫자가 0 이거나 5
6의 배수 - 맨 끝의 자리수가 짝수이고 또 각 자릿수의 합이 3의 배수
7의 배수 - 1의 자릿수를 없앤 수' - '1의 자릿수를 2배 한 수'가 7의 배수

예) 581 = 58 -1 * 2 = 56 = 7의 배수

8의 배수 - 아래 세 자릿수가 8의 배수이거나 000
9의 배수 - 각 자릿수의 합이 9의 배수
10의 배수 - 맨 끝이 0
11의 배수 - '홀수 자릿수의 숫자의 합' - '짝수 자릿수의 숫자의 합'이 11의 배수

예) 2816 = 8+6) - (2+1) = 11 ( 11은 11의 배수 )

2016년 12월 8일 목요일

[이야기] CRM (고객관계관리) 시스템에서 사람을 배우다. - 외식업 버전

CRM을 개발한다. 운영 관리 한다는 내용으로 전산실 이야기를 풀어 보고자 한다. 내가 일하는 부서는 레스토랑을 운영하는 회사의 POS, ERP, CRM 시스템을 개발/운영 중인 조직이다. 살 얼음 같은 정보공개의 유무를 오가며 생각을 공유해 보고 싶다.

외식업 안에서 대기업에서 운영 관리 하는 회사를 제외하곤 전산팀/실을 직접 운영하는 곳은 손가락에 꼽힌다고 한다. 아니 어쩌면 그들만의 리그에서 서로 협업을 하거나 함께 고민을 해보자는 어떤 이야기도 없는 것을 보면 있어도 없다고 생각하는 쪽이 맞는 것이라고 생각을 한다. 또한 그 안에서도 자체 시스템(여기서 말하는 시스템은 IT 시스템의 제한적인 표현 임을 밝혀 둔다)을 운영관리 하는 것은 찾아 보기 더 힘든 것 중에 하나이다.

그런 찾아 보기 힘든 곳이 있으나 사실 알고 보면 의외로 많다. 이런 이야기들을 공개적으로 하는 것이 조심스럽기도 하고 뭔가 IT에 관한 전문적인 이야기가 나와야 할것 같고 관련 정보와 지식을 나열해야 할것 같은 스트레스를 받을 지도 모르겠다. 이 글은 CRM을 전문적으로 공부 하지도 또 그러한 연구를 하지도 않았을 뿐더러 그런 사람들을 대상으로 작성한 글도 아님을 밝힌다. 그럼 도대체 이런 글을 쓰는 이유는 무엇인가? 나와 같은 업종에서 전산이란 이름으로 불리는 사람들이 현업의 요구와 필요에 따라 시스템을 개발/운영관리 해야 하는 사람들에게 우리도 이러한 관점으로 발전시켜 나가는 것이 어떻겠는가 하는 의견 개진과 나 스스로의 생각들을 정리해 나가는 것이라고 보면 정확하다.


* CRM을 개발 한다는 것은 고객의 접점에 관한 고민이다.
시스템을 개발/운영하기 위해서 우리는 라이프 사이클(생명주기)와 같은 것에 관심을 갖게 된다. 그럼 시작이 어디냐? 하는 그런 원초적인 질문 말이다. 내 주변의 많은 많은 사람들은 일단 가입을 해야 되는거 아니냐 라고 말하겠지만 ( 문득 내 주변이 이상한 거야 라고 하면 어쩔 수 없다. 나를 탓해야지 ) 우리가 가져야 할 관점은 그 보자 좀더 광범위하게 가져 보는 것은 어떤가 하고 생각을 해 보았다. 내가 한번 그 사람들이 되어 보는 것이다. 글애 나라면 만약에 나를 기준으로 좀더 생각을 해본다. 상당히 쉽지 않은 생각이다. 자꾸 바이러스가 들어가서 자꾸 조직내 시스템과 프로세스를 집어 넣게 된다. 여하튼 그러한 고민들 통해서 아래와 같은 분할을 해 보았다.


[고객 접점의 분류 - 그림1]

고객은 레스토랑에 방문하기 전과 방문 그리고 방문한 이후에 진행되는 크게 3단계로 구분해서 볼 수 있다. 이러한 3단계의 구분에 상황과 형태는 다른지 모르나 이 3단계의 반복을 통해 우수고객이 될 수도 또는 한번 방문 하고 그걸로 끝인 고객이 될 수도 처음부터 방문하지도 않을 고객이 될 수 도 있다. 이와 같은 상황에서 우리는 보통 현업의 입과 눈빛을 마주하게 된다. 상세히 설명을 해주는 친절한 현업을 만나기는 하늘에 별을 따다 주세요라고 말하는 것과 같지 않을까 싶다. 그렇다고 친절한 부연설명과 안내가 있다고 하더라도 그걸 잘 받아줄 전산담당자도 그리 많지 않다는게 현실일 뿐이다. 씁슬하다. 뭐 나는 어떤 사람이라고 말하는건 좀 말할 자격이 안되는 것 같다. 그냥 스스로의 점수를 줘보자면 51점이면 후한 점수 아닐까 생각한다.

논점에서 벗어 났다. 우리가 고민하는 고객의 접점과 그 접점 사이에서의 우리가 해야 할 일들을 나열하고 정리 하다 보면 우리가 개선해야 하는 것들은 명확하다. 밖의 세상에서 IoT가 대세이고 O2O가 인기이며 분석을 하면 빅데이터 분석이지 하는 이야기들이 아주 관련이 없는 것은 아니나 인기를 따라가기 보다는 방문하는 고객(사람)에 관심을 더 갖는 것이 중요하다. 어쩌면 데이터의 분석이라는 것에 좀더 좁은 의미는 고객(사람)이 남기는 여러가지 데이터를 분석하고 활용하여 더 친근해질 수 있는 방법을 연구하는 것은 아닐까 생각이 든다. 물론 연구만 해서는 될 일이 아니겠다. 반복적으로 실행하고 실행된 결과를 기록하고 다시 돌아가 수정하고 반복하는 일들을 하다 보면 고객(사람)과의 관계는 이미 가까워져 있을 지도 모른다.

오래전부터 사고 싶었던(?) 아니 그 책의 내용이 궁금해서 구입하게 된 "CRM 2.0 - 전용준,황순귀 지음"의 책을 보면서 글애.. 글애 맞아 하던 부분이 있다. 바로 우리가 고민하는 고객의 접점의 관리와 개선은 전담 CRM팀이나 CRM 담당자 몇명이서 하는 것이 아니라는 것이다. 물론 이외 다른 여러가지 인사이트는 나의 뒷통수를 치게 만드는 좋은/재미난 말들이 많으므로 CRM과 관련된 업무를 하는 사람이라면 필독을 권한다. 다시 우리 이야기로 돌아 가면 위에서 말했던 접점에 관련되지 않은 조직원은 존재 하지 않을 것으로 본다. 그러한 모든 것들이 유기적으로 돌아 가야 하는 것이 맞다고 본다. 그러나 조직이 크건 작건 그러한 유기적인 모습을 찾아 보기가 쉽지만은 않다. 이 주제와는 맞지 않는 것 같아 왜 그럴 수 밖에 없는가에 대한 이야기는 다음으로 미뤄보고 우리가 관심가져야 할 것으로 돌아간다.

고객의 접점에서 기록할 수 있는 것에 관심을 가져 보는 것은 어떨까. 이미 많이들 알고 있겠으나 우리가 적용하고 있는 것들을 나열해 보면 다음과 같다. (분석을 위한 별도의 시스템과 구조는 제외 한다)

1) 웹  로그 - 구글 분석 도구 (무료버전)
2) 예약관리 - 직접 연락을 주어 하는경우 ( 내부시스템 )
3) 포스시스템 - 주문/결재 내역 (내부시스템)
4) ERP/CRM - 자원관리/고객정보 (내부시스템)
5) 외부 SNS / 뉴스 텍스트 등 (내/외부 시스템)

나열하다 보니 사실 우리가 고객의 접점을 나열한 것에서 수집될 수 있는 데이터는 극히 제한적이다. 개인정보보호법에 제약적인 사항도 있지만 여러가지 문제(?) 또는 제약으로 인하여 수집하거나 보관 또는 기록 할 수 있는 있는 방법이 별로 없다.

2016년 11월 14일 월요일

[Tip] Qlik.Printing.Sense.Service stopped working



If you see the above message, you can solve as follows.

1. Please, start Command Prompt as an administrator by right-clicking it and select Run as administrator.

2. Enter this command to reset the network adapter (end with the Enter key):
netsh winsock reset

3. Restart the computer.

4. Please, delete these two files:
C:\WINDOWS\system32\LavasoftTcpService64.dll
C:\WINDOWS\SysWOW64\LavasoftTcpService.dll (only for 64-bit Windows)


Reference URL
- https://community.qlik.com/thread/181612 (Qlik Community)
- http://hummingbird.tistory.com/6001 (LavaSoft)


2016년 8월 9일 화요일

[Python] Python - Mac Book Aire 에서 사용시 IDLE 한글 깨짐 현상


파이썬을 시작하면서 Mac에서 연습을 시작하는데 처음 부터 한글이 걸린다.
물론 기타 에디터도 있었고 일반 터미널에서 실행 하면 한글 처리에 대해서 고민하지 않아도 되는데 이상하게 IDLE 에서 실행 하면 안된다.

아래와 같은 메세지를 보면 알겠지만.


가반히 보면 뭔가 WARNING 메세지가 있다.  해당하는 링크로 가서 현재 정보를 보았다.









Comment에 나오는 버전을 찾아서 설치 하면 된다. 참 쉽다. 역시 메세지는 거짓을 고하지 않는다. 

2016년 5월 31일 화요일

[Data Analysis] 산포도와 상관계수 - ( degree of scattering & coefficient of correlation )


회사에서 분석을 하게 되면 변수들 간의 어떠한 관계가 있는가에 대한 것으로 시작을 하게 되는 경우가 많다. 우리 매장의 숫자와 매출과의 관계는 어떻되지? 우리 매장의 면적과 매출과의 관계는? 고객수와 매출과의 관계는? 이러한 궁금증 또는 질문들에 대한 답을 들어 보고자 한다면 산포도와 상관계수 값을 확인함으로 해서 그 일을 시작 할 수 있다. 시작할 수 있다고 표현하는 이유는 두 변수의 상관관계는 이것을 포함한 더 추가적인 정보들이 모여서 더 나은 의사결정 또는 다음 작업이 이뤄지는 것을 현업에서 보아 왔기 때문이다.

어찌 되었든 이번에 대한 포스트에선 산포도와 상관계수에 대한 이야기만을 간략하게 해보고자 한다. 산포도는 변수 X와 변수 Y가 만나는 지점을 점으로 표현한 그래프이다.

예제 1(학생정보)
> head(DF, 10)
     name  sex age grade absence bloodtype height weight
1  김길동 남자  23     3      유         O  165.3   68.2
2  이미린 여자  22     2      무        AB  170.1   53.0
3  홍길동 남자  24     4      무         B  175.0   80.1
4  김철수 남자  23     3      무        AB  182.1   85.7
5  손세수 여자  20     1      유         A  168.0   49.5
6  박미희 여자  21     2      무         O  162.0   52.0
7  강수친 여자  22     1      무         O  155.2   45.3
8  이희수 여자  23     1      무         A  176.9   55.0
9  이철린 남자  23     3      무         B  178.5   64.2
10 방희철 남자  22     2      무         B  176.1   61.3

plot(DF)

데이터의 상관관계를 가져보이는 변수들로만 좀더 찾아 보게 되면
> DF2 <- data.frame(DF$height, DF$weight)
> DF3 <- cbind(DF2, DF$age)
> plot(DF3)


상관계수값을 확인 해보자
> cor(weight, height)
[1] 0.6641816


두 변수간의 상관계수를 확인하여 보면 다음과 같다. 우리는 이러한 결과 숫자를 확인하여 보고 어떠한 관계인지 해석 할 수 잇다. 상관계수 값은 -1 < 0 < 1 사이의 값을 표현 한다.


-1의 숫자에 가까울 수록 음의 상관관계를 갔고 있고 1의 숫자에 가까울수록 양의 상관관계를 가지고 있다고 해석할 수 있다. 당연히 0이거나 0에 가까울 수록 두 변수는 아무 상관관계를 가지고 있지 않다고 할 수 있다.


* 산포도 - 통계청-통계용어 지표이해
* 상관계수 - 상관계수란 - 나부랭의의 수학블러그

* 작성자의 공통적인 변
데이터 분석의 전문가는 아니지만 현업에서 기업의 데이터를 활용하여 분석 또는 분석의 전단계 까지의 데이터 정제(클린징)과 데이터의 분석을 위한 탬플릿 또는 모델링을 하게 되는 경우가 많다. 규모가 좀더 크고 인원이 지원되는 회사라면 각 파트별 각 업무별 로직과 조직(인원)이 있을 것이나 그러하지 못한것이 장점이되기도 한다. 회사의 자료를 외부에 오픈 하기 위한 용도나 목적은 아니며 개인적인 업무(지식)에 대한 정리 차원이라고 생각해 주었으면 한다. 어떤 경우 외부에서 검색을 통해 들어와 확인하게 되었다면 나와 같은 일을 하는 또는 하고자 하는 학생들에게 맞보기가 되어 보길 바란다.

2014년 6월 12일 목요일

[SAF 데이터분석과정 참고] # 통계기초 - 모집단(Population), 표본집단(Sample)

모집단(Population) 이란 어떤 정보를 얻고자 하는 전체 대상 또는 전체 집합을 의미 한다. 그러나 이에 반에 표본집단(Sample)은 모집단으로 부터 추출된 모지받느이 부분 집합으로 이해할 수 있다.

예를들어 2회 이상 방문하신 남성고객과 여성고객의 평균매출금액을 비교한다고 할때 여기서 모집단은 2회이상 방문한 남성고객의 평균매출과 2회이상 방문한 여성고객의 평균매출이 된다. 모든 데이터를 확인하여 얼마나 차이가 있는지 두개의 집단을 비교 분석 할 수 있을지 모른다. 전수조사를 하는것보다 전체 모집단에서 일부분을 추출하여(표본집단) 그 차이를 비교하면 알수 있다. 하지만 전수조사와 같이 100% 정확하다고 말할 순 없다. 표본 집단은 이렇게 모집단을 대표할 수 있는 부분집합이라고 할 수 있는데 비록 정확도가 떨어지긴 하지만 설계하는 방법에 따라 표준집단을 통해 모집단의 특성을 99% 혹은 그 이상의 신뢰도를 가지고 추정할 수 있다.

통계학은 이렇게 실질적, 경제적 또는 그 외 다른 이유로 그 값을 모두 측절할 수 없는 모 집단이 있다고 할 때, 허용될 수 있는 오차 또는 신뢰도를 만족할 수 있는 최소한의 표본을 추출한 후 표본 집단에서 관측 또는 측적된 값으로 모집단의 특성을 추정하는 방법 이라고 할 수 있다. 모집단의 특성을 나타내는 중요한 수치로 평균, 중앙값, 표준편차등의 값이 있다.

표본집단을 추출할 때에는 아래와 같은 사항을 반드시 고려

1) 추출할 표본집단의 크기 ( Sample Size  )
2) 표본 추출 방법 ( Sampling Method )

일반적으로 표본을 추출할때는 무작위 표본 추출(Random Sampling)을 사용한다. 서로 관련성이 없는 표본만을 추출하는 것을 의미 함.

[이미지출철-췌인양의블러그]


* 사전적의미
모집단(population) : 통계적인 관찰의 대상이 되는 집단 전체
표본(Sample) : 전체 모집단의 축도 또는 단면이 된다는 가정하에서 모집단에서 선택된 모집단 구성단위이 일부

2014년 6월 2일 월요일

[SAF] 데이터분석 과정 2주차 - 기초 실습

#1 - 변수 값 할당 
##대입연산자 <- 단축키 (  Alt + - )
a <- 1
x <- 3 
print(a)
## [1] 1
print(x)
## [1] 3
#2 - 변수를 출력하는 방식 - print()
x <- c("TR", "MG", "SH", "KR")
print(x)
## [1] "TR" "MG" "SH" "KR"
#3 - 변수 연산
print(c(1*pi, 2*pi, 3*pi, 4*pi))
## [1]  3.142  6.283  9.425 12.566
#4 - 변수 논리값 
c(TRUE, FALSE, TRUE, FALSE)
## [1]  TRUE FALSE  TRUE FALSE
c(true, false, true)
## Error: 객체 'true'를 찾을 수 없습니다
#5 - 변수 결합
v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
v3 <- c(v1, v2)
v3
## [1] 1 2 3 4 5 6
#6 - 수열 
1:5
## [1] 1 2 3 4 5
b <- 2:10
b
## [1]  2  3  4  5  6  7  8  9 10
10:19
##  [1] 10 11 12 13 14 15 16 17 18 19
19:10
##  [1] 19 18 17 16 15 14 13 12 11 10
e <- 10:2
e
## [1] 10  9  8  7  6  5  4  3  2
#7 - seq(from=시작점, to=끝점, by=간격)
seq(from=0, to=20, by=2)
##  [1]  0  2  4  6  8 10 12 14 16 18 20
seq(from=0, to=20, length.out=5)
## [1]  0  5 10 15 20
# 소수점의 표기가 있는 경우 
seq(from=1.0, to=20.0, length.out=5)
## [1]  1.00  5.75 10.50 15.25 20.00
seq(0, 20, by=2)
##  [1]  0  2  4  6  8 10 12 14 16 18 20
seq(0, 10, length=20)
##  [1]  0.0000  0.5263  1.0526  1.5789  2.1053  2.6316  3.1579  3.6842
##  [9]  4.2105  4.7368  5.2632  5.7895  6.3158  6.8421  7.3684  7.8947
## [17]  8.4211  8.9474  9.4737 10.0000
#8 - rep(반복할 내용, 반복할 수)
rep(1, time=5)
## [1] 1 1 1 1 1
rep(1:2, each=2)
## [1] 1 1 2 2
c <- 1:5
c
## [1] 1 2 3 4 5
rep(c,5)
##  [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
rep(c, each=5)
##  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
#9 - paste(" 붙일 내용붙일 내용 " , sep= '''')
A <- c( " a" , "b" , "c")
A
## [1] " a" "b"  "c"
paste( "a" , "b" , sep="")
## [1] "ab"
paste(A , c("d", "e"))
## [1] " a d" "b e"  "c d"
f <- paste( A, 10)
f
## [1] " a 10" "b 10"  "c 10"
paste(A , 10, sep= "")
## [1] " a10" "b10"  "c10"
paste(A,1: 10, sep="_" )
##  [1] " a_1"  "b_2"   "c_3"   " a_4"  "b_5"   "c_6"   " a_7"  "b_8"  
##  [9] "c_9"   " a_10"
paste("Everybody" , "loves" , "cats.")
## [1] "Everybody loves cats."
#10 - Substr(문자열 , 시작, 끝)
substr ("BigDat aAnalys i s" , 1,4)
## [1] "BigD"
ss <- c( "Moe ", "Larry", "Cur ly")
substr (ss , 1, 3)
## [1] "Moe" "Lar" "Cur"
#11 - 논리값 & 논리연산자
a <- 3 
a == pi
## [1] FALSE
a != pi
## [1] TRUE
a < pi
## [1] TRUE
a <= pi
## [1] TRUE
a > pi
## [1] FALSE
a >= pi 
## [1] FALSE
#12 - Matrix 
# matrix( 이름, 행 수, 열 수)
# dim() 행렬의 행과 열 수를 반환
theData<- c(1.1, 1.2, 2.1, 2.2, 3.1,3.2)
mat<-matrix(theData ,2, 3)
mat
##      [,1] [,2] [,3]
## [1,]  1.1  2.1  3.1
## [2,]  1.2  2.2  3.2
dim(mat)
## [1] 2 3
diag(mat)
## [1] 1.1 2.2
#diag( 행렬) 행렬의 대 각선 에 있는 값을 반환

#t() Matrix Transpose
t(mat)
##      [,1] [,2]
## [1,]  1.1  1.2
## [2,]  2.1  2.2
## [3,]  3.1  3.2
help(t)
## starting httpd help server ... done
# colnamesO 열 네임을 조회
# rownamesO 행 네임을 조회
mat
##      [,1] [,2] [,3]
## [1,]  1.1  2.1  3.1
## [2,]  1.2  2.2  3.2
colnames(mat) <- c(" IBM" , "MS", "GOOGLE" )
rownames(mat) <- c( "IBM" , "MS")

mat[1,] #첫째 행
##    IBM     MS GOOGLE 
##    1.1    2.1    3.1
mat[,3] #셋째 열
## IBM  MS 
## 3.1 3.2
A <- matrix(0, 4,5)
A <- matrix(1:20 ,4, 5)
A
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20
#1행, 4행, 2열, 3열 조회 
A[c(1, 4), c(2, 3)]
##      [,1] [,2]
## [1,]    5    9
## [2,]    8   12
#값을 대체 
A[c(1 , 4) , c(2 ,3)] <- 1


#13 - List() 리스트에서 원소들은 다른 모드
lst <- list(3.14, "Mode", c(1 , 1.2, 3), mean)
lst
## [[1]]
## [1] 3.14
## 
## [[2]]
## [1] "Mode"
## 
## [[3]]
## [1] 1.0 1.2 3.0
## 
## [[4]]
## function (x, ...) 
## UseMethod("mean")
## <bytecode: 0x00000000085711a0>
## <environment: namespace:base>
a <-1:10
b <- matrix(1:10, 2, 5)
c <- c("name1", "name2")
alst <- list(a=a , b=b , c=c)
alst
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $b
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
## 
## $c
## [1] "name1" "name2"
str(alst)
## List of 3
##  $ a: int [1:10] 1 2 3 4 5 6 7 8 9 10
##  $ b: int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
##  $ c: chr [1:2] "name1" "name2"
alst$a
##  [1]  1  2  3  4  5  6  7  8  9 10
alst$b
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
alst$c
## [1] "name1" "name2"
alst[[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
alst[[1]][[2]]
## [1] 2
#14 - Dataframe 
a <- c(1 , 2, 4, 6, 3,4)
b <- c(6 , 4 , 2, 4, 3.2 , 4)
c <- c(7 , 6 , 4, 2, 5,6)
d <- c(2 , 4 , 3, 1, 5, 6)
e <- data.frame(a , b, c, d)
e
##   a   b c d
## 1 1 6.0 7 2
## 2 2 4.0 6 4
## 3 4 2.0 4 3
## 4 6 4.0 2 1
## 5 3 3.2 5 5
## 6 4 4.0 6 6
# rbind(dfrml, dfrm2) 두 데이터 프레임의 행을 추가 할 때 사용
# cbind(dfrml, dfrm2) 두 데이터 프레임의 열을 추가 할 때 사용
data(iris)
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
newRow <- data.frame (Sepal.Length=3.0, Sepal.Width=3.2, Petal.Length=1.6, Petal.Width=0.3, Species="newsetosa")
newRow               
##   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 1            3         3.2          1.6         0.3 newsetosa
iris <- rbind(iris , newRow)
iris
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1            5.1         3.5          1.4         0.2     setosa
## 2            4.9         3.0          1.4         0.2     setosa
## 3            4.7         3.2          1.3         0.2     setosa
## 4            4.6         3.1          1.5         0.2     setosa
## 5            5.0         3.6          1.4         0.2     setosa
## 6            5.4         3.9          1.7         0.4     setosa
## 7            4.6         3.4          1.4         0.3     setosa
## 8            5.0         3.4          1.5         0.2     setosa
## 9            4.4         2.9          1.4         0.2     setosa
## 10           4.9         3.1          1.5         0.1     setosa
## 11           5.4         3.7          1.5         0.2     setosa
## 12           4.8         3.4          1.6         0.2     setosa
## 13           4.8         3.0          1.4         0.1     setosa
## 14           4.3         3.0          1.1         0.1     setosa
## 15           5.8         4.0          1.2         0.2     setosa
## 16           5.7         4.4          1.5         0.4     setosa
## 17           5.4         3.9          1.3         0.4     setosa
## 18           5.1         3.5          1.4         0.3     setosa
## 19           5.7         3.8          1.7         0.3     setosa
## 20           5.1         3.8          1.5         0.3     setosa
## 21           5.4         3.4          1.7         0.2     setosa
## 22           5.1         3.7          1.5         0.4     setosa
## 23           4.6         3.6          1.0         0.2     setosa
## 24           5.1         3.3          1.7         0.5     setosa
## 25           4.8         3.4          1.9         0.2     setosa
## 26           5.0         3.0          1.6         0.2     setosa
## 27           5.0         3.4          1.6         0.4     setosa
## 28           5.2         3.5          1.5         0.2     setosa
## 29           5.2         3.4          1.4         0.2     setosa
## 30           4.7         3.2          1.6         0.2     setosa
## 31           4.8         3.1          1.6         0.2     setosa
## 32           5.4         3.4          1.5         0.4     setosa
## 33           5.2         4.1          1.5         0.1     setosa
## 34           5.5         4.2          1.4         0.2     setosa
## 35           4.9         3.1          1.5         0.2     setosa
## 36           5.0         3.2          1.2         0.2     setosa
## 37           5.5         3.5          1.3         0.2     setosa
## 38           4.9         3.6          1.4         0.1     setosa
## 39           4.4         3.0          1.3         0.2     setosa
## 40           5.1         3.4          1.5         0.2     setosa
## 41           5.0         3.5          1.3         0.3     setosa
## 42           4.5         2.3          1.3         0.3     setosa
## 43           4.4         3.2          1.3         0.2     setosa
## 44           5.0         3.5          1.6         0.6     setosa
## 45           5.1         3.8          1.9         0.4     setosa
## 46           4.8         3.0          1.4         0.3     setosa
## 47           5.1         3.8          1.6         0.2     setosa
## 48           4.6         3.2          1.4         0.2     setosa
## 49           5.3         3.7          1.5         0.2     setosa
## 50           5.0         3.3          1.4         0.2     setosa
## 51           7.0         3.2          4.7         1.4 versicolor
## 52           6.4         3.2          4.5         1.5 versicolor
## 53           6.9         3.1          4.9         1.5 versicolor
## 54           5.5         2.3          4.0         1.3 versicolor
## 55           6.5         2.8          4.6         1.5 versicolor
## 56           5.7         2.8          4.5         1.3 versicolor
## 57           6.3         3.3          4.7         1.6 versicolor
## 58           4.9         2.4          3.3         1.0 versicolor
## 59           6.6         2.9          4.6         1.3 versicolor
## 60           5.2         2.7          3.9         1.4 versicolor
## 61           5.0         2.0          3.5         1.0 versicolor
## 62           5.9         3.0          4.2         1.5 versicolor
## 63           6.0         2.2          4.0         1.0 versicolor
## 64           6.1         2.9          4.7         1.4 versicolor
## 65           5.6         2.9          3.6         1.3 versicolor
## 66           6.7         3.1          4.4         1.4 versicolor
## 67           5.6         3.0          4.5         1.5 versicolor
## 68           5.8         2.7          4.1         1.0 versicolor
## 69           6.2         2.2          4.5         1.5 versicolor
## 70           5.6         2.5          3.9         1.1 versicolor
## 71           5.9         3.2          4.8         1.8 versicolor
## 72           6.1         2.8          4.0         1.3 versicolor
## 73           6.3         2.5          4.9         1.5 versicolor
## 74           6.1         2.8          4.7         1.2 versicolor
## 75           6.4         2.9          4.3         1.3 versicolor
## 76           6.6         3.0          4.4         1.4 versicolor
## 77           6.8         2.8          4.8         1.4 versicolor
## 78           6.7         3.0          5.0         1.7 versicolor
## 79           6.0         2.9          4.5         1.5 versicolor
## 80           5.7         2.6          3.5         1.0 versicolor
## 81           5.5         2.4          3.8         1.1 versicolor
## 82           5.5         2.4          3.7         1.0 versicolor
## 83           5.8         2.7          3.9         1.2 versicolor
## 84           6.0         2.7          5.1         1.6 versicolor
## 85           5.4         3.0          4.5         1.5 versicolor
## 86           6.0         3.4          4.5         1.6 versicolor
## 87           6.7         3.1          4.7         1.5 versicolor
## 88           6.3         2.3          4.4         1.3 versicolor
## 89           5.6         3.0          4.1         1.3 versicolor
## 90           5.5         2.5          4.0         1.3 versicolor
## 91           5.5         2.6          4.4         1.2 versicolor
## 92           6.1         3.0          4.6         1.4 versicolor
## 93           5.8         2.6          4.0         1.2 versicolor
## 94           5.0         2.3          3.3         1.0 versicolor
## 95           5.6         2.7          4.2         1.3 versicolor
## 96           5.7         3.0          4.2         1.2 versicolor
## 97           5.7         2.9          4.2         1.3 versicolor
## 98           6.2         2.9          4.3         1.3 versicolor
## 99           5.1         2.5          3.0         1.1 versicolor
## 100          5.7         2.8          4.1         1.3 versicolor
## 101          6.3         3.3          6.0         2.5  virginica
## 102          5.8         2.7          5.1         1.9  virginica
## 103          7.1         3.0          5.9         2.1  virginica
## 104          6.3         2.9          5.6         1.8  virginica
## 105          6.5         3.0          5.8         2.2  virginica
## 106          7.6         3.0          6.6         2.1  virginica
## 107          4.9         2.5          4.5         1.7  virginica
## 108          7.3         2.9          6.3         1.8  virginica
## 109          6.7         2.5          5.8         1.8  virginica
## 110          7.2         3.6          6.1         2.5  virginica
## 111          6.5         3.2          5.1         2.0  virginica
## 112          6.4         2.7          5.3         1.9  virginica
## 113          6.8         3.0          5.5         2.1  virginica
## 114          5.7         2.5          5.0         2.0  virginica
## 115          5.8         2.8          5.1         2.4  virginica
## 116          6.4         3.2          5.3         2.3  virginica
## 117          6.5         3.0          5.5         1.8  virginica
## 118          7.7         3.8          6.7         2.2  virginica
## 119          7.7         2.6          6.9         2.3  virginica
## 120          6.0         2.2          5.0         1.5  virginica
## 121          6.9         3.2          5.7         2.3  virginica
## 122          5.6         2.8          4.9         2.0  virginica
## 123          7.7         2.8          6.7         2.0  virginica
## 124          6.3         2.7          4.9         1.8  virginica
## 125          6.7         3.3          5.7         2.1  virginica
## 126          7.2         3.2          6.0         1.8  virginica
## 127          6.2         2.8          4.8         1.8  virginica
## 128          6.1         3.0          4.9         1.8  virginica
## 129          6.4         2.8          5.6         2.1  virginica
## 130          7.2         3.0          5.8         1.6  virginica
## 131          7.4         2.8          6.1         1.9  virginica
## 132          7.9         3.8          6.4         2.0  virginica
## 133          6.4         2.8          5.6         2.2  virginica
## 134          6.3         2.8          5.1         1.5  virginica
## 135          6.1         2.6          5.6         1.4  virginica
## 136          7.7         3.0          6.1         2.3  virginica
## 137          6.3         3.4          5.6         2.4  virginica
## 138          6.4         3.1          5.5         1.8  virginica
## 139          6.0         3.0          4.8         1.8  virginica
## 140          6.9         3.1          5.4         2.1  virginica
## 141          6.7         3.1          5.6         2.4  virginica
## 142          6.9         3.1          5.1 "aperm"  virginica
## 143          5.8         2.7          5.1         1.9  virginica
## 144          6.8         3.2          5.9         2.3  virginica
## 145          6.7         3.3          5.7         2.5  virginica
## 146          6.7         3.0          5.2         2.3  virginica
## 147          6.3         2.5          5.0         1.9  virginica
## 148          6.5         3.0          5.2         2.0  virginica
## 149          6.2         3.4          5.4         2.3  virginica
## 150          5.9         3.0          5.1         1.8  virginica
## 151          3.0         3.2          1.6         0.3  newsetosa
dim(iris)
## [1] 151   5
newcol <- 1:151
iris <- cbind(iris , newcol)

name <- c("john" , "peter" , "jennifer" )
gender <- factor (c( "m" , "m" , "f" ))
hw1 <- c(60, 60 ,80)
hw2 <- c( 40 , 50 ,30)

grades <- data.frame(name , gender , hw1 , hw2)
grades
##       name gender hw1 hw2
## 1     john      m  60  40
## 2    peter      m  60  50
## 3 jennifer      f  80  30
grades[1 , 2]
## [1] m
## Levels: f m
grades[ , "name"]
## [1] john     peter    jennifer
## Levels: jennifer john peter
grades$name
## [1] john     peter    jennifer
## Levels: jennifer john peter
grades[grades$gender=="m",]
##    name gender hw1 hw2
## 1  john      m  60  40
## 2 peter      m  60  50
# subset(dataframe, select=열이름) : 데이터세 트에 서 조건에 맞는 내용을 조회
subset(iris , select=Species, subset=(Petal.Length> 1.7))
##        Species
## 25      setosa
## 45      setosa
## 51  versicolor
## 52  versicolor
## 53  versicolor
## 54  versicolor
## 55  versicolor
## 56  versicolor
## 57  versicolor
## 58  versicolor
## 59  versicolor
## 60  versicolor
## 61  versicolor
## 62  versicolor
## 63  versicolor
## 64  versicolor
## 65  versicolor
## 66  versicolor
## 67  versicolor
## 68  versicolor
## 69  versicolor
## 70  versicolor
## 71  versicolor
## 72  versicolor
## 73  versicolor
## 74  versicolor
## 75  versicolor
## 76  versicolor
## 77  versicolor
## 78  versicolor
## 79  versicolor
## 80  versicolor
## 81  versicolor
## 82  versicolor
## 83  versicolor
## 84  versicolor
## 85  versicolor
## 86  versicolor
## 87  versicolor
## 88  versicolor
## 89  versicolor
## 90  versicolor
## 91  versicolor
## 92  versicolor
## 93  versicolor
## 94  versicolor
## 95  versicolor
## 96  versicolor
## 97  versicolor
## 98  versicolor
## 99  versicolor
## 100 versicolor
## 101  virginica
## 102  virginica
## 103  virginica
## 104  virginica
## 105  virginica
## 106  virginica
## 107  virginica
## 108  virginica
## 109  virginica
## 110  virginica
## 111  virginica
## 112  virginica
## 113  virginica
## 114  virginica
## 115  virginica
## 116  virginica
## 117  virginica
## 118  virginica
## 119  virginica
## 120  virginica
## 121  virginica
## 122  virginica
## 123  virginica
## 124  virginica
## 125  virginica
## 126  virginica
## 127  virginica
## 128  virginica
## 129  virginica
## 130  virginica
## 131  virginica
## 132  virginica
## 133  virginica
## 134  virginica
## 135  virginica
## 136  virginica
## 137  virginica
## 138  virginica
## 139  virginica
## 140  virginica
## 141  virginica
## 142  virginica
## 143  virginica
## 144  virginica
## 145  virginica
## 146  virginica
## 147  virginica
## 148  virginica
## 149  virginica
## 150  virginica
subset(iris, select=c(Sepal.Length, Petal.Length, Species), subset=c(Sepal.Width==3.0 & Petal.Width==0.2))
##    Sepal.Length Petal.Length Species
## 2           4.9          1.4  setosa
## 26          5.0          1.6  setosa
## 39          4.4          1.3  setosa
#with(dataframe , 열 이름) 
head(with(iris , Species))
## [1] setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica newsetosa
help(with)

#merge(dfl, df2 , by="dfl와 df2의 공통된 열의 이름")
name<-c("TR", "MG", "SH", "PK")
year.born<-c(1995 , 2000, 2009, 2013)
place.born<-c ( "USA" , "KR" , "CHI" , "KR")

born <- data.frame(name, year.born, place.born)
born
##   name year.born place.born
## 1   TR      1995        USA
## 2   MG      2000         KR
## 3   SH      2009        CHI
## 4   PK      2013         KR
name<-c("TR" , "MG" , "SH")
year.died<-c(2100 , 2300 , 2500)

died <- data.frame(name, year.died)
died
##   name year.died
## 1   TR      2100
## 2   MG      2300
## 3   SH      2500
#데이터프레인 두가지를 이름 항목으로 조합하는 예 
merge(born , died , by="name")
##   name year.born place.born year.died
## 1   MG      2000         KR      2300
## 2   SH      2009        CHI      2500
## 3   TR      1995        USA      2100
help(merge)


#15 - Sample Source 
install.packages("ggplot2")
## Error: trying to use CRAN without setting a mirror
library(ggplot2)
data(movies)
head(movies)
##                      title year length budget rating votes   r1   r2  r3
## 1                        $ 1971    121     NA    6.4   348  4.5  4.5 4.5
## 2        $1000 a Touchdown 1939     71     NA    6.0    20  0.0 14.5 4.5
## 3   $21 a Day Once a Month 1941      7     NA    8.2     5  0.0  0.0 0.0
## 4                  $40,000 1996     70     NA    8.2     6 14.5  0.0 0.0
## 5 $50,000 Climax Show, The 1975     71     NA    3.4    17 24.5  4.5 0.0
## 6                    $pent 2000     91     NA    4.3    45  4.5  4.5 4.5
##     r4   r5   r6   r7   r8   r9  r10 mpaa Action Animation Comedy Drama
## 1  4.5 14.5 24.5 24.5 14.5  4.5  4.5           0         0      1     1
## 2 24.5 14.5 14.5 14.5  4.5  4.5 14.5           0         0      1     0
## 3  0.0  0.0 24.5  0.0 44.5 24.5 24.5           0         1      0     0
## 4  0.0  0.0  0.0  0.0  0.0 34.5 45.5           0         0      1     0
## 5 14.5 14.5  4.5  0.0  0.0  0.0 24.5           0         0      0     0
## 6 14.5 14.5 14.5  4.5  4.5 14.5 14.5           0         0      0     1
##   Documentary Romance Short
## 1           0       0     0
## 2           0       0     0
## 3           0       0     1
## 4           0       0     0
## 5           0       0     0
## 6           0       0     0
#title 변수에서 skies가 들어간 행 + title , year, rating 변수열 6줄을 조회했다.
#grep(조회할 문자패 턴, data) 
head( movies [grep("skies" , movies$title, ignore.case=T) ,c( "title" , "year" , "rating" )] )
##                                title year rating
## 38             'Neath Canadian Skies 1946    5.4
## 39          'Neath the Arizona Skies 1934    4.6
## 853  Ace Eli and Rodger of the Skies 1973    5.7
## 6512              Blue Montana Skies 1939    5.8
## 6527                      Blue Skies 1946    6.3
## 6528                Blue Skies Again 1983    4.9
pattern = "^Summer.*?"
ndx <- grep(pattern , movies$title )
grep(pattern , movies$title )
##  [1] 49825 49826 49827 49828 49829 49830 49831 49832 49833 49834 49835
## [12] 49836 49837 49838 49839 49840 49841 49842 49843 49844 49845 49846
## [23] 49847 49848 49849 49850 49851 49852 49853 49854 49855 49856 49857
## [34] 49858 49859 49860 49861 49862 49863 49864 49865 49866 49867 49868
## [45] 49869 49870 49871
head(movies[ndx , "title"])
## [1] "Summer"                "Summer Blues"          "Summer Camp"          
## [4] "Summer Camp Girls"     "Summer Camp Nightmare" "Summer Catch"
#벡터에 있는 원소 선택 
fib<-c(0 , 1, 1, 2, 3, 5, 8, 13 , 21 , 34)
fib
##  [1]  0  1  1  2  3  5  8 13 21 34
fib[1]
## [1] 0
fib[3]
## [1] 1
fib[1:3]
## [1] 0 1 1
fib[c(1 , 2, 4, 8)]
## [1]  0  1  2 13
fib[-1]
## [1]  1  1  2  3  5  8 13 21 34
fib[-c(1:3)]
## [1]  2  3  5  8 13 21 34
fib < 10 
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
fib[fib<10]
## [1] 0 1 1 2 3 5 8
fib%%2==0 
##  [1]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
fib[fib%%2==0]
## [1]  0  2  8 34
# as.data. frame(x): 데이터 프레임 형식으로 변환
# as.list(x) 리스트 형식으로 변환.
# as.matrix(x): 행 렬 형 식 으로 변환
# as.vector(x) 벡터 형식으로 변환
# as.factor(x): 팩터 (factor) 형식으로 변환
as.numeric("3.14")
## [1] 3.14
as.integer(3.14)
## [1] 3
as.numeric("Foo")
## Warning: 강제형변환에 의해 생성된 NA 입니다
## [1] NA
# NA or NULLL 
as.character(101)
## [1] "101"
as.numeric(FALSE)
## [1] 0
as.numeric(TRUE)
## [1] 1
#문자열을 날짜로 변환 
# Sys. Date(): 현재 날짜를 반환
# as.Date(): 날짜 객체로 변환
Sys.Date( )
## [1] "2014-06-02"
as.Date("2013-08-13")
## [1] "2013-08-13"
as.Date("08/13/2013")
## Error: character string is not in a standard unambiguous format
as.Date("08/13/2013", format="%m/%d/%Y")
## [1] "2013-08-13"
#날짜를 문자열로 
#format(날짜, 포뱃)
as.Date("08/13/2013", format="%m/%d/%Y")
## [1] "2013-08-13"
format(Sys.Date())
## [1] "2014-06-02"
format(Sys.Date(), format="%m/%d/%Y")
## [1] "06/02/2014"
format(Sys.Date(), '%a')
## [1] "월"
format(Sys.Date(), '%b')
## [1] "6"
format(Sys.Date(), '%B')
## [1] "6월"
format(Sys.Date(), '%d')
## [1] "02"
format(Sys.Date(), '%m')
## [1] "06"
format(Sys.Date(), '%y')
## [1] "14"
format(Sys.Date(), '%Y')
## [1] "2014"
#Missing 
a <- 0/0 
a
## [1] NaN
is.nan(a)
## [1] TRUE
b <- log(0)
b
## [1] -Inf
is.finite(b)
## [1] FALSE
c <- c(0:4, NA)
is.na(c)
## [1] FALSE FALSE FALSE FALSE FALSE  TRUE
# 데이터를 삭제 하는 rm()
rm(a)
rm(list=ls(all=TRUE))

data(iris)
summary(iris)
##   Sepal.Length   Sepal.Width    Petal.Length   Petal.Width 
##  Min.   :4.30   Min.   :2.00   Min.   :1.00   Min.   :0.1  
##  1st Qu.:5.10   1st Qu.:2.80   1st Qu.:1.60   1st Qu.:0.3  
##  Median :5.80   Median :3.00   Median :4.35   Median :1.3  
##  Mean   :5.84   Mean   :3.06   Mean   :3.76   Mean   :1.2  
##  3rd Qu.:6.40   3rd Qu.:3.30   3rd Qu.:5.10   3rd Qu.:1.8  
##  Max.   :7.90   Max.   :4.40   Max.   :6.90   Max.   :2.5  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
head(iris, 10)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
#install.packages("party")
#library(party)
# vignette("알고 싶은 package 이 름")
#vignette("party")
#q()

#Data 를 저장하고 읽어들이기 
data(iris)
iris <- as.matrix(iris)
head(iris)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
## [1,] "5.1"        "3.5"       "1.4"        "0.2"       "setosa"
## [2,] "4.9"        "3.0"       "1.4"        "0.2"       "setosa"
## [3,] "4.7"        "3.2"       "1.3"        "0.2"       "setosa"
## [4,] "4.6"        "3.1"       "1.5"        "0.2"       "setosa"
## [5,] "5.0"        "3.6"       "1.4"        "0.2"       "setosa"
## [6,] "5.4"        "3.9"       "1.7"        "0.4"       "setosa"
dim(iris)
## [1] 150   5
#setwd("D:/SysData/GoogleDrive/빅데이터/Education/SAF_Education/saf_example")
#rm(iris)
#write.csv(iris, file='iris.csv')
#iris <-  read.csv("D:/SysData/GoogleDrive/빅데이터/Education/SAF_Education/saf_example/iris.csv")
#summary(iris)

#iris <- as.data.frame(iris)
#str(iris)

#a <- iris$Species
#save(a,file="exercise.Rdata")

2014년 4월 15일 화요일

[SAF Intranet] 데이터의 재발견

* SAF internal training courses - data analysis process #1

이것은 사내 임직원 내부 교육을 위해 생성된 자료를 바탕으로 하고 있습니다. 사내 실습용 데이터는 별도로 내부에서만 공유될 예정이며 이 글은 사내 과정의 참고자료 목적으로 작성된 내용입니다. 

다음과 같은 교육과정으로 구성  
1. 일반 - 왜 모두들 데이터에 관심을 갖는가에 대한 내용
2. 기초 - 내부/외부 데이터 수집 방법, 데이터 가공 방법  
3. 분석 - 간략한 분석방법 실습 적용 
4. 표현 - 데이터 시각화에 대한 이야기, 보고서 만들기

활용도구는 오픈소스 R과 Excel을 병행 하도록 합니다.
관련된 자료는 구글 검색 또는 내부 커뮤니티 게시판을 이용하세요. 

* 이야기를 시작하며
처음 과정을 만들어 보고자 할때 부터 고민이 되는 것은 어떻게 이야기를 전개 해야 하는가에서 부터 최종 교육을 통한 목적이 무엇인가에 대한 고민이 가장 컸습니다. 결론 적으로 우리는 그 첫번째 목표로 데이터를 바라보는 관점의 변화 두번째로 데이터(주로 내부 그리고 외부 포함)가 주어졌을 때 분석하고자 하는 형태로 데이터를 변환하고 도구를 이용하여 여러가지 형태로 분석할 수 있도록 지원 하는 것으로 가져 봤습니다.

물론 4차 과정에서 데이터 시각화에 대한 과정을 추가 하였으나 표현에 대한 기법이라기 보다는 시각화가 가져다 주는 장/단점을 확인해보고 향후 좋은 보고서를 만드는 방법은 무엇인가에 대한 토론이 주된 내용이 될것입니다.

우리의 이 이야기는 해당 분야에 대한 아주 아주 대단한 전문가 집단이 아닙니다. 어쩌면 보잘것 없는 위치 일 것입니다. 하지만 우리의 이 시작이 우리의 개인과 조직을 더 스마트하게 한다는 우리의 비전을 실현해줄 것이라고 상상하고 달려 갈 것입니다. 내용에 오류가 있거나 논란이 될 수 있는 부분은 덧글 또는 메세지를 통하여 전달 해주시면 정정 하도록 하겠습니다.


* 패턴? 당신은 누구 입니까? 

보통의 개념을 우리가 알기 위해선 과거 책(또는 사전)을 찾아 보거나 했을 것이지만 최근엔 대부분 검색을 하게 될것입니다. 구글을 사용하시나요? 목적이 검색이라면 구글을 추천합니다. 그 이유는 여기의 논재가 아니니 제외하도록 할께요. 위키피디아에 나온 정의는 이렇습니다. 패턴(pattern)은 프랑스어 낱말 patron에서 온 것으로, 되풀이되는 사건이나 물체의 형태를 가리킨다. 물체들의 집합 요소로 부르기도 한다. 이러한 요소들은 예측 가능한 방식으로 되풀이된다.쪽매맞춤(테셀리이션-tessellation)이라는 가장 기본적인 패턴은 반복과 주기성에 기반을 둔다.

제가 생각하기에 가장 적절하게 하는 표현이 정의 그 자체에 있는듯 합니다. 예측 가능한 방식으로 되풀이 된다는 것입니다. 고객을 대상으로 하는 조직이라면 더더욱이 고객을 예측하고 싶어 합니다. 언제 구매를 하게 될지에 대한 논의는 소비패턴이나 행동패턴등의 용어에 포함되어 과거에서 부터 많은 논의가 되어 왔어 많는 논문들에서도 어떠한 프로세스 과정을 거쳐 구매하게 되는지도 정의한 결과들이 참으로 많습니다. 우리의 주제는 아주 상세하게 그 내용을 논의 하고자 하는 것은 아닙니다. 왜? 라는 곳에만 집중을 해보도록 할께요.

분명 우리는 이미 과거의 구매가 되풀이 되는 기록을 통하여 앞으로의 구매가 일어날 것을 예측할 수 있습니다. 이미 우리는 그렇게 하고 있지요? 과거 이벤트나 과거 행사 를 해봤으니 올해도 이렇게 될 것이다. 그럼 한가지 궁금한게 있습니다. 그러한 근거 또는 가설을 뒷받침 할 만한 내용을 데이터로 갖고 있는지 아니면 경험으로 갖고 있는지 말입니다. 이미 데이터로 그 가설을 뒷받침 하고 계시다면 더이상의 조언은 의미가 없을 것입니다. 그렇지만 경험으로만 갖고 계신 의사결정이라면 반드시 틀렸다고 만은 말할 수 없으나 데이터를 기반으로 하는 의사결정과 가설의 뒷받침을 할 수 있길 권고 하려고 합니다.

그래서 우리는 오늘 그 데이터에 대한 이야기를 좀더 해보고자 합니다.

* 데이터 자체에 대한 이야기
데이터베이스에 대한 공부를 하신 분들이 만약에 계시다면 대부분의 첫장에 설명되어 있는 데이터에 대한 설명은 데이터와 정보의 차이를 구분하여 설명하는 것이 일반적일 것입니다. 저 또한 그와 틀리지 않은 이야기로 시작하려고 합니다.

우리의 모든 현상 다시 말해 현실세계에는 모두 데이터로 표현 가능 합니다. 데이터는 크게 정성적데이터와 정량적 데이터로 구분을 합니다. 정성적 데이터특성이나 특징을 나타내는 기호나 문자를 대표합니다. 또한 숫자로 표현할 수 있는 데이터들을 정량적 데이터라고 합니다. 정의에 대한 이야기가 나왔으니 정보나 지식에 대한 이야기도 해보겠습니다. 무수히 많은 데이터들은 데이터 자체로만은 의미가 없었습니다(과거형으로 표현하는 이유는 뒤에서 자연스럽게 이해가 되시리라 생각이 됩니다). 의사결정을 위해서 사용한 데이터들을 다르게 표현하여 우리는 정보(Information) 이라고 합니다. 또한 이러한 정보들은 유기적인 구조로 분리하고 개인의 경험을 보태어 축척하는 것을 지식이라고 합니다. 이러한 지식의 축척과 아이디어가 결합된 창의적 산물을 지혜로 설명할 수 있습니다. (참조-데이터분석전문가가이드)




위그림은 지식의 피라미드에 사례를 우리가 보기 편한 사례로 좀더 수정을 해봤습니다. 좀 억지스러운 예제일 수 있으나 구분하는 목적으로만 바라 봐 주시길 바랍니다. 누구나 위의 지식피라미드를 경험하리라고 봅니다. 살면서 경험하게 되는 많은 것들은 이 일련의 프로세스같은 경우가 많이 있기 때문이죠. 그런데 최근에(개인적으론 이런 저런 언급이 시작된건 4년 전 인것 같네요 - 이미 그전이라고 하더라도 지극히 개인적인 수준입니다) 상위 레벨의 지혜까지의 일련의 프로세스가 아닌 데이터 자체에 대한 관심이 높아 지고 있습니다. 왜 일까요?

주변의 활용 사례와 사용 사례들을 보면 그 이유가 조금은 이해가 됩니다. 그것은 바로 데이터 자체가 나타내고 있는 패턴입니다. 무수히 많은 그리고 무심코 지나치던 데이터 들은 통찰력과 새로운 시각으로 바라 보니 어떤 특징들을 가지고 있다는 것입니다. 과거에 비해서 우리는 데이터를 수집하고 저장하고 검색하고 분석하는데 드는 비용이 현저히 떨어지고 있습니다. 하여 이러한 궁금증과 실행이 좀더 쉬워지고 좀더 간편해졌다고 생각이 듭니다. 지금보다 앞으로는 이러한 것들의 더 좋은 인프라가 구성이 되리라 생각이 듭니다.


* 데이터를 활용한 국내 해외 사례
주변에서 전문가의 교육이나 세미나 등에서 자주 등장하는 이야기가 있습니다. 바로 기저귀 맥주의 사례인데요. 금요일 저녁에 기저귀를 사는 남자들이 맥주를 산다라고 하는 데이터 구매 이력을 보고 상품 진열을 함께 했더니 매출이 상승하였다. 과거에 데이터 분석의 주요 의미는 인과관계를 분석하는데 관점이 컸다면 이와 같이 인과관계를 설명할 수 없지만 어떤 상관성을 가지고 있는 것들을 찾아 냄으로 해서 그 다음 행동을 할 수 있게 의사결정 하는 것이죠. 이보다 국내에서도 다양한 사례들이 생겨나고 있습니다. KT와 서울시의 협업으로 생성된 심야교통버스의 노선을 분석한 사례등도 이와 같다고 할 수 있죠. 다양한 사례와 내용은 지면을 통하지 않고 아래 링크의 여러 보고서 자료가 존재 하니 참고 하시길 바랍니다.




- 빅데이터 국가전략 포럼 사례보고서


* 왜 다들 데이터에 집중 할까?
결국에 이러한 데이터를 가지고 숨겨져 있던 패턴을 찾아 내고 그 패턴을 기억하고 그 패턴에 맞는 예측된 내역을 사람에게 전달 합니다. 또는 공공의 문제를 해결하는데도 사용되죠. 결국에 그 방향은 정부의 정책에도 변화를 이끌어 내리라고 봅니다. 그것은 공통적인 적용에서 바로 개인적인 적용의 시대로 변화하고 있다는 의미 일 수 있습니다. 넓게 보지 않고 우리는 기업이니 기업의 관점에서만 한번 바라 보겠습니다. 우리는 현재 개인화 서비스까지 할 수 있는 인프라를 구성하진 않았습니다. 하지만 꿈같은 현실이지만 많은 고객을 개개인별로 응대하고 그의 성향을 알 수 있고 본인에게 딱맞는 맞춤형 서비스가 진행 된다면 좀더 좋지 않을까요? (물론 개인정보보 보호에 관한 사항이 얽혀 있긴 합니다만 이곳에서는 그 부분은 언급하지 않겠습니다. 그/그녀가 누구인지에 집중하는 것이 아니라 어떤 특성을 갖고 있는지에 대한 이야기를 하고 있으니까요)

개인화서비스가 좀더 알고 싶으신 분은 링크를 참조 하세요. (개인화서비스)
- 블러그 설명 자료 링크
- 뉴스기사


* 일반과정을 마무리 하며
글을 쓰다 보니 배가 산으로 간 느낌이 없지 않아 있습니다. 우리가 데이터에 관심을 갖는 이유는 결론이 개인화 서비스는 아닙니다. 여러가지 형태로 발전하고 변화 한것을 언급하다 보니 그 이야기 까지 하게 되었네요. 정신 차리고 다시 제자리에 서서 생각해보도록 하겠습니다. 우리는 과거 많은 의사결정을 또는 의사결정을 위한 사전 준비를 데이터를 기반으로 하지 않았습니다. 물론 데이터를 기반으로 했다고 주장할 순 있지만 좀 아쉬운 것은 데이터 기반에 포함되는 데이터가 현재의 데이터와 상관관계를 갖는 데이터가 제외 되지 않았는지 한번은 의심의 눈초리를 스스로에게 또는 조직에게 보내야 합니다. 또한 데이터를 기반으로 의사 결정을 한다는 것은 많은 것들을 내포하고 있지만 가장 큰것은 투명해진다는 특성을 가지고 있습니다. 부끄러움을 상징하는 투명함이 아니라 당당함과 견고함의 투명성을 갖는 개인과 조직문화를 만들어 가고자 우리는 이렇게 한발을 내딛은 것입니다.

사설이 길고 우왕좌왕한 설명들이 있었다는 것을 인정합니다. 하지만 시작을 했다는 것에 지금은 의미를 두고 싶습니다. 계속 변화 해갈 것이고 내부적으로 이러한 의사결정의 모델들을 만들어 보고 실행하고 검증하는 과정을 보낸다면 우리는 꿈같은 현실을 살아 갈 수 있을 것으로 확신합니다.







2014년 4월 1일 화요일

[Data Science] 예측모델링(Predictive Modeling) & 분류(Classification)


지나서 얘기지만 교육을 받을 때는 정말이지 엄청히나 이해가 안되고 감이 안잡혔던 부분이었다. 물론 어떤 경우에 사용되는가? 사례등을 들어 보면 참으로 이해가 잘된다. 그런데 막상 하려면 참 어렵다. 이것이 진실이었던 듯 자꾸 수박 겉할기 식으로만 접근 해서 그런것은 아니었나 싶다. 최근에 "Data Science for Business" 이 책을 통해서 조금이나마 이해를 하기 시작했다. 결론은 기초가 없다는것 그 시작 그리고 과정을 정리 하면서 공부하려고 한다. CRM 데이터를 기준으로 설명하고 예제 실행(with R)을 해보려고 한다.

Predictive Modeling (예측모델링) - 흥미있는 특정 값에 따라 집단을 분류하는 것 으로 설명 한다.

예를들어 보자
1) 어떤 고객이 화이트데이 이벤트에 참여/구매할 것인가?
2) 어떤 고객이 3개월이내에 탈퇴 할 것인가?
3) 어떤 고객이 내년에 VIP가 될것인가?

이러한 용도에 고객의 행동을 예측하거나 고객들의 특성(속성)을 파악하는데 사용되고 다른 마이닝된 결과(메뉴들 과의 관계분석 이나 고객의 주요 구매활동 지역정보 분석에 대한 결과)와 연계하여 활용도 가능 하다.ㅍ

용어정의 먼저 시작하고 넘어 가보려고 한다.
Model - 알려지지 않은 값을 예측하기 우한 공식
Example, Attribute, Target Attribute


Class - 다른 Target Attribute 값을 갖는 Example 들의 Group

데이터베이스개론쪽 IT수업에서 보면 테이블 형태와 유사하다. 아니 똑같다라는 표현이 맞을듯 하다 여기서 구분되어져서 봐야 할 부분 바로 Target Attribute 로 되어 있는 부분 이다.

예제로 사용되는 IRIS 데이터셋이 있는데 Petal(꽃잎), Sepal(꽃받침)의 길이와 넓이 정보를 가지고 붓꽃의 품종 3종으로 나누어진 데이터가 있다. 모델을 만들때 그러니깐 분류분석을 할때 가장 어려워 했던 부분이 바로 Attribute와 Target Attribute에 대한 명확한 구분과 의미를 몰랐던것 같다. 이제와 보니 간단하면서도 명확했던 것을 무엇이 문제 였을까.

여하튼 특정속성값들을 어떻게 조합하여 모델을 민드냐에 따라 그 예측되는 결과가 달라 질 수 있음이다. 또한 한번 만들어 보고 나니 실제로 활용되는 모델은 다양하고 계속적으로 변화 하면서 존재 할 수 밖에 없다는 생각을 하게 되었다.


** 이부분을 먼저 할까 나중에 할까 하는 고민을 하게 된다. 개인적으론 나중에 했다. 그제서야 아.. 분류할때 이런 기준으로 분류는 하는거였구나 하며 무릎을 치게된 순간이 좀 늦게 왔다랄까? 어느게 먼저이어야 한다는건 사실 현업의 실무자에겐 의미가 없어 보인다. 학문적으로나 학구적으로 한다면 당연히 이부분이 먼저여야 한다는것이 맞겠지만 글쎄 개인적인 생각으론 우선순위가 있다기 보단 기본 지식이 있는것과 없는것의 차이? 여하튼 이곳에서의 기록도 또한 개인적 우선순위로 변경하여 먼저 정리를 하고 넘어갈 생각이다.

* Informative Attributes (유의한 변수(속성)) 를 찾아 내야 한다. 그래야 제대로된 분류를 할 수 있다. 예를 3개월 안에 이탈할 고객은? 이라는 문제가 있고 이탈하지 않도록 뭔가 강한 오퍼를 날리기 위해 이벤트든 켐페인을 해야 한다고 상황이 왔을때 우리는 제대로된 집단으로 분류하고 정리해야 한다. 이때 유의한 변수(속성)을 찾아 내는 것이다.

고객의 정보에 있는 여러가지 변수들 중에 말이다. 남자/여자? 최근 구매금액? 최근 방문빈도? 여하튼 여러가지 속성정보들 중에서 어떤 속성으로 아니 더 정확히 말하면 어떤 속성을 우선순위로 하여 분류할 것인가를 생각해야 한다. 이때 가장 많이 쓰이는 것이 바로 information gain이 가장 널리 쓰인다. Information Gain은 지정된 속성이 얼마나 잘 training example들간을 구분하는가에 대한 수치 값을 의미한다. 특정 속성을 기준으로 example들을 구분하게될 때, '감소되는 entropy의 양'을 의미한다. Entropy는 또 무엇인가? 그것은  example들의 집합에서의 혼합성(impurity)을 나타내는 수치 이다. 계산하는 로직은 아래와 같다.

* pi = 속성값이 i 일 확률

이렇게만 들으면 정말이지 맨붕 온다. 나 역시도 학부시절 통계학을 듣긴 했지만 정말이지 아주 아주 기초수준을 벗어나진 못했다.. 일단 그림 한번 보자


설명을 붙이기 전에 일반 그림으로 보면 +, - 를 구분하는데 있어 왼쪽 entropy값의 변화를 보자 값이 1과 0 사이에서 어느쪽이 순수하게 구분이 되어지고 어느쪽이 복잡하게 되어지는지 변화를 보자. 0에 가까울 수록 순수함을 표기하고 1에 가까울 수록 동일한 숫자로 혼합되어 있다는것을 확인 할 수 있다.




앞에서 Information gain이란 특정 속성을 기준으로 example들을 구분하게될 때 감소되는 entropy의 양을 의미한다고 하였다. 그리고 entropy는 example들의 집합에서의 혼합성(impurity)을 나타낸다고 하였으므로, entropy가 작아질수록 혼합성이 줄어든다. example을 구분할때 혼합성이 작을 수록 서로간의 구분이 더욱 용이해 지므로, Information gain이 커질수록 좋은것이다. 따라서 Information gain이 더 큰, '습도' 속성을 기준으로 운동여부를 구분하는 것이 더욱 효율적이다




#참고문헌 및 참조 URL
1. Data Science for Business
2. 데이터분석 전문가가이드
3. 네이버 사전

2014년 3월 11일 화요일

[Statistics with R] Descriptive Statistics #2 - Mid-Value (대표치)

기술통계가 필요한 이유는 데이터의 합리적인 요약 능력에 있다. 기술통계는 매우 간단한 통계량으로 엄청난 양의 데이터가 갖는 속성을 합리적인 방법으로 간명하게 요약해 줌으로써 독자가 데이터의 속성을 쉽게 이해할 수 있도록 도와준다. 이것이 바로 기술통계가 필요한 이유이다.


기술통계량에는 어떤 것들이 있을까? 크게 4가지 범주로 분류할 수 있다. ① 중심경향성(central tendency) ② 산포도(dispersion) ③ 분포(distribution) ④ 백분위수(percentile) 등이다. 다만 백분위수는 커뮤니케이션 연구에서 거의 사용하지 않기 때문에, 이를 제외한 나머지 세 가지 범주의 기술통계량에 대해 상세하게 살펴보도록 하겠다.

** 기술통계가 필요한 이유 전문 참조
참고URL - 전문내역 원본 링크


* 대표치 : 측정한 데이터의 전체를 대표할 수 있는 성질이나 특성을 수치로 나타낸 값을 대표치라고 한다. 일반적으로 데이터의 중심적인 경향을 나타내는 값이다. 즉 자료의 중심위치를 표시하는 특성치로 우리가 이미 잘 알고 있는 평균도 대표치 중의 하나이다.

1. 계산적 대표치
 - 모든 데이터가 대표치의 계산에 사용되는 추상적인 대표값. 극단적인 값에 영향을 받는 대푯값에는 산술평균, 기하평균, 조화평균, 평방평균 등이 있다.

 1.1. 산술평균(Arithmetic Mean)
- 수리통계학의 평균 계산법으로, n개의 변수의 산술평균은 변수들의 총합을 변수의 개수 n으로 나눈 값이다. 일반적으로 우리가 말하는 평균을 말한다.

 ㄱ. 산술평균에 대한 편차의 합은 0이다.
 ㄴ. 산술평균은 극단값의 영향을 많이 받는다.

- 분석을 접하다 보면 해당 자료중에 극대값을 만나게 된다. 그것으로 인하여 평균값에 영향을 미치게 되고 결정적으로 잘못된 정보를 제공하는 경우가 종종 발생한다. 즉 경우에 따라서는 산술평균의 신뢰도는 떨어 질 수 있다는 단점이 있다.

 - 편차(Deviation) : 각 수치와 대표치와의 차이, 편차의 절대치 합계를 도수로 나눈것을 평균편차라 한다. 즉 편자의 절대치 평균이라 할 수 있다. 

Q. 다음데이터의 산술평균과 표준편차를 구하라!

물론 간단하게 summary(x) 를 하게 되면
> summary(x)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
   20.0    80.0    85.0    79.5    90.0    95.0

쉽게 값을 뽑아 낼 수도 있다. 일반적으로 산술평균에서 최대치값(MAX)의 편차를 보고 제외 할 것인지 포함 할 것인지 결정하는 것이 경우에 따라서는 데이터 클린징 하는 과저에서 제외 하는 경우가 있다.


 1.2. 기하평균(Geometric Mean)
 - n개의 양수가 있을 때, 이들 수의 곱의 n제곱근의 값이다. 기하평균은 산술평균보다 크지 않다

 - 계산하는 방식도 알겠고 수식도 알겠다. 근데 이해가 가지 않는다. 그래서 찾아 보았다. 기하학적 접근 그것은 무엇인가? 하여튼 갈수록 난해함은 더 커진다.

 - 기하학(Geometry) : 백과사전 용어설명 토지 측량을 위해 도형을 연구하는데서 기원했으며, 공간의 수리적 성질을 연구하는 수학의 한 분야이다.

 - R에서 기하평균을 계산하기 위해선 geometric.mean() 함수를 활용한다.

대략적인 조합의 설명들로 보면 기하평균은 상승률에 대한 평균정보를 알고자 할때 사용하는 것이 적절할것으로 보인다. 올해 경제성장률이 4%, 내년 경제 성장률이 9%일때 평균 성장률이 얼마인가? 산술평균은 6.5%이지만 실제 성장한 정도를 따져보면 100을 기준으로 4%성장은 104가 되고 104에서 9%성장하여 113.36이 되므로 평균적으로 6.47%상승한 것으로 확인 할 수 있다.


 1.3. 조화평균(Arithmetic Mean)
 - n개의 양수에 대하여 그 역수들을 산술평균한 것의 역수를 말한다. 예를 들어, 두 지점 A,B를 갈 때는 a km/h의 속도로, 올 때는 b km/h의 속도로 왕복했다면 이 사람의 평균속력은 a와 b의 조화평균에 해당된다. 또 100 m를 뛰는 데 3회 뛴 시간이 a초, b초, c초였다고 하면, 그 평균은 a,b,c의 조화평균으로 구해진다. 이와 같이 일이나 능률의 예에서는 산술평균을 구하면 틀리게 된다.

Q. 자동차의 5회 운행의 속도(km/sec)를 조사한 자료의 평균속도는?


평균값들을 정리 하면 산술평균 >= 기하평균 >= 조화평균의 관계가 성립힌다. 
x1 = a, x2 = b , a = 5로 고정  b를 5부터 10까지 증가시킬 경우 평균값들의 관계도 
[두값 차이에 따른 평균의 분포]

[세가지 평균의 극단값의 영향도]

이런 기본적인 수준의 평균값 정도를 알았다면 모델링 할때 구매금액에 대한 평균값을 구할때 조화 평균으로 구했었다면 의미가 있었을까 라는 생각을 해보게 된다. 여하튼 극단값에 대한 영향도나 어떠한 경우에 평균값을 사용하는냐에 따라 다른 결과를 가져 올 수 있겠다는 것이 명확하니 반드시 숙지하고 상황에 맞는 것을 선택하여 사용해야 겠다.


2. 위치적 대표치
 계산적 대표치가 극단값에 영향을 받는 단점을 보완한 대표값이다. 데이터의 일부를 이용해서 전체의 특성을 유지하면서 극단값의 영향을 회피하는 방법으로 대표값을 계산

2.1 중위수(Median)
크기순으로 배열 했을 때 전체의 중앙에 위치하는 수치. 예를 들면, 주어진 n개의 자료에 대해 n이 홀수인 경우 크기가 (n+1)/2번째 값, n이 짝수인 경우 크기가 n/2번 째 또는 (n/2)+1 번째 값을 중위수이라고 한다.

2.2 중간값(Mid-Point) 
얻어진 n개의 값 중에서 가장 큰 값과 가장 작은 값의 평균값을 일컫는 말이다. 각 값의 분포상태에는 영향을 미치지 않는다. 평균값·중앙값·최빈값 등과 함께 어떤 측정항목의 도수분포(度數分布)를 하나의 값으로 대표할 때에 사용되는 대표값이다.

2.3 최빈수(Mode)
도수분포에서 최대의 도수를 가지는 변량의 값이다. 예를 들면, 어느 학생의 7회에 걸친 성적이 각각 40점 ·42점 ·45점 ·46점 ·45점 ·45점 ·45점이었다면, 7회 중에서 45점이 모두 4회로서 절대다수이므로 이 집단의 최빈수는 45점이다.

또, 변량의 분포형태가 대칭이면 평균 ·중앙값(메디안) ·최빈수는 일치하나, 비대칭이면 보통 다음과 같은 경험식(經驗式)이 성립한다. (평균)-(최빈수)=3×{(평균)-(중앙값)}

2.4 사분위수(Quartiles) 및 백분위수(Percentiles)
 - 사분위수(Quartiles) : 자료를 크기 순으로 배열하고, 누적 백분율을 4 등분한 각 점에 해당하는 값을 말한다. 제1사분위수는 누적 백분율이 25%에 해당하는 점수이고, 제2사분위수는 누적 백분율이 50%, 제3사분위수는 75%, 제4사분위수는 100%에 해당하는 점수이다. 특히 제2사분위수는 누적 백분율이 50%이므로 개념적으로 중앙값과 동일하다.

- 백분위수(Percentiles) : 사분위수를 4등분이 아닌 100등분할 경우 각각의 절단점을 백분위수라고 한다. 



2.5 절사평균(Trimmed Mean) 
자료의 가장 큰 부분과 작은 부분을 일정 비율 잘라내 버림으로써 계산된다. 예를 들면 20%의 절사 평균이란 포본의 크기가 10인 표본집단의 경우에 제일 작은 값 2개와 제일 큰 값 2개를 버리고 산술평균을 구하는 것이다.


2.6 윈저화 평균(Winsorized Mean) 
극단값을 보정한 평균을 의미하는데 극단값을 제거한 절사평균과 유사함


#참고문헌 및 참고URL
1. R을 이용한 통계학의 이해 - 자유아카데미
2. 네이버백과사전

[Data Science] 분석과제 정의 - 분석 기회 발굴

- 데이터 분석의 업무 활용 체계 도입을 위한 접근 방식

1. Top Down Approach
#1 page190



 1) 비즈니스 모델 이해

   Context(컨텍스트)를 이해 해야 한다. 용어에 대한 거부감이 있을 수 있겠다. Context 분석이란 관점에서 의미가 어떤 의미 단순히 문맥이란 의미로 사용한다면 부연된 설명들을 표현하기엔 부족한 면이 있고 아무래도 IT출신이여서 그런 것은 아니지만 상황정보로 해석하는 것이 적절하리라 본다. (네이버백과사전 정보참조). 비즈니스 모델의 이해에 가장 핵심이 되는 부분이 바로 우리 회사에 당면한 비즈니스 컨텍스트(상황정보)를 다양한 관점으로 파악해볼 필요가 있다는 것이다.

* 비즈니스 파악
 - 시장요인
 - 거시경제요인
 - 주요 트랜드 관점
 - 산업요인

다양한 설명 보다는 참고문헌 #1의 190p 의 그림이 쉽게 설명 하리라 본다.
#1 page190


 * 고객 니즈 파악

 - 기존 고객의 니즈를 파악하는게 기업의 입장에선 출발점인 것이다. 그러한 니즈를 명확하게 파악 하기 위해서 무엇을 해야 할까? 어떠한 관점에서 해야 할까? 데이터 분석이란 분야에 대한 공부를 시작하고 나서 가장 큰 어려움은 물음의 꼬리를 따라 가다가 삼천포 내지는 개념의 확장 딜레마에 빠지게 된다. 어쨌든 멀리 들어 가지 않고 지금 현재에선 고객의 니즈 파악을 위한 중요 4가지 요소에서 정리를 해보고자 한다. 좀더 자세한 내용과 의미는 나 역시 "소비자행동론"에서 참고할 생각이다.

 - Functional(기능적) Value : 물리적 속성, 성능, 특징 등 기능적인 관점  
 - Financial(재무적) Value : 가격에 대한 부분 무료, 저가격, 고가격의 관점
 - Intangible(무형의) Value : 공유, 확장, 이동, 접근성
 - Emotional(감성적) Value : 즐거움, 자긍심, 자유

 - 미충족 니즈(Unmet Needs) 파악
   분석된 고객의 니즈를 다시 경쟁사가 선점하고 있는 것과 공통, 그리고 자사가 선점한 부분을 영역으로 분리 하면 고객의 니즈 중 충족하지 못하는 부분을 발굴 하게 된다.

#1 page194



 2) 비즈니스 모델 상세화
 - 기업의 경쟁 요소를 구체적으로 정의 할 수 있음. 기업의 전략테마, 실행활동 간 관계를 분석하고 비즈니스 운영 상세 시나리오 정 의를 통해 구체화된다. 기업의 전략테마 · 실행활동 간 관계 분석을 위한 도구로 활동체계 지도(Activity System Map)를 사용하고 비 즈니스 운영 상세 시나리오는 인과지도(Causal Loop Diagram - CLD) 를 사용해 정의한다.

#1 page 196

활동체계 지도(Activity System Map)은 전략 방향을 전략테마와 실행 활동 간 관계를 통해 정의할 수 있도록 도와주는 도두. 이것을 활용하여 비즈니스 모델을 상세화 한다. 가치 제공 수준을 바탕으로 전략테마를 정의, 이러한 전략테마를 실현하기 위한 실행 활동을 도출한 후 전략테마, 실행활동간 관계를 정의 한다. 이러한 사례는 상위 참조된 그림은 [사우스웨스트항공]의 전략테마와 실행활동 간 관계 분석상의 실행 활동 사례이다.

이러한 관계 분석을 통해 도출된 내용을 바탕으로 선택(Choice) - 이론(Theory) - 결과(Consequence)의 형태로 비즈니스 운영 시나리오를 상세화하여 정의 할 수 있음. CLD 연관된 변수들이 서로 어떻게 영향을 미치는지를 시각적으로 표현한 다이어그램이다. 자세한 내용은 #1을 참조


 3) 분석 유스케이스 정의
유스케이스 개념이 소프트웨어 설계에서 유스케이스 관점 설계와 비슷하다는 생각을 하게 되었다. 또는 동일한 것일 수도 있다. 전략적인 테마와 실행을 위한 관계분석 그 내용을 바탕으로 한 시나리오를 상세화 하여 그 안에서 이론(Theory)를 분석하여 분석유스케이스를 찾아 낸다. 아래의 표 예시는 그것을 좀더 쉽게 설명하고 있다.


#1 page 202


 - 분석유스케이스 정의(이벤트 반응 분석)
 도출된 분석 유즈 케이스를 상세히 정의하고,필요한 분석(Analytics)를 찾아내기 위해 프로세스 흐름을 시작부터 종료까지 표현하는 이벤트 반응 다이어그램 (Event Response Diagram) 을 활용한다.



실제 분석을 하기 위한 시나리오세 이론(Theory) 는 비즈니스 문제에 대한 질문에 대한 현상과 상황에 대한 내용이다. 이러한 내용을 기준으로 분석 유스케이스의 분석(Analytics) 왜 용어를 이렇게 사용하는지 좀 개인적으로 의문이 들긴 하지만 여하튼간에 식별된 분석을 시나리로 상세화 하여 가설을 세우고 그 해당 가설을 검증하게 되는 과정을 반복 하면서 분석 유스케이스를 상세화 하고 평가 하게 된다. 이러한 분석들을 평가하는 과정에서 비즈니스 모델의 경쟁요인과 관련되는 분석으로 가장 많은 경쟁요인과 관련될 수록 보다 핵심분석이라고 볼 수 있다. 분서의 평가 기준은 중요도, 영향도, 난이도 세가지 형태로 기준을 잡는다.

참으로 진도 안나가는 부분이다. 실제로도 이런 과정에 산출되는 산출물관리 하다 끝나 버릴것 같은 무식한 생각도 해본다. 분명 그렇지만은 않겠지만 소프트웨어 설계시에도 비슷한 경험이 있는 나에겐 어느정도의 선입견은 있는듯 하다. 제대로된 모델링과 모델을 기준으로 한 개발/구현이 이뤄진다면 베스트 하겠지만 실제 업무나 현장엥서 이러한 구조가 쉽지 않다. 모르면 몰라도 분석하는 쪽의 현장도 크게 다르지만은 아닐것 같은 생각이 충분히 버리지 못하겠다. 그래도 반드시 알아야 할 기초적인 단계인것은 확실 하다.


2. Bottom Up Path-Finding Approach
 - 특정 업무 영역을 대상으로 주제를 정하여 분석기회를 발굴하는 접근 방식으로 맵상에 표현되는 업무 의사결정 지점을 바로 분석의 대상으로 식별하는 것.

- 프로세 스 분류 전사 업무 프로세 스를 가치사슬(Value Chain) -> 메가 프로세스 (Mega Process) -> 메이저 프로세 스 (Major Process)-> 프로세 스( Process) 단계로 구조화해 업무 프로세스를 정의한다 .

- 프로세 스 흐름 분석 :프로세 스별로 프로세 스 맴을 통해 업무 흐름을 상세히 표현한다.
- 분석 요건 식별 : 각 프로세 스 랩상의 주요 의사결정 포인트를 식별한다.
- 분석 요건 정의 : 각 의사결정 시점에 무엇을 알아야 의사결정을 할 수 있는지 , 즉 분석의 요건을 정의하고 분석의 요건을 분석 기회화 한다,


#참조 URL 및 참고 문헌
1. 데이터 분석전문가 가이드 - 데이터베이스 진흥원 2014
2. Data Science for business  - O'Reilly 2013
3. 네이버 지식백과 사전


2014년 3월 10일 월요일

[Data Science] 분석 과제 정의 - 개요

* 분석 기획에 관한 정보 요약과 개인적인 사견을 첨부
  - 개인적인 사견에 오류가 있다면 언제든지 지적을 받을 준비가 되어 있음. 덧글 남겨 주시면 수정 보완 하겠음.

- 데이터의 핵심은 데이터 자체가 아닌 분석을 통한 의사결정의 최적화


현실적으로 비즈니스 이벤트(이슈)가 발생했을 상황에서 정확한 의사결정 (아니 어쩌면 가장 정확할 높은 확률의 의사결정이 더 맞을 수 있겠다)을 내리는데 달려 있다. 지연시간을 줄이기 위한 노력이 필요 하다.

1. Question First 방식으로 접근해야 한다.
   궂이 왜 앞에 단어를 영어로 썼는지 잘 이해는 가지 않는다. 어쨌든 비즈니스 이슈나 이벤트에 대해서 기존의 방식과 다른 것은 일단 있는 데이터 집계와 분석이 아니라 우리가 당면한 문제가 무엇인지에 대한 질문이 우선되어야 한다는 것이다. 공감하는 부분이다. 질문을 통해 우리가 어떤 데이터를 어떻게 활용 할 것인가 결정 할 수 있다.

2. 선택과 집중을 해야 한다.
 볼보의 사례(#1의 page 187p 참조)를 통해서 처음부터 모든 비즈니스 이슈를 도출하고 해결하고자 하는 구조를 만드는 것이 아니라 개선이 시급하거나 빠른 피드백과 보완이 가능한 부서 및 조직을 구성하여 개선하고 확장해 가는 방식을 선택 해야 한다.

3. 자동화된 분석을 업무 프로세스에 내재화 시켜야 한다.
 동의하고 싶지 않지만 동의 할 수 밖에 없는 현실 한가지는 뛰어난 직원 5%가 나머지 95%를 먹어 살린다는 말. 나머지 95%도 5%와 마찬가지로 판단하고 실행 할 수 있도록 분석 프로세스를 실제 업무 의사결정에 삽입하여 구조화 시키는 것을 얘기 하고 있으나 현실적으로 가능 할지가 좀 의문이긴 하다. 어쨌든 공감하는 부분은 데이터 기반의 의사결정을 위한 구조와도 같은 맥락으로 이해가 되긴 한다. 본인의 감이나 누군가 시켜서 했다는 내용이 아니라 데이터는 충분히 공유되고 그것을 기반으로 처리 할 수 있는 시스템(소프트웨어 포함)을 구축하고 내재화 한다면 충분한 효과를 볼 것으로 생각 된다.



#참조 URL 및 참고 문헌
1. 데이터 분석전문가 가이드 - 데이터베이스 진흥원 2014
2. Data Science for business  - O'Reilly 2013
3. 네이버 지식백과 사전

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...