웅진X유데미 STARTERS/TIL (Today I Learned)

[스타터스 TIL] 13일차.기초부터 익히는 R (3) - ggplot2, 텍스트 마이닝, 단계 구분도, 통계분석

라밍쏭 2023. 2. 23. 16:57
728x90


1. ggplot2

1.1 Layer 구조

- ggplot2의 문법 구조는 data layer부터 시작하여 각 층의 요소들을 더해 시각화를 완성하는 방식이다.

- Data , Aesthetics , Geometries 층은 데이터 시각화를 위해 반드시 적용되어야 하는 층

 

- Data (데이터) : 시각화를 하려는 데이터를 입력하는 층 (dataframe 형식 사용)

- Aesthetics (미학적) : 데이터를 매핑하고자 하는 스케일 설정 (x,y축 컬럼 지정, 색, 모양, 범위 등)

- Geometries (기하학) : 데이터를 사용하는 시각화 요소 정의 (점/선, 히스토그램, 원, 박스플롯 등)

- Facets (양상) : 특정 기준에 따라 그래프를 나눔 (화면 분할)

- Statistics (통계) : 그려진 그래프에 대한 통계적인 시각화 처리

- Coordinates (좌표) : 좌표계를 조작

- Themes (테마) : 데이터가 아닌 추가 꾸미기 요소 (제목 등)

 

 

1.2 qplot()

- Quick plot

- 빠르게 데이터 시각화할 때 사용 (기본 시각화 함수(plot)과 유사한 사용법)

- 데이터 외의 값을 지정하지 않아도 기본 값 사용 가능 (layer 별 문법 요소 지정 기능은 존재함)

qplot(data = '사용할 데이터명', x = 'x축 변수', y = 'y축 변수')
# 0) 데이터 불러오기
diamond = diamonds
str(diamond)

 

✅ 색이 동일한 산점도 그래프

qplot(data = diamonds, x = carat, y = price)

 

✅ 표현된 산점도에 특정 컬럼 데이터 표현

qplot(data = diamonds, x = carat, y = price, aes(col = cut))

 

✅ 박스플롯

# cut 컬럼 데이터 별 색상 추가 (aes(col = cut))
qplot(data = diamonds, x = cut, y = price, aes(col = cut), geom = 'boxplot')

# cut 컬럼 데이터 별 색상 추가 (aes(col = clarity))
# → x축 컬럼에 clarity 별 데이터 그래프 생성
qplot(data = diamonds, x = cut, y = price, aes(col = clarity), geom = 'boxplot')

 

1.3 ggplot()

- grammer of grapics plot

- 그래픽 문법 요소 층을 직접 쌓아서 데이터 시각화

- '+' 연산자를 사용하여 문법 요소 추가

 

ggplot(data = '데이터명, mapping = aes(x = 'x축 변수', y = 'y축 변수',...)

 

✅ 그래픽 틀만 출력

ggplot(diamonds, aes(x = carat, y = price, color = cut))

 

✅ 산점도

1) 기본

ggplot(diamonds, aes(x = carat, y = price, color = cut)) +
  geom_point()

 

 

2) 모든 점에 동일한 색 지정

# (color : 점 테두리 색, fill : 점 내부 색)
ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point(shape=21, color='blue', fill='black')

 

3) 범주 별 다른 색 지정

# 1)
ggplot(diamonds, aes(x = carat, y = price, col = cut)) +
  geom_point(shape=11)

# 2)
ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point(shape=11, mapping = aes(col = cut))

 

✅ 선 그래프

1) 그래프 끝 화살표 표현

ggplot(diamonds[1:100, ],  aes(x = carat, y = price))+
  geom_line(arrow = arrow())

 

2) 그래프 색상 및 두께 설정

ggplot(diamonds[1:100, ],  aes(x = carat, y = price))+
  geom_line(color = 'blue', size = 2)

 

✅ 막대 그래프

# x축 데이터를 clarity 데이터 별 다른 색상으로 그래프 그리기
ggplot(diamonds, aes(x = cut, fill = clarity))+
  geom_bar()

 

✅ 히스토그램

- binWidth : 히스토그램 데이터를 나누는 구간의 길이 (히스토그램 바 갯수 아님)

