ch0nny_log

[빅데이터분석] SQL_TIL 16(CREATE TEMPORARY TABLE, view, 테이블 컬럼 추가, 삭제, 변경하기.) 본문

빅데이터 분석(with 아이티윌)/SQL

[빅데이터분석] SQL_TIL 16(CREATE TEMPORARY TABLE, view, 테이블 컬럼 추가, 삭제, 변경하기.)

chonny 2024. 6. 3. 18:22

★ 점심시간문제

스티브 잡스 연설문에 포함된  긍정단어, 긍정단어 빈도수, 순위를 출력하는데 순위가 긍정단어 빈도수를 기준으로 순위를 출력하세요

 

  select s.word, count(*) positive_jobs, dense_rank () over (order by count(*)desc) 순위
        from  stev_word2 s
        where exists (select p_word 
                        from positive_eng p
                        where lower(p.p_word) =lower(s.word))
                    
    group by s.word;


[TIL 16] 240603

94. CREATE TEMPORARY TABLE

예제 94. 임시테이블 생성하기(CREATE TEMPORARY TABLE)
임시테이블: 데이터를 영구히 저장하는게 아니라 잠깐 임시로 저장할 테이블을 생성할 때 유용한 테이블.

of) 현업사례
- 통신사에서 한달에 한번씩 고객들에게 통신요금을 계산해서 청구하는데 그 통신요금을 계산하는 프로그램을 빌링(billing) 프로그램이라고 함. kt.sk와 같은 경우 이 billing 프로그램의 SQL길이가 엄청 길다. 그러다보니 임시 테이블로 그 데이터를 저장함.

임시 테이블 종류 
1. 영구히 데이터를 저장 할 수 있는 테이블  heap table
2. 임시로 저장할 수 있는 테이블 temporary table
- 지금 잠깐 볼 데이터고 영구히 저장할 필요 없는 데이터의 경우 나중에 필요없는 테이블도 함부로 drop 하기 부담됨.
- 임시 테이블은 permanent tablespce에데이터를 저장하지 않고 temporary table에 저장하므로 permanent tablespce 디스크를 사용하지 않아도 됩니다. 

임시 테이블의 종류  2가지
1. commit 할때 까지만 데이터를 보관하는 테이블 관련옵션:  on commit  delete  rows
2. 세션을 종료할 때까지만 데이터를 보관하는 테이블 관련옵션:  on commit  preserve rows 

 

문제 1. commit 할때 까지만 데이터를 보관하는 임시 테이블을 생성하시오.
 create  global  temporary   table   emp_temp1
  (  empno   number(10),
     ename   varchar2(20),
     sal        number(10) )
   on   commit  delete  rows;

  insert  into  emp_temp1
   select  empno, ename, sal
     from emp;

 select * from emp_temp1;​


commit;​

commit 하면 데이터는 사라지 테이블 구조는 drop 하기 전 까지 남아있음 
문제 2. on commit preserve rows 옵션을 써서 임시테이블을 생성하시오. (테이블 명 emp_temp2 / 컬럼구조 emp_temp1 과 동일하게)
 create  global  temporary   table   emp_temp2
  (  empno   number(10),
     ename   varchar2(20),
     sal        number(10) )
   on   commit preserve rows ;

  insert  into  emp_temp2
   select  empno, ename, sal
     from emp;

 select * from emp_temp2;


- commit 했을 때 데이터가 사라지지 않고 sqldeveloper을 종료했을 때 사라지는 테이블 

95. view

예제95번.  복잡한 쿼리를 단순하게 하기 1(VIEW)
* database 의 오브젝트(object)  
  1.  table 행(row)과 컬럼(column)으로 이루어진 기본 데이터 저장소
  2.  view

데이터를 저장하지는 않고 테이블의 데이터를 볼 수 있게 해주는 object
view 를 사용하는 이유
1) 데이터 보안상의 이유 (중요한 개인정보를 감출수 있음)
2) 복잡한 쿼리문을 심플하게 작성하기 위해
  3.  index
 
  4.  sequence  
  5.  synonym  
