Data Science/R

인프런 - R 프로그램 기초다지기 (21.01.20 ~ 02.01)

winney916 2021. 3. 22. 19:48
728x90

드디어... 드디어 R셋업을 끝냈다.... 하... 내일부터 진짜 빡세게 시작한다.. 오늘의 나에겐 여가를..

1 week

- 뭐 처음 봤다고 할만한 건 연산자 정도?

%% -> 나머지

%/% -> 나눗셈

[ 대괄호 ] -> 데이터에 접근

( 괄 호 ) -> 데이터 생성!

- 리스트 만드는 방식이 여러가지가 있는데 처음 본게 있다.

seq() : Sequence Generation, 말 그대로 시퀀스를 만들어주는데

(from, to, options) 기본적인 인자는 이렇게 들어간다.

옵션에는 다음과 같은데,

by > number: increment of the sequence. 얼마 단위로 리스트를 만들건지 설정한다. 디폴트는 1, 파이썬의 for문이랑 비슷하다고 보면 되다.

length.out > desired length of the sequence. A non-negative number, which for seq and seq.int will be rounded up if fractional. 리스트의 길이를 설정한다. from에서 to까지의 길이를 설정하게 되면 그 갯수만큼의 value를 넣어줄 수 있는 by값이 자동으로 설정되어 리스트를 만든다.

along.with

take the length from the length of this argument. 안써봄

- matrix

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

byrow는 어느방향으로 데이터를 넣어줄 건지를 설정하는 방식이다. default가 false이기 때문에 기본적으로 열 기준으로 데이터가 삽입된다.

- 데이터 불러오기

read.csv("link", header=TRUE) -> csv파일을 불러오는 방식. header는 column별 name을 가져올지 결정

head(data) -> 데이터의 header를 포함해서 6 column을 보여준다.

data[a,b] 이런식으로 행열에 접근하고, data$name 을 통해서 column의 name을 가지고 호출할 수 있다.

names(data)로 column name만 따로 호출할 수 있다.

2 week

- 데이터 시각화

#파이차트 (Pie chart) - 적용대상 > 카테고리컬 데이터 (categorical data)

ex) 성별변수 -> 남성 or 여성

pie(data)를 하면, pie chart를 그려준다.

- table(data) : table uses the cross-classifying factors to build a contingency table of the counts at each combination of factor levels.

=> contigency table : 분할표 : 명목형, 순서형 데이터의 도수(frequency, 변량의 개수)를 표로 나타낸다.

- text(x, y, something) : pie 등을 이용해 차트를 그린 후, 해당 좌표에 텍스트를 작성해준다.

#줄기잎그래프 (Stem and leaf plot)

- 적용대상 > 크기가 작은 데이터에서, 각각의 데이터 및 전체적인 분포를 파악하는데 유리

stem(data, scale=) 를 하면 줄기 잎 그래프를 그려준다. scale을 조절하면 분류 단위를 바꿔줄 수 있다.

#히스토그램 (Histogram)

hist(data, breaks, main, xlab, ylab)

- breaks 는 x축을 설정하는건데, c(values) 형태로 설정할 수 있다. 근데 그냥 값을 때려박지 말고 c(a,b)*X 뭐 이런식으로 좀 현명하게 작성하자

- main : 차트제목

- xlab, ylab : 각 축의 이름을 정해줄 수 있다.

#상자그림 (box-plot)

boxplot(data, data ....... , main, xlab, ylab, names = c(), horizental = T)

데이터 세트를 여러개 넣어서, 케이스별 분포를 파악하는데 도움이 된다. (꽤나 어려운 편이라고 함)

names 는 그 데이터의 이름을 작성해주는 역할을 하고, horizental 은 가로로 볼건지 세로로 볼건지를 설정해준다 (default = F)

#산점도 (scatter plot)

plot(x-axis data, y-axis data, xlab, ylab, main, asp) - 적용대상 > 두가지 데이터의 분포를 파악하는데 용이

asp 옵션이 좀 어려운데, 가로축 세로축의 scale을 비율에 맞춰서 조정해주는 옵션이다. 보통 1로 맞추자.

3 week

- 데이터를 요약하는 통계 지표

#평균과 중앙값

평균 -> (중앙값보다) 극값에 민감하다

