1. 왜 '그로스 해킹' (Growth Hacking)이었나


2015년


잘 다니던 학부를 쉬고 열씸히 키우던 스타트업에서

꽂혔던 개념이다. 창업가로 유명한 김동신씨가 학교 강의에서 우연히 소개해주셨던 개념.

그로스해킹.


돈도 얼마 없는 스타트업에서 돈도 안쓰고

마케팅효과를 폭발적으로 누릴 수 있다고 하니 얼마나 개이득인가.

직무명도 나름 fancy하고 그 당시 SQL로 데이터를 뽑는 재미를 느끼던 때인지라

나 이거하겠다고 하고 맨땅에 계란치기 했던 적이 있다.


근데 이게 도대체 뭘까? 그로스해킹.


당연히 모든 마케팅의 목적은 ROI의 극대화고

데이터를 본다는 것만 다르면 데이터 보는 마케터랑 다를게 없는거 같고

그러면 기획도 조금 기웃거리는 마케터 정도인가 싶고

링크드인에서 해당 키워드로 보니 누구는 SEO하는 사람 누구는 그냥 개발자출신 기획자, PM이고.


개념이 뜨기 시작한 원류를 찾아 올라가보면, 라이언 홀리데이라는 아메리칸 어패럴의 걸출한 마케터가 전통적인 마케팅은 죽었다며 열심히 까며 들고 나온 PDF 파일에서 부터였다.



당시 열광하며 읽었던 영어 원문.

국내에서는 고영혁씨가 번역한 책이 있다.


 근데, 원전을 읽어보아도 헷갈리긴 마찬가지였다.  핫메일의 메일 끝에 문구를 하나 추가해서 폭발적인 성장을 이루었던 케이스라던가, 링크드인에서 메일을 세번째에 넣으면 폭발적으로 성장한다던가 하는 오오.. 싶은 사례들은 많이 나오는데, 정작 그럼 어떻게(How)? 그렇게 하는데 하는 질문에는 명확한 대답이 딱히 없다. 


그래 알겠어 좋은건. 

근데 그럼 어떻게 하면 되는데?


 고영혁씨가 번역한 국내판을 보아도 상황은 비슷한데, 맨 뒤쪽의 요기요나 위즈돔의 사례를 살펴보아도, 1) 데이터를 통해서 2) 가설을 세우고 3) 지속적인 개선을 해요~ 정도가 시사하는 바의 대부분 이었던거 같다. 이쯤되니, 실리콘벨리의 유명한 VC인 폴 그레이엄 (Paul Graham)이 했던 말이 수긍이 된다. "그로스해킹이란 말을 들으면 그냥 이렇게 해석하면 된다. Bull shit."


 그러면 그로스해킹은 의미가 없는 것이었을까? 그렇다고 대답하기엔 내 지난 1년이 너무나도 허무해지지만.. 지금와서의 내 대답은 반은 YES, 하지만 반은 NO이다. 분명히 어떤 개념이 뜨게되면, 그 이면에는 Pain point가 존재했다고 생각하는데, 내 판단은, 마케터들의 제품 기획단에 대한 Pain point가 가장 큰 부분이 아니었을까 싶다.



 제품 기획 --> 생산 -->  .....[수 많은 과정들].. --> 마케팅



우리가 아는 대부분의 제품 생산 플로우는 이렇고 아이티 서비스라고 뭐가 다르지는 않다. 마케터에게 변하지 않는 조건중 하나는, 제품을 변형할 수 없다는 것일 것이다. 그런데, 마케팅이라는건 제품을 단지 홍보하고 잘 타게팅하고 잘 알리고 소구하는 것만을 의미하지는 않는다. 적어도 난 그렇다고 믿는다. 제품이 만들어지는 시점부터 이용자와 고객의 니즈를 제품의 기능에 담을 때에야 마케팅 단에서 제대로 된 타게팅 뿐만 아니라 같은 마케팅 전략당 전환율도 훨씬 좋아질 것이다.


 아쉽게도 지금까지의 산업계에서는 이런 과정이 매우 힘들었을 것이다 왜냐면 제품생산주기가 적어도 수개월에서 많게는 몇년까지도 걸렸을 테니까. 하지만, 아이티로 넘어오면서 이런 상황은 개선되기 시작했다. 특히 스타트업에서는 더. 

 빠르게는 그날 만든 기획안이 다음날 릴리즈되고 그날 저녁에 이용자의 피드백을 실시간으로 받는 상황에서 더이상 마케팅과 기획은 나눠지는 대상이 아니었다. 아이티의 특성상 전파속도가 매우 빠르기 때문에 기존에 매스채널을 통해 고민하던 확산력 자체는 문제가 더 이상 안되었고 마케팅이란 개념은 결국 본질로 돌아오게 되었다. 좋은 제품. 좋은 서비스.


 

