안녕하세요. 우주신입니다.


이번 포스팅에서는 누적과 관련된 함수에 대해 정리해보겠습니다.


cumsum(), cumprod(), cummax(), cummin()


익숙해지시면 유용하게 사용되는 무척 간단한 함수들 입니다.




1. 누적 합 (Cumulative Sum)



1부터 10까지 값을 벡터 a에 넣었습니다.

모두가 아는 함수로 sum()을 통해  a의 구성값들 합을 구했습니다.


그러나, 여기서 각 누적 합을 나타내려면 어떻게 해야할까요?



흔히들 while(), for() 등 반복문 함수를 통해 표현하려 시도하겠지만,


cumsum() 함수 하나면 다 해결됩니다. (결과 값은 다른 형태로 표시 됩니다)


데이터프레임으로 응용해보겠습니다.

벡터 b, c를 만든 후, 데이터프레임 df를 생성했습니다.

b의 누적 합을 cumsum(df$b)을 통해 구한 후, 이를 데이터프레임의 새로운 변수로 추가해봤습니다.




2. 누적 곱 (Cumulative Products)


누적 곱을 for문을 통해 나타내봤습니다.


이 또한 cumprod() 한줄로 깔끔하게 완성!




3. 누적 최대값, 최소값(Cumulative Max, Min)


cummax(), cummin()을 통해 누적 최대값, 최소값도 아주 쉽게 구할 수 있습니다.


-cummax(): 맨 처음 값을 출력하고 그 다음 값과 비교 후, 그 값이 더 크다면 그 값을 출력

