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(최대값)을 계산해주는 기술통계 함수
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() : 결측치 제거
#새로운 파일("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) 평균값으로 대체하고, 결측값이 아닌 경우에는 원래의 값 그대로 유지
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$총_매출액)
- iqr <- IQR(df2$총_매출액) : 총_매출액 열의 사분위 범위(IQR)를 계산하여 iqr 변수에 할당. IQR은 데이터의 중간 50% 범위를 나타내며, 이상치를 판단하는 데 사용됨.
- df_iqr <- df2[(df2$총_매출액 < median(df2$총_매출액) + iqr * 2) & (df2$총_매출액 > median(df2$총_매출액) - iqr * 2),] : 총_매출액 열 값이 중앙값에서 IQR의 두 배 범위를 벗어나는 행을 제거하여 새로운 데이터프레임인 df_iqr을 생성
log1p
- 주어진 값에 1을 더한 후, 자연로그(log)를 취하는 함수
- 비대칭적인 분포 변환: 로그 변환은 오른쪽으로 긴 꼬리를 가진 분포(양수로 이루어진 skewed한 분포)를 비대칭적인 분포로 변환하여 데이터의 분포를 더 잘 파악할 수 있도록 함. 이렇게 변환하면 분포의 꼬리 부분에 있는 값들이 상대적으로 작아지며, 중앙 부분의 값들이 상대적으로 더 잘 구분되어 히스토그램이 더 가시적으로 표현될 수 있음
- 스케일링 효과: 로그 변환은 값의 범위를 축소시키는 효과. 큰 값들에 대해서는 상대적으로 작은 값으로 변환되어 스케일링 효과를 가져옴. 이는 히스토그램에서 값의 분포를 더 넓은 범위에서 확인할 수 있도록 도움을 줌.
- 정규성 가정: 몇몇 통계적 분석 기법은 정규성 가정을 전제로 하기 때문에, 데이터가 정규 분포를 따르도록 변환해야 할 수 있음. 로그 변환은 데이터를 정규 분포에 가깝게 만들어 정규성 가정을 만족시킬 수 있는 방법 중 하나.
+ 파이썬 이상치 제거
https://soso-bigdatamarketing.tistory.com/6