본문 바로가기

Data Scientist

R기초

반응형

<Kaggle자료>

R Succinctly.pdf
3.87MB
r_book_v3.pdf
3.33MB
DirectMarketing.csv
0.05MB

R Studio에서 R Script를 누르면 

이렇게 탭들이 생긴다.

그럼 스크립트 창에 이렇게 써야할 패키지들을 인스톨한다.

 # R을 실행시키고, 스크립트 창에 입력
 install.packages("tidyverse") 
 install.packages("readr") 
 

실행하려면 줄마다 ctrl+enter

조금만 기다리면 알아서 주륵주륵 설치를 한다.

 

library(readr)
DM <- read_csv("DirectMarketing.csv")  # <- 이게 '='
View(DM)

library가 실행하는 함수(불러오는 함수)로 설치했던 readr함수를 불러오고

DM이라는 이름으로 읽어올 csv파일을 정의 해준다.

View는 DM 파일을 볼 수 있게 해준다. 

DM 파일

이와 같이 DM탭에 DM파일이 나온다. 

summary(DM)

>summary(DM)
     Age               Gender         
 Length:1000        Length:1000       
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
   OwnHome            Married         
 Length:1000        Length:1000       
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
   Location             Salary          Children    
 Length:1000        Min.   : 10100   Min.   :0.000  
 Class :character   1st Qu.: 29975   1st Qu.:0.000  
 Mode  :character   Median : 53700   Median :1.000  
                    Mean   : 56104   Mean   :0.934  
                    3rd Qu.: 77025   3rd Qu.:2.000  
                    Max.   :168800   Max.   :3.000  
   History             Catalogs      AmountSpent    
 Length:1000        Min.   : 6.00   Min.   :  38.0  
 Class :character   1st Qu.: 6.00   1st Qu.: 488.2  
 Mode  :character   Median :12.00   Median : 962.0  
                    Mean   :14.68   Mean   :1216.8  
                    3rd Qu.:18.00   3rd Qu.:1688.5  
                    Max.   :24.00   Max.   :6217.0  

summary는 자료를 요약해서 출력해주며 명목변수와 같은 문자열 데이터는 개수만 출력해준다. 

 

hist(DM$Salary)

DM중에서 Salary에 해당하는 것을 표시하려면 '$'를 쓴다.

hist() 함수의 경우 히스토그램을 출력해준다. 

이 때 문자열 자료의 경우 출력이 되지 않으며, 

다음과 같이 숫자만 가능하다고 나온다. (Age 데이터는 'Old', 'Middle', 'Young'으로 구분되어 있다)

 

boxplot(DM$Salary)

boxplot() 함수는 최대값과 최소값, 중앙값을 한번에 나타내주는 차트를 그려준다. 

빨간 원은 이상치이고 위쪽의 바가 최대값, 아래쪽 바가 최소값이다. 

박스 안의 가로줄은 중앙값이고 가로줄 기준 아래쪽은 일사분위수(25%, Q1)

위쪽은 삼사분위수(75%, Q3)이다. 

 

freq_Age <- table(DM$Age)
names(freq_Age) <- c('Old','Middle','Young')
pie(freq_Age)

나이에 따른 비율을 파이차트로 나타내본다

install.packages("ggplot2")
library(ggplot2)

p <- ggplot(data=DM, aes(x=Salary, y=AmountSpent)) + geom_point(aes(size=AmountSpent, color=AmountSpent))
p

x = 소득, y=소비 로 설정해서 2차원의 차트를 그린다. 

geom_point는 차트에 들어갈 데이터를 시각화하는 명령어

geom은 geometric에서 온 말이며 점 크기와 색의 농도를 소비로 설정했다.

p + stat_smooth(color='black', fill='grey') 
#color: 추세선의 색깔을 지정한다.
#fill: 추세선의 boundary를 색깔을 지정한다. 

이와 같이 추세선을 추가해준다. 

 

 

p + stat_smooth(color='black', fill='grey') + facet_wrap(~Catalogs)

카탈로그 발송 횟수에 따른 소비를 살펴본다.

p + stat_smooth(color='black', fill='grey') + facet_wrap(~Age)

소득과 소비의 상관관계를 '연령대'에 따라 살펴보기

