반응형



안녕하세요


오늘은 수치분석의 꽃 회귀분석에 대해 알아보도록 하겠습니다.(개인적인 생각임ㅎ)



회귀란?


유전학자 프린시스 골턴이 유전의 법칙을 연구하다가 나온 명칭으로


아버지의 키가 크다고 할지라도 아들의 키는 아들세대의 평균으로 접근하는 경향이 있다.


즉 평균으로의 회귀를 의미합니다.


회귀분석은 하나의 종속변수가 나머지 다른 독립변수들과의 어떠한 관계를 갖는가를 분석하는 방법입니다.



(기본적으로 ML에서 분류는 카테고리를 예측하는 것, 회귀는 수치 값을 예측하는 것입니다.)




회귀분석의 종류는 아래와 같이 다양합니다.






회귀 분석의 원리


회귀분석이란 회귀선을 도출하는 과정입니다.


y = ax + b (a, b: 회귀모수)


예를들어,

위의 그래프는

평수(독립변수)가 집값(종속변수)에 영향을 주는 정도를 나타낸 그래프입니다.



위의 직선의 경우


y = w1 * X + w2


여기서 잔차의 제곱의 합이 최소가 되도록 하는 최적의 선을 구하는 방법으로 최소 자승법을 이용합니다.





코드로 회귀분석에대해 더욱 자세히 알아보겠습니다.


이것은 제가 만든 미니 프로젝트 코드입니다.


주제: 첫 주의 누적관객 수가 그 영화의 흥망을 결정한다는 말이 있습니다.


이번에 그 첫 주 누적관객수에 영향을 미치는 요인을 영화 배급사가 결정할 수 있는 수치적인 요인으로 독립변수를 선택하였습니다.


종속변수: 첫 주 누적관객수

독립변수: 첫 주 누적 상영횟수, 첫 주 누적 스크린 수, 같은 날 개봉한 영화 수


data: 영화관입장권통합전산망 오픈API

################ 첫 주의 관객 수가 흥망을 결정한다. ################## ################ 첫 주 관객 수에 영향을 미치는 요인 ################## # db(mysql)에서 data 가져오기(2013-01-01 ~ 2018-06-15) library(RMySQL)


# dget() 함수는 이미 생성한 익명함수를 r로 로드하여 사용할 수 있습니다.

# 비밀번호와 주소를 감추기 위해 사용하였습니다. mysqldbConnect <- dget("mysqldbConnect.R") conn <- mysqldbConnect(dbname = "movieanalysis") c_sql <- "SELECT COUNT(*) FROM movie where openDt != ''" count <- dbGetQuery(conn, c_sql) count        # 19316

# r로 db에 있는 데이터 로드하기 r_sql <- c("SELECT * FROM movie where openDt != ''") document_r <- dbGetQuery(conn, r_sql) head(document_r)


######## 데이터 전처리 ############## # 한글이 깨지는 것을 복구하기위해 사용하였습니다. Encoding(document_r$movieNm) <-"UTF-8" head(document_r)

# 2013-01-01 이전 데이터 생략하기 document <- document_r[document_r$openDt > as.Date('2013-01-01'),] head(document) # 같은 날 개봉한 영화 수 (직접생성): sameDate document$sameDate <- '' for (i in 1:nrow(document)){ # print(j) document[i,"sameDate"] <- sum(document$openDt[i] == document$openDt) }


# normalization 등을 위해 data 전처리 str(document) document$salesAcc <- as.numeric(document$salesAcc) document$audiAcc <- as.numeric(document$audiAcc) document$audiChange <- as.numeric(document$audiChange) document$sameDate <- as.numeric(document$sameDate) document$showCnt <- as.numeric(document$showCnt) document$showRange <- substring(strptime(as.character(document$showRange), "%Y%m%d"), 1, 10) document$showRange <- as.Date(document$showRange) nrow(document) # table 정리 ncol = which(colnames(document) == "openDt") ncol1 = which(colnames(document) == "scrnCnt") ncol2 = which(colnames(document) == "sameDate") ncol3 = which(colnames(document) == "showRange")

# 개봉한지 7일 뒤의 날짜를 추가한다.

table <- cbind.data.frame(document[,-c(ncol,ncol1,ncol2,ncol3)],

"scrnCnt" = document[,ncol1],"openDate" = document[,ncol],

"sameDate" = document[,ncol2], "showRange" = document[,ncol3],

"after_7days" = (as.Date(document$openDt)+7))

