Quiet Time

7장. 함수

PYTHON2017. 9. 10. 00:42
■ 7장. 함수 

  • 7장. 목차 
  • 1.함수생성하는 방법
  • 2.기본값 매개변수와 키워드 매개변수 (mit 코드 이해)
  • 3.가변 매개변수  (mit 코드 이해)
  • 4.매개 변수로 함수를 사용하는 경우
  • 5.함수 밖의 변수, 함수 안의 변수
  • 6.재귀함수  (mit 코드 이해)
  • 7.중첩함수 

■ 7.1. 함수 생성하는 방법

def 함수일므 (매개변수):

     실행문
      return 결과


예제: def my_abs(arg):
       if (arg < 0 ) :
          result = arg * -1 
       else:
          result = arg
       return result
      print ( my_abs(-5) )

문제146. 아래와 같이 이름을 입력하새 함수를 실행하면 
          해당 사원의 부서위치가 출력되게하시오!

print( find_loc('SMITH') )

def find_loc(name)
 for e in emp:
  for d in dept:
   if e['deptno'] == d['deptno'] :
      if e['ename']  == name :
          print( e['ename'].ljust(7),d['loc'])

find_loc('SMITH')

import pandas as pd
def find_loc(val):
    emp= pd.read_csv("D:\data\emp.csv")
    dept= pd.read_csv("D:\data\dept.csv")
    result  = pd.merge(emp,dept,on='deptno')
    result2 = result[['loc']][result['ename']== val]

    return result2
문제147. 미분계수를 구하는 함수를 생성하는데 
 함수 f(x) = 2x^2 +1 일때 

def mibun_fun(n):
 return 'x가 '+ str(n) +'에서의 기울기는 '+ str(round((2*(n + 0.00000001)
*(n + 0.00000001)+1 - (2* n*n+1) ) / 0.00000001)) + ' 입니다.'
print(mibun_fun(-2))


■ 매개변수로 함수를 받는 경우 


def numerical_diff(f,x):
    delta = 0.0001 # 1e-4로 해도된다
    return ( f(x+delta) - f(x-delta) ) / (2*delta)
함수  f(x) 2x^2 + 1 생성

def function_1 (x) :
     return 2*pow(x,2) +1

print( numerical_diff(function_1,-2) )


문제148. 함수 f(x) = x^2 -x +5 함수의 x가 -2일때 미분계수를 구하시오 





■ 지난 주에 배웠던 내용 복습
  1. 함수
- 머신 러닝을 이해하기위한 Mit TTT 코드 구현
- 웹 스크롤링 ----> 빅데이터 수집
  1.  
6장함수 
for 
while
continue
break

5장. 파이썬 자료형 3가지 
  1. 리스트 []
  2. 튜플 ()
  3. 딕셔너리 {} (키와 값으로 구성된 자
   - 어순 번역기
   - nested loop join 구현
          ↓ data 양이 많아지면 느려진다.
   - hash join 으로 구현 (해쉬 알고리즘)  오라클이 이걸로 다른rdb회사 눌러버림

  1. Pandas 모듈을 이용해서 데이터 검색
          판다스 데이터 프레임 [ 열 ] [ 행 ]
            ↓  <---- 그룹함수 구현
           판다스 데이터 프레임 [ 열 ] [ 행 ] .max()
                                              .sum()
                                              .min()
                                              .mean()

           ↓  
          판다스 데이터 프레임.groupby([열])['기준컬럼(sal)'].max()

요번주 : 7장 함수, 8장. 모듈과 패키지 , 9장 .클래스 , 10장. 예외처리  
          11장. 파일에서 데이터 읽고 쓰기 ------> Tic Tac Toe 게임

     1세대 인공지능: 1954년 캠브리지 대학에서 Tic Tac Toe 를 사람과 게임할 수 잇또록 구현
          ↓ 
     체스가 구현 
          ↓ ----> 신경망(딥러닝) 
     오목, 바둑  (2016년)

     인공지능에서 무언가 혁신적인게 나온다면 그것은 바로 구글에서 나올것이다.
      - 에릭 슈미스 (구글 사장 ㅋ)




■ 7장. 함수 

  • 7장. 목차 
  • 1.함수생성하는 방법
  • 2.기본값 매개변수와 키워드 매개변수 (mit 코드 이해)
  • 3.가변 매개변수  (mit 코드 이해)
  • 4.매개 변수로 함수를 사용하는 경우
  • 5.함수 밖의 변수, 함수 안의 변수
  • 6.재귀함수  (mit 코드 이해)
  • 7.중첩함수 

■ 7.2. 기본값 매개변수와 키워드 매개변수 (p 145)
기본값 매개변수? 입력하지 않으면 기본으로 할당되는 매개변수

예 : log(4   ,   2)    ,    log(10)
         ↑      ↑              ↑
       지수     밑수             지수    밑수는 자연상수e 가된다.

예제 : 
 def print_string(text,count = 1): #  count = 1 디폴드 값을 지정
  for i in range(count):
    print(text)
 
 print(print_string("안녕하세요") )
 print(print_string("안녕하세요"),3 )

문제149. 아래와 같이 이름만 넣으면 소속팀과 직위가 출력되는 함수를 생성하시오 
def print_string(name='장경원',team='머신러닝팀',position='팀장'):
  print(name)
  print(team)
  print(position)

 
def print_string(name,team='머신러닝팀',position='팀장'):
  print('이름 = {0}'.format(name) )
  print('소속팀 = {0}'.format(team ) )
  print('직위 = {0}'.format(position ) )

설명 : 문자열.format()

■ Mit TTT코드에서 기본값 매개변수 사용하는 부분 

class Agent(object):

    def __init__(self, player, verbose = False, lossval = 0, learning = True):

        self.values = {}

        self.player = player

        self.verbose = verbose

        self.lossval = lossval

        self.learning = learning

        self.epsilon = 0.1

        self.alpha = 0.99

        self.prevstate = None

        self.prevscore = 0

        self.count = 0

        enumstates(emptystate(), 0, self)

■ 가변 매개변수 (p147) 
문자열.format() 함수 처럼 매개변수의 수가 유동적인 함수를 만들고 싶을 때 사용하는 변수 
함수 실행할때 매개변수를 10개 , 20개를 입력해도 제대로 동작을 한다. 

예 :
def 함수이름(*매개변수):
          코드 블럭

예제:
def merge_string(*text_list):
     result = ''
     for s in text_list:
      result = result + s + '  '
     return result
merge_string('아버지가','방에','들어가신다')  

파이썬에서 * 가 쓰이는 경우 
  1.가변 매개 변수
  2.리스트 변수내의 요소들을 뽑아낼ㄸ ㅐ--> mit 코드


문제150. mit TTT코드에서 보드판을 출력하는 printboard 함수를 분석하시오
(리스트 변수내의 요소를 ㅃ보아내는 문법이 나온다.

# States as integer : manual coding
EMPTY = 0
PLAYER_X = 1
PLAYER_O = 2
DRAW = 3

BOARD_FORMAT = """----------------------------
| {0} | {1} | {2} |
|--------------------------|
| {3} | {4} | {5} |
|--------------------------|
| {6} | {7} | {8} |
----------------------------"""
NAMES = [' ', 'X', 'O']

def printboard(state):
    """ Print the board from the internal state."""
    cells = []
    for i in range(3):
        for j in range(3):
            cells.append(NAMES[state[i][j]].center(6))
    print(BOARD_FORMAT.format(*cells))


printboard([[1,2,0],[0,0,0],[0,0,0]])

print(BOARD_FORMAT.format('a','b','c','d','e','f','g','h','g'))  

print(BOARD_FORMAT.format('x','o','x','o','x',' ',' ',' ',' '))

print(BOARD_FORMAT.format('x'.center(6),'o','x','o','x',' ',' ',' ',' '))


7.4.매개 변수로 함수를 사용하는 경우

  • 함수의 종료의 의미로  return 을 사용하는 경우
예제:
def stop_fun(num) :
  for i in range(1, num + 1) :
    print ('숫자 {0} 울 출력합니다'.format(i)) 
    if i =0 5:
     return 
stop_fun(10)



def enumstates(state, idx, agent):
    if idx > 8:
        player = last_to_act(state)
        if player == agent.player:
            agent.add(state)
    else:
        winner = gameover(state)
        if winner != EMPTY:
            return
        i = int(idx / 3)
        j = idx % 3
        for val in range(3):

               state[i][j] = val
               enumstates(state, idx+1, agent)

문제151. (점심시간 문제) 아래와 같이 숫자를 입력하고 함수를 실행하면 숫자가 세로로 출력되게 하시오 

def print_something(*num):

     for s in num :
         print(s)

  1. 함수 밖의 변수, 함수 안의 변수

     로컬 변수? 함수 내에서만 사용하는 변수
     글로벌 변수? 함수 내,외 둘다 사용 가능한 변수 
               특정함수에서 출력된 결과를 다른 함수에서 사용할 때 
               사용합니다. 


함수안의 변수와 함수 밖의 변수가 서로 이름이 같다해도 전혀 다른 변수이다. 
만약 같은 변수로 취급하려면 global 변수로 선언해야한다. 

예제: 
def scope_test():
  a = 1  # 함수 내에서 사용하는 변수 (로컬변수)
  print ('a : {0}'.format(a) )

scope_test()


문제152. 마지막 위의 스크립트에서 마지막 scope_test()를 실행했을때 a가 1 이 아니라 0이 출력이 되려면
         scope_test() 함수를 생성할 때 어떻게 생성해야 했을가요?
a = 0
def scope_test():
  a = 1  # 함수 내에서 사용하는 변수 (로컬변수)
  print ('a : {0}'.format(a) )

scope_test()

  • 재귀함수
  • 스택구조 
  • 큐구조 : 선입선출( 먼저 들어온게 먼저 처리)

sql에서 큐를 경험해봤다
Enqueuue 락 
서로 업데이트 하려면 락이걸린다. 
a b c 
a: lock holder
b,c : lock waiter 

scott A

update emp
 set sal = 0 
 where ename = 'KING';

* 스택 구조 : 먼저들어간 데이터가 가장 마지마겡 나오는 구조 LIFO
후입 선출 

스택 루프 반복문 
반복문 (LOOP) + 스택 구조 ===> 재귀 알고리즘 

예 : 
def some_func(count) :
  if count > 0 :
     some_func(count -1) 
  print (count)

some_func(100)

10 ---> call하고 기다림 ---> 기다림이 끝나면 print 10
 9 ---> call하고 기다림 ---> 기다림이 끝나면 print 9
 8 ---> call하고 기다림 ---> 기다림이 끝나면 print 8
 7 ---> call하고 기다림 ---> 기다림이 끝나면 print 7
                         :
                         :
                                             print 0 
0 ---> 함수 호출 끝 


문제153. 10! 을 재귀함수로 구현해서 출력하시오 !

def factorial2(count) :

  if count > 0 :
     return count * factorial2 (count -1)
  elif count == 0:
     return 1

문제154. 16과 28의 최대공약수를 출력하는데 재귀함수를 이용해서 
          구현하시오 ! 
find_gcd(20,16)
최대 공약수는 4

find_gcd(108,72) 
최대 공약수는36

def find_gcd(num1, num2):
 if num1%num2 != 0: return find_gcd(num2, num1%num2)               
 else : return num2


li=[]
def find(*num):
if a%b != 0: return find_gcd(b, a%b)               
 elif a%b == 0 : return find_gcd(c, b%c)  
 return c
li=[]
def print_something(*num):





문제155. 오늘 오전에 배운 가변 매개변수와 재귀 알고리즘을 이용해서 최대 
          공약수를 출력하는 함수를 생성하시오 

def find_gcd(a,b,c):
 if a%b != 0: return find_gcd(b, a%b,c)
 elif b%c != 0: return find_gcd(a, b ,b%c)
 return b

def find_gcd(a,b,c):
 if a%b != 0: return find_gcd(b, a%b)               
 elif a%b == 0 : return find_gcd(c, b%c)  
 return c
li=[]
def print_something(*num):

     for s in num :
       li.append(s)

a= 1000%700%74
print (a)


내일 PL/SQL 알고리즘 문제 시험범위: 오픈북, 실습가능

오늘 배운 재귀 알고리즘을 PL/SQL로 구현하는 문제 2개
예 SQL> exec dbms_output.put_line( factorial(5) )



7.7 중첩함수 ( p 158)
" 파이썬에서는 함수 안에 함수를 정의하는거싱 가능하다"
중첩함수는 자신이 소속된 함수의 매개변수에 접근할 수 있다는 특징이 있다. 

예제: p159 쪽 (표준편차를 출력하는 함수)

* 표준편차를 구현하기 위한 함수 2개

   1. 평균값 구하는 함수
   2. 분산을 구하는 함수
   3. 구해진 분산값에 루트를 씌운 값을 출력하는 함수

예제:

(pg159)

import math
def stddev(*args):
    def mean():                               #평균 구하는 함수
        return sum(args)/len(args)

    def variance(m):                       # 분산을 구하는 함수
        total = 0
        for arg in args:
            total += (arg - m) **2
        return total/(len(args)-1)
    v= variance(mean())                # 분산을 구함
    return math.sqrt(v)                 # 분산에 루트를 씌워서 표준편차를 구함

stddev(2.3,1.7,1.4,0.7,1.9)


import math
def stddev(*args):
 def mean():
    return sum(args)/len(args)

 def variance(m):
   total = 0
   for arg in args:
      total += (arg -m) **2
   return total / (len(args)) - 1
v= variance(mean() )
return math .sqrt(v)
stddev(2.3, 1.7, 1.4, 0.7, 1.9)

  
문제156. 가변 매개변수를 이용해서 여러개의 숫자를 입력 받아 최대공약수를 
출력을 해낸 준호의 코드를 가져다가 중첪함수를 구성하시오 ! 

def gcdtwo(a,b):                    두 수의 최대공약수를 출력
                                    분모가 0일경우 에러가 발생하므로 0인 경우를 따로 생각
    if min(a,b) == 0:               # 0 A의 최대공약수는 무조건 A 이기 떄문에
        return max(a,b)             두 수중 최소값이 0인경우 두 수중 맥스값으로 최대공약수 출력
    return gcdtwo(b,a%b)            # 0이 아닌경우에 대해 유클리드호제법으로 재귀

def gcd(a):                         여러 수 중에서 최대공약수를 출력하는 알고리즘
    b=gcdtwo(max(a),min(a))         여러 수 중 두수를 뽑아서 최대공약수를 구하고
                                    다른 두수를 뽑아서 최대공약수를 구하고를 반복해서
    a.remove(min(a))                마지막에 남는 최대공약수가 전체의 최대공약수인 점을 이용
    a.remove(max(a))                정렬할 필요가 없게 전체 수에서 최대최소값을 뽑아서
                                    최대공약수를 구하는데 계산에 사용한 수는 제거하고
    a.append(b)                     위에서 구한 최대공약수를 리스트에 추가
    if max(a)==min(a):              위 과정을 재귀를 통해 반복하면 최대공약수만 2개 남는데
        print('최대공약수는 : ',a[0])  그경우에서 재귀를 종료하고 최대공약수를 출력
    else:
        gcd(a)


def list(*n):                       가변 매개변수로 데이터를 여러개 입력받으면
                                    튜플 형태이기 때문에 데이터 변경이 불가능
    a = []                          리스트를 생성하고 데이터 변경이 가능하도록
    for in n:                     튜플 데이터를 잘라서 리스트에 입력
        a.append(i)
    gcd(a)                          최종적으로 생성한 리스트 변수를
                                    위에 생성한 최대공약수 함수에 입력해서 최대공약수 계산




def list(*n):
    def gcdtwo(a,b):

        if min(a,b) == 0:
            return max(a,b)
        return gcdtwo(b,a%b)

    def gcd(a):
        b=gcdtwo(max(a),min(a))

        a.remove(min(a))
        a.remove(max(a))

        a.append(b)
        if max(a)==min(a):
            print('최대공약수는 : ',a[0])
        else:
            gcd(a)

    a = []
    for i in n:
        a.append(i)
    gcd(a)

list(4,8,12)
list(6842,176,154)

■ 재귀 알고리즘을 완성하는 문제
 MIT 코드를 이해하기 위해서 반드시 알아야하는 알고리즘 
  1. greedy (탐욕) 알고리즘
     당장 눈 앞의 이익만 추구하는 것 
     먼 미래를 내다 보지 않고 지금 당장의 최선이 무언인가만 판단 
 
     예 : 틱택토 코드가 가장 유명한 예이다.


문제157. 탐욕 알고리즘을 이용하여 금액과 화폐가 주어졌을 때 
          가장 적은 화폐로 지불 하시오 !
액수입력 : 362
화폐 단위를 입력 !: 1 50 100

결과 :
100원     3개
50원       1개
1원          12개 




def coinGreedy(money, cash_type):
    cash_type.sort(reverse=True)

    def coinGreedyRecursive(money, cash_type, res, idx):
        if idx >= len(cash_type): #화폐 다 사용 시 종료
            return res

        dvmd = divmod(money,cash_type[idx] )
        res[cash_type[idx]] = dvmd[0]
        return coinGreedyRecursive(dvmd[1] ,cash_type,res,idx+1)

    return coinGreedyRecursive(money,cash_type,{},0)
money = int(input('액수입력 : '))
cash_type = [int(x) for x in input('화폐단위를 입력하세요 : ').split(' ')]
res = coinGreedy(money,cash_type)
for key in res:
    print('{0}원 : {1}개'.format(key,res[key]))



■8장. 모듈과 패키지 
  • 8장 목차 
    • 1. 모듈이란?
    • 2. import 사용법
    • 모듈 찾는 방법
    • 메인 모듈과 하위 모듈
    • 패키지
    • _init_.py

8.1 모듈이란? 독자적인 기능을 갖는 구성요소
              파이썬에서는 각각의 소스파일을 일컬어 모듈이라고 한다. 

모듈 생성 예 :

save as calculator.py
def plus(a,b):
  return a+b

def minus(a,b):
  return a-b

def multiply(a,b):
  return a*b

def divide(a,b):
  return a/b

import calculator

print (calculator.plus(10,5))
print (calculator.minus(10,5))
print (calculator.multiply(10,5))
print (calculator.minus(10,5))

■8.2. import 사용법 
import 의 역할은 정확하게는 다른 모듈 내의 코드에 대한 접근을 가능하게 하는 것이다.
import 가 접근 가능하게 하는 코드에는 변수, 함수 , 클래스등이 모두 포함된다.

앞에서 썼던 문법 :
import 모듈명

import calculator 

print ( calculator.plus(10,5) )
               
         ↓
좀더 편하게 코딩 : from 모듈명 import 변수 또는 함수 

                   from calculator import plus
                   from calculator import minus 
                   from calculator import multiply
                   from calculator import divide

               print ( plus(10,5) )

 
                ↓
좀더 편하게 코딩 : from 모듈명 import *
                    print ( plus(10,5) )

p 168  import * 와 같은 코드는 사용하지 않는것이 좋다.

이유?       코드가 복잡해지고 모듈의 수가 많아지면 어떤 모듈에 또는 어떤 함수를 불러오고 있는지 파악하기 힘들다

좀더 편하게 코딩 : import calculator as c
                    print (c.plus(10,5) )



문제159.오전에 만들었던 준호의 최대공약수를 구하는 함수를 모듈화 하시오 !



if _name_=="__main__": 모듈을 불러올때 이문장 이후의 문장은 수행되지 않음
list (1000,3350,150)

문제160. 표준편차를 출력하는 함수를 모듈화 시켜서 다른 실행창에서 아래와 같이 실행되게 하시오!




■8.3. 모듈 찾는 방법

방금 만든 calculator 모듈의 위치는 우리가 직접 지정한 위치에 저장되어있었고
calc_test.py 에서 calculator 모듈을 불러올 수 있었다. 

sys 라는 모듈( 예: random 함수를 포함하고 있는 모듈) 어디에 있는가?
 
파이썬은 import를 만나면 아래와 같은 순서로 모듈 파일을 찾아나선다.
  1. 파이썬 인터프리터 내장 모듈
  2. sys.path 에 정의 되어 있는 디렉토리 

sys 모듈은 파이썬의 내장 모듈이다. 

sys 모듈에 들어있는 함수들이 뭐가 있는지 확인하는 코드 

import sys
print ( sys.builtin_module_names)

문제161. 혜승이가 sys모듈의  random 함수를 이용해서 경이로운 방법으로 구현해낸 원주율 구하는 코드를 실행해보자 























 
 

'PYTHON' 카테고리의 다른 글

gcp를 이용해서 jupyter notebook / jupyter lab 서버 만들기  (0) 2018.08.27
9장. 객체와 클래스 (가장 중요한 단원)  (0) 2017.09.10
8장. 모듈  (0) 2017.09.10
6장. if 문과 loop문 (p126)  (0) 2017.09.10
1-5장  (0) 2017.09.10



■ 6장. if 문과 loop문 (p126)


    * 6장 목차


    1. if문
    2. for loop문
    3. while loop문
    4. 중첩 loop문
    5. continue와 break 사용법


알고리즘 문제들을 파이썬으로 구현 ---> 전날 알고리즘 문제2개 공부
                                       다음날 문제2개 오픈북
                                       문제만 다른것으로 살짝 변경해서 PL/SQL

알고리즘 문제를 해결하는 목적     ---> 파이썬 프로그래밍을 잘하기 위해서 공채시험문제(파이썬)

■ if문 예제 (p126)

if 조건1 :
 실행문

elif 조건2 :              " 조건이 true  이면 실행이되고 조건이 false이면
 실행문                     실행이 안된다. "

elif 조건3 :
 실행문

else:   <----------- 생략가능
 실행문


    * 조건이 false로 평가 되는 경우 (p 118)


    1. False
    2. None
    3. 숫자 0
    4. 비어있는 순서열 : '' , () : 비어있는 튜플  , [] : 비어있는 리스트
    5. 비어있는 딕셔너리 : {}



문제111. 숫자를 물어보게하고 숫자를 입력해서 짝수인지 홀수인지를 출력하는 if 문을 이용한 파이썬
          코드를 작성하시오!

------------
|  if 문  |
------------
a = input('숫자를 입력하세요 ')
if int(a)%2 == 0 :
     print ('짝수입니다')
else:
     print ('홀수 입니다.')


문제112. 위의 if문의 예제로mod 함수를 구현하시오 !
------------
|  if 문   |
------------
     print  (mod(10))
     짝수입니다.

def mod(a):
 res =''
 if int(a)%2 == 0:
  res ='짝수입니다'
 else:
  res ='홀수 입니다.'
 return res

print(mod(10))

문제113. 이름을 물어보게하고 이름을 입력하면 해당 사원이 고소득자인지
          저소득자인지 출력되게 하시오 !

          월급 >= 3000      고소득자 입니다.
          월급 >= 2000      적당합니다.
          월급 < 2000       저소득자입니다.     


import pandas as pd
emp = pd.DataFrame.from_csv("D:\data\emp.csv")
a= input('이름입력')
empresult = emp[ ['sal'] ][emp['ename'] == a]
empresult = empresult.values[0]
print(empresult)
if int(empresult) >=3000 :
    print ('고소득자입니다')

elif int(empresult) >=2000 :
    print ('적당합니다.')
elif int(empresult) <2000 :
    print ('저소득자입니다.')


문제114. 위의 문제를 다시 수행하는데 이름을 소문자로 입력해도 결과가 출력되게 하시오


import pandas as pd
emp = pd.DataFrame.from_csv("D:\data\emp.csv")
a= input('이름입력')
empresult = emp[ ['sal'] ][emp['ename'] == a.upper()]
empresult = empresult.values[0]
print(empresult)
if int(empresult) >=3000 :
    print ('고소득자입니다')

elif int(empresult) >=2000 :
    print ('적당합니다.')
elif int(empresult) <2000 :
    print ('저소득자입니다.')

문제115. (알고리즘 문제 ) 가우스 공식으로 1부터 10까지의 숫자의 합을 출력하시오 !
------------
|  if 문  |
------------
첫번째 수를 입력하시요 ~ 1
마지막 수를 입력하시오 ~ 10

1부터 10의 합은 55입니다.
a  = input('첫번째 수를 입력하세요 ! ')
b  = input('마지막 수를 입력하세요 ! ')

res ('%a 부터 %b 까지 합은 ',%a , %b)

a  = int(input('첫번째 수를 입력하세요 ! '))
b  = int(input('마지막 수를 입력하세요 ! '))
if a < b
res = (b*(b+1)/2) - (a*(a+1)/2)
res= (a+ b) / 2 *(b- a  -1)
print(int(a),' 부터 ',int(b),'까지 합은 ',int(res))
else :
print ('
첫번재 입력한 숫자가
두번째 입력한 숫자보다 큽니다
')


문제116. 위ㅡ이 문제를 다시 수행하는데 아래와 같이 큰 숫자를 먼저입력하면 첫번재 입력한 숫자가
두번째 입력한 숫자보다 큽니다 라는 메세지가 출력되겧 사ㅗㅇ


a  = input('첫번째 수를 입력하세요 ! ')
b  = input('마지막 수를 입력하세요 ! ')

res ('%a 부터 %b 까지 합은 ',%a , %b)

a  = int(input('첫번째 수를 입력하세요 ! '))
b  = int(input('마지막 수를 입력하세요 ! '))
if a < b:
 res = (b*(b+1)/2) - (a*(a+1)/2)
 res= (a+ b) / 2 *(b- a  -1)
 print(int(a),' 부터 ',int(b),'까지 합은 ',int(res))
else :
 print ('첫번재 입력한 숫자가 두번째 입력한 숫자보다 큽니다')

■ 6.2 for loop  문
문법 : for 반복변수 in 순서열:
                         ↑
          실행문       리스트, 튜플, 문자열

예제:
for i in (1,2,3)   # 리스트
       print (i)

for i in ['a','b','c']
 print(i)

for i in 'I am a boy':
     print(i)

for i in range(0,5):
 print(i)

for i in range(5):
 print(i)

for i in range(1,10,2):
 print(i)

문제117. 구구단 2단을 출력하시오!

2 x 1 = 2
for i in range(2,10):
 for j in range(1,10):
 print(i 'x',i,' = ',i*j)
문제118., 별표 출력 !

for i in range(1,12):
 res=''
 for j in range(1,i):
  res+='★'
 print(res)

 for i in range(1,11):
     print('★'*i)

문제119. 별표 출력 반대로!!

 for i in range(10,0,-1):
     print('★'*i)

문제120. 아래와 같이 출력하시오 !

for j in  range(5):
 print(('w'*j).rjust(10))

for i in range(5,0,-1):
 print(('★'*i).rjust(10))

for i in range(5)
 print ((' '*i),('★'*5-i))

for i in range(5,0,-1):
 print ((' '*i),('★'*5-i))

for i in range(10,0,-1):
    if i>=5:
        a=(' '*i)
        b=('★'*(10-i))
        print(a+b)
    elif i<5:
        c=(' '*(10-i))
        d=('★'*(i))
        print(c+d)

문제121. 중첩 for loop 문을 이용해서 ★ 로 사각형을 만드시오 !

가로의 숫자를 입력하시오 5
세로의 숫자를 입력하세요 5

★ ★ ★ ★ ★
★ ★ ★ ★ ★
★ ★ ★ ★ ★
★ ★ ★ ★ ★
★ ★ ★ ★ ★


a = int(input('세로숫자를 입력하세요 '))
b = int(input('가로숫자를 입력하세요 '))

-- for loop 중첩 안 했을 때
for i in range(a):
 print ('★'*b)


-- for loop 중첩 했을 때
for i in range(a):
 res = ''
 for j in range(b):
  res += '★'
 print(res)


문제122. 구구단을 가로로 출력하시오 ~

for i in range(1,10):
 res = ''
 for j in range(2,10):
   res += (str(j)+' x '+str(i)+' = '+str(i*j)+ '  ').ljust(13)
 print(res)

문제123. for loop 문을 이용해서 power함수를 구현하시오
밑수를 입력하세요 ~ 2
지수를 입력하세요 ~ 3

2의 3승은 8 입니다.


a = int(input('밑수를 입력하세요 '))
b = int(input('지수를 입력하세요 '))
res =1
for i in range(b):
    res *= a

print (a,'의 ',b,'승은 ',res,'입니다')

설명:

    1. ('★' for i in ragne(5)) # for loop 문을 5번 돌려서 ★★★★★
    2. join : ★5개를 모아주는 메소드
    3. ''. : result 변수를 '' (None)으로 하겠다.

■ 숫자, 문자, 공백이 스크립트안에 얼마나 포함되었는지 확인하는 방법
 s = 'some stirng'

 numbers = sum(c.isdigit() for i in s)
 words   = sum(c.isalpha() for i in s)
 space = sum(c.isspace() for i in s)

문제124. 겨울왕국 대본에는 숫자가 몇개나 있는가?
numbers =0
text_file = open("d:\data\winter.txt",'r')
lines = text_file.readlines()
total = 0
for i in lines :
  numbers += sum(c.isdigit() for c in i )

문제125. 공백도 아니고 문자도 아니고 숫자도 아닌 문자가 (특수문자)
         몇개 나 있는지 확인하시오
text_file = open("d:\data\winter.txt",'r')
lines = text_file.readlines()
numbers =0
total = 0
alpha = 0
spaces =0
for i in lines :
 total += len(i)
 numbers += sum(c.isdigit() for c in i )
 alpha += sum(c.isalpha() for c in i )
 spaces += sum(c.isspace() for c in i )

print(total-numbers-alpha-spaces)
■while loop
문법 : while 조건 :
          실행문


예제 :
print ('몇번 반복할까요 : ? ')
limit = int(input('반복할 횟수를 입력하세요'))
count = 0
while count < limit:
     count += 1
     print('{12} 회 반복.'.format(count) )

문제126. 숫자를 물어보게하고 숫자를 입력하면 해당 숫자만큼
         아래와 같은 그림이 그려지게 하시오!

숫자를 입력하세요  6

c=0
a = int(input('숫자를 입력하세요  '))
while c < a :
 c+=1
 quf =('★'*c).rjust(10)
 print(quf)
문제127. 팩토리얼 while loop 문으로 구현하시오 !
     팩토리얼 숫자를 입력하세요 !  5
     120 입니다.
     5*4*3*2*1

문제128. log함수를 파이썬으로 구현하시오 ! (while loop문으로 )
          ( 알고리즘 문제 6번)

c= 0
a = int(input('밑수를 입력하세요 '))
b = int(input('지수를 입력하세요 '))
if a%b == 0 :
while a < b :
 c+=1
 a = c * a
-- 정수자리 찾기! 완료








다우니 향!~
노말 퍼퓸

문제129. (공채에서 가장 많이 나온느 알고리즘 문제)
          두수를 입력 받아서 최대공약수를 구하시오 !
          while loop 문 + 유클리드 호제법
     첫번째 수를 입력하세요 ~ 24
     두번재 수를 입력하세요 ~ 18
          6 입니다.


while a%b !=  0 :
 if b > a :
  (a, b) = (b, a) # swap !!!!
 c = a%b
 a = b
 b = c
print (str(c)+'입니다')

-- 정수자리 찾기! 완료



문제130. (마지막 문제) 최대 공약수를 알굇픙ㄴ 2개 숫자를 입력하세요

a = input('최대공약수를 알고 싶은 2개의 숫자를 입력하세요 ')
li = []
li = a.split(' ')
a = int( li[0] )
b = int( li[1] )
while a%b !=  0 :
 if b > a :
  (a, b) = (b, a) # swap !!!!
 c = a%b
 a = b
 b = c
print (c)




■ 6장. if 문과 loop문 
           - for loop
             -알고리즘
               1.금방생각해도 구현할 수 있는 문제
               2.오래 생각해야 구현할 수 있는 문제
               ( 버블정렬, 최단거리, 탐욕 알고리즘 ) 
                                        ↑
                                   mit 공대 코드
               mit 공대 머신러닝 코드를 이해하기 위한 문법?
                    1.format 함수     
                    2.for loop
                    3.함수 생성하는 방법
                    4.자료형 - 리스트, 튜플, 딕셔너리
                    5.if 문
                    6.몬테칼르로 알고리즘  -- 혜승이 원주율 구하는 코드 
                                               파이썬으로 구현 !
                    7.탐욕 알고리즘
                    8.수학공식
               
          self.values[self.prevstate] += self.alpha * (nextval - self.prevscore)
               - while loop

■ 6장. if 문과 loop문 (p126)

  • 6장 목차
  1. if문
  2. for loop문
  3. while loop문
  4. 중첩 loop문


■ 6.4.  continue 문(p137) 

 "반복문이 실행되는 동안 특정 코드블럭은 실행하지 않고
   다른 코드 블럭만 실행되게 할때 사용하는 문법 "

예제 설명: 

 for i in range(10) :
   if i $ 2 == 1:
     continue         # 홀수는 컨티뉴 제껴라!
   print (i)



문제131. 숫자를 1부터 10까지 출력하는데 중간에 5는 나오지 않게 ! 

for i in range(10):
 if i == 5 :
     continue
 print (i)


■ break 문
     "루프를 중단시키는 역할을 하는 문법"

예제 :   



    i  =  0
             while (True) : # 무한 루프 돌리겟따
             i += 1
             if i == 1000:
                 print('i가 {0}이 됨. 반복문을 중단함',format(i))
                 break
             print(i)
문제132. 함수를 생성하는데 아래와 같이 숫자를 넣어서 실행하면 
          해당 숫자만큼 숫자가 세로로 출력되게 하시오 ~
print( break_fun(10) ) # 10 이 loop문을 중단시킬 숫자 
1
2
3
4
5
6
7
8
9
10
none

문제133. 위의 함수를 수정해서 결과가 아래와 같이 가로로 출력되게 하시오 


def break_fun(val):
    res =''
    num =1
    while 1:
        res += str(num) + ' '
        if num == val:
            break
        num += 1

    print(res)
print(break_fun(10))

■6장에서 배운 내용 if 문과 loop[문을 정리하는 문제

  • pandas 를 이용해서 1.판다스 기본 문법

  •     pandas를 이용하지 않고 조인
  • 1. for loop문을 중첩해서 문제를 해결
  • 2. 딕셔너리 데이터 타입을 이해 (mit 코드에서도 중요하게 쓰인다.)

문제134. 아래와 같이 딕셔너리 형태의 데이터를 만들고 출력하시오 !
  • 파이썬 데티ㅓ 구조 3가지 1.리스트 2.튜플 3.딕셔너리(키와 값으로 구성)
emp_dic = {'mgr':'7788','sal':'1100','deptno':'20','comm':'0','job',:'CLERK','hiredate':'1983-01-15','empno':7876','ename':'ADAMS'}

emp_dic
emp_dic['mgr']

문제135. 6장에서 배운 for loop 를 이용해서 emp2.csv를 읽어와서 emp_dict라는 딕셔너리 데이터 유형ㅇ르 만드시오 
import csv
emp_file = open("D:\data\emp.csv",'r')
emp_csv = csv.reader(file)
emp = [] # 비어있는 리스트 하나 선언
for i in emp_csv :
   emp.append({'empno':i[0],'ename':i[1],'job',i[2],'mgr':i[3],'hiredate':i[4],'sal':i[5],'comm':i[6],'deptno':i[7]})
print(emp)
문제136.emp 딕셔너리 변수에서 이름만 출력하시오 
     그동안에는 emp_list변수에서 ename 에 해당하는 부분ㅇ르 출력해왓다면 
          ---> emp_list[1]
     지금은     emp_dic 변수에서 ename 에 해당하는 부분을 출력하는 것이다ㅣ
          ---> emp_dic[키]

문제137. 이름과 월급과 직업을 출력하시오 !

for emp_dic in emp:
    print(emp_dic['ename'].ljust(10),emp_dic['sal'].ljust(10),emp_dic['job'].ljust(10))


문제138. dept.csv 를 읽어서 딕셔너리 데이터 구조로 저장하고 아래와 같이 
         수행하면  deptno, dname, loc가 출력되게 하시오 


import csv
dept_file = open("D:\data\dept.csv",'r')
dept_csv = csv.reader(file)
dept= [] # 비어있는 리스트 하나 선언
for i in emp_csv :
   emp.append({'deptno':i[0],'dname':i[1],'loc',i[2]})


문제139. emp.csv 와 dept.csv 를 각각 읽어와서 emp_dic, dept_dic
         딕셔너리 자료형으로 만드는 스크립트를 하나로 합치시오 

import csv
dept_file = open("D:\data\dept.csv",'r')
emp_file = open("D:\data\emp.csv",'r')
dept_csv = csv.reader(dept_file )
emp_csv = csv.reader(emp_file)
dept= [] 
emp = []

for i in dept_csv :
  dept.append({'deptno':i[0],'dname':i[1],'loc':i[2]})

for i in emp_csv :
  emp.append({'empno':i[0],'ename':i[1],'job',i[2],'mgr':i[3],'hiredate':i[4],
               'sal':i[5],'comm':i[6],'deptno':i[7]})

문제140. emp와 dept라는 딕셔너리 자료구조를 만드는 스크립트와 중첩  for loop문을 이용해서 
         emp와 dept를 조인 시켜서 ename 과 loc를 출력하시오 

" nested loop 조인 방법 " 

for e in emp:
 for d in dept:
  if e['deptno'] == d['deptno']:
     print( e['ename'],d['loc'])

문제141. 부서위치가 DALLAS 인 사원들의 이름과 부서위치를 출력하시오 ! 

for e in emp:
 for d in dept:
  if (e['deptno'] == d['deptno'])  & (d['loc']  == 'DALLAS'):
     print( e['ename'].ljust(7),d['loc'])

for e in emp:
 for d in dept:
  if (e['deptno'] == d['deptno'])  and (d['loc']  == 'DALLAS'):
     print( e['ename'].ljust(7),d['loc'])

문제142. 위의 스크립트를 이용해서 조인 함수를 생성하시오 ! 

print (join( emp, 'ename',dept,'loc','deptno')) 


def join(t1,col1,t2,col2,jn):
 for e in t1 :
     for d in t2 :
      if e[jn] == d[jn]:
         print( e[col1 ].ljust(7),d[col2])

join( emp, 'ename',dept,'loc','deptno')




문제143. Pandas를 이용해서 ename 과  loc 를 출력하시오 


import pandas as pd

emp= pd.read_csv("D:\data\emp.csv")
dept= pd.read_csv("D:\data\dept.csv")

result  = pd.merge(emp,dept,on='deptno')
print (result[['ename','loc']])


문제144. 부서위치가 dallas인 사원들의 이름과 부서위치를 출력하시오pandas사용
import pandas as pd

emp= pd.read_csv("D:\data\emp.csv")
dept= pd.read_csv("D:\data\dept.csv")

result  = pd.merge(emp,dept,on='deptno')
print (result[['ename','loc']][result['loc']=='DALLAS'])

문제145. 이름과 부서위치를 출력하는데 아래와 같이 Outer join을 구현하시오 

select e.ename, d.loc
  from emp e , dept d
 where e.deptno = d.deptno(+);

import pandas as pd

emp= pd.read_csv("D:\data\emp.csv")
dept= pd.read_csv("D:\data\dept.csv")

result  = pd.merge(emp,dept,on='deptno',how='right')
print (result[['ename','loc']][result['loc']=='DALLAS'])



















'PYTHON' 카테고리의 다른 글

gcp를 이용해서 jupyter notebook / jupyter lab 서버 만들기  (0) 2018.08.27
9장. 객체와 클래스 (가장 중요한 단원)  (0) 2017.09.10
8장. 모듈  (0) 2017.09.10
7장. 함수  (0) 2017.09.10
1-5장  (0) 2017.09.10

1-5장

PYTHON2017. 9. 10. 00:40
   ■ 파이썬을 통해서 우리가 이루고자 하는 목표 2가지
  1. 파이썬 문법 ( ~ 11장. ----> 웹스크롤링 ---> Tic Tac Toe)
                                                      ↓
                                                  1.단층 퍼셉트론
                                                  2.greedy 알고리즘
                                                  3.확률(몬테카를로)

                                                              ↓
                                                       통계학자4명+물리학자

  1. 웹스크롤링 기술

               신문사 ------> 트위터 -----------> 인스타그램

               원하는 사이트를 자유롭게 웹 스크롤링
  1. 머신러닝 프로그램 구현 (Tic Tac Toe - Mit 공대)


점프 투 파이썬


■ 파이썬 설치

인스타그램

■ 파이썬 설치
  1. 기본 파이썬 설치 파일
  1. 아나콘다(spider)

     - 웹스크롤링       : beautiful soup 모듈
     - 머신러닝(틱텍토) : numpy 모듈

  1. 파이참(pycharm)


■ 2장. 파이썬이란?

  1. 파이썬의 문법은 쉽다
  2. 라이브러리 (모듈) 이 많아서 유용하다
           -Numpy 모듈 : 수학 연산에 필요한 모듈
           -beautiful soup 모듈 : 웹스크롤링 모듈
           -pandas 모듈 : 데이터 검색 모듈


■3장. 파이썬 설치

■4장. 데이터 다루기

  • 4장 목차
1.파이썬에서 변수 사용법
2.산순연산자
3.함수
4.input 명령어 사용법

4.1. 파이썬에서 변수 사용법
      • 일반변수   : 변수 안에 데이터가 한 개
               예: a = 1000
                   print(a)


      • 리스트 변수: 변수안에 여러개의 데이터(요소)가 들어있는 변수

a=1000print(a)print(type(a))a='e'print(a)print(type(a))a=1/7.0print(a)print(type(a))a='elrkjer'print(a)print(type(a))a=''print(a)print(type(a))a=nullprint(a)print(type(a))
1000<class 'int'>e<class 'str'>0.14285714285714285<class 'float'>elrkjer<class 'str'>

<class 'str'>






  • 리스트 변수 : 변수안에 여러개의 데이터(요소)가 들어있느 ㄴ변수

d=[1000,2000,3000,4000]
print(d)
print(type(d))
------------------------
[1000, 2000, 3000, 4000]
<class 'list'>


문제1. 위의 d 리스트 변수에서 2000을 출력하시오

d=[1000,2000,3000,4000]
print(d[0])
[결과]
1000

문제2. d 리스트 변수안에 있는 요소드릉르 하나씩 출력하시오 !


d=[1000,2000,3000,4000]
for i in d:
    print(i)
[결과]
1000
2000
3000
4000

설명 : 파이썬은 PL/SQL이나 JAVA, C언어 처럼 ; [세미콜론]을 사용하지 않는다.
       그냥 : [콜론]을 사용하는데 (괄호쓰지않고 ) 반드시 콜론을 끝에 적어줘야하는
       문법이 if 문, while loop, for loop, def 함수 생성시 사용한다.

       PL/SQL 이나 자바,C 등을 사용하던 사람들은 뒤에 ; 을 붙이는 습관이있는데
       파이썬은 기본적으로 구문의 뒤에 아무것도 붙이지 않는다. 대신 IF문이나
     WHILE LOOP, FOR LOOP, DEF CLASS 문의 뒤에 는 꼭 붙여야한다.

     파이썬이 다른 언어보다 보기 쉽고 소스코드가 간결한 이유는
     콜론(:)을 사용해서 들여쓰기를 하도록 만들었기 때문이다.
     파이썬은 블럭구분을 들여쓰기를 통해서 한다.
     콜론(:) 뒤에 나오는 명령어를 다음줄에 작성하려면 들여쓰기를 해야한다.


문제3. a 라는 리스트 변수에 아래의 내용을 담으시오

a = ['7839','KING','PRESIDENT','0','1981-11-17','5000','','10']
for i in a:
    print(i)

문제4. a 리스트에서 7839만 출력하세요

a = ['7839','KING','PRESIDENT','0','1981-11-17','5000','','10']
print(a[0])

  1. 함수
■len 함수 : 리스트 변수안에 있는 요소들이 몇개인지 출력하는 함수

a = ['7839','KING','PRESIDENT','0','1981-11-17','5000','','10']
cnt = len(a)
print(cnt)

a = ['7839','KING','PRESIDENT','0','1981-11-17','5000','','10']
                                                       ↓
                                                      None
                                                    (오라클의 null)

문제6. 카페에서 파이썬 수업자료에 emp2.csv를 내려받아 D 드라이브 밑에
     data라는 폴더에 다운 받고 아래와 같이 수행한다.


import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
     print (emp_list)


문제7. 위의 결과에서 사원번호만 출력하시오

import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
     print (emp_list[0])


문제8. 이름과 월급을 출력하시오


import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (emp_list[2].rjust(10),emp_list[5].rjust(10))


문제9. 위의 14개의 리스트 변수의 요소의 갯수를 아래와 같이 출력하시오


import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (len(emp_list))

결과 :
8
8
8
8
8
8
8
8
8
8
8
8
8
8

문제10. 이름과 이름의 길이를 아래와 같이 출력하시오 !
SMITH 5
SCOTT 5
ALLEN 5


import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (emp_list[1] ,len(emp_list[1]))


■ 4.3 산술 연산자
     + 더하기
     - 빼기
     *곱하기
     / 나누기
     % 나눈 나머지 값
문제11. 사원번호, 이름 , 월급을 출력하시오

import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (emp_list[0] ,emp_list[1],emp_list[5] )

문제12. 이름과 연봉(sal*12) 을 출력하시오 !
설명 : 숫자로 형변환을 해주어야 한다.
import csv


file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (emp_list[0] ,emp_list[1],emp_list[5]*12 )
[결과]



설명: 숫자로 형변환을 해주어야 한다.
import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (emp_list[0] ,emp_list[1],int(emp_list[5])*12 )



문제13. 이름과 커미션을 출력하는데 커미션이 none 이면 0으로 출력하시오 !


def ifnull(var,val):
if var is '': 
return val
return var

import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
print (emp_list[1] ,ifnull(emp_list[6],0) )

문제14.(오늘의 마지막 문제 ) 이름과 월급 + 커미션을 출력하시오 !


def ifnull(var,val):
 if var is '':
  return val
 return var

import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[1] ,int(emp_list[5]) + int(ifnull(emp_list[6],0)) )
[결과]
...
KING 5000
BLAKE 2850
CLARK 2450
JONES 2975
MARTIN 2650
ALLEN 1900
TURNER 1500
JAMES 950
WARD 1750
FORD 3000
SMITH 800
SCOTT 3000
ADAMS 1100
MILLER 1300


def ifnull(var,val):
 if var is '':
  return val
 return var
import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
 print(emp_list[1],int(emp_list[5]),int(emp_list[5])+int(ifnull(emp_list[6],0)),int(emp_list[5])+int(ifnull(emp_list[6],0))-int(emp_list[5]), emp_list[6])



■ 어제 배운 내용
  1. 파이썬을 배우는 목표
ぁ 웹스크롤링 Big data 수집
ぃ 머신 러닝 - Tic Tac Toe 코드로 이해
     엔트로피 지수로 가장 좋은 수를 찾는 방법을 구현 코드

     퍼센트론  -----> 인공신경망
                         ↓
                    행렬, 벡터를 이용한 수학 공식을 계산

                    사람의 뇌 구조를 아주 조금 컴퓨터로 구현했는데
                    그 안에 뉴런에서 보내는 신호를 가중치로 표현을
                    해서 그 가중치(반복학습을 하면 중요하다는 것을 알게되는것 !)
                    를 계산해야 한다.

     2x + 3y + z  = 4
     x -  y  + 3z = 2     연립 방정식 계산식
     5x + 2y + z  = 4

          선형대수학


  1. 데이터 다루기
          - 변수 사용법
          - 산술 연산자
          - nvl 함수가 파이썬에는 없음


     *4장 목차
  1. 변수 사용법
  2. 산술 연산자
  3. 함수
  4. input 명령어

4.3. 함수
책 83 ~ 85
*우리의 목표에 맞춰서 나름대로 다시 정리

오라클
파이썬
1. 문자함수
upper
lower
initcap
substr
replace
length
rtrim
ltrim
trim
rpad
lpad
instr

upper()
lower()
사용자 함수
변수[1:2]
replace()
len()
rstrip()
lstrip()
strip()
사용자 함수
사용자 함수
사용자 함수

2.숫자함수roundtruncmodpower

round()trunc()%power()
3.날짜함수months_betweenadd_monthsnext_daylast_day

사용자 함수
relativedelta사용자 함수monthrange
4.변환함수to_charto_numberto_date

str()int(), float()datetime.strptime()
5.일반함수
nvl
decode
case

사용자함수
 ifnull
사용자함수
if 문
6. 파이썬에 유용한 함수(MIT Tic Tac Toe)문자함수




변환함수


기타(MIT 코드 이해를 위해필수로 알아야하는 중요함수 )


format()isalpha()isnumeric()isspace()

list()tupple()

split
append
range
count

■ 연산자
  1. 산술 연산자
  2. 비교 연산자
  3. 논리 연산자
  4. 기타 비교연산자



오라클
파이썬
산술 연산자

+-

mod
+-/%
비교연산자

= !=>>=<<=

논리연산자

andornot
&|!
기타 비교 연산자
between .. andin, not inis nulllike
<=  & >=in==''^(시작), $(끝) , 정규식함수


문제15. 이름과 직업을 출력하는데 소문자로 출력하시오
---------------------------
 함수 : upper , lower 함수
---------------------------


import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[1] ,int(emp_list[5]) + int(ifnull(emp_list[6],0)) )


문제16.(MIT TTT 코드를 이해를 위해 중요한 기초 문제)
        이름을 출력하는데 이름의 첫번째 철자만 출력하고 소문자로 출력하시오!


import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[1][:1].lower())


문제17. 이름을 출력하는데 이름의 두번째 철자부터 마지막까지 소문자로

import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[1],emp_list[1][1:].lower())

문제18. 이름의 첫번째 함수는 대분자로 나머지는 소문자로 출력하시오
---------------------------
|함수: initcap 사용자 함수|
---------------------------

def initcap(val):
 return  val[0].upper()+val[1:].lower()
import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (initcap(emp_list[1]))

문제19. 이름의 첫번째 철자부터 세번째 철자까지 출력되게하시오 !
---------------------------
|함수: substr 사용자 함수 |
---------------------------

import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[1][0:3])