아마존이 생각하는 성장의 조건



 결국 돈도 없고 시간은 더 없는 스타트업에게 그로스해킹이란, 1) 좋은 제품을 만들고 2) 돈 안쓰고 사람들 한테 알리는 것이지 않았을까 한다. 그런데, 이제와 생각해보니 2번을 가능케 했던 것이 '소셜네트워크'였구나 싶다.



2. 가장 좋은 마케팅 채널은 '소셜 네트워크'


 당시에 이것 저것 시도해봤던 것 중 가장 효과가 좋았던 것이 '친구추천' 프로모션이었다. 그냥 좋은 정도가 아니라 다른거랑 거의 몇십배, 크게는 몇백배까지 ROI가 차이가 났다.  이게 너무 좋았던게, 마케팅을 하기 위해 돈을 쓰는 것도 아니고, 실제로 이렇게 유입되는 사람들을 추적해서 들어가보면 구매전환율이나 ARPU 같은게 Pay 마케팅 채널로 들어온 유져들과 넘사로 차이가 난다.


 실제로 해외 스타트업들을 살펴보면, Airbnb나 Fiverr같은 유명 스타트업에는 기본으로 장착되어있는 프로모션 기능이다. (심지어 컬러까지 넣어준다..!) 아마 찾아보면 모르긴 몰라도 더 있을거다. 유료 채널에 마케팅비 쏟아 넣으면서 확실하지도 않을 바에야, 에라이 우리 유져한테 돈 주고 우리 서비스 내에서 돈이나 돌게하자! 정도의 심산이었을 것 같은데, 이게 대박을 쳤었을거 같다. 


 당시에는 오오 대박인데 하면서 그냥 서비스에 부착하기 바빴고, 핑계겠지만 제대로 왜 이게 잘먹히는지는 고민할 시간이 없었다.




 대학교 졸업장은 따긴 따야될거 같아서 학교로 돌아갔고, 다시 평범한 시간을 보내다가 다시 우연한 기회에 들어갔던 스타트업에서 이 때의 고민이 다시 떠올랐다. 비슷한 추천인 프로모션을 진행하는 것을 옆에서 지켜봤었는데 이에 대한 결과를 보기 위해 연결망 지도를 쫙! 하고 그리니, 사기꾼들은 사회의 연결망에서 벗어난 섬같은 모양을 하고 있었던 것이다.


networkD3를 통해 시각화 해본 '레미제라블'의 인물 관계도처럼

모든 일에는 네트워크가 존재한다.



 그냥 우연히 그럤던거 아니야? 하고 넘어가기엔 이런 네트워크망은 학계에서도 "네트워크 과학 연구"라는 이름으로 급물살을 타고있다. 세상 모든 일에는 네트워크가 존재하기 때문에, 이제는 "네트워크가 진짜 존재해?"라는 질문이 아닌 "뭐가 점이고, 뭐가 선이지? 어디가 허브야?"라는 질문이 더 적절하다는 말이다.


https://www.youtube.com/watch?v=gmvjVXCE6cw


 그렇다면 이제 이해가 된다. 그로스해킹과 IT 마케팅의 핵심은 결국 이 네트워크의 허브에 있는 사람들에게 알리고, 그 사람들이 만족할만한 서비스와 제품을 만드는 일로 치환되는 것이었다.