=> 평균==중앙값 일 경우에는 대칭분포가 되고, 그렇지 않을 경우에는 기운 분포(skew)가 된다.

오른쪽으로 기운 분포 (skew to right) VS 왼쪽으로 기운 분포 (skew to left) 이게 약간 헷갈릴 수 있는데,

중앙값 < 평균 중앙값 < 평균

표본이 그래프의 왼쪽에 몰려있는 경우 오른쪽에 몰려있는 경우

이게 왜 이러는 거냐면, 중앙값과 평균값이 동일한 상황에서, 특정 표본 들로 인해서 평균값이 중앙값으로부터 끌려가는 방향을 생각하면 된다. 오른쪽으로 기운 분포는 평균이 오른쪽으로 끌려가는 상황인거라서 표본은 왼쪽에 몰려있고, 왼쪽으로 기운 분포는 그 반대라고 보면 된다.

#box-plot 이론편

사분위수(quartiles)를 표현한다. -> 자격증 공부할 때 많이 봤음!

사분위수를 Q1, Q2, Q3 라고 할 때,

1. step : Q1, Q2, Q3

2. IQR : Interquatile range = Q3 - Q1

3. 가상의 울타리 만들기

- 오른쪽 (upper fence) : Q3 + 1.5*IQR

- 왼쪽 (lower fence) : Q1 - 1.5*IQR

4. 데이터 중에 가상의 울타리 안에서 가장 큰 데이터와 작은 데이터의 포인트를 구한다.

5. 그리고 가상의 울타리를 지우고 가장 큰 데이터와 가장 작은 데이터 포인트로 좁힌다.

6. 가상의 울타리 바깥에 있는 값은 점으로 찍는다.

#IQR

중심을 나타내는 지표 : 중앙값, 평균 -> 분포의 퍼진 정도를 판단하는건 어렵거나 불가능하다. 그래서 등장한 지표

IQR(InterQuatile Range) : 분포의 퍼짐을 측정하는 통계지표이다.

Q1과 Q3를 통해서 구하는 거기 때문에, IQR의 크기는 전체 데이터의 50%가 분포되어있는 범위를 의미한다. 즉 IQR이 클수록 분포가 넓게 퍼져있다.

#분산과 표준편차

모분산, 표본분산 -> ? 이건 좀 더 알아보자

여튼 분산 구하고 표준편차 구하는거야 쉽지

mean(data) : 평균(mean)

median(data) : 중앙값(median)

var(data) : 분산(variance)

sd(data) : 표준편차(standard devidation)

4 week

- function

약간 파이썬이랑 JS가 섞여있는 듯한 느낌이다.

functionName = function(attrs) {

<code>

return something

}

종결 문법이나 뭐 이런건 없다. 필드만 설정하면 그만.

- 함수 실습 -> 최빈값 찾는 함수 만들기

mode(data) -> (storage) mode, 데이터 타입을 반환한다.

table(data) -> 데이터를 기반으로 테이블 형식을 만들어준다. 동일한 값의 갯수를 세어서 밸류로 놓는 등,.

names(table_data) -> 테이블의 컬럼 네임을 가져와준다.

- 논리연산자 (operate)

파이썬이랑 같다.

- 카테고리컬 변수

summary(data) : data에 대한 five number summary를 리턴해준다. 최솟값, 최댓값, 4분위수, 중앙값, 평균

데이터 필터링을 할 때 data[condition return boolean] 이런 방식으로 진행하면 필터링이 굉장히 편해진다.

5 week

- 상관계수 기초 => r

두 변수의 선형적인 관계를 측정.

-1 =< r =< 1 : 절대값은 관계의 정도를 나타내고, 부호는 방향을 나타낸다. 0에 가까울수록 선형적인 관계는 낮다고 본다. (선형적 의미의 관계가 없는거지, 두 변수가 무관하다는 의미인건 아니다.)

기본적으로 두 변수의 공분산을 두 변수의 표준편차로 나눔으로써 구할 수 있다.

- 상관계수(Correlation Coefficient) 실습

상관계수를 계산하는 과정을 시각화 했는데, plot함수를 사용할 때, col = 옵션에 리스트 형태의 색을 주고 [as.factor()] 라는 형태로 조건을 걸어주면 특정 조건에 맞춰서 색깔을 부여할 수 있다.