# default bin 갯수는 30개
# `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(diamonds, aes(x = carat, fill = clarity))+
  geom_histogram()

 

- binwidth 길이 설정

ggplot(diamonds, aes(x = carat, fill = clarity))+
  geom_histogram(binwidth = 1)

 

✅ 박스플롯

- y축 값은 '수치형'만 가능

- x축 값이 '범주형'일 경우, 범주 별 데이터의 박스플롯 가능

ggplot(diamonds, aes(x = cut, y = carat))+
  geom_boxplot()

 

- x축 데이터를 clarity 데이터 별 다른 색상으로 그래프 그리기

ggplot(diamonds, aes(x = cut, y = carat, fill = clarity))+
  geom_boxplot()

 

1.4 옵션 layer 

✅ Facets Layer

- 범주 값 별 서브그래프 분석 (화면 분할 가능)

- '~' 뒤에 서브 그래프를 그릴 범주형 컬럼명 기입

 

1) 1개의 범주형 컬럼에 대한 서브 그래프

ggplot(diamonds[1:1000, ], mapping = aes(x = carat, y = price))+
  geom_point()+
  facet_wrap(~cut,    # 범주형 컬럼 변수
             labeller = label_both,  # 컬럼명과 범주값 함께 출력
             nrow = 1, ncol = 5)  # 행,열 갯수 설정

 

2) 2개의 범주형 컬럼에 대한 서브 그래프

ggplot(diamonds[1:100, ], mapping = aes(x = carat, y = price))+
  geom_point()+
  facet_wrap(cut~color,    # 범주형 컬럼 변수 (2개)
             labeller = label_both,  # 컬럼명과 범주값 함께 출력
             nrow = 5, ncol = 7)  # 행,열 갯수 설정

 

✅ Statistics Layer 

- 데이터에 대한 통계값을 시각화해주는 층

 

1) 데이터에 회귀선을 그리는 함수 - stat_smooth

- level : 신뢰구간 (0.0 ~ 1.0)

ggplot(diamonds, aes(x = carat, y = price))+
  geom_point()+
  stat_smooth(level = 0.95)

 

2) x값에 대한 y값의 간단한 통계값을 그래프에 그려주는 함수 - stat_summary

ggplot(diamonds[800:1000, ], mapping = aes(x = cut, y = price))+
  geom_point()+
  stat_summary(fun.y = mean,   # 통계값을 평균값으로 설정
               color = 'red',  # 통계값 표현 색상
               size = 1)       # 통계값 표현 크기

 

✅ Coordinate Layer

- x축 또는 y축 정보를 변형하는 시각화 층

- 주요 함수

   → coord_cartesian(xlim, ylim) : x축, y축 범위 지정

   → coord_flip() : x, y축 반전

   → coord_polar() : (x, y) 좌표계를 극좌표계로 변환

 

1) 기본 막대그래프

ggplot(diamonds[1:1000, ], mapping = aes(x = '', y = cut, fill = cut))+
  geom_bar(stat = 'identity', width = 1)

 

2) coord_cartesian(xlim, ylim)

ggplot(diamonds[1:100, ],  aes(x = carat, y = price))+
  geom_line(color = 'blue', size = 2)+
  coord_cartesian(xlim = c(0, 2))

 

3) coord_flip()

ggplot(diamonds[1:1000, ], mapping = aes(x = '', y = cut, fill = cut))+
  geom_bar(stat = 'identity', width = 1)+
  coord_flip()

 

4) coord_polar(theta = 'y') - 원형으로 변환

ggplot(diamonds[1:1000, ], mapping = aes(x = '', y = cut, fill = cut))+
  geom_bar(stat = 'identity', width = 1)+
  coord_polar(theta = 'y')

 

✅ Theme Layer

- 그래프 배경색, 축 라벨 색 지정

ggplot(diamonds, mapping = aes(x = carat, y = price))+
  geom_point()+
  ggtitle('Title of Diamond Dataset')+   # 제목 지정
  theme_gray()+     # 배경색
  theme(axis.title.x = element_text(colour = 'blue'),   # x축 라벨 색 지정
        plot.title = element_text(color = 'red'))       # 제목 색 지정

 

1.5 2021년 9월 폭염 데이터셋 활용 시각화