소득이 증가하지만 소비는 줄어드는 현상이 노년층과 청년층에서 발생 

p + stat_smooth(color='black', fill='grey') + facet_wrap(~Gender)

남성의 소비가 좀 더 큰 것으로 나타나지만 거의 유사한 형태라고 판단된다.

 

p + stat_smooth(color='black', fill='grey') + facet_wrap(~Married)

install.packages('dplyr')
library(dplyr)
DM %>% filter(Age == 'Old')
DM %>% filter(Age == 'Old' & Children =='0')
DM %>% filter(Age == 'Old' & Children =='0' & Salary >= 30000)

----------------------------------------------------------------------------------------
> DM %>% filter(Age == 'Old')
# A tibble: 205 x 10
   Age   Gender OwnHome Married Location Salary Children History Catalogs AmountSpent
   <chr> <chr>  <chr>   <chr>   <chr>     <dbl>    <dbl> <chr>      <dbl>       <dbl>
 1 Old   Female Own     Single  Far       47500        0 High           6         755
 2 Old   Male   Own     Married Far       80700        0 NA            18        3034
 3 Old   Female Own     Married Far      110000        0 High          24        5564
 4 Old   Female Own     Married Close     82800        0 High          24        3010
 5 Old   Female Rent    Single  Far       14000        0 Low           12         410
 6 Old   Female Rent    Married Far       60200        0 High          18        2328
 7 Old   Female Rent    Married Close     39700        0 Medium        12         573
 8 Old   Female Own     Married Close     41600        0 NA            18         982
 9 Old   Female Rent    Single  Close     20100        0 Low           24         576
10 Old   Female Rent    Married Far       81500        0 High          18        3655
# ... with 195 more rows



> DM %>% filter(Age == 'Old' & Children =='0')
# A tibble: 187 x 10
   Age   Gender OwnHome Married Location Salary Children History Catalogs AmountSpent
   <chr> <chr>  <chr>   <chr>   <chr>     <dbl>    <dbl> <chr>      <dbl>       <dbl>
 1 Old   Female Own     Single  Far       47500        0 High           6         755
 2 Old   Male   Own     Married Far       80700        0 NA            18        3034
 3 Old   Female Own     Married Far      110000        0 High          24        5564
 4 Old   Female Own     Married Close     82800        0 High          24        3010
 5 Old   Female Rent    Single  Far       14000        0 Low           12         410
 6 Old   Female Rent    Married Far       60200        0 High          18        2328
 7 Old   Female Rent    Married Close     39700        0 Medium        12         573
 8 Old   Female Own     Married Close     41600        0 NA            18         982
 9 Old   Female Rent    Single  Close     20100        0 Low           24         576
10 Old   Female Rent    Married Far       81500        0 High          18        3655
# ... with 177 more rows



> DM %>% filter(Age == 'Old' & Children =='0' & Salary >= 30000)
# A tibble: 147 x 10
   Age   Gender OwnHome Married Location Salary Children History Catalogs AmountSpent
   <chr> <chr>  <chr>   <chr>   <chr>     <dbl>    <dbl> <chr>      <dbl>       <dbl>
 1 Old   Female Own     Single  Far       47500        0 High           6         755
 2 Old   Male   Own     Married Far       80700        0 NA            18        3034
 3 Old   Female Own     Married Far      110000        0 High          24        5564
 4 Old   Female Own     Married Close     82800        0 High          24        3010
 5 Old   Female Rent    Married Far       60200        0 High          18        2328
 6 Old   Female Rent    Married Close     39700        0 Medium        12         573
 7 Old   Female Own     Married Close     41600        0 NA            18         982
 8 Old   Female Rent    Married Far       81500        0 High          18        3655
 9 Old   Female Own     Married Close    111500        0 High          18        2510
10 Old   Male   Rent    Married Close     69800        0 High          24        2764
# ... with 137 more rows

필터를 사용해보기 위해 인스톨하고 필터를 적용하여 원하는 조건을 입력해서 출력한다. 

 

#문자열 자료들을 0, 1, 2, 3 등으로 변환시켜주기 위해서
install.packages('car')
library(car)
DM$AgeN <- recode(DM$Age,'"Young"=1;"Middle"=2;"Old"=3')
DM$AgeN

