# 최종 분석 프로젝트 제작 기간 (19.06.20 ~ 19.06.30) 10일

# 최종 분석 프로젝트 발표 : 19.07.01

# 주제 : KAGGLE 주택 가격 예측

 

@ 표지, 목차

@ 데이터 전처리

데이터 전처리에 앞서 이 분석의 최종 목표는 왼쪽의 다양한 독립변수들로

종속변수인 주택가격을 더 정확하게 예측하는것 입니다

데이터 모델을 만들 TRAIN데이터와 값을 예측하기위한 TEST데이터 파일로 나누어져 있습니다.

TRAIN 데이터는 80개의 독립변수와 1개의 종속변수로 이루어져 있고

TEST는 종속변수가 없어 80개의 독립변수만으로 이루어져 있습니다.

데이터를 전처리하기 전에 TRAIN데이터와 TEST데이터를 합쳐 T_DATA라는 변수로 만들었습니다.

다음은 결측값이 있는 변수들은 나타낸 표와 그래프 입니다.

각 변수 특성에 맞도록 결측값을 대체하기 위해 시간을 많이 소요했던 구간입니다.

먼저 종속변수인 SalePrice 데이터가 왼쪽으로 편향되어 있어 로그변환을 통해 정규화를 시켜 주었습니다.

다음은 lotfrontage와 neighborhood의 변수의 처리과정입니다.

lotfrontage의 뜻은 집에서 근처 지역 및 건물까지의 거리이고, neighborhood의 뜻은 근처 지역 및 건물을 의미합니다.

다시말하면 lotfrontage는 집에서 neighborhood까지의 거리라고 볼 수 있습니다.

저희는 lotfrontage의 결측값을 무엇으로 채워야 할지 고민을 하다.

오른쪽의 상자 그래프 처럼 neighborhood의 각 요소들 별 이상치들이 많은 것을 보고

neighborhood의 중앙값으로 결측값을 대체하는 것이 좋다고 판단했습니다.

다음 변수들에 대해서는 결측치를 0으로 대체하였습니다.

그 이유는 각 요소들의 변수 설명을 보면 석조 베니어가 없는 주택들이 결측치로 되어있습니다.

또한 차고가 없는 주택들도 결측치로 되어있어 결측치는 0이 맞다고 판단하였습니다.

다음은 서열형 변수들의 결측치 처리 과정입니다.

각 변수들의 요소이름을 뽑아서 먼저 팩터형태로 바꾸고 다시 수치형으로 바꾼다음

서열화해서 NA를 제일 작은 값으로 대체를 하였습니다.

변수들 중 Utilities변수는 위와 같이 1개의 데이터만 다른 값으로 나와

영향력이 없을 것이라 판단하여 제거 하였습니다.

그 다음 변수들의 결측값들을 최빈값으로 대체하였습니다.

전기 시스템같은 경우 보통 주택에 전기를 사용하지 않는 주택은 없기 때문에

최빈값으로 대체 하는 것이 맞다고 판단하였습니다.

다음은 범주형 변수들에 대한 더미화를 하였습니다.

더미화는 각 변수의 요소들을 범주형 변수로는 사용할 수 없고

연속형 변수로만 가능한 분석기법을 사용하기 위해서 범주형 변수들을 수치화로 더미화 시켰습니다.

다음은 수치형 변수들에 대한 정규화를 했습니다.

위에 표는 수치형 변수들중 절대값 편향성이 0.75가 넘는 변수들만 뽑았습니다.

이 변수들에 대해 람다 값을 0.15만큼 주어 대부분의 데이터가 정규화되도록 만들었습니다.

물론 몇몇 데이터가 잘 바뀌지 않았지만 여러번 해서 실행을 해봤을때 0.15가 적합하다고 판단하여

처리하게 되었습니다.

이제 다음 과정에서 소개할 모델들을 만들기 위해서

앞서 했던 모든 데이터 전처리 과정을 통해 나온 결과물을 다시 처음 상태였던

