Quiet Time

7장 Subquery 사용

SQL 기본2017. 9. 7. 02:01
  1. SQL이란 무엇인가.
 데이터를 입력 , 조작, 검색할 사용하는 언어
 
 - SELECT 문의 6가지
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
 
  • 함수
  1. 단일행 함수
 
  1. 복수행함수
  • 조인
  1. 오라클 조인 문법
  • EQUI JOIN
  • NON EQUI JOIN
  • OUTER JOIN
  • SELF JOIN
 
  1. 1999 ANSI  문법
  • FULL OUTER JOIN
 
  • DATA 분석함수
  1. LISTAGG
  2. NTILE
  3. RANK
   4.    DENSE_RANK
  1. 누적데이터
 
 
  1. SQL 배워야하는지?
파이썬과 R 활용한 머신러닝 전문가 과정
                                                 
                                         머신이 스스로 (데이터) 학습하게끔 만드는 기능
                                        
빅데이터 (원유)
 
 
인공지능 기술 연구의 선두기업들 : GOOGLE, FACEBOOK, 바이두
 
 2013년에 구글은 인공지능 연구를 위해서 딥러닝의 1인자인
토론토 대학 제프리 힌트 교수를 영입.
 
2014년에 영국의 딥마인드 테크놀로지스사를 매수했다.
사원수가 고작 12명인 회사인데 페이스북과 경쟁하여 4억달러(4200억원) 인수해서 세상을 놀라게 했다.
 
딥러닝 기술로 구현 하고자 하는 여러 사업들중 대표적인 것이
  1. 이미지 학습 : 이미지를 인식하게 하고 학습시키는 방법
 ( 구글에서 이제 고양이 사진을 인식했다.)
 
  1. 음식사진을 계속 학습 시키는 프로그램 개발
 (100 ~ 150) 영국회사 + 우리나라회사(텐서플로우 이미지학습) + 서강대 (웹스크롤링)
 
 
파이썬 ( 프로그래밍 스킬 ) --> R (머신러닝 알고리즘)
                수학
  1. 미분
  2. 선형대수학
 --> 텐서플로우
 

 
  • 서브 쿼리 단원 목차
  1. Single Row Subquery
  2. multiple row subquery
  3. 서브쿼리에서의 null
  4. exists
 
7.1 Single Row Subquery
"JONES 보다 많은 월급을 받는 사원들의 이름과 월급을 출력하시오 "
 
SELECT E.ENAME, E.SAL
FROM (SELECT I.SAL FROM EMP I WHERE ENAME='JONES') A ,EMP E
WHERE E.SAL >= A.SAL;
 
 
 
월급이 2975보다 사원들의 이름과 월급을 출력하라
SELECT ENAME, SAL
 FROM EMP
WHERE SAL > 2975;
 
 
SELECT ENAME, SAL  ---------------------- 메인 쿼리
 FROM EMP
WHERE SAL > ( SELECT SAL
FROM EMP             ------------------서브 쿼리
WHERE ENAME ='JONES') ;
 
 
 
문제213.SCOTT 같은 월급을 갖는 사원들의 이름과 월급을 출력하시오
ELECT ENAME, SAL  ---------------------- 메인 쿼리
 FROM EMP
WHERE SAL = ( SELECT SAL
FROM EMP             ------------------서브 쿼리
WHERE ENAME ='SCOTT') ;
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

6장 조인 문법

SQL 기본2017. 9. 7. 01:59
    • 6 조인
      • 조인 목차
      • 오라클 조인 문법
      • 1999 ansi 문법
    • 6.1 오라클 조인 문법
 
    • 조인(join) ?  여러개의 테이블의 컬럼의 결과를 하나의결과값으로 출력할때 사용하는 SQL문법
 
 
select * from dept;

 
 
deptno : 부서번호
dname  : 부서명
loc          : 부서위치
 
문제 171. 이름, 부서위치를 출력하시오
 
         select ename, loc
  from emp, dept
where emp.deptno = dept.deptno;
       
    -----------------------------
                          
                  조인 조건
문제172 위의 결과를 다시 출력하는데 부서위치가 DALLAS 사원들만 출력하시오
 select ename, loc
   from emp, dept
 where emp.deptno = dept.deptno and dept.loc = 'DALLAS';
                       -----------------------------         ----------------------------
                                                                                   
                            조인 조건                                     검색조건
 
문제.173. 이름, 월급, 직업, 부서위치, 부서번호를 출력하시오!
 
select ename, sal, job, loc, deptno
  from emp, dept
 where  emp.deptno = dept.deptno;
 
조인문장 작성시 주의 사항
1. 컬럼명 앞에 테이블을 명시한다.
2. 테이블 별칭을 사용한다.
 
문제174. 월급이 3000 이상인 사원들의 이름과 월급과 부서위치를 출력하시오 !
select e.ename, e.sal, d.loc
  from emp e, dept d
 where e.deptno = d.deptno and e.sal > = 3000;
          ------------------------------         ------------------------
                                                                   
                           조인 조건                     검색조건
 
 
문제175. 직업이 SALESMAN 사원들의 이름과 직업과 월급과 부서위치를
출력하시오
 
SELECT E.ENAME, E.JOB, E.SAL, D.LOC
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO AND E.JOB = 'SALESMAN';
 
문제176. 부서위치, 이름, 월급 , 순위를 출력하는데
순위가 월급이 높은 순서로 순위를 출력하시오
 
select d.loc, e.ename, e.sal, rank() over (order by sal desc nulls last)
 from emp e, dept d
 where e.deptno = d.deptno;
 
문제177. 부서위치 이름, 월급 순위를 출력하느데
순위가 부서위치별로 각각 월급이 높은 순서로 순위를
출력하시오
select d.loc, e.ename, e.sal, rank() over (partition by d.loc order by sal desc nulls last)
 from emp e, dept d
 where e.deptno = d.deptno;
 
문제178. 부서위치, 부서위치별로 속한 사원들의 이름을 가로로 출력하시오
   loc                         ename               
new york                  smith,king,.....
dallas
chicago
 
     SELECT d.loc, listagg(e.ename,',') within GROUP (ORDER BY e.ename) AS "ename"
      FROM EMP e , DEPT d
      WHERE e.deptno = d.deptno
      GROUP BY d.loc;
    
    
    
 
 
문제179. 부서명, 부서명별로 속한 사원들의 이름이 아래와 같이 출력되게 하시오
 dname                      ename
ACCOUNING
RESEARCH
SALES
 
 
     
    SELECT D.DNAME, listagg(e.ename,',') within GROUP ( ORDER BY e.ename) AS "ename"
      FROM EMP e, DEPT d
      WHERE e.deptno = d.deptno
      GROUP BY d.DNAME;
 
 
 
    • 6.1 오라클 조인 문법  4가지
    • equi join ----> 조인하려는 테이블의 연결고리가 = 조인인 경우의 조인
    • non equi join ---> 조인하려는 테이블의 연결고리가 = 조인조건이 아닌경우
    • outer join ----> equi join  으로는 없는 결과값을 볼때 사용하는 조인
    • self join ---> 자기 자신의 테이블과 조인하는 테이블
 
문제 180. 부서위치, 부서위치별 토탈 월급을 출력하시오
 
세로로 출력
 