ggplot(data, mapping = aes(x = 최고기온, y = 최고체감온도, col = 자외선지수))+ 
  geom_point()+    # 산점도
  facet_wrap(~자외선지수)+   # 자외선지수 별 그래프 그리기
  stat_smooth(level = 0.99)+   # 신뢰구간 0.99
  coord_cartesian(ylim = c(20, 33))+    # y축 범위 지정
  ggtitle('2021년 9월 대한민국 최고기온 대비 최고체감온도')+    # 그래프 타이틀 설정
  theme_bw()+     # 그래프 배경색 흰색으로 변경
  theme(plot.title = element_text(color = 'red'),       # 제목 색 변경
        axis.title.x = element_text(colour = 'blue'),   # x축 색 변경
        axis.title.y = element_text(colour = 'green'))  # y축 색 변경


2. 텍스트 마이닝

텍스트에서 단어들을 분해하여 단어의 빈도, 단어들 간의 관계성을 파악하여 의미있는 정보를 추출해내는 기술

 

2.1 KoNLP 설치

KoNLP를 설치해서 사용해야 하는데, 버전이 달라서 오류가 발생한다. (파이썬도 그렇듯 늘 오류나는 아이..^^)

그래서 구글링해서 오류 해결하고 설치했다. (Troubleshooting으로 박제해둠..!)

 

[Troubleshooting] KoNLP 설치 오류 해결 방법