train데이터와 test데이터 셋으로 나누었습니다.

train데이터를 통해 모델을 만들고 test의 종속변수를 예측하는 과정을 소개해드리겠습니다.

 

@ 모델 소개

모델 소개에 앞서 만들었던 train 데이터를 또 한번 7:3 비율로 만들었습니다.

그 이유는 앞서 보았듯이 test에 대한 종속변수가 없어 예측력을 측정을 할 수 없었기 때문입니다.

그래서 train데이터의 7의 데이터로 3을 예측할 때

RMSE 평균 제곱근 오차가 최소가 되는 모델들을 찾고자 여러 분석 모델들을 사용해 보았고

총 3개의 모델들을 최종적으로 골라서 앙상블을 진행하였습니다.

첫번째 모델은 LASSO라는 모델로 선형 회귀분석 방법이며

다수의 독립변수가 있는 데이터 분석에 적합하여 선택하게 되었습니다.

직역하자면 회귀분석을 하게 되면 각 변수에 오차가 생기는데

그 오차의 절대값이 최소가 되게 하는 변수 선택법이라고 말할 수 있습니다.

다음 그래프의 X축을 보면 함수 내에서 자체적으로 lambda값을 미세하게 주면서

RMSE가 최소로 나오는 값을 선택하게 됩니다.

컴퓨터는 왼쪽선의 lamda값을 선택하면서 총 220개의 독립변수 중 64개의 변수를 선택하여

회귀분석을 자동으로 진행하였습니다.

위의 lambda.min으로 모델을 만들게 되면 RMSE가 밑에 값과 같이 나오게 됩니다.

중간의 1se라는 람다값은 최소값에 대해서 1 – 편차오류 룰이 적용된 lambda값 입니다.

두 값 모두 각각 넣어봤지만 lamda.min값이 예측력이 더 좋게 나와 사용했습니다.

두번째로 사용한 모델은 그라디안 부스팅 머신 입니다.

그라디안 부스팅 머신은 의사결정나무를 여러 개 만든 뒤 각각 나무에 대한 예측력을 측정하고

약한 모델에는 패널티를 주어 강한 모델을 만드는 분석방법입니다.

다음 그래프는 나무의 개수가 증가하면서 나타나는 RMSE를 나무의 깊이 별로 나타낸 그래프 입니다.

컴퓨터는 자동적으로 튜닝을하여 가장 좋게 나온 튜닝값으로는

나무의 개수는 200개, 나무의 깊이는 5로 측정되어 진행하였습니다.

이때 나오는 RMSE는 0.1289491 값이 나왔습니다

세번째 모델은 xgb로 두번째 모델이었던 그라디안 부스팅의 상위 버전 입니다.

그라디안 부스팅과 비슷한 면이 있지만 더 빠르고 좀 더 예측력 좋은 모델입니다.

다음 그래프는 반복횟수가 증가하면서 나타나는 rmse를 학습률 별로 나눈 그래프 입니다.

학습률은 높을 수록 과소적합 위험이 있고 낮을 수록 과대적합 위험이 있습니다.

일정한 범위 내에서 튜닝값을 돌려보니 학습률은 0.01이 가장 적당하다고 측정되어 사용 하였습니다.

다음은 3개의 모델을 결합하는 방식입니다.

밑에 실패 사례에서 소개 해드리겠지만 RMSE를 통한 예측값에 가중치를 주어 최종 예측치를 나타내었습니다.

여러 가중치를 시도하여 최종적으로 나온 가중치는 라소에 0.6, 그라디안에 0.16, xgb에 0.24를 주었습니다.

최종 결과값은 이전 전처리 과정에서 종속변수에 로그변환을 해주었기 때문에

역 로그 변환을 하여 최종 주택 가격 예측값을 출력하여 kaggle에 제출하였습니다.

밑에 보이는 캡쳐는 위의 결과로 얻은 순위이며 약 4600개의 팀중에 1085위를 달성하였습니다.

 