select d.loc, sum(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by d.loc;

 
문제181. 부서위치, 부서위치별 토탈월급을 출력하시오
select *
 from emp e, dept d
WHERE e.deptno = d.deptno;
 pivot   ( sum(sal) for loc in ('NEW YORK', 'DALLAS', 'CHICAGO', 'BOSTON')
;
------> 안뎀 잘못쓴 쿼리문
pivot안에 e.sal 이렇게 쓰면 안뎀 칼럼명은 e.sal 안나오잖오 !
 
select *
 from (select d.loc, e.sal
from emp e, dept d
WHERE e.deptno = d.deptno)
pivot  ( sum(sal) for loc in ('NEW YORK', 'DALLAS', 'CHICAGO', 'BOSTON')
;
 
 
문제182. 카페에서 salgrade 테이블 스크립트를 내려 받아 salgrade 테이블을 생성한다.

급여 등급 테이블
grade       : 등급
losal         : 등급안에서 제일 낮은 월급
hisal         : 등급안에서 제일 높은 월급
 
문제 183. emp salgrade 테이블을 조인해서  이름, 월급, 급여등급을 출력하시오

 
문제184. 그럼 위의 결과 중에서 등급이 3등급인 사원들만 출력하시오
 
SELECT e.ename, e.sal, s.grade
 FRoM EMP e, salgrade s
 WHERE e.sal BETWEEN s.losal AND s.hisal
 AND s.grade =3;
 
등급을 출력하는 SQL
 
    • 코드성 테이블 (salgrade) 조인을 해서 출력
    • Data 분석함수를 사용하는 경우
문제185. 이름, 월급, 등급을 출력하는데 월급의 등급을 4등급으로 나눠 출력하시오
 
select ename, sal, ntile(4) over (order by sal desc) 등급
from emp;
 
 
문제186. 통신사, 이름, 나이, 등급을 출력하는데
통신사별로 각각 나이가 높은 순서대로 4등급으로 나눠서
등급을 출력하시오
select telecom, ename, age, ntile(4) over (partition by telecom order by age desc)
as "등급"
 from emp2;
 
 
 
오라클 조인 문법 4가지
    • equi join
    • non equi join
    • outer join
 
 
문제187. 이름과 부서위치를 출력하는데 아래와 같이 조인이 안된 부서위치인
BOSTION도 출력하시오.
 
ENAME                LOC
-------------------- --------------------------
KING                 NEW YORK
BLAKE                CHICAGO
CLARK                NEW YORK
JONES                DALLAS
MARTIN               CHICAGO
ALLEN                CHICAGO
TURNER               CHICAGO
JAMES                CHICAGO
WARD                 CHICAGO
FORD                 DALLAS
SMITH                DALLAS
    :                  :
                  BOSTON
 
select e.ename, d.loc
  from emp e, dept d
where e.deptno (+)= d.deptno ;
 
 
 
 
 
(+) 를 모자란쪽에 더해준다 라는 느낌으로
반대편인 경우에는
 
 
select e.ename, d.loc
  from emp e, dept d
where e.deptno = d.deptno (+) ;
 
부족한게 없으니 바뀌지 않음
 
 문제188(오늘의 마지막 문제)
직업별, 부서위치별 토탈월급을 출력하시오
(가로)    (세로)
 - sum 함수와 decode 이용:
select e.job, sum(decode(d.loc,'NEW YORK',e.sal,0)) as "NEW YORK",
sum(decode(d.loc,'DALLAS',e.sal,0)) as "DALLAS",
sum(decode(d.loc,'CHICAGO',e.sal,0)) as "CHICAGO",
sum(decode(d.loc,'BOSTON',e.sal,0)) as "BOSTON"
from emp e, dept d
 where e.deptno = d.deptno
 GROUP BY e.job;
 
 
 
 
 - pivot 이용:
select *
 from (select e.job, e.sal, d.loc
from emp e, dept d
where e.deptno = d.deptno)
pivot ( sum(sal) for loc in ('NEW YORK' AS "NEW YORK",
'DALLAS' AS "DALLAS",
'CHICAGO' AS "CHICAGO",
'BOSTON' AS "BOSTON");
 

 
5 . 복수행 함수
    • 5 목차
    • max, min, avg, sum, count 함수
    • 그룹함수에서의 null 값의 의미
    • having
    • 그룹함수를 중첩하는 방법
 
    • max 함수
: 최대값을 출력하는 함수
 
문제 101. 최대 월급을 출력하시오 !
SELECT MAX(sal) FROM EMP;
 
문제102. 직업이 SALESMAN 사원들중에서의 최대월급을 출력하시오
SELECT MAX(sal) FROM EMP WHERE JOB = 'SALESMAN'
 
 
문제103. SK 텔레콤 사용 학생중 최대 나이를 출력하시오
SELECT  MAX(age)
FROM EMP2
WHERE TELECOM = 'sk';
 
3 SELECT telecom  MAX(age)
1 FROM EMP2
2 WHERE TELECOM = 'sk';
telecom 여러개 나오려고 하고 max 하나만 나오려고하니까 에러남
 
4 SELECT  telecom, MAX(age)
1 FROM EMP2
2 WHERE TELECOM = 'sk'
3 GROUP BY telecom;
 
    • group by 역할 : 데이터를 grouping 하는 역할
    • select
    • from
    • where group by
 
 
문제104. 부서번호, 부서번호별 최대월급을 출력하시오!
SELECT  deptno, MAX(sal)
FROM EMP
GROUP BY deptno;
 
문제105. 전공, 전공별 최대나이를 출력하시오
SELECT major, MAX(age)
FROM EMP2
GROUP BY major;
 
문제106. 성씨별 최대나이를 출력하시오
SELECT substr(ename,1,1), MAX(age)
FROM EMP2
GROUP BY  substr(ename,1,1);
 
문제107. 위의 결과를 다시 출력하는데 나이가 높은 성부터 출력되게 하시오
SELECT substr(ename,1,1), MAX(age) 나이
FROM EMP2
GROUP BY  substr(ename,1,1)
ORDER BY  나이 desc;
 
문제108. 서울시 물가 데이터를 오라클 database 입력하시오 !
 
문제109. a_price (가격)
서울시 물가 데이터중 최대 가격을 출력하시오!!
 
SELECT MAX(a_price) FROM price;
 
 
    • min 함수
: 최소값을 출력하는 함수
 
 
 
 
문제 110. 사원테이블에서 최소 월급을 출력하시오
SELECT MIN(sal) FROM EMP;
문제111. 직업, 직업별 최소월급을 출력하시오!
 
SELECT job, MIN(sal)
FROM EMP
GROUP BY job;
 
문제112. 위의 결과를 다시 출력하는데 직업이 null
출력 안되게 하시오
 
SELECT job, MIN(sal)
FROM EMP
WHERE job IS NOT null
GROUP BY job;
 
문제113. 위의 결과를 다시 출력하는데 최소 월급이 높은 것부터 출력하시오
SELECT job, MIN(sal)
FROM EMP
WHERE job IS NOT null
GROUP BY job
ORDER BY min(sal) desc;
 
문제114. 사원 테이블에 가장 먼저 입사한 사원의 입사일을 출력하시오
select min(hiredate)
from emp;
 
문제115. 전공 , 전공별 최소나이를 출력하는데 컴공은 제외하고 출력하시오
select major, min(age)
  from emp2
 where major <> '컴퓨터공학'
group by major;
 
문제116. 주소, 주소별 최소나이를 출력하시오
select substr(address,1,7), min(age)
from emp2
group by substr(address,1,7);
 
    • count 함수 : 건수를 세는 함수
문제117. 사원 테이블의 전체 건수를 출력하시오
 
select count(empno)
from emp;
 
select count(*)
 from emp;
 
문제118. 커미션을 count하시오
select count(comm)
from emp;
 
 
문제119. 직업이 SALESMAN 사원들이 몇명이 잇는가
 
SELECT COUNT(*)
FROM EMP
WHERE job = 'SALESMAN';
 
문제120. 직업이 ANALYST 사원들은 몇명이 있는가?
 
SELECT COUNT(*)
FROM EMP
WHERE JOB='ANALYST';
 
GROUP 함수는 NULL 값을 무시한다!!
 
문제121. 직업 , 직업별 인원수를 출력하시오
SELECT JOB, COUNT(*)
FROM EMP;
 
 
문제122. 전공, 전공별 인원수를 출력하시오
SELECT MAJOR, COUNT(*)
FROM EMP2
GROUP BY MAJOR
문네123. 위의 결과를 다시 출력하는데 전공별 인원수가 높은 부터
SELECT MAJOR, COUNT(*)
FROM EMP2
GROUP BY MAJOR
ORDER BY COUNT(*) DESC;
 
문제124. 지역, 지역별 인원수를 출력하시오
 
 
SELECT SUBSTR(ADDRESS,1,7), COUNT(*)
FROM EMP2
GROUP BY SUBSTR(ADDRESS,1,7)
ORDER BY COUNT(*) DESC;
 
 
*avg 함수
: 평균값을 출력하는 함수
문제125. 사원 테이블에 월급을 평균내시오
 
select avg(sal)
  from emp
 ;
 
 
문제126. 우리반 평균나이를 구하세요
 
select avg(age)
  from emp2;
 
문제127. 통신사 , 통신사별 평균나이를 구하시오
 
SELECT telecom, AVG(age)
FROM EMP2
GROUP BY telecom;
 
문제128. (점심시간 문제)
 
이메일 도메인 , 이메일 도메인 인우너수를 출력하느데
이메일 도메인별 인원수가 높은것 부터 출력하고
컬럼명을 아래 같이 이메일 도메인 , 인원수로 출력되게 하시오
 
SELECT  substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1) AS "이메일 도메인" , count(*) as "인원수"
from emp2
group by substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1);
 
문제129. 커미션의 평균값을 출력하시오
 
select avg(comm)
from emp;
 
※그룹함수는 null 값을 무시하기 때문에 comm 다해서 4 나눈값이다.
 
문제130. 위의 결과를 다시 출력하는데 전체 사원수로 나눠지게 하려면 어떻게
해야하는가.
 
select avg(nvl(comm,0) )
   from emp;
 
5.2 그룹함수에서 null값의 의미
 
" group 함수는 null 값을 무시한다."
예제1: 값이 달라지는 경우
 
select avg(comm) from emp;
select avg(nvl(comm,0)) from emp;
 
 
예제2:
 
select sum(comm) form emp;
select sum(nvl(comm,0)) from emp;
결과는 같으나 어떤 SQL 성능이 좋을까?
값을 무시하지 않고 0으로 바꿔서 연산하는 밑에 연산이 비효율적이다.
 
    • group 함수의 특징 2가지
      1. group 함수는 null값을 무시한다.
      2. group 함수는 결과를 항상 출력한다.

문제131. 이름과 월급과 직업을 출력하는데 월급이 높은 사원부터 출력하시오
select ename, sal, job
from emp
order by sal desc;
 
문제132. 월급을 출력하는데 decode 이용해서 직어빙 president null 나오게 하고  다른 직업이면 월급이 출력되게 하시오
 
select decode( job, 'PRESIDENT', ''
,sal)
from emp;
 

그런데 !!
 

 
 
SELECT MAX(decode(job,'PRESIDENT', NULL,sal))
      1           2                  3        4
from emp;
decode 문에서 세번째 인자값의 데이터 유형에 네이번째 인자값의 데이터 유형이 결정된다.
 
null 데이터 유형이 문자형이다.
 
select to_char(sal)
from emp;
 
문자로 하면 9 큰값이기 때문에

 
SELECT MAX(decode(job,'PRESIDENT', 0,sal))
 
from emp;
으로 쓰는게 좋아용
 
*sum 함수
: 값을 더하는 함수
문제 133. 우리반의 나이를 더하면 얼마인가?
 
select sum(age)
  from emp2;
 
 
문제134. 직업, 직업별 토탈 월급을 출력하시오
 
select job, sum(sal)
 from emp
group by job;
 
문제135. 직업과 직업별 토탈월급을 출력하는데 SALESMAN 제외하고 출력하시오
4 select job, sum(sal)
1 from emp
2 where job <> 'SALESMAN'
3 group by job;
 
문제 135. 결과를 출력하는데 직업별 토탈월급이 6000 이상인것만 나오게 하시오
 
 
Group 함수로 조건을 사용하는 절은 where 절이 아니라 having 절을 사용해야 한다.
 
5  select job, sum(sal)
1 from emp
2 where  job <> 'SALESMAN'
3 group by job
4 HAVING SUM(sal) >= 6000;
이렇게 하세요
having 절은 group by 다음에 나와야 해요
 
 
 
select 문의 6가지절
 
5 select        --- 컬럼명
1  from        --- 테이블명
2  where      --- 검색조건
3 group by   --- grouping 컬럼
4 having       --- group 함수로 조건을
5 order by   ---- 데이터를 정렬하는
 
문제137. 통신사, 통신사별 인원수를 출력하는데
통신사가 sk 제외하고 출력하고
통신사별 인원수가 6명이상인 것만 출력하시오
 
 
 
데이터 게시판 : 6 범죄원인
 
 
문제138. 범죄유형에는 무엇이 있는지 조회하시오 !
(중복제거해서 표기하시오 )
SELECT DISTINCT crime_type
  FROM crime_cause2;
 
문제139. 범죄 원인은 무엇이 있는지 조회하시오 .
SELECT distinct term  FROM crime_cause2;
 
 
 
문제140. 범죄유형, 범죄유형별 건수를 출력하시오!
 
SELECT crime_type, SUM(cnt)
  from crime_cause2
  GROUP BY crime_type;
 
 
문제141. 위결과에서 건수 합계가 높은것 부터출력
SELECT crime_type, SUM(cnt)
  from crime_cause2
  GROUP BY crime_type
  ORDER BY SUM(cnt) desc;
 
문제142. 위의 결과에서 단위가 1000단위가 표시되게 하시오
 
SELECT crime_type, TO_CHAR(SUM(cnt),'999,999')
  from crime_cause2
  GROUP BY crime_type
  ORDER BY SUM(cnt) desc;
 
 
5.4 그룹함수를 중첩하는 방법
문제143. 직업, 직업별 토탈월급을 출력하시오 !
select job, sum(sal)
  from emp
 group by job;
 
문제144. 위의 결과중에 최대 값을 출력하시오.
  select MAX(sum(sal))
  from emp
 group by job;
 
문제145. 통신사중 가장 많은 인원수인 통신사의 인원수가 몇명인지 출력하라
 
 
 SELECT MAX(COUNT(*))
 FROM EMP2
 GROUP BY telecom;
 
 
 
문제146. 직업, 직업별 토탈월급을 출력하는데 직업이 SALESMAN은 제외하고
출력하고 직업별 토탈 월급이 4000이상인 것만 출력하고
직업별 토탈 월급을 높은 부터 출력하는데
직업별 토탈월급에 천단위를 부여하라.
 
 
 SELECT job, TO_CHAR(SUM(sal),'999,999')
   FROM EMP
  WHERE job <> 'SALESMAN'
  GROUP BY job
  HAVING SUM(sal) >= 4000
  ORDER BY SUM(sal) DESC;
 
 
 
 
 
 SELECT job, TO_CHAR(SUM(sal),'999,999')
   FROM EMP
 
  GROUP BY job
  HAVING SUM(sal) >= 5000 AND job <> 'SALESMAN'
  ORDER BY SUM(sal) DESC;
성능이 좋지 않음 SQL 인덱스를 사용하지 못함
 
 
 SELECT job, TO_CHAR(SUM(sal),'999,999') aaa
   FROM EMP
 
  GROUP BY job
  HAVING SUM(sal) >= 5000 AND job <> 'SALESMAN'
  ORDER BY aaa DESC;
해도 문자 순으로 구별하는게 아니라 숫자로 정렬해줌
 
문제 147. 직업, 직업별  부서번호별 토탈 월급을 출력하시오
select job,deptno, sum(sal)
  from emp
 group by job;
 
문제148. 통신사별 , 전공별, 인원수를 출력하시오!
  select telecom, major, count(*)
 from emp2
group by telecom, major
ORDER BY telecom , major;
 
 
 
결과를 가로로 출력하는 방법
 
문제 149. 부서번호, 부서번호별 토탈월급을 출력하시오
  select deptno, sum(sal)
  from emp
 group by deptno;
 

 이거를
 
-가로 :
 
10
20
30      
8750
10875
9400
가로로 나오게 케로로하라
 
 
힌트
 
 select ( decode(dettno, 10,sal ,0) as "10"
 from emp;
 
 
 
 
 
정답:
 
 select SUM(decode(deptno, 10,sal ,0)) AS "10",
                 SUM(decode(deptno, 20,sal ,0)) AS "20",
                 SUM(decode(deptno, 30,sal ,0)) AS "30"
   from emp;
 
 

 
 
 
삼성 sql 악성 SQL입니당!
 
 
문제150 통신사, 통신사별 인원수를 세로, 가로로 출력하시오
-세로
 
 SELECT telecom, COUNT(*)
 FroM EMP2
 GROUP BY telecom;
 
 
 
-가로
(카운트는 Null 무시함)
SELECT COUNT(DECODE(telecom, 'sk',telecom,null)) AS "sk",
         COUNT(DECODE(telecom, 'lg',telecom,null)) AS "lg",
             COUNT(DECODE(telecom, 'kt',telecom,null)) AS "kt"
                 
 from EMP2;
 
 
 SELECT sum(DECODE(telecom, 'sk',1,0)) AS "sk",
         sum(DECODE(telecom, 'lg',1,0)) AS "lg",
              sum(DECODE(telecom, 'kt',1,0)) AS "kt"
                 
 from EMP2;
 
 
 SELECT sum(DECODE(telecom, 'sk',1,null)) AS "sk",
         sum(DECODE(telecom, 'lg',1,null)) AS "lg",
              sum(DECODE(telecom, 'kt',1,null)) AS "kt"
                 
 from EMP2;
 
널로 바꾸면 빨라짐
 
 
 
 
문제151. 나이 , 나이별 인원수를 출력하는데 세로, 가로로 출력하시오
-세로
 SELECT age, COUNT(*)
   FROM EMP2
  GROUP BY age
  ORDER BY age desc;
 
 
 
-가로
  SELECT SUM(DECODE(age,24,1,null)) AS "24",
   SUM(DECODE(age,25,1,null)) AS "25",
   SUM(DECODE(age,26,1,null)) AS "26",
   SUM(DECODE(age,27,1,null)) AS "27",
   SUM(DECODE(age,28,1,null)) AS "28",
   SUM(DECODE(age,29,1,null)) AS "29",
   SUM(DECODE(age,30,1,null)) AS "30",
   SUM(DECODE(age,31,1,null)) AS "31",
   SUM(DECODE(age,33,1,null)) AS "33",
   SUM(DECODE(age,35,1,null)) AS "35"
  FROM EMP2;
 
 
문제152. 위의 결과에서 전공도 같이 출력하시오!
  SELECT major, SUM(DECODE(age,24,1,null)) AS "24",
   SUM(DECODE(age,25,1,null)) AS "25",
   SUM(DECODE(age,26,1,null)) AS "26",
   SUM(DECODE(age,27,1,null)) AS "27",
   SUM(DECODE(age,28,1,null)) AS "28",
   SUM(DECODE(age,29,1,null)) AS "29",
   SUM(DECODE(age,30,1,null)) AS "30",
   SUM(DECODE(age,31,1,null)) AS "31",
   SUM(DECODE(age,33,1,null)) AS "33",
   SUM(DECODE(age,35,1,null)) AS "35"
  FROM EMP2
group by major;
 
 
문제153. (오늘의 마지막 문제!)메일 도메인 , 전공별 인원수를 출력하시오
가로로 이쁘게
SELECT  substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1) AS "이메일 도메인" , 
SUM(DECODE(major,'산업경영공학',1,null)) AS "산업경영공학",
SUM(DECODE(major,'미술경영학',1,null)) AS "미술경영학",
SUM(DECODE(major,'경영정보학',1,null)) AS "경영정보학",
SUM(DECODE(major,'신문방송학',1,null)) AS "신문방송학",
SUM(DECODE(major,'정보통신공학',1,null)) AS "정보통신공학",
SUM(DECODE(major,'경영학',1,null)) AS "경영학",
SUM(DECODE(major,'컴퓨터공학',1,null)) AS "컴퓨터공학",
SUM(DECODE(major,'응용수학',1,null)) AS "응용수학",
SUM(DECODE(major,'관광학',1,null)) AS "관광학",
SUM(DECODE(major,'행정학',1,null)) AS "행정학",
SUM(DECODE(major,'경제학',1,null)) AS "경제학",
SUM(DECODE(major,'산업심리학',1,null)) AS "산업심리학",
SUM(DECODE(major,'전자공학',1,null)) AS "전자공학",
SUM(DECODE(major,'글로벌금융학',1,null)) AS "글로벌금융학",
SUM(DECODE(major,'통계학',1,null)) AS "통계학",
SUM(DECODE(major,'정보통계학',1,null)) AS "정보통계학",
SUM(DECODE(major,'물리학',1,null)) AS "물리학",

from emp2
group by substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1);
 
은총이문제 학과별 이메일 도메인(갯수) 나타내어라
컴퓨터공학과
 naver(3), gmail(1)
응용수학
gmail(1)
 
 
select major , substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1)
from emp2
group major;
 