이렇게 코드를 쓰면 명목변수를 수치형 변수로 변경할 수 있다. 

왼쪽(변경 전), 오른쪽(변경 후)

DM$AgeN <- recode(DM$Age,'"Young"=1;"Middle"=2;"Old"=3')
DM$GenderN <- recode(DM$Gender, "'Female'=1; 'Male'=2")
DM$OwnHomeN <- recode(DM$OwnHome,'"Own"=1;"Rent"=2')
DM$MarriedN <- recode(DM$Married,'"Single"=1;"Married"=2')
DM$LocationN <- recode(DM$Location,'"Close"=1;"Far"=2')
DM$HistoryN <- recode(DM$History,'"High"=3;"Medium"=2;"Low"=1')

 나머지 변수들도 변환해준다. 이 때 규칙을 정해서 지정해주는 것이 좋다.

 

이제 상관관계를 봐보자!

cor(DM)

Error in cor(DM) : 'x'는 반드시 수치형이어야 합니다

 껄껄.. 아직도 안되네

 

View(DM)을 해보면 Age와 AgeN처럼 컬럼이 새로 생성된 것들을 알 수 있다. 

기존의 문자열 변수들을 제거해주어야 상관관계분석이 이루어진다.

그러나 제거하기 보다는 새로 수치만으로 이루어진 데이터셋을 만들어주는 것이 좋다.

DM1<-data.frame(DM$AmountSpent, DM$Salary, DM$AgeN, DM$Children, DM$GenderN, DM$OwnHomeN, DM$MarriedN, DM$LocationN,  DM$HistoryN, DM$Catalogs)
cor(DM1)

> cor(DM1)
               DM.AmountSpent   DM.Salary      DM.AgeN  DM.Children   DM.GenderN DM.OwnHomeN  DM.MarriedN
DM.AmountSpent      1.0000000  0.69959571  0.348250488 -0.222308170  0.201690213 -0.35080800  0.475879979
DM.Salary           0.6995957  1.00000000  0.384718517  0.049663163  0.261492181 -0.46073640  0.675633080
DM.AgeN             0.3482505  0.38471852  1.000000000 -0.271118420  0.001458581 -0.42889677  0.255993305
DM.Children        -0.2223082  0.04966316 -0.271118420  1.000000000 -0.105469083  0.03227408  0.009770249
DM.GenderN          0.2016902  0.26149218  0.001458581 -0.105469083  1.000000000 -0.08443332  0.116057285
DM.OwnHomeN        -0.3508080 -0.46073640 -0.428896769  0.032274083 -0.084433317  1.00000000 -0.264009318
DM.MarriedN         0.4758800  0.67563308  0.255993305  0.009770249  0.116057285 -0.26400932  1.000000000
DM.LocationN        0.2526157 -0.03712709 -0.013350265  0.002391455 -0.005553971  0.03369129 -0.006964058
DM.HistoryN                NA          NA           NA           NA           NA          NA           NA
DM.Catalogs         0.4726499  0.18355086  0.124459876 -0.113455428  0.087350767 -0.09313151  0.137059886
               DM.LocationN DM.HistoryN DM.Catalogs
DM.AmountSpent  0.252615659          NA  0.47264989
DM.Salary      -0.037127094          NA  0.18355086
DM.AgeN        -0.013350265          NA  0.12445988
DM.Children     0.002391455          NA -0.11345543
DM.GenderN     -0.005553971          NA  0.08735077
DM.OwnHomeN     0.033691291          NA -0.09313151
DM.MarriedN    -0.006964058          NA  0.13705989
DM.LocationN    1.000000000          NA  0.12858075
DM.HistoryN              NA           1          NA
DM.Catalogs     0.128580754          NA  1.00000000

새로 만들어준 뒤 상관관계 분석을 했지만 'NA' 결측값이 있다.

이 때 분석가각 판단한다. 결측값을 포함해서 분석을 할지, 아니면 제거 한 뒤에 사용할지.

제거해서 사용하겠다면

DM2 <- na.omit(DM1)
cor(DM2)

>cor(DM2)
               DM.AmountSpent   DM.Salary      DM.AgeN  DM.Children  DM.GenderN DM.OwnHomeN DM.MarriedN