R에서 KoNLP를 설치하는 과정에서 오류가 발생하고 설치가 되지 않아 구글링으로 방법을 찾고 실행하니 정상적으로 설치되었다. 혹시 모르니 과정을 블로그에 박제!🤡 (다른 블로그의 포스팅을

ars420.tistory.com

 

2.2 영화평 텍스트 마이닝 & 워드클라우드 시각화

- readLines() : 각 줄을 문자열로 다룸. 반환값은 문자열로 이뤄진 '문자 형식의 벡터'가 됨

- str_replace_all() : 모든 문자를 치환할 때 사용

- extractNoun() : KoNLP 패키지의 함수로 텍스트에서 명사를 추출함

 

- rColorBrewer 패키지 : 색상 팔레트를 제공함

- brewer.pal(색의 수, 팔레트명) : 팔레트에 있는 색상을 원하는 갯수대로 가져옴

 

💡 전체 코드는 깃허브 참고 💡

 

GitHub - aramssong/Udemy_STARTERS

Contribute to aramssong/Udemy_STARTERS development by creating an account on GitHub.

github.com

 

wordcloud(words = df_word$word, 
          freq = round(sqrt(df_word$freq)),   # 빈도 (sqrt 함수 사용하여 차이 줄임)
          min.freq = 5,      # 최소 단어 빈도
          max.words = 200,   # 표현 단어수
          random.order = F,  # 고빈도 단어 중앙 배치 
          rot.per = .1,      # 회전 단어 비율
          scale = c(4, 0.5), # 단어 크기 범위
          colors = pal)      # 색상 목록

 

2.3 트위터 텍스트 마이닝 & 막대그래프

- geom_col() : 범주형(x)별 값(y)을 막대그래프로 그려줌
- scale_x_discrete() : 
x축 좌표 값을 범주형 값으로 변경
- geom_text() : 
그래프 내 텍스트 그려주는 함수

 

💡 전체 코드는 깃허브 참고 💡

 

GitHub - aramssong/Udemy_STARTERS

Contribute to aramssong/Udemy_STARTERS development by creating an account on GitHub.

github.com

 

ggplot(top20, aes(x = word, y = freq))+
  geom_col()+
  scale_x_discrete(limit = order)+
  ggtitle('국정원 트윗 고빈도 노출단어 Top 20')+
  geom_text(aes(label = freq), vjust = -0.8)

 


3. 단계 구분도

3.1 미국 주별 강력 범죄율 & 단계 구분도 그래프

- ggiraphExtra 패키지 : ggChoropleth() 함수로 단계 구분도 그래프를 그릴 수 있음

- ggChoropleth() : 단계구분도 그래프

   → 매개변수 interactive = T : 사용자의 마우스를 따라서 추가적인 데이터 정보 제공

 

- tibble 패키지 : tibble도 데이터프레임이지만, 편리하게 사용할 수 있도록 오래된 동작을 수정한 것임

- rownames_to_column(df, var = '새로운 컬럼명') : 행 이름을 변수로 변환

 

- maps 패키지 : 지도를 그리기 위한 위도, 경도 및 이에 매칭되는 나라의 정보를 데이터프레임셋으로 만들 수 있게 해줌

- gridExtra 패키지 : 여러 그림들을 하나의 plot으로 그려줌

 

- tolower() : 영문자를 모두 소문자로 변환

 

💡 전체 코드는 깃허브 참고 💡

 

GitHub - aramssong/Udemy_STARTERS

Contribute to aramssong/Udemy_STARTERS development by creating an account on GitHub.

github.com

 

✔ 단계 구분도 (주별 살인율)

ggChoropleth(data = crime,
             aes(fill = Murder, map_id = state),
             map = states_map)

# interactive = T : 사용자의 마우스를 따라서 추가적인 데이터 정보 제공
ggChoropleth(data = crime,
             aes(fill = Murder, map_id = state),
             map = states_map,
             interactive = T)

 

✔ 화면분할 그래프 (인구수 대비 강력 범죄 발생율)

# 나타내고 싶은 plot을 각 변수에 저장
# 1) 살인율
p1 <- ggplot(data = crime, aes(x = UrbanPop, y = Murder))+
  geom_point()+
  stat_smooth(level = 0.9)

# 2) 폭행율
p2 <- ggplot(data = crime, aes(x = UrbanPop, y = Assault))+
  geom_point()+
  stat_smooth(level = 0.9)

# 3) 강간
p3 <- ggplot(data = crime, aes(x = UrbanPop, y = Rape))+
  geom_point()+
  stat_smooth(level = 0.9)

# 저장된 변수를 나열하여 그리기
grid.arrange(p1, p2, p3)


4. 시계열 데이터를 활용한 예측

4.1 삼성전자 종가 예측

- forecast 패키지 : 시계열 데이터 예측

- forecast(데이터, h = 예측할 데이터 갯수)

- quantmod : 대한민국 주가 데이터

- axis.text.x = element_text(angle = , hjust = )

   → angle : x축 라벨 각도 / hjust : 수평자리 맞춤 (0 ~ 1 사이) / vjust : 수직자리 맞춤 (0 ~ 1 사이)

        (해당 포스팅 참고하기)

 

💡 전체 코드는 깃허브 참고 💡

 

GitHub - aramssong/Udemy_STARTERS

Contribute to aramssong/Udemy_STARTERS development by creating an account on GitHub.

github.com

 

ggplot(data = data_real, aes(x = date))+
  geom_line(aes(y = pred_close, col = 'red'))+
  geom_line(aes(y = close))+
  scale_x_date(breaks = datebreaks)+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))


5. 통계분석

5.1 가설검정

모집단에 대한 가설을 모집단으로부터 추출한 표본을 사용하여 검토하는 추론 방법

귀무가설 대립가설
차이가 없는 경우의 가설 차이가 있는 경우의 가설
처음부터 버릴 것을 예상하는 가설 검증하고 싶은 가설
ex) 20대 남성 평균 키는 175가 맞다 ex) 20대 남성 평균 키는 175가 아니다

 

✅ 판단 원리

- 통계량을 계산한 후, 유의 수준을 넘는지 비교

 

❓ 통계량이란?

- 판단을 위해서 계산하여 얻는 1종 오류가 발생할 확률의 허용 한계(유의수준) 특정 값

- z값 (z-test), t값(t-test)

 

❓ 유의수준?

- 1종 오류가 발생할 확률의 허용 한계 (보통 5%)

  귀무가설 - 참 귀무가설 - 거짓
귀무가설 - 기각 x O 2종 오류 (귀무가설이 거짓이나 채택함)
귀무가설 - 기각 O 1종 오류 (귀무가설이 참이나 기각함) O

 

5.2 Z-검정

✅ Z-분포

Z분포는 모집단의 정규분포를 의미한다.

하지만 모집단이기 때문에 실제 대상의 평균과 분산을 모르는 경우가 많다. 그래서 샘플링된 평균과 분산이 모집단의 특성을 잘 반영한다고 가정한다.