문제 1.월급 컬럼을 안보이게 view를 사용하시오.
create view emp_view
    as
        select empno, ename, job, mgr, hiredate, deptno
            from emp;

-view는 데이터를 저장하지 않고 그냥 바로 보는 것

 

문제2.  emp_view 의 데이터에서 king의 직업을 salesman으로 변경하시오.  
   select * from emp_view;
            
            
            update emp_view
                set job='SALESMAN'
                    where ename ='KING';

VIEW 테이블을 업데이트하면 본 테이블의 데이터도 업데이트된다.

문제 3. 아래의 UPDATE문의 실행계획을 확인해서 EMP 테이블을 직접 UPDATE한건지 확인하시오.
 explain plan for
 update emp_view
    set job='SAELSMAN'
        where ename='KING';
        
        select * from table(dbms_xplan.display);
문제 4. 보안상의 이유로 president와 manager의 데이터는 노출하지 않게 하고 나머지 모든 컬럼은 보이게 하시오.
(view 생성명 emp_view2)
create or replace view emp_view2
    as
        select *
            from emp
            where job not in ('PRESIDENT', 'manager');
            
            select *from  emp_view2;


문제 5. 위 테이블을 이름이 FORD인 사원의 월급을 0 으로 변경하시오. 
      update emp_view2
                set sal = 0
                where ename='FORD';

 

※  view 의 종류  2가지   단순 view  복합 view
테이블의 갯수     1개      2개 이상 
group 함수 또는    group by 절    포함안함     포함
DML  여부     가능     불가능할 수 도 있다.

 

문제 6. emp와 dept를 조인해서 이름과 부서위치를 출력하시오 !
 select  e.ename,  e.sal,  d.loc
    from   emp   e,   dept   d
    where   e.deptno = d.deptno ;


설명:  e.ename 으로 작성했지만 출력되는 컬럼명은 ename 으로 출력되고 있습니다.

 

문제 7. 위의 결과 view로 생성하는데 뷰이름은 emp_dept로 생성하시오.
    create or replace view emp_dept
    as
    select  e.ename,  e.sal,  d.loc
    from   emp   e,   dept   d
    where   e.deptno = d.deptno ;
문제 8. emp_dept를 수정하는데 KING의 부서위치를 워싱턴으로 바꾸시오.
복합뷰는
 update emp_dept
        set loc ='PHILADELPHIA'
            where ename ='KING';

- KING 만 바뀌어야 되는데 KING 하고 같은 부서인사람들의 LOC도 필라델피아로 바뀜 

 

문제 9. 직업, 직업별 토탈월급을 출력하시오. 
select job, sum(sal)
                from emp
                group by job;
문제 10. 위의 결과를 출력하는 뷰를 emp400 이라는 이름으로 생성하시오.
 create or replace view emp400
                as 
                  select job, sum(sal) as 토탈월급
                from emp
                group by job;

 

문제 11. emp400에 직업이 salesman의 sumsal을 9000으로 수정하시오. 
update emp400
                set sum(sal) = 9000
                    where job = 'SALESMAN';

SQL 오류 : ROA-01732 : 뷰에 대한 데이터 조작이 부적합함 

문제 12.   이름, 월급, 월급에대한 순위를 출력하시오.
select ename, sal, dense_rank () over (order by sal desc)순위
        from emp;
문제 13. 위의 결과를 emp 533 이라는 view로 생성하시오.
 create or replace view emp533
        as
        select ename, sal, dense_rank () over (order by sal desc)순위
        from emp;
문제 14. 월급에 대한 순위가 3,5,7위만 출력하시오.
   select 순위
            from emp533
            where 순위 in (3,5,7);