@ 실패 사례

다음은 프로젝트를 진행 하면서 겪은 실패 사례 3개를 보여드리겠습니다.

첫번째 실패 사례로는 모델들을 만들고 앙상블을 사용하는 과정에서 나타난 실패 사례입니다.

밑에 단순 앙상블은 앞서 각각의 모델들을 통해 도출해낸 RMSE를 비율화 시켜 결과 값에 가중치를 부여한 것입니다.

위에 앙상블은 약간의 파라미터 값들을 주어 시도해본 앙상블 함수 입니다.

원래 계획은 위에 있는 파라미터들을 조정하여 더 좋은 앙상블 모델을 만들고 싶었지만

단순 앙상블보다 더 좋은 결과값을 얻지 못하여 단순 앙상블을 쓰게 되었습니다.

두번째 실패 사례 입니다.

몇몇 모델들을 만들기 위해서는 범주형태의 데이터는 더미화를 시켜주어야만 했습니다.

변수들이 너무 많아 처음에는 방법을 몰라 왼쪽처럼 변수를 일일이 작성하였습니다.

하지만 분석 도중 여러 값들을 조정함에 있어서 불편함을 느꼈고

몇 가지 규칙성을 통해 반복문과 조건문으로 더미화를 간략화 하였습니다.

세번째 실패 사례입니다.

수치형 변수들 또한 여러 문제가 있었습니다.

일단 각각 결측값들이 너무 많았고 이러한 결측값들을 처음에는 각 변수들의 특성을 몰라

0 또는 평균으로 대체했었습니다.

결과적으로 RMSE가 너무 높게 나오는 것을 확인하였고

다시 한번 각 변수들의 설명을 확인하고 각각 변수의 결측값들을 특성에 맞도록 대체하였습니다.

# 기획 기간 (19.06.10 ~ 19.06.19) 9일

# 기획안 발표 : 19.06.20

# 주제 : KAGGLE 주택 가격 예측

 

@ 표지, 목차

@ 주제 소개

이번 분석 프로젝트에서는 Kaggle이라는 예측 모델 및 분석 대회 플랫폼에서 진행되고 있는 대회 중

주택 가격 예측 이라는 대회에 참여하여 진행하려고 합니다.

기본적으로 주어지는 데이터는 Train데이터와 Test데이터로

Train데이를 가지고 예측 모델을 만들어

Test데이터의 종속변수를 얼마나 예측할 수 있는지를 경쟁하는 대회입니다.

이 대회는 고급 회귀 기법을 사용하여 예측 값을 도출해내야하고

그 예측력으로 얻어진 점수를 실시간 리더보드를 통해 순위를 확인 할 수 있습니다.

데이터 셋으로는 총 79개의 범주형 수치형 등이 섞여있는 독립 변수와

주택 가격인 SalePrice 종속 변수로 이루어져 있습니다.

본격적인 데이터 분석에 앞서

간단하게 수치형 독립변수들을 가지고 단순히 상관계수가 높은 독립변수만 뽑아

회귀분석을 진행해 보았습니다.

단순히 돌려본 회귀분석을 통해 알아낸 바로는

회귀 모델이 유의하고 결정계수가 높긴 하나

전처리도 안했을 뿐더러 수치형으로 되있으나

데이터 설명으론 범주형인 데이터들도 있었습니다.

위와 더불어 다른 여러가지 변수특성들을 고려해가면서

분석을 진행 할 예정이고

데이터 셋의 전처리를 먼저 진행 할 계획입니다.

# 최종 웹 프로젝트 제작 기간 (19.04.22 ~ 19.05.01) 9일

# 최종 웹 프로젝트 발표 : 19.05.02

# 주제 : 블랙잭 게임 프로그래밍

 

@ 표지, 목차

@ 특징 소개

블랙잭 게임 특성상 사행성이라는 이미지를 없애기 위해