[참고 포스팅]

 

✅ Z-검정량

- 가정 : 모집단은 정규 분포를 따른다고 가정

- 통계량 : z값

→ 정규분포에서는 유의수준에 따른 비교 값이 고정됨

→ 모집단의 평균과 표준편차를 알 때 사용 가능

→ 유의 수준 값보다 z값이 크다면 귀무가설 기각

 

✅ R을 활용한 Z-검정

- 모집단 평균 63, 분산 3
- 유의수준 0.05
- 귀무가설 : 여자 키 평균은 63인치(160cm)다
- 대립가설 : 여자 키 평균은 63인치(160cm)가 아니다

(데이터가 cm가 아니라 인치라서 인치로 계산함!)

 

# R 내장 데이터 사용 (women)
data(women)
head(women)
# 직접 계산
alpha <- 1.96

z <- (mean(women$height) - 63) / (3/sqrt(length(women$height)))
print(z)  # 2.581989

if (abs(z) > 1.96){
  print('귀무가설 기각. 여자 평균 키는 63인치가 아니다')
} else{
  print('귀무가설 채택. 여자 평균 키는 63인치다')
}
# [OUT] "귀무가설 기각. 여자 평균 키는 63인치가 아니다"
# z.test 함수 사용

install.packages('BSDA')
library('BSDA')
z.test(x = women$height,
       alternative = 'two.sided',  # 양측검정
       mu = 63,            # 모집단 평균
       sigma.x = 3,        # 모집단 표준편차
       conf.level = 0.95)  # 신뢰수준

▶ p-value(0.009)이 유의수준(0.05)보다 작으므로 귀무가설을 기각함

   → 귀무가설 기각. 여자 평균 키는 63인치가 아니다.

 

 

5.3 T-검정

✅ T-분포

정규분포는 아니지만 정규분포에 근사시켜 모집단의 값을 추정한다.

T분포는 모집단 정규분포의 분산은 알 수 없지만 평균은 측정할 수 있기 때문에 사용한다.

[참고 포스팅]

 

✅ T-검정량

- 가정 : 모집단은 정규 분포를 따른다고 가정

- 통계량 : t값

→ 모집단의 표준편차를 모를 때, 표본의 표준편차를 사용해 검정하는 방법

→ 유의수준이 주어졌을 때, t값이 t분포표의 값보다 크면 귀무가설 기각

t 분포표 (df : 자유도 / a : 유의수준)

 

✅ R을 활용한 T-검정

- 모집단 평균 63
- 유의수준 0.05
- 귀무가설 : 여자 키 평균은 63인치(160cm)다
- 대립가설 : 여자 키 평균은 63인치(160cm)가 아니다

(데이터가 cm가 아니라 인치라서 인치로 계산함!)

 

# 직접 계산

length(women$height)  # 15 (자유도 : 14)

t <- (mean(women$height) - 63) / (sd(women$height)/sqrt(length(women$height)))
print(t)   # 1.732051

# t분포표 값 (qt()함수 사용)
tval <- qt(1 - 0.05/2, 14)
print(tval)   # 2.144787

if (abs(t) > tval){
  print('귀무가설 기각. 여자 평균 키는 63인치가 아니다.')
}else{
  print('귀무가설 채택. 여자 평균 키는 63인치다.')
}

# [OUT] "귀무가설 채택. 여자 평균 키는 63인치다."
# t.test 함수 사용
t.test(x = women$height,
       alternative = 'two.sided',   # 양측검정
       mu = 63,             # 모집단 평균
       conf.level = 0.95)   # 신뢰수준

▶ p-value(0.10)이 유의수준(0.05)보다 크므로 귀무가설을 채택함

    → 귀무가설 채택. 여자 평균 키는 63인치다.

 

5.4 양측 검정 vs 단측 검정

✅ 양측 검정

- 대립가설이 '같지 않다'라는 조건으로 주어지는 경우 사용함. 

- 같지 않을 조건은 특정 값보다 많이 크거나, 많이 작으면 됨

- 통계량을 유의수준/2 값과 비교해야 함

정규분포에서 유의수준 0.05, 양측 검정

 

✅ 단측 검정