-cummin((): 맨 처음 값을 출력하고 그 다음 값과 비교 후, 그 값이 더 작다면 그 값을 출력


참고로, cummin()을 for(), if() 함수를 통해 직접 구현해 본다면,

cummin()에게 고마움을 느낄 수 있습니다.




끝. 


수고하셨습니다.






  1. 2020.11.16 20:09

    비밀댓글입니다



안녕하세요. 우주신입니다.



이번 포스팅과 다음 포스팅에서는 매우 중요한 상관분석(correlation analysis)회귀분석(regression analysis)에 대해 정리해보겠습니다.


plot(), corrplot(), cov(), cor(), cor.test()


우리는 종종 어떤 두 사건 간의 연관성을 분석해야 할 경우가 많습니다. 둘 또는 그 이상의 변수들이 서로 관련성을 가지고 변화할 때 그 관계를 분석하는데 사용되는 방법 중에서 가장 잘 알려진 것이 상관분석(correlation analysis)과 회귀분석(regression analysis)입니다.


GDP와 기대수명 간의 관계, 키와 몸무게 간의 관계 등을 예로 들 수 있는데 여기에서 두 사건, 즉 두 변수 간의 선형적 관계를 상관(correlation)이라고 하며, 이러한 관계에 대한 분석을 상관분석(correlation analysis)이라고 합니다.


먼저 상관분석에 쓸 데이터를 불러서 확인해보겠습니다.


df <- read.csv("http://goo.gl/HKnl74")


그대로 복사해서 데이터프레임 df에 입력하시면 됩니다.


str() 함수를 통해 항상 데이터 구조를 확인하는 습관!

놀이동산에 대한 만족도가 주말이용여부, 동반자녀수, 놀이공원까지의 거리, 놀이기구에 대한 만족도, 게임에 대한 만족도, 대기시간에 대한 만족도, 청결상태에 대한 만족도 그리고 전체만족도로 구성되어 있습니다.


상관분석을 할 때 결측값(NA)가 있으면 결과가 NA 값이 나오게 되므로 이를 꼭 확인하여 처리해야 합니다.

(결측값 처리는 http://ordo.tistory.com/19를 확인)

다행히도, 이번 데이터프레임에는 결측값이 하나도 없네요~


그럼, 저는 '놀이기구에 대한 만족도(rides)'와 '전체만족도(overall)' 간의 관계를 분석해보겠습니다. 


아마도 놀이기구에 대한 만족도가 높으면 전체 만족도 또한 높지 않을까 예상을 해보면서, 산점도(scatterplot)부터 그려보겠습니다.



1. 산점도(Scatter plot)


https://ko.wikipedia.org/wiki/산점도


상관계수를 파악하기 전에 우선, 산점도(scatterplot)로부터 두 변수 간에 관련성을 그림을 이용하여 시각적으로 파악할 수 있습니다.

plot(Y~X) 함수의 Y, X에 변수를 입력하면 위와 같이 산점도가 그려집니다.

대략 봤을 때, 양의 관계를 이루고 있는 것 같죠? 


좀 더 그림을 이쁘게 그려본다면,

-main="Overall~Rides": 그림의 main 제목 입력

-xlab="Satisfaction with Rides": x축 레이블 입력

-ylab="Overall Satisfaction": y축 레이블 입력

-cex=1: 출력되는 점들의 크기 결정

-pch=1: 출력되는 점의 형태  (기본형태는 빈원)

-col='red': 색상 지정


그 외에

-xlim=: x축 값의 출력범위 지정

-ylim=: y축 값의 출력범위 지정

-lty: 출력되는 선의 형태를 지정



2. 공분산(Covariance) 및 상관계수(Correlation Coefficient)

산점도 이용하면 두 변수간의 직선적인 관계를 개략적으로 파악할 수는 있지만, 두 변수 사이의 관계를 보다 정확히 숫자로 나타낼 수 없기 때문에

공분산 및 상관계수를 이용합니다.


공분산은 2개의 확률변수의 상관정도를 나타내는 값인데, 만약 2개의 변수 중 하나의 값이 상승하는 경향을 보일 때 다른 값도 상승하면 공분산의 값은 양수, 반대로 다른 값이 하강하는 경향을 보이면 공분산의 값은 음수가 나옵니다.
cov() 함수를 통해 공분산 값을 쉽게 구할 수 있습니다.
50.82939는 양수이므로 두 변수 간의 상관관계는 상승하는 경향이라고 이해할 수 있죠?

그러나 공분산은 상관관계의 상승 혹은 하강하는 경향을 이해할 수는 있으나 2개 변수의 측정 단위의 크기에 따라 값이 달라지므로 절대적 정도를 파악하기에는 한계가 있습니다. 즉 50.82939가 어느정도의 양의 상관관계인지를 가늠하기가 쉽지 않습니다.

이 때, 공분산을 표준화 시킨 상관계수를 통해 파악할 수 있습니다!

cor() 함수를 통해 두 변수 간의 선형관계의 강도를 알 수 있습니다.
-use='complete.obs': 결측값을 모두 제거된 상태에서 상관계수를 계산 
-method='pearson': 피어슨 상관계수 지정 (가장 많이 사용)
나머지 기능들은 ?cor 입력하여 더 자세히 보시기 바랍니다.

상관계수는 -1 ~ 1 사이의 값을 가지며 0일 경우에는 두 변수 간의 선형관계가 전혀 없다는 것을 뜻 합니다.
보통 0.3과 0.7 사이이면, 뚜렷한 양적 선형관계로 0.7과 1.0 사이이면, 강한 양적 선형관계로 간주하니,
위에 나온 0.5859 상관계수 값을 통해 놀이기구에 대한 만족도와 전체 만족도는 뚜렷한 양적 선형관계를 이루고 있다고 볼 수 있습니다.

주의할 점은 특이 값에 민감하게 반응하기 때문에 데이터 값에 항상 주의를 기울여야 합니다. 
또한 상관관계는 두 변수 간의 관련성을 의미할 뿐, 원인과 결과의 방향을 알려주지는 못 합니다.



3. 상관계수의 검정


상관계수의 가설 검정은 cor.test() 함수를 사용하면 됩니다.

귀무가설 "상관관계가 없다"에 대한 검정 결과 p-value < 2.2e-16 값이 나왔으므로 귀무가설을 기각할 수 있음을 알 수 있습니다.

그 외에 검정통계량의 값(t), 95% 신뢰구간, 표본상관계수 등을 확인할 수 있습니다.


4. 그 외 


이번에는 전체만족도놀이기구에 대한 만족도, 게임에 대한 만족도, 대기시간에 대한 만족도, 청결상태에 대한 만족도 간의 상관관계를 한 눈에 파악해보겠습니다.


변수를 지정하여 산점도를 나타내봤습니다.


그 후, cor() 함수를 통해 상관계수를 나타냈습니다.


'corrplot' 패키지에 들어있는 corrplot() 함수를 통해 한 눈에 시각적으로 파악했습니다.




끝.


다음 시간에는 회귀분석에 대해 다뤄보겠습니다.


수고하셨습니다~



  1. 2017.07.24 13:38

    비밀댓글입니다

    • 2017.08.03 09:35

      비밀댓글입니다

  2. blackz 2019.11.11 22:54

    이해하기 매우 쉽게 작성되어서 놀랐습니다.

    잘읽었습니다~!!!!

  3. knh 2020.12.06 17:54

    좋은 포스트 감사합니다. 덕분에 학습하는데 큰 도움이 되었습니다.

  4. 리딩웨더 2021.03.08 09:39 신고

    잘 보고 가요~

안녕하세요. 우주신입니다.



오늘은 비교연산자와 논리 연산자에 대해 배워보겠습니다.


>, <, >=, <=, ==, !=, &, &&, |, ||, sum(), mean(), any(), all()




1. 비교 연산자


우선, X, Y, Z 벡터를 만들었습니다.


부등호 '>'는 초등학교 때 배웠던 적이 있죠?ㅎㅎ 대소관계를 비교할 때 쓰는 기호로서 'X가 Y보다 크다'를 의미합니다.

결과값으로는 TRUE, FALSE가 나옵니다. 마지막 6 > 3만 TRUE가 나온 것을 알 수 있습니다.


같은 원리로, X가 Y보다 값이 작다면 TRUE가 아니라면 FALSE가 결과값으로 출력됩니다.


Z는 구성요소가 하나임에도 X와 비교연산이 되는 것을 볼 수 있습니다.

이러한 경우에는, Z가 X의 길이에 자동으로 맞추어(4, 4, 4, 4, 4, 4) 비교연산이 이루어 집니다.


부등호 '>='는 '왼쪽항이 오른쪽 항보다 크거나 같다'는 뜻입니다.


반대로, 부등호 '<='는 '왼쪽항이 오른쪽 항보다 작거나 같다'는 뜻입니다.

(*주의: 부등호 순서 =>, =<는 오류 입니다.)


'=='는 두 항이 같으면 TRUE를 다르면 FALSE를 출력합니다.

'='과 절대 혼동하지 마시길 바랍니다!


반대로, '!='는 두 항이 다르면 TRUE를 같으면 FALSE를 출력합니다.



2. 논리 연산자


'&'는 'AND' 연산자 입니다.

두 조건을 동시에 만족할 때 TRUE, 아닐 경우에는 FALSE를 출력합니다.

위 코드에서는 X가 3보다 크고 5보다 작은 두 조건을 만족하는 4의 위치에서만 TRUE가 출력된 것을 알 수 있습니다.


'|'는 'OR' 연산자 입니다.

두 조건 중 하나만 만족해도 TRUE, 두 조건 모두 만족되지 않을 경우에는 FALSE를 출력합니다.


참고로, '&'과 '|'은 벡터 전체 결과를 나타내지만, '&&'과 '||'은 일반적인 'AND', 'OR' 연산자로서 벡터 첫번째 결과만 나타냅니다. (직접 해보셔요~)


인덱싱 안에 논리연산자를 넣어 값들을 찾는 경우가 많습니다. 이런식으로 자주 활용되니 꼭 익숙해지시기 바랍니다!


위와 같이 데이터가 작은 벡터의 경우 결과값을 쉽게 확인할 수 있지만, 데이터가 커지면 결과값을 일일이 확인할 수는 없겠죠?

이럴 때 sum(), mean(), any(), all() 함수와 함께 사용함으로써 효율성을 높일 수 있습니다.


sum() 함수를 활용하여 결과값 중 TRUE가 몇 개인지 한번에 파악할 수 있습니다.

벡터 X의 구성요소 중 3보다 크고 6보다 작은 값은 4,5 이므로 결과값으로 2개가 출력됐습니다.


mean() 함수를 활용하면 벡터 전체에서 TRUE가 얼만큼 있는지 퍼센트로 보여줍니다.

X의 구성요소 6개 중 3, 4, 5는 3개이므로 3/6=0.5 값이 나왔습니다.


-any(X>3): X>3 조건의 결과값 중 TRUE가 하나라도 있으면 TRUE를 반환해라.


-all(X>3): X>3 조건의 결과값이 모두 TRUE이면 TRUE를 반환해라.


X >= 1 의 결과값은 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE이므로 all(X>=1)의 결과값도 TRUE 입니다.




끝.


수고하셨습니다~





안녕하세요. 우주신입니다.


이전 기술통계 함수 포스팅에서는 데이터를 확인하고 데이터를 요약하는 함수들을 배웠습니다. 


이번 시간에는 관측된 데이터를 그래프, 도표 등을 통해 시각화하는 방법에 대해 정리해보겠습니다.


hist(), boxplot(), qqnorm(), qqline()






데이터는 저번 시간과 같은 것으로 사용하겠습니다.

store.df <- read.csv("http://goo.gl/QPDdMl")


항상, 데이터 형태를 str() 함수로 확인하는 습관!






1. 히스토그램(histogram)


히스토그램은 가장 대표적인 그래프 중 하나 입니다. 히스토그램을 통해 특정 변수의 관측값의 빈도 분포를 직관적으로 파악할 수 있습니다.

히스토그램은 간단하게 hist( ) 함수를 사용하면 됩니다.


p1sales를 히스토그램으로 표현해보겠습니다.


hist(데이터프레임$변수명) 형태로 입력하면 빈도수를 기준으로 그래프가 바로 만들어집니다.


좀 더 응용해보겠습니다.

-store.df$p1sales: 데이터프레임$변수명

-main="Product1 Weekly Sales Frequencies": 히스토그램 main 제목을 입력

-xlab="Product1 Sales": x축 레이블 입력 (lab은 label의 줄인 단어)

-ylab="Count": y축 레이블 입력

-breaks=30: breaks 변수를 통해 빈도를 일정 단위로 묶는다 (10,40.. 값을 바꿔서 비교해보면 바로 이해가실겁니다)

-col="red": color를 빨간색으로 나타내라

-freq=FALSE: 히스토그램의 빈도를 확률로 나타내라 (hist() 함수는 빈도를 기본값으로 표현합니다)


이번에는, x축 값의 범위를 변경해보겠습니다.

위 코드에서 xaxt="n"를 추가함으로써 x축 값을 제거했습니다.


axis( )함수를 통해 x축 값의 범위를 지정하겠습니다.

-side=1: 1은 가로 2는 세로를 의미

-at = seq(60, 300 by=20): seq()함수를 통해 60부터 300까지 20간격으로 나타내라


p2sales도 한번 혼자서 해보시면  히스토그램은 끝!

더 자세한 기능은 ?hist를 입력해서 보시기 바랍니다



2. 박스도표(Boxplot)


상자그림(Boxplot)은 자료로부터 얻어낸 통계량인 요약수치를 가지고 수치적 자료를 표현하는 그래프입니다.

R에서는 boxplot()함수를 통해 상자그림을 나타냅니다. 

-store.df$p2sales: 데이터프레임$변수명

-main="Weekly Sales of P2": 히스토그램 main 제목을 입력

-xlab="Weekly Sales": x축 레이블 입력 (lab은 label의 줄인 단어)

-ylab="P2": y축 레이블 입력

-horizontal=TRUE: 수평으로 나타내라


참고로, 사분위간 범위가 상자의 길이이며 중앙값은 상자 중간의 선으로 표현됩니다. (평균값이 아닙니다)

선은 최대값과 최소값까지 표현을 하고 그 밖의 점들은 특이점 입니다.


좀 더 응용해보자면,

-store.df$p2sales~store.df$storeNum: 하나 이상의 변수 입력함으로써 여러 박스 도표를 생성합니다. (X~Y)

-las=1: x축 범위의 값을 가로로 표현하라 (2로 할 경우 50, 100, 150, 200 값들이 세로로 표시됩니다)



히스토그램에서 했던 것과 같은 원리로 y축 값의 범위를 No, Yes로 바꿔봤습니다.



3. 분위수-분위수 도표(QQ Plot)


이번에는 정규성 검정을 확인하는 방법 중 하나인 QQ Plot을 보겠습니다.

이를 통해 특정 변수에 포함되어 있는 관측값들이 정규분포에 가까운지 확인할 수 있습니다.


QQ Plot은 qqnorm(), qqline() 함수를 통해 구할 수 있습니다.

-qqnorm(): 정규확률 산점도를 나타낸다


정규성을 검정하는 방법은, qqline()을 통해 산점도 점들이 대각선에 가깝게 선형을 이루면 정규성을 띈다고 평가하고 그렇지 않으면 정규성을 띄지 않다고 봅니다.





끝.


수고하셨습니다.






안녕하세요. 우주신입니다.


이번 포스팅과 다음 포스팅 두번 나누어 기술통계(Descriptive Statistics) 함수에 대해 다뤄보겠습니다.


기술통계는 관측한 데이터를 도표로 정리하거나 통계량(예: 평균, 분산, 상관계수, 주성분정준변량)으로 정리하는 것으로서 

관측한 현상의 특징을 기술한다.

[출처: 네이버 지식백과]




먼저, 데이터를 확인하는 함수들 부터 살펴보고

head( ), tail( ), some( ), str( )

데이터를 요약하는 방법을 보겠습니다.

min( ), max( ), mean( ), median( ), var( ), sd( ), range( ), quantile( ), summary( ), apply( )


그 외 attach( ), detach( ) 함수에 대해 배워보겠습니다.




1. 데이터 확인


수업 시간에 배운 데이터를 가지고 해보죠.

store.df <- read.csv("http://goo.gl/QPDdMl")

복사해서 실행하면 밑과 같은 데이터가 store.df 데이터프레임에 입력될 것 입니다.

2080개 항목이나 되는 이렇게 큰 데이터를 일일이 다 확인할 수는 없겠죠?


head( ) 함수를 통해 데이터 앞 부분을 확인할 수 있습니다.


tail( ) 함수를 통해 데이터 뒷 부분을 확인할 수 있습니다.


또한 some( ) 함수를 통해 데이터를 랜덤으로 확인할 수도 있습니다.

some( ) 함수는 'car' 패키지 안에 있으므로 install.packages('car') - library(car) 까먹지마세용~


그 다음으로는 아주 유용한 str( ) 함수 입니다. structure의 약자로서 데이터 구조를 한눈에 파악할 수 있습니다.

데이터구조가 10개의 변수, 2080개 항목으로 이루어진 data.frame인 것을 알 수 있으며

데이터프레임의 변수들이 어떤 형태의 데이터를 가지고 있는지 알 수 있습니다.


데이터를 활용하기 전에 항상 str( ) 함수를 써서 데이터 구조가 적절한 형태를 취하는지 확인해야 합니다. 

특히, 요인(factor)형은 꼭 확인 !



2. 데이터 요약


데이터를 확인했으니 가장 많이 쓰이는 함수들을 가지고 데이터를 요약해보겠습니다.


-min( ): 최소값

-max( ): 최대값

-mean( ): 평균


일일이 $를 사용하여 변수를 지정하려니 정말 귀찮고 번거롭습니다. 이 때 활용할 수 있는 함수가 attach( ), detach( ) 입니다.

attach(dataframe) 입력 후로는 밑에 그림과 같이 데이터프레임 이름을 생략하고 변수만 입력하면 됩니다.

마지막에 detach(dataframe) 함수를 입력해 끝을 알려줘야 추후에 오류가 안 납니다.

-median( ): 중앙값

-var( ): 분산

-sd( ): 표준편차

-range( ): 범위


-quantile( ): 사분위수

-quantile(변수, probs = 범위): 특정 범위를 지정해 줄 수 있습니다.


정말 많이 쓰이는 summary( ) 함수 입니다. 최소값, 사분위값, 중앙값, 평균, 최대값을 깔끔하게 한 눈에 보여줍니다.


apply( ) 함수를 이용해서도 데이터를 요약할 수 있습니다.

apply(dataframe, MARGIN=1(가로)2(세로), FUN = 기능)

-apply(store.df[,2:9], MARGIN=2, FUN=mean): store.df 데이터프레임의 2열부터 9열까지 세로로 평균값을 계산하라.

-apply(store.df[,2:9], MARGIN=2, FUN=sum): store.df 데이터프레임의 2열부터 9열까지 세로로 합을 계산하라.






끝.


수고하셨습니다.

안녕하세요. 우주신입니다!

오늘은 외부 파일을 불러오고 저장하는 방법에 대해 정리해보겠습니다.


R로 작업할 때는 외부 데이터를 불러와야 하는 경우가 정말 많습니다.


특히, R은 통계 컴퓨팅 및 그래픽을 위한 언어이기에 엑셀(Excel) 파일을 불러올 때가 많은데,


외부 데이터를 불러오고 저장하는 여러가지 방법 중 가장 쉬운 방법인 CSV파일에 대해 배워보겠습니다.


CSV는 Comma Seperated Value의 약자로서 , 몇 가지 필드를 콤마(,)로 구분한 텍스트 데이터 및 텍스트 파일입니다.


이러한 CSV 파일을 사용함으로써 많은 양의 데이터를 줄일 수 있는데, 


이는 CSV가 단순 텍스트 형식으로 저장되기에 모든 서식은 제거되고 그 값만이 저장되기 때문이죠.


EXCEL의 모든 파일은 csv로 저장이 가능하며 저장할 때 형식만 .csv로 바꿔주면 됩니다.




1. CSV파일로 저장하기


저번 시간에 만들었던 store.df 데이터프레임을 외부 파일에 저장해보겠습니다.

우선, setwd( ) 함수를 통해서 작업폴더를 먼저 지정해줘야하는 것 깜빡하지 마십쇼!


write.csv(store.df, file="store-df.csv", row.names = FALSE

-store.df: 데이터프레임 이름

-file="store-df.csv": 파일명 설정하기

-row.names = FASLE: 행의 이름을 생략 (TRUE를 했을 시 1, 2, 3, 4, 5가 하나의 데이터로써 저장이 됩니다)


그 후, 작업폴더를 들어가면 .csv 형식 파일로 저장되어 있는 것을 확인할 수 있습니다.



파일을 열어보면, 데이터프레임이 그대로 저장된 것을 볼 수 있습니다.




2. CSV파일 불러오기


이번에는 read.csv( )함수를 써서 People 파일을 불러오겠습니다.


데이터는 밑과 같은 형태 입니다.



DF라는 변수에 People 파일을 불러왔습니다.


read.csv('People.csv', header = TRUE, stringsAsFactors = FALSE, na.strings = "")

-'People.csv': 불러올 파일명

-header=TRUE: 변수명으로 사용 (Name, Age, Color가 변수명이 되는 것)

-stringsAsFactor=FALSE: 문자형 데이터를 요인(factor)로 인식하지 않음

-na.strings="": 결측값을 표시 ("", ".", NA 등이 있음)



불러오는 파일만 같고 모든 조건을 반대로 해봤습니다.


-header=FALSE: 변수명으로 사용하지 않음 (V1, V2, V3라는 새로운 변수명이 생김)

-stringsAsFactor=TRUE: str(DF1)을 보면 모든 데이터가 요인(factor)로 인식됨

-na.strings="": 이 조건이 생략됨으로써 결측값이데이터를 확인하면 빈칸으로 표시됨





수고하셨습니다.




안녕하세요. 우주신입니다.


이전 포스팅에 이어 오늘은 데이터프레임 변수명 변경, 변수 선택 및 정렬에 대해 정리해보겠습니다.



우선, 매장 번호, 수입, 방문자수, 매니저로 구성된 데이터프레임을 하나 만들어보겠습니다.


1. 데이터프레임 변수명 변경


변수명 변경에는 두 가지 방법이 있습니다. 첫번째는 names( ) 함수를 사용해서 변경.

names(dataframe) <- c(new variable names)

변수가 4개이므로 이에 맞춰 V1, V2, V3, V4라는 이름으로 바꾼 결과 입니다.


두번째 방법은 rename( ) 함수에 대해 알아보겠습니다. 

rename( ) 함수를 사용하기 위해선 reshape 패키지를 설치해야 합니다.

패키지 설치에 대해선 아직 배우지 않았지만,

install.packages("패키지"), library(패키지) -> 이 두 명령어만 입력하면 패키지 안의 함수들을 사용할 수 있습니다.


V1, V2, V3, V4 변수명이 다시 바뀐 것을 확인할 수 있죠?



2. 데이터프레임 변수 선택


데이터프레임을 사용하다보면 특정 변수를 선별해야 하는 경우가 많습니다.

먼저, index[which( )] 함수에 대해 알아보겠습니다.

dataframe[which(조건, 변수선택)] 형식입니다. 

위에서는 '매장수입이 400이 넘는 번호, 수입, 방문자수, 매니저 변수를 나타내라'로 해석할 수 있습니다.


이번에는 subset( ) 함수 입니다.

subset(dataframe, select = 변수선택, subset = 조건) 형식입니다. 

'방문자수가 40이 넘는 번호, 방문자수 변수를 나타내라'로 해석할 수 있습니다.



3. 데이터프레임 정렬


데이터프레임의 특정 변수를 기준으로 정렬하는 두 가지 방법을 알아보겠습니다.


먼저, order( ) 함수를 통해 매장수입 기준으로 정렬해보겠습니다.

order(store.rev)를 보면 순위가 매겨져있는데, 약간 헷갈릴 수 있는데 이를 해석해보면,

5번째 수가 첫번째 자리로, 3번째 수가 두번째 자리로, 1번째 수가 세번째 자리로.... 이런식으로 정렬하면 오름차순이 된다는 뜻입니다.

절대값으로 표현할 땐 store.rev[order(store.rev)] 인덱스를 이용하여 그 안에 order( )함수를 넣어주면 됩니다.

전체를 나타내기 위해선 dataframe[order( ), ] 형식으로 입력하면 됩니다. ,(콤마) 잊지마세요~


두번째는 arrange( ) 함수입니다.

arrange( ) 함수는 plyr 패키지 안에 들어있습니다.

arrange(dataframe, 기준변수) 형식으로 입력하면 됩니다.

위에서 나온 결과와 똑같이 매장수입 기준으로 정렬된 것을 볼 수 있습니다. 


역순으로 정렬할 땐 desc( ) 함수를 사용하면 됩니다.






끝.


수고하셨습니다.



  1. 잡다백수 2017.07.07 21:46 신고

    좋은 포스팅 감사합니다.

  2. 가을 2018.10.19 07:32

    감사합니다.

  3. 공부중 2019.05.23 15:51

    이해하기 쉬운 설명 덕에, 공부하는데 도움이 많이 되네요. 감사합니다.

  4. 덕담 2021.02.05 12:01

    잘 배웠습니다, 선생님. 감사드립니다.

안녕하세요. 우주신 입니다.


블로그를 시작한지 아직 한달도 안 됐지만 몇몇분들이 방문해주시니 너무 신기하고 감사하네요!!


새삼 21세기 정보화 사회에 살고 있구나 깨닫고 인터넷의 위엄을 느끼기도 합니다.


공부하는 데 조금이라도 도움이 되기를 바라는 마음으로 오늘은 데이터프레임에 대해 정리해보겠습니다.


데이터프레임(DataFrame)은 R에서 가장 많이 쓰이는 데이터 구조라 정말 중요합니다!


다른 데이터구조와는 달리 데이터 유형에 국한받지 않고 2차원 형태의 데이터 구조를 생성할 수 있기 때문이죠. 






1. 데이터프레임(DataFrame) 생성



우선, xNum, xLog, xChar 변수들을 가지고 df 라는 데이터프레임을 생성했습니다. 

데이터프레임을 만들 땐, data.frame( ) 함수를 사용하면 되는 것으로 배웠죠?


str( ) 함수를 통해 데이터프레임의 구조를 확인해보면, xChar 변수는 Factor(범주형)로 입력되어 있습니다.

이를 통해 data.frame( ) 함수 사용시, 문자형은 자동으로 Factor로 인식을 하는 것을 알 수 있습니다.

이 때는 data.frame( , stringsAsFactors = FALSE)을 넣음으로써 문자형을 Factor가 아닌 Character로 입력할 수 있습니다.

stringsAsFactors = F 로 나타내기도 합니다.



2. 데이터프레임(DataFrame) 변수 추가


데이터프레임을 사용하다보면 종종 변수를 추가할 때가 많습니다.

먼저, 밑과 같이 dataframe$variable 를 통해 변수를 추가하는 방법이 있습니다.

기존 df에 Name이라는 새로운 변수를 4번째 열에 추가한 결과입니다. 간단하죠?


두번째 방법은 transform(dataframe, variable = ' ') 함수입니다. 

df에 새로운 변수 Age를 그 다음 열에 추가한 결과 입니다. 

transform( )함수가 첫번째 방법보다 깔끔하고 여러개의 변수도 한번에 생성할 수 있다는 점에서 이를 선호합니다.



3. 데이터프레임(DataFrame) 결합 


데이터프레임 결합은 앞시간에 행렬 결합에서 배웠던 rbind( ), cbind( ) 함수를 이용하면 됩니다.

df1의 아래에 df2를 결합해기 위해 rbind( )함수를 사용했습니다.

행렬(Matrix)와 마찬가지로 열의 개수가 같아야 오류가 안 뜹니다.

위 df3를 보면 깔끔하게 결합되었죠?


다음으로는 cbind( )함수를 사용하기 위해 df4 데이터프레임을 생성했습니다.

df5를 보면 오른쪽에 결합된 것을 확인할 수 있습니다.

참고로, df3와 df4의 위치를 바꿔주면 그 순서대로 결합되는 것을 확인할 수 있습니다.


마지막으로 merge( )함수를 사용해보겠습니다.

우선, df5에 df6를 cbind( )함수를 통해 추가해보았지만 행(row)의 개수가 달라 오류가 뜹니다.


merge(dataframe, dataframe, key = ' ') 함수는 데이터프레임의 변수 개수와 상관없이 key를 통해 유연하게 결합할 수 있습니다.

df5와 df6를 name 변수를 기준으로 Student라는 새로운 데이터프레임을 생성한 결과입니다.

df5의 name에 E가 없기에 이는 생략된 것을 확인할 수 있습니다.



4. 데이터프레임(DataFrame) 인덱싱


데이터프레임 Student의 변수 height를 구하는 방법에는 3가지가 있습니다.

-Student[ ,2], Student[[2]], Student$height

모두 동일한 방법이지만 개인적으로는 Student$height와 같이 명확히 변수이름을 써주는 것을 추천합니다.


-Student[ ,-1]: Student에서 1번째 행을 제외한 전체 구성요소를 가리켜라.

-Student[1:2, ]: Student에서 1번째부터 2번째 행에 있는 구성요소를 가리켜라.

-Student[Student$height > 11, ]: Student에서 Student$height가 11보다 큰 행에 있는 구성요소를 가리켜라.





끝.


다음 시간에는 데이터프레임 변수명 변경, 변수 선택 및 정렬에 대해 배워보겠습니다.


수고하셨습니다. 





  1. 리메 2017.04.25 08:59

    안녕하세요. 좋은 지식 공유해 주셔서 감사합니다. 혹시 데이터 프레임에서 추가로 제가 질문을 해도 될까 싶어서 댓글 드립니다.
    1. 먼저 컬럼 위치를 이동하는 법 아시나 해서 여쭤봅니다. 지금 찾고 있는데 잘 안나오네요. 예를 들면 df라는 데이터 프레임에 a, b, c 라는 컬럼이 있는데 출력이 a, b, c 순서가 아닌 c, a, b 순서로 바꾸고 싶습니다.
    2. 두번째는 df의 왼쪽에 보면 번호가 있는데 (1, 2, 3, 4) 이부분을 접근하는 방법이 있는지 궁금해서 여쭤봅니다.
    감사합니다.

    • JKyun 2017.04.25 10:26 신고

      안녕하세요~

      1.
      df = data.frame(a=c(1,2), b=c(2,3), c=c(3,4), d=c(4,5))

      df[,c(1, 3, 2, 4)]
      df[,c(4, 3, 2, 1)]

      인덱싱을 활용해서, col의 열 순서를 바꿨습니다.
      그대로 실행해보시면 이해가실거에요.

      2.
      왼쪽 1, 2, 3, 4 는 몇번째 행인지 알려주는 정보로 이 부분 또한 인덱싱으로 접근하면 되지 않을까요?

      df[1,]의 경우 첫번째 행의 요소들에 접근,
      df[1,3]의 경우 첫번째 행의 세번째 열의 요소에 접근.

      참고로, 행 또한 열처럼 이름을 지정하여 접근할 수 있습니다.

      위의 코드에서
      rownames(df)= c('a', 'b') 와 같이 실행해보세요~

  2. 리메 2017.04.26 07:48

    답변주셔서 감사합니다.
    1번 질문은 아주 깔끔하네요. 생각 못했던 방법인데 여쭤보길 잘했다는 생각이 듭니다.
    2번 질문도 깔끔하게 정리되네요. 2번은 부연설명을 드리면 주가 정보가 있는 아래와 같은 stock.info라는 데이터가 있다고 가정할 때,

    Date Open High Low Close Volume
    1 2017-04-24 43550 43800 41350 41400 212729
    2 2017-04-21 43900 43950 43550 43750 55718
    3 2017-04-20 43650 44200 43300 43750 68882
    4 2017-04-19 44750 45400 43450 43550 236404
    5 2017-04-18 43950 45250 43950 45000 103425
    6 2017-04-17 44250 44700 43800 44100 51535

    이에 대한 수익금을 계산하기 위하여 앞 행에서 뒤 행의 주가를 차감하여 새로운 데이터 프레임 profit을 다음과 같이 만들 경우,
    profit<-stock.info[ ,2:6]
    profit<-profit[2:NROW(profit), ] - profit[1:NROW(profit)-1, ]

    이 상황에서 profit을 출력해보면 row number 가 1번이 아닌 2번부터 시작을 합니다.
    별건 아니지만 이걸 어떻게 1번부터 만들까 고민하고 있었는데, rownames 를 제가 모르고 있었던 거네요.

    좋은 답변 감사드립니다.


  3. 2021.02.05 11:42

    비밀댓글입니다

안녕하세요. 우주신 입니다.


 오늘은 행렬(Matrix)에 대해 배워보겠습니다.



행렬은 동일한 유형의 2차원 데이터 구조입니다.


[m * n 행렬]



[사칙 연산]


행렬에서 사용하는 연산자는 +(덧셈), -(뺄셈), *(원소곱셈), %*%(행렬곱셈), /(나눗셈), %%(나머지), ^(제곱)이 있습니다.



연산을 하기에 앞서 X, Y 행렬을 만들었습니다. 

데이터구조 포스팅에서 배웠던 것을 복습해 본다면,

X <- matrix(1:9, nrow=3, byrow=FALSE)

"1부터 9까지의 숫자를 행(row)의 수가 3개인 행렬에 위에서 아래의 방향으로 넣어라"

Y는 왼쪽에서 오른쪽 방향으로 수를 넣은 행렬입니다.


이제 연산을 해보겠습니다.

+, -, /, %%, ^의 경우에는 각각의 위치의 원소들끼리 연산이 됩니다.


행렬 연산에서 주의해야 할 부분은 곱셈입니다.


첫번째 곱셈 X*Y 는 위 연산들과 마찬가지로 각각의 위치의 원소들끼리 곱한 결과를 입니다.


두번째 곱셈 X %*% Y 는 행렬의 곱셈으로서 제가 고1 때 배웠던 방식 입니다.


두 행렬을 잘 비교해 보시기 바랍니다 ~_~


밑에 그림과 같이 행과 열이 다른 행렬끼리 연산을 할 경우 오류가 나니 주의!



[기본 함수]


1. 행렬 결합 함수 cbind( ), rbind( )



말 그대로 행렬을 결합하는 함수입니다. 

c는 column의 약자로 열끼리 결합, r은 row의 약자로 행끼리 결합 하라는 의미 입니다.



2. 행렬 평균, 합을 구하는 함수 rowMeans( ), colMeans( ), apply( )



행렬 전체 평균과 합은 mean(X), sum(Y)로 구할 수 있습니다.

그러나 특정 행이나 열의 평균을 구해야 할 때가 많습니다. 

rowMeans(X): 각 행의 평균

colMeans(X): 각 열의 평균

합도 마찬가지로 rowSums( ), colSums( )을 이용하면 됩니다.


apply( )함수를 이용할 수도 있습니다.

apply(X, MARGIN, FUN, ...)

X: matrix

MARGIN: 1(row), 2(col)

FUN: 기능 (function)



3. 행렬에 이름 붙이기 rownames( ), colnames( )


이제, row와 col 뜻을 외웠으니 쉽게 이해할 수 있겠죠?



4. 전치함수 t( )

t는 transposition의 약자로 교환이라는 뜻 입니다.

Z함수를 전치한 결과 행과 열이 바뀐 것을 확인할 수 있습니다.



[인덱싱]


앞 시간에 배운 벡터의 인덱싱보다 쪼오금 복잡해 졌지만 같은 원리입니다.



-X[1, ]: X에서 1번째 행 전체 구성요소를 가리켜라.

-X[-1, ]: X에서 1번째 행을 제외한 전체 구성요소를 가리켜라.

-X[2, 2]: X에서 2번째 행과 2번째 열에 있는 구성요소를 가리켜라.

-X[1, c(2,3)]: X에서 1번째 행의 2, 3번째 열에 있는 구성요소를 가리켜라.





끝.


꼭 직접 연습해보시길 바랍니다.


수고하셨습니다.


안녕하세요! 우주신입니다.


오늘은 데이터 구조 중 하나인 벡터(Vector)에 대해 배워보겠습니다.


앞시간에 설명했듯이, 벡터는 동일한 유형의 데이터로 구성되어 있는 1차원 데이터 구조입니다.


가장 기본적인 데이터 구조로서 정말 많이 쓰이죠.


벡터와 관련해 많은 기능과 함수가 존재하지만 가장 기초적인 것부터 살펴 보겠습니다.




[ 사칙 연산 ]


R에서 사용하는 연산자는 +(덧셈), -(뺄셈), *(곱셈), /(나눗셈), %/%(정수나눗셈), %%(나머지), ^(제곱) 등이 있습니다.

우선순위는 괄호, 지수 및 근호, 곱하기와 나누기, 더하기와 빼기 순서인 표준적인 연산의 우선순위와 같습니다.



연산을 하기 위해 길이가 4인 벡터 X와 Y를 만든 후, +(덧셈)과 *(곱셈)을 해봤습니다.

나머지 연산자들도 직접 해보시면 금방 이해가 갈 것 입니다.

R에서 나머지 연산은 %가 아니라 %% 입니다. (7/3의 나머지는 1이고 그 외는 다 나머지가 0이죠.)


당연히 위에 나온 식들은 연산 결과를 나타낼 뿐, 저장 되지 않겠죠?

저장하기 위해선 밑과 같이 별도의 벡터 (Sum)에 그 값을 넣어줘야 합니다.




[기본 함수]


c( )함수를 통해 벡터를 가지고 새로운 벡터를 정의할 수도 있습니다.

X2 결과를 보면 벡터 X 두개가 합쳐서 출력 되는 것을 볼 수 있습니다.


작업을 하다보면 엄청난 양의 수를 다뤄야 할 때가 많습니다. 이 때 모든 수를 일일이 입력하기에는  너무 귀찮죠ㅠ

이럴 땐 밑과 같이 ':' 기호를 사용하면 됩니다!

Z <- c(1:20) 코드를 실행하면 Z에 1부터 20까지 입력됩니다. 정말 편리하죠?


길이가 서로 다른 X와 Z를 더해도 R에서는 X의 길이를 Z에 맞춰 연산을 가능하게 합니다.

1, 2, 3, 4로 구성된 X가 Z의 길이에 맞춰 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4로 변환되어 연산이 됐습니다.


참고로, 길이는 length( )함수를 통해 확인할 수 있습니다.


좀 더 복잡한 수식을 넣기 위해  seq( ), rep( ) 함수를 이용해보죠.

seq(1부터 30까지 4 간격으로 출력하라)


rep(1, 2, 3을 각각 3번씩 출력하라)


그 다음 줄에는 두 함수를 가지고 응용해봤습니다.

-1부터 10까지 3간격으로 출력하라 > 1, 4, 7, 10

-1, 4, 7, 10을 각각 1, 2, 3, 4번씩 출력하라



[인덱싱]


R에서 데이터 일부분을 선택하는 작업을 인덱싱이라고 합니다. 부수지기로 사용하는 인덱싱은 대괄호[ ]로 나타냅니다.

R에서는 아주 강력한 무기입니다. 한번 살펴보죠.


좀 전에 Z에 1부터 20까지의 숫자를 넣었죠?


인덱싱을 통해 원하는 숫자를 출력해보겠습니다.

-Z[2]: Z의 두번째 구성요소 2를 가리켜라.

-Z[c(1, 3)]: Z의 첫번째와 세번째 구성요소를 가리켜라.  ( Z[1, 3]이 아닙니다. 실수 주의 )

-Z[10:13]: Z의 10번째부터 13번째 구성요소를 가리켜라.

-Z[-10:-13]: Z의 10번째부터 13번째 구성요소를 제외하고 나머지 구성요소를 가리켜라.

-Z[Z>10]: Z의 구성요소 중 10보다 큰 숫자를 가리켜라.

-X[c(TRUE, FALSE, TRUE, FALSE)]: X의 구성요소 중 TRUE 있는 위치의 구성요소를 가리켜라.





끝.


꼭 직접 연습해보시길 바랍니다.


수고하셨습니다.





+ Recent posts