문제20. 이름의 첫번째 철자부터 세번째 철자까지 출력되게하시오 !

def substr (val, num1, num2):
     return val[num1-1:num2]
import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (substr(emp_list[1],1,3) )

문제21. 이름과 월급을 출력하는데 월급을 출력할 때에 0 대신에 * 를 출력하시오

import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[5].replace('0','*') )

문제22. 이름과 월급을 출력하는데 월급을 출력할때 0~2를 *로 출력하시오 !
---------------------
|함수: re 정규식함수|
--------------------- 참고사이트 : http://devanix.tistory.com/296
import re
import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (re.sub('[0-2]','*',emp_list[5]) )


sub(pattern, repl, string[, count=0])

문제23. 이름과 이름의 길이를 출력하시오 !
---------------------
|함수: len()        |
---------------------

import csv
file = open("D:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    print (emp_list[1],len(emp_list[1])  )

문제24. 아래의  split 함수의 예제를 수행해보시오!
---------------------
|함수: split()      |
---------------------
file = 'a b c d e f g'

print ( file.split(' ') )
['a' , 'b', 'c' ,'d' , 'e', 'f' ,'g']

문제25. 아래 file 변수의 요소들을 리시트 변수로 담아내서 두번째 요소인 b만 출력해보시오 !
file = 'a b c d e f g'

a = file.split(' ')
print(a[1])
print ( file.split(' ')[3])

문제26. 겨울왕국 대본을 공백을 구분으로 두고 나눠서 리스트 변수로 저장되게 하시오 ! 
---------------------
|함수: split()      |
---------------------

file = open("D:\data\winter.txt",'r')
for winter_list in file:
    a= winter_list.split(' ')
    print (a)
문제27. (점심시간 문제) 위의 스크립트를 이용해서 겨울왕국 각 리스트 변수안에 단어가 몇개 있는지 아래와 같이 출력되게하시오 

file = open("D:\data\winter.txt",'r')
for winter_list in file:
    a=len(winter_list)
    print (a)

문제28."썸! 

file = open("C:\Octave\winter.txt","r" )
b = 0
c = 0
for winter_list in file:
a= winter_list.split(' ')
b = b + len(a)

print(b)

문제29. 카운트 함수 써보자 
---------------------
|함수: count()      |


c = ['Anna','Elsa','Anna','Elsa']
d = c.count('Elsa')
print(d)
[결과]
2

file = open("C:\Octave\winter.txt","r" )
b = 0
c = 0
for winter_list in file:
a= winter_list.split(' ')
b+=a.count('Elsa')

print(b)

문제30. emp.csv 에서 14개의 사원번호를 출력해보자!

import csv
file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
b = []
for emp_list in emp_csv:

    b.append(emp_list[0])
print(b)


예제 :         a = [1, 2, 3]
               a.append(4)
               print(a)

               b = []
               b.append(1)
               b.append(2)
               b.append(3)
               print(b)
문제31. 겨울왕국 대본을 단어별로 출력하시오! 
           
          for loop                          for loop
csv ------------------> list 변수 ----------------------------> 하나의 단어  
                            ↓
     ['glide', 'and', 'pivot.\n']
     ['We', 'pull', 'away', 'slowly,', 'into', 'the', 'sky.', 'We', 'arrive', 'at', 'a', 'bird’s-eye\n']

file = open("D:\data\winter.txt",'r')

for winter_list in file:
   a= winter_list.split(' ')  # 스크립트 -----> 리스트 변수 
   for i in a:                # 리스트 변수 --> 단어
    print(i)

문제32. 위의 출력된 단어들을 하나의  list변수에 담으시오 

---------------------
|함수: append()      |
---------------------

 file = open("D:\data\winter.txt",'r')
B=[]
for winter_list in file:
   a= winter_list.split(' ')
   for i in a:
    B.append(i)

print(B)

문제33. 출력된 단어들 중에서 \n 은 잘라내시오 

-----------------------------------
|함수: lstrip(), rstrip(), strip()|
-----------------------------------

 file = open("D:\data\winter.txt",'r')
B=[]
for winter_list in file:
   a= winter_list.split(' ')
   for i in a:
    i = i.strip('\n')
    B.append(i)

 문제34. rpad 함수를 생성하시오 아래와 같이 실행되게 하시오 !
-----------------------------------
|함수:  rpad(), lpad() 함수       |
-----------------------------------


def rpad(var,val):
if var is '':
return val
return var

import csv

file = open("D:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:

    print (emp_list[1], emp_list[5] )




file = open("D:\data\winter.txt",'r')

a=0

b=0

for winter_list in file:   

        a= winter_list.split(' ')        

        b+=a.count('Elsa')

        

print (b)




     1. 날짜함수를 파이썬으로 생성
      - next_day (사용자 함수)
      - add_months ( 모듈 이용해서 구현)
      - last_day ( monthrange 함수)
      - months_between ( 사용자 함수) ---> ? 오래 생각해야할 문제
   2. input 명령어 + if 문 사용
   3. 비교 연산자 : ==
             >=
             <=
             !=
              >
              <
             in <----- 겨울왕국에서 긍정단어가 몇 개가 있는가?

   ■ 기타 비교연산자 :
   in   in
   between .. and    <= & >=
   like   정규식 함수
   is null   ==''

   ■논리 연산자:
   and   &
   or   |
   not   ^


문제62. 직업이 SALESMAN 이고 월급 1200 이상인 사원들의 이름과 직업과 월급을 출력하시오 !

import csv
file = open("d:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if (emp_list[2] == 'SALESMAN') & (int(emp_list[5]) >= 1200):
        print(emp_list[1], emp_list[5])




문제63. 월급이 1000에서 3000 사이인 사원들의 이름과 월급을 출력하시오 !
연산자:   between .. and |

import csv
file = open("d:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if (1000 <= int(emp_list[5])) & (3000 >=int(emp_list[5])):
        print(emp_list[1], emp_list[5])




문제64. 직업이 ANALYST, CLERK 인 사원들의 이름과 월급과 직업을 출력하시오 !
연산자:   in |
import csv
file = open("d:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[2] in ['ANALYST','CLERK']:
        print(emp_list[1], emp_list[5], emp_list[2])


문제65. 직업이 ANALYST, CLERK 이 아닌 사원들의 이름과 월급과 직업을 출력하시오 !
연산자:   in |

import csv
file = open("d:\data\emp2.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[2] not in ['ANALYST','CLERK']:
        print(emp_list[1], emp_list[5], emp_list[2])




문제66. 커미션이 null 인 사원들의 이름과 커미션을 출력하시오 !

   4. 파이썬 수업용 실습 데이터의 emp_comm.csv 를 다운받아서 수행
   연산자 :    is null
import csv
file = open("d:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[6] =='':
        print(emp_list[1], emp_list[6])



문제67. 커미션이 null 이 아닌 사원들의 이름과 커미션을 출력하시오 !
연산자:   ins not null

import csv
file = open("d:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[6] !='':
        print(emp_list[1], emp_list[6])




문제68. 이름의 첫번째 철자가 S 로 시작하는 사원들의 이름과 월급을 출력하시오 !
연산자:   like

import csv
file = open("d:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[1][0:1] =='S':
        print(emp_list[1], emp_list[6])




문제69. 이름의 두번쨰 철자가 M 인 사원들의 이름과 우러급을 출력하시오 !
연산자:   like

import csv
file = open("d:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[1][1:2] =='M':
        print(emp_list[1], emp_list[5])



문제70. 이름의 마지막 철자가 H인 사원들의 이름과 월급을 출력하시오 !
연산자:   like       

import csv
file = open("d:\data\emp_comm.csv",'r')
emp_csv = csv.reader(file)
for emp_list in emp_csv:
    if emp_list[1][-1] =='H':
        print(emp_list[1], emp_list[5])







'PYTHON' 카테고리의 다른 글

gcp를 이용해서 jupyter notebook / jupyter lab 서버 만들기  (0) 2018.08.27
9장. 객체와 클래스 (가장 중요한 단원)  (0) 2017.09.10
8장. 모듈  (0) 2017.09.10
7장. 함수  (0) 2017.09.10
6장. if 문과 loop문 (p126)  (0) 2017.09.10

  • 머신러닝 종류 3가지
  • 1. 지도학습 {입력값, 정답}
    • 분류 : knn, 나이브베이즈, 결정트리, svm
    • 회귀 : 선형회귀, 신경망

  • 2. 비지도학습 {입력값}

               :k-means 
     정답이 없으니 해법을 배우지 못하고 데이터의 형태를 가지고 
     유형을 나눠보는 것

  • 3. 강화학습 {입력값, 출력값, 출력에 대한 보상 }
               : 핑퐁 , 틱텍토


■ 9장. 목차
  1. k-means 란?
  2. k-means 실습1 ( 국영수 점수를 가지고 학생 분류)
  3. k-means 실습2 ( 쇼셜 미디어에 같은 성향을 갖는 사람들을 분류)
                    --> 책 실습 예제 


■ 1. k-means란? 
 각 문서들 속에 들어있는 데이터 분석을 통해 유사하거나 관계가 높은 항목끼리의 집합(클러스터)를 만들고 싶을때 
사용하는 알고리즘
  1. (처음 중심값 선택) 랜덤하게 중심값 (centroid)를 선태갛ㄴ다.
  2. (클러스터 할당) k 개의 중심값과 각 개별 데이터간의 거리를 측정한다. 가장 가까운 클러스터에 해당 데이터를 assign한다. 
  3. (새 중심값 선택) 클러스터 마다 새로운 중심값을 계산한다. 
  4. (범위 확인) 선택된 중심값이 변화가 어느정도 없다면 멈춘다. 

■ 데이터 수에 따른 적당한 k 값 계산 

     k = sqrt(n/2)
■ k-means 의 한계점 
  1. k 값 입력 파라미터를 직접 지정해줘야 한다. 
  2. 이상치(outlier) 에 민감하다 

 




■ 기본예제1 
1. 기본 데이터 셋을 만든다.
 
c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1)
row <- c("A", "B","C","D","E","F","G","H","I","J")
col <- c("X","Y")
data <- matrix(c, nrow=10, ncol=2,byrow=TRUE, dimnames=list(row,col))
data


2.위에서 만든 데이터 셋으로 plot 그래프를 그린다

plot(data)




km <- kmeans( data, 2) 
km$cluster
cbind(data, km$cluster)

> km$cluster
A B C D E F G H I J
1 1 2 1 2 1 2 2 2 1
> cbind(data, km$cluster)
  X Y
A 3 4 1
B 1 5 1
C 7 9 2
D 5 4 1
E 6 8 2
F 4 5 1
G 9 8 2
H 7 8 2
I 6 7 2
J 2 1 1
>

km$centers

> km$centers
  X   Y
1 3 3.8
2 7 8.0

3. km 파라미터 값들을 가지고 다시한번 시각화 하시오 !

plot(round(km$center) , col= km$center, pch = 22 , bg = "dark blue", xlim=range(0:10), ylim=range(0:10) )


 

4. 원래 데이터를 위의 그래프에 합쳐서 출력합시다.

plot(round(km$center) , col= km$center, pch = 22 , bg = "dark blue", xlim=range(0:10), ylim=range(0:10) )
par(new=T) 

plot(data, col=km$cluster +1 , xlim = range(0:10), ylim=range(0:10))





머신러닝 음악 분류 

문제243. 영어와 수학 점수로 크게 4 그룹의 학생 집합으로 분류하시오 ! 
1. 영어, 수학 둘다 잘하는 학생들 
2. 영어, 수학 둘다 못하는 학생들 
3. 영어는 잘하는데 수학은 못하는 학생들
4. 수학은 잘하는데 영어는 못하는 학생들 

  
academy <- read.csv("academy.csv", stringsAsFactors= F, header = T)
academy <- academy[-1]
academy

academy2 <- academy[, c(2,3)]

plot(academy2)
km <- kmeans(academy2,4)
km

plot(round(km$center) , col= km$center, pch = 22, bg = "dark blue",
     xlim=range(0:100), ylim=range(0:100) )
par(new=T)
plot(academy2, col=km$cluster +1 , xlim = range(0:100), ylim=range(0:100))

음악도 이렇게 분류가 될듯 한데 ㅋㅋ : 잘해보셈 

문제244. 영어와 수학을 둘다 잘하는 학생들이 누구누구인가?
 


x<- cbind( academy, km$cluster)
> km
K-means clustering with 4 clusters of sizes 6, 18, 17, 11

Cluster means:
  수학점수평균 영어점수평균
1     47.83333     44.16667
2     83.72222     65.00000
3     87.17647     85.64706
4     59.81818     77.27273

Clustering vector:
 [1] 3 2 1 2 3 3 2 2 1 4 3 3 4 1 3 2 2 3 3 3 2 2 4 2 2 2 4 3 2 4 2 3 4 3 1 2 2 3 3 4 4 3 4 2 1 3 4 2 3 4 1 2

Within cluster sum of squares by cluster:
[1]  791.6667 1775.6111 1304.3529 1273.8182
 (between_SS / total_SS =  79.4 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"
> x[km$cluster==3,]
   국어점수평균 수학점수평균 영어점수평균 과학점수평균 학업집중도 km$cluster
1            90           75           85           60         70          3
5            88           89           80           82         90          3
6            90           92           90           96        100          3
11           70           93           77           89         60          3
12           99           80           95           70         80          3
15           90           77           92           60         70          3
18           90           89           80           92         90          3
19           76           90           80           92         70          3
20           70           92           80           95         70          3
28           84           88           90           92         90          3
32           88           80           85           88         90          3
34           90           77           82           65         80          3
38           93           90           89           91         90          3
39           92           97           90           89         80          3
42           90           92           88           94         90          3
46           78           91           77           90         80          3
49           97           90           96           90         90          3
>




*10대의 sns 데이터

30000명의 10대 관심사를 가지고 5개의 그룹으로 나눈다

1. 데이터를 준비한다.
teens <- read.csv("snsdata.csv")

2. 성별에 결측 데이터가 있는지 확인

table(teens$gender)
table(teens$gender, useNA="ifany")

3. age의 이상치 제거
teens$age <- ifelse(teens$age >= 13 & teens$age <20, teens$age, NA)
summary(teens$age)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
  13.03   16.30   17.26   17.25   18.22   20.00    5523


4. 데이터 정제 (unknown인 성별값의 데이터를 1과 0으로 부여)

teens$female <- ifelse(teens$gender=="F" & !is.na(teens$gender),1,0)
teens$no_gender <- ifelse(is.na(teens$gender),1,0)
table(teens$gender, useNA="ifany")
table(teens$female, useNA="ifany")
table(teens$no_gender, useNA="ifany")


5. 집단별 평균나이

mean(teens$age)
mean(teens$age, na.rm=TRUE)


문제246. 졸업예정년도(gradyear), 졸업예정년도별 평균나이를 구하시오.
aggregate(data=teens, age~gradyear, mean, na.ram = TRUE)

  gradyear      age
1     2006 18.65586
2     2007 17.70617
3     2008 16.76770
4     2009 15.81957


6. 각 개인에 대한 예측된 나이 계산
     (나이의 결측값들은 기존 데이터로 대충 예상해서 채워넣는다)
ave_age <- ave(teens$age, teens$gradyear, FUN = function(x), mean(x,na.rm=TRUE))
ave_age
teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)
summary(teens$age)

7. teens 데이터셋에서 관심사에 해당하는 컬럼들만 따로 interest 라는 변수에 담는다.

interests <- teens[5:40]


8. 위의 interests 데이터를 정규화한다.

interests_z <- as.data.frame(lapply(interests, scale))
interests_z

9. kmeans로 위의 관심사를 5개의 군집으로 분류하시오.

teens_clusters <- kmeans(interests_z,5)
teens$cluster <-teens_clusters$cluster

10. 처음 5개의 데이터만 확인

teens[1:5, c("cluster","gender","age","friends")]

aggregate(data=teens, age ~cluster, mean)

문제247. 군집별 여성의 비율이 어떻게 되는가?

aggregate(data=teens, female ~cluster, mean)

문제248. 군집별 친구수의 평균은 어떻게 되는가?

aggregate(data=teens, friends ~cluster, mean)




















 


























■ 7장 신경망과 서포트 벡터 머신
  • 머신러닝의 3가지 종류
    • 1.지도학습 : 
          -분류: knn, 나이브 베이즈, 결정트리
          -회귀: 선형회귀, 신경망, 서포트 벡터 머신
          2.비지도학습: k-means
          3.강화학습: 핑퐁, 틱텍토

■ 7장 신경망 목차
     1.신경망에 대한 이해
     2.신경망 구조
     3.신경망 실습 
          - 콘크리트 data
          - 보스톤 하우징 data
          - 무성이 발표 data ( 화력발전 데이터, 페이스북 데이터 ) 
     4.서포트 벡터 머신의 이해 
     5.서포트 벡터 머신 실습 
          - 필기체를 컴퓨터가 인식할수 있게 학습 
          - ?
          
■ 1. 신경망에 대한 이해 
          학습 데이터 
               ↓
          학습 규칙 --> 학습 데이터에서 모델을 찾아내는 기법 (신경망) 
               ↓     
     입력 데이터 --->       신경망   --->     결과
 (시멘트,물,강화제, ...)                   콘크리트 강도 
  다음 거리뷰(사진)                        번호판, 사람얼굴

    


          컴퓨터            vs           뇌 
            ↓                           ↓
정보를 메모리의 특정위치 저장          정보를 저장하는 공간이 따로 없다.
                                        ↓
                                  신경세포(뉴런)의 연결관계를 변경하는
                                  방식으로 저장한다.
                                        ↓
                                  신경세포는 그저 다른 신경세포에서 
                                  오는 신호를 받아 자신의 신호를 내보내는
                                  역할만 한다. 


 사람 : 뉴런수 (850억개) 
고양이 : 뉴런수 (10억개)
 쥐   : 뉴런수 (7천5백만개)
바퀴벌레 : 뉴런수 몇백만개 
하루살이 : 최신 최첨단 ANN보다 많다. 




인공 신경망
신경세포(뉴런)
노드
신경세포의 연결
연결 가중치

바이어스: -> 가중치와 함께 신경망의 정보를 저장하는데 관여하는 변수 
v = w1 * x1 + w2 * x2 + w3 * x3 +b
v = wx + b
w = [w1 w2 w3]
x = [x1 x2 x3] ^T

y = f(v)
활성함수 
1. 입력신호의 가중의 합을 구한다
2. 활성함수에 가중합을 입력해 얻은 값을 외부로 출력한다. 






입력층 : 들어오는 신호를 다음 노드에 전달하는 창구역할 
은닉층 : 신경망 외부에서는 이 노드에 직접 접근 할 수 없다. 
출력층 : 노드들의 출력이 신경망의 최종값이 된다. 


단층 신경망 : 입력층 --> 출력층 바로감

다층 신경망 : 

     얕은 신경망 : 입력층 --> 은닉층 -> 출력층
      
     심층 신경망 : 입력층 --> 은닉층 -> 출력층






※ 정규화 
  1. 표준정규분포: scale()
  2. 최대최소변환: normalize() 함수를 만들었음 : ( 0 ~ 1 ) 사이의 값

입력값과 출력 값은 정해져있고

가중치와 바이어스를 역전파로 찾아내는게 신경망 학습의 원리 

실제값과 오차를 구하는 함수 : 비용함수 


■ 신경망의 지도학습
    학습의 종류         학습 데이터
1.지도학습            {입력값, 정답}

     -1. 연습문제 하나를 현재의 지식으로 문제의 답을 구한다.
     -2. 정답과 비교한다.
     -3. 틀렸으면 잘못된 지식(가중치, 바이어스)을 교정한다.
     -4. 모든 문제에 대해서 1 ~ 3번 단계를 반복한다. (역전파)
     
2.비지도 학습         {입력값}

     정답이 없으니 해법을 배우지 못하고 문제의 구문이나 형태를 가지고     
     유형을 나눠보는것 

3.강화학습            {입력값, 출력값, 출력에 대한 점수}

■ 2. 신경망 실습 1 (콘크리트 데이터) 

분석 목적 : 건물의 내구성을 결정하는 콘크리트의 내구려겡 믿을만한 예측 모델 만들기

     입력 재료의 구성 목록을 고려해서 어떻게 입력 재료를 조합했을때 콘크리트의 강도가 높은지를 알아내고 시팓.

     입력값                  출력값
       ↓                      ↓
     콘크리트 재료들         콘크리트 강도 

 UCI의 머신러닝 DATA
1.mount of cement : 콘크리트의 총량
2.slag  : 시멘트
3.ash   : 회분 (시멘트)
4.water :  물
5.superplasticizer : 고성능 감수재(콘크리트 강도를 높이는 첨가제)
6.coarse aggregate : 굵은 자갈
7.fine aggregate : 잔 자갈
8.aging time      : 숙성시간

위의 데이터를 8 : 2 로 나눠서 8을 가지고 훈련을 시키고 모델을 만든다.

2를 가지고 검증을 한다.





##### 7장 : 신경망(Neural Network)과 서포트 벡터 머신(Support Vector Machines) -------------------

##### Part 1: 신경망 -------------------
## 예제 : 콘크리트의 강도 모델링  ----

## 2단계 : 데이터 준비와 살펴보기 ----
# 데이터 읽기와 구조 확인

concrete <- read.csv("concrete.csv")
str(concrete)


# 정규화 함수
normalize <- function(x) { 
  return((x - min(x)) / (max(x) - min(x)))
}


# 전체 데이터 프레임에 정규화 적용
concrete_norm <- as.data.frame(lapply(concrete, normalize))


# 0과1 사이에 범위 확인
summary(concrete_norm$strength)


# 본래 데이터의 최소값, 최대값 비교
summary(concrete$strength)


# 훈련과 테스트 데이터 생성
concrete_train <- concrete_norm[1:773, ]
concrete_test <- concrete_norm[774:1030, ]


## 3단계 : 데이터로 모델 훈련 ----
# neuralnet 모델 훈련
install.packages("neuralnet")
library(neuralnet)


# 하나의 은닉 뉴런에 대한 단순한 ANN
concrete_model <- neuralnet(formula = strength ~ cement + slag +
                              ash + water + superplastic + 
                              coarseagg + fineagg + age,
                              data = concrete_train)


# 망(network) 시각화
plot(concrete_model)


## 4단계 : 모델 성능 평가 ----


# 모델 결과
model_results <- compute(concrete_model, concrete_test[1:8])


# 강도값 예측
predicted_strength <- model_results$net.result


# 예측값과 실제값간의 상관 관계 확인
cor(predicted_strength, concrete_test$strength)


## 5단계 : 모델 성능 향상 ----
# 5개 은닉 뉴런인 복잡한 뉴런망

concrete_model2 <- neuralnet(strength ~ cement + slag +
                               ash + water + superplastic + 
                               coarseagg + fineagg + age,
                               data = concrete_train, hidden = 5)


# 망(network) 시각화
plot(concrete_model2)


# 결과 평가
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)








보스톤 주택가격 데이터로 해보자 ! 




##### 7장 : 신경망(Neural Network)과 서포트 벡터 머신(Support Vector Machines) -------------------
##### Part 1: 신경망 -------------------
## 예제 : 콘크리트의 강도 모델링  ----
## 2단계 : 데이터 준비와 살펴보기 ----
# 데이터 읽기와 구조 확인
boston <- read.csv("boston.csv")
str(boston)


# 정규화 함수
normalize <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}


# 전체 데이터 프레임에 정규화 적용
boston_norm <- as.data.frame(lapply(boston, normalize))


# 0과1 사이에 범위 확인
summary(boston_norm$MEDV)




# 훈련과 테스트 데이터 생성
boston_train <- boston_norm[1:773, ]
boston_test <- boston_norm[774:1030, ]


## 3단계 : 데이터로 모델 훈련 ----
# neuralnet 모델 훈련
install.packages("neuralnet")
library(neuralnet)

str(boston)
# 하나의 은닉 뉴런에 대한 단순한 ANN
boston_model <- neuralnet(formula = MEDV ~ 
                              data = boston_train)

# 망(network) 시각화
plot(boston_model)


## 4단계 : 모델 성능 평가 ----

# 모델 결과
model_results <- compute(boston_model, boston_test[1:8])

# 강도값 예측
predicted_strength <- model_results$net.result

# 예측값과 실제값간의 상관 관계 확인
cor(predicted_strength, boston_test$strength)


## 5단계 : 모델 성능 향상 ----
# 5개 은닉 뉴런인 복잡한 뉴런망
boston_model2 <- neuralnet(strength ~ cement + slag +
                               ash + water + superplastic +
                               coarseagg + fineagg + age,
                               data = boston_train, hidden = 5)


# 망(network) 시각화
plot(boston_model2)


# 결과 평가
model_results2 <- compute(boston_model2, boston_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, boston_test$strength)





  1. R 기본 수업 
  2. R 을 활용한 기계학습
     *머신러닝의 종류 3가지
          1.지도학습
               분류 : KNN, 나이브베이즈, 결정트리, SVM
               회귀 : 회귀분석, 신경망
          2.비지도학습 : K-means
          3.강화학습 : 틱텍토, 핑퐁


서울아산병원 영상분석팀에 취업한 친구가 ...
     포트폴리오 : 틱텍토,오라클 database 
                    
■ 7장 . 신경망과 서포트 벡터 머신 




■ 7장 신경망 목차
     1.신경망에 대한 이해
     2.신경망 구조
     3.신경망 실습 
          - 콘크리트 data
          - 보스톤 하우징 data
          - 무성이 발표 data ( 화력발전 데이터, 페이스북 데이터 ) 
     4.서포트 벡터 머신의 이해 
     5.서포트 벡터 머신 실습 
          - 필기체를 컴퓨터가 인식할수 있게 학습 

■ 7.4 서포트 벡터 머신 

빨간색공과 파란색 공이 모여잇는데 이것을 하나의 끊이지 않는 직선으로 구분하고 싶다면?

무수히 많은 직성을 그을 수 있다. 

y = 2x + 3

d = w^t*x + w0 > 0 : 빨간색
d = w^t*x + w0 < 0 : 파란색





좌표축이 2개면 ? 경계선은 직선의 방적식

좌표축이 3개면 ? 경계면 

d = w^t*x + w0 <- 절편
w0 : 절편
d = 경계면까지의 거리

t== 가중치 벡터 
x == 공의 위치 벡터

경계선(면) 까지의 거리인 d의 부호만으로도 빨간색인지 파란색인지를 알 수 있다.

"공의 위치를 알려주는 위치 벡터가 x라고 한다며 ㄴ
x 의 위치가 경계면 (또는 경계선) 의 위에 있느냐 아래에 있느냐에 따라 d의 
부호가 바뀐다. "

d = w^t + w0



"2차원 평면과 두개의 데이터의 집합이 있다.
그리고 둘 사이의 경계를 주기를 원한다
우리는 이 경계의 넓이를 조절 할 수 있고 
이 경계선의 방향을 조절 할 수 있다. "

우리의 목표는 가능한 적당한 넓이의 경계선을 찾는것이고
그리고 데이터간의 경계를 유지시키는 것이다.


이 구분의 경계선의 직선의 방정식은

w^t      *      x      +      b = 0
↓               ↓             ↓ 
normal vector 공의 위치벡터     scalar vector (바이어스)

바이어스는 원점으로 부터의 변위를 제어한다
두 분리선에는 어느정도 margin을 각각 갖게 한다
우리는 normal vector의 각도를 변경함으로써 여유를 회전시킨다.
그리고 바이어스를 조정함으로써 저 경계선을 이동시킨다. 



1.set1.csv를 로드하고 plot 를 그래프로 본다

set1 <- read.csv("set1.csv", header = T , stringsAsFactors = F)
set1

plot(set1)

install.packages("MASS")
library(MASS)
density <- kde2d(set1$food, set1$book, n=400)
image(density, xlab = "food", ylab="book")



설명 : 가운데 평균점 근처에 모여있는 데이터가 보통 사람들의데이터이다.
이들을 분류하기 위하여 어떠한 방법을 쓸수 있는가 .

svm을 이용해서 분류를 해보자


  1. svm 으로 보통사람들(중산층)을 분류
install.packages("e1071")
library(e1071)

m1 <- svm(status ~ food + book + cul + cloth + travel, 
     type ="C-classification", data= set1)

m1 
  1. 이모델이 얼마나 정확한지 기존 훈련 데이터로 평가를 해본다.

predict(m1, set1)

cbind(set1, predict(m1, set1))

  1. 예측한 결과와 실제와의 차이
sum(set1$status != predict(m1, set1)) 

12

88%의 정확도를 가지고 있네여 !

문제228. (점심시간문제) 보스톤 하우징 데이터를 이용해서 
     svm테스트를 하는데 CAT. MEDV가 0과1 로 구분 되는데 
     SVM으로 0과 1의 정확도가 어떻게 나오는지 테스트하시오  !
boston_norm <- as.data.frame(lapply(boston, normalize))

m1 <- svm(CAT..MEDV~ .,  type ="C-classification", data= boston_norm )


cbind(boston_norm$CAT..MEDV+1,predict(m1, boston_norm ))

sum(boston_norm $CAT..MEDV  != predict(m1, boston_norm )) 



m1 <- svm(CAT..MEDV~ .,  type ="C-classification", data= boston_norm )

library(caret)

confusionMatrix(table(boston_norm $CAT..MEDV  , predict(m1,boston_norm )))


 
■ 서포트 벡터 머신 실습
  1. 중산층 분류 실습
  2. 필기체 분류 숫자 
  3. 필기체 분류 영어





install.packages("caret")

install.packages("doParallel")

install.packages("kernlab")

install.packages("ggplot2")

install.packages("lattice")

library(ggplot2)

library(lattice)

library(kernlab)

library(caret)

library(doParallel)


# Enable parallel processing.


cl <- makeCluster(detectCores())

registerDoParallel(cl)


# Load the MNIST digit recognition dataset into R

# http://yann.lecun.com/exdb/mnist/

# assume you have all 4 files and gunzip'd them

# creates train$n, train$x, train$y  and test$n, test$x, test$y

# e.g. train$x is a 60000 x 784 matrix, each row is one digit (28x28)

# call:  show_digit(train$x[5,])   to see a digit.

# brendan o'connor - gist.github.com/39760 - anyall.org


load_mnist <- function() {

  load_image_file <- function(filename) {

    ret = list()

    f = file(filename,'rb')

    readBin(f,'integer',n=1,size=4,endian='big')

    ret$n = readBin(f,'integer',n=1,size=4,endian='big')

    nrow = readBin(f,'integer',n=1,size=4,endian='big')

    ncol = readBin(f,'integer',n=1,size=4,endian='big')

    x = readBin(f,'integer',n=ret$n*nrow*ncol,size=1,signed=F)

    ret$x = matrix(x, ncol=nrow*ncol, byrow=T)

    close(f)

    ret

  }

  load_label_file <- function(filename) {

    f = file(filename,'rb')

    readBin(f,'integer',n=1,size=4,endian='big')

    n = readBin(f,'integer',n=1,size=4,endian='big')

    y = readBin(f,'integer',n=n,size=1,signed=F)

    close(f)

    y

  }

  train <<- load_image_file('train-images.idx3-ubyte')

  test <<- load_image_file('t10k-images.idx3-ubyte')

  

  train$y <<- load_label_file('train-labels.idx1-ubyte')

  test$y <<- load_label_file('t10k-labels.idx1-ubyte')  

}

#필기체의 글씨가 무엇인지 확인하는 함수 

show_digit <- function(arr784, col=gray(12:1/12), ...) {

  image(matrix(arr784, nrow=28)[,28:1], col=col, ...)

}


train <- data.frame()

test <- data.frame()


# Load data.


load_mnist()


# Normalize: X = (X - min) / (max - min) => X = (X - 0) / (255 - 0) => X = X / 255.

#나눠서 정규화 ㅎㅎ

train$x <- train$x / 255


# Setup training data with digit and pixel values with 60/40 split for train/cv.


inTrain = data.frame(y=train$y, train$x)

inTrain$y <- as.factor(inTrain$y)

trainIndex = createDataPartition(inTrain$y, p = 0.60,list=FALSE)

training = inTrain[trainIndex,]

cv = inTrain[-trainIndex,]
# cv 가 테스트 데이터얌 ㅎㅎ

# SVM. 95/94.


fit <- train(y ~ ., data = head(training, 1000), method = 'svmRadial', tuneGrid = data.frame(sigma=0.0107249, C=1))


results <- predict(fit, newdata = head(cv, 1000))
                         ↑
                         모델

results


confusionMatrix(results, head(cv$y, 1000))



show_digit(as.matrix(training[5,2:785]))


# Predict the digit.


predict(fit, newdata = training[5,])


# Check the actual answer for the digit.


training[5,1]




























 


 
 


R 5장. 결정트리

R(알) 2017. 9. 8. 19:27
■ 어제까지 배운 R 수업 복습
  1. R기본수업
  2. R머신러닝 
          - 머신러닝을 이해하기 위한 R 기본문법
          - knn
          - 나이브베이즈 
          - 결정트리 
          - 회귀 (단순,다중) 
          - 신경망
          - 서포트벡터 머신
          - ...

*머신러닝의 종류3가지중에 
1.지도학습: 
      분류: knn, 나이브 베이즈 
      회귀: 

2.비지도 학습
3.강화학습

   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)

문제199. 나이가 20대이고 성별이 여자이고 직업이 IT이고 미혼인 여자가 공포영화를 선택할 확률?

P(20대,여자,IT,미혼 | '공포영화' ) =

P(20대 |'공포영화' ) * P(여자 |'공포영화' ) * P(IT |'공포영화' ) * P(미혼|'공포영화' )

이렇게 계산하느게 naive bayes의 전부이다. 

nm <- naiveBayes(movie[1:5], movie$장르, laplace=0)
nm

문제200. 4장의 실습예제인 스팸과 햄 메일을 구분하는 실습을 진행해서 
     아래의 결과를 도출 하시오! 







sms csv파일이 잇는데 이파일은 text(메세지)와 라벨(type)로 구성된 데이터가 있다.
라벨은 ham, spam으로 구분되어있는 라벨이다
          ↓
데이터를 클린징 하는 작업 (데이터 정제 작업) 
          ↓
메일메세지를 단어별로 구분해서 메일별로 단어가 몇번 사용되었는지 빈도수를 표형태로 만든다. 
          ↓
훈련 데이터와 테스트 데이터로 데이터를 나누고 --> 워드 클라우드 그림 
          ↓
훈련 데이터로 나이브 베이즈 모델을 만든다.
          ↓
테스트 데이터로 위에서 만든 모델로 스팸인지 햄인지를 예측 
          ↓
예측을 잘 했는지 확인한다(crosstable) 








## 예제 : 스팸 SMS 메시지 제거 ----
## 2 단계 : 데이터 준비와 살펴보기  ----

# sms 데이터 프레임으로 sms 데이터 읽기
sms_raw <- read.csv("sms_spam.csv", stringsAsFactors = FALSE)

# sms 데이터 구조
str(sms_raw)

# 팩터로 spam/ham으로 변환
sms_raw$type <- factor(sms_raw$type)

# 변수형 확인
str(sms_raw$type)
table(sms_raw$type)

# 텍스트 마이닝(tm) 패키지를 사용하여 말뭉치 생성
install.packages("tm")
library(tm)
sms_corpus <- Corpus(VectorSource(sms_raw$text))

# sms 말뭉치 확인
print(sms_corpus)
inspect(sms_corpus[1:3])
# 로케일을 us(미국)으로 변경해주는 작업을 해줘야 한다. 
Sys.setlocale(category = "LC_ALL", locale = "us")

# tm_map() 사용하여 말뭉치 정리 ( 데이터 정제 작업) 

corpus_clean <- tm_map(sms_corpus, tolower)
# 설명 : 전부 소문자로 바꾸겠다.

corpus_clean <- tm_map(corpus_clean, removeNumbers)
# 설명 : 숫자를 다 제거하겠다.

corpus_clean <- tm_map(corpus_clean, removeWords, stopwords())
# 설명 : to, and, but, or 를 제거한다.

corpus_clean <- tm_map(corpus_clean, removePunctuation)
# 설명 : 마침표(.) 제거한다. 

corpus_clean <- tm_map(corpus_clean, stripWhitespace)
# 설명 : 공백을 제거한다.

# 말뭉치 정리 확인
inspect(sms_corpus[1:3])
inspect(corpus_clean[1:3])

# 문서-용어 희소 매트릭스 생성 ( 책 150페이지의 표와 같은 형태로 변환) 
sms_dtm <- DocumentTermMatrix(corpus_clean)
sms_dtm

# 훈련과 테스트 데이터셋 생성
sms_raw_train <- sms_raw[1:4169, ] # 원래 데이터 (훈련)
sms_raw_test  <- sms_raw[4170:5559, ] # 원래 데이터 (테스트)

sms_dtm_train <- sms_dtm[1:4169, ] # 정제후의 표현태 변경한 데이터(훈련)
sms_dtm_test  <- sms_dtm[4170:5559, ] # 정제후의 표형태 변경한 데이터(테스트) 

sms_corpus_train <- corpus_clean[1:4169] # 정제후의 데이터 (훈련)
sms_corpus_test  <- corpus_clean[4170:5559] # 정제후의 데이터 (테스트)

# 스팸 비율 확인
prop.table(table(sms_raw_train$type)) #훈련데이터의   스팸 : 80%  햄 : 20% 
prop.table(table(sms_raw_test$type))  #테스트데이터의 스팸 : 80%  햄 : 20%

# 단어 클라우드 시각화 (워드 클라우드로 햄의 단어가 무엇이고 
#                    스팸의 단어가 무엇인지 확인하는 작업) 
# R 을 2.15.3(2013-03-01) 로 설치하고 아래 패키지를 install 해야함
install.packages("Rcpp")
install.packages("wordcloud")



library(wordcloud)

wordcloud(sms_corpus_train, min.freq = 30, random.order = FALSE)

# 훈련 데이터를 스팸과 햄으로 구분
spam <- subset(sms_raw_train, type == "spam")
ham  <- subset(sms_raw_train, type == "ham")

wordcloud(spam$text, max.words = 40, scale = c(3, 0.5))
wordcloud(ham$text, max.words = 40, scale = c(3, 0.5))

# 빈번한 단어에 대한 속성 지시자
findFreqTerms(sms_dtm_train, 5) # 5개 이상사용된 단어만 다시 추출
sms_dict <- Dictionary(findFreqTerms(sms_dtm_train, 5))
sms_train <- DocumentTermMatrix(sms_corpus_train, list(dictionary = sms_dict))
sms_test  <- DocumentTermMatrix(sms_corpus_test, list(dictionary = sms_dict))

# 개수를 팩터로 변환 (라벨의 1과 0으로 변경하고 1과 0을 yes와 no로 변경하는 작업) 
convert_counts <- function(x) {
  x <- ifelse(x > 0, 1, 0)
  x <- factor(x, levels = c(0, 1), labels = c("No", "Yes"))
}

# apply() convert_counts()를 사용한 훈련/테스트 데이터 추출
sms_train <- apply(sms_train, MARGIN = 2, convert_counts)
sms_test  <- apply(sms_test, MARGIN = 2, convert_counts)

## 3 단계 : 데이터로 모델 훈련 ----
install.packages("e1071")
library(e1071)
sms_classifier <- naiveBayes(sms_train, sms_raw_train$type)
sms_classifier

## 4 단계 : 모델 성능 평가 ----
sms_test_pred <- predict(sms_classifier, sms_test)

install.packages("gmodels")
library(gmodels)
CrossTable(sms_test_pred, sms_raw_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))

## 5 단계 : 모델 성능 향상 ----
sms_classifier2 <- naiveBayes(sms_train, sms_raw_train$type, laplace = 1)
sms_test_pred2 <- predict(sms_classifier2, sms_test)
CrossTable(sms_test_pred2, sms_raw_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))



문제201. mushroom dataset을 활용한 나이브 베이즈 분석을 하시오 ! 



install.packages('rpart')
library(rpart)

tree1 <- rpart(mushroom[,1] ~. , data= mushroom[,-1] , control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")

□ 5장 . 결정트리 (p164)
  • 머신러닝의 종류 3가지
1.지도학습 : 
     - 분류 : knn, naivebayes, decision tree
     - 회귀 : 회귀(6장)

2.비지도학습
3.강화학습

■ 5장. 목차 
 1.결정트리란?
 2.엔트로피와 정보획득량
 3.결정트리 실습1(은행의 대출 위험 기업 확인) 
 4.결정트리 실습2(배드민턴 데이터와 자동차 평가)

■ 1.결정트리란?

 학습 데이터를 가지고 아래와 같은 트리구조의 학습 모델을 만들어서
 새로운 테스트 데이터에 대한 라벨을 예측하는 알고리즘

 그림 : 5장. 결정트리 이미지 첫번째  


■ 결정트리가 사용되는 곳?
 1.지원자에게 거절된 이유를 명시해야하는 신용등급 모델
      예 : 은행 대출, 회사 인사 채용

 2.변심이 심한 고객이나 고객 만족은 관리하는 부서와 광고부서에서 공유되어야 하는 시장조사
      예: 스킨샵 쿠폰반응

 3.연구 측정, 증상, 매우 드문 질병 진행 과정을 바탕으로한 질병 관찰 
     예: 지방간 

■ 결정트리의 장단점 
 - 장점: 1.모든 문제에 적합한 분류기
        2.결측치, factor, number를 잘 처리할 수 있다.
        3.가장 중요한 속성만 사용
        4.다른 복잡한 모델보다 높은 효율

 - 단점: 1.모델이 쉽게 오버피팅 되거나 언더피팅이 됨
        2.훈련데이터에 약간의 변경이 잇어도 결정트리에 큰 변화를 준다.


■ 최적의 구분 선택 (p170)
  결정트리를 만들때 가장 먼제 해야할 것은 컬럼(변수)들중 가장 중요한 
  컬럼(변수)를 찾는것 이다. 중요한 변수는 정보획득량이 가장 높은 변수를
  말한다.
               ↓
     정보획득량이 높은 변수를 알아내려면 뭘 먼저 알아야 하는가?
               ↓
     엔트로피(entrophy) 함수

■  엔트로피(entrophy) 함수(불확실성)

     "데이터의 불확실성이 얼마나 되는가 ? "

     이 값이 커지면 커질수록 불확실성이 커진다

 예: 1. 확률(p) ====> x 축
     2.엔트로피(불확실성) ----> y 축 (공식 : -p * log(p) ) 

> -0.60 * log2(0.60) - 0.40 * log2(0.40)
[1] 0.9709506
> curve(-x * log2(x) - (1 - x) * log2(1 - x), col="red", xlab = "x", ylab = "Entropy", lwd=4)


설명 : 부자거나(x축 1) 부자가 아니거나 (x축 0)이면 
       불확실성 (엔트로피) y 축이 0이다.

  • 결정트리를 구하려면 ?
          어떤 컬럼을 가장 먼저 물어볼것인가를 결정해야한ㄷ
          정보획득량이 높은 컬럼을 가장 먼저 물어보게해야한다.
      정보획득량 = 분할전 엔트로피 - 분할후 엔트로피

문제202. 아래의 데이터 프레임을 만드시오 ! 


x <- data.frame(
cust_name=c('SCOTT','SMITH','ALLEN','JONES','WARD'),
card_yn=c('Y','Y','N','Y','Y'),
review_yn=c('Y','Y','N','N','Y'),
before_buy_yn=c('Y','Y','Y','N','Y'),
buy_yn=c('Y','Y','N','Y','Y') )


문제203. 위의 구매 데이터의 정보 획득량을 구하시오 

install.packages("FSelector")
library(FSelector)

weights<- information.gain(buy_yn~.,x)
print(weights )
 



문제204. skin.csv를 내려받고 R로 로드한 후에 skin데이터셋 변수들의 
        정보획득량을 구하시오  ~

skin <- read.csv("skin.csv",header = T)
weights<- information.gain(cupon_react~.,skin )
print(weights )



문제205. 위의 정보를 가지고 결정트리를 그리시오 

install.packages('rpart')
library(rpart)

tree1 <- rpart(cupon_react~. , data= skin, control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")


문제206. 지방간 데이터의 정보획득량을 구하시오 

fatliver<- read.csv("fatliver2.csv",header =T)
weights<- information.gain(FATLIVER~.,fatliver)
print(weights)



tree1 <- rpart(FATLIVER ~. , data= fatliver , control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")


 




##### 5장 : 결정 트리와 규칙(Decision tree and Rules)을 사용한 분류 -------------------
#### Part 1: 결정 트리 -------------------
## 결정 트리 이해 ----
# 두 부분 분류의 엔트로피 계산
-0.60 * log2(0.60) - 0.40 * log2(0.40)
curve(-x * log2(x) - (1 - x) * log2(1 - x),
      col="red", xlab = "x", ylab = "Entropy", lwd=4)
## 예제 : 위험 은행 대출 식별 ----
## 2 단계 : 데이터 준비와 살펴보기 ----
credit <- read.csv("credit.csv")
str(credit)
# 지원자의 두 특성 확인
table(credit$checking_balance)
table(credit$savings_balance)
# 대출의 두 특성 확인
summary(credit$months_loan_duration)
summary(credit$amount)
# 분류 변수 확인
table(credit$default)
# 훈련과 테스트 데이터에 대한 무작위 샘플 생성
# 예제와 같은 무작위 수열을 사용하기 위해 set.seed 사용
set.seed(12345)
credit_rand <- credit[order(runif(1000)), ]
# credit과 credit_rand 데이터 프레임간 비교
summary(credit$amount)
summary(credit_rand$amount)
head(credit$amount)
head(credit_rand$amount)
# 데이터 프레임 나누기
credit_train <- credit_rand[1:900, ]
credit_test  <- credit_rand[901:1000, ]
# 분류 변수의 비율 확인
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))
## 3 단계 : 데이터로 모델 훈련 ----
# 가장 단순한 결정 트리 생성
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
# 트리 정보 출력
credit_model
# 트리에 대한 상세 정보 출력
summary(credit_model)
## 4 단계 : 모델 성능 평가 ----
# 테스트 데이터에 대한 예측 팩터 벡터 생성
credit_pred <- predict(credit_model, credit_test)
# 예측과 실제 분류의 교차표
library(gmodels)
CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
## 5 단계 : 모델 성능 향상 ----
## 결정 트리의 정확성 부스팅
# 10 trials과 부스트드 결정 트리
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)
credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
# 100 trials과 부스트드 결정 트리
credit_boost100 <- C5.0(credit_train[-17], credit_train$default,
                        trials = 100)
credit_boost_pred100 <- predict(credit_boost100, credit_test)
CrossTable(credit_test$default, credit_boost_pred100,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
## 가중치 매트릭스 생성
# 가중 비용 매트릭스
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
# 트리에 비용 매트릭스 적용
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
#### Part 2: 규칙 학습기 -------------------


> table(credit$checking_balance)

    < 0 DM   > 200 DM 1 - 200 DM    unknown
       274         63        269        394
> table(credit$savings_balance)

     < 100 DM     > 1000 DM  100 - 500 DM 500 - 1000 DM       unknown
          603            48           103            63           183

설명 : 대출 신청사의 에금계좌와 적금계좌의 예금정도를 확인해서 예금액이 많을 수록 대출이 안전하다고 가정할 수 있다.


> summary(credit$months_loan_duration)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    4.0    12.0    18.0    20.9    24.0    72.0

설명 : 대출 기간이 짧게는 4달에서 기게는 72개월까지 분포가 됨

> summary(credit$amount)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    250    1366    2320    3271    3972   18420 

설명 : 대출 금액은 독일돈으로 205 마르크 ~ 184020 마르크 
     100 마르크가 6~ 7만원 정도 한다

table(credit$default)
#분류 변수 확인 ( default 가 라벨인데 대출금 상환했는지 상환안했는지 ) 
table(credit$default)
no yes
700 300

설명 : 대출자가 협의한 반납기간 안에 대출금을 반납했는지 안했는지 나타냄.
      채무이행자가 300명 , 채무불이행자가 700명

set.seed(12345)
credit_rand <- credit[order(runif(1000)), ]

runif(10)
order(runif(1000))

설명 : runif(10)이라고 하면 0과 1사이의 10개의 숫자가 랜덤으로 출력된다.
order(runif(1000)) 라고 하면 무작위 숫자가 1000개가 출력된다. 
credit[order(runif(1000)),] 하면 행을 무작위로 섞어서 결과를 출력해준다.

서머리는 같지만 잘 섞였음 

#분류 변수의 비율 확인
       no       yes
0.7022222 0.2977778
> prop.table(table(credit_test$default))

  no  yes
0.68 0.32

위의 데이터에 결정트리 기계학습ㅇ르 하려는 목적?

  지금 채무 불이행자가 70% 가 되는데  이 채무 불이행자의 수치를 낮추는것이 (30%로 떨어짐) 이 기계학습의 목표이다.

## 3단계 : 데이터로 모델 훈련
# 가장 단수한 결정 트리 생성
install.packages("C50")
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
                      

summary(credit_model)


Evaluation on training data (900 cases):

        Decision Tree
      ----------------
      Size      Errors

        66  125(13.9%)   <<

       (a)   (b)    <-classified as
      ----  ----
       609    23    (a): class no
       102   166    (b): class yes
설명: 13.9% 의 오차로 125개를 잘못 분류했다.
     23개는 실제값은 no이지만 yes로 잘못 분류했고 
     102개는 실제값은 yes이지만 no로 잘못분류했다. 

credit_pred <- predict(credit_model, credit_test)
cbind(credit_test, credit_pred)

CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))



               | predicted default
actual default |        no |       yes | Row Total |
---------------|-----------|-----------|-----------|
            no |        57 |        11 |        68 |
               |     0.570 |     0.110 |           |
---------------|-----------|-----------|-----------|
           yes |        16 |        16 |        32 |
               |     0.160 |     0.160 |           |
---------------|-----------|-----------|-----------|
  Column Total |        73 |        27 |       100 |
---------------|-----------|-----------|-----------|

57 + 16 = 73, 11 + 16 = 27
73% 는 정확히 예측 
27% 는 정확히 예측하지 못함 

## 5 단계 : 모델 성능 향상 ----
## 결정 트리의 정확성 부스팅
# 10 trials과 부스트드 결정 트리
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)

Evaluation on training data (900 cases):

Trial        Decision Tree
-----      ----------------
      Size      Errors

   0        66  125(13.9%)
   1        40  205(22.8%)
   2        46  196(21.8%)
   3        45  193(21.4%)
   4        68  163(18.1%)
   5        62  175(19.4%)
   6        56  186(20.7%)
   7        62  188(20.9%)
   8        66  156(17.3%)
   9        49  200(22.2%)
boost             31( 3.4%)   <<

       (a)   (b)    <-classified as
      ----  ----
       626     6    (a): class no
        25   243    (b): class yes

credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
# 100 trials과 부스트드 결정 트리
credit_boost100 <- C5.0(credit_train[-17], credit_train$default,
                        trials = 100)
credit_boost_pred100 <- predict(credit_boost100, credit_test)
CrossTable(credit_test$default, credit_boost_pred100,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))


               | predicted default
actual default |        no |       yes | Row Total |
---------------|-----------|-----------|-----------|
            no |        61 |         7 |        68 |
               |     0.610 |     0.070 |           |
---------------|-----------|-----------|-----------|
           yes |        15 |        17 |        32 |
               |     0.150 |     0.170 |           |
---------------|-----------|-----------|-----------|
  Column Total |        76 |        24 |       100 |
---------------|-----------|-----------|-----------|

## 가중치 매트릭스 생성
# 가중 비용 매트릭스
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
# 트리에 비용 매트릭스 적용
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
#### Part 2: 규칙 학습기 -------------------






badminton <- read.csv("badminton.csv",header=T)
install.packages("C50")
library(C50)
x <- badminton [1:4]
y <- badminton [,5]
model <- C5.0(x,y) 
model
summary(model)
plot(model)
p <- predict(model,x,type="class")
sum(p==y)/length(p)




문제207. **이가 첫번째로 발표한 차 평가에 관련한 결정트리 실습 코드에 
         예측하는 predict을 추가해서 실제 라벨과 예측 라벨의 
          차이를 한눈에 보여주는 CrossTable결과를 출력하시오 
car_evaluation <- read.csv("car_evaluation.csv",head=T)
head(car_evaluation)

install.packages("C50")
library(C50)
x <- car_evaluation[,2:7]
y <- car_evaluation[,1]     #기준이 되는 컬럼
model <- C50::C5.0(x,y)
model
summary(model)
plot(model)


또는


x <- car_evaluation[,2:7]
build_tree <- C5.0(car_evaluation$buyingprice~.,data=x)
summary(build_tree)
plot(build_tree)


p <- predict(model,x,type="class")
sum(p==y)/length(p)

CrossTable(car_evaluation[,1] ,p)

> CrossTable(car_evaluation[,1] ,p)
Error in CrossTable(car_evaluation[, 1], p) :
  함수 "CrossTable"를 찾을 수 없습니다
> library(gmodels)
경고메시지(들):
패키지 ‘gmodels’는 R 버전 3.4.1에서 작성되었습니다
> CrossTable(car_evaluation[,1] ,p)


   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  1728


                    | p
car_evaluation[, 1] |      high |       low |       med |     vhigh | Row Total |
--------------------|-----------|-----------|-----------|-----------|-----------|
               high |        46 |        13 |        49 |       324 |       432 |
                    |    16.480 |    29.484 |     0.146 |     1.528 |           |
                    |     0.106 |     0.030 |     0.113 |     0.750 |     0.250 |
                    |     0.451 |     0.062 |     0.237 |     0.268 |           |
                    |     0.027 |     0.008 |     0.028 |     0.188 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
                low |         0 |       121 |        53 |       258 |       432 |
                    |    25.500 |    90.461 |     0.030 |     6.546 |           |
                    |     0.000 |     0.280 |     0.123 |     0.597 |     0.250 |
                    |     0.000 |     0.579 |     0.256 |     0.213 |           |
                    |     0.000 |     0.070 |     0.031 |     0.149 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
                med |        10 |        75 |        79 |       268 |       432 |
                    |     9.422 |     9.906 |    14.349 |     3.935 |           |
                    |     0.023 |     0.174 |     0.183 |     0.620 |     0.250 |
                    |     0.098 |     0.359 |     0.382 |     0.221 |           |
                    |     0.006 |     0.043 |     0.046 |     0.155 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
              vhigh |        46 |         0 |        26 |       360 |       432 |
                    |    16.480 |    52.250 |    12.813 |    10.930 |           |
                    |     0.106 |     0.000 |     0.060 |     0.833 |     0.250 |
                    |     0.451 |     0.000 |     0.126 |     0.298 |           |
                    |     0.027 |     0.000 |     0.015 |     0.208 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
       Column Total |       102 |       209 |       207 |      1210 |      1728 |
                    |     0.059 |     0.121 |     0.120 |     0.700 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|


내일 : 6장. 회귀분석 
      7장 .신경망 (앞부분 까지)






스킨데이터 트리 그리기 !
























 



























 



 


▦ 4장. 나이브 베이즈의 이해
□4장. 목차
     1.나이브 베이즈를 이해하기 위한 기본 통계개념
          - 1.1 확률로 인한 데이터 분류
          - 1.2 확률
          - 1.3 결합확률
          - 1.4 베이즈 이론과 조건부 확률
2.나이브 베이즈 알고리즘 
     - 2.1 나이브 베이즈 분류
     - 2.2 라플라스 추정기

3.나이브 베이즈 실습 예제 
     - 3.1 영화장르
     - 3.2 스팸메일 분류1 (다른 예제)
     - 3.3 스팸메일 분류2 (책)

  1. 나이브베이즈를 이해하기 위한 기본 통계개념 (p128)
-1.1 확률로 인한 데이터 분류
- 기상학자가 날시예보를 할대 일반적으로 '비올확률 70%'
라는 용어를 사용해 예측한다

이 70%는 과거의 사건 데이터를 사용한것인데 과거에 이런 경우 10번중 7번은 비가왔음을 의미하는것이다.
- 베이즈 기법 기반인 분류기는 분류되지 않은 데이터를 분류기가 분류할때 새로운 속성에 대한 가장 유사하나 범주를 예측하기위해 관찰된 확률을 사용하고 이 관찰된 확률은 훈련데이터에 의해 미리 계산되어진다

훈련데이터 -----> 관찰된 확률
실제데이터 -----> 관찰된 확률을 이용해 분류를한다.

무엇을 분류하는 것인가?

  1. 스팸 메일 분류
  2. 컴퓨터 네트워크에 침힙한 이상징후를 분류
  3. 관찰된 증상을 고려한 질병 관찰


스팸 vs 햄

2차 대전때 영국식당에 먹으렉 스팸밖에 없어서 스팸이라는 말을 끊임 없이 써서 희화된 단어 

□ 1.2확률 (p130)
- 사건 
     사건이란 ? 화창하거나 또는 비가 올 날씨 
               동전 던지기에서 동전의 앞면과 뒷면
               스팸 이메일과 햄 이메일이 같이 일어날 수 있는 결과 

1.독립사건 : 두 사건이 서로 전혀 연관되이 않는다면 그건 독립사건 ,동전던지기와 날씨
P(A ∩ B) = P(A) * P(B)
P(A | B) = P(A) B사건은 A에 영향을 주지 않는다. 
==  는 사건B가 일어날때 사건 A의 확률이라고 읽는다. 
P(A | B) = P(A)
== 는 사건A가 일어났을 때 사건 B의 확률

2.종속사건 : 
사건 A가 일어났을 경우와 일어나지 않았을 경우에 따라서
사건B가 일어날 확률이 다를때 B는 A의 종속사건
P(A ∩ B) = P(A) * P(B)
P(A ∩ B) = P(A) * P(A | B)
         = P(B) * P(B | A)
P(A | B) = P(A ∩ B) / P(B)
P(B | A) = P(A ∩ B) / P(A)
3.배반사건
P(A U B) = P(A) + P(B)

문제194. (점심시간문제) 스팸 메일일 확률이 20% 이고 햄 메일일 확률이 80%이면 
스팸이 아닐 확률은 얼마인가?

스팸일 확률 : P(스팸) = 0.2 
햄일 확률   : P(햄) = 0.8
P(~스팸) : 0.8

▩ 1.3 결합확률 
책 131 페이지에 나온것 처럼 일부사건이 흥미로운 사건과 함께 일어났다면 예측하기 위해 흥미로운 사건을 사용할 수 있을것이다. 
모든 메세지의 20% 는 스팸이고 모든 메세지의 5%는 비아그라가 들어있다.

P(스팸) 과 P(비아그라)가 함께 일어날 확률은 ? 

P(스팸 ∩ 비아그라) 로 추정한다 .
P(스팸 ∩ 비아그라) 를 계산하면 (점심시간문제) - 독립사건이라면 ? 
0.01 %

▩ 1.4 베이즈 이론과 조건부 확률 (종속사건) 

사건 B 가 일어날때 사건 A의 확률은 아래와 같이 표시한다. 
P(A | B) = P(A ∩ B) / P(B)

P(A ∩ B) = P(A) * P(B)
P(A ∩ B) = P(A) * P(A | B)
         = P(B) * P(B | A)

            P(A ∩ B)         P(B|A) *  P(B)
P(A | B) = ------------ = ------------------
              P(B)            P(B)

                  P(스팸 ∩ 비아그라)      P(비아그라|스팸) * P(스팸)
P(스팸|비아그라) = ------------------- = -------------------------
                     P(비아그라)                P(비아그라)

설명 : 비아그라가 메일 메세지에 있을 때 스팸일 확률은 ? 

 우도 ? 가능도 (Likelyhood) 

  사건에는 1. 셀 수 있는 사건 ( 가능도 = 확률 )
          예 : 주사위를 던져서 나올 수 있는 숫자 1,2,3,4,5,6
               숫자가 나올 확률이 1/6로 모두 같고 각각의 확률을 합하면 
               확률은 1이 된다. 

          2.연속사건 (가능도 !=  확률) 
          예 : 1에서 6사이의 숫자중에 랜덤으로 아무 숫자를 뽑는다고 할때
               정확히 5가 뽑힐 확률은 얼마인가?

               1
            -------  = 0  <---- 연속사건은 확률이 0으로 계산이 된다.
             무한대
               
               그래서 사건이 일어날 가능성을 비교하는게 불가능하며 
               가능도 (likelyhood)라는 개념을 적용해야 이를 비교할 수 있다.

            우도 * 사전확률
사후 확률 = ----------------- 
              주변우도

  • 내일 시험문제지롱!!!
      비아그라
우도  YES  NO      총합
스팸  4/20 16/20    20
 햄   1/80 79/80    80
     5/100 95/100  100
                  P(비아그라|스팸) * P(스팸)      0.2 * 0.2
P(스팸|비아그라) = -------------------------  =  --------- = 0.8
                    P(비아그라)                    0.05

비아그라가 메세지 단어에 포함되어있으면 스팸일 확률이 80%가 된다.


문제195. 미진누나가 올려준 실습예제1의 메일에서 비아그라가 메세지에 포함되어 있으면 스팸일 확률은 어떻게 되는가?
           

                  P(비아그라|스팸) * P(스팸)      2/3 * 0.3
P(스팸|비아그라) = -------------------------  =  ---------- = 0.5
                    P(비아그라)                     0.4

▩ 2. 나이브 베이즈 알고리즘 (p 135) 

나이브 베이즈 알고리즘은 분류를 위해 베이즈 이론을 사용하는 애플리케이션이다

이름 그대로 순진한 가정을 하는것으로 데이터의 모든 속성을 동등하게 중요하며 독립적이라고 가정한다

장점: 1. 단순하고 빠르며 매우 효과적이다.
     2.결측데이터가 있어도 잘 수행된다.
     3.예측에 대한 추정된 확률을 얻기쉽다. 

단점: 1.모든 속성을 동등하게 중요하고 독립적이라는 알려진 결함에 의존한다. 

▩2.1 나이브 베이즈 분류

이번에는 비아그라라는 단어 하나만 가지고 스팸과 햄을 구분하느 
확률을 구하는게 아니라 다른 단어들도 포함 시켜봅시다.

비아그라 = yes, 돈 = no, 식료품 = no, 주소삭제 = yes 

문제196. 비아그라와 주소삭제는 포함하고 돈과 식료품은 포함하지 않는 
        메세지가 스팸일 확률은 어떻게 되는가. 

¬ : not sign

P(스팸|비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)  = 


 P( 비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)  * P(스팸)
-------------------------------------------------
  P( 비아그라 ∩ ¬돈 ∩ ¬식료품  ∩ 주소삭제)
               
                 ↓                             

 P(A ∩ B) = P(A) * P(B) <------- 이 공식을 염두해두고 다시 정리하면 

                 ↓    
                    
   P(비아그라|스팸)*P(¬돈|스팸)*P(¬식료품|스팸)*P(주소삭제|스팸)*P(스팸)
-----------------------------------------------------------------
         P(비아그라) * P(¬돈) * P(¬식료품)  * P(주소삭제)



          비아그라(w1)      돈(w2)         식료품(w3)    주소삭제(w4)
  우도    Yes    No      Yes    No        Yes    No      Yes    No   
  스팸    4/20  16/20   10/20  10/20   0/20  20/20   12/20  8/20        20
  햄      1/80  79/80   14/80  66/80   8/80  71/80   23/80  57/80       80  
  총합  5/100  95/100  24/100 76/100 8/100  9/100 35/100 65/100   100 

스팸의 우도 : (4/20) * (10/20) * (20/20) * (12/20) * (20/100) = 0.012

햄의 우도 : (1/80) * (66/80) * (71/80) * (23/80) * (80/100) = 0.002

                  0.012
스팸일 확률 : ------------------ = 0.85
               0.012 + 0.002
                  0.002
햄일 확률 : ------------------- = 0.1429
               0.012 + 0.002


 위의 해당 단어들을 포함하고 포함하지 않은 메일이 스팸이 될 확률 85% 햄일 확률이 14.2%가 된다. 

 

비아그라(w1)   

돈(w2)    

식료품(w3)  

주소삭제(w4)


우도   
Yes   
No     
Yes   
No     
Yes   
No     
Yes   
No     

스팸   
4/20 
16/20 
10/20
10/20 
0/20 
20/20  
12/20 
8/20 
20
햄     
1/80
79/80
14/80
66/80
8/80 
71/80 
23/80
57/80
80
총합 
5/100 
95/100
24/100
76/100
8/100 
9/100
35/100
65/100  
100


   P(비아그라|스팸)P(¬돈|스팸)*P(¬식료품|스팸)*P(주소삭제|스팸)*P(스팸)
   P(비아그라|햄) P(¬돈|햄 ) *P(¬식료품|햄 ) *P(주소삭제|햄 )*P(햄 )

문제197. 미진누나가 만든 실습예제2 메일 데이터를 보면 비아그라와 쿠폰이라는
        단어가 포함되어 있는 메일 스팸이 될 확률은 어떻게 되는가? 
p(비아그라|스팸) * p(쿠폰|스팸) * p(스팸) = ?
(4/6) * (3/6)* (6/14) = 0.14

p(비아그라|햄) * p(쿠폰|햄) * p(햄) = ?
(3/8) * (1/8) * (8/14) = 0.026
                   0.14
스팸 확률 =  ----------------------- = 0.84
              0.14 + 0.026
   
              0.026
햄 확률 = ----------------- = 0.15
           0.14 + 0.026
결론 : 쿠폰과 비아그라가 메일 메세지에 포함되어있으면 스팸일 확률이 84% 이다. 



       


▩ 2.2 라플라스 추정기 (p139) 

이번에는 비아그라 , 주소삭제, 식료품, 돈이 메일 메세지에 다 포함되어 있다고 했을때 스팸일 확률을 구해보자 


          비아그라(w1)      돈(w2)         식료품(w3)    주소삭제(w4)
  우도    Yes    No      Yes    No        Yes    No      Yes    No   
  스팸    4/20  16/20   10/20  10/20   0/20  20/20   12/20  8/20        20
  햄      1/80  79/80   14/80  66/80   8/80  71/80   23/80  57/80       80  
  총합  5/100  95/100  24/100 76/100 8/100  9/100 35/100 65/100   100 

   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)
      4/20  *    10/20 *  0/20 * 12/20 * 20/100                  =0
  P(비아그라|햄 )P(돈|햄 )*P(식료품|햄 )*P(주소삭제|햄 )*P(햄 )
     1/80     *    14/80  *  8/80   *  23/80 *(80/100) =0.0005

                   0