3. 그로스해킹이 남긴 것


 그로스해킹 게시판 섹션은 그래서 이제 더 쓸 글이 없어졌다. 일을 한지도 꽤 되어서 그럴싸하게 들려드릴 수 있는 이야기도 없거니와, 지금은 대학 졸업을 목전에 앞둔 취업준비생의 한명이라 시간이 없기 때문이기도 하다. (게다가 섹션만 만들어놓고 제대로 쓴 글도 몇개 없다)


 고백하건데, 최근에 잠시 이 때 그로스해킹! 이라는 목표를 잡고 고민했던 것을 후회했던 적이 있다. 국내에는 알려지지도 않았을 뿐더러, 직업군 목표로 삼기에는 너무 모호했던 것을 이제와 인정했기 때문이다.


 하지만 그로스해킹이 내게 남겨준 것은 Data에 대한 중요성을 깨우쳐 준 것이 아닐까 싶다. 오프라인과는 달리 온라인은 성과가 비가시적이어서 데이터를 통해 우리가 얼마나 잘했지?를 알아내는 것이 매우 중요했다. SQL을 개발자 형들 옆에서 기웃거리며 배웠던 것도, GA를 외국 사이트를 찾아다니며 낑낑대고 봤던 것도 다 그런 맥락이었을 것이라 생각이 든다. 


 데이터 분석가를 지망하고 있는 지금의 모습도 그런 노력들이 계속되고 계속해서 최선을 찾아나가는 과정 속에 있다고 믿고 싶다. 뚝심이 부족하여 여기저기 기웃대다 보니 시간이 너무 많이 흘렀고, 이제와서야 R과 SQL, Python 같은 언어를 다시 익히고, 통계의 기본 원리들을 다시보며 매일같이 좌절하고 있다. 하지만 여전히 데이터를 본다는 것이 나중에 서비스를 성장시키고 문제를 해결하는 데에 얼마나 중요한지 깨닫게 되었기 때문에 이 과정을 버티고자 하는 마음을 새롭게 먹게 된다고 생각한다.


 이 블로그에서 그로스해킹 이라는 fancy한 내용은 더 이상 다루지 않겠지만, 주니어 데이터 분석가로 성장해 나가는 과정에서 응원을 부탁드린다.












반응형

'모조리 기획해주마 > 모조리 GrowthHacking' 카테고리의 다른 글

12.27 - 그로쓰 해킹 종결자, 인앤아웃버거  (0) 2015.12.27
9.29 (2)  (0) 2015.09.29
9.29  (0) 2015.09.29
Posted by JoeSung
,


[결과물]





[코드]


building.csv



install.packages(c("arules", "arulesViz", "visNetwork", "igraph" ))

library(arules) ## 연관관계 분석을 위한 aprior() 를 쓰기 위함

library(arulesViz) ## 시각화에 필요

library(visNetwork) ## 시각화 중 네트워크 표현에 필요

library(igraph) ## 시각화 결과물을 인터렉티브(움직이게) 해줌

 작업에 필요한 라이브러리를 설치하고 불러옵니다.


## 파일 로드

bui <- read.csv("building.csv", header = T)

head(bui, 3)


## NA 처리 

bui[is.na(bui)] <- 0

trans <- bui


#데이터 정제

roname <- bui[ , 1]

trans <- bui[, -1]

trans <- as.matrix(trans, "Transaction")

rownames(trans) <- roname


# 모델링

rules <- apriori(trans, parameter = list(supp = 0.001, conf = 0.6, target = "rules"))

rules


# 결과 출력

inspect(sort(rules))


 연관관계 모델링 및 결과 출력을 위한 코드입니다.


     lhs                                        rhs              support confidence lift    

[1]  {일반음식점}                            => {패밀리레스토랑} 0.40    1.0000000  2.222222

[2]  {패밀리레스토랑}                        => {일반음식점}     0.40    0.8888889  2.222222

[3]  {약국}                                  => {휴대폰매장}     0.25    1.0000000  3.333333

[4]  {휴대폰매장}                            => {약국}           0.25    0.8333333  3.333333

[5]  {약국}                                  => {병원}           0.25    1.0000000  3.333333

[6]  {병원}                                  => {약국}           0.25    0.8333333  3.333333