배팅 기능을 없애고 다른 기능을 구상해 보았습니다.

기본적인 게임으론 다소 재미가 떨어져

승부욕을 자극하기 위해 연승기록 기능을 추가 하게 되었습니다.

 

@ 시연

실시간 플레이는 실제 발표 중에 진행하였습니다.

실제 플레이 화면을 예시로 스크린샷을 보여드리겠습니다.

실제 웹 상에서는 Hit버튼을 누르면 카드가 위에서 차례대로 날라오고

딜러 카드 한장을 뒤집혀 진채로 날라옵니다.

모든 카드들은 랜덤이며

다음 스크린샷은 여러 결과들을 보여드리기 위해

엄청 나오기 희박한 결과물들을 보여드립니다.

@ 구조 및 알고리즘

웹 상에 게임 버튼은 총 3개로

Share 버튼을 누르게 되면 딜러 두장 플레이어 두장 카드를 나눠주며 게임을 시작하게 되고

플레이어가 Hit버튼을 누를 때 마다 한장씩 추가로 받게 됩니다.

만약 플레이어의 현재 카드가 21이 넘지 않는다는 조건 하에 Stand 버튼을 누르게 되면

자동적으로 딜러는 17이상이 될때까지 카드를 받게 되고

최종적으로 숫자를 비교하여 웹상 가운데 결과를 보여주게 됩니다.

먼저 웹이 작동 되면 52장의 카드 중 게임에 사용할 16장의 카드를 뽑아 페이지 상 안보이는 공간에 불러옵니다.

다음 캡쳐는 카드를 셔플하는 알고리즘과 Share버튼을 눌렀을 때 보여지는 애니메이션 코드입니다.

다음은 HIT 버튼의 알고리즘입니다.

HIT버튼을 누를때마다 자동적으로 숫자가 계산되며

빨간색 줄로 표시 된 곳은

뽑은 카드 중 ACE를 1로 계산할지 11로 계산 할지

판별해주는 알고리즘입니다.

기본적으로 ACE는 11로 계산 하되 자신의 카드가 21이 넘어갈 시

만약 자신의 카드 숫자 값중 11이라는 존재 한다면 그 갯수 만큼 10을 빼는 구조 입니다.

다음은 STAND 버튼 알고리즘입니다.

STAND버튼을 누르면 게임이 종료 되면서 자동적으로 딜러 카드가 17이상이 될때까지 뽑아야하기 때문에

HIT버튼과 ACE 판별하는 알고리즘은 비슷하지만

계산 부분은 다른것을 확인 할 수 있습니다.

다음은 SHARE 버튼으로 현재 연승 횟수를 다음 페이지로 넘기는 알고리즘을 가지고 있습니다.

다음은 게임의 승패 결과를 판별해내는 알고리즘입니다.

위의 승패 판별결과로 딜러가 승리하게 되면 자동적으로 프롬프트창을 띄워 플레이어의 ID를 받도록 만들었습니다.

이 때 연승횟수가 0회일 때를 제외하도록 만들었습니다.

 

@ 실패사례

다음은 실폐사례로

처음 의도는 연승 횟수가 1승 이상일 때만 프롬프트 창이 뜨게 하려고 했습니다.

하지만 0승인 상태에도 계속해서 프롬프트 창이 뜨는 문제가 발생하게 되었습니다.

이러한 문제들을 계속해서 공부한 결과 논리 구조를 변경하여 간단하게 해결 할 수 있었습니다.

문제를 해결하여 더이상 0승 일때는 프롬프트 창이 뜨지 않게 되었습니다.

다음 실패 사례는 ID 중복 문제 입니다.

만약 플레이어가 자신의 기록을 갱신할 경우

같은 ID로 기입하면 다음과 같이 같은 ID로 기록창에 나타나는 현상이 있었습니다.

다음 문제의 해결 방안으로는

애초에 데이터 베이스에서 데이터를 가져올 때

ID를 그룹으로 묶어 가장 높은 연승 횟수만 가져오도록 만들었습니다.