문제 15. 위의 결과를 뷰로 작성하지 않고 emp테이블로 작성하시오
 select  ename, sal, 순위
  from  (  select  ename, sal, dense_rank()  over  ( order  by  sal  desc ) 순위
               from   emp 
           )
  where  순위  in ( 3, 5, 7 );

 

문제 16. 부서번호, 부서번호별 평균월급을 출력하시오.
 select deptno, round(avg(sal))
                from emp
                group by deptno;

 

문제 17. 위 결과를 emp537  뷰테이블로 만드시오. 
  create or replace view emp537
  as
  select deptno, round(avg(sal)) as  avgsal
                from emp
                group by deptno;
문제 18.  emp와 emp 537 을 서로 조인해서 이름,월급, 부서번호, 부서번호별 평균월급을 출력하시오.
설명: 일반 테이블과 뷰는 조인 할 수 있다.

 

문제 19. 위의 결과를 다시 출력하는데 자기의 월급이 자기가 속한 부서번호의 평균월급보다 더 큰 사원들만 출력하시오. 
      select e.ename, e.sal, e.deptno, v.avgsal
                    from emp e, emp537 v
                    where e.deptno =v.deptno and e.sal > v.avgsal;

** 뷰 생성시 [or repalce] 옵션이란 ?
- 뷰 생성하려 할 때 이미 같은 이름의 테이블이 있으면 안만들어진다. 따라서 같은 이름의 테이블이 있으면 덮어쓰는 것.

 view생성시 force와 noforce 옵션의 의미?
1) force 기본 테이블의 존재 여부와 상관없이 view 를 생성
2) no force 기본 테이블이 존재하는 경우에만 view 를 생성합니다.
문제  20. 아래의 view 를 생성하면 생성되는지 확인하세요!
 create   view   emp541
  as
   select   deptno, round(avg(sal))  as  avgsal
    from  emp
    group  by  deptno;

ORA-00942: 테이블 또는 뷰가 존재하지 않습니다  
문제 21.  emp 테이블이 없지만 emp541 뷰는 생성되게 하시오 !
 create  force  view   emp541
  as
   select   deptno, round(avg(sal))  as  avgsal
    from  emp
    group  by  deptno;

 select * from emp541;
문제 22. emp 테이블을 휴지통에서 꺼내기  
flashback table emp to before drop;
※  with  check  option  

 21c 버젼의 경우 복합뷰가 수정이 되었습니다.  KING의 부서위치가 변경이 가능했습니다.
그런데 변경 안되게 막아버리고 싶다면 WITH CHECK OPTION 을 사용해야합니다.

문제 23. 부서번호가 10번, 20번, 30번인 사원들의 이름과 월급과 직업과부서번호를 출력하는 뷰를 emp544 로 생성하는데  부서번호 만큼은 10번,20번,30번 부서번호 외에 다른 부서번호로 변경하지 못하도록 하시오 !
     create  or  replace   view   emp544
  as
   select  ename, sal, job, deptno
      from  emp
      where   deptno  in  ( 10, 20, 30 )
      with  check  option;

 select  * from  emp544;

설명: with check option을 써서 뷰를 생성했기 때문에 where 절에 기술한 조건외에 다른 조건으로 데이터를 변경할 수 없다.

문제 24.  emp544  뷰를 수정하는데  이름이 KING 인 사원의 부서번호를  50으로 수정하시오 !
update  emp544
  set  deptno = 50
  where  ename='KING';

SQL 오류: ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다

문제 25. 아래의 뷰 스크립트르 수정해서 뷰를 다시 생성하는데 부서위치를 new york, dallas, chicago, boston 외에는 변경하지 못하도록 뷰 스크립트를 수정해서 다시 생성하시오.
create  or  replace  view   emp_dept
 as
   select   e.ename,  e.sal,  d.loc
      from   emp  e,  dept   d
      where  e.deptno = d.deptno ;

select * from emp_dept;
update  dept
  set  loc ='PHILLADELPIA'
  where  ename='KING';

 