딥러닝 5장 .

딥러닝2017. 7. 26. 10:52
NCS 시험문제 2번

import numpy as np

x = np.random.rand(100, 784)

def softmax(x):
    if x.ndim == 2:
        x = x.T
        print(np.max(x,axis=0))
        x = x - np.max(x, axis=0)


    return x.T


x2 = softmax(x)
print(x2.shape)

print(sum(x[0]))
print(sum(x2[0]))





■ 4장. 신경망 학습

* 4장 목차

   1. 신경망의 학습이 무엇인지?
   2. 비용함수(손실함수) 2가지
      -평균 제곱 오차
      - 교차 엔트로피 오차
   3. 미니 배치 학습
   4. 수치 미분
   5. 편미분
   6. 기울기
   7. 경사하강법
   8. 신경망에서의 기울기
   9. 학습 신경망 구현하기



■ 4. 수치미분

진정한 미분은 컴퓨터로 구현하기 어렵기 때문에
중앙 차분 오차가 발생하지만 컴퓨터로 미분을 구현하기 위해서
수치미분을 사용해야한다.



p 123(수치 미분 공식)

   f(x+h) - f(x-h)
   ---------------
      2*h

h = 0.0001 ( 0을 4개)



문제 74. 아래의 함수를 미분해서 x = 3 에서의 미분계수를 구하시오 !

y = x^2 + 4^2


def samplefun1(x):
    return x **2 + 4**2

def numericalDiff(f,x):
    h = 0.0001
    return(f(x+h) - f(x-h)) / (2*h)

print (numericalDiff(samplefun1, 3) )

결과 :

6.00000000000378

■ 미분한 함수를 x =4 로 했을때는

def samplefun1(x):
    return x **2 + 4**2

def numericalDiff(f,x):
    h = 0.0001
    return(f(x+h) - f(x-h)) / (2*h)

print (numericalDiff(samplefun1, 4) )

결과 :

7.999999999999119
---------------------------
중앙 차분 오차 ---> 진정한 미분이 아니라 수치미분이기 때문에
            중앙 차분 오차가 발생하고 있다.



문제 75. 아래의 함수를 시각화하시오 ! (matplotlib 사용)

x = np.arrange(0.0, 20.0, 0.1) #부터 20까지 0.1 간격의 배열 x 생성

y = x^2 + 4^2 <---- 이 함수를 시각화 하시오 !

import numpy as np
import matplotlib.pylab as plt

def samplefunc1(x):
    return x **2 + 4**2

x = np.arange(0.0, 20.0, 0.1)
y = samplefunc1(x)
plt.plot(x,y)
plt.show()




■ 5. 편미분

변수가 2개 이상인 함수를 미분할 때 미분 대상 변수 외에
나머지 변수를 상수처럼 고정시켜 미분하는것을 편미분이라고 한다.

f(x0,x1) = x0^2 + x1^2 의 그래프를 보면 아래와 같다.










문제 76. f(x0,x1) = x0^2 + x1^2 함수를 편미분하는데
   x0=3, x1=4 일때

         ∂ f
     ---------- = 2*x0 = 2*3 = 6
           ∂ x0



def samplefun3(x):
    return x**2 + 4**2

def numericalDiff(f,x):
    h = 0.0001
    return(f(x+h) - f(x-h)) / (2*h)

print( numericalDiff(samplefun3, 3) )

결과 :

6.00000000000378




문제 77. x0=3 이고 x1 =4 일때 아래의 함수를 아래와 같이 편미분하시오 !

f(x0, x1) = x0^2 + x1^2


        ∂ f
     ---------- 
       ∂ x1


import numpy as np
def func1(x):
    return np.square(x) + np.square(3)

def numberical_diff(f,x,h=1e-4):
    return (f(x+h) - f(x-h)) / (h*2)

print(numerical_diff(func1,4))



결과 :

8.0

문제 78. 아래의 함수를 x0 로 편미분 하시오!
(x0=3, x1=4)

f(x0,x1) = 2*x^2 + 3*x1^2

        ∂ f
     ---------- 
       ∂ x0



import numpy as np
def func1(x):
    return 2*np.square(x) + 3*np.square(4)

def numberical_diff(f,x,h=1e-4):
    return (f(x+h) - f(x-h)) / (h*2)

print(numerical_diff(func1,3))

결과 :

12.0




문제 79. 아래의 함수를 편미분하시오!
   (x0=6, x1=7)

   f(x0,x1) = 6*x0^2 + 2*x1^2

        ∂ f
     ---------- 
       ∂ x1



func = lambda x1 : 6*6**2 + 2*x1**2
print(numerical_diff(func, 7))

결과 :

27.999999999792635



문제 80. (점심시간 문제) for loop 문을 이용해서 아래의 함수를 x0 로
편미분하고 x1 로 편미분이 각각 수행되게 하시오 !
(x=0.6, x1=7)

f(x,x1) = 6*x0^2 + 2*x1^2

                   ∂ f
   1.      ---------- 
                  ∂ x1

           ∂ f
   2.     ---------- 
          ∂ x0

코드 :

func = {}
func[0] = lambda x0:6*x0**2
func[1] = lambda x1:2*x1**2
value = [6,7]
for idx,value in enumerate(value):
    print(numerical_diff(func[idx],value))


결과 :

71.9999999998322
27.999999999934744

■ 기울기

앞에서는 x0 와 x1 편미분을 변수별로 따로따로 계산을 했다.
그럼 x0 와 x1의 편미분을 동시에 계산을 하고 싶다면
어떻게 해야할까?

모든 변수의 편미분을 벡터 정리한것을 기울기 (gradient) 라고 한다.
그럼 x0와 x1의 편미분을 동시에 계산을 하고 싶다면 어떻게 해야할까? 
가령 x0 = 3, x1 = 4 일때 (x0, x1) 양쪽의 편미분을 묶어서 

f(x0,x1) = x0^2 + x1^2

   ∂f  ∂f
( ---, --- ) = (6, 8)
  ∂x0  ∂x1

모든 변수의 편미분을 벡터 정리한것을 기울기(gradient)라고 한다. 


문제81. 위의 편미분을 벡터로 나타내는것을 파이썬으로 구현하시오 




