R/Data Analysis

[R Studio] R 기초 #4. Mac 파일 불러오기 / 결측치 처리(is.na, complete.cases, na.omit, na.rm) / 이상치 처리(boxplot, hist, IQR, lop1p)

sohyunkimmm 2023. 6. 21. 11:37
728x90

R 프로그래밍 기초 #4. 

 

1. 파일 불러오기

#1. 워킹디렉토리 설정
#파일명에 '한글'이나 '빈칸' 있으면 오류발생할 수 있음!
getwd()
setwd("/Users/sohyun/Desktop/R_project")
getwd()

#2. 파일 불러오기
#맥에서 파일 불러올 때, fileEncoding = "euc-kr" 필요)
df <- read.csv("Ashopping.csv", header = T, fileEncoding ="euc-kr") 

#3. 데이터 관측
head(df)
str(df)
summary(df)

#read.csv() -> csv파일
#read.table() -> 테이블
#install.packages("readxl") -> 엑셀파일 읽어와야하는 경우 설치
#library(readxl)
#read_excel(), read_xls(), read_xlsx() -> 엑셀불러오는 함수 3가지

 

 워킹디렉토리 설정

getwd() :  확인

setwd() : 설정

 

 파일 불러오기

- csv: read.csv()

- 테이블: read.table()

- 엑셀: install.packages("readxl")library(readxl)read_excel()read_xls()read_xlsx()

 

* 맥에서 파일 불러올 때, fileEncoding = "euc-kr" 필요

 

 데이터 관측

head(df) : 데이터의 처음 6행의 값 보여주는 함수 ↔︎ tail() : 데이터의 마지막 6행의 값을 보여주는 함수

str(df) : 자료의 변수 명과 문자형/숫자형, 그리고 자료 값 일부가 출력

summary() :  min(최소값), median(중앙값), mean(평균값), 1∙3사분위 수, max(최대값)을 계산해주는 기술통계 함수

 

head(df)
str(df)
summary(df)

 

 

 

 

 

2. 결측치 확인∙제거∙대체

#결측치 확인
a <- c(NA, 1, 2, 3, 4)
a <- data.frame(a)
colSums(is.na(a))

is.na(df)
complete.cases(df) #채워져있으면 true
colSums(is.na(df)) #true의 갯수를 세어줌

#결측치 제거(omit)
df_del_row <- na.omit(df)
summary(df_del_row)
colSums(is.na(df_del_row))

 

is.na() : 결측치면 TRUE, 결측치가 아니면 FALSE 반환

 

complete.cases() : 결측치가 없으면 TRUE, 있으면 FALSE 반환

 

colSums() : 행렬에서 열 별로 합을 구하는 함수

 

colSums(is.na()) : 열 별 결측치 합 구하기

 

na.omit() : 결측치 제거

 

 

a의 결측치 갯수 : 1

 

is.na(), complete.cases(), colSums(is.na())

 

na.omit()

 

 

 

#새로운 파일("Ashopping2") 불러오기
df2 <- read.csv("Ashopping2.csv", header = T, fileEncoding ="euc-kr") 
head(df2)
str(df2)

#결측치 확인
is.na(df2)
complete.cases(df2) 
colSums(is.na(df2)) 

#결측치 제거
df_del_row2 <- na.omit(df2)
summary(df_del_row2)
colSums(is.na(df_del_row2))

#결측치 대체
#'na.rm = T' -> NA값이 있을때 평균계산 불가능. NA를 remove하고 mean값을 구해야함
df2$상품_진열_위치 <- ifelse(is.na(df2$상품_진열_위치), 
                       mean(df2$상품_진열_위치, na.rm = T), 
                       df2$상품_진열_위치)
colSums(is.na(df2))

df2$상품_설명_표시 <- ifelse(is.na(df2$상품_설명_표시), 
                       mean(df2$상품_설명_표시, na.rm = T), 
                       df2$상품_설명_표시)
colSums(is.na(df2))

 

• 결측치 (평균값으로) 대체

 

ifelse(is.na(df2$상품_진열_위치), mean(df2$상품_진열_위치, na.rm = T), df2$상품_진열_위치)

 