스팸일 확률 : --------------- = 0
               0 + 0.0005
                0.0005
햄일 확률 : ---------------- = 1
               0 + 0.0005
식료품과 돈때문에 햄일 확률이 100% 되어 다른 증거까지 모두 무효로 만들어 버림 .ㅋ.,ㅡ.,


이를 해결하기위해 프랑스의 수학자 피에르 시몬 라플라스가 확률이 0 이 되지 않기 위해서 빈도표의 각 값에 작은 수를 추가했따

각각의 값에 1을 더했다. 



   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)
      5/24  *    11/24 *  1/24 * 13/24 * 20/100                  =0.0004
  P(비아그라|햄 )P(돈|햄 )*P(식료품|햄 )*P(주소삭제|햄 )*P(햄 )
     2/84     *    15/84  *  9/84   *  24/84 *(80/100) =0.0001


                  0.0004
스팸일 확률 : ------------------- = 0.8
             0.0004 + 0.0001
햄일 확률 :                      = 0.2

스팸일 확률이 80% 이며 햄일 확률이 20%임을 의미한다. 


쉬운예제 돌려보고 교재있는거 다음에 

▦ 나이브 베이즈 실습 1 (영화장르)

1.데이터 : 카페에 data 게시판 : 선호하는 영화장르 데이터
2.코드   : 아래 실습