# 누적 데이터 구하기 library(data.table) table <- as.data.table(table) table <- table[,Cum.showCnt := cumsum(showCnt), by = movieCd] table <- table[,Cum.rank := cumsum(rank), by = movieCd] table$scrnCnt <- as.numeric(table$scrnCnt) table <- table[,Cum.scrnCnt := cumsum(scrnCnt), by = movieCd] head(table) # 첫 주 누적관객수 및 누적데이터만 추출하기 movieWeek <- NULL for (z in 1:nrow(table)){ if (table$after_7days[z] == table$showRange[z]){ movieWeek <- rbind(table[z,],movieWeek) } } head(movieWeek)

movieWeek$openDate <- as.Date(movieWeek$openDate) movieWeek[(movieWeek$movieNm == movieWeek$movieNm) & (movieWeek$openDate <= movieWeek$showRange),]

############## 다중 회귀 분석 ############ normalize <- function(x) { return ( (x-min(x)) / (max(x) - min(x)) ) } # 정규화: 종속변수에 대한 독립변수의 영향을 파악하기위해 # 독립변수: 그 주 개봉하는 영화수, 누적 스크린 수, 누적 상영횟수 (only 수치데이터) movie_n <- as.data.frame(lapply(movieWeek[,c("Cum.scrnCnt","sameDate","Cum.showCnt")],

normalize)) head(movie_n) head(movieWeek) movieWeek_n <- cbind(movieWeek[ , -c("sameDate","Cum.showCnt","Cum.rank","Cum.scrnCnt")],

movie_n) head(movieWeek_n) # train data set과 test data set 나누기 set.seed(18)    # 여러값 중 좋은 set.seed()값 찾기 nrow <- round(dim(movieWeek_n)[1]*0.7)


# data shuffle하기 train_indx <- sample(1:dim(movieWeek_n)[1], nrow, replace = F)

movie_train <- movieWeek_n[1:train_indx,] movie_test <- movieWeek_n[(train_indx+1): nrow(movieWeek_n),] nrow(movie_train) nrow(movie_test)

# 다중회귀모델 생성하기

set.seed(1)

# 선형 모델 함수 lm()이용 library(stats)

model <-lm(audiAcc ~ (sameDate + Cum.showCnt + Cum.scrnCnt), data= movie_train) summary(model)    # r-squared(결정계수) 값 등을 확인한다.

# Adjusted R-squared: 0.79


# test data set result result <- predict(model,movie_test[,c("sameDate", "Cum.showCnt", "Cum.scrnCnt")]) str(result) result<- as.vector(result) str(movie_test$audiAcc) str(result) # 테스트 데이터의 라벨과 예측결과와 상관관계가 어떻게 되는지 확인한다. cor(result, movie_test$audiAcc) # 0.914286 : 양의 상관관계가 매우 높다.



# 어떤 독립변수가 어떤 종속변수에 영향을 많이 미치는 가?

# 시각화. pairs.panels library(psych) pairs.panels(movieWeek_n[,c("audiAcc", "Cum.showCnt", "Cum.scrnCnt", "sameDate")],

main = "첫 주 관객 수에 영향을 미치는 요인") # audiAcc와 Cum.showCnt의 상관관계는 0.88정도이다.





 




추가) 상관관계란


상관분석은 두 변수가 서로 어떠한 관계인지 파악하는 분석으로 기울기에 따라 양의 상관관계, 음의 상관관계로 나눌 수 있습니다.


점들의 흩어진 모습을 보고 두 변수의 관계를 파악하는데 밀도의 차이에 따라서 상관계수를 나타냅니다.


상관계수는 -1에서 1사이의 값을 가지며

상관계수의 수치가 0에 가까울수록 상관관계가 약하다는 뜻이고

+1에 가까우면 양의 상관관계가, -1에 가까우면 음의 상관관계가 강하다는 것을 의미합니다.



위의 코드에서 꼭 알아야하는 것!!


1. library(stats)를 이용하였다.


2. library(stats) 중 lm()함수를 이용하여 회귀분석을 하였다.


# 선형 모델 함수 lm()이용 model <-lm(audiAcc ~ (sameDate + Cum.showCnt + Cum.scrnCnt), data= movie_train) summary(model)    # r-squared(결정계수) 값 등을 확인한다.

# Adjusted R-squared: 0.79 # 독립변수가 많으면 저절로 높아질 수 있는 Multiple R-squared대신 사용

# test data set result result <- predict(model,movie_test[,c("sameDate", "Cum.showCnt", "Cum.scrnCnt")])


lm()함수를 이용하여 하나의 독립변수를 이용하면 단순회귀분석이 가능합니다!!





오늘은 여기까지!!