create  or  replace  view   emp_dept
 as
   select   e.ename,  e.sal,  d.loc
      from   emp  e,  dept   d
      where  e.deptno = d.deptno  
        and  d.loc  in ('NEW YORK','DALLAS','CHICAGO','BOSTON')
      with  check  option; 

select * from emp_dept;

update emp_dept
    set loc ='PHILLADELPIA'
    where ename ='KING';

설명: WITH READ ONLY를 쓰게 되면 전부 변경안된다. DELETE도 안되고 INSERT도 안됨. 오로지 SELECT만 가능!!!

문제 26. 월급이 1000이상인 사원들의 이름, 월급,직업, 부서번호를 출력하는데 VIEW를 EMP547로 생성하는데 오로지 SELECT 만 되도록 뷰를 생성하시오. 
 create or replace view emp547
    as
      select ename, sal, job, deptno
        from emp
        where sal >=1000
        with read only;
delete from emp547;
문제 27. 그동안 만들었던 view가 뭐가 있는지 확인하시오.
  select * from user_views;

문제28. emp547 뷰를 drop 하시오
drop view emp547;

 

 

문제 29. 그동안 만든 뷰를 모두 drop 하시오. 꿀팁!
   select 'drop view  ' ||view_name||';'
        from user_views;

 

        drop view  EMP_VIEW;
drop view  EMP_VIEW2;
drop view  EMP_DEPT;
drop view  EMP400;
drop view  EMP533;
drop view  EMP537;
drop view  EMP541;
drop view  EMP544;

96. 테이블 컬럼 추가, 삭제, 변경하기.

예제 96. 테이블 컬럼 추가, 삭제, 변경하기
1) 컬럼 추가 명령어 문법
alter table 테이블명
	add 컬럼명 데이터 타입

2) 컬럼 삭제 명령어 문법
alter table 테이블명
	drop column 컬럼명;

3) 컬럼 변경 명령어 문법

alter table 테이블명
	modify 컬럼명 데이터 타입;

 

문제 1. emp 테이블에 email 컬럼을 추가하시오.
alter table emp
    add email varchar2(200);

 

문제 2.  emp 테이블에 loc 컬럼을 추가하시오
  
    alter table emp
        add loc varchar2(200);
  
    alter table emp
        add loc varchar2(200);
문제 3. merge문을 이용해서 emp테이블에 loc 컬럼의 데이터를 해당사원의 부서위치로 값을 갱신하시오.
   merge into emp e
   using dept d
    on (e.deptno = d.deptno)
   when matched then
    update set e.loc =d.loc;

예측이나 분류를 하는 데이터 분석을 하고 싶으면 기계를 학습 시켜야하는데 기계를 학습을 잘 시키려면 좋은 학습 데이터를 기계에게 제공해야 합니다.

문제 4. 미국인 의료데이터를 예측하기 위한 미국인 의료 데이터를 테이블로 출력하시오.    
create table insurance
( id         number(10),
  age       number(3),
  sex        varchar2(10),
  bmi        number(10,2),
  children  number(2),
  smoker    varchar2(10),
  region    varchar2(20), 
  expenses  number(10,2) );

 

문제 5. 의료비와 상관관계까 더 높은 것은 bmi인가 children 인지 알아보시오.
  select corr(bmi,expenses)
    from insurance;
    
    select corr(children, expenses)
        from insurance;

결론: bmi와 expenses 가 조금 더 높으나 크지 않아서 회귀분석으로 알아봐야됨

상관관계 bmi expense
회귀분석 bmi expense
expense bmi

 

★☆ 문제 6.  SQL로 머신러닝 구현하기16(REGRESSION) _수치예측 하는 sql 포폴시
1. 분류 (퍼셉트론 ---> 인공신경망)
2. 회귀 (수학 공식 하나로 숫자를 예측하는 모델 생성)
ex)
-- 1. 의료비 데이터 테이블을 생성합니다.
DROP TABLE INSURANCE;