movie <- read.csv ( 'movie.csv', header=T)

install.packages("e1071") # 오스트리아 수도 빈 비엔나 기술대학의 통계학과에서 개발함
library(e1071)
movie


 nm <- naiveBayes(movie[1:5],movie$장르 ,laplace=0)


> nm


Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = movie[1:5], y = movie$장르, laplace = 0)

A-priori probabilities:
movie$장르
        SF       공포     로맨틱    로맨틱s       무협     스릴러       액션     코미디
0.12820513 0.12820513 0.20512821 0.02564103 0.12820513 0.12820513 0.12820513 0.12820513

Conditional probabilities:
          나이
movie$장르 10대 10대  20대 30대 40대
   SF       0.0   0.0  0.0  1.0  0.0
   공포     0.0   0.0  0.0  0.0  1.0
   로맨틱   0.5   0.0  0.5  0.0  0.0
   로맨틱s  0.0   0.0  1.0  0.0  0.0
   무협     0.2   0.0  0.2  0.2  0.4
   스릴러   0.0   0.0  0.0  1.0  0.0
   액션     0.2   0.8  0.0  0.0  0.0
   코미디   0.0   0.0  0.4  0.4  0.2

          성별
movie$장르  남  여
   SF      0.4 0.6
   공포    1.0 0.0
   로맨틱  0.0 1.0
   로맨틱s 0.0 1.0
   무협    1.0 0.0
   스릴러  1.0 0.0
   액션    1.0 0.0
   코미디  1.0 0.0

          직업