def _numerical_gradient_no_batch(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # x와 형상이 같은 배열을 생성

    for idx in range(x.size):
        tmp_val = x[idx]

        # f(x+h) 계산
        x[idx] = float(tmp_val) + h
        fxh1 = f(x)

        # f(x-h) 계산
        x[idx] = tmp_val - h
        fxh2 = f(x)

        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val # 값 복원

    return grad

def samplefunc4(x):
     return x[0] **2 + x[1] ** 2



print(_numerical_gradient_no_batch(samplefunc4, np.array(3.0,4.0)))

x = np.array([3.0, 4.0])
grad = np.zeros_like(x)

print(grad.shape) 

문제83. x0= 0.0 x1 =2.0 일때의 기울기 벡터를 구하시오  !


문제84. x0=3.0 , x1=0.0 일대의 기울기 벡터를 구하시오















■ 경사 감소법 (p129)

딥러닝은 경사감소법으로 싲가해서 경사감소법으로 끝난다 해도 과언이 아니다
지난번 배운 선형회귀를 복습해보면 y = ax + b 의 직선식을 구하는게 선형회귀의 목표였다. 그런데 딥러닝에서는 
위의 식을 y = W1 * x + B 로 나타낼 수 있다. 

잔차 오차 에러를 우리는 cost라고 할 것이다. 틀리면 틀릴수록 손해를 보는 비용이 많이 든다는 얘기

y = W*x + B에서 w와 b의 값ㅇ르 계속 튜닝해 나갈 것이다

그러면 이 값을 어떻게 업데이트 해 나갈것이냐?

cost = ∑ 1/2 * ( y - y` ) ^2
               실제값 - 예상값 


제곱을 쓰는 이유는 음수가 있을 수 있기 때문이고 

음수가 안나오게 하면서 차이에 대해 제곱을 하면 

패널티를 더 크게 해줄 수 있다. 

y = W*x + B 
y 의 B절편은 축으로 두고 직선을 돌리면서 점점데이터에 맞느 ㄴ직선을 알아내 간다고 보면 COST에 대해서는 
2차 함수가 그려지게된다. 




오차를 알고 있으니까 W(기울기) 값을 변화시켜 위의 그래프를 그린게 COST함수 그래프이다
깅루기가 점점작아질수록COST도 점점작아진다

대신 COST 가 0 은 안된다 .왜냐면 데이터가 완전한 직서에 있기는 불가능하기 때문이다.데이터들은 
어떻게든 랜덤함 특성이 있기 때문에 0 이되긴 어렵다 만약 0 이 된다면 굳이 

LINE FITTING을 할 필요가 없다 우리가 찾아야할것은 COST가 가장 작은 W의 값이 얼마냐 인것을 찾는것이다.

COST를 분석해서 W의 지점을 알아야 하는게 이것을 찾는 가장 쉬운 방법이있다. 바로 COST를 미분했을때 0 
이되는 그 지점이 최솟점이 된다. 거기에 W를 읽어오면 된다.

 df
-----  이게 0 인 점을 찾아가는 것이다.
 d w1
그런데 한번에 익밧을 알아내기는 힘들다

그래서 추정값을 찾아서 계속 근사값을 찾아가는데 경사 감소법이다. 

w1 이 3에서 기울기가 5가 나왔다면 3-5 = -2 쪽으로 갑니다. 


y = W1 * x1 +  W2 * x2 + W3 * x3
집값     평수       학군      편의시설

w1 = w1 - ? * ∂f/∂w1
w2 = w2 - ? * ∂f/∂w2

? : 러닝 레이트 (학습률)
왜 러닝 레이트가 필요한가 ? 미분한 기울기 값이 너무 크면 발산해버리기 때문에 cost를 
0 으로 수렴시키기 위해서 필요하다. 

너무 크면 발산하고 
너무 작으면 학습이 안된다. 


안장점이나 극소값이 최소 값인줄알고 정체기에 빠진다느 말이 무엇인가. 




책 p130 페이지 안장점과 극솟값이 최솟값인줄 알고 정체기에 빠진다는것은 ?







문제85. 경사 감소 함수를 파이썬으로 구현하시오 ! 
(비용함수를 미분해서 기울기가 0에 가까워지는 그 지점의 기울기를 구한다 )
def gradient_descent(f, init_x, lr = 0.01, step_num = 100):
     x = init_x
 
     for i in range(step_num):
          grad = numerical_gradient(f, x)
          x -= lr * grad
     return x  


import numpy as np

def numerical_gradient(f, x):  # x의 모습[3.0, 4.0]
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # x와 형상이 같은 배열을 생성

    for idx in range(x.size): # x.size에 2가 들어가니까 0,1fh loop 돈다.
        tmp_val = x[idx]

        # f(x+h) 계산
        x[idx] = float(tmp_val) + h #x의 모습[3.00001, 4.0]

        fxh1 = f(x)

        # f(x-h) 계산 25.00060001
        x[idx] = tmp_val - h #[2.9999,4.0]
        fxh2 = f(x)
        #print(fxh1) #25.00060001
        #print(fxh2) #24.99940001
        grad[idx] = (fxh1 - fxh2) / (2*h)
        #print('ekq')
        #print((fxh1 - fxh2) / (2*h))
        x[idx] = tmp_val # 값 복원

    return grad
def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x = init_x

    for i in range(step_num):
        grad = numerical_gradient(f, x)
        x -= lr * grad
    return x
def function_2(x):
    return x[0]**2 + x[1]**2
def samplefunc4(x):
    return x[0] **2 + x[1] ** 2
init_x = np.array([2.0,4.0])
print( gradient_descent(function_2, init_x, lr=0.1, step_num=10))

print(numerical_gradient(samplefunc4, np.array([3.0, 4.0])))
print(numerical_gradient(samplefunc4, np.array([0.0, 2.0])))
print(numerical_gradient(samplefunc4, np.array([3.0, 0.0])))
print(numerical_gradient(samplefunc4, np.array([1.0, 0.0])))


[  4.07407195e-10   8.14814391e-10]

거의 (0 , 0 )에 가까운 결과가 출력되었다.

문제86. 위의 식을 글대로 사용해서 테스트를 수행하는데 학습률이 너무 크면 (10)면 발산하고 
학습률이 작으면(1e-10)으면 수렴을 못한다는 것을 테스트 하시오 ! 



문제87. 러닝 레이트를 1e-10으로 했을때 기울기가 0 으로 수렴하려면 
step_num을 몇으로 줘야하나? 




* 4장 목차

   1. 신경망의 학습이 무엇인지?
   2. 비용함수(손실함수) 2가지
      -평균 제곱 오차
      - 교차 엔트로피 오차
   3. 미니 배치 학습
   4. 수치 미분
   5. 편미분
   6. 기울기
   7. 경사하강법
   8. 신경망에서의 기울기
   9. 학습 신경망 구현하기
■ 4.8. 신경망에서의 기울기 (p 133) 

어제 경사감소법에서 구했떤 기울기는? 

f(x0, x1) = x0^2 + x1^2

x0 =3 , x1 = 4 일때 각각 x0와 x1로 편미분한 결과 기울기를 벡터로 
(6,8)로 구현한 기울기 였고 .

신경망에서의 기울기를 구한다는것은?
      w11  w21  w31 
w = (               )
      w12  w22  w32

비용함수의 기울기를 구하기 위해서 비요함수를 수치미분했다.

∂ 비용함수(L)
------------ = ( 
    ∂ w 

문제88. p134를 코딩해보자

문제89. 문제88번에서 만든 신경망에 입력값 [0.6, 0.9] 을 입력하고 
target은 [0,0,1]로 해서 즉 정답 레이블이 2번이다 라고 가정하고서 
오차 [에러] 가 얼마나 발생하는지 확인하시오 




문제90. 어제 만든 수치미분함수에 위에서 만든 신경망 비용함수와 가중치(2x3)의 가중치를 입력해서 기울기를 구하시오(2x3)

def f(W):
     return net.loss(x,t)

dw = numerical_gradient(f, net.W)

■ 기울기를 구한 이유? 
     손실(비용) 함수의 값을 가장 작게하는 방향을 제시하게끔 
     가중치를 갱신할대 필요한 값이기 때문에 기울기를 구해야한다. 

     
  • 경사하강법
  1. 확률적 경사 하강법 : 훈련 데이터에서 하나씩 데이터를 선택해 가중치를 갱신하는 방법
               
               단점 : 하나의 데이터 마다 오차를 계산해서 신경망의 가중치를 
                    조절하기 대문에 가중치 조절은 빠르나 학습 데이터마다 
                    가중치가 갱신됨으로써 성느잉 들숙날쑥하다
          
  1. 배치법  : 모든 데이터를 학습하고 오차를 이용하여 가중치를 갱신하는 방법
              
               단점: global mininum(최소값) 이 아닌 local mininum(극소값)에 수렴할 수도 있다. 
               최소값? -> 우리가 수렴해야할 값 
               극소값  -> 오해할수 있는 수렴점 (안장점 같은곳) 

  1. 미니 배치법 : 위 두개의 단점을 보완한 방법

               훈련데이터에서 소량의 데이터를 적당히 선택해 가중치를 갱신하는 방법

               " 위의 두가지 경사 하강법의 단점을 보완하면서 또한 
                GPU기반의 병렬처리가 가능하다. "

■ 학습 알고리즘 구현하기 (p136)

1단계 - 미니배치               : 데이터를 미니배치로 무작위(랜덤 사용)로 선정한다.=확률적 경사 하강법 이라고 한다. 
2단계 - 기울기 산출
3단계 - 매개변수 갱신
4단계 - 1단계 ~ 3단계 반복


■ 2층 신경망 구현하기

단층      입력층 ---> 출력층
다층      얕은 신경망 (2층) : 입력층 --> 은닉층 1개 --> 출력층
          심층 신경망(3층) : 입력층  ---> 은닉층 들 --> 출력층 

문제 93. 아래의 배열을 눈으로 확인하시오 !

import numpy as np

b1 = np.zeros(50)

print(b1)

결과:

[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

문제 94. 아래의 x(입력값), t(target 값) y(예상값) 을 아래와 같이 설정하고
   위에서 만든 2층 신경망을 객체화 해서 W1,W2,B1,B2의 차원이 어떻게
   되는지 프린트하시오 !

net = TwoLayerNet(input_size=784, hidden_size=100, ouput_size=10)
x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)

===================================================================================

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.functions import *
from common.gradient import numerical_gradient

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']

        a1 = np.dot(x, W1) + b1  # 100 x 784 * 784 * 50 + 50 = 100 x 50
        z1 = sigmoid(a1) # 100 x 50
        a2 = np.dot(z1, W2) + b2 # 100 x 50 * 50 x 10 + 10 = 100 x 10
        y = softmax(a2) # 100 x 10

        return y


    def loss(self, x,t):
        y = self.predict(x)

        return cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self,x,t):
        loss_W = lambda W: self.loss(x,t)

        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1']) # 784 x 50 기울기
        grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 50개의 bias
        grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 50 x 10 기울기
        grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 10개의 bias

        return grads

net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)
x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)


print(net.params['W1'].shape) #(784, 100)
print(net.params['W2'].shape) #(100, 10)
print(net.params['b1'].shape) #(100,)
print(net.params['b2'].shape) #(10,)

결과 :

(784, 100)
(100, 10)
(100,)
(10,)

문제 95. 아래의 x(입력값), t(target 값) y(예상값) 을 아래와 같이 설정하고
   위에서 만든 2층 신경망을 객체화 해서 W1,W2,B1,B2의 기울기의 차원이 어떻게
   되는지 프린트하시오 !

net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)

x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)



# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.functions import *
from common.gradient import numerical_gradient

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']

        a1 = np.dot(x, W1) + b1  # 100 x 784 * 784 * 50 + 50 = 100 x 50
        z1 = sigmoid(a1) # 100 x 50
        a2 = np.dot(z1, W2) + b2 # 100 x 50 * 50 x 10 + 10 = 100 x 10
        y = softmax(a2) # 100 x 10

        return y


    def loss(self, x,t):
        y = self.predict(x)

        return cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self,x,t):
        loss_W = lambda W: self.loss(x,t)

        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1']) # 784 x 50 기울기
        grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 50개의 bias
        grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 50 x 10 기울기
        grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 10개의 bias

        return grads

net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)

x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)


#print(net.params['W1'].shape) #(784, 100)
#print(net.params['W2'].shape) #(100, 10)
#print(net.params['b1'].shape) #(100,)
#print(net.params['b2'].shape) #(10,)


print(net.params['W1'].shape)
grads=net.numerical_gradient(x,t)
print(grads['W1'].shape)
print(grads['W2'].shape)
print(grads['b1'].shape)
print(grads['b2'].shape)





■ 미니배치 학습 구현하기 (pg 141)


문제96. 10000번 돌때 마다 정확도가 조금씩 오라가는지 
아래와 같이 출력되게 코드를 수정하시오 

train acc, test acc | 0.112366666667, 0.1135
train acc, test acc | 0.708783333333, 0.7126
train acc, test acc | 0.8502, 0.8537
train acc, test acc | 0.884533333333, 0.8878
train acc, test acc | 0.898816666667, 0.9018
train acc, test acc | 0.906716666667, 0.9098
train acc, test acc | 0.9126, 0.9149
train acc, test acc | 0.917033333333, 0.9196
train acc, test acc | 0.919666666667, 0.9223
train acc, test acc | 0.924016666667, 0.9261
train acc, test acc | 0.9276, 0.9285
train acc, test acc | 0.930216666667, 0.9315
train acc, test acc | 0.932316666667, 0.9325
train acc, test acc | 0.935583333333, 0.9346
train acc, test acc | 0.936483333333, 0.9363
train acc, test acc | 0.9393, 0.9383
train acc, test acc | 0.94075, 0.9402




# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

# 데이터 읽기
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)

network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)

# 하이퍼파라미터
iters_num = 10000  # 반복 횟수를 적절히 설정한다.
train_size = x_train.shape[0]
batch_size = 100  # 미니배치 크기
learning_rate = 0.1

train_loss_list = []
train_acc_list = []
test_acc_list = []

# 1에폭당 반복 수
iter_per_epoch = max(train_size / batch_size, 1)

for i in range(iters_num):
    # 미니배치 획득
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]

    # 기울기 계산
    #grad = network.numerical_gradient(x_batch, t_batch)
    grad = network.gradient(x_batch, t_batch)

    # 매개변수 갱신
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]

    # 학습 경과 기록
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

    # 1에폭당 정확도 계산
    if i % iter_per_epoch == 0:
        train_acc = network.accuracy(x_train, t_train)
        test_acc = network.accuracy(x_test, t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))

# 그래프 그리기
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()

문제97. (오늘의 마지막 문제) numerical_gradient 함수 말고 5장에서 배울 오차 역전파로 (gradient)함수를 사용해서
정확도를 계산하게 코드를 수정하시오 














 







 





























 


'딥러닝' 카테고리의 다른 글

딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26

  • 4장 목차
  1. 신경망의 학습이 무엇인가?
  2. 비용함수(손실함수) 2가지
     - 평균 제곱 오차
     - 교차 엔트로피 오차
  1. 미니 배치 학습
  2. 수치 미분
  3. 편미분
  4. 기울기
  5. 경사하강법
  6. 신경망에서의 기울기
  7. 학습 신경망 구현하기 
■ 1. 신경망의 학습이 무엇인지? 

- 학습이란 ? 신경망에서 우너하는 결과를 얻기 위해 뉴런 사이의 적당한 가중치를 알아내는것을 말한다.
          즉, 가중치를 최적화 하는 것이다. 
     - 퍼셉트론에서는 가중치 매개변수를 사람이 수작업으로 설정했다.
          왜냐면 매개변수가 겨울 3개였기 때문이다. 
     예 : and 연산의 가중치 : 0.5 , 0.5  세타 : 0.7
           or 연산의 가중치 : 0.5 , 0.5  세타 : 0.7
     
     그러나 신경망에서는 매개변수가 몇개가 될까

     어제 구현한 mnist의 가중치도 은닉층 1만 50개, 은닉층 2가 100개 였다. 
     층이 더 깊어지면 수억에 이를 수도 있기 때문에
     
     사람이 일일이 수작업을 할 수가 없다. 
     이미지(필기체) 숫자 5를 기계가 인식하게 하는 방법 3가지 ? (p110)

1.5 ----------- 사람이 생각한 알고리즘 ------------> 결과
2.5 ----------- 사람이 생각한 특징   -- 기계학습 ---> 결과
               (sift, hog 등)       (svm, knn)
3.5 ----------- 신경망(딥러닝) -------------------> 결과

딥러닝을 종단간 기계학습(end-to-end 머신러닝) 이라고 한다 .
                         ↓
                         이미지, 영상을 던져주고 알아서 분석

■ 훈련데이터와 시험 데이터 
학습(훈련) 데이터에 너무 지나치게 맞추다 보면 일빈화 성능이 떨어지는 것을 과적합이라고 한ㄷㅏ.



  1. 평균 제곱 오차

import numpy as np

def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)
t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.1, 0.0, 0.0]
print(np.shape(t))
print(np.shape(y))
print(mean_squared_error(np.array(y),np.array(t)))

y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.6, 0.0, 0.0]
print(mean_squared_error(np.array(y),np.array(t)))
결과 :
0.0975
0.2725

  1. 교차 엔트로피 

import numpy as np
def cross_entropy_error(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.1, 0.0, 0.0]
print(cross_entropy_error(np.array(y),np.array(t)))
y = [0.1, 0.05, 0.1 ,0.0, 0.05, 0.1 , 0.0 , 0.6, 0.0, 0.0]
print(cross_entropy_error(np.array(y),np.array(t)))
결과 :
0.510825457099
2.30258409299

설명 : 정답 레이블과의 오차가 mse 보다 훨씬 더 큰 것으로 확인이 되고 잇ㄷ.

문제67. (점심시간문제) 아래의 넘파이 배열(확률)을 교차 엔트로피 오차 함수를 이용해서 
     오차율이 어떻게 되는지 for loop 문을 사용해서 한번에 알아내시오 !



t = [0,0,1,0,0,0,0,0,0,0]    # 숫자2

y1 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  
y2 = [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0] 
y3 = [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0] 
y4 = [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0] 
y5 = [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0] 
y6 = [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0] 
y7 = [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0] 
y8 = [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0] 
y9 = [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0]


정리 :
1.one-hot-encoding = False
  입력값 ----> 신경망 ----> 출력값 (숫자) ---> 라벨 비교 ---> 정확도
                                             
                                             숫자가 맞냐 안맞냐  
2.one-hot-encoding =True
  입력값 ----> 신경망 ----> 소프트맥스 함수 ---> 출력값(확률) ---> 비용함수 
                                                              ↓
                                                             오차 
                                                            0.23, 0.59
 
정확도를 올리거나 오차를 낮추거나 해야해요 

정확도보다 오차를 보는게 더 유용한 이유 . 

정확도는 23 24이렇게 생겼는데

오차는 0.2424, .54

매개변수값에 예민한것 => 비용함수의 값


0.23.
0.21 
0.19
비용함수에 넣고 오차를 구하는것이 더 학습에 유리하다 . 

매개변수에 더 잘 반응 함 . 

□ 4.3 미니 배치 학습

미니배치 학습이란 훈련 데이터로 부터 일부만 골라서 학습을 수행하는 방식이다.

앞에서 손실함수를 배웠는데 손실함수가 필요한 이유는 
예상값과 실제값을 오차를 계산해서 오차를 줄이는 방향으로 
가중치를 조정하려고 필요했다. 

지금까지는 딱 하나의 데이터만 가지고 손실함수 계산을 한 것이었다. 

t = [0,0,1,0,0,0,0,0,0,0]    # 숫자2

y1 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  

mnist 데이터만 해도 훈련데이터가 6만장인데 ---> 비용함수 
                                     계산

한장씩 입력하면 계산을 6만번을 해야하기 때문에 여러장을 모아서 입력하고 계산을 한번만 하게 하자 
  
이것이 미니배치 학습입니다. 

훈련데이터 중 일부만 골라서 학습 하는 방법 : 표본을 뽑아서 학습 한다. 

표본을 뽑아서 학습 시키는 장점 :

한번에 넣어서 한번에 계산하게함 == 미니배치학습

mnist 데이터를 가지고 미니배치 학습을 시켜보자 


문제68
6만 미만의 숫자중에 무작위로 10만 출력하시오

print(np.random.choice(60000, 10))

문제69. mnnist 60000장의 훈련 데이터 중에 무작위로 10장을 골라

import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import pickle
# (p98) mmist 데이터셋을 읽어올 때 인터넷이 연결되어 있는 상태에서 가져와야하는데 이때 시간이 걸린다.
# 가져온 이미지를 로컬에 저장할 때 pickle 파일로 생성이 되고 로컬에 저장되어 있으면 순식간에 읽을 수 있기 때문에 임포트 해야함
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)

print(x_train.shape)
print(t_train.shape)

train_size = 60000
batch_size = 10
batch_mask == np.random.choice(   train_size ,  batch_size   )
x_batch = x_train[batch_mask]
t_batch = x_train[batch_mask]

print(len(x_batch)) # 10
print( x_batch.shape) 

문제70. 데이터 1개를 가지고 오차를 구하는 교차 엔트로피 오차 함수는 아래와 같이 만들었다.
     그렇다면 배치용 교차 엔트로피 오차는 어떻게 생성해야 하는가 ? 

import numpy as np

def corss_entropy_error(y, t):
     delta = 1e-7
     return -np.sum(t * np.log(y + delta))

답 : 

import numpy as np

def corss_entropy_error(y, t):
     delta = 1e-7
     return -np.sum(t * np.log(y + delta)) / len(y)

문제71. SK PT 64 페이지를 참고해서 교차 엔트로피 오차 사용 코드를 구현하시오 ! 
(mnist 데이터셋의 테스트 데이터를 가지고 구현) 














언제 몇시까지 ?

몇시까지 갈게영! 

되물어여! 

잘 못들었을때 한번더 ㅋ캐캐캐캨



정보조사

홈페이지 인재상 기업연역 
대표인사 ?


열정 리더쉬 키워드 ㅋㅋ

아이티는 앙데 

아이티는 사업영역
 아이티는 
내가 사용한적있는 제품? 

고객사? 

솔루션 제품 
솔루션 제품 의 기능 

블로그나 카페? 

최근 게시글 릭고가 여 ㅇ ㅋ


나에 맞추어서 질문 준비 

복장 






속도 =  거리 / 시간
df(x) / dx = 

속도는 거리를 시간으로 나눈것인데 순간 속도는 시간이 한없이 0 으로 가는 멈춰있는 그  특정 순간의 속도를 말한다.

고등학교 때 배운 미분을 컴퓨터 구현하면 문제가 생긴다. 왜냐면 시간이 0 은 아닌데 0 에 무한히 가까워지는 그 수식을 표현하려면 
0.00000000 .... 000001 로 표현해야 한다.

print( np.float32(1e-50))
결과 0.0

그래서 그냥 0.0001로 표현할 수 밖에 없다. 

 h 를 0으로 좁히는 게 불가능 하다 보니
  df(x)            f(x+h) - f(x)           f(x+h) - f(x-h)
--------- = limit --------------- = limit -------------------
   dx        h->0        h           h->0      2 * h
                         ↓                      ↓
                    진정한 미분식            근사로 구한 접선 (수치미분) 


 


문제72. 근사로 구한 미분 함수를 파이썬으로 구하시오 
       ( h - 0.0001 ) 함수 이름 : numerical_diff
      f(x+h) - f(x-h)
limit ----------------
 h->0       2 * h

답 : 

def numerical_diff(f,x):
     h = 0.0001
     return ( f(x+h) - f(x-h) / (2*h) 

문제73.  y= 0.01 * x^2 + 0.1 * x 함수를 미분하는데 x 가 10일때 미분 계수는 어떻게 되는가 ?

def func73(x):
    return 0.01 * x ** 2 + 0.1 * x

def numerical_diff(f,x):
     h = 0.0001
     return (f(x+h) - f(x-h)) / (2*h)
print(numerical_diff(func73,10))

0.2999999999986347
































'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26

■ 3장 목차
  1. 활성화 함수 (active function)
     - 계단함수 
     - 시그모이드 함수
     - Relu 함수
     
  1. 행렬의 내적 문제
  2. 신경망을 파이썬으로 구현 
  3. 손글씨 인식 신경망을 구현 (순전파)

■ 퍼셉트론과 신경망의 차이점? 

퍼셉트론? 원하는 결과를 출력하도록 가중치의 값을 적절히 정하는 작업을 
         사람이 수동으로 해야한다. 
 - 신경망? 가중치 매개변수의 적절한 값ㅇ르 기계가 데이터로 부터 자동으로 학습해서 알아냄

■ 편향을 명시한 퍼셉트론 (p65)

단층 퍼셉트론 : 계단 함수          (선형함수)  --->  0 또는 1 의 값을 출력

다층 퍼셉트론 : 시그모이드 or Relu  (비선형 함수) --> 0 ~ 1 사이의 실수 
                                                  예 : 0.731, 0.880




def step_function(x):
y = x > 0
return y.astype(np.int)

x_data = np.array([-1,0,1])

print(step_function(x_data))

문제36. 위의 step_function 함수를 이용해서 계단함수 그래프를 그리시오 

def step_function(x):
    y = x > 0
    return y.astype(np.int)
x = np.arange(-5.0,5.0,0.1)
y = step_function(x)
plt.plot(x,y)
plt.show()

문제37 위의 step_function 함수를 이용해서 계단함수 그래프를 반대로 그리시오 

def step_function(x):
    y = x > 0
    return -y.astype(np.int)
x = np.arange(-5.0,5.0,0.1)
y = step_function(x)
plt.plot(x,y)
plt.show()

문제38. (점심시간 문제 ) 


x0, x1, x2 = -100
w0, w1, w2 = .3.4.1
일 때 ㄱ

를 코드로 나타내 보아라 !

x = np.array([x0,x1,x2])
w = np.array([w0,w1,w2])
a = np.sum(x*w)
def step(x):
    y = x > 0
    return y.astype(np.int)

print(step(a))

■ 시그모이드 함수 
계단함수 (단층 퍼셉트론) vs 시그모이드 함수(다층 퍼셉트론) 

이 둘의 차이점과 공통점? 

     차이점 ? 계단함수는 숫자 1과 0만 출력한느데
             시그모이드 함수는 0과 1사이의 실수를 출력한다.

     f(가중의 합)  =  0.8834

     공통점 ? 둘다 0과 1사이의 데이터만 출력하는것이 공통점이다.
                              1  
     시그모이드 함수식 =   -------------
                         1 + exp(-x)
                              ↓
                              e(자연상수)^-x

     h(1,0) = 0.731 , h(2.0) = 0.880

문제39. 진짜로 시그 모이드 함수를 생성해보자

def sigmoid(x):
     return 1 / (1+np.exp(-x))

x = np.array([1.0,2.0])
print(sigmoid(x))

문제40. 시그모이드 함수를 그래프로 그리시오 !


def sigmoid(x):
     return 1 / (1+np.exp(-x))
x = np.arange(-8.0,8.0,0.1)
y = sigmoid(-x)

plt.plot(x,y)
plt.show()


문제41. 시그모이드 반대록 ㄱㄱ 
 

def sigmoid(x):
     return 1 / (1+np.exp(x))
x = np.arange(-8.0,8.0,0.1)
y = sigmoid(x)

plt.plot(x,y)
plt.show()



둘다 나타내봐라 계단이랑 시그모이드 

def sigmoid(x):
return 1 / (1 + np.exp(-x))

def sigmoid(x):
return 1/(1+np.exp(-x))

plt.figure(figsize=(6,4))
x1 = np.arange(-6.0,6.0,0.1)
y1 = step_function(x1)
plt.plot(x1,y1,linestyle='--')
y = sigmoid(x1)
plt.plot(x1, y)
plt.show()


■ ReLu 함수 (Rectified Linear Unit) 
              정류된

ReLu는 입력이 0을 넘으면 그 입력을 그대로 출력하고
0 이하이면 0을 출력하는 함수 
         x (x > 0) 
h(x) = [
         0 (x<= 0)

학습이 잘 되어서 현업에서 주로 사용하는 함수 

문제43. ReLu 함수를 생성하시오 !

def relu(x):
     return np.maximum(0,x)

print (relu(-2))

print (relu(0.3))

문제44.  Relu 함수를 그래프로 그리시오 

def relu(x): 
    return np.maximum(0, x)

x = np.arange(-15.0,15.0,0.1)
y= relu(x)
plt.figure(figsize=(10,10))
plt.plot(x,y)
plt.show()




 ■ 3.2 행렬의 내적 (p77 다차원 배열계산)

문제45. 아래의 행렬 곱 (행렬내적) 을 파이썬으로 구현하시오 ! 
  1  2  3       5  6
[         ] * [ 7  8 ] = ?
  4  5  6       9 10

     2 x 3  * 3 x 2 = 2 x 2



a=np.array([[1,2,3],[4,5,6]])
b=np.array([[5,6],[7,8],[9,10]])
print(np.dot(a,b))

[[ 46  52]
 [109 124]]

문제46. 아래의 행렬곱을 파이썬으로 구현하시오! 
  5  6       1
( 7  8 ) * (   ) = ?
  9  10      2


a=np.array([[5,6],[7,8],[9,10]])
b=np.array([[1],[2]])

print(np.dot(a,b))

[[17]
 [23]
 [29]]

■ 신경망 내적 
문제47. 아래 그림을 numpy 로 구현하시오 


x = np.array([1,2])
y = np.array([[1,3,5],[2,4,6]])
b = np.array([7,8,9])
print(np.dot(x,y)+b)

문제48. 위의 문제에서 구한 입력신호의 가중의 합인 y 값이 
       활성함수인 sigmoid 함수를 통과하면 어떤 값으로 출력되는지
       z 값을 확인하시오. 

x = np.array([1,2])
y = np.array([[1,3,5],[2,4,6]])
b = np.array([7,8,9])
print(np.dot(x,y)+b)

문제49. 아래의 신경망 그림을 파이썬으로 구현하시오 



import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.array([4.5, 6.2])

w = np.array([[0.1, 0.3], [0.2, 0.4]])
b = np.array([0.7, 0.8])

l1 = sigmoid(np.dot(x, w)+b)

w = np.array([[0.5, 0.7], [0.6, 0.8]])
l2 = sigmoid(np.dot(l1, w)+b)

w = np.array([[0.1, 0.3], [0.2, 0.4]])
l3 = np.dot(l1, w)+b

print(l3)

 [ 0.98967405  1.47095426]

■ 출력층에서 사용하는 활성화 함수

  1. 분류 : 소프트 맥스 함수 ( 0 ~ 1 사이의 숫자로 출력되는 함수 )
   1.2                       0.46
 [ 0.9 ] ---> 소프트맥스 --->[ 0.34 ]
   0.4                       0.20

p96. 
                      y0 = 0(확률 = 0.2 : 20%)
필기체 2 ---> 신경망    y1 = 1(확률 = 0.1 : 10%)
                      y2  =2(확률 = 0.46 : 46%)  
                         :
                      y9 = 9(확률 = 0.01 : 1 %)
                                                                  

  2.회귀 : 항등함수 ( 입력값을 그대로 출력하는 함수 ) 

문제50. 소프트맥스 함수를 파이썬으로 구현하시오 ! 
def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y


[ 0.01821127  0.24519181  0.73659691]  <- 확률 벡터


" 인공 신경망의 출력값으로 확률 벡터를 얻고 싶을때 사용한다."

문제51. 입력값을 그대로 출력하는 항등 함수를 파이썬으로 구현하시오 

def identity_function(x):
     return x

문제52. 책 88 페이지에 나오는 3층 신경망을 파이썬으로 구현하시오 !
     (오늘의 마지막 문제) 


import numpy as np

def sigmoid(x):
   return 1 / (1 + np.exp(-x))
x= np.array([1.0, .5])
W1 = np.array([[.1, .3, .5], [.2, .4, .6]])
W2 = np.array([[.1, .4],[.2, .5] ,[.3, .6]])
W3 = np.array([[.1, .3],[.2,.4]])
b1 = np.array([.1,.2,.3])
b2 = np.array([.1,.2])
b3= np.array([.1,.2])

l1 = sigmoid(np.dot(x,W1)+b1)
print(l1)

l2 = sigmoid(np.dot(l1,W2)+b2)
print(l2)

l3 = np.dot(l2,W3)+b3
print(l3)


test

import numpy as np
import matplotlib.pyplot as plt
# A = np.array([[1,1,-1],[4,0,2],[1,0,0]])
# B = np.array([[2,-1],[3,-2],[0,1]])
#
# print(np.dot(A,B))
#
# A = np.matrix([[1,1,-1],[4,0,2],[1,0,0]])
# B = np.matrix([[2,-1],[3,-2],[0,1]])
#
# print(A*B)

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

x0, x1, x2 = .2, .7, .9
w11, w12, w13 = 2, 4, 3
w21, w22, w23 = 2, 3, 5
w31, w32, w33 = 2, 4, 4
b1, b2, b3 = -3, 4, 9
x = np.array([x0,x1,x2])
w1 = np.array([[w11, w21, w31],[w12, w22, w32],[w13, w23, w33]])
b = np.array([b1,b2,b3])

result = softmax(np.dot(x,w1)+b)
print(result)
x = np.arange(-1.,1.,0.001)
plt.plot(x , result[1])
plt.show()






■ 3장 목차
  1. 활성화 함수 (active function)
     - 계단함수 
     - 시그모이드 함수
     - Relu 함수
     
  1. 행렬의 내적 문제
  2. 신경망을 파이썬으로 구현 
  3. 손글씨 인식 신경망을 구현 (순전파)

■ 출력층의 활성화 함수 2가지 ? 

  1. 분류 : 소프트 맥스 함수
 
     질문 예: 데이터가 어느 클래스에 속하는지 확인
          (사진속 인물의 성별 분류)  
  2.회귀 : 항등 함수

     질문 예 : 입력 데이터에서 연속적인 수치를 예측하는 문제
               ( 사진 속 인물의 몸무게를 예측하는 문제) 

 " 소프트 맥스 함수는 a의 원소의 대소 관계가 y의 원소의 
   대소 관계로 그대로 이어지기 때문에 출력이 가장 큰 뉴런의 위치는 변하지 않는다.
   결과적으로 지수 함수 계산에 드는 자원 낭비를 줄이고자 출력층의 소프트 맥스 함수는
   생략하는 것이 일반적이다. "

            학습 ----------------------> 추론(테스트) --> 해야할 진짜 일 
             ↓                              ↓
    소프트 맥스 함수 사용 o           소프트 맥스 함수 사용 x

■ 손글씨 숫자 인식 (p 96)

 - mnist ? 손글씨 숫자 이미지 집합 데이터 셋

  0 ~ 9 까지의 숫자 이미지로 구성되어있고
  훈련 이미지가 60000 장, 시험 이미지가 10000 장이 준비됨 


 - 28 x 28 크기의 회색조 이미지 (총 784개의 픽셀)

 - 각 픽셀은 0 ~ 255 까지의 값을 취한다. 숫자가 커질수록 픽셀이 진해짐
 - 각 이미지에는 숫자 7,2,1 과 같은 이미지가 레이블되어 있다. 


 
  

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
from mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

                    테스트데이터, 테스트데이터라벨
                        ↓        ↓
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
  ↑          ↑
 훈련 데이터, 훈련데이터 라벨

# 설명 : flatten = True 라는 것은 립력이미지를 평탄하게 1차원 배열로 변환하라
# normalize : 입력 이미지의 픽셀 값을 0 ~ 1 사이로 할지 아니면 원래 값인 0 ~ 255 로 할지 
               결정하는 함수

# 0 ~ 255 범위의 각 픽셀의 값을 0.0 ~ 1.0 사이 범위로 변환능ㄹ 하는데 이렇게 특정 범위로 
#     변환 처리하는 것을 ?

#     "정규화"  라고 한다 

#신경망의 입력 데이터에 특정 변환을 가하는 것을 
#     "전처리" 라고 한다.


img = x_train[0]
label = t_train[0]
print(label)  # 5

print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 형상을 원래 이미지의 크기로 변형
print(img.shape)  # (28, 28)

img_show(img)


문제53. x_train 의 0 번째 요소의 필기체 숫자를 5였다. 그렇다면 x_train 의 1번재 요소의 필기체 숫자는 무엇인지 확인하시오 
7

  • mnist파라미터 설명
      a. flatten
         i. true : 입력이미지를 평탄하게 1차원 배열로 변환하는 것 (학습시킬때는 변환해야함)
         ii. false : 입력이미지를 평탄하게 1차원 배열로 변환하지 않는것 (이미지를 표시해야 함)
      b. normalize
         i. true : 픽셀의 값을 0~1 사이로 변환한다. (전처리 작업)
         ii. false : 픽셀의 값을 0~255 사이로 그대로 둔다.
      c. one_hot_label
         § 0~9의 숫자가 라벨로 저장되어 있음 [0,0,0,0,0,0,0,1,0,0] --> 7을 의미한다.
         i. true : 원-핫 인코딩 (one-hot encoding) 형태로 저장한다.
false : 레이블을 원-핫 인코딩 형태로 저장안한다.


# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import pickle
# (p98) mmist 데이터셋을 읽어올 때 인터넷이 연결되어 있는 상태에서 가져와야하는데 이때 시간이 걸린다.
# 가져온 이미지를 로컬에 저장할 때 pickle 파일로 생성이 되고 로컬에 저장되어 있으면 순식간에 읽을 수 있기 때문에 임포트 해야함
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax

def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    #(학습데이터, 학습라벨), (테스트데이터, 테스트라벨)
    # 60000장              , 10000장
    return x_test, t_test
    #테스트 데이터만 return. 학습할 필요 x
    #훈련시킬려는 목적 x

def init_network():
    with open("C:\\sample_weight.pkl", 'rb') as f:
        # (훈련되어있는 매개변수, 가중치) 가지고 추론
        network = pickle.load(f)
    return network
# sample_weight.pkl 파일안에 학습된 가중치, 바이어스가 다 계산되어서 들어있음

# 신경망 어떻게 구현해서 학습한것인지 확인(추정)

# 이 최종결과가 sample어쩌구 저 파일에 있다
# 그니까 여기 안엔 학습코드 x. 학습된거 가지고 추론하는거임

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)

    return y
# [0.05, 0.05, 0.7, 0.01 ...]
# 2

## 2가 맞는지 확인
x, t = get_data()
# 테스트 데이터(x), 테스트 라벨(t)
# t에는 숫자가 들어있을 것(원핫인코딩x)
network = init_network()
##파이썬 함수의 4가지 특징
#1. 변수에 할당할 수 있다
#2. 다른 함수 내에서 정의될 수 있다
#3. 함수의 매개변수로 함수가 전달될 수 있다
#4. 함수의 반환값이 될 수 있다

accuracy_cnt = 0   #정확도를 출력해주기 위한 변수
for i in range(len(x)):
    y = predict(network, x[i])
# x 784개...
# y가 [0.05, 0.05, 0.7, 0.01 ..]
    p= np.argmax(y) # 확률이 가장 높은 원소의 인덱스를 얻는다. #2
    if p == t[i]:                                # t: 타겟(숫자있음.. 원핫인코딩안했으니깐...)
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))


문제56. 위의 코드를 수정해서 






■ 배치처리 (p102) 

이미지를 한장씩 처리하는게 아니라 여러장르 한번에 처리 

이미지를 한장씩 처리함


이미지는 50페이지씩 처리함 

추론(테스트)를 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.

  • 배치로 돌리는 코드를 이해하기 위한 사전 파이썬 코드의 이해 

     list( range(0, 10) ) <--- 이 결과를 프린트하면 ?

     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

문제57. [0, 3, 6, 9]로 결과를 출력하려면 ? 

print(list(range(0,10,3)))

문제58. 아래의 리스트를 만들고 
[0, 3, 6, 9] 이중의 최대 값을 출력하라 인덱스도
x= list(range(0,10,3))
print(max(x))
print(x.index(max(x)))

문제59. numpy를 이용해서 아래의 리스트에 최대값의 인덱스를 출력하시오 !
import numpy as np
xlist(range(0,10,3))
print(np.argmax(x))

문제60. 아래의 행렬 배열을 생성하고 각 행의 최대값을 갖는 인덱스가
출력되게 하시오 


     0.1  0.8  0.1     1
     0.3  0.1  0.6     2     
     0.2  0.5  0.3     1
     0.8  0.1  0.1     0

import numpy as np

a = np.array([[ 0.1,  0.8 , 0.1  ],
   [  0.3 , 0.1 , 0.6   ],
   [ 0.2  ,0.5,  0.3   ],
   [ 0.8,  0.1 , 0.1   ]  ])
for i in range(len(a)):
    print(np.argmax(a[i]))

for i in range(a.shape[0]):
     print(np.argmax(a[i])

print(np.argmax(a, axis = 1))
     axis = 0 : 열
     axis = 1 : 행
print(a.shape[0])
for i in range(a.shape[0]):
print(np.argmax(a[i]))

print(np.argmax(a, axis = 0))
[3 0 1]

문제61. 아래의 2개의 리스트를 만들고 서로 같은 자리에 같은 숫자가 몇개가 있는지 출력하시오 ! 

[2,1,3,5,1,4,2,1,1,0]

[2,1,3,4,5,4,2,1,1,2]
결과 : 7 


a = [2,1,3,5,1,4,2,1,1,0]
j = 0
b= [2,1,3,4,5,4,2,1,1,2]
for i inrange(len(a)):
     
     if (a[i] == b[i]):
          j+=1
print(j)


a = [2,1,3,5,1,4,2,1,1,0]

b= [2,1,3,4,5,4,2,1,1,2]
a= np.array(a)
b= np.array(b)
print(np.sum(a==b))

문제62. 아래의 리스트를 x라는 변수에 담고 앞에 5개의 숫자만 출력하시오 
[1,2,3,4,5,6,7,8,9,10]

결과 :  [1,2,3,4,5]

답 :
a=[1,2,3,4,5,6,7,8,9,10]

print(a[0:5]

문제63. 100장의 이미지를 한번에 입력츠엥 넣어서 정확도를
        추론하는 신경망 코드를 수행하시오 !

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax

def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test

def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network

def predict(network, x):
    w1, w2, w3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, w1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, w2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, w3) + b3
    y = softmax(a3)

    return y

x, t = get_data()
network = init_network()

batch_size = 1 # 배치 크기
accuracy_cnt = 0

for i in range(0, len(x), batch_size):
    x_batch = x[i:i+batch_size]
    y_batch = predict(network, x_batch)
    p = np.argmax(y_batch, axis=1)
    accuracy_cnt += np.sum(p == t[i:i+batch_size])

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

문제64. batch_size를 1로 했을 때와 batch_size를 100으로 했을 떄
     수행속도의 차이가 있는지 확인하시오 ! (정확도와 수행속도) 

100개씩
0.046002864837646484
Accuracy:0.9352

1개씩
0.7430424690246582
Accuracy:0.9352

문제65. 훈련 데이터 (6만개)로 batch_size 1 로 했을 때와 
        batch_size 100으로 했을때의 정확도와 수행속도차이를 비교하시오 (오늘의 마지막 문제 )

100 개씩 
0.239013671875
Accuracy:0.9357666666666666

1개씩
4.204240560531616
Accuracy:0.9357666666666666


4장을 미리 읽으세요
























 


 

 

'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26


- 머신러닝과 딥러닝의 차이점은? 
     붓꽃의 종을 구별하는 임무가 있다고 했을때 머신러닝은
     사람이 붓꽃의 특성을 정의하고 데이터 세트를 만들고나서
     컴퓨터가 데이터 세트를 기반으로 붓꽃을 구별하는 판별식을 결정하는 방법


머신러닝





딥러닝


 딥러닝은 알고리즘에 의해 컴퓨터가 붓꽃의 사진을 보고 스스로 특성을 찾아내고 판별해 내는 방법이다. 



■ 복습 
  1. 머신러닝과 딥러닝의 차이? 
     딥러닝은 알고리즘에 의해 컴퓨터가 붓꽃의 사진을 보고 스스로 특성을 찾아내고 판별해내는 방법

     '깊은 학습'
     
     신경망츠잉 여러개이기 때무넹
  1. 신경망을 구현하기 위한 라이브러리 2개? 
     - numpy 
     - matplotlib

■ 2장. 퍼셉트론 (Perceptron) 

     머신러닝의 한 부류인 딥러닝(이미지를 기계가 직접 인식해서 학습) 
                         ↓
         퍼센트론 ---> 신경망

결론은 ? 분류를 하겟다.

신경망을 통해서 구현하고자 하는 목표는 ? 분류 
     
           - 붓꽃 사진을 보고 종을 분류
           - 고양이 사진, 개 사진 분류 

퍼셉트론도 분류인데 숫자 0과 1을 분류한다. 


     

1943년에 미국의 신경외과 의사인 워렌 맥컬록에 의해 발다닝 되었고

1957년에 프랑크 로젠 블라트가 퍼센트론 알고리즘을 고안했다

사람의 뇌의 동자긍ㄹ 전기 스위치의 on/off로 흉내 낼 수 있다는 이론을 
증명하였다.

간단히 말하면 인간의 신경세포 한를 흉대는 냈는데

고등하굑 생물시간에 배운  3가지 용어 ?

  1. 자극(stinulus)
  2. 반응(response)
  3. 역치(threshold)

 "특정 자극이 있다면 그 자극이 어느 역치 이상이여야만 세포가 반응한다."

예 : 짜게 먹는 사람은 자기가 평소에 먹는 만큼 음식이 짜지 않으면 싱겁다고 느낀다.
    ( 역치 이하의 자극은 무시) 
 
      싱겁게 먹는 사람이 짜게 먹기 시작해서 오랜 시간이 지나면 
      예전에 먹던 싱거운 음식에 만족하지 못한다( 역치가 올라감)

1969년 : 퍼센터론은 단순 선형분류기에 불과하다
          왜냐면? xor분류도 못한다고 단정을 지음 

          인공지능의 침체기 (인공지능의 빙하기)

1970년 중반 : 중요한 논문이 하나 발표 : 역전파 알고리즘  (다층 퍼센트론) 

     당시의 컴퓨터 연산으로는 이 이론을 구현하기가 어려웠음 


1986년 : 은닉층을 갖는 다층 퍼센트론 + 오류 역전파 학습 알고리즘 구현 되기 시작함 

          ↓
        오늘날


입력 신호               가중치         출력신호

입력신호의 연결강도가 가중치인데 가중치의 갑싱 클수록 강한 신호이다

입력신호가 뉴런에 보내질때는 각각의 고유하 가중치가 곱해진다.

w1 * x1 + w2 * x2 <= 임계값(θ) ---> 0 (신호가 안 흐른다)
w1 * x1 + w2 * x2 > 임계값(θ) ---> 1 (신호가 흐른다)

뉴런에서 보내온 신호의 총합이 정해진 한계(임계값)을 넘어설때만 1을 출력한다.

퍼셉트론은 n 개의 이진수가 하나의 뉴런을 통과해서 가중의 합이 0 보다 크면 활성화되는
가장 간단한 신경망이다. 

퍼셉트론을 학습시키는 방법은 간단한데, 보통 목표치를 정해주고 
현재 계산한 값이 목표치와 다른면 그 만큼의 오차를 다시 퍼센트론에 
반영해서 오차를 줄여나가는 방법 
















문제27. 아래의 식을 파이썬으로 구현하시오 ! 

 x1  w1
     ↘
         ?
     ↗
 x2  w2

x1 * w1 + x2 * w2 = ?

x1 : 0 
x2 : 1
w1 : 0.5
w2 : 0.5

(0 1) * (0.5 0.5)

input=np.array([0,1])
weight=np.array([0.5, 0.5])
np.sum(input*weight)

문제28. 위의 식에 책 52쪽에 나오는 편향을 더해서 완성한 아래의 식을 
       파이썬으로 구현하시오 !
       
       b + w1*x1 + w2*x2 

b(편향) = -0.7

x1 : 0 
x2 : 1
w1 : 0.5
w2 : 0.5


input=np.array([0,1])
weight=np.array([0.50.5])
b=0.7
print(np.sum(input*weight) + b)


문제29. AND게이트를 파이썬으로 구현하시오 

def AND(x1, x2):
     return x1&x2

def AND(x1, x2):
     w1, w2, theta = 0.5, 0.5, 0.7
     tmp = x1*w1 + x2*w2
     if tmp <= theta :
          return 0 
     elif tmp > theta:
          return 1

■ 편향까지 포함해서 AND 게이트를 구현

 "가중치는 입력신호가 결과에 주는 영향력(중요도)를 조절하는 
  매개변수이고 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 
  하느냐를 조정하는 매개변수이다. "

  예를들어 b 가 -0.1 이면 각 입력신호에 가중치를 곱한 값들의 합이 0.1 을
  초과할 때만 뉴런이 활성화 된다.

  만약 편향이 -20 이면 입력신호에 가중치를 곱한 ㅎ바이 20을 넘지 않으면 뉴런은 활성화
  되지 않는다. 

문제30. 문제29번의 편향을 포함해서 AND 게이트 함수를 구현하시오 !

가중치 : 0.5, 0.5
편 향 : -0.7



def AND(x1, x2):
     w1, w2, theta = 0.5, 0.5, -0.7
     tmp = x1*w1 + x2*w2
     if tmp <= theta :
          return 0 
     elif tmp > theta:
          return 1

  1. 다층 퍼셉트론 
          -XOR 게이트 구현

AND  X1  X2  Y
      0   0  0 
      0   1  0 
      1   0  0
      1   1  1

OR   X1  X2  Y
      0   0  0
      0   1  1 
      1   0  1 
      1   1  1

NAND  X1  X2  Y
       0   0  1
       0   1  1 
       1   0  1
       1   1  1

xor 는 eXclusive OR 라는 뜻으로 둘중에 하나만 1일때 1 이 된다.

XOR    x1   x2   y
            0     0   0
            0     1   1
            1     0   1
            1     1   1

"이 처럼 층이 여러개인 퍼셉트론을 다층 퍼셉트론이라고 한다."

문제31. AND 함수를 이용해서 NAND함수를 만드시오 

def AND(x1, x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1

def NAND(x1, x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1
문제32. OR 함수를 파이썬으로 구현하시오 

def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.50.5])
    b = -0.3
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1

문제33. XOR 함수를 파이썬으로 구현하시오 !

print(XOR(1,0))


def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

#

























 









































 

'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26

■딥러닝
■일정 7월 18일

6월 22일 ~ 7월 13일 (3주) : R 수업 - 매일 쪽지시험 2개
7월 13일 ~ 8월  3일  (3주) : 딥러닝 - 개념을 잡는 문제
8월  3일  ~ 8월 23일 (3주) : 텐써플로우 + 개인 프로젝트 (포트폴리오)

신경망에 대해서 얘기 해보세요 

시그모이드 함수가 뭔가요 

그게 왜 필요한가요 ? 


거기에 대한 대답을 할 줄 알아야 한다

코딩만 하다보면 대답을 잘 모해 

밑 바닥 부터 시작하는 딥러닝 책이 총7 챕터 까지 잇다

총 7장 수업 
하루에 한 챕터씩 하더라도 다음주 화요일이면 끝이 난다. 

그래서 

수업과 그리고 오오오 쪽지시험 개념 

  1. 총7장 수업
  2. 쪽지시험 (개념설명 <=-== 면접대비, ncs 시험문제) 
  3. 딥러닝은 평가방법 포트폴리오 (개인프로젝트)

8월 4일 프로젝트 계획서 제출 ( 주제, 참여 인원수, 기간, 상세기간에 계획)
     - 2~3명 : 좀더 좋은 결과물이 나와야하고  
     - 1명   : 계획을 잘 짜서 -> 계획대로 진행

8월 4일까지 계획서 제출 

7월 17일
7월 24일
7월 31일 
8월 7일 : 개인 프로젝트
8월 14일 
8월 21 ----- 8월 23일 (수)


■ 밑바닥 부터 시작하는 딥러닝

■ 1장.  Numpy, matplotlib 사용법

*1장 목차.
  1. 딥러닝이 무엇인가?
  2. 넘파이

■ 1. 딥러닝이 무엇인가?

■ 머신러닝의 종류 3가지
 1.지도학습 
    - 분류 :    knn         : 과일인지 야채인지 단백질인지 분류
                              유방암 종양크기와 둘레로 양성이닞 악성인지 분류
                              동물의 형태로 어떤 종류의 동물인지 분류
               나이브베이즈   : 스팸과 햄 메일 분류
                              직업, 나이, 성별만 가지고 선호하는 
                              영화 장르 
               결정트리      : 1. 대출위험대상자(개인,기업) 분류
                              2.지방간인지 아닌지
                              3.베드민턴 플레이에 날씨가 미치는 영향
                              4.스킨샵 쿠폰반응 여부
               svm         : 서포트벡터머신:                          
1.중산층 분류 실습
2.필기체 분류 숫자 
3.필기체 분류 영어
4.대장균
5.iris
6.mnist(필기체)
7.보스톤 하우징 데이터 분류
    - 회귀 :  선형회귀         
                              1.코스피 지수
                              2.탄닌과 애벌레성장
                              3.미국대학 입학에 미치는 가장큰 변수
                              4.챌린저호 폭파원인분석
                              5.보험비에 미치는 변수(담배, 비만지수)
                              6.스마트폰 구매에 미치는 변수(외관)
               신경망          
                              1.콘크리트 강도에 미치는 변수
                              2.필기체 인식

2.비지도학습 : k-means
                             1.sns 10대들의 관심사를 가지고 10대를 
                                5개의 부류로 분류함 
                             2.가요와 클래식 음악분류

3.강화학습 : 틱택토, 핑퐁


     ■ 머신러닝과 딥러닝의 차이? 


- 딥러닝은 머신러닝에서 나온 한 갈래임

- 머신러닝이란? 
     프로그래머의 프로그래밍없이 컴퓨터에게 배우게 하는 
     능력을 갖게하는 컴퓨터 과학의 한 종류 

예 : 우리가 책상이라는 이미지를 인식하는건 그냥 어렸을때 부터 그게 책상이었고
     그냥 그런가보다 해서 자연스럽게 알게된것이다. 
     컴퓨터에게 이게 책상이다 라고 알려주는 것은 쉬울것 같지만 
     사실 굉장히 어려운 일이다. 

      우리가 책상을 보고 이게 책상이다라고 알 때에 
     우리 뇌에서 일어나느 일들을 우리는 다 알지도 못하고 
     안다해도 그 과정을 프로그래밍 한다는것은 무지막지하게 
     복잡한 일 일것이다. 

     그래서 이런 프로그램을 사람이 작성하는 대신 기계가 
     프로그램을 작성하도록 접근한 것이 머신러닝이다. 

- 머신러닝과 딥러닝의 차이점은? 
     붓꽃의 종을 구별하는 임무가 있다고 했을때 머신러닝은
     사람이 붓꽃의 특성을 정의하고 데이터 세트를 만들고나서
     컴퓨터가 데이터 세트를 기반으로 붓꽃을 구별하는 판별식을 결정하는 방법


머신러닝






딥러닝



 딥러닝은 알고리즘에 의해 컴퓨터가 붓꽃의 사진을 보고 스스로 특성을 찾아내고 판별해 내는 방법이다. 

딥(deep) 이라는 말은 신경망의 층이 많고 각 층마다 고려되는 
변수가 많다는 뜻이다. 

개인프로젝트;
8월 4일 프로젝트 계획서 제출 ( 주제, 참여 인원수, 기간, 상세기간에 계획)
     - 2~3명 : 좀더 좋은 결과물이 나와야하고  
     - 1명   : 계획을 잘 짜서 -> 계획대로 진행


  


■ 밑바닥 부터 시작하는 딥러닝
1장. 파이썬 사용법
2장. 퍼셉트론
3장. 신경망
4장. 신경망 학습
5장. 오차역전파법
6장.학습 관련 시술들
7장. 합성곱 신경망(cnn)
8장. 딥러닝

■ 1장.  Numpy, matplotlib 사용법
1.2 넘파이 (numPy)

- python 언어에서  기본적으로 지원하지 않는
  배열 (array) 혹은 행렬(matrix)의 계산을 쉽게 해주는 라이브러리 

- 머신러닝에서 많이 사용하는 선형대수학에 관련된 수식들을
  파이썬에서 쉽게 프로그래밍 할 수 있게 해준다. 

예제1 : 배열 만들기

import numpy as np 

a = np.array([[1,2],[3,4]])

print(a)

결과 [[1,2]
      [3 4]]

예제2 : 사직연산

a + n : 배열의 모든 원소에 n 만큼을 더합니다.
a - n : 배열의 모든 원소에 n 만큼을 뺀다 .
a * n : 배열의 모든 원소에 n 만큼을 곱한다 .
a / n : 배열의 모든 원소에 n 만큼을 나눈다..

문제1. 아래의 a 배열에 모든 원소에 5를 더한 결과를 출력하시오

a = np.array([[1,2],[3,4]])

문제2. 아래의 배열의 원소들의 평균값을 출력하시오  !

 a = numpy.array([1,2,3,4,5,5,6,10])

답: 
import numpy as np 
a = np.array([1,2,3,4,5,5,6,10])
print(np.mean(a))


문제3. a 배열의 중앙값을 출력하시오
import numpy as np 
a = np.array([1,2,3,4,5,5,6,10])
print(np.median(a))

문제4. a 배열의  최대값과 최소값을 출력하시오 

print(np.max(a))
print(np.min(a))

문제5. a 배열의 표준편차와 분산을 출력하시오 

print(np.std(a))
print(np.var(a))

문제6. 아래의 행렬식으로 numpy로 구현하시오 !
  1 3 7        0  0  5
[        ] + [        ]
  1 0 0        7  5  0 


a=np.array([[1,3,7],[1,0,0]])
b=np.array([[0,0,5],[7,5,0]])
print(a+b)


문제7. 아래의 numpy 배열을 생성하고 원소중에 10만 출력해보시오  !
 1 2 3
[4 10 6 ]
 8 9 20

답 :
a=np.array([[1,2,3],[4,10,6],[8,9,20]])
print(a[1][1])

문제8.아래의 행렬 연산을 파이썬으로 구현하시오 ! (점심시간문제)
 1 2 
(    ) * ( 10 20 ) =?
 3 4 

a= np.array([[1,2],[3,4]]) 
b= np.array([10,20])

print(a*b)



문제9. 아래의 그림의 행렬 연산을 numpy로 구현하시오  !


a=np.array([[0],[10],[20],[30]])
b=np.array([0,1,2])
print(a+b)

문제10. 아래의 행렬 식을 numpy로 구현하고 아래의 요소에서 
     15 이상인 것만 출력하시오 
  55 55
( 14 19 )
   0  4
a=np.array([[55,55],[14,19],[0,4]])
a=a.flatten() # 1차원 배열로 변환 시켜준다. 
a[a>15]

문제11. 아래의 행렬식을 numpy를 이용하지 않고 list변수로 구현하고      
       아래의 행렬식에서 행의 갯수가 몇개인지 출력하시오
1 3 7
1 0 0 

a=[[1,3,7],[1,0,0]]

print(len(a))


문제12. 아래의 행렬식을 numpy를 이용하지 않고 list 변수로 구현하고 
       열의 갯수가 몇개 인지 출력하시오 
1 3 7 
1 0 0 

a=[[1,3,7],[1,0,0]]
print(len(a[0]))

문제13. 아래의 행렬식의 덧셈 연산을 numpy 이용하지 않고 수행하시오 

a=[[1,3,7],[1,0,0]]
b=[[0,0,5],[7,5,0]]
res=[[0,0,0],[0,0,0]]
for in range(len(a)):
    for in range(len(a[0])):
        res[i][j]=a[i][j]+b[i][j]
print(res)

문제14. 아래의 행렬식을 numpy이용하지 않고 구현하시오 ! 

1  2     5  6  
       x          = ?
3  4     7  8




#넘파이 이용
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[7,8]])
print(a*b)

# 넘파이 안 이용 
a=[[1,2],[3,4]]
b=[[5,6],[7,8]]
res=[[0,0],[0,0]]
for in range(len(a)):
    for in range(len(a[0])):
        res[i][j]=a[i][j]*b[i][j]
print(res)


문제15. 아래의 행렬 연산을 numpy와 numpy를 이용하지 않았을때 2가지 방법으로 구현하시오 

10   20  -  5  6  = ?
30   40     7  8



#넘파이 이용
a= np.array([[10,20],[30,40]])
b= np.array([[5,6],[7,8]])
print(a-b)

#넘파이 안 이용
a= [[10,20],[30,40]]
b= [[5,6],[7,8]]
res=[[0,0],[0,0]]
for in range(len(a)):
    for in range(len(a[0])):
        res[i][j]=a[i][j]-b[i][j]
print(res)

문제16. numpy의 브로드캐스트를 사용한 연산을 numpy를 이용하지 않는 방법으로 구현하시오 (점심시간 문제를 넘파이 이용하지 않고 )


 1 2 
(    ) * ( 10 20 ) =?
 3 4 


a= [[1,2],[3,4]]
b= [10,20]
res=[[0,0],[0,0]]
for i in range(len(a)):
    for j in range(len(b[0])):
        res[i][j]=a[i][j]-b[j]
print(res)

■ 3. matplotlib 사용법 (p41)

     딥러닝 실험에서는 그래프 그리기와 데이터 시각화가 중요하다
     matplotlib 는 그래프를 그리기 위한 라이브러리이다.

     matplotlib를 이용하면 그래프를 그리기가 쉬워진다. 

예제1:
import matplotlib.pyplot as plt
plt.figure() #객체를 선언한다.
plt.plot([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0])
plt.show()



import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.show()


문제17. 위의 그래프에 grid(격자)를 추가하시오!

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.grid()
plt.show()


문제18. 위의 그래프에 x축의 이름을 size라고 하고 y축의 이름을 cost라고 하시오 ! 

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.grid()
plt.xlabel('size')
plt.ylabel('cost')
plt.show()

문제19. 위의 그래프에 전체 제목을 size & cost라고 하시오 


import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.grid()
plt.xlabel('size')
plt.ylabel('cost')
plt.title('size & cost')
plt.show()

문제20. 아래의 numpy 배열로 산포도 그래프를 그리시오 ! 

x = np.array([0,1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,9,8,3,2,4,3,4])

plt.figure()
plt.scatter(x,y)
plt.show()


문제21. 위 그래프를 선이 그어지게 하시오 


문제22. 치킨집 창업 데이터를 읽어와 그래프를 그리시오


import numpy as np
from matplotlib import pyplot as plt
chi = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')

x = chi[0]
y = chi[4]

plt.figure()
plt.plot(x,y)
plt.xlabel("YEAR")
plt.ylabel('JIP')
plt.title('chicken jip open per year')

문제23. 폐업건수도 위의 그래프에 겹치게 해서 출력하시오 ! 

import numpy as np
from matplotlib import pyplot as plt
chi = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
pe = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
unpack=True 세로로 읽겠다 
x = chi[0]
y = chi[4]
p = pe[4]
plt.figure()
plt.plot(x,y)
plt.plot(x,p)
plt.xlabel("YEAR")
plt.ylabel('JIP')
plt.title('chicken jip open per year')
plt.show()


문제24. 위의 그래프에 legend도 출력하시오 (


import numpy as np
from matplotlib import pyplot as plt
chi = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
pe = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
unpack=True 세로로 읽겠다 
x = chi[0]
y = chi[4]
p = pe[4]
plt.figure()
plt.plot(x,y)
plt.plot(x,p)
plt.xlabel("YEAR")
plt.ylabel('JIP')
plt.title('chicken jip open per year')
plt.legend()
plt.show()

문제25. 책 44 페이지의 이미지 표시를 파이썬으로 구현하시오 ! 
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.image import imread
img = imread('d:\\data\\lena.png')
plt.imshow(img)
plt.show()

문제26. 고양이 사진을 출력하시오! 

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.image import imread
img = imread('d:\\data\\고양.png')
plt.imshow(img)
plt.show()


  1. 파이썬은 익히기 쉬운 프로그래밍 언어이다
  2. 파이썬오픈 소스다
  3. 이책의 딥러닝 구현은 파이썬 3버전을 이용한다
  4. 외부 라이브러리로는 numpy와 matplotlib을 사용했따.
  5. 파이썬에서는 함수와 클래스 같은 ㅇ모듈로 구현을 정히 할 수 잇따.
  6. 넘파이느 ㄴ다차원 배열을 다루는 편리한 메서드를 많이 제공한ㄷ.


    넘파이를 이용했을때 vs 넘파이를 이용하지 않았을 대

■ 2장. 퍼셉트론 (Perceptron) 

     머신러닝의 한 부류인 딥러닝(이미지를 기계가 직접 인식해서 학습) 
                         ↓
     퍼센트론 ---> 신경망

1943년에 미국의 신경외과 의사인 워렌 맥컬록에 의해 발다닝 되었고

1957년에 프랑크 로젠 블라트가 퍼센트론 알고리즘을 고안했다

사람의 뇌의 동자긍ㄹ 전기 스위치의 on/off로 흉내 낼 수 있다는 이론을 
증명하였다.

간단히 말하면 인간의 신경세포 한를 흉대는 냈는데

고등하굑 생물시간에 배운  3가지 용어 ?

  1. 자극(stinulus)
  2. 반응(response)
  3. 역치(threshold)

 "특정 자극이 있다면 그 자극이 어느 역치 이상이여야만 세포가 반응한다."

예 : 짜게 먹는 사람은 자기가 평소에 먹는 만큼 음식이 짜지 않으면 싱겁다고 느낀다.
    ( 역치 이하의 자극은 무시) 
 
      싱겁게 먹는 사람이 짜게 먹기 시작해서 오랜 시간이 지나면 
      예전에 먹던 싱거운 음식에 만족하지 못한다( 역치가 올라감)

1969년 : 퍼센터론은 단순 선형분류기에 불과하다
          왜냐면? xor분류도 못한다고 단정을 지음 

          인공지능의 침체기 (인공지능의 빙하기)

1970년 중반 : 중요한 논문이 하나 발표 : 역전파 알고리즘  (다층 퍼센트론) 

     당시의 컴퓨터 연산으로는 이 이론을 구현하기가 어려웠음 


1986년 : 은닉층을 갖는 다층 퍼센트론 + 오류 역전파 학습 알고리즘 구현 되기 시작함 

          ↓
     오늘날


































 

































































 



 

'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26

■ 어제까지 배운 내용 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 3장. knn (최근접 이웃을 사용한 분류의 이해)  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.07.06

R 1장 R기본문법

R(알) 2017. 7. 6. 20:27
  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)