CREATE TABLE INSURANCE
( ID         NUMBER(10),
  AGE       NUMBER(3),
  SEX        VARCHAR2(10),
  BMI        NUMBER(10,2),
  CHILDREN  NUMBER(2),
  SMOKER    VARCHAR2(10),
  REGION    VARCHAR2(20), 
  EXPENSES  NUMBER(10,2) );​

 


-- 데이터 입력: SQL Developer를 이용해서 insurance.csv 를 insurance 테이블에 입력합니다. 
select count(*) from INSURANCE;​

-- 1338
  
-- 2. 훈련 데이터(기계를 공부 시킬 데이터) 와 테스트 데이터(공부한 기계의 성능 확인 데이터)로 분리합니다. 
#1. 훈련 데이터를 담을 테이블을 생성합니다.
DROP TABLE INSURANCE_TRAINING; 

CREATE TABLE INSURANCE_TRAINING
AS
   SELECT *
     FROM INSURANCE
     WHERE ID < 1114;

DROP TABLE INSURANCE_TEST;

CREATE TABLE INSURANCE_TEST
AS
   SELECT *
     FROM INSURANCE
     WHERE ID >= 1114;​


-- 3. 머신러닝 모델의 환경 구성 테이블을 생성합니다. 
       (공부하는 학생에게 공부방향들을 알려주는 정보가 들어있는 테이블을 생성하는 것) 
DROP TABLE SETTINGS_REG2;

CREATE TABLE SETTINGS_REG2
AS
SELECT *
  FROM TABLE (DBMS_DATA_MINING.GET_DEFAULT_SETTINGS)
  WHERE SETTING_NAME LIKE '%GLM%';

# 컬럼 2개짜리 테이블인데 데이터는 없음

BEGIN

INSERT INTO SETTINGS_REG2
 VALUES (DBMS_DATA_MINING.ALGO_NAME,'ALGO_GENERALIZED_LINEAR_MODEL');

INSERT INTO SETTINGS_REG2
 VALUES (DBMS_DATA_MINING.PREP_AUTO, 'ON');

COMMIT;

END;
/
select * from settings_reg2;


-- 4. 머신러닝 모델을 생성합니다. 
BEGIN
  DBMS_DATA_MINING.DROP_MODEL('MD_REG_MODEL2');
END;
/

BEGIN 

   DBMS_DATA_MINING.CREATE_MODEL(
      MODEL_NAME            => 'MD_REG_MODEL2',
      MINING_FUNCTION       => DBMS_DATA_MINING.REGRESSION,
      DATA_TABLE_NAME       => 'INSURANCE_TRAINING',
      CASE_ID_COLUMN_NAME   => 'ID',
      TARGET_COLUMN_NAME    => 'EXPENSES',
      SETTINGS_TABLE_NAME   => 'SETTINGS_REG2');
END;
/

-- 5. 생성된 머신러닝 모델을 확인합니다. 
SELECT MODEL_NAME,
          ALGORITHM,
          MINING_FUNCTION
  FROM ALL_MINING_MODELS
  WHERE MODEL_NAME = 'MD_REG_MODEL2';​


-- 6. 머신러닝 모델 구성 정보를 확인합니다. 
SELECT SETTING_NAME, SETTING_VALUE
  FROM ALL_MINING_MODEL_SETTINGS
  WHERE MODEL_NAME = 'MD_REG_MODEL2';​
** PREP_AUTO   ON <--- 러닝 레이트 같은 하이퍼 파라미터값을 오라클이 알아서 조정해줘라
    GLMS_CONF_LEVEL  .95 <---이 회귀모델의 신뢰도는 95% 라는 것 

-- 7. 회귀분석 모델의 회귀계수를 확인합니다. (이 모델의 성능지표)
SELECT ATTRIBUTE_NAME, ATTRIBUTE_VALUE, ROUND(COEFFICIENT)
  FROM TABLE (DBMS_DATA_MINING.GET_MODEL_DETAILS_GLM ('MD_REG_MODEL2'));​