[7]  {휴대폰매장}                            => {병원}           0.25    0.8333333  2.777778

[8]  {병원}                                  => {휴대폰매장}     0.25    0.8333333  2.777778

[9]  {편의점}                                => {일반음식점}     0.25    1.0000000  2.500000

[10] {일반음식점}                            => {편의점}         0.25    0.6250000  2.500000

* 야매 개념 소개

  - Support : 지지도, 두 사건이 동시에 일어날 확률

  - Confidence : 신뢰도, 한 사건이 일어났을 때 다른 사건에 영향을 미치는 정도

  - Lift : 리프트, 상관관계와 유사한 개념.



## 시각화

subrules2 <- head(sort(rules, by="lift"), 20) ## lift 기준으로 상위 20개만을 시각화


ig <- plot( subrules2, method="graph", control=list(type="items") )


# saveAsGraph seems to render bad DOT for this case

tf <- tempfile( )

saveAsGraph( subrules2, file = tf, format = "dot" )

# clean up temp file if desired

#unlink(tf)







# 인터렉티브 코드

ig_df <- get.data.frame( ig, what = "both" )

visNetwork(

  nodes = data.frame(

    id = ig_df$vertices$name

    ,value = ig_df$vertices$support # could change to lift or confidence

    ,title = ifelse(ig_df$vertices$label == "",ig_df$vertices$name, ig_df$vertices$label)

    ,ig_df$vertices

  )

  , edges = ig_df$edges

) %>%

  visEdges(  ig_df$edges ) %>%

  visOptions( highlightNearest = T )





## 참고(Reference)

R visualization of arules with arulesViz + igraph + visNetwork


반응형
Posted by JoeSung
,

 -앙상블 (Ensemble) 기법 중 배깅(Bagging) 기법 원리 이해하기 :: R 모조리 정복하기


 이번 포스팅에서는 머신러닝의 모델링 기법중 하나인 앙상블, 그 중에서도 가장 기본적인 방법인 배깅(Bagging, Bootstrap Aggregating) 방법에 대해서 알아보고자 합니다. 


[INDEX]

1. 원리

2. 연습 in R



1.  Bagging 원리 (feat. 앙상블)


(출처 :  Youtube 영상 , Ensemble Learner , Udactiy)



  앙상블 모형은 여러개의 weak learners 를 이용해 최적의 답을 찾아내는 기법입니다. 그냥 학습자가 아닌 '약한 학습자'를 활용하게 되는데요, 굳이 이렇게 하는 이유는 좀 더 다양한 의견을 수렴하는 것과 같은 효과를 얻게 되기 때문입니다.


마치, 변호사로만 이루어진 팀보다는 변호사도 있고 배우도 있고 가수도 있는 팀이 좀 더 다양한 의견을 내서 퀴즈쇼에서 좋은 결과를 낼 수 있는 것과 같은 원리라고 보시면 됩니다. 약한 학습자 여러개를 결합하면 강한 학습자가 만들어진다는 아이디어를 기반으로 한다는 것이죠.


배깅(Bagging, Bootstrap aggregatng)은 이러한 앙상블 모형의 기법중 하나인데요, 그림에서 처럼 샘플링을 복원추출로 해온 여러개의 데이터셋으로 부터 각각 모델을 만들고, 그 모델들에서 나온 결과들을 투표(Voting) 혹은 평균(Mean, 보통 회귀분석으로 앙상블을 시도했을 때 평균으로 종합한다고 합니다.) 하여 결과를 도출하는 방법입니다.


 유튜브 영상을 보면 조금 더 이해가 쉬운데요, Udacity에서 쉽게 강의한 영상이 있어 아래에 소개합니다.







이런 앙상블 기법에 대해 정확도를 올리기 위한 방법에 대한 질문을 3가지를 던질 수 있는데


 1. 데이터에 대해 어떤 머신러닝 모델을 구현할 것인가? (회귀인지, 의사결정 트리인지 등)

 2. 해당 모델에 대해서 파라미터 튜닝을 어떻게 할 것인가? (샘플 갯수를 몇개로 할 것인지 등)

 3. 최고의 후보를 찾기 위해 모델 평가하는데 어떤 기준을 사용할 것인가? (투표인지, 평균인지)