movie$장르    IT 디자이너  무직  언론  영업 자영업  학생 홍보/마케팅
   SF      1.000    0.000 0.000 0.000 0.000  0.000 0.000       0.000
   공포    0.000    0.000 0.000 0.000 0.200  0.400 0.000       0.400
   로맨틱  0.000    0.375 0.000 0.000 0.000  0.000 0.375       0.250
   로맨틱s 0.000    0.000 0.000 0.000 0.000  0.000 0.000       1.000
   무협    0.000    0.000 1.000 0.000 0.000  0.000 0.000       0.000
   스릴러  0.000    0.000 0.000 1.000 0.000  0.000 0.000       0.000
   액션    0.000    0.000 0.000 0.000 0.000  0.000 1.000       0.000
   코미디  0.000    0.000 0.000 0.000 0.400  0.000 0.400       0.200

          결혼여부
movie$장르    NO   YES
   SF      0.200 0.800
   공포    1.000 0.000
   로맨틱  0.625 0.375
   로맨틱s 0.000 1.000
   무협    1.000 0.000
   스릴러  0.400 0.600
   액션    1.000 0.000
   코미디  1.000 0.000

          이성친구
movie$장르    NO   YES
   SF      0.800 0.200
   공포    1.000 0.000
   로맨틱  0.375 0.625
   로맨틱s 1.000 0.000
   무협    1.000 0.000
   스릴러  0.600 0.400
   액션    1.000 0.000
   코미디  1.000 0.000

result <- predict(nm, movie[1:5])

cbind(movie, result)

sum(movie$장르 != result)

문제198. 오늘 아침에 쪽지시험으로본 zoo 데이터의 100번재 동무링 어떤 종류인지 조류(2)가 맞는지 나이브 베이즈로 확인해보시오 

나이브 베이즈 알고리즘 문제를 풀기 위해서 아래의 zoo2 를 전부 팩터화 하세요 ~

zoo2 <- read.csv("zoo2.csv", stringsAsFactors = FALSE)


zoo2$X1 <- as.factor(zoo2$X1)
zoo2$X0 <- as.factor(zoo2$X0)
zoo2$X0.1 <- as.factor(zoo2$X0.1)
zoo2$X1.1 <- as.factor(zoo2$X1.1)
zoo2$X0.2 <- as.factor(zoo2$X0.2)
zoo2$X0.3 <- as.factor(zoo2$X0.3)
zoo2$X1.2 <- as.factor(zoo2$X1.2)
zoo2$X1.3 <- as.factor(zoo2$X1.3)
zoo2$X1.4 <- as.factor(zoo2$X1.4)
zoo2$X1.5 <- as.factor(zoo2$X1.5)
zoo2$X0.4 <- as.factor(zoo2$X0.4)
zoo2$X0.5 <- as.factor(zoo2$X0.5)
zoo2$X0.6 <- as.factor(zoo2$X0.6)
zoo2$X0.7 <- as.factor(zoo2$X0.7)
zoo2$X1.6 <- as.factor(zoo2$X1.6)
zoo2$X1.7 <- as.factor(zoo2$X1.7)


str(zoo2)


 

 nm <- naiveBayes(zoo2[2:17] ,zoo2[,18] ,laplace=0)
result <- predict(nm, zoo2[2:17] )

cbind(zoo2 , result)

sum(na.omit(zoo2[-100,18])  != result[c(1:99)])

> sum(na.omit(zoo2[-100,18])  != result[c(1:99)])
[1] 22









 

■ 어제까지 배운 내용 R 내용 복습

  1. R 기본 문법 수업 : 1주일
  2. R 기계 학습 : 
          -2장 : 기계학습 책에 나오는 내용을 이해하기휘한 기본 문법과 함수 소개하는 내용
          -3장 : knn           
               -소개팅
               -과일
               -유방암
               -폐암
          -4장 : 나이브 베이즈
          -5장 : 결정트리
 
 
■ 3장. knn (최근접 이웃을 사용한 분류의 이해)
 
  • 머신러닝의 종류
  • 1.지도학습
    • -분류:knn
    • -회귀: 
  • 2.비지도학습
  • 3.강화학습
          
               
▦ 3장 목차 
  1. knn(k-Nearest Neighbors) 란 무엇인가?
  2. knn(k-Nearest Neighbors)이 필요한 이유?
  3. knn(k-Nearest Neighbors)의 분류의 이해 
  4. knn(k-Nearest Neighbors)의 분류 실습1( 소개팅 데이터 )
  5. knn(k-Nearest Neighbors)의 분류 실습2( 과일 데이터 )
  6. 적당한 k 값 선택
  7. knn(k-Nearest Neighbors)의 분류 실습3(유방암 데이터)
  8. knn(k-Nearest Neighbors)의 분류 실습4(붓꽃 데이터)
  9. knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 
  10. knn(k-Nearest Neighbors)의 분류 실습6(폐암 데이터) 

▦ 1. knn(k-Nearest Neighbors) 란 무엇인가? 
- 사회적인 관계 관찰해보면?
 대략적으로 비슷한 사람끼리 모이는 성질이 있다.
 비슷한 취향의 사람들끼리 모여서 동호회를 만들고
 비슷한 부류의 계층의 사람들끼리 친분을 맺기도 한다.

- 공간적인 관계를 관찰해보면?
가구점이 모이는 상가지역이 따로 형성이 되어 있거나 
한약방이 밀집되어 있는 지역이 따로 모여있는 경우가 많다.(제기동)

이런 특성을 가진 데이터를 겨냥해서 만들어진 알고리즘이 knn이다.

▦ 2. knn(k-Nearest Neighbors)이 필요한 이유?

- knn 이 왜 필요한지?
 "유방암 종양의 크기에 대한 데이터( 반지름 , 둘레, 면적등 ) 만 
  가지고 이 종양이 악성인지 양성인지를 미리 예측할 수 있다면 
  환자에 대한 치료 스케쥴에 큰 영향을 미칠 수 있다."

- 암 발견과 치료과정 : 
  1. 건강검진 -----> 2.초음파, 내시경 ----> 3.의심되는 종양

  ----> 4. 큰 병원에 가서 조직검사를 하라고 권고 받는다. 
  ----> 5. 3~4달 후의 예약을 잡아준다.

▦ knn(k-Nearest Neighbors)의 분류의 이해 

그림


물음표가 무슨 색일까? 

"어떤 라벨(사진속 물음표)을 정의할 때 그 데이터의 주변 반경안의 
 데이터들을 조사하여 다수결로 k 개 이상이면 가장 많은 라벨로 정의하는 것이다."

 그림을 보면 정체를 알 수 없는 ? 모양의 라벨이 있는데 
이것이 빨간색인지 파란색인지
k = 3으로 놓고 본다면 

A의 경우는 Red
B의 경우는 Blue

▦ 4.knn(k-Nearest Neighbors)의 분류실습1(소개팅 데이터)


A라는 여학생이 소개팅을 수천번하지는 않기 때문에 14번정도 했다고 가정하고
그 동안 만난 남학생들에 대한 라벨을 호감라벨로 만들어서 데이터를 정리함

이 데이터를 기주능로 새로 만나게 될 남학생에 대한 데이터로만 호감레벨을 예측해본다.

- 기계학습을 기동할대는 input 데이터를 알고리즘에 맞게 잘 정제하는 작업이 필요하다 .

  1. 표준화 : R 에서는 scale()이라는 함수를 통해서 
          -1 ~ 1 사이의 데이터로 변경한다. 
     ( 키는 cm 이고 몸무게는 kg니까 서로 데이터의 범위가 달라서 
       결과가 잘 날올리가 없지 ~ 그래서 scale함수로 키와 몸무게를 
       -1 ~ 1 사이의 데이터로 변경을 해주어요 ~ )
    ====> 표준화 

  1. 정규화 : 정규분포에 속하는 데이터로 정규화를 해줘야 한다. 
             평균 및 표준편차를 기반으로 데이터 조정: 
             데이터와 평균의 차이를 표준편차로 나눈다. 

               값 - 평균값
     정규화 : -------------
                표준편차 

  1. 훈련 데이터 like 데이터를 준비 

like <- read.csv('like.csv',stringAsFactor=T, header=T)

> like <- read.csv('like.csv',stringsAsFactors=T, header=T)
> colnames(like) <- c('talk','book','travel','school','tall','skin','muscle','label')



  1. 테스트 데이터를 만든다 ( 앞으로 ㅅㄱㅁ만나게 될 남학생의 데이터) 
test <- data.frame(talk=70, book=50, travel=30 , school=70, tall=70, skin=40, muscle=50)

test


test 데이터의 남학생이 1타입,2타입,3타입 인지를 알아내고자 한다. 
  1. knn을 돌리기 위한 패키지 설치 
install.packages("class")
library(class)

train <- like[,-8]
group <- like[,8]


> knnpred1 <- knn(train, test,group, k=3,prob=TRUE)
> knnpred1
[1] 3타입
attr(,"prob")
[1] 0.6666667
Levels: 1타입 2타입 3타입

문제187. k 값을 4로 하면 결과가 달라지는지 확인하시오 ~! 


안달라져

문제 188. (점심시간 문제) 나이, 월수입, 상품구매여부 3개읠 데이터를
갖는 데이터가 있다. (buy.csv) 이 데이터를 이용해서 나이가 44이고 월급이 400 만원인
사람이 상품을 구매할지 비구매할지를 knn 분류 알고리즘으로 분석하시오 !


나이와 월수입으로 상품 구매여부를 예측하는 데이터

buy <- read.csv("buy.csv", stringsAsFactors =F, header=T)
buy

   1. 나이와 월수입 데이터를 표준화 한다.

   buy$age <- scale(buy$나이)
   buy$pay <- scale(buy$월수입)

   2. 나이와 월수입 데이터를 정규화 한다.
                 값 - 평균값
   정규화 = --------------------------
                  표준편차

test<- data.frame(age=44, pay=400)
train <- buy[,c(4,5)]
lebels <- buy[,3]

test$age <- (test$age - mean(buy$나이) ) / sd(buy$나이) 

test$pay <- ( test$pay - mean(buy$월수입) ) / sd(buy$월수입)

  1. test (나이:44, 월급:400) 인 데이터를 KNN으로 돌려서 상품을 구매할지 안할지 출력하시오 

a<-knn(buy[,c(4,5)], test,buy[,3], k=3,prob=TRUE)







buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T)
buy

buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
buy

test <- data.frame(age=44 , pay=400)

train <- buy[,c(4,5)]
labels <- buy[,3]
train



test$age <- scale(test$age)
test$pay <- scale(test$pay)


library(class)

knnpred1 <- knn(train , test , labels , k=5 , prob=TRUE) 
knnpred2 <- knn(train , test , labels , k=6 , prob=TRUE) 
knnpred1;knnpred2


문제189. buy 데이터 프레임에 라벨이 없는 44세의 월급 400만원 데이터를 넣고 다시 scale함수를 돌려서 나이와 월급을 정규화 하고 훈련 데이터와 테스트 데이터를 나눠서 knn 함수로 테스트 데이터의 라벨을 알아내시오 . 

strip.white=T(공백을 제거해라 ) 

buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,strip.white=T )
buy<-rbind(buy,c(44,400,"")

buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
train <- buy[c(1:20),c(4,5)]
labels <- na.omit(buy[c(1:20) ,3])
knn1 <- knn(train , buy[21,c(1:2)] , labels , k=5 , prob=TRUE)
knn1




buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,
                 strip.white=T)
buy2 <-  rbind( buy, c(44,400,""))
buy2$나이 <- as.integer(buy2$나이)
buy2$월수입 <- as.integer(buy2$월수입)
buy2$나이 <- scale(buy2$나이)
buy2$월수입 <- scale(buy2$월수입)
 
train <- buy2[1:20,c("나이","월수입")]
train_label <- buy2[1:20,"상품구매여부"]
test <- buy2[21,c("나이","월수입")]
library(class)
knnpred3 <- knn(train, test, train_label, k=5, prob=T)
knnpred3


▩ 5. knn(k-Nearest Neighbors)의 분류 실습2(과일 데이터) 
knn(k-Nearest Neighbors)은 한국어서 k 근접 이웃이라고 한다.
머신러닝의 분류에 쓰이는 대표적이면서 간단한 알고리즘이다.

사용되는곳: 얼굴인식, 개인영화 추천, 단백질 및 질병 추출을 위한 유전자 데이터 패턴 식별등에 활용이된다. 

문제190. 책 104쪽에 나오는 x축 단맛, y축 아삭거림에 대한 과일, 야채 단백질을 분류하는 그래프를 그리시오 

■ 책 103쪽에 나온 그래프를 그릴려면 ? 


#1. food 데이터 프레임을 만든다.


food <- data.frame(ingredient = c("apple", "bacon", "banana", "carrot",

 "celery", "cheese", "cucumber", "fish",

 "grape", "green bean", "lettuce",

 "nuts", "orange", "pear","shrimp"

 ),

 sweetness = c(10,1,10,7,3,1,2,3,8,3,1,3,7,10,2),

 crunchiness = c(9,4,1,10,10,1,8,1,5,7,9,6,3,7,3),

 class = c("Fruits","Proteins","Fruits","Vegetables",

 "Vegetables","Proteins","Vegetables",

 "Proteins","Fruits","Vegetables",

 "Vegetables","Proteins","Fruits",

 "Fruits","Proteins"))

food



#2.  토마토 데이터 만들기

tomato <- data.frame(ingredient = "tomato",

 sweetness = 6,

 crunchiness = 4)

tomato



#3.  ggplot2  그래프로 plot 그래프를 그린다.


install.packages("ggplot2")

library(ggplot2)


# par : 파라미터 지정 / pty : plot모형을 "square" 정사각형

par(pty="s")


# 그래프 그리기(version : ggplot)

#par:파라미터/xpd:모형옮기기/mar:여백설정(아래,왼쪽,위,오른쪽)


par(xpd=T, mar=par()$mar+c(0,0,0,15)) 


plot(food$sweetness,food$crunchiness,

 pch=as.integer(food$class),

 #pch=food$class, # pch는 모형 지정

 xlab = "sweetness", ylab = "crunchiness", 

 main = "What is tomato class?")


legend(10.5,10, # legend 위치 지정 

 c("Fruits", "Proteins", "Vegetables", "X"),

 pch=as.integer(food$class))


text(food$sweetness, food$crunchiness, 

 labels=food$ingredient, 

 pos = 3, # 글자위치position(1:below/2:left/3:above/4:right)

 offset = 0.3, # 좌표와 얼마나 띄어쓰기 할것인지

 cex = 0.7 ) # 문자크기



# 그래프 그리기(version : ggplot2)


ggplot(data=food,aes(x=sweetness,y=crunchiness))+

 labs(title="What is tomato class?")+ # 타이틀 명

 geom_point(aes(color=class, shape=class),size=6)+

 geom_text(aes(label=ingredient), # 라벨링 표시

 vjust=-1, # 수직으로 움직일 거리 (위는 -, 아래는 +)

 size = 5) # 문자크기

 



문제191. 토마토가 야채, 과일, 단백질 중에 어느 분류에 속하는지 knn알고리즘으로 알아내시오 

답 : 

install.packages("dplyr")
library(class)
library(dplyr)

tmt <- knn(select(food,sweetness,crunchiness),  select(tomato,sweetness,crunchiness),food$class,k=2)
tmt


토마토의 최근접 이웃을 구하기 위해서는 거리함수나 두 인스턴스 사이의 유사도를 측정하는 공식이 필요하다

거리를 계산하는데는 다양한 방법이 있는데 knn 은 유클리드 거리를 사용한다.

예 :  토마토와 green bean과의 거리

dist("pear","green bean") =  sqrt( (6-3)^2 + (4-7)^2 ) = 4.2

문제192. 토마도와 orange와의 유클리드 거리를 구하시오 

sqrt( (7-6)^2 + (3-4)^2) ) = 1.414214
 




▩ 6. 적당한 k 값 선택

 적당한 k 값을 선택해야 하는데 k 값이 너무 낮으면 오버피팅 하게된다

즉 훈련데이터로 인해 만든 모델이 훈련 데이터에만 맞고 다른 데이터를 
분류를 잘 못한다. 

k 값이 너무 높으면 언더피팅을 하게 된다. 

훈련 데이터 조차도 분류를 잘 못한다 . 

예: k 값에 따른 분류 시각화 작업 




■ 구현 코드 




install.packages("readr")

install.packages("ElemStatLearn")

install.packages("class")


library(readr)


#1.과적합에 대하여.

library(ElemStatLearn)

library(class)

x <- mixture.example$x

x

g <- mixture.example$y

g

xnew <- mixture.example$xnew

xnew

#k=1, 10 , 30 , 50 , 100, 1000 

#k값이 지나치게 작을 때: 분류 경계선이 너무 디테일 하다. : 과적합

#k값이 지나치게 클 때 분류 경계선이 너무 크다 : 부적합
#knn(train, test, cl, k =1, l = 0, prob = FALSE, use.all = TRUE)
mod1 <- knn(x, xnew, g, k=1, prob=TRUE)  

mod1

prob1 <- attr(mod1, "prob")

prob1

prob1 <- ifelse(mod1=="1", prob1, 1-prob1)

prob1

px1 <- mixture.example$px1

px2 <- mixture.example$px2

prob1 <- matrix(prob1, length(px1), length(px2))

par(mar=rep(2,4))

#윤곽선

contour(px1, px2, prob1, levels=0.5, 

        labels="", xlab="", ylab="", main= "k-nearest neighbour", axes=FALSE)

points(x, col=ifelse(g==1, "coral", "cornflowerblue"))

gd <- expand.grid(x=px1, y=px2)


#배경

points(gd, pch=".", cex=1.2, col=ifelse(prob1>0.5, "coral", "cornflowerblue"))

box()


▩ 7. knn (k-nearest neighbors) 


▩ 7. knn (k-nearest neighbors) 의 분류 실습1(유방암 데이터)

##### 3장 : 최근접 이웃(Nearest Neighbors)을 사용한 분류(Classification)  --------------------

## 예제 : 암 샘플 분류 ----
## 단계 2 : 데이터 준비와 살펴보기 ----

# CSV 파일 임포트
wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)

# wbcd 데이터 프레임의 구조
str(wbcd)
head(wbcd)
# id 속성 제거
wbcd <- wbcd[-1]

# 진단 테이블
table(wbcd$diagnosis)

# 팩터로서 진단 변수 변환
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"),
                         labels = c("Benign", "Malignant"))
head(wbcd)
# 진단 변수의 비율
round(prop.table(table(wbcd$diagnosis)) * 100, digits = 1)

# 세 속성에 대한 요약
summary(wbcd[c("radius_mean", "area_mean", "smoothness_mean")])

# 정규화 함수
normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}

# 정규화 함수 테스트 - 결과는 일치함
normalize(c(1, 2, 3, 4, 5))
normalize(c(10, 20, 30, 40, 50))

# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

head(wbcd)
head(wbcd_n)

# 정규화가 잘 되었는지 확인 # 모든 컬럼의 값을 0~1 사이의 값으로 변경해줌
summary(wbcd_n$area_mean)
summary(wbcd_n$concavity_worst)

# 훈련 데이터와 테스트 데이터 생성 # 둘다 라벨이 없는 데이터 이다.
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]


str(wbcd)
str(wbcd_train)

# 훈련 데이터와 테스트 데이터에 대한 라벨 생성

wbcd_train_labels <- wbcd[1:469, 1]
wbcd_test_labels <- wbcd[470:569, 1]

## 3단계 : 데이터로 모델 훈련 ----

# "class" 라이브러리 로드
library(class)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)

## 4 단계 : 모델 성능 평가 ----

# "gmodels" 라이브러리 로드
library(gmodels)

# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,  prop.chisq=FALSE)


실제/모델      B(양성)      M(악성)
B(양성)       61(TN)      0(FP)
M(악성)        2(FN)     37(TP)

#
#
TRUE NEGATIVE 
FALSE POSITIVE
FALSE NEGATIVE
TRUE POSITIVE
## 5 단계 : 모델 성능 향상 ----

# 데이터 프레임를 z-score 표준화하기 위해 scale() 함수 사용
wbcd_z <- as.data.frame(scale(wbcd[-1]))

# 변환이 정확하게 적용되었는지 확인
summary(wbcd_z$area_mean)

# 훈련과 테스트 데이터셋 생성
wbcd_train <- wbcd_z[1:469, ]
wbcd_test <- wbcd_z[470:569, ]

# 변경한 데이터로 분류
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,
                      cl = wbcd_train_labels, k=21)

# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,
           prop.chisq=FALSE)

# 다른 k 값으로 분류
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=1)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=5)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=11)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=15)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)





wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)
> nrow(wbcd)
[1] 569

569 건의 유방암 환자 데이터를 둘로 나눈다.

 2/3  훈련 데이터 + 악성인지 양성인지를 구분하는 라벨
 1/3 테스트 데이터 + 악성인지 양성인지를 구분하는 라벨을 빼고 
                    훈련 데이터로 그 라벨을 알아내는 작업을 수행

 
knn (훈련 데이터 , 테스트 데이터 , 훈련 데이터 라벨, k=1) 


설명 : B (양성) : 357명 , M(악성) : 212명
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"), labels = c("Benign", "Malignant"))

설명 : B와 M 을 Benign, Malignant 철자로 변환해서 저장함 

정규화 하는 방법에는 2가지가 잇는데

1.표준정규분포 : scale() 함수를 사용한 변환

2.최대최소변환 : 책 115페이지 (아래 코드) 의 normalize 함수 
               (신경망에서 많이 사용됨) 


# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

head(wbcd)
head(wbcd_n)



문제193. 실제 테스트 데이터의 라벨 (wbcd_test_labels )와
          knn으로 예측한 라벨인(wbcd_test_pred) 를 비교해서 얼마나 일치했는지 확인하시오 ! 


data.table(wbcd_test_labels,wbcd_test_pred,mean(as.numeric(wbcd_test_labels ==wbcd_test_pred )),as.numeric(wbcd_test_labels ==wbcd_test_pred ) )




wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=7)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=13)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=23)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=31)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=29)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)



wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=6)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

거짓부정은 예측값은 양성이지만 종양이 실제로는 악성이다
거짓긍정은 예측값은 악성이지만 종양이 실제로는 양성이다.

k값      거짓부정     거짓긍정
1           1          3
5           2          0
11          3          0
15          3          0
21          2          0
27          4          0

▦ 8. knn(k-Nearest Neighbors)의 분류실습4 ( 붓꽃데이터) 
data(iris)

head(iris)

문제194. 붓꽃의 종류가 몇가지가 있는지 출력하시오 
unique(iris$Species)

> unique(iris$Species)
[1] setosa     versicolor virginica
Levels: setosa versicolor virginica

nrow(iris)
150

▩ 9.knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 

문제195. 붓꽃의 데이터를 훈련데이터와 테스트 데이터로 나눠서
         knn 을 돌려서 테스트 데이터의 라벨을 예측하는 실습을 
         유방암 실습 코드를 가지고 구현하시오 !
          (오늘의 마지막 문제)


 

install.packages('class')

library(class)


install.packages('gmodels')

library(gmodels)


install.packages("scales")