나이가 일년씩 더해질때마다 의료비가 평균적으로 259달러 증가될 것으로 예상됨.
비만지수의 단위가 증가할때마다 연간 의료비가 341달러 증가될 것으로 예상됨.
자녀가 한명씩 증가될 때 마다 연간의료비가 389 달러 추가될 것으로 예상됨.
남동을 기준으로 북서는 의료바가 연간 1108달러 더 추가될 것으로 예상됨
남동을 기준으로 북서는 의료바가 연간 631달러 더 추가될 것으로 예상됨
남동을 기준으로 북서는 의료바가 연간 156달러 더 감소될 것으로 예상됨
남성은 여성에 비해서 연간 의료비가 173달라 덜 들 것 으로 예상됨
흡연자는 비흡연자에 비해서 연간 의료비가 23689달러가 더 들 것으로 예상됨.


-- 8. 예측 값을 확인합니다. 
SELECT ID, AGE, SEX, EXPENSES, 
          ROUND(PREDICTION (MD_REG_MODEL2 USING *),2) MODEL_PREDICT_RESPONSE
  FROM INSURANCE_TEST T;​
  
  
  
  # 예측값: ROUND(PREDICTION (MD_REG_MODEL2 USING *),2)

-- 9. 결정계수 R 스퀘어 값 확인합니다. 
결정계수란 이 회귀모델의 성능을 평가하는 수치
0-1사이 값으로 나타내고 1에 가까울 수록 이 회쉬모델이 설명력이 높다고 할 수 있
SELECT GLOBAL_DETAIL_NAME, ROUND(GLOBAL_DETAIL_VALUE,3)
  FROM
  TABLE(DBMS_DATA_MINING.GET_MODEL_DETAILS_GLOBAL(MODEL_NAME =>'MD_REG_MODEL2'))
  WHERE  GLOBAL_DETAIL_NAME IN ('R_SQ','ADJUSTED_R_SQUARE');​
결정계수를 1에 가깝게 (최소 0.8이상) 기계를 훈련시키는게 기계를 학습시키는 사람을 역할임. 기계를 잘 공부시키려면 좋은 학습자료를 줘야됨. 그 좋은 학습데이터가 바로 "파생변수"임
기존의 컬럼의 데이터를 가지고 새로운 컬럼을 만들어내는 것. 

문제 7. INSURANCE 테이블에 BMI30이라는 컬럼을 NUMBER(10)으로 해서 추가하시오.
alter table insurance
    add bmi30 number(10);
문제 8. bmi30에 값을 갱신하는데 bmi가 30이상이면 숫자 1로 갱신하고 30보다 작으면 0으로 값을 갱신하시오.
     update insurance
    set bmi30 = 0;
    
    update insurance
    set bmi30 = 1
    where bmi >=30;
문제 9. 다시 훈련테이블과 테스트 테이블과 모델을 전부 drop 하고 다시 생성해서 모델을 만들고 생성하시오.
  
DROP TABLE INSURANCE_TRAINING; 

CREATE TABLE INSURANCE_TRAINING
AS
   SELECT *
     FROM INSURANCE
     WHERE ID < 1114;

DROP TABLE INSURANCE_TEST;

CREATE TABLE INSURANCE_TEST
AS
   SELECT *
     FROM INSURANCE
     WHERE ID >= 1114;

-- 3. 머신러닝 모델의 환경 구성 테이블을 생성합니다. 

DROP TABLE SETTINGS_REG2;

CREATE TABLE SETTINGS_REG2
AS
SELECT *
  FROM TABLE (DBMS_DATA_MINING.GET_DEFAULT_SETTINGS)
  WHERE SETTING_NAME LIKE '%GLM%';

BEGIN

INSERT INTO SETTINGS_REG2
 VALUES (DBMS_DATA_MINING.ALGO_NAME,'ALGO_GENERALIZED_LINEAR_MODEL');