이 세가지 질문에 대해 답하는 것이 앙상블 기법의 정확도를 올리고 과적합(Ovefitting) 문제를 조절하는 데에 가장 중요합니다.



2. R 을 통한 연습


2.1 ipred를 활용한 bagging


## bagging 연습 - ipred

credit <- read.csv("credit.csv", header = T)

head(credit, 3)


install.packages("ipred")

library(ipred)

set.seed(300)

 독일은행 채무 이행여부 데이터인 credit.csv를 통해 연습을 진행했습니다. bagging() 펑션을 담고있는 패키지인 ipred를 설치하고 다운받았고, 샘플링을 위한 set.seed()를 실행했습니다.



## nbag = 25  ## 앙상블에 사용되는 의사결정 트리의 갯수가 25개

mybag <- bagging(default ~ . , data = credit, nbagg = 25)

credit_pred <- predict(mybag, credit)

table(credit_pred, credit$default)

prop.table(table(credit_pred == credit$default))





## nbag = 50 ## 앙상블에 사용되는 의사결정 트리의 갯수가 50개

mybag <- bagging(default ~ . , data = credit, nbagg = 50)

credit_pred <- predict(mybag, credit)

table(credit_pred, credit$default)

prop.table(table(credit_pred == credit$default))



샘플링한 갯수가 많아질 수록 정확도가 미약하지만 좀 더 향상되는 모습입니다. nbagg이 bagging()에서는 샘플링하는 집단의 갯수를 결정하는 파라미터입니다.




 2.2 caret을 활용한 연습


## bagging 연습 - caret :: train()

install.packages("caret") ## 파라미터를 튜닝해주는 데에 필요한 caret 패키지

install.packages("e1071") ## trainControl 시에 e1071 패키지가 필요

library(caret)

library(e1071)


set.seed(300)


## numbet = 10

ctrl <- trainControl(method = "cv", number = 10) ## method : 샘플링을 하는 방법을 결정

                                                                             ## number : 리샘플링한 folds의 갯수

train(default ~ . , data = credit, method = "treebag",   trControl = ctrl) ## method : 적용 모델


## numbet = 20

ctrl <- trainControl(method = "cv", number = 10)

train(default ~ . , data = credit, method = "treebag",

      trControl = ctrl)


## numbet = 30

ctrl <- trainControl(method = "cv", number = 30)

train(default ~ . , data = credit, method = "treebag",

      trControl = ctrl)




 number는 리샘플링을 하는 횟수를 조절하는 파라미터인데요, 이를 높일 수록 credit 데이터상에서는 정확도와 kappa가 더 낮아지는 경향을 보였습니다. 가령 1000개의 데이터가 있다면, number = 10인 경우 100개씩 나뉘어 10개의 집합이 될 것이고, number = 20인 경우 각각 50개의 데이터를 가진 20개의 집합이 될텐데, 데이터의 갯수가 충분하지 않은 모델들이 많다고만 해서 좋은 결과가 나오지는 않는 다는 것을 알 수 있었습니다.






[참고 서적]


1. R을 활용한 머신러닝 - 브레트 란츠

2. R Programming - Coursera (2017년 강의)








반응형
Posted by JoeSung
,


R에서 hist() 명령어로 쓰이는 히스토그램에 대한 간단 정리입니다.



[파일]


2. 막대그래프 vs 히스토그램.pdf


*대단한 자료는 아니지만, 가져가실 때 출처 밝혀주시는 센스! 부탁드립니다.



[이미지]





[참고 서적]


1. R을 활용한 머신러닝 - 브레트 란츠

2. R Programming - Coursera (2017년 강의)


반응형
Posted by JoeSung
,


 머신러닝에는 크게 지도, 비지도, 강화학습 크게 3가지 종류가 있습니다. k-means는 직접 데이터에게 분류하는 라벨을 알려주며 학습시키는 지도학습과는 달리, 알고리즘이 직접 분류를 하는 비지도 학습의 대표적인 알고리즘인데요, 이번 포스팅에서 간단하게 원리를 소개하고자 합니다.