더 궁금하신 점은 댓글 남겨주세요~


다음은 연관규칙 알고리즘으로 돌아오겠습니다

반응형
반응형


안녕하세요!


오늘은 머신러닝의 지도학습, 분류 및 예측에 사용되는 알고리즘인


나이브 베이즈, 결정트리, 회귀 분석을 위해 필수적으로 알아야하는


확률에 대해 알아보도록 하겠습니다!



우선 확률을 이야기 하려면 어떤 사건이 발생해야 합니다.



잠깐! 여기서 사건이란 무엇일까요?


우선 확률과 관련된 용어를 알아봅시다!



어떤일이 발생하기위해 뭔가 해보는 것, 그것을 시행이라고 합니다.


예를 들어 동전을 던지는 것, 주사위를 던지는 것이 시행입니다.


단, 시행은 동일한 조건하에 행해져야 합니다.



표본공간이란 시행을 했을 때 나타나는 모든 결과를 의미합니다.


예를 들어, 주사위를 여러번 던졌을 때 1에서 6까지의 눈이 나오는 것,

그것을 모아놓은 것이 바로 표본공간입니다.



표본공간 속에서 사건이 일어납니다.


예를 들어, 주사위를 던질 때 1이 나오거나 짝수의 눈이 나오는 것을 사건이라고 합니다.



즉, 사건이란 시행을 하는 것이 아니라

시행을 했을 때 나오는 결과를 의미합니다.


따라서 사건은 표본 공간의 부분집합이 됩니다.



사건이 하나씩만 일어날 수 있는 것을 근원 사건이라고 합니다.


예를 들어, 주사위의 경우 1,2,3,4,5,6이 각각 나오는 것을 근원사건이라고 합니다.





[확률 기본]


확률은 아래와 같이 표현하며,

여기서 P는 Probability의 약자입니다.


P(A)



따라서 P(A)는 A가 일어날 사건이라고 표현합니다.




확률에도 크게 두가지 종류가 있습니다.


수학적 확률과 통계적 확률


우선, 수학적 확률이란, 수학적으로 어떤 이상적인 확률(의 결과)을 의미하는 것입니다.


예를 들어, 동전을 던졌을 때 앞면이 나올 확률을 1/2 이 되는 것입니다.



통계적 확률이란, 실제생활에서 일어나는 확률로

어떤 일을 했을 때, 어떤 일이 일어날 확률을 의미합니다.


예를 들어, 전체 30명의 학생들이 있고 이 중에 안경을 쓴 학생들이 10명이라고 했을 때,

30명 중에 어떤 한 학생이 안경을 쓰고 있을 확률은 10/30 이 되는 것입니다.



수학적 확률을 표현하는 방법


P(A)

= A사건이 일어날 원소의 갯수 / 표본공간의 원소의 갯수

= n(A) / n(S)



확률은 기본적으로 0보다 크거나 같고,

무조건 일어날 확률은 100%, 즉 1보다 작거나 같습니다.


0 <= P(A) <= 1





[조건부 확률]



확률은 결합 확률과 조건부 확률이 있습니다.


결합확률은 서로 배반되는 두 사상 A와 B가 있을 때,

두 사상이 연속적으로 또는 동시에 일어나는 확률을 의미합니다.


<결합확률 표기>


P(A ∩ B)




조건부 확률은 어떠한 상황이 주어졌을 때,

그 상황 속에서 다른 상황이 일어날 확률을 의미합니다.


<조건부확률 표기>


P(A | B)




[사건의 종류]



사건은 독립사건과 종속사건으로 나뉩니다.


독립사건이란, 두개의 사건이 일어났는데

두 사건이 전혀 연관되지 않았다면 독립사건입니다.


<독립사건 표기>


P(A | B) = P(A)




종속사건이란, 사건B가 일어났을 경우와 일어나지 않았을 경우에 따라,

사건 A가 일어날 확률이 다를 때 (즉, B의 영향을 받는 경우를 의미)

A는 B의 종속사건이라고 합니다.


예를 들어, 비가 오면 우산이 팔릴 확률이 높아지는 것은

두 사건의 관계가 종속 관계라는 것을 의미합니다.


<종속사건 표기>


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




오늘은 여기까지!


다음 포스팅할


나이브 베이즈 이론과 결정트리, 회귀분석에서


이를 활용하는 방법에 대해 같이 포스팅하도록 하겠습니다!



내용 출처: 그림으로 설명하는 개념 쏙쏙 통계학

EBS 고교강의 친절한 하영쌤의 수학

반응형

+ Recent posts