- 대립가설이 '크다', '작다'라는 조건으로 주어지는 경우 사용함.

- 한쪽 바깥 영역의 밀도가 유의수준과 같아져야 함

- 통계량을 유의수준 값과 비교해야 함

정규분포에서 유의수준 0.05, 단측 검정

 

1) 단측 검정 (클 조건)
   → 귀무가설 : 여자 평균 키는 63인치보다 크다. (귀무가설 기각)

z.test(x = women$height,
       alternative = 'greater',  # 단측 검정 (클 조건)
       mu = 63,    # 모집단 평균
       sigma.x = 3,  # 모집단 표준편차
       conf.level = 0.95)  # 신뢰수준

 

2) 단측 검정 (작을 조건)

   → 귀무가설 : 여자 평균 키는 63인치보다 작다. (귀무가설 채택)

z.test(x = women$height,
       alternative = 'less',  # 단측 검정 (작을 조건)
       mu = 63,    # 모집단 평균
       sigma.x = 3,  # 모집단 표준편차
       conf.level = 0.95)  # 신뢰수준

 

5.5 Z-검정, T-검정 전제조건

- 두 집단 간의 검정 방법 (3개 이상 집단 간의 검정은 다른 방법론이 필요함)

- 독립성 : 한 집단에서 사용한 표본을 다른 집단에서 사용하지 않음

- 정규성 : 표본 데이터가 정규분포를 따름 (Shapiro-wilk 검정)

- 등분산성 독립성 : 집단 내 특정 샘플이 선택될 확률은 모두 같음 (Levene 검정)

  → 실 데이터셋 검정 시, 위 3가지 조건 선제적으로 분석 필요


6. 상관분석

- 두 변수 간에 어떤 관계를 가지는지 분석하는 기법

- 상관계수 사용 : 상관관계의 강도를 나타내는 척도, 0~1 사이 값으로 정의

 

# 내장데이터셋 활용
data <- iris

 

6.1 피어슨 상관계수

- 연속형 변수의 선형적인 상관관계 측정

- ex. 키와 몸무게의 상관관계 등

- 가장 기본적으로 사용되는 상관계수

 

## 1. 피어슨 상관계수
# 꽃받침 길이와 꽃잎 넓이 간 피어슨 상관계수 측정 
cor(data$Sepal.Length, data$Petal.Width)  # [OUT] 0.8179411

# 귀무가설 : '두 변수는 서로 상관 관계가 없다.'
# 귀무가설 기각
cor.test(data$Sepal.Length, data$Petal.Width)

 

# 여러 개 변수 상관분석
cor(data[, 1:4])

# 변수 별 산점도 그래프 출력 (시각화)
pairs(data[, 1:4])

 

- 상관계수가 0에 가까우면 상관관계가 없음

- 상관계수가 1에 가까우면 상관관계가 있으며 산점도가 대각선으로 나타남

 

 

6.2 켄달, 스피어만 상관계수

- 순서가 있는(ordered) 변수의 상관관계 측정

- 순서가 있는 범주형 데이터 분석 가능 (수치형 데이터도 가능)

  → ex. 게임 레벨에 따른 승률, 과학 등수에 따른 수학 등수

  → 한 축의 순서가 올라갈 때, 다른 축의 순서가 올라가는지에 대한 검정

  → 단조 증가, 단조 감소하는 데이터에 큰 상관관계 부여 (단조 함수는 주어진 순서를 보존하는 함수)

- 비선형적인 상관관계도 분석 가능

 

1) 켄달 상관계수

# 1) 켄달 상관계수
cor(data[, 1:4], method = 'kendall')

✅ corr.test 함수

- 컬럼 별 상관계수, 컬럼 별 상관관계 가설 검정 수치 모두 출력

- 상관계수 밑에 p값이 생성되어 서로 연관성이 얼마나 있는지, 유의한지 알 수 있다.

# psych 패키지 (통계 관련 유용한 함수 제공)
install.packages('psych')
library(psych)

# 컬럼 별 상관계수, 컬럼 별 상관관계 가설 검정 수치 모두 출력
# cor 함수와 corr.test 함수 동일
corr.test(data[, 1:4],
          use = 'complete',
          method = 'kendall',
          adjust = 'none')

 