DM.AmountSpent      1.0000000  0.66382653  0.333940651 -0.322111112  0.21340790 -0.34082353  0.44261825
DM.Salary           0.6638265  1.00000000  0.336147765  0.065573278  0.28506699 -0.44737394  0.65849177
DM.AgeN             0.3339407  0.33614777  1.000000000 -0.306836700 -0.02053037 -0.41060740  0.25696549
DM.Children        -0.3221111  0.06557328 -0.306836700  1.000000000 -0.09438576  0.05634319  0.02347633
DM.GenderN          0.2134079  0.28506699 -0.020530366 -0.094385756  1.00000000 -0.09775929  0.12076147
DM.OwnHomeN        -0.3408235 -0.44737394 -0.410607396  0.056343192 -0.09775929  1.00000000 -0.27439024
DM.MarriedN         0.4426183  0.65849177  0.256965485  0.023476330  0.12076147 -0.27439024  1.00000000
DM.LocationN        0.3422802 -0.03182654 -0.005370048 -0.001827235 -0.02194002  0.01296963 -0.02556869
DM.HistoryN         0.7666723  0.69761552  0.395073351 -0.403087448  0.27485475 -0.38203105  0.48205299
DM.Catalogs         0.5125304  0.22807856  0.118524894 -0.130165331  0.13277110 -0.13029728  0.15119401
               DM.LocationN DM.HistoryN DM.Catalogs
DM.AmountSpent  0.342280193   0.7666723   0.5125304
DM.Salary      -0.031826536   0.6976155   0.2280786
DM.AgeN        -0.005370048   0.3950734   0.1185249
DM.Children    -0.001827235  -0.4030874  -0.1301653
DM.GenderN     -0.021940021   0.2748547   0.1327711
DM.OwnHomeN     0.012969626  -0.3820310  -0.1302973
DM.MarriedN    -0.025568691   0.4820530   0.1511940
DM.LocationN    1.000000000   0.2324516   0.1608851
DM.HistoryN     0.232451640   1.0000000   0.3598972
DM.Catalogs     0.160885061   0.3598972   1.0000000
> 

이와 같이 결과가 출력되지만 데이터 수가 그만큼 줄어들게 된다. 

 

#상관계수의 신뢰도
cor.test(DM$AmountSpent, DM$Salary, method = "pearson", conf.level=0.95) 


	Pearson's product-moment correlation

data:  DM$AmountSpent and DM$Salary
t = 30.93, df = 998, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.6665092 0.7299316
sample estimates:
      cor 
0.6995957 

 

 

# 상관계수 차트로 확인해보기
install.packages('corrplot')
library(corrplot)
DM2COR <- cor(DM2)
corrplot(DM2COR, method='circle')

 

 

출처: KOCW

p-value(유의확률): p값은 귀무가설이 진실일때 적어도 그 정도의 극단적인 표본 값이 나올 확률.

보다 더 쉽게 이해하자면, 귀무가설이 참임에도 이를 기각할 확률.

연구자는 귀무가설이 기각 되기를 원하기 때문에 낮은 p-value가 나오기를 원한다. 

 

p-value <= a 이면 귀무가설을 기각하고 연구가설을 지지

p-value > a 이면 귀무가설을 기각하지 못하고 연구가설을 지지하지 못한다. 

 

귀무가설 기각(기각x) = 통계적으로 유의적(비유의적)이다. 

 

😁

출처:

https://rfriend.tistory.com/34

 

R 결측값 확인 및 처리: is.na(), sum(is.na()), na.rm=TRUE, na.omit(), complete.cases()

외부 텍스트 파일로 대용량의 데이터 셋을 R로 불러들이고 나면 가장 먼저 하는 것이 str()로 데이터 구조 파악하기, head(), tail()로 데이터 몇 개 미리보기, 그 다음에 하는 것이 바로 결측값 확인 및 처리, 특..

rfriend.tistory.com

https://blog.naver.com/victor3dh/220845227964

불러오는 중입니다...

http://www.kocw.net/home/search/kemView.do?kemId=865312

 

(통계프로그래밍과 분석을 위한) R 입문

R 기초에 대해 학습니다.

www.kocw.net

드림셀파

반응형