ifelse(조건 / 조건이 True인 경우의 값(결측값인 경우) / 조건이 False인 경우의 값(결측값이 아닌 경우))

 

⇨ 상품_설명_표시 열의 결측값해당 열의 결측치를 무시한(na.rm = T) 평균값으로 대체하고, 결측값이 아닌 경우에는 원래의 값 그대로 유지

 

 

df2의 열 별 결측치 갯수 확인, 제거

 

결측치를 'na를 제외한 열 평균값'으로 대체

 

 

 

 

 

3. 이상치 확인 및 제거

#이상치 확인
boxplot(df2$총_매출액)
hist(df2$총_매출액)

#이상치 제거
#총_매출액 열에서 중앙값을 기준으로 IQR의 두 배 범위를 넘어가는 이상치를 제거한 결과를 df_iqr 데이터프레임에 저장
iqr <- IQR(df2$총_매출액)
#[조건, ] -> df2에서 조건에 맞는 '행' 데이터만 빼서 df_iqr변수에 넣기
df_iqr <- df2[(df2$총_매출액 < median(df2$총_매출액) + iqr * 2) 
              & (df2$총_매출액 > median(df2$총_매출액) - iqr * 2),]
hist(df_iqr$총_매출액)

#로그 씌우기
hist(df2$총_매출액)
df2$총_매출액 <- log1p(df2$총_매출액)
hist(df2$총_매출액)

 

boxplot(df2$총_매출액)을 통한 이상치 확인

 

 

 

  • iqr <- IQR(df2$총_매출액) : 총_매출액 열의 사분위 범위(IQR)를 계산하여 iqr 변수에 할당. IQR은 데이터의 중간 50% 범위를 나타내며, 이상치를 판단하는 데 사용됨.

 

  • df_iqr <- df2[(df2$총_매출액 < median(df2$총_매출액) + iqr * 2) & (df2$총_매출액 > median(df2$총_매출액) - iqr * 2),] : 총_매출액 열 값이 중앙값에서 IQR의 두 배 범위를 벗어나는 행을 제거하여 새로운 데이터프레임인 df_iqr을 생성

 

 

IQR로 이상치를 제거한 '총_매출액'의 히스토그램

 

 

 

log1p

- 주어진 값에 1을 더한 후, 자연로그(log)를 취하는 함수

 

  1. 비대칭적인 분포 변환: 로그 변환은 오른쪽으로 긴 꼬리를 가진 분포(양수로 이루어진 skewed한 분포)를 비대칭적인 분포로 변환하여 데이터의 분포를 더 잘 파악할 수 있도록 함. 이렇게 변환하면 분포의 꼬리 부분에 있는 값들이 상대적으로 작아지며, 중앙 부분의 값들이 상대적으로 더 잘 구분되어 히스토그램이 더 가시적으로 표현될 수 있음
  2. 스케일링 효과: 로그 변환은 값의 범위를 축소시키는 효과. 큰 값들에 대해서는 상대적으로 작은 값으로 변환되어 스케일링 효과를 가져옴. 이는 히스토그램에서 값의 분포를 더 넓은 범위에서 확인할 수 있도록 도움을 줌.
  3. 정규성 가정: 몇몇 통계적 분석 기법은 정규성 가정을 전제로 하기 때문에, 데이터가 정규 분포를 따르도록 변환해야 할 수 있음. 로그 변환은 데이터를 정규 분포에 가깝게 만들어 정규성 가정을 만족시킬 수 있는 방법 중 하나.

 

'총 매출액'에 log1p를 씌운 후 다시 그린 히스토그램

 

+ 파이썬 이상치 제거

https://soso-bigdatamarketing.tistory.com/6

 

[Python Data Analysis]IQR을 사용하여 이상치 제거하기_Boxplot, Histogram

* 이상값(Outlier) - 정상적인 범위 밖에 있는 너무 작은 값, 너무 큰 값 - 이상값이 1개라도 있으면 전체 분석에 큰 영향을 주게 됨 * IQR방법 - 사분위범위수(IQR)를 사용하여 이상값을 찾는 방법 - IQR

soso-bigdatamarketing.tistory.com

 

 

728x90
반응형