INSERT INTO SETTINGS_REG2
 VALUES (DBMS_DATA_MINING.PREP_AUTO, 'ON');

COMMIT;

END;
/

-- 4. 머신러닝 모델을 생성합니다. 

BEGIN
  DBMS_DATA_MINING.DROP_MODEL('MD_REG_MODEL2');
END;
/

BEGIN 

   DBMS_DATA_MINING.CREATE_MODEL(
      MODEL_NAME            => 'MD_REG_MODEL2',
      MINING_FUNCTION       => DBMS_DATA_MINING.REGRESSION,
      DATA_TABLE_NAME       => 'INSURANCE_TRAINING',
      CASE_ID_COLUMN_NAME   => 'ID',
      TARGET_COLUMN_NAME    => 'EXPENSES',
      SETTINGS_TABLE_NAME   => 'SETTINGS_REG2');
END;
/

-- 5. 생성된 머신러닝 모델을 확인합니다. 

SELECT MODEL_NAME,
          ALGORITHM,
          MINING_FUNCTION
  FROM ALL_MINING_MODELS
  WHERE MODEL_NAME = 'MD_REG_MODEL2';

-- 6. 머신러닝 모델 구성 정보를 확인합니다. 

SELECT SETTING_NAME, SETTING_VALUE
  FROM ALL_MINING_MODEL_SETTINGS
  WHERE MODEL_NAME = 'MD_REG_MODEL2';

-- 7. 회귀분석 모델의 회귀계수를 확인합니다. 

SELECT ATTRIBUTE_NAME, ATTRIBUTE_VALUE, ROUND(COEFFICIENT)
  FROM TABLE (DBMS_DATA_MINING.GET_MODEL_DETAILS_GLM ('MD_REG_MODEL2'));

-- 8. 예측 값을 확인합니다. 

SELECT ID, AGE, SEX, EXPENSES, 
          ROUND(PREDICTION (MD_REG_MODEL2 USING *),2) MODEL_PREDICT_RESPONSE
  FROM INSURANCE_TEST T;

-- 9. 결정계수 R 스퀘어 값 확인합니다. 

SELECT GLOBAL_DETAIL_NAME, ROUND(GLOBAL_DETAIL_VALUE,3)
  FROM
  TABLE(DBMS_DATA_MINING.GET_MODEL_DETAILS_GLOBAL(MODEL_NAME =>'MD_REG_MODEL2'))
  WHERE  GLOBAL_DETAIL_NAME IN ('R_SQ','ADJUSTED_R_SQUARE');
문제 10. insurance 테이블에 smoker_bmi30컬럼을 추가하고 흡연하면서 비만인 사람은 1로갱신하고 아니면 0으로 갱신하시오.
(담배피는 비만자는 의료비가 더 들거라고 예상할 수 있기  때문)
update insurance
    set smoker_bmi30 = 0;
    
update insurance
    set smoker_bmi30 = 1
    where bmi30 =1 and smoker = 'yes';
    
    select * from insurance;
문제 11. 다시 훈련테이블, 테스트 테이블, 모델을 drop 하고 다시 생성해서 다시 학습시키고 결정계수를 확인하시오.

R_SQ    0.863
ADJUSTED_R_SQUARE 0.862

설명:  smoker_bmi30 아리는 파생변수 추가로 인해 결정계수가 0.75 에서 0.86으로
        올라갔습니다.
문제 12. 테스트 데이터에 대해서 정답과 예측값 간의 상관계수는 얼마나 증가했는지 확인하시오.
select corr(expenses, model_predict_response)
 from  ( 
SELECT ID, AGE, SEX, EXPENSES, 
          ROUND(PREDICTION (MD_REG_MODEL2 USING *),2) MODEL_PREDICT_RESPONSE
  FROM INSURANCE_TEST T );