추가로 cex = 옵션을 이용하면, 점의 크기를 조절한다. 여기에 변수를 사용한 방정식을 넣어주면 계산 값에 따른 점의 크기를 설정할 수 있다.

상관계수 다시보기!!

6 week

- 직선의 방정식 : y = a + b*x : a = intercept, 절편, b : slope, 기울기

직선을 그리는 함수는 abline(a, b, options) 이다. 직선의 방정식에서의 a와 b를 설정해 준다고 보면 된다. 대표적인 option으로는 col=이 있다. (v, h 옵션을 통해서 수직, 수평의 X,Y 값만을 설정해서 추가할 수도 있다.)

plot함수가 자주 나오는데, (Generic X-Y plotting)

plot(x, y, type=, xlim, ylim ...)

type에는 여러가지가 있는데 이건 help에서 찾아서 보도록 하고, 오늘 사용했던건 type="n" : for no plot 점을 안보여준다. xlim 은 x limit. x축의 극값을 설정해준다. 리스트 형태로 설정해야한다. c(a,b)

plot을 그리고 나서 점을 더 찍고 싶으면 points 함수를 사용해도 좋다. potins(x,y)인데, x,y에는 각각 대응하는 형태의 리스트를 넣어줄 수 있다.

- 회귀분석 (Regression analysis)

독립변인과 종속변인사이의 관계를 알아내는 방법.

어떤 직선을 사용하는게 가장 좋을까? 라는 의문을 남김

- 잔차제곱합(RSS : Residual Sum of Square)

회귀분석을 할 직선을 선택한 뒤, 특정 표본에서부터의 길이를 제곱해서 더한 값이다. (제곱을 하는 이유는 부호를 없애기 위해서)

때문에 이 값을 최소로 만드는 직선이 가장 좋은 직선이라고 할 수 있다.

RSS = 시그마(Yi - Y햇i)제곱

- R 실습

문제가 있다. 어찌됐건 회기분석을 이용하기 위해서는 a와 b를 지속적으로 변경하면서 RSS를 구해야하는데 이 반복이 너무 귀찮잖아? 그래서 optim함수를 쓴다.

optim(initial_value_XandY, function) 하면 된다.

초기값부터 시작해서 자동으로 구해준다.

- using rgl

