ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210804_1(데이터분석, R, 자연어처리/텍스트마이닝,통계, 마크다운)
    BigData 2021. 8. 4. 17:11
    #패키지 로드
    library(tau)
    library(dplyr)
    library(hash)
    library(rJava)
    #library(hask)
    library(vctrs)
    library(Sejong)
    library(RSQLite)
    library(KoNLP)
    library(stringr)
    useNIADic()
    
    ########################### 국정원 트윗 분석
    # 1. 로드
    twitter <- read.csv("twitter.csv",
                        header = T,
                        stringsAsFactors = F,
                        fileEncoding = "UTF-8")
    
    # 2. 검토
    head(twitter)
    # 컬럼이 한글로 되어있다.
    
    # 자료크기 측정
    dim(twitter)
    # [1] 3743    5 # 5개 컬럼 
    
    # 전체 데이터형 검사
    str(twitter)
    # 'data.frame':	3743 obs. of  5 variables:
    # $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
    # $ 번호    : int  1 2 3 4 5 6 7 8 9 10 ...
    # $ 계정이름: chr  "ahkorea" "parkkeewoo" "zndvn33" "hong_jihee77" ...
    # $ 작성일  : chr  "11/2/2011" "12/30/2011" "1/5/2012" "1/23/2012" ...
    # $ 내용    : chr
    
    # 컬럼명 수정하기
    library(dplyr)
    twitter <- rename(
      twitter,
      no = 번호,
      id = 계정이름,
      date = 작성일,
      tw = 내용
    )
    str(twitter)
    # 'data.frame':	3743 obs. of  5 variables:
    # $ X   : int  1 2 3 4 5 6 7 8 9 10 ...
    # $ no  : int  1 2 3 4 5 6 7 8 9 10 ...
    # $ id  : chr  "ahkorea" "parkkeewoo" "zndvn33" "hong_jihee77" ...
    # $ date: chr  "11/2/2011" "12/30/2011" "1/5/2012" "1/23/2012" ...
    # $ tw  : chr 
    
    # 특수 문자 제거
    twitter$tw <- str_replace_all(twitter$tw, "\\W"," ")
    head(twitter$tw)
    
    # 명사 테이블 만들기
    #명사리스트
    nouns <- extractNoun(twitter$tw)
    # 리스트풀어서 테이블로
    wordcount <- table(unlist(nouns))
    
    # 데이터 프레임 전환
    df_word <- as.data.frame(wordcount,stringsAsFactors = F)
    head(df_word)
    #         Var1 Freq
    # 1        ^ㄲ    1
    # 2        ^ㄹ    1
    # 3     ^ㅈ^ㄹ    4
    # 4 ^ㅈ^ㄹ해도    1
    # 5        ^ㅋ   16
    # 6  ^ㅋ^ㅋ^ㅋ    4
    
    # 변수명(컬럼명) 바꾸기
    df_word <- rename(df_word, word=Var1, freq=Freq)
    head(df_word)
    #         word freq
    # 1        ^ㄲ    1
    # 2        ^ㄹ    1
    # 3     ^ㅈ^ㄹ    4
    # 4 ^ㅈ^ㄹ해도    1
    # 5        ^ㅋ   16
    # 6  ^ㅋ^ㅋ^ㅋ    4
    
    #두글자 이상만 추출
    df_word <- filter(df_word, nchar(word) >= 2)
    head(df_word)
    
    # 빈도수 높은것 상위 100개만
    
    top100 <- df_word %>% arrange(desc(freq)) %>% head(100)
    #         word freq
    # 1       종북 2431
    # 2       북한 2216
    # 3       세력 1162
    # 4       좌파  829
    # 5   대한민국  804
    
    top10 <- df_word %>% arrange(desc(freq)) %>% head(10)
    #시각화
    library(ggplot2)
    ggplot(data=top10, aes(x=reorder(word,-freq), y=freq, fill=reorder(word,-freq)))+
      geom_col() + ylim(0,2500) # y축 범위설정
    
    ggplot(data=top10, aes(x=reorder(word,-freq), y=freq, fill=reorder(word,-freq)))+
      geom_col() +coord_flip() + geom_text(aes(label=freq), hjust=-0.5)
    
    ### 클라우드 
    library(wordcloud)
    library(RColorBrewer)
    
    pal <- brewer.pal(8,"Dark2") # Dark2라는 색상표에서 8가지 색을 추출
    set.seed(1234) # 처름 시작값을 주어 매번 같은 값이 나온게 만드는것
    wordcloud(word=df_word$word, # 단어
              freq=df_word$freq,  # 빈도
              min.freq = 2, # 최소빈도
              max.words =50, # 사용할 단어갯수 
              random.order= F, # 무작위 배치 F
              rot.per = .1, # 회전비율 0.1
              scale = c(2,0.5), # 단어크기 범위
              colors = pal
    )
    
    pal <- brewer.pal(8,"Purples")[5:9] # Dark2라는 색상표에서 8가지 색을 추출
    set.seed(1234) # 처름 시작값을 주어 매번 같은 값이 나온게 만드는것
    wordcloud(word=df_word$word, # 단어
              freq=df_word$freq,  # 빈도
              min.freq = 2, # 최소빈도
              max.words =50, # 사용할 단어갯수 
              random.order= F, # 무작위 배치 F
              rot.per = .1, # 회전비율 0.1
              scale = c(2,0.5), # 단어크기 범위
              colors = pal
    )

    ################## 지도 시각화 하기
    # 미국 주별 강력 범죄율 단계 구분도 만들기
    
    install.packages("ggiraphExtra")
    library(ggiraphExtra)
    
    # USArrests 데이터가 포함
    head(USArrests)
    #            Murder Assault UrbanPop Rape
    # Alabama      13.2     236       58 21.2
    # Alaska       10.0     263       48 44.5
    # Arizona       8.1     294       80 31.0
    # Arkansas      8.8     190       50 19.5
    # California    9.0     276       91 40.6
    # Colorado      7.9     204       78 38.7
    # 주이름에 컬럼명이 없다 : 컬럼명에 대소문자가 섞여있다.
    
    str(USArrests) # 데이터속성 확인
    # 'data.frame':	50 obs. of  4 variables:
    # $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
    # $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
    # $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
    # $ Rape    : num 
    
    # tibble : dataframe을 대신해서 쓸 수 있다. simple하다
    # 대용량 데이터를 간단하게 다룰 수 있다.
    # 데이터를 간략하게 표현할 수 있다.
    # data.frame은 문자로 구성된 데이터가 factor로 인식되는 경우가 종종있다
    # tibble은 입력 유형이 변경되지 않는다.
    library(tibble)
    
    # 주 state 컬럼 추가하자
    crime <- rownames_to_column(USArrests,var = "state")
    head(crime)
    #        state Murder Assault UrbanPop Rape
    # 1    Alabama   13.2     236       58 21.2
    # 2     Alaska   10.0     263       48 44.5
    
    # state컬럼 값 소문자로 바꾸기
    crime$state  <- tolower(crime$state)
    crime <- rename()
    # 컬럼명 소문자로 바꾸기
    colnames(crime) <- tolower(colnames(crime))
    
    library(ggplot2)
    # 지도데이터로 바꾸어줌
    stats_map <- map_data("state")
    str(stats_map)
    # data.frame':	15537 obs. of  6 variables:
    #  $ long     : num 경도
    #  $ lat      : num 위도
    #  $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
    #  $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
    #  $ region   : chr  "alabama" "alabama" "alabama" "alabama" ...
    #  $ subregion: chr 
    
    # 지도 시각화 ggChoropleth()
    ggChoropleth(data=crime, #지도에 표시할데이터
                 aes(fill=murder, #색상구분
                     map_id=state), # 지역기준
                 map=stats_map) #지도데이터
    
    # 인터렉티브 (반응형) 지도 시각화
    ggChoropleth(data=crime, #지도에 표시할데이터
                 aes(fill=murder, #색상구분
                     map_id=state), # 지역기준
                 map=stats_map,  # 지도데이터
                 interactive = T) #반응형으로만들기

     

    #### 한국 : 시도별 인구대비 결핵확자수
    # 단계 구분도 만들기
    
    
    library(stringi)
    library(devtools)
    
    # 지도 데이터 로드하기
    devtools::install_github("cardiomoon/kormaps2014") #github에서 지도가져옴
    # 안먹을경우 하둡수업 시 설정했던 유닉스명령어 환경변수 제거
    
    library(kormaps2014)
    
    str(changeCode(korpop1)) # 데이터 형 확인
    head(korpop1)
    
    library(dplyr)
    # 컬럼명 변경
    korpop1 <- rename(korpop1,
                      pop = '총인구_명',
                      name = '행정구역별_읍면동')
    library(ggiraphExtra)
    library(ggplot2)
    korpop1$name <- iconv(korpop1 $name, "UTF-8", "CP949") #인코딩
    ggChoropleth(data=korpop1, #자료 데이터
                 aes(fill=pop, # 색으로 표현할 변수
                     map_id=code, # 지역 기준 변수
                     tooltip=name), # 지도 위에 표시할 지역병
                 map=kormap1, # 지도 데이터
                 interactive = T)
    
    ########### 결핵환자수 newPts
    str(changeCode(tbc))
    head(tbc)
    
    tbc$name1 <- iconv(tbc$name1, "UTF-8", "CP949") #인코딩
    tbc$name <- iconv(tbc$name, "UTF-8", "CP949") #인코딩
    
    ggChoropleth(data=tbc, #자료 데이터
                 aes(fill=NewPts, # 색으로 표현할 변수
                     map_id=code, # 지역 기준 변수
                     tooltip=name1), # 지도 위에 표시할 지역병
                 map=kormap1, # 지도 데이터
                 interactive = T)

     

     

    ### plotly 패키지를 이용한 인터렉티브 그래프 만들기
    
    install.packages("plotly")
    library(plotly)
    library(ggplot2)
    head(mpg)
    
    # 반응이 없는 단순 그래프
    pt <- ggplot(data=mpg, aes(x=displ, y=hwy, col=drv))+ # 배기량,고속도로연비,드라이브
     geom_point() # 변수 간 관계
    # 반응형 그래프
    ggplotly(pt)
    
    head(diamonds)
    pt2 <- ggplot(data=diamonds, aes(x=cut, fill=clarity))+
      geom_bar(position = "dodge")
    
    ggplotly(pt2)
    
    ################ dygraphs 패키지를 이용한 인터랙티브 시계열 그래프
    install.packages("dygraphs")
    library(dygraphs)
    
    economics <- ggplot2::economics
    head(economics)
    # date         pce    pop psavert uempmed unemploy
    # <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
    # 1 1967-07-01  507. 198712    12.6     4.5     2944
    # 2 1967-08-01  510. 198911    12.6     4.7     2945
    # 3 1967-09-01  516. 199113    11.9     4.6     2958
    # 4 1967-10-01  512. 199311    12.9     4.9     3143
    # 5 1967-11-01  517. 199498    12.8     4.7     3066
    
    library(xts)
    eco<-xts(economics$unemploy, order.by = economics$date)
    head(eco)
    # 그래프 생성
    dygraph(eco)
    
    # 날자 범위 선택 기능 # 하단에 생김
    dygraph(eco) %>% dyRangeSelector()
    
    # 개인저축률 
    eco_a <- xts(economics$psavert, order.by = economics$date)
    
    # 실업자 수 
    eco_b <- xts(economics$unemploy/1000, order.by = economics$date)
    # 1000으로 나누는 이유는 저축률과 함께 쓰기위해 차이가 너무크기
    # 때문이다
    
    # 시간변화에 다른 저축률과 실업자수의 변화를 모두 그래프로 그리시오
    eco2 <- cbind(eco_a, eco_b) #데이터결합
    colnames(eco2) <-c("psavert","unemploy") #변수명 바꾸기
    head(eco2)
    
    dygraph(eco2) %>% dyRangeSelector()

     

     

    #### 통계분석기법을 이용한 가설검정 ####
    # 통계 분석 : 기술통계 - 데이터를 요약해 설명하는 통계
    #             추론통계 - 어떤값이 발생할 확률을 계산하는 통계 기법
    # 
    #             유의하다 - 어떤일이 발생할 확률이 작다
    #             유의하지않다 - 어떤일이 발생할 확률이다.
    # 
    # 유의 확률 : 실제로는 집단간의 차이가 없는데 우연한 차이가 있는
    #             데이타가 발생할 확률
    # 
    # 유의 확률이 크다 : 집단간의 차이가 유의 하지 않다
    #                    (집단간의 차이가 어떤일이 발생할확률이 있다)
    # 유의 확률이 작다 : 집단간의 차이가 유의하다
    #                    (집단간의 차이가 어떤일이 발생할 확률이 작다)
    
    ############################# t 검정 - 두 집단의 평균의 비교
    
    mpg <- as.data.frame(ggplot2::mpg)
    library(dplyr)
    mpg_diff <- mpg %>%
      select(class,cty) %>% # 기종과 도시연비
      filter(class %in% c("compact","suv"))
    
    head(mpg_diff)
    #     class cty
    # 1 compact  18
    # 2 compact  21
    # 3 compact  20
    # 4 compact  21
    # 5 compact  16
    # 6 compact  18
    table(mpg_diff)
    #          cty
    # class    9 11 12 13 14 15 16 17 18 19 20 21 22 24 26 28 33
    # compact  0  0  0  0  0  2  3  4  7  5  5 12  3  2  2  1  1
    # suv      2 13  6 13 12  7  2  1  3  1  2  0  0  0  0  0  0
    
    t.test(data=mpg_diff, cty ~ class, var.equal= T)
    # Two Sample t-test
    # 
    # data:  cty by class
    # t = 11.917, df = 107, p-value < 2.2e-16
    # alternative hypothesis: true difference in means between group compact
    # and group suv is not equal to 0 95 percent confidence interval:
    #   5.525180 7.730139
    # sample estimates:
    # mean in group compact     mean in group suv 
    # 20.12766              13.50000 
    
    # p-value < 2.2e-16  = 2.2 * 10^(-16) = 0.0000000???22
    # 유의확률 2.2e-16e x 100
    # 판단 : 5% 보다 적으면 유의하다. 5%보다 크면 유의하지않다
    # 결론 : compact, suv 분석은 유의하다. 분석할만한 가치가 있다.
    
    ### mpg 데이터의 도시 연비 cty 와 연료fl(레귤러r,프리미엄f)간에 t검정을 해보시오
    table(mpg$fl)
    table(mpg$cty)
    cty_fl <-mpg %>%
      select(cty,fl) %>%
      filter(fl %in% c("r","p"))
    table(cty_fl)
    
    t.test(data=cty_fl, cty ~ fl , var.equal=T)
    # Two Sample t-test
    # 
    # data:  cty by fl
    # t = 1.0662, df = 218, p-value = 0.2875
    # alternative hypothesis: true difference in means between group p and group r is not equal to 0
    # 95 percent confidence interval:
    #   -0.5322946  1.7868733
    # sample estimates:
    # mean in group p mean in group r 
    # 17.36538        16.73810 
    
    #p-value = 0.2875 이므로 유의확률은 약28%이다
    #r와p의 도시연비 분석은 유의하지않다
    
    ##################################상관관계 분석하기
    # 연속되는 두 변수가 어떤 관계인지 검정하는 통계분석
    # 관계 : 도시연비와 연료와의 관계
    # 정비례, 반비례 등으로 나타난다
    
    # economics에서 실업자수와 개인소비 지출간의 관계를 검정하시오
    economics <- as.data.frame(ggplot2::economics)
    cor.test(economics$unemploy, economics$pce)
    
    # Pearson's product-moment correlation
    # 
    # data:  economics$unemploy and economics$pce
    # t = 18.63, df = 572, p-value < 2.2e-16
    # alternative hypothesis: true correlation is not equal to 0
    # 95 percent confidence interval:
    #  0.5608868 0.6630124
    # sample estimates:
    #       cor 
    # 0.6145176 
    
    # p-value 5% 미만이므로 유의하다
    #       cor  상관관계
    # 0.6145176  값이 양수 이므로 정비례관계이다
    
    ########### 상관관계 히트맵(데이터셋내의 모든컬럼의 상관관계)
    ########### 만들기
    head(mtcars)
    # mpg cyl disp  hp drat    wt  qsec vs am gear
    # Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4
    # Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4
    # Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4
    # Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3
    # Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3
    # Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3
    # carb
    # Mazda RX4            4
    # Mazda RX4 Wag        4
    # Datsun 710           1
    # Hornet 4 Drive       1
    # Hornet Sportabout    2
    # Valiant              1
    
    # 1) 상관행렬 생성
    car_cor <- cor(mtcars)
    round(car_cor,2) #반올림 소수점 2자리까지
    install.packages("corrplot")
    library(corrplot)
    # 상관관계 히트맵
    corrplot(car_cor)
    # 상관관계 히트맵 - 수치값으로 표현하기
    corrplot(car_cor, method = "number")
    # 모든 컬럼의 상관관계를 알 수 있다.
    
    # 세줄 정리
    # 1. t.test : t검정 두집단의 차이를 비교하는것이 의미가있는가
    # 2. cor.test : 상관관계 - 연속되는 두데이터의 관계 - 정,반 비례..
    # 3. hit map : 데이터셋내의 모든 컬럼 들의 상호 상관관계

     

    마크다운 쓰는법

    ---
    output:
      html_document: default
      word_document: default
    ---
    # 레포트 만들기 
    
    ## 분석 보고서
    ### 아래와 같이 cars 데이터셋의 summary 요약을 합니다.
    ```{r}
    summary(cars)
    ```
    
    ### mpg 데이터의 drv별 빈도를 측정해보자
    샵없이 글씨
    *기울임*
    **강조**
    ~~취소선~~
    ```{r}
    library(ggplot2)
    qplot(data=mpg, x=drv, fill=drv)
    ```

     

    'BigData' 카테고리의 다른 글

    210806_1(머신러닝)  (0) 2021.08.06
    210805_1(머신러닝)  (0) 2021.08.05
    210803_1(데이터분석, R, 자연어처리/텍스트마이닝)  (0) 2021.08.03
    210802_1(데이터분석,R)  (0) 2021.08.02
    210729_1(데이터분석, R)  (0) 2021.07.29
Designed by Tistory.