library(scales




######[KNN] using algorithm######################################################

####movie data load

movie<-read.csv('movie.csv',header=F stringsAsFactors=F

colnames(movie)<-c("title","kick","kiss","genre")

movie$genre<-factor(movie$genrelevels= c('Romance','Action')) # covert genre column into a factor

summary(movie[c("kick",'kiss')]) # do not need to normalize


######data partition

movie_train<- movie[1:6,2:3]

movie_test<-movie[7,2:3

movie_train_label <- movie[1:6,4


######classification

movie_test_matrix <-rbind( movie_testmovie_testmovie_test,movie_test,movie_test,movie_test

movie_test_matrix

distances <- sqrt(apply((movie_test_matrix-movie_train)**2,1,sum))

sortedDistIndicies <- order(distances#rearrange disctances into ascending order ( index)

#distances[order(distances)] #sort by distances

#k <- readline(prompt('enter k value'))

classCount <- movie_train_label[sortedDistIndicies[c(1:3)]] 

classCount

sortedClassCount <-table(classCount)

sortedClassCount

movie_test_pred<-names(sortedClassCount[sortedClassCount==max(sortedClassCount)])

movie_test_pred


########plot graph

plot(movie[1:6,]$kick~movie[1:6,]$kissdata=movie[1:6,], col=alpha(c('red','blue'),0.7)[movie[1:6,]$genre], xlab='kiss count'ylab='kick count'main='movie data')

points(movie[7,]$kiss,movie[7,]$kickdata=movie[7,], pch=15cex=1.2col = 'orange')

legend('topright', c(levels(movie$genre), "test"), pch =c(1,1,15), col=c(alpha(c('red','blue'),0.7),'orange'), cex=0.9)



######using packages######################################################

### Data load

movie<-read.csv('/Users/misoni/Desktop/movie.csv',header=F stringsAsFactors=F)

colnames(movie)<-c("title","kick","kiss","genre")

movie$genre<-factor(movie$genrelevels= c('Romance','Action'))

summary(movie[c("kick",'kiss')])


##normalization

#normalize <-function(x) {

# return (  (x-min(x)) / (max(x)-min(x))  )

#}


####split data

movie_train <- movie[1:6,2:3

movie_test <- movie[7,2:3]

movie_train

movie_test


movie_train_label <- movie[1:6,4]

movie_test_label <- movie[7,4]

movie_test_label

####modeling

movie_test_pred <- knn(train=movie_traintest=movie_testcl=movie_train_labelk=3,prob=T)

movie_test_pred

table(movie_test_pred)


library(gmodels)

#CrossTable(x=movie_test_label, y=movie_test_pred)

#####################################################################






###########iris data#######################################################

########normalize data

str(iris)

table(iris$Species)

normalize<-function(x){

return ((x-min(x))/ (max(x)-min(x)))

}

iris_n <- as.data.frame(lapply(iris[1:4], normalize ))


#########split data

set.seed(1)

train <- round(0.7*dim(iris)[1])

train_index = sample(1:dim(iris)[1], trainreplace =F)

iris_train <- iris_n[train_index,]

iris_test <- iris_n[-train_index,]


iris_train_label <- iris[train_index,5]

iris_test_label  <- iris[-train_index,5]


iris_train_label

prop.table(table(iris_train_label))

prop.table(table(iris_test_label))



###

###########modeling

iris_test_pred <- knn(train=iris_traintest=iris_testcl=iris_train_labelk=3, prob=T)

table(iris_test_pred)














 CrossTable(iris_test_label,iris_test_pred)




   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  45


                | iris_test_pred
iris_test_label |     setosa | versicolor |  virginica |  Row Total |
----------------|------------|------------|------------|------------|
         setosa |         15 |          0 |          0 |         15 |
                |     20.000 |      5.000 |      5.000 |            |
                |      1.000 |      0.000 |      0.000 |      0.333 |
                |      1.000 |      0.000 |      0.000 |            |
                |      0.333 |      0.000 |      0.000 |            |
----------------|------------|------------|------------|------------|
     versicolor |          0 |         13 |          0 |         13 |
                |      4.333 |     17.333 |      4.333 |            |
                |      0.000 |      1.000 |      0.000 |      0.289 |
                |      0.000 |      0.867 |      0.000 |            |
                |      0.000 |      0.289 |      0.000 |            |
----------------|------------|------------|------------|------------|
      virginica |          0 |          2 |         15 |         17 |
                |      5.667 |      2.373 |     15.373 |            |
                |      0.000 |      0.118 |      0.882 |      0.378 |
                |      0.000 |      0.133 |      1.000 |            |
                |      0.000 |      0.044 |      0.333 |            |
----------------|------------|------------|------------|------------|
   Column Total |         15 |         15 |         15 |         45 |
                |      0.333 |      0.333 |      0.333 |            |
----------------|------------|------------|------------|------------|






















 

'R(알) ' 카테고리의 다른 글

R 5장. 결정트리  (0) 2017.09.08
R 4장. 나이브 베이즈의 이해활용한 기계학습4  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.09.08
R 3장. knn (최근접 이웃을 사용한 분류의 이해)  (0) 2017.07.14
R 1장 R기본문법  (0) 2017.07.06

R 1장 R기본문법

R(알) 2017. 9. 8. 17:45
  R 책 : R을 이용한 기계학습

6월 22일 ~ 7월 13일 (3주) : R 수업 - 매일 쪽지시험 2개
7월 13일 ~ 8월  3일  (3주) : 딥러닝 - 개념을 잡는 문제
8월  3일  ~ 8월 23일 (3주) : 텐써플로우 + 개인 프로젝트 (포트폴리오)


목차 : 1장. 기계학습 이란?
         2장. 데이터 관리와 이해 --- R 기본문법
                    - R 기본 사용법
         3장. KNN 알고리즘
         4장. 나이브 베이즈 이론
 5장. 결정트리
 6장. 회귀 기법
 7장. 신경망
 8장. 연관 규칙
 9장. K-means
10장. 모델 성능 평가






         2장. 데이터 관리와 이해 --- R 기본문법

* R 스튜디오 설치

emp <- read.csv("emp.csv", header=TRUE)
emp


문제1. R을 왜 배워야하는가? pl/sql 과 비교하시오

SQL, PL/SQL, R, Hive SQL, Python

1. 딥러닝 개발 (파이썬을 아주 잘하고 + 딥러닝 이해)
2. 데이터 분석 (R, SQL)
3. 하둡



 create or replace procedure
     get_data(p_x out sys_refcursor)
     as
        l_query varchar2(400) :='select deptno ';

     begin
        for x in (select distinct job  from emp order by 1)
         loop

                l_query := l_query ||replace(', sum(decode(job,''$X'',sal)) as $X '
                        ,'$X',x.job );

       end loop;a

       l_query := l_query ||' from  emp group by deptno ';

        open p_x for l_query;

    end;

  /


 variable  x  refcursor;

 exec get_data(:x);

 print x;



R 스튜디오에서 실행하면?

attach(emp)
tapply(sal, list(job,deptno),sum)


            10   20   30   70
ANALYST     NA 6000   NA   NA
CLERK     1300 1900  950 3200
MANAGER   2450 2975 2850   NA
PRESIDENT 5000   NA   NA   NA
SALESMAN    NA   NA 5600   NA




   * R이란 무엇인가?


Ross ihaka가 1995년에 개발한 소프트웨어이고
데이터 분석을 위한 통계 및 그래픽스를 지원하는 자유 소프트웨어이다



   * R을 왜 사용해야하는가?

1. R is free
2. data 분석을 위해서 가장 많이 쓰는 통계 플랫폼
3. 복잡한 데이터를 다양한 그래프로 표현할 수 있다.
4. 분석을 위한 데이터를 쉽게 저장하고 조작할 수 있다.
5. 누구든지 유용한 패키지를 생성해서 공유할 수 있고 새로운 기능에 대한 전달이 빠르다
6. 어떠한 os에도 설치가 가능하다.
    심지어 아이폰에도 설치할 수 있다.



   * R의 자료구조


1. vector : 같은 데이터 타입을 갖는 1차원 배열 구조
2. matrix : 같은 데이터 타입을 갖는 2차원 배열 구조
3. array : 같은 데이터 타입을 갖는 다차원 배열 구조
4. data.frame : 각각의 데이터 타입을 갖는 컬럼으로 이루어진 2차원 배열구조(rdbms의 테이블과 유사함)
     예: 오라클      vs      R
          desc emp;      str(emp)

5. list : 서로 다른 데이터 구조(vector, data frame, matrix, array)



   * 기본 데이터 검색


문제2. emp 데이터 프레임에서 이름과 월급을 출력하시오!
> emp[ 행, 열 ]
> emp[  , c("ename", "sal") ]
               ↑
           combine

문제3. 월급이 3000인 사원들의 이름과 월급을 출력하시오.

emp[sal==3000,c("ename", "sal")]

문제4. 월급이 2000 이상인 사원들의 이름과 월급을 출력하시오.

emp[sal>=2000,c("ename", "sal")]

문제5. 직업이 SALESMAN이 아닌 사원들의 이름과 월급과 직업을 출력하시오.

emp[job!="SALESMAN",c("ename", "sal","job")]

문제6. 1981년 12월 11일에 입사한 사원들의 이름과 입사일을 출력하시오.

emp[hiredate =="1981-12-03",c("ename", "sal","hiredate")]



*연산자 총정리

1. 산술연산자 : * / + -
2. 비교 연산자 : >, <, >=, <=, ==, !=
3. 논리 연산자 : & : and (백터화된 연산)
                      && : and (백터화되지 않은 연산) - 산술 연산자
                         | : or (백터화된 연산)
                         || : or (백터화되지 않은 연산)
                         ! : not

예 : x <- c(1,2,3)
      ( x > c(1,1,1) & ( x < (3,3,3) )

예: x <- 1
( (x > -2) && (x <2) )




   * 연결 연산자

오라클 ------------- R
     ||          paste



문제7. 아래와 같이 결과를 출력하시오.

SQL : select ename || '의 직업은 ' || job
     from emp;

R : paste(emp$ename, ' 의 직업은 ', emp$job)

install.packages("data.table")
library(data.table)

data.table(paste(emp$ename, ' 의 직업은', emp$job))



   * 기타 비교 연산자


오라클 ---------------- R

1. in                         %in%
2. like                       grep
3. in null                    is.na
4. between .. and       emp$sal >= 1000 & emp$sal <= 300

문제8. 직업이 SALESMAN, ANALYST 인 사원들의 이름과 직업을 출력하시오

emp[ !emp$job %in% c("SALESMAN", "ANALYST"), c("ename", "job")]

문제9. 직업이 SALEMSMAN, ANALYST가 아닌 사원들의 이름과 직업을 출력하시오.

emp[ !emp$job %in% c("SALESMAN", "ANALYST"), c("ename", "job") ]


문제10. 부서번호가 10번, 20번인 사원들의 이름과 월급과 부서번호를 출력하시오.

emp[ emp$deptno %in% c(10,20), c("ename","sal","deptno") ]



문제11. 커미션이 null인 사원들의 이름과 월급과 커미션을 출력하시오.

emp[  is.na(emp$comm ) , c("ename","sal","comm") ]

설명 : 1. NULL (아무것도 없다) ---> is.null()
          2. NA (결손값) ---> in.na()
          3. NaN (비수치) ---> is.nan()
               ↓
          Not a Number

설명: NULL(아무것도 없다)를 활용하는 때 반복문으로 처리할 오브젝트의 초기값을 NULL로 설정

x <- NULL    # x를 NULL로 초기화
for (i in 1:10) x <- append(x, i*i)
x

(실행결과)
 [1]   1   4   9  16  25  36  49  64  81 100

문제12. 커미션이 NA가 아닌 사원들의 이름과 월급과 커미션을 출력하시오.

emp[!is.na(emp$comm), c("ename", "sal","comm")]


문제13. 월급이 1000에서 3000 사이가 아닌 사원들의 이름과 월급을 출력하시오.

emp[ !emp$sal >= 1000 | !emp$sal <= 3000 , c("ename", "sal")]
또는
emp[ emp$sal < 1000 | emp$sal > 3000 , c("ename", "sal")]

문제14. 이름의 첫번째 글자가 A로 시작하는 사원들의 이름과 월급을 출력하시오.
 emp[grep("^A.*", emp$ename), c("ename", "sal")]

설명:
^ : 첫번째
$ : 마지막
. : 한자리수
* : wild card(%)

문제15. 이름의 끝글자가 T로 끝나는 사원들의 이름과 월급을 출력하시오.

emp[grep("*T$", emp$ename), c("ename", "sal")]


문제16. 이름에 T를 포함하고 있는 사원들의 이름과 월급을 출력하시오.

emp[grep("T", emp$ename), c("ename", "sal")]
emp[grep("^.*T.*$", emp$ename), c("ename", "sal")]


문제17. 이름의 두번째 철자가 M인 사원들의 이름과 월급을 출력하시오.

emp[grep("^.M", emp$ename), c("ename","sal")]

(실행결과)
SMITH

emp[grep("^.M", emp$ename), c("ename","sal")]

(실행결과)
JAMES




   * 중복제거


오라클 --------------------- R
distinct                       unique

문제18. 부서번호를 출력하는데 중복제거해서 출력하시오

unique(emp$deptno)
data.table("부서번호"=unique(emp$deptno))



   * 정렬작업

오라클 ---------------------- R
order by                     - data frame 에서 order 옵션
                                 - data 정렬하는 패키지 doBy를 설치하고
                                   orderBy 함수를 사용


문제19. 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하시오

emp[order(emp$sal, decreasing=T), c("ename", "sal")]



문제20. 이름과 입사일을 출력하는데 먼저 입사한 사원부터 출력하시오.

emp[order(emp$hiredate, decreasing=F), c("ename", "hiredate")]



문제21. 직업이 SALESMAN인 사원들의 이름과 월급과 직업을 출력하는데 월급이 높은 사원부터 출력하시오.



emp[ order(sal, decreasing=T) , c("ename","sal",'job')][emp[ order(sal, decreasing=T) , c("ename","sal",'job')]$job =="SALESMAN", c("ename","sal","job")]

■ R 에서 data를 정렬하는 방법 2가지
  1. data frame에 order 옵션을 사용하는 방법
  2. doBy 패키지를 설치하고 orderBy 함수를 사용하는 방법

install.packages("doBy")
library(doBy)
orderBy(~sal,emp[    , c("ename","sal") ]

   * R에서 data를 정렬하는 방법 2가지


1. data frame에 order 옵션을 사용하는 방법
2. doBy 패키지를 설치하고 orderBy 함수를 사용하는 방법

install.packages("doBy")
library(doBy)
orderBy(~sal, emp[, c("ename","sal")])  # 오름차순
orderBy(~-sal, emp[, c("ename","sal")]) # 내림차순


문제22. 직업이 ANALYST가 아닌 사원들의 이름과 월급과 직업을 출력하는데
          월급이 높은 사원부터 출력되게 하시오.

orderBy(~-sal, emp[emp$job !='ANALYST', c("ename","sal","job")])


문제23. 카페에서 범죄 발생요일(crime_day.csv)를 내려받고 일요일에 발생하는 범죄유형, 범죄건수를 출력하는데 범죄건수가 높은 것부터 출력하시오.

crime_day <- read.csv("crime_day.csv", header=TRUE)
crime_day

orderBy(~-CNT,crime_day[crime_day$DAY=='SUN', c("C_T","CNT")])


설명 :

* 현재 사용하고 있는 변수의 목록을 확인하려면?
ls()

* 변수를 지우고 싶을 때?

rm(x)


crime_loc <_ read.csv("crime_loc.csv",header=TRUE)
crime_loc
head(crime_loc)
str(crime_loc)

문제24. 카페에서 crime_loc.csv 를 내려받고 R에 로드한후에 살인이 일어나느 장소와 건수를 출력하는데 살인이 일어나느 건수가 높은것부터 출력하시오 !
mx <- crime_loc[범죄 =='살인',c("장소","건수")]
orderBy(~-건수,mx)

> mx <- crime_loc[범죄 =='살인',c("장소","건수")]
> orderBy(~-건수,mx)
            장소 건수
83            집  312
85          노상  280
82        아파트  242
108         기타  131
89          병원   87
88      숙박업소   43
90        사무실   40
86          상점   23
101     의료기관   19
91          공장   15
98        유원지   13
96          교통    9
94      역대합실    8
99          학교    8
103         산야    8
87      시장노점    5
문제25. 강도가 가장 많이 발생하는 장소는 어디인가?+


crime_loc <_ read.csv("crime_loc.csv",header=TRUE)
crime_loc
head(crime_loc)
str(crime_loc)


> mx <- crime_loc[범죄 =='강도',c("장소","건수")]
> orderBy(~-건수,mx)
            장소 건수
112         노상 1541
135         기타  552
110           집  528
113         상점  487
109       아파트  372
116         병원  275
115     숙박업소  262
117       사무실  128
125       유원지   55
126         학교   35
123         교통   33
128     의료기관   24
127     금융기관   23
118         공장   16

문제25. 강도가 가장 많이 발생하는 장소는 어디인가

mx <- crime_loc[범죄=='강도',c("장소","건수")]
mx2 <- orderBy(~-건수,mx)
mx2[2,1]

■ 함수
  1. 문자함수
  2. 숫자함수
  3. 날짜함수
  4. 변환함수
  5. 일반함수

■ 문자함수

     오라클       vs        R

     upper               toupper
     lower               tolower
     substr              substr
     replace             gsub

문제28. 이름과 직업을 출력하는데 소문자로 출력하시오


library(data.table)
data.table(

library(data.table)
data.table(이름= tolower(emp$ename),직업=tolower(emp$job))


       이름      직업
 1:  smith     clerk
 2:  allen  salesman
 3:   ward  salesman
 4:  jones   manager
 5: martin  salesman
 6:  blake   manager
 7:  clark   manager
 8:  scott   analyst
 9:   king president
10: turner  salesman
11:  adams     clerk
12:  james     clerk
13:   ford   analyst
14: miller     clerk
15:   jack     clerk

문제29. 아래와 같이 이름을 물어보게하고 이름을 입력하면 해당사원의 이름과 월급이
출력되는 R 코드를 작성하는데 이름을 소문자로 입력해도 출력되게하시오 (R 에서 함수 생성)

find_sal <- function() {

  response <- readline(prompt='이름이 뭐에요')
  x <- emp[emp$ename==response, c("ename","sal") ]
  print (x)
}
find_sal

 > find_sal <- function() {
+
+   response <- readline(prompt='your name?')
+   x <- emp[emp$ename==toupper(response), c("ename","sal") ]
+   print (x)
+ }
> find_sal()
your name?scott
  ename  sal
8 SCOTT 3000
>

문제30. 요일을 물어보게하고 요일을 입력하면 해당요일에 가장 많이 발생하는 범죄유형이 출력되게하시오


find_crime_day <- function() {

  response <- readline(prompt='day?')
  x <- crime_day[crime_day$DAY==toupper(response), c("C_C","CNT") ]
  x1 <- orderBy(~-CNT,x)
  print (x1[1,1])
}
find_crime_day()

day?fri
[1] 지능범죄
Levels: 강력범죄  지능범죄  폭력범죄  풍속범죄
> find_crime_day()
day?mon
[1] 지능범죄
Levels: 강력범죄  지능범죄  폭력범죄  풍속범죄
> find_crime_day()
day?tue
[1] 지능범죄
Levels: 강력범죄  지능범죄  폭력범죄  풍속범죄
>


문제31. 이름을 출력하고 그 이름 옆에 이름의 첫번째 철자부터 세번째 철자까지 출력되게하시오

data.table(emp$ename, substr(emp$ename,1,3) )

문제32. 이름의 두번째 철자가 M 인 사원들의 이름과 월급을 출력하는데 substr 함수를 사용해서 출력하시오 !

data.table(grep("^.M"emp$ename) , substr(emp$ename))



 emp[grep("^A.*",, c("ename", "sal")]

data.table(emp$ename,substr(emp$ename,1,3) , substr(emp$ename,2,3) )

substr (x, start, stop)

문제33. 이름, 월급을 출력하는데 월급을 출력할때 0을 * 로 출력하시오
(gsub 함수 사용)

설명: gsub('h', 'H' ,text)

     특정 text에서 소문자 h를 대문자 H로 변경해라 !

data.table(emp$ename , gsub('0'|'1'|'2' , '*' , emp$sal) )

문제34. 이름과 월급을 출력하는데 월급을 출력할때에 숫자 0,1,2를 * 로 출력하시오 !
data.table(emp$ename , gsub( '[0-2]', '*' , emp$sal) )

■ 숫자함수

     오라클       vs       R
  1. round                round
  2. trunc                trunc
  3.  mod                  %%
  4. power                2^3

문제35. 6의 9승을 출력하시오 !

> 6^9
[1] 10077696

문제36. 10을 3으로 나눈 나머지 값을 출력하시오

10%%3

문제37. 이름과 연봉을 출력하는데 연봉은 월급의 12를 곱해서 출력하고 컬럼명이 한글로 연봉을 출력되게 하시오

data.table (ename=emp$ename, '연봉' = emp$sal * 12 )

문제38. 위의 결과를 다시 출력하는데 round 함수를 써서 백의 자리에서 반올림되게하시오 !


data.table(ename=emp$ename, '연봉' = round(emp$sal * 12, -3))



round(122.5)    123
                122   --->  O

round(123.5)    123
                124  --->  O

※ 알의 특징 !!!!
     알은 짝수를 좋아해 !

※  R 의 trunc 의 특징

     소숫점 이후만 버린다.
     trunc는 소수점 이하면 가능하다 !!

문제39.  문제37번을 다시 출력하는데 백자리 이후를 다 버려서 출력하시오

trunc는 소수점만 가능하다

data.table (ename=emp$ename, '연봉' = trunc(emp$sal * 12 /1000) * 1000 )


■ 날짜 함수

     오라클      vs      R

     sysdate               Sys.Date()
     add_months            difftime
     months_between        사용자 정의함수
     last_day               사용자 정의함수
     next_day              사용자 정의함수

문제40. 오늘 날짜를 출력하시오

Sys.Date()

문제41. 이름, 입사한 날짜부터 오늘까지 총 몇일 근무했는지 출력하시오 !
     (힌트 : 오라클    vs    R   )
          to_data        as.Date

data.table(Sys.Date() - as.Date(emp$hiredate), emp$ename)


문제42. 이름 , 입사한 날짜부터 오늘까지 총 몇달 근무했는지 출력하시오


data.table( month(Sys.Date() ,emp$hiredate), emp$ename)


-SQL 

     select last_day(sysdate) from dual;

-R 
     install.packages("lubridate")
     library(lubridate)

     last_day <- fuction(x) {
     
          ceiling_date(x,"month") - days(1)
                              }
     last_day(Sys.Date()) 

문제44. last_day 함수처럼 first_day 함수를 만드시오 

first_day(Sys.Date())

2017-06-01

first_day <- function(x) {
  ceiling_date(x,"month") - months(1)
}
first_day (Sys.Date())

문제45. 아래의 SQL의 결과를 R로 구현하시오 

SQL : SELECT next_day( sysdate, '월요일') from dual;

R   : next_day(Sys.Date(), '월요일')

17/06/26


■ 변환함수 
  오라클 ------------------- R

to_char                as.character
to_number              as.integer
to_date                as.Date

                         format 함수

문제46. 이름, 입사한 요일을 출력하시오 ! 

data.table(emp$ename, format(as.Date(emp$hiredate), '%A') )




문제45. 아래의 sql의 결과를 R로 구현하시오 !
SQL : SELECT next_day(sysdate, '월요일')
      from dual;


next
















R : next_day( Sys.Date(), '월요일')

■ 일반함수 

     Oracle -------------- R

1.nvl 함수              is.na
2.decode 함수           ifelse
3.case   함수           ifelse

문제46. 이름,월급,등급을 출력하는데 월급이 1500 이상이면 등급을 A등급으로 출력하고 
          아니면 B로 출력하시오 ! 


 salfunc <- fuction(x) {
     
          ceiling_date(x,"month") - days(1)
                              }
     last_day(Sys.Date()) 


data.table(emp$ename, emp$sal, ifelse(emp$sal >= 1500 , 'A', 'B') )
문제50. 이름, 월급, 등급을 출력하는데 등급이 월급이 3000 이상이면 
       A를 출력하고 1500 이상이고 3000 보다 작으면 B를 출력하고 나머지 사원들은 
       C를 출력하시오 ! 

data.table(emp$ename, emp$sal, ifelse(emp$sal >= 3000 , 'A', ifelse(emp$sal >=1500,'B','C')) )

  format(as.Date(emp$hiredate),'%m') 달만
  format(as.Date(emp$hiredate),'%Y') 년만
  format(as.Date(emp$hiredate),'%d') 일만 나옴
문제51. 이름, 월급, 보너스를 출력하는데
      1980년도에 입사했으면 보너스 A를 출력하고
      1980년도에 입사했으면 보너스 B를 출력하고
      1980년도에 입사했으면 보너스 C를 출력하고 


data.table(emp$ename, emp$sal,
ifelse(format(as.Date(emp$hiredate),'%y') == 80 , 'A',
      ifelse(format(as.Date(emp$hiredate),'%y') == 81 , 'B',
             ifelse(format(as.Date(emp$hiredate),'%y') == 82 , 'C','D'))))

문제52. is.na 함수를 이용해서 커미션이 NA인 사원들의 이름과 커미션을 출력하시오  

data.table(is.na(emp$comm) , c('ename','comm')


■ 복수행 함수 ( = group 함수 ) 
     Oracle ---------------- R

  1. max                      max
  2. min                    min
  3. sum                    sum
  4. avg                    mean
  5. count                  length (세로)
                            table  (가로)

문제54. 최대월급을 출력하시ㅗㅇ 

max(emp$sal)
문제55. 직업, 직업별 최대월급을 출력하시오 

aggregate(sal~job, emp,max)
문제56. 부서번호를 뽑고 부서번호별 최대월급을 출력하는데 
          부서번호별 최대월급이 높은 것부터 출력하시ㅗㅇ 
a <- aggregate(sal~job, emp,max)


install.packages("doBy")
library(doBy)
aggregate(sal~job, emp,max)
a <- aggregate(sal~job, emp,max)

# 컬럼명 변경하는 방법 

names(a ) <- c("deptno","sumsal")
a


> a
        job  sal
1   ANALYST 3000
2     CLERK 3200
3   MANAGER 2975
4 PRESIDENT 5000
5  SALESMAN 1600
> names(a) <- c("deptno","sumsal")
> a
     deptno sumsal
1   ANALYST   3000
2     CLERK   3200
3   MANAGER   2975
4 PRESIDENT   5000
5  SALESMAN   1600
>

orderBy(~-sumsal,a)

> orderBy(~-sumsal,a)
     deptno sumsal
4 PRESIDENT   5000
2     CLERK   3200
1   ANALYST   3000
3   MANAGER   2975
5  SALESMAN   1600

문제57. 직업, 직업별 인원수를 출력하시오 
> aggregate(empno~job, emp, length)
        job empno
1   ANALYST     2
2     CLERK     5
3   MANAGER     3
4 PRESIDENT     1
5  SALESMAN     4

문제58. 위의 결과를 막대그래프로 그리시오 
x <- table(emp$job)

barplot(x, col=rainbow(5),main="직업별 인원수" density= 50)


문제59. (오늘의 마지막 문제 ) 입사한 년도(4자리), 입사한 년도별 토탈 월급을 출력하는데  그 결과를 막대그래프로
시각화 하시오 

emp[format(as.Date(emp$hiredate),'%y')

x <- table(format(as.Date(emp$hiredate),'%y'))
barplot(x, col=rainbow(4),main="Year",density= 50)


- 생각해야 할 문제 : months_betwenn 을 R로 구현 






6월 22일 ~ 7월 13일 : R 기본 문법 수업
                         +
                    R을 활용한 기계학습 책 (2장 ~ 10장) 
                    평가 : 1. 매일 쪽지 시험 ( 체크리스트)
                          2.데이터 시각화 (본인이 관심잇는 분석할데이터 평산시에 미리 수집) 

                              ↓
                         1.https://www.data.go.kr = 공공데이터 포탈 
                         2.데이터를 자체적으로 수집 

                         원지은 " 기사 갯수와 주식 거래량과의 상관 관계 "

분석할 데이터들을 수집하고 계셔라 





#정렬 orderBy
install.packages("doBy")
library(doBy)

     #데이터 테이블 표현
install.packages('data.table')
library(data.table)


 
mean == avg


세로 출력 : aggregate
가로 출력 : table ( R 책 2장 ) 

문제60. 직업, 직업별 평균월급을 가로, 세로로 출력하시오 ~ 


- 세로 : aggregate(sal~job,emp,mean)

> aggregate(sal~job,emp,mean)
        job      sal
1   ANALYST 3000.000
2     CLERK 1470.000
3   MANAGER 2758.333
4 PRESIDENT 5000.000
5  SALESMAN 1400.000
> table(emp,job)
소수점 안나오게 
a<-aggregate(sal~job,emp,mean)
a2 <- data.table('직업'=a$job,'월급'=trunc(a$sal))
a2

- 가로 :
 
tapply(emp$sal, emp$job, mean)
  ANALYST     CLERK   MANAGER PRESIDENT  SALESMAN
 3000.000  1470.000  2758.333  5000.000  1400.000


b<-tapply(emp$sal,emp$job,mean)

round(b)

문제62. 직업, 부서번호, 직업별 부서번호별 토탈월급을 출력하시오

tapply(emp$sal, list(emp$job, emp$deptno) ,sum)

5. list : 서로 다른 데이터 구조(vector, data frame, matrix, array)를 중첩

tapply(emp$sal, list(format(as.Date(emp$hiredate),'%Y'), emp$deptno) ,sum)
format(as.Date(emp$hiredate),'%Y')


문제63. 위의 결과중 na를 0으로 변경해서 출력하시오 !

x <- tapply(emp$sal, list(emp$job, emp$deptno) ,sum)
x[is.na(x) == T ] <- 0
X


문제64. 직업, 입사한 년도(4자리), 직업별 입사한 년도별 토탈월급을 출력하는데 NA대신에 0으로 출력되게 하시오 
attach(emp)
x<-tapply(emp$sal, list(job,format(as.Date(emp$hiredate),'%Y')),sum)
x[is.na(x)==T] <- 0
x

문제65.연도 구분하여  부서번호별 직업별 토탈 월급을 출력하시오 
답 : 
x<-tapply(emp$sal, list(deptno,job,format(as.Date(emp$hiredate),'%Y') ),sum)
x[is.na(x)==T] <- 0
x

문제66. 문제62번의 직업별 부서번호별 토탈웕브의 데이터를 막대그래프로 시각화 하시오 ! 
x<-tapply(emp$sal, list(format(as.Date(emp$hiredate),'%Y'), job) ,sum)
x[is.na(x)==T] <- 0

barplot(x,col=rainbow(7),legend=rownames(x),args.legend=list(x=10,y=8000))


> rownames(x)
[1] "1980" "1981" "1982" "1987"
> colnames(x)
[1] "ANALYST"   "CLERK"     "MANAGER"   "PRESIDENT" "SALESMAN"


로우 네임스 


barplot(x,col=rainbow(9),legend=rownames(x),args.legend=list(x=10,y=8000),beside=T)




문제67. 입사한 년도(4자리) , 직업, 입사한 년도 (4자리) 별 직업별 토탈월급을 막대 그래프로 시각화 하시오 ! 
직업 -> 세로 
입사년도 -> 가로 

x<-tapply(emp$sal, list(job,format(as.Date(emp$hiredate),'%Y')) ,sum)
x[is.na(x)==T] <- 0

barplot(x,col=rainbow(7),legend=rownames(x),args.legend=list(x=10,y=8000),beside=T)

문제68.직업과 직업별 토탈 월급을 원형(pie)그래프로 그리시오! 

x2<-tapply(emp$sal,emp$job,sum)
x2[is.na(x2)==T] <- 0
pie(x2, col=rainbow(5),desity=80)

문제69. 위의 그래프를 3d로 출력하시오 ! 

install.packages("plotrix")
library(plotrix)
pie3D(x2,explode = 0.1)


문제70. 위의 그래프에서 비율도 같이 출력하시오 ! 

install.packages("plotrix")
library(plotrix)
pie3D(x2,explode = 0.0653,labels=rownames(x2))


x <- aggregate(sal~job,emp,sum)
pct <- round(x$sal/sum(emp$sal) * 100,1)
pct

jobs <- rownames(x2)
lbls2 <- paste(jobs, ":",pct,"%")
lbls2
pie3D(x2,explode = 0.0653,labels=lbls2)

문제71. (점심시간 문제) 부서번호, 부서번호별 평균월급을 문제70과 같은 3D 파이 그래프로 시각화 하시오 
x<-aggregate(sal~deptno, emp, sum)
x
  deptno   sal
1     10  8750
2     20 10875
3     30  9400
4     70  3200


pct<-round(x$sal/sum(x$sal)*100,1)
pct
[1] 27.2 33.7 29.2  9.9

lbls<-x$deptno
lbls
[1] 10 20 30 70

lbls2<-paste(lbls,':',pct,'%')
lbls2
[1] "10 : 27.2 %" "20 : 33.7 %" "30 : 29.2 %" "70 : 9.9 %"

pie3D(x$sal, explode=0.2, labels=lbls2)



x2<-tapply(emp$sal, emp$deptno, sum)
x2
   10    20    30    70
 8750 10875  9400  3200

pct2<-round(x2/sum(x2)*100,1)
pct2
  10   20   30   70
27.2 33.7 29.2  9.9

lbls3<-rownames(x2)
lbls3
[1] "10" "20" "30" "70"

lbls4<-paste(lbls3,':',pct2,'%')
lbls4
[1] "10 : 27.2 %" "20 : 33.7 %" "30 : 29.2 %" "70 : 9.9 %"

pie3D(x2,explode=0.2, labels=lbls4)
위와 같은 결과











x <- aggregate(sal~deptno,emp,sum)
pct <- round(x$sal/sum(emp$sal) * 100,1)
pct

deptnos<- x$deptnodeptnos<- x$deptno
lbls2 <- paste(deptnos , ":",pct,"%")
lbls2
pie3D(x$sal,explode = 0.0653,labels=lbls2)

x <- aggregate(sal~deptno,emp,sum)
x
pct <- round(x$sal/sum(emp$sal) * 100,1)
pct

deptnos<- x$deptno
lbls2 <- paste(deptnos , ":",pct,"%")
lbls2
pie3D(x2,explode = 0.0653,labels=lbls2)


문제72. 서울시 물가 데이터 (price.csv)를 내려받고 price 라는 변수에 입력하시오 ! 


price <- read.csv("price.csv",header=TRUE)


문제73. tapply 함수를 이용해서 전통시장과 대형마트간의 물품별 가격 평균의 비교를 출력하시오 ! 
        대형마트        전통시장
고등어    720            500
무       100            120
          :               :

A_PRICE     가격
A_NAME       물품
M_TYPE_NAME   전통시장 / 대형마트 




attach(price)
q73<-tapply(A_PRICE,list(A_NAME,M_TYPE_NAME),mean)
q73[is.na(q73==T)] <- 0 
round(q73)


문제74. 위의 결과를 막대 그래프로 그리시오 

barplot(q73, main="서울시 물가 데이터", col=c("Gold","Moccasin"),beside=TRUE,horiz=TRUE)


■ 조인 

    오라클   ------------------   R

equijoin
non equi join                    merge
outer join
self join


emp.csv 외 기타 csv

dept <- read.csv ("dept.csv", header=T)

문제76. 이름과 월급과 부서위치와 부서번호를 출력하시오 !

merge(emp, dept, by="deptno")[ ,c("ename","sal","loc")]


문제77. 부서위치가 DALLAS인 사원들의 이름과 월급과 부서위치를 출력하시오 !

 
a<-merge(emp, dept, by="deptno")[,c("ename","sal","loc")]
a[a$loc=="DALLAS",c("ename","sal","loc")]


merge(emp, dept, by="deptno")[merge(emp, dept, by="deptno")[,c("ename","sal","loc")] $loc=="DALLAS",c("ename","sal","loc")]

문제78. 월급이 1200 이상이고 직업이 SALESMAN 인 사원들의 이름과 월급과 직업과 부서위치를 출력하시오 ! 

m <- merge(emp,dept,by='deptno')[ , c('ename','sal','job','loc')]
m[m$sal>=1200 & m$job =='SALESMAN',]


merge(emp[emp$sal >= 1200, c(emp$ename,emp$job,emp$deptno)], dept[,c(dept$loc,dept$deptno)], by="deptno")


문제79. 커미션이 na인 사원들의 이름과 부서위치와 커미션을 출력하시오 

m <- merge(emp,dept,by='deptno')[ , c('ename','loc','comm')]
m[is.na(m$comm) ,]


 문제80. 부서번호가 10,20 인사원들의 이름과 우러급과 부서위치 부서번호를 출력하시오
merge(emp[emp$deptno %in% c('10','20') ,] ,dept,by='deptno')[,c('ename','sal','loc','deptno')]
 



문제81. 이름과 부서위치를 출력하는데 오라클의 outer join과 같은 결과를 출력하시오 

SQL : 

select e.ename, d.loc
  from emp  e, dept d
 where e.deptno (+)= d.deptno;

R : 
merge (emp, dept, by="deptno", all.y=T) [ ,c("ename","loc")]

 

문제82. 아래의 SQL의 결과를 R로 구현하시오 

-SQL  :

SELECT e.ename, d.loc
from emp e, dept d
where e.deptno = d.deptno (+);

- R

merge (emp, dept, by="deptno", all.x=T) [ ,c("ename","loc")]


문제83. 아래의 SQL의 결과를 R로 구현하시오 ! 
- SQL : 
     SELECT e.ename, d.loc
     from emp e full outer join dept d 
     on (e.deptno = d.deptno) ;

- R :


merge (emp, dept, by="deptno", all.x=T) [ ,c("ename","loc")]

문제84. 이름과 자기 직속상사의 이름 ( 관리자 ) 를 출력하시오 !

- SQL :  select e.ename, m.ename
          from emp e, emp m
          where e.mgr = empno;

- R   :
merge (emp, emp, by.x="empno", by.y="empno") [ ,c("ename.x","ename.x")]


문제85. 자기의 직속상사보다 먼저 입사한 사원들의 이름을 출력하시오 

a<-merge (emp, emp, by.x="mgr", by.y="empno") [ ,c("ename.x","ename.y","hiredate.x" ,"hiredate.y")]
a
a[as.Date(a$hiredate.x) < as.Date(a$hiredate.y) ,]
 


문제86. 자기의 직속상사보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오 



SQL : select e.ename
        from emp e, emp m
       where e.mgr = m.ename and e.sal > m.sal;
 
a<-merge (emp, emp, by.x="mgr", by.y="empno") [ ,c("ename.x","ename.y","sal.x" ,"sal.y")]
a[a$sal.x > a$sal.y ,]


문제87. 사원이름, 직속상사의 이름을 가지고 시각화 하시오  ~!
     (사원테이블의 조직도를 그려라 )
install.package("igraph")
library(igraph)

a<- merge(emp,emp,by.x="mgr",by.y="empno") [ ,c('ename.x','ename.y')]
a
b <- graph.data.fram(a.directed=T)
plot(b)

문제88. 위의 그래프를 구글의 googleVis 를 이용해서 emp 테이블의 관계도를 그리시오 

install.packages("googleVis")
library(googleVis)

org <- gvisOrgChart(a, idvar="ename.y", parentvar="ename.x", option=list(width=600, height=250,size='middle',allowCollapse=T))
plot(org)


왕 대바기다!! 

문제89. 

x <- merge(emp,dept

aggregate(x$sal~x$loc,x,sum)
전처리 최적화 가져오기 => 파이썬 코드 

상속 객체 사용 




■ 조인을 R로 구현하는 방법

SQL ------------------------ R
JOIN 문법                    Merge

1.equi join
2.outer join
3.self join
4.non equi join

-SQL : select d.loc, sum(e.sal) 
        from emp e, dept d
          where e.deptno = d.deptno
          group by d.loc
-R :
a<-merge (emp, dept, by='deptno')
b<-tapply(a$sal, a$loc, sum)
b


c<-aggregate(a$sal~a$loc,a,sum)
c


문제90. aggregate 를 이용할때도  boston이 나오게하려면 어떻게 해야하는가
x <- merge(emp,dept,by='deptno',all=T)
x[is.na(x)==T] <-0
aggregate(x$sal~x$loc,x,sum)










문제91. 부서위치, 직업, 부서위치별 직업별 토탈월급을 출력하시오 ~

          ANALYST      CLARK     SLAESMAN      MANAGER      PRESIDENT
NEW YORK
DALLAS
CHICAHO
BOSTON
x <- merge(emp,dept,by='deptno',all=T)

c<- tapply(x$sal ,list(x$loc,x$job),sum)
c[is.na(c)==T] <-0
c



문제92. 부서위치, 입사한 년도 (4자리) , 부서위치별 입사한 년도별 평균월급을 아래와 같이 출력하시오 !
x<- merge(emp,dept,by='deptno',all.y=T)

c<-tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate),'%Y')),mean)
c
c[is.na(c) == T]<- 0
c


문제93. 부서위치 ,입사한 요일 , 부서위치 별 입사한 요일별 인원수를 


x <- merge(emp,dept,by='deptno',all.y=T)

d<-tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate), '%A') ),length)
d
d[is.na(d)==T] <- 0
d
문제94. 위의 결과를 월화수목으로 출력되게 하시오 

data.table(emp$ename ,format(as.Date(emp$hiredate), '%A'))

library(data.table)
x<-emp[order(format(as.Date(emp$hiredate),'%u')),c('ename','hiredate')]
x
x<-data.table(ename=x$ename, hireday=format(as.Date(x$hiredate),'%A'))
x

tapply(ename=x$ename, list(hireday,x$ename),length)
tapply(ename=x$ename, list(format(as.Date(x$hiredate),'%A') ,x$ename),length)
문제95. (점심시간 문제) 부서위치, 입사한 요일, 부서위치별 입사한 요일별 인원수를 막대 그래프로 시각화 하시오 ! 






문제96.근무지역별 총 월급 구글 바차트로 

install.packages("googleVis")
library(googleVis)

x<-merge(emp, dept, by="deptno", all=T)
x2<-aggregate(x$sal~x$loc,x,sum)
x3 <- data.table(x2)
x4 <- gvisBarChart(x3)
plot(x4)




문제97. 부서명 , 부서명별 평균 월급을 구글 막대 그래프로 그리시오 

x<-merge(emp, dept, by="deptno")
x2<-aggregate(x$sal~x$dname,x,mean)
x3 <- data.table(x2)
x4 <- gvisBarChart(x3)
plot(x4)


문제98. 지하철 1~4호선 승하차 승객수.csv 파일을 R 로 로드해서 line no 컬럼과 time 컬럼을 이용해서 
구글 모션차드를 생성하시오 !

line <- read.csv("1~4호선승하차승객수.csv",header=T)
line
t1 <- gvisMotionChart(line,idvar="line_no", timevar="time")

문제99. 지하철 5호선 8호선 그래프도 그리시오 


문제100. 부서위치, 입사한 년도, 부서위치별 입사한 년도별 토탈월급을 출력한 결과를 구글 파이 차트로 colum chart로 시각화하시오 


x <- merge(emp,dept,by='deptno',all.y=T)
c<-tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate),'%Y')),sum)
c


■ 오라클  vs    R
 concat       cbind


x <- merge(emp,dept,by='deptno',all.y=T)
c <- tapply(x$sal ,list(x$loc,format(as.Date(x$hiredate),'%Y')),sum)
c[is.na(c) ==T] <- 0
c
x3 <- cbind(year=unique(format(as.Date(emp$hiredate),'%Y') ) , as.data.frame(c))
gx <- gvisColumnChart(x3)
plot(gx)

 




문제101. 부서번호, 직업 , 부서번호별 직업별 토탈월급을 구글 column Chart로 그리시오 

x <- merge(emp,dept,by='deptno',all.y=T)
c<-tapply(x$sal ,list(x$job,x$deptno),sum)
c[is.na(c) ==T] <- 0
c
x3 <- cbind(year=unique(emp$job ) , as.data.frame(c))
gx <- gvisColumnChart(x3)
plot(gx)


■ 집합 연산자

     오라클             vs           R

  1. union all                   rbind
  2. union                       rbind + unique
  3. intersect                   intersect
  4. minus                       setdiff


문제102. 아래의 SQL의 결과를 R로 구현하시오. 

- SQL :

select ename, sal, deptno 
  from emp
  where deptno in (10,20) 

union all

select ename, sal ,deptno 
  from emp 
  where deptno = 10;


- R : 

rbind ( emp[emp$deptno %in% c(10,20), c('ename','sal','deptno')],
        emp[emp$deptno == 10 , c("ename","sal","deptno")])


문제103. 부서번호, 부서번호별 토탈월급을 출력하고 맨 아래쪽에 
          전체 토탈월급을 출력하시오 ! 


rbind ( emp[emp$deptno %in% c(10,20), c('ename','sal','deptno')],
        aggregate(emp$sal,emp,sum) )


문제104. 아래의 SQL 의 결과를 R 로 구현하시오.

select ename, sal, deptno
from emp
where deptno in (10, 20)
union
select ename, sal, deptno
from emp
where deptno = 10;

   • union all 과는 다르게 중복이 제거된다.

x<-emp[emp$deptno %in% c(10,20),c('ename', 'sal', 'deptno')]
y<-emp[emp$deptno == 10,c('ename', 'sal', 'deptno')]
z<-rbind(x,y)
unique(rbind(x,y))
    ename  sal deptno
1   SMITH  800     20
4   JONES 2975     20
7   CLARK 2450     10
8   SCOTT 3000     20
9    KING 5000     10
11  ADAMS 1100     20
13   FORD 3000     20
14 MILLER 1300     10

--------------------------------------------------------------------------
문제105. 아래의 SQL 결과를 R 로 구현하시오.

SQL: 
select ename, sal, deptno
from emp
where deptno in (10,20)
minus
select ename, sal, deptno
from emp
where deptno = 10;

-R :
x <- setdiff (emp[emp$deptno %in% c(10,20), c('ename')],
                          emp[emp$deptno==10 ,c("ename")]
x <- setdiff (emp[emp$deptno %in% c(10,20),],emp[emp$deptno==10 ,])

x <- setdiff (emp[emp$deptno %in% c(10,20),],emp[emp$deptno==10 ,])
emp[ emp$ename %in% x, c('ename','sal','deptno') ]
> x
[1] "SMITH" "JONES" "SCOTT" "ADAMS" "FORD"


emp[ emp$ename %in% x, c('ename','sal','deptno') ]



c('ename','sal','deptno')


x <- setdiff (emp[emp$deptno %in% c(10,20),c('ename','sal','deptno') ] ,emp[emp$deptno==10 ,c('ename','sal','deptno') ])


문제106. 아래의 결과를 R로 구현하시오 !

- SQL : 

select ename, sal , deptno
  from emp 
 where deptno in (10,20)
intersect
select ename, sal ,deptno
  from emp
 where deptno = 10 ;

 
- R : 

x <- intersect( emp[emp$deptno %in% c(10,20),c('ename') ],
               emp[emp$deptno==10,c('ename')])

emp[ emp$ename %in% x, c('ename','sal','deptno') ]

■ 서브쿼리 

  • 오라클의 서브쿼리의 종류
1.single row subquery
2.multiple orw subquery
3.multiple column subquery

문제107. JONES의 월급보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하시오 ! 
- SQL :  
select ename, sal 
  from emp
 where sal > (select sal 
               from emp 
               where ename = 'JONES') ;


- R 

jonessal <- emp[emp$ename=='JONES',c("sal")]

emp[ emp$sal > jonessal , c('ename','sal') ]

문제108. 사원 테이블에서 가장 많은 월급을 받는 사원의 이름과 월급을 출력하시오!

y<-emp[emp$job == 'SALESMAN', c(max(emp$sal) )



emp[emp$sal == max(emp$sal) , c('ename','sal')]
문제109. 전국에서 등록금이 가장 비싼 학교이름과 등록금을 출력핫외

data 게시판에서 전국_대학별등록금통계_현황.csv 를 내려받고 
등록금이 가장 비싼학교를 보자 

univ[univ$등록금.A.B. == max(univ$등록금.A.B.) , c("학교명","등록금.A.B.")]


문제110. 집업이 SALESMAN인 사원들중에서의 최대월급보다 더 큰 월급을 
     받는 사원들의 이름과 월급을 출력하시오 ! 
 a<-emp[emp$job == 'SALESMAN', ]
 emp[emp$sal> max(a$sal) ,]
   empno ename       job  mgr   hiredate  sal comm deptno
4   7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
6   7698 BLAKE   MANAGER 7839 1981-05-01 2850   NA     30
7   7782 CLARK   MANAGER 7839 1981-06-09 2450   NA     10
8   7788 SCOTT   ANALYST 7566 1987-04-19 3000   NA     20
9   7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
13  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20
15  9292  JACK     CLERK 7782 1982-01-23 3200   NA     70

문제111. KING에게 보고하는 사원들의 이름과 월급을 출력하시오 ! 

- SQL :

select ename,sal
  from emp
 where mgr = ( select empno
                 from emp
               where ename='KING');

- R : 
     
king<- emp[emp$ename =='KING' , 'empno']
emp[emp$mgr == king, c('ename','sal')]

na.omit(emp[emp$mgr == king, c('ename','sal')])
      
al<- emp[emp$ename =='ALLEN' , 'hiredate']
emp[as.Date(emp$hiredate) > as.Date(al) , c('ename','hiredate')]


설명 : NA는 결손값, 데이터가 없다라는 뜻

문제112, 커미션이 300 인 사원들의 이름과 커미션을 출력하시오 ! 

na.omit(emp[emp$comm == 300, c('ename','comm')])




na.omit(emp[is.na(emp$comm)==T, c('ename','comm')])
문제113. 관리자인 사원들의 이름을 출력하시오 ! 
         (오늘의 마지막 문제)
- SQL : select ename
          from emp
         where empno in ( select mgr from emp);

- R :  
mgr<- emp [, 'mgr']
data.table[emp$empno %in% mgr , 'ename']

 data.table(emp[emp$empno %in% mgr , 'ename'])

data.table(emp[emp$empno %in% emp$mgr,"ename")] )


======================================================================================
6월 28일

 
■ R 수업복습 
     "R을  활용한 기계학습"

1.R기본문법
                    SQL        vs       R
     - 연산자 
     - 함수  :    1.단일행 함수
                 2.복수행 함수
     - 조인

     - 서브쿼리

     - R 함수 : PL/SQL 또는 파이썬의 함수 ----> 감정분석 함수 

     - 그래프 : 막대, 원형, Plot, 사분위수, 특수 그래프 
     
2.R을 활용한 기계학습 2장 - R 기본문법
3.R을 활용한 기계학습 3장 - knn
4.~ R을 활용한 기계학습 10장
5.R을 활용한 기계학습 1장 

취업지원센터 : 이력서 특강 ---> 개별 면담 2시 30분 ~ 3시 30분



■ 서브쿼리:

문제114. 관리자가 아닌 사원들의 이름을 출력하시오 
SQL : 
select ename 
  from emp 
  where empno not in (select mgr
                        from emp 
                        where mgr is not null) ;



data.table(emp[!emp$empno %in% emp$mgr,"ename"] )

문제115. 작년에 아파트에서 가장 많이 발생한 범죄 유형은 무엇인가? 

max_crime <- max(crime_loc[crime_loc['장소']=="아파트",c("건수")] )
crime_loc[crime_loc['건수']==max_crime, c("범죄")]
 
 max(orderBy(~-건수,cl[cl$장소=="학교",] ))

문제116. 학교에서 가장 많이 발생하는 범죄 유형은 무엇인가? 

max_crime <- max(crime_loc[crime_loc['장소']=="학교",c("건수")] )
crime_loc[crime_loc['건수']==max_crime, c("범죄")]
 

orderBy(~-건수,cl[cl$장소=="학교",] )

문제117. 강력범죄가 가장 많이 발생하는 요일은 언제인가?
cd <- read.csv("crime_day.csv",header=TRUE)
a<-cd[cd['C_C'] =='강력범죄' ,'CNT']
cd[cd$C_C =='강력범죄' & cd$CNT==max(a),'DAY']



b<-cd[cd['C_C'] =='강력범죄' ,]
orderBy(~-CNT,b )
 
■ 순위가 출력되게 R로 구현 

         오라클           vs           R
     dense_rank                     rank








문제118. 이름 ,월급, 월급에 대한 순위를 출력하시오 

data.table(emp$ename, emp$sal, rank(emp$sal, ties.method="min" ))
설명 :
ties.method="min" 은 오라클의 dense_rank와 같다
ties.method="first" 은 오라클의 rank 와 같다


문제119. 위의 결과를 다시 출력하는데 순위를 1위부터 정렬해서 출력하시오 ~ 
x<-data.table(emp$ename, emp$sal, rank(emp$sal, ties.method="min" ))
names(x) <- c("ename","sal","rnk")
orderBy(~rnk,x)

문제120. (점심시간문제) 병원에서 많이 발생하는 범죄유형, 건수, 순위를 출력하시오 ~
crime_loc <- read.csv("crime_loc.csv",header=TRUE)
cl <- crime_loc[crime_loc$장소 == '병원',]
x<-data.table(cl$범죄 ,cl$건수, rank(cl$건수 , ties.method="min" ))
orderBy(~rnk,x)



 crime_loc <- read.csv("crime_loc.csv",header=TRUE)
 cl <- crime_loc[crime_loc$장소 == '병원',]
 x<-data.table(cl$범죄 ,cl$건수, rank(-cl$건수 , ties.method="min" ))
 names(x) <- c("범죄 ","건수 ","rnk")
 orderBy(~rnk,x)


문제121. 카페에서 암 발생 데이터를 내려받고 R로 로드 한 후에 
          여자들이 많이 걸리는 암(환자수로 카운트)과 그 건수와 순위를 출력하시오 ~ 

cc2 <- read.csv("cancer2.csv",header = TRUE)
 w <- cc2[cc2$성별=='여자',c("성별","환자수")]
max_cnt=max( w[!is.na(w$환자수),'환자수'])

cc2[integer(cc2$환자수)==integer(max_cnt) & cc2$성별=='여자',]




orderBy(~-암상대생존율_5Y_PC,unique(cc2[cc2$성별=='여자'& is.na(cc2$환자수)==F,]))

orderBy(~암상대생존율_5Y_PC,unique(cc2[cc2$성별=='여자'& is.na(cc2$환자수)==F,]))




 w <- cc2[cc2$성별=='여자'& cc$암종,c("성별","환자수")]
max_cnt=max( w[!is.na(w$환자수),'환자수'])




문제122. 국가별 자살률 데이터를 내려받고 R로 로드한 후에 자살률이 가장 높은 나라가 어디인지 출력하시오 

suc <- read.csv("suicide.csv",header=T)
attach(suc)
max_cnt <- max(suc[, "NAME"])

suc[ suc$NAME==max_cnt,]



데이터 개발자
데이터 분석가 

7가지 전략
1.인맥 ㅠㅠ(유연수 선생님 사랑합니다 & 수강생 친구들 사랑합니다!!)
2.사이트 
3.자격증 
정보처리기사 
sqld
vca 
adsp
통신 금융 공공 (데이터가 많아 )
포트폴리오 화! 

rdb에 대해?
pythonpath 환경변수의 목적?
파이썬에서 지원되는 데이터 유형은?
전통적인 rdbms와 하둡사이의 기본적인 차이점? 


문제123. 카페에서 서울시 교통사고 발생 데이터를 내려받고 
R로 로드한 후에 교통사고가 가장 많이 발생하는 지역과 건수와 순위를 출력하시오 !

car<- read.csv("car_accident.csv",header=T)
     기준년도     지자체                        지점        발생건수.건.    사고유형
  1. 2009        서울    용산역 앞 용산 이-마트 가는길            6          고령자


a<-data.table(car$loc,car$loc_desc, car$cnt, rank(-car$cnt , ties.method="min" ))
names(a) <- c('지역','자세히','건수','등수')
a

orderBy(~등수,a)





q123 <-data.table('지역' = car_accident$자세히,'rnk'=car_accident$건수,'등수'=rank(-car_accident$건수.,ties.method = "first"))


orderBy(~등수,q123) 





q123 <-data.table('장소' = car_accident$지점,'건수'=car_accident$발생건수.건.,'순위'=rank(-car_accident$발생건수.건.,ties.method = "first"))


orderBy(~순위,q123) 







■ R 함수 생성하는 방법
*R 함수 생성 방법

함수명 <- function( 인수 또는 입력값 ){
              계산처리1
              계산처리2
          return (계산 결과 반환 ) 
                         }

문제124. 직업을 입력하면 해당 직업의 토탈월급이 출력되게하는 함수를 
         생성하시오 !

job_sumsal <- function(x) {
          
               sumsal <- sum( emp[emp$job == toupper(x),"sal"] )
               print (sumsal) 
                         }

문제125. 위의 스크립트를 수정해서 직업을 물어보게하고 직업을 입력하면 
          해당 직업의 토탈월급이 출력되게하시오 !
          (힌트 : readline(prompt='직업을 입력하세요 ~ ') )

job_sumsal()
          
     직업을 입력하세요 ~ salesman

     토탈월급이 5600 입니다.
setwd("D:\\data")
 emp <- read.csv("emp.csv",header=TRUE)
 price <- read.csv("price.csv",header=TRUE)
 dept <- read.csv("dept.csv",header=TRUE)

job_sumsal <- function(x) {
               x <- readline(prompt='직업을 입력하세요 ~')
               sumsal <- sum( emp[emp$job == toupper(x),"sal"] )
               print (paste('토탈월급이 ',sumsal, ' 입니다') )

                         }

job_sumsal()


문제126. 카페에서 감정 분석 함수 코드와 데이터를 내려받고 
          메이저리그 구단의 트윗글을 분석해서 그 트윗그링 긍정적인지 
          부정적인지를 확인하는 함수를 생성하시오 ! 

6. 감정분석 함수 in R |11. R 수업



 
install.packages("twitteR")           # R로 트위터의 글들을 스크롤링하는 패키지 
install.packages("plyr")               #시각화하려고 다운 받는 패키지들 
install.packages("stringr")          # 시각화 하려고 다운 받는 패키지
install.packages("ggplot2")          # 시각화 하려고 다운 받는 패키지

library(twitteR)    
library(ROAuth)       
library(plyr)             
library(stringr)          
library(ggplot2)        


#########################
# 3. Sentiment Function #
#########################

# library (plyr)
# library (stringr)

score.sentiment = function(sentences,       pos.words,       neg.words,       .progress='none')  
{                          #분석할 문장        긍정단어          부정단어          
  require(plyr)  
  require(stringr)      
  scores = laply(sentences, function(sentence, pos.words, neg.words) {  
    # clean up sentences with R's regex-driven global substitute, gsub():  
     #gsub 는 replace 함수에요 gsub를 이용해서 데이터 정제작업을 수행

    sentence = gsub('[[:punct:]]', '', sentence)      # 마침표 제외 
    sentence = gsub('[[:cntrl:]]', '', sentence)      # ^C 를 제외
    sentence = gsub('\\d+', '', sentence)             # 문자가 아닌것 (숫자들을 제외하겠다.)

    # and convert to lower case:  
    # 문장을 전부다 소문자로 변경

    sentence = tolower(sentence)  

    # split into words. str_split is in the stringr package 
    # 문장을 단어별로 쪼개는 작업

    word.list = str_split(sentence, '\\s+') 

    # sometimes a list() is one level of hierarchy too much  
    # 쪼갠 단어들을 unlist 함수로 변환

    words = unlist(word.list) 

    # compare our words to the dictionaries of positive & negative terms  
    # 쪼갠 단어들과 긍정단어 사전과 비교작업
    # 쪼갠 단어들과 부정단어 사전과 비교작업

    pos.matches = match(words, pos.words) 
    neg.matches = match(words, neg.words)  

    # match() returns the position of the matched term or NA  
    # we just want a TRUE/FALSE:  
    # 비교된 결과중에 NA 가 포함되어있는 데이터를 제외시킨다. 

    pos.matches = !is.na(pos.matches)  
    neg.matches = !is.na(neg.matches)  
    
    # and conveniently enough, TRUE/FALSE will be treated as 1/0 by sum():  
    # 긍정의 합계와 부정의 합계의 차이를 구한다. 

    score = sum(pos.matches) - sum(neg.matches)
    return(score)  
    
  }, pos.words, neg.words, .progress=.progress )  
  scores.df = data.frame(score=scores, text=sentences)  
  return(scores.df)  
}

#######################################
# 4. Scoring Tweets & Adding a column #
#######################################

# Load sentiment word lists
hu.liu.pos <- scan("positive-words.txt", what='character', comment.char=';')
hu.liu.neg <- scan("negative-words.txt", what='character', comment.char=';')

# Add words to list
pos.words <- c(hu.liu.pos, 'upgrade')                
neg.words <- c(hu.liu.neg, 'wtf', 'wait','waiting', 'epicfail', 'mechanical')  

# Import 3 csv
DatasetDodgers      <- read.csv("DodgersTweets.csv")
DatasetDodgers$text <- as.factor(DatasetDodgers$text)
DatasetRangers   <- read.csv("RangersTweets.csv")
DatasetRangers$text <- as.factor(DatasetRangers$text)
DatasetOrioles      <- read.csv("OriolesTweets.csv")
DatasetOrioles$text <- as.factor(DatasetOrioles$text)
 
# Score all tweets 
Dodgers.scores <- score.sentiment(DatasetDodgers$text, pos.words,neg.words, .progress='text')
Rangers.scores <- score.sentiment(DatasetRangers$text, pos.words,neg.words, .progress='text')
Orioles.scores <- score.sentiment(DatasetOrioles$text, pos.words,neg.words, .progress='text')
write.csv(Dodgers.scores,file='DodgersScores.csv',row.names=TRUE)
write.csv(Rangers.scores,file='RangersScores.csv',row.names=TRUE)
write.csv(Orioles.scores,file='OriolesScores.csv',row.names=TRUE)

Dodgers.scores$Team <- 'LA Dodgers'
Rangers.scores$Team <- 'Texas Rangers'
Orioles.scores$Team <- 'Baltimore Orioles'

##################
# 5. Visualizing # 
##################

hist(Dodgers.scores$score, col="bisque")
qplot(Dodgers.scores$score)

hist(Rangers.scores$score, col="bisque")
qplot(Rangers.scores$score)

hist(Orioles.scores$score, col="bisque")
qplot(Orioles.scores$score)


# Comparing 3 data sets
all.scores <- rbind(Rangers.scores, Dodgers.scores, Orioles.scores)
ggplot(data=all.scores) +                                           
  geom_bar(mapping=aes(x=score, fill=Team), binwidth=1) +
  facet_grid(Team~.) +                                              
  theme_bw() + 
  scale_fill_brewer()                                              

  


-*






막대그래프 
   - 그래프 : 막대, 원형, Plot, 사분위수, 특수 그래프
■ R 그래프 그리는 방법

  1. 막대 그래프 
  2. 원형 그래프 
  3. 라인(plot) 그래프 
  4. 특수 그래프 (지도 ,소리 시각화, 워드 클라우드) 
  5. 사분위수 그래프 ( 평균, 중앙값, 이상치) <--- 머신러닝 2장 

■ 1. 막대 그래프 

그래프 그리는 R 함수 ? barplot

문제127. emp 테이블의 월급으로 기본적이 막대 그래프를 그리시오 ! 

barplot(emp$sal) 

문제128. 위의 그래프의 제목을 Salary Bar Chart 라고 이름을 붙이시오 ! 

barplot(emp$sal, main="Salary Bar Chart",names.arg=emp$ename ) 


barplot(emp$sal, main="Salary Bar Chart",names.arg=emp$ename,ylab="Salary")

barplot(emp$sal, main="Salary Bar Chart",names.arg=emp$ename,ylab="Salary" ,col=rainbow(15))


문제131. 치킨집 년도별 창업건수를 막대 그래프로 시각화 하시오 ! 

create_cnt  <- read.csv("창업건수.csv", header=T)

drop_cnt <- read.csv("폐업건수.csv",header=T)

create_cnt
drop_cnt


barplot(create_cnt$치킨집, main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=rainbow(15))




막대그래프는 1000 을 넘엇는데 y축이 1000밖에 안나온다 그래서 해결책 :


barplot(create_cnt$치킨집, main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=rainbow(15),ylim=c(0,1500) )


문제132. 치킨집 년도별 창업 건수, 폐업건수를 막대 그래프로 시각화 하시오 ! 

barplot(rbind(create_cnt$치킨집,drop_cnt$치킨집), main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=c("blue","red"),ylim=c(0,4000),beside=T )

문제133. (점심시간 문제 ) 위의 결과에서 legend를 이용해서 아래와 같이 결과를 출력하시오 




barplot(rbind(create_cnt$치킨집,drop_cnt$치킨집), main="년도별 치킨집 창업건수",names.arg=create_cnt$X,ylab="창업건수" ,col=c("blue","red"),ylim=c(0,4000),beside=T ,legend.text = c("창업", "폐업") )



■ R 그래프 그리는 방법

  1. 막대 그래프 
  2. 원형 그래프 
  3. 라인(plot) 그래프 
  4. 특수 그래프 (지도 ,소리 시각화, 워드 클라우드) 
  5. 사분위수 그래프 ( 평균, 중앙값, 이상치) <--- 머신러닝 2장 



  1. 원형(pie) 그래프!!

문제134. 사원 테이블의 월급으로 원형 그래프를 그리시오 

pie(emp$sal) 

문제135. 위의 그래프를 다시 출력하는데 누구의 월급인지가 명시되게 하시오 ! 

pie(emp$sal, main="Salary Pie Chart", labels=emp$ename, col=rainbow(15))


문제136. 위의 그래프에 월급의 비율을 붙여서 출력하시오 ! 

sal_labels <- round(emp$sal/sum(emp$sal) * 100, 1) 
sal_labels


sal_labels2 <- paste(emp$ename,sal_labels,"%")
sal_labels2


pie(emp$sal, main="Salary Pie Chart", labels=sal_labels2 , col=rainbow(15))



문제137. 2014년도의 각 업종별 창업 비율을 아래와 같이 원형 그래프로 그리시오 ! 


p <- read.csv("창업건수.csv")
a<- rbind(p[p$X==2014,c("미용실")], 
      p[p$X==2014,c("양식집")],
      p[p$X==2014,c("일식집")],
      p[p$X==2014,c("치킨집")],
      p[p$X==2014,c("커피음료")],
      p[p$X==2014,c("한식음식점")],
      p[p$X==2014,c("호프간이주점")]
      )

b<- data.frame("건수"=a , "업종"=c("미용실", "양식집","일식집", "치킨집","커피음료","한식음식집","호프간이주점"))
b2<-data.frame(b$건수, b$업종, "rank"=rank(-b$건수, ties.method = "min"))
b2[order(b2$rank),]
labels2 <- round(b2$b.건수 /sum(b2$b.건수 ) * 100, 1) 
labels3 <- paste(b2$b.업종,labels2 ,"%")
pie(b2$b.건수, main="Salary Pie Chart", labels=labels3 , col=rainbow(7))


선생님 코드

create_cnt  <- read.csv("창업건수.csv", header=T)

drop_cnt <- read.csv("폐업건수.csv",header=T)


x<- create_cnt[create_cnt$X=='2014',]
x



년도는 제끼고 싶을 ㄷ ㅐ

x2<- x[,(2:8)] #2번째 부터 7번재 컬럼까지 가져와라 ! 


cnt_labels <- round(x2/sum(x2) * 100, 1) 
cnt_labels


컬럼명만 뽑아 내고 싶을 때


cnt_labels
t(cnt_labels)


cnt_labels2  <- paste(colnames(cnt_labels),t(cnt_labels),"%")
cnt_labels2t


data.table(t(cnt_labels))


labels2 <- round(b2$b.건수 /sum(b2$b.건수 ) * 100, 1) 
labels3 <- paste(b2$b.업종,labels2 ,"%")
pie(b2$b.건수, main="Salary Pie Chart", labels=labels3 , col=rainbow(7))

x7 <- as.vector(t(cnt_labels))


pie(x7 , labels=cnt_labels2 , col=rainbow(7))

pie( t(cnt_labels) , labels=cnt_labels2 , col=rainbow(7))

문제138. 2013년도의 위의 원형 그래프를 그리


x<- create_cnt[create_cnt$X=='2013',]
x2<- x[,(2:8)] 
labels2 <- round(b2$b.건수 /sum(b2$b.건수 ) * 100, 1)
labels3 <- paste(b2$b.업종,labels2 ,"%")
pie( t(cnt_labels) , labels=cnt_labels2 , col=rainbow(7))


graphics.off()
par(mfrow=c(1,2), new=T)
par(mar=c(5,5,0,0))


x<- create_cnt[create_cnt$X=='2013',]
x2<- x[,(2:8)] 
x_labels <- round(x2 /sum(x2) * 100, 1)
x_labels2<- paste(colnames(x_labels),t(x_labels) ,"%")
x7 <- as.vector(t(x_labels ))
pie(x7 , labels=x_labels2 , main="2013년도 치킨집 창업", col=rainbow(7),density=90 )

zx<- create_cnt[create_cnt$X=='2014',]
zx2<- zx[,(2:8)] 
zx_labels <- round(zx2 /sum(zx2) * 100, 1)
zx_labels2<- paste(colnames(zx_labels ),t(zx_labels ) ,"%")
zx7 <- as.vector(t(zx_labels ))
pie(zx7 , labels=zx_labels2, main="2014년도 치킨집 창업", , col=rainbow(7),density=90 )

■ 3. 라인(plot) 그래프
문제139. 아래의 점(plot) 그래프를 그리시오 !

cars <- c(1,3,6,4,9)
cars

plot(cars)

문제140. 위의 그래프에 파란색 선을 그리시오  !
plot(cars, type="o", col="blue")

문제141. 차와 트럭의 팔린 댓수를 라인 그래프로 시각화 하시오 !

graphics.off()
cars<- c(1,3,6,4,9)
trucks <- c(2,5,4,5,12)
c<-c(1,2,3,4,5)
plot(cars,type="o", col="blue", ylim=c(0,12)) 

그래프 창 닫지 말고 바로 이어서

lines(trucks, type="o", pch=21, lty=3, col="red")
lines(c, type="o", pch=1, lty=1, col="purple")


문제132. 다시 위의 그래프 2개의 그래프를 아래의 순서대로 시각화 작업을 하시오  !

graphics.off()
cars <- c(1,3,6,4,9)
trucks <- c(2,5,4,5,12)

g_range<- range(0,cars,trucks)
g_range

plot(cars, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)

     axes=FALSE ---> x 축 안나오게하라 !
     ann=FALSE  ---> x 축의 라벨도 안나오게 해라 ! 

axis(1, at=1:5, lab=c("Mon","Tue","Wed","Thu","Fri") )
     ↑
     x축을 의미 2는 y축
axis(2)

box()


lines(trucks, type="o", pch=22,lty=2,col="red")
                            ↑      ↑
                           네모    점선

 
 title(xlab="Days" , col.lab=rgb(0,0.5,0))

 title(xlab="Total" , col.lab=rgb(0,0.5,0))


legend(1, g_range[2], c("cars","trucks") , cex=0.8,
          col=c("blue","red"), pch=21:22, lty=1:2) 

pch=21 : 동그라미          lty = 1 : 직선
pch=22 : 네모              lty = 2 : 점선

cex = 0.8 : 글씨크기 

문제143. 년도별 치킨집 창업수와 카페 창업수를 라인 그래프로 그리시오 !



graphics.off()
d<- drop_cnt[,5]
c <- create_cnt[,5]
g_range<- range(0,d,c)
g_range
plot(d, type="o", col="blue", ylim=g_range, axes=FALSE, ann=FALSE)
axis(1, at=1:10, lab=c("2005" , "2006" , "2007" , "2008" , "2009" , "2010" , "2011" , "2012" , "2013" , "2014" ) )
title(main="치킨집 창업/폐업 현황",col.main="red", font.main=4)  


axis(2)

box()
lines(c, type="o", pch=22,lty=2,col="red")
       
 title(xlab="연도" , col.lab=rgb(0,0.5,0))
 title(ylab="점포수" , col.lab=rgb(0,0.5,0))
legend(1, g_range[2], c("폐업","창업") , cex=0.8, col=c("blue","red"), pch=21:22, lty=1:2) 




■ 특수 그래프 (소리를 시각화 ) 

소리를 시각화 하는것이 왜 중요한가? !

문제144. 지금 방금 들은 output.wav 파일을 시각화 하시오 ! 

install.packages('tuneR')
library(tuneR)

audio <- readWave("output.wav")
head(audio@left,100)


plot(head(audio@left,100))

sohot<- readWave("sohot.wav")
head(sohot@left,1000)
plot(head(sohot@left,100))

문제145. 원더걸스의 so hot을 시각화 하시오 ! 


문제146. 정상적인 심장박동 소리를 포함해서 비정상적인 심장 박동소리를 각각 시각화 하시오 

audio1<- readWave("normal.wav")
audio2<- readWave("ps.wav")
audio3<- readWave("mr.wav")
audio4<- readWave("ar.wav")

plot(audio1)

문제147. 위의 4개의 그래프를 하나의 화면에 동시에 출력될 수 있게 하시오 

graphics.off()
par(mfrow=c(2,2), new = T)
par(mar=c(1,1,1,1))

plot(audio1)
plot(audio2)
plot(audio3)
plot(audio4)

 
문제148. seewave 패키지를 다운받아 sohot을 실시간 시각화 하시오 !

install.packages("seewave")
library("seewave")
a <- readWave("output.wav")
play(a)

specs <- dynspec(a, f=8000, plot= FALSE)$amp

out <- apply(specs, f=8000, MARGIN=2, FUN = fbands, bands = 20, col = "orange", ylim=c(0,max(specs))) 

out


































 




 


 라인 (plot) 그래프의 배경을 변경하는 방법
  1. 태양(sun.jpg) 배경 사진을 다운 받는다.
  2. jpeg 패키지를 설치한다

graphics.off()
install.packages("jpeg")
library(jpeg)

  1. plot 그래프의 배경을 sun.jpg로 변경한다.

ima <- readJPEG("D:\\data\\sun.jpg")
plot(1:2,type='n',main="plotting over an image", xlab='x', ylab='y')

lim <- par()

rasterImage(ima,lim$usr[1],lim$usr[3],lim$usr[2],lim$usr[4])

grid()

lines(c(1,1.2,1.4,1.6,1.8,2.0), c(1,1.3,1.7,1.6,1.7,1.0), type="b", lwd=5, col='gold')



문제149. plot 그래프를 다시 그리는데 고야잉 사진 또는 개사진으로 변경해서 그리시오 !

■ 특수 그래프 (


install.packages("maps")
install.packages("mapproj")

library(maps)
library(mapproj)

map("world")
map("world,"china")


문제152. 구글 지도 그래프를 이요해서 서울지역의 지하철 2호선의 그래프를 시가고하 하시오 

서울지하철 2호선 위경도 정보.csv
서울지하철 3호선 위경도 정보.csv

install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철2호선위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철2호선위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
 kor.map <- ggmap(kor) + geom_point(data=loc,aes(x=LON,y=LAT),size=3, alpha=0.7)
 kor.map + geom_text(data=loc, aes(x=LON,y=LAT+0.005,label=역명),size=3)


문제153. 서울지하철 3호선 위경도 정보를 가지고 지하철 3호선의 그래프를 시각화하시오  !


install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철3호선역위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
install.packages("ggplot2")
 install.packages("ggmap")
 library(ggplot2)
 library(ggmap)
 loc <- read.csv("서울지하철3호선역위경도정보.csv",header=T)
 center <- c(mean(loc$LON),mean(loc$LAT))
 kor <- get_map(center,zoom=11, maptype="roadmap")
 kor.map <- ggmap(kor) + geom_point(data=loc,aes(x=LON,y=LAT),size=3, alpha=0.7)
 kor.map + geom_text(data=loc, aes(x=LON,y=LAT+0.005,label=역명),size=3)

■ 특수 그래프 ( 워드 클라우드) 



install.packages("KoNLP")
install.packages("wordcloud")
install.packages("plyr")
install.packages("data.table")


library("data.table") 
library(KoNLP)
library(wordcloud)
library(plyr)
library(RColorBrewer) 


niv <- readLines('NIV.txt')
#텍스트 파일에서 명사만 추출하는 작업
data2 <- sapply(niv,extractNoun,USE.NAMES = F) 
data3 <- unlist(data2)  
data3 <- Filter(function(x) {nchar(x) >= 2}, data3)
data3 <- gsub("\\d+", "", data3)
data3 <- gsub("\\(", "", data3)  
data3 <- gsub("\\)", "", data3)


write(unlist(data3), "NIV2.txt") 
data4 <- read.table("NIV2.txt") 
wordcount <- table(data4)   
wordcount  
palete <- brewer.pal(9, "Set1") 
wordcloud(names(wordcount), freq=wordcount, scale=c(5,1),rot.per = 0.1, min.freq=1,random.order=F, color=T, colors=palete)


문제154. (점심시간 문제) 영화대폰 해리포터와 마법사를 다운 받아서 워드 클라우드를 그리시오 ! 


install.packages("KoNLP")
install.packages("wordcloud")
install.packages("plyr")
install.packages("data.table")

library("data.table")
library(KoNLP)
library(wordcloud)
library(plyr)
library(RColorBrewer)

niv <- readLines('hp.txt')
#텍스트 파일에서 명사만 추출하는 작업
data2 <- sapply(niv,extractNoun,USE.NAMES = F)
data3 <- unlist(data2)
data3 <- Filter(function(x) {nchar(x) >= 2}, data3)
data3 <- gsub("\\d+", "", data3)
data3 <- gsub("\\(", "", data3)
data3 <- gsub("\\)", "", data3)

write(unlist(data3), "hp.txt")
data4 <- read.table("hp.txt")
wordcount <- table(data4)
wordcount
palete <- brewer.pal(9, "Set1")
wordcloud(names(wordcount), freq=wordcount, scale=c(5,1),rot.per = 0.1, min.freq=1,random.order=F, color=T, colors=palete)






보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인