0.93  <--- 0.86 에서 0.93으로  상관계수가 올라갔습니다.

좋은 모델을 만들려면 좋은 파생변수를 생각해 내는 연습을 해야합니다. 

 

문제 13. 담배를 피면서 비만인 사람인 사람은 연간 의료비가 얼마나 드는지 예측하시오.
SELECT ATTRIBUTE_NAME, ATTRIBUTE_VALUE, ROUND(COEFFICIENT)
  FROM TABLE (DBMS_DATA_MINING.GET_MODEL_DETAILS_GLM ('MD_REG_MODEL2'));

               -6145
AGE                  265
BMI                  116
BMI30                 -967
CHILDREN          510
SMOKER_BMI30 19879
REGION northeast 804
REGION northwest 657
REGION southwest -505
SEX female          588
SMOKER yes        13126

비만이면서 흡연까지 하는 사람은 그렇지 않은 사람보다 연간 의료비가 19879 달러 더 들 것 으로 기계가 예상하고 있음
=> 기계를 학습 시킬때 가장 중요곤한 것이 바로 "좋은 학습 데이터"입니다.
좋은 학습데이터는 기존데이터을가지고서 만들어낸 "파생변수" 에의해 결정이됩니다.
문제 14. 지역, 지역별 평균 의료비를 출력하는데 지역별 평균 의료비가 높은것부터 출력하시오.
select region, round(avg(expenses))
    from insurance
    group by region
    order by 2 desc
;
문제 15.(파생변수 생각해내는 연습) 나이대, 나이대별 평균의료비를 출력하는데 평균의료비가 높은 것 부터 출력하시오.
  select substr(age,1,1)||'0대', round(avg(expenses))
    from insurance
    group by substr(age,1,1)||'0대'
    order by 2 desc
;  

select * from insurance;

 

 

문제 16. 흡연여부, 흡연 여부별 평균의료비를 출력하시오.
select smoker , round(avg(expenses))
    from insurance
    group by smoker;

기계 학습 후 눈여겨 봐야할 데이터 3가지
1) 결정계수
2)  테스트 데이터의 기계가 예측한 예측값 정답과의 상관계수
3) p-value (귀무가설에서 얻은 검정 통계량의 값 이상으로 대립가설에서 유리한 데이터를 얻을 수 있는 확률)
    ->   0.05 미만일 경우 유의한 변수
    -> p- value > 유의수준: 귀무가설을 기각 할 수 없다 (귀무가설 채택)
    -> p- value < 유의수준: 대립가설을 채택할 충분한 근거가 있다. (대립가설 채택)

- 귀무가설: 흡연여부는 의료비와 관련이 없다.
- 대립가설: 흡연여부는 의료비와 관련이 있다. 

SELECT ATTRIBUTE_NAME, ATTRIBUTE_VALUE, ROUND(COEFFICIENT), e.*
  FROM TABLE (DBMS_DATA_MINING.GET_MODEL_DETAILS_GLM ('MD_REG_MODEL2'))e;

e.*을 붙임으로 모든 컬럼을 싹 볼 수 있음.

설명: smoker 컬럼의 p-value가 0.05보다 한참작은 0에 가까운 숫자임. 따라서 흡연여부는 의료비와 관련이 있다라는 대립가설을 채택할 충분한 근거가 있다.

 

★ 마지막 문제) 비만이면서 흡연자는 의료비가 더 많이 드는지 다음의 귀무가설과 대무가설에 대한 해석을 하시오.
귀무가설: 비만이면서 흡연을 하는 것은 의료비와 관련이 없다.
대립가설: 비만이면서 흡연을 하는 것은 의료비와 관련이 있다.
bmi30 이상 + 흡연자 컬럼의
1)  결정계수는 0862 이므로 회귀모델의 설명력이 높다.
2)  p-value는 0.05보다 작으므로 귀무가설이 기각되므로 비만이면서 흡연을 하는 것은 의료비와 관련이 있다.