다음 실패 사례는 카드 분배 효과 표현입니다.

처음에 모든 기능은 작동했지만

마지막으로 카드가 날라오는 듯한 표현을 해주기 위해

애니메이션을 넣으려고 했습니다.

ppt 발표 상으로는 카드가 날라가는 효과를 애니메이션으로 표현하였습니다.

이러한 애니메이션 효과를 웹에서 나타내기 위해 날라오는 카드들에 각자 딜레이를 주어

마치 딜러가 한장한장 나눠주는 효과를 나타내었습니다.

# 기획 기간 (19.04.15 ~ 19.04.21) 6일

# 기획안 발표 : 19.04.22

# 주제 : 블랙잭 게임 프로그래밍

 

@ 표지, 목차

 

@ 블랙잭 소개

블랙잭은 카지노에서 가장 점유율이 높고 딜러가 승률이 높은 게임 중 하나 입니다.

블랙잭 게임 특성 상 딜러 혼자서 최대 8인의 플레이어를 상대 할 수 있어 카지노에서 좋아하는 게임입니다.

이번에 만들 프로젝트는 1대 다수가 아닌 컴퓨터가 딜러로 플레이어와 1:1 게임을 할 수 있는

게임 웹페이지를 만들 계획입니다.

블랙잭의 간단한 룰 소개를 하자면

1또는 11로 계산 되는 ACE카드

2~9까지의 카드

10으로 계산 되는 10, J, Q, K카드

4개의 문양들로 총 52장의 카드들로 진행합니다.

점수 계산은 다음과 같이 단순한 덧셈으로 이루어 지며 카드 합이 21에 가까울수록 더 좋은 카드입니다.

만약 21이 넘게 되면 무조건 지게 되므로 조심해야 합니다.

간단한 예시를 보여드리겠습니다.

처음 두장을 뽑으면 14인 상태인데 여기서 한장을 더 받으면 18이 되어 약간 높은 카드가 됩니다.

만약 여기서 플레이어가 욕심을 내어 한장을 더 받게 된다면 다음과 같이 21이 넘게 되어 승부에 상관없이 죽게 됩니다.

조금 더 어려운 예시로 보여드리자면

처음 두장을 ACE카드를 포함해서 받아 계산하면 20이 되지만

다음 카드를 받게 되면 ACE카드는 1로 계산되어 14가 되는 경우 입니다.

 

@ 웹 디자인

다음은 웹 페이지 구상 디자인 입니다.

다음과 같이 딜러와 플레이어 영역으로 나누고 카드를 받을지 그만둘지 버튼을 만들어 볼 계획입니다.

처음 게임을 시작하면

딜러는 한장을 뒤집은 채로 두장을 받고

플레이어는 두 장 모두 오픈 된 채로 받게 됩니다.

이때 Hit버튼을 누를 때 마다 한장씩 더 받게 됩니다.

만약 플레이어가 Stand를 누르면 게임이 종료 되고 딜러는 17 이상이 될 때까지 뽑습니다.

그리고 서로 점수를 계산하여 다음과 같이 결과를 나타내려 합니다.

뿐만아니라 게임 옆에 점수판도 만들어 연승기록들을 원하는 ID로 데이터베이스로 나타내려 합니다.

연승을 하다가 딜러에게 지면 다음과 같이 프롬프트 창을 통해 플레이어의 ID를 받아

데이터베이스에 전송할 예정입니다.

페이지 오른쪽 하단에는 다음과 같이 버튼을 만들어 Admin 페이지도 만들 예정입니다.

어드민 페이지를 누르게 되면 다음과 같이 어드민 페스워드 창이 나타나고 맞는 패스워드를 입력해야

어드민 페이지로 넘어가게 할 예정입니다.

어드민 페이지에서는 점수판에 나타나던 모든 기록들을 수정, 삭제 할 수 있도록 만들 예정입니다.

 

 

+ Recent posts