rgl패키지 : 3D 가시화를 해주는 패키지이다. 이걸 사용해서 최적의 RSS를 확인해보자.`

Vectorize : 함수의 동작을 벡터화 하는 wrapper를 생성한다.

rgl 패키지

- open3d() : 3D 윈도우를 열어준다.

- persp3d() : 3D 상에 점을 찍어준다. 일반 plot이랑 사용하는 방법은 똑같다. 함수를 넣어줄 수도 있다.

- rgl.spheres() : 말 뜻 그대로, rgl 패키지 중에서 구를 그려주는 패키지이다. 좌표랑 반지름을 설정해줘야한다.

- 회귀직선 손으로 구현하기(?)

- 회귀분석 라인을 어떻게 그릴까

lm() : linear model, 회귀분석은 선형 모델 중에 하나이다. 이 함수를 통해서 회귀분석 라인을 그릴 수 있다.

ADsP수험서에서 ~라는 표현이 나와서 어려웠는데, 예를 들어 설명하면 이런식이다.

회기분석을 할 때는, Y = aX + b 라는 식에 XY값으로 데이터를 대입하면서 a, b의 최적해를 구해야한다.

(정확한 식은 Y = aX + b + 엡실론(오차))

근데 우리가 넣어주면 되는 값은 Y, X이기 때문에, 함수를 사용할 때 저 식을 모두 적어줄 필요가 없다. 함수는 이미 저런 형태의 수식을 사용한다는 것을 알고 있기 때문에 우리는 우리가 넣어주기면 하면 되는 값을 적어주면 된다.

Y = X, 근데 등호를 쓰면 안될거아냐?(같질 않으니까) -> Y ~ X 형태로 작성하게 된다.

즉, lm(독립변수 ~ 종속변수) 형태로 작성하면 된다.

그래서, lm(Y~X, data) 형태로 작성해주면 되고, Y랑 X는 당연히 data colname이여야겠지.

이후 결과를 summary함수를 통해서 보게되면, Residuals, Coefficients을 보여준다.

Residuals : 남아있는, 잔류의 라는 의미인데 왜 여기서 쓰이는건지 모르겠다. 최솟값 4분위수 최댓값.

Coefficients : 계수. 상관분석을 할 때 사용했던 표현인데, 회귀분석에서는 [절편(intercept), 기울기(slope)]가 계수가 된다.

이를 산점도 plot에 abline해주면 가시적으로 볼 수 있다.

7 week

- 불규칙성 (randomness) 에 대하여

음 무슨 얘기를 하려는 건지 감이 잘 안오긴 하는데,, 랜덤함을 만들기 위해서 시간을 사용했다는 정도?

시간을 이용해서 함수를 만들 수 있는데, R에 함수가 이미 있다. => runif(1)

0~1까지의 수 중 아무수나 반환해준다. JS랑 비슷하네!

-> runif는 확률적으로 봤을 때 모든 변수가 발생할 확률이 동일하다. -> 정규분포를 따르는 함수가 필요!

- 잡음의 시각화

수리통계학에서의 확률 => 확률분포함수의 넓이, 근데 왜이렇게 수리통계학이 쉬워보이지?.... 책은 모르겠는데..

8 week

- 정규분포와 잡음

여기서는 측정오차를 예로 들었는데, 측정을 하게되면 항상 오차가 발생하고, 측정값의 대부분은 실제 값 주변에 분포하게 된다.

이 분포 형태를 보고 정규분포라고 하고, 이런 형태의 확률변수(정규확률변수, 정규분포를 따르는 확률변수) 이를 구현한 R프로그래밍 함수는 rnorm()이다. random normal distribution.

<정규분포의 특징>

평균이 μ이고, 분산이 σ제곱인 정규분포는 N( μ , σ제곱)으로 나타낸다.

- 평균을 중심으로 대칭. 평균 => 확률밀도함수의 최정점

- 2개의 파라미터. 평균, 표준편차

- mean : 분포의 중심을 결정

- sd : 분포의 퍼짐을 결정

- 모든 정규분포는 68-95-99.7 룰을 따른다.

: 약 68% => 평균으로부터 1 표준편차 범위, 표준편차가 1씩 추가될 때마다 95, 99.7. 대부분의 정규분포가 대략적으로 따른다.

- rnorm() : random 난수

- 예쁜 종 모양의 형태

- 0을 기준으로 대칭

- 이론상으로 -무한대에서 +무한대까지 값이 나올 수 있도록 설계되어있다.

- dnorm() : Density 밀도 / pmf 확률질량함수 (Probability Mass Function)

: 가능도 함수 정보를 담고있는 함수. 즉 이산확률변수(확률변수 x가 취할 수 있는 값이 이산집합 ex, 유한집합 or 가산집합 일 경우)가 취하는 확률을 나타내는 함수.

- pnorm() : cdf 누적분포함수 (Cumulative Distribution Function)

: 특정 값보다 작거나 같을 확률을 보여준다. lower.tail 이라는 함수가 있는데, 기본값은 TRUE이다. 값을 기준으로 작거나 같은 확률(왼쪽넓이)를 구한다. FALSE로 바꾸면 오른쪽인건 알겠지?

- qnorm() : 분위

: qnorm(확률, 그외동일), 특정 확률에서의 분위수를 구하는 함수이다.

<표준화 : Standardization>

표본의 범위가 달라도 같은 형태의 연산을 진행할 수 있도록 같은 범위로 만들어주는 과정.

1. 평균(mean)을 빼기 -> 범위의 위치 변경

2. 표준편차(sd)로 나누기 -> 범위변경

=> ( X - m ) / σ

음 고등학교 때 배운 내용을 복습하면서 R프로그램에 적용시키는 방법을 배운 느낌이군.

9 week

- 회귀분석 계수 + 확률변수

: 현실에서는 전체집단을 대상으로 통계를 진행할 수가 없다. 표본집단을 통해서 회귀분석을 진행할 수 있고, 여기서 얻어지는 기울기와 절편은 매번 변할 수 있다. 즉 확률변수와 같은 형태를 띈다. (표본에 따라서 변하게 된다.)

때문에 검정통계량, p-value, 신뢰구간 등을 통해서 신뢰도 검증을 해야한다.

파트 1 끝!

[출처] 인프런 - R 프로그램 기초다지기 (21.01.20 ~ 02.01)|작성자 winney