1. 기본 원리



-K-MEANS?

 각 문서들 속에 들어있는 데이터 분석을 통해 유사하거나 관계가 높은 항목들끼리 집합을 만들고 싶을 때 사용하는 알고리즘입니다. 알고리즘이 진행되는 순서는 아래와 같습니다.


 1. 
(처음 중심값 선택) 랜덤하게 중심값을 선택한다.
 
 2. 
(클러스터 할당) K개의 중심값과 각 개별 데이터간의
    거리를 측정한다.
    가장 가까운 클러스터에 해당 데이터를 Assign 한다.

 3. 
(새 중심값 선택) 클러스터마다 새로운 중심값을 계산한다.

 4. 
(범위 확인) 선택된 중심값이 변화가 어느정도 없다면 멈춘다.
    만약 데이터의 변화가 있다면 다시 1번부터 반복한다.




k-means의 진행순서


위와 같이 각 군집간의 평균 위치값을 잡고, 

그 위치값을 기준으로 계속해서 최적화를 해나가는 알고리즘입니다.


사진을 보면 좀 더 쉽게 이해가 되는데요,

군집의 갯수(K)와 초기 랜덤값만 지정해주면 알고리즘이 군집내의 평균점을 잡아서

가까운 지점들을 다시 군집화하고 다시 평균점을 잡고...

반복하며 최적화가 될 때까지 분류를 하는 알고리즘입니다.


초기 중심으로부터의 오차 제곱합을 최소화하는 방향으로 군집이 형성되는

일종의 Greedy 알고리즘이기 때문에 안정된 군집은 보장하지만 최적이라고는 말할 수가 없습니다.


k = squart(n/2)

적당한 k 값을 구하는 공식



k-means의 단점


적용이 상당히 쉬운반면, 적중률도 높은 편이어서 자주 쓰이는 알고리즘이지만

이런 K-Means의 큰 약점중 하나는 이상치(Outliers)가 많을 경우

적절한 군집화가 이루어지지 않는다는 점입니다.


위의 그림과 같이 이상치가 많을경우 저렇게 섬처럼

군집이 형성되는데 이상치만 포함되어있을 가능성이 크기 때문에

알고리즘을 적용하기 이전에 데이터의 모양을 먼저 파악하고 적용을 결정해야합니다.


(U자형 데이터 모양이 나타났을 때에도 분류가 잘 안된다는 단점이 있습니다.)


2. 사례



 c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1)

 row <- c("A","B","C","D","E","F","G","H","I","J")

 col <- c("X","Y")

 data <- matrix( c, nrow= 10, ncol=2, byrow=TRUE, dimnames=list(row,col))

 data 

기본 데이터 셋을 먼저 만듭니다.


  X Y

A 3 4

B 1 5

C 7 9

D 5 4

E 6 8

F 4 5

G 9 8

H 7 8

I 6 7

J 2 1



 plot(data)


 이 데이터를 2개의 군집으로 분류하는 k-means를 돌려보는 것이 목적!



 install.packages("stats")

 library(stats)


 km <- kmeans( data , 2 )

 라이브러리는 stats이고 kmeans 함수를 씁니다. 분류대상 데이터를 넣고, k값 갯수만 넣어주면됩니다. 아주 간단합니다.


K-means clustering with 2 clusters of sizes 5, 5


Cluster means:

  X   Y

1 3 3.8

2 7 8.0


Clustering vector:

A B C D E F G H I J 

1 1 2 1 2 1 2 2 2 1 


Within cluster sum of squares by cluster:

[1] 20.8  8.0

 (between_SS / total_SS =  74.5 %)


Available components:


[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"   

[7] "size"         "iter"         "ifault"      

맨 아래의 Available components를 통해 값들에 접근이 가능합니다.



 plot( round(km$center), col = km$center, pch = 22, bg = "dark blue", 

       xlim = range(0:10), ylim = range(0:10) )

  분류가 된 k개의 군집의 중앙값을 출력합니다.

 plot( round(km$center), col = km$center, pch = 22, bg = "dark blue", 

      xlim = range(0:10), ylim = range(0:10) )

 par(new = T) 

 plot(data, col = km$cluster+1  ,xlim = range(0:10), ylim = range(0:10))


 원래 데이터를 위의 그래프에 합쳐서 출력하면 구분된 군집을 시각화할 수 있습니다.




이렇게 나오면 끝!

동그라미 하나를 그려주고 싶은 욕심이 드네요...


*아이티윌 유연수 선생님의 강의를 요약한 포스팅입니다.








반응형
Posted by JoeSung
,

[?]

가끔씩 패키지들을 너무많이 다운받으면 

패키지간에 충돌을 일으켜서 실행이 안되곤 합니다.

detach를 활용해서 패키지를 하나씩 언로드 할수도 있는것 같지만

어떤 패키지에서 문제가 일어나는지 모를 때는 한번 밀어버리고 싶은데

R-Blogger에서 좋은 스크립트를 발견!


[코드]


# create a list of all installed packages

ip <- as.data.frame(installed.packages())

head(ip)

# if you use MRO, make sure that no packages in this library will be removed

ip <- subset(ip, !grepl("MRO", ip$LibPath))

# we don't want to remove base or recommended packages either\

ip <- ip[!(ip[,"Priority"] %in% c("base", "recommended")),]

# determine the library where the packages are installed

path.lib <- unique(ip$LibPath)

# create a vector with all the names of the packages you want to remove

pkgs.to.remove <- ip[,1]

head(pkgs.to.remove)

# remove the packages

sapply(pkgs.to.remove, remove.packages, lib = path.lib)



출처 :  R-Blogger

https://www.r-bloggers.com/how-to-remove-all-user-installed-packages-in-r/

반응형
Posted by JoeSung
,




head(cars)

attach(cars)


# 1 plot


plot(dist~speed, data = cars)


# 2 lm() ~ abline()


m3 <- lm(dist~speed, cars)

abline(m3, col = "red")


# 3 draw the residual line by lines & sapply


yhat <- predict(m3, speed = speed)

cbind( dist, yhat )


join <- function(i)

lines( c(speed[i], speed[i]), c(dist[i], yhat[i]), col="green")

sapply(1:50, join)

반응형
Posted by JoeSung
,



Q. 

plot차트는 만들었는데, 회귀직선을 어떻게 추가할까요?





A.

abline()을 활용합니다.



m <- lm(distress_ct ~ temperature, launch)


회귀 결과를 변수에 담고



abline(m)


그냥 abline 함수 안에  넣어주면 끝!


색상을 추가하고 싶다면,


abline(m, col = "red") 이런식으로 col 파라미터에 원하는 색상값을 넣어주면됩니다.










반응형
Posted by JoeSung
,


선형회귀의 기본 가정 4가지


1) X의 각 값 x에 대하여 Y 값들로 구성되는 한 확률 분포가 대응된다. 이것을 x에 대응되는 Y의 부분모집단이라 하고 이 부분 모집단은 정규분포를 따른다. 


2) 이 부분 모집단의 분산은 모두 같다,


3) Y의 부분 모집단의 평균은 모두 동일 직선 위에 존재한다. 이것은 X = x 에서의 Y의 기대값 E[Y|X = x], 즉 평균은 y축 절편이 B0이고 기울기가 B1인 직선위에 있음을 의미한다.


4) y의 값은 확률적으로 서로 독립이다.








편미분 : 

다변수함수(多變數函數)에 대하여, 그 중 하나의 변수에 주목하고 나머지 변수의 값을 고정시켜 놓고 그 변수로 미분하는 일을 가리킨다.


http://terms.naver.com/entry.nhn?docId=1157964&cid=40942&categoryId=32220

반응형
Posted by JoeSung
,


Q.  

data.frame 의 column 갯수를 가져오려면 어떻게 해야할까


A.

dim 을 사용하여 2번째 밸류값을 반환하면 된다.

dim 은 row의 갯수와 column의 갯수를 반환



>dim(table2)

[1] 5342   23


> dim(table2)[1]

[1] 5342


> dim(table2)[2]

[1] 23






반응형
Posted by JoeSung
,