일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 회귀분석
- Intersect
- 데이터분석
- sqld
- 총과 카드만들기
- 정보획득량
- difftime
- 불순도제거
- 빅데이터분석
- 히스토그램 그리기
- %in%
- 순위출력
- sql
- loop 문
- merge
- 회귀분석 알고리즘
- 단순회귀 분석
- 막대그래프
- 여러 데이터 검색
- Sum
- 그래프 생성 문법
- if문 작성법
- 그래프시각화
- 빅데이터
- 상관관계
- 데이터분석가
- Dense_Rank
- count
- 팀스파르타
- max
- Today
- Total
ch0nny_log
[빅데이터분석] SQL_TIL 16(CREATE TEMPORARY TABLE, view, 테이블 컬럼 추가, 삭제, 변경하기.) 본문
[빅데이터분석] 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길이가 엄청 길다. 그러다보니 임시 테이블로 그 데이터를 저장함.
- 지금 잠깐 볼 데이터고 영구히 저장할 필요 없는 데이터의 경우 나중에 필요없는 테이블도 함부로 drop 하기 부담됨.
임시 테이블 종류 1. 영구히 데이터를 저장 할 수 있는 테이블 heap table 2. 임시로 저장할 수 있는 테이블 temporary table
- 임시 테이블은 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. 머신러닝 모델 구성 정보를 확인합니다.
** PREP_AUTO ON <--- 러닝 레이트 같은 하이퍼 파라미터값을 오라클이 알아서 조정해줘라SELECT SETTING_NAME, SETTING_VALUE FROM ALL_MINING_MODEL_SETTINGS WHERE MODEL_NAME = 'MD_REG_MODEL2';
GLMS_CONF_LEVEL .95 <---이 회귀모델의 신뢰도는 95% 라는 것
-- 7. 회귀분석 모델의 회귀계수를 확인합니다. (이 모델의 성능지표)
나이가 일년씩 더해질때마다 의료비가 평균적으로 259달러 증가될 것으로 예상됨.SELECT ATTRIBUTE_NAME, ATTRIBUTE_VALUE, ROUND(COEFFICIENT) FROM TABLE (DBMS_DATA_MINING.GET_MODEL_DETAILS_GLM ('MD_REG_MODEL2'));
비만지수의 단위가 증가할때마다 연간 의료비가 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에 가까울 수록 이 회쉬모델이 설명력이 높다고 할 수 있
결정계수를 1에 가깝게 (최소 0.8이상) 기계를 훈련시키는게 기계를 학습시키는 사람을 역할임. 기계를 잘 공부시키려면 좋은 학습자료를 줘야됨. 그 좋은 학습데이터가 바로 "파생변수"임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');
기존의 컬럼의 데이터를 가지고 새로운 컬럼을 만들어내는 것.
문제 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보다 작으므로 귀무가설이 기각되므로 비만이면서 흡연을 하는 것은 의료비와 관련이 있다.