2) 스피어만 상관계수

# 2) 스피어만 상관계수
cor(data[, 1:4], method = 'spearman')

pairs(data[, 1:4], method = 'spearman')

 

✅ corr.test 함수

corr.test(data[, 1:4],
          use = 'complete',
          method = 'spearman',
          adjust = 'none')

 

6.3 corrplot 그래프

- 상관계수 시각화해주는 라이브러리

install.packages('corrplot')
library('corrplot')

col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
M = cor(iris[, 1:4])   

corrplot(M,                       # 데이터
         method = 'color',        # 색상 
         col = col(150),          # 컬러 스펙트럼 (갯수)
         type = 'upper',          # 레이아웃 (“full”(디폴트)“,”upper“,”lower“)
         order = 'hclust',        # 행렬의 재정렬 (hclust : 계층 분석)
         number.cex = .7,
         addCoef.col = 'black',   # 계수 표현
         tl.col = 'black',        # 라벨 색
         tl.srt = 90,             # 위쪽 라벨 회전 각도
         sig.level = 0.01,        # 유의수준 
         insig = 'blank',         # 유의하지 않는 경우 비워두기
         diag = FALSE)            # 대각선 표시 x

 


7. 멘토링

오늘은 ggplot 라이브러리를 활용한 시각화 예제를 함께 풀어보았다. 그리고 전날 했던 것에 이어 파이프 연산자를 활용한 데이터 추출 예제는 숙제로 내주셨다. 그래서 풀어보고 맞는지 강사님께 slack을 통해 확인받았다! 다행히 모두 정답! :)

 

7.1 시각화

ggplot(data, aes(x = Day, y = Temp))+    # x축 : Day, y축 : Temp
  geom_line()+                           # 선 그래프
  facet_wrap(~Month,                     # 월 별 서브 그래프 그리기
             labeller = label_both,      # 라벨 추가
             nrow = 3, ncol = 2)+        # 3행 2열로 서브 그래프 그리기
  stat_smooth(level = 0.95)+             # 회귀선 추가 (신뢰구간 : 0.95)
  ggtitle('월별 기온')                    # 제목 작성

 

7.2 파이프 연산자 활용 (숙제)

# 결측치 제외하고 7월 Ozone평균 계산, 반올림하여 소수점 1자리까지 표현(dplyr 파이프연산자 사용)
data7$Ozone %>% mean(na.rm = T) %>% round(1)

# dplyr select 함수 사용하여 data7에서 Month, Day, Ozone, Temp 컬럼 추출
data7 %>% select(Month, Day, Ozone, Temp)

# dplyr filter 함수 사용하여 data7에서 Temp가 90 이상인 행 추출
data7 %>% filter(Temp >= 90)

# dplyr 패키지 사용하여 data7에서 Temp가 90 이상인 Month, Day, Temp 추출
data7 %>% filter(Temp >= 90) %>% select(Month, Day, Temp)

# data의 Month로 그룹화
data %>% group_by(Month)

# 그룹별 평균 Temp, Wind
data %>% group_by(Month) %>% summarise(temp_avg = mean(Temp), wind_avg = mean(Wind))

8. 회고

R로 시각화하는 것에 대해 공부했는데, 파이썬이랑 비슷한듯 비슷하지 않았다. R에서 특히 ggplot은 각 층을 쌓는다는 개념으로 시각화를 하니 훨씬 더 이해가 잘 되었다. 

 

그리고 KoNLP를 설치하는데, 제법 많은 시간이 소요되었다. 예전에 파이썬에 KoNLP를 설치한 적이 있었는데 그 때도 꽤나 나를 괴롭혔던 기억이 난다... R 버전이 달라서 그렇다는데, 버전과 동시에 KoNLP와 같은 외부 패키지가 잘 설치될 수 있도록 해줬으면 좋겠다!

 

나는 통계가 굉장히 약해서 z-검정, t-검정을 여러번 공부한 적이 있지만 여전히 어려웠다.ㅠㅠ 

대략적인 이론을 이해하고 나니 R을 활용하여 z-검정, t-검정을 하고 난 후 결과를 해석을 할 수 있었다. 통계를 이해할 때까지 계속 공부해야겠다 :)

 

728x90