ch0nny_log

[빅데이터분석] R _ 47. 데이터의 전반적인 관찰(평균,중앙,최빈,표준편차,분산, 정규화) 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 47. 데이터의 전반적인 관찰(평균,중앙,최빈,표준편차,분산, 정규화)

chonny 2024. 7. 9. 13:56

■평균,중앙,최빈,표준편차,분산

평균값 --> 중앙값 --> 최빈값 --> 범위 --> 사분위수 범위 --> 분산 --> 표준 편차
데이터 중심은 어디인지?  데이터 분포를 파악

    

문법1. 중고차 데이터의 전반적인 관찰
car<-read.csv('c:\\data\\usedcars.csv')
str(car)
summary(car)​
설명: 데이터가 숫자로만 이루어졌으면 --> knn 알고리즘이용
데이터가 숫자로만 이루어짐 knn 알고리즘
데이터가 문자로만 이루어짐 나이브베이즈 알고리즘 
데이터가 숫자,문자 섞여있음 의사결정트리, 랜덤 포레스트, 신경망등 
문제1. 유방암 데이터는 어떤 머신러닝 알고리즘이 적당한지 데이터를 관찰하시오.
wisc <- read.csv('c:\\data\\wisc_bc_data.csv')
str(wisc)​

-> 다 숫자이기 때문에 knn 알고리즘에 적합한 데이터임.
문법 2. 결측치가 얼마나 있는지 확인.
결측치가 너무 많으면 기계학습이 잘 안됨.
-> 결측치가 너무 많으면 삭제/ 삭제하기 애매하면 다른 값으로 치환
tat <- read.csv('c:\\data\\tatanic2.csv',header= T)
colSums(is.na(tat))​
-> age에 177건이나 있어서 이 값을 처리해줘야됨.
nrow(tat) #전체 건수 확인

-> 절반이 넘는 데이터의 결측치가 아니기 때문에 다른값(보통 평균값) 으로 결측치를 채움
tat$age[is.na(tat$age)] <- mean(tat$age, na.rm = TRUE)
# null 값을 평균으로 바꿈
colSums(is.na(tat))​
-> null 값이 없어진 것을 확인 할 수있음  


 컬럼의 결측치가 50% 가 넘어가면 아예 컬럼을 삭제하는게 낫습니다.
만약에 tat 에 age 컬럼을 삭제하려면 ?
 tat <- subset( tat, select = -age ) 
 str(tat)​

정리: 50% 이상 결측치면 컬럼 삭제가 바람직하고 그렇지 않으면 숫자 데이터이면 결측치를 평균값, 중앙값, 회귀예측값으로 치환 그렇지 않고 문자 데이터면 최빈값이나 결측치 위 아래 데이터로 치환합닌다.
문법 3. 이상치 제거.
특히 종속변수의 이상치를 확인해야 되고 그 다음 중요한 독립 변수들의 이상치를 확인 해야합니다.
-> 이상치의 데이터를 제거/ 다른값으로 치환

 1. 박스 플롯으로 이상치 확인.
car <- read.csv('c:\\data\\usedcars.csv',header= T)
a<- boxplot(car$price)
a$out​

-> 4개 밖에 없어서 삭제해도 되지만 평균 값으로 바꿔도 됨.

2. 중고차 가격의 이상치를 평균값으로 치환
# 이상치에 해당하는 데이터의행 번호를 추출추출함
out_indx <-which(car$price %in% outlier)
out_indx 
# 이상치를 제외한 평균을 계산함
mean_price <-mean(car$price[!car$price %in% outlier], na.rm = TRUE)
mean_price
# 이상치를 평균값으로 치환
car$price[out_indx]  <- mean_price

 

 

※ 정확도를 올리기 위한 전처리 작업
1. 적합한 머신러닝 모델을 잘 선택합니다.
2. 결측치 처리
3. 이상치 처리

 


■ 정규화 고려

데이터 스케일링(Data Scaling) 이란 서로 다른 변수의 값 범위를 일정한 수준으로 맞춰주는 작업을 의미함

-> 아무리 좋은 데이터를 가지고 있어도 그 데이터로 기계학습을 시키기 위해서는 데이터 스케일링을 해야함

-> ex) 비만 여부를 기계에게 학습시키려고 체중과 키 컬럼 데이터를 학습(독립: 체중,키 / 종속: 비만여부)

 -> 키 데이터가 체중보다 크다고 해서 기계가 체중은 중요하지 않고

키만 중요하다고 인식하면 안되므로 둘다 똑같은 수준으로 맞춰주는 작업을 해야함

 

* 데이터 스켈링 대표적 2가지
1. 최대 최소 정규화 데이터를 0~1사이의 값으로 변환하는 것
2. 표준화  데이터를 0을 중심으로 양쪽으로 분포시키는것

 

예제1. 중고차 가격과 마일리지를 최대 최소 정규화 하시오 !
car <- read.csv("usedcars.csv", header=T)

normalize <- function(x) {  
  return  (  ( x-min(x) ) / ( max(x) - min(x) )   ) 
}
car_n <-as.data.frame(lapply(car[  ,c('price','mileage')],normalize))
car_n

car2<- cbind(car[  ,c('year','color','transmission')],car_n)
car2

summary(car2)
summary(car)​
예제2. 중고차의 가격과 마일리지를 표준화로 스케일링하시오. 
car <- read.csv("usedcars.csv", header=T)

normalize <- function(x) {  
  return  (  mean(x)/sd(x)    ) 
}

car_n <-as.data.frame(lapply(car[  ,c('price','mileage')],normalize))
car_n

car2<- cbind(car[  ,c('year','color','transmission')],car_n)
car2​
문제1. 유방암 데이터를 최대 최소 정규화하시오
wisc <-  read.csv("c:\\data\\wisc_bc_data.csv", stringsAsFactors=T)
 
 head(wisc)
 str(wisc)

 head( wisc[             ,  3:32  ] )  # 3번째 컬럼부터 32번째 컬럼까지
 head(wisc[             ,  1:2    ] )   #  id  와 diagnosis 

답:

 normalize <- function(x) {  
                                    return  (  ( x-min(x) ) / ( max(x) - min(x) )   ) 
                                 }

 wisc_n <-  as.data.frame( lapply( wisc[             ,  3:32  ] , normalize)  )
 wisc_n

 wisc2 <- cbind(  wisc[             ,  1:2    ] , wisc_n )  
 wisc2

 summary(wisc2)
 summary(wisc)
문제.2. 최대 최소 정규화 하기전의 데이터와 한 후의 데이터를 시각적으로비교하시오. 
# 현재 그래픽 디바이스 종료
graphics.off()

# 필요한 패키지 설치 및 로드
install.packages("ggplot2")
library(ggplot2)

# 가상의 데이터셋 생성
set.seed(123) # 재현성을 위해 시드 설정
data <- data.frame(value = rnorm(1000, mean = 50, sd = 10))

# 최대 최소 정규화 함수
min_max_normalize <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}

# 정규화된 데이터 추가
data$normalized_value <- min_max_normalize(data$value)


# 다시 히스토그램 비교
hist_before <- ggplot(data, aes(x = value)) + 
  geom_histogram(binwidth = 1, fill = 'blue', alpha = 0.7) + 
  ggtitle("Before Min-Max Normalization") +
  theme_minimal()

hist_after <- ggplot(data, aes(x = normalized_value)) + 
  geom_histogram(binwidth = 0.05, fill = 'red', alpha = 0.7) + 
  ggtitle("After Min-Max Normalization") +
  theme_minimal()


# 그래프 출력
install.packages('gridExtra')
library(gridExtra)
grid.arrange(hist_before, hist_after, ncol = 2)​

설명: 독립변수가 여러개가 있으면  기계 학습할 때 오해할 수 있음 따라서 독립변수를 0~1 사이의 값으로 처리해서 오해하지 않게함.

★ 마지막문제. iris2.csv를 불러와서 iris 데이터 프레임을 만든 후에 최대최소 정규화를 하시오. (컬럼중 하나를 선택해서 시각화 하시오)
# 데이터 업로드
iris <- read.csv('c:\\datafile\\iris2.csv',stringsAsFactors = T)
iris

# 최대 최소 정규화
normalize <- function(x){  
  return ((x - min(x))/(max(x) - min(x))) 
}

iris_n <- as.data.frame( lapply( iris[ , 1:3 ], normalize))
iris_n

iris2 <- cbind( iris[, c("Species") ], iris_n)
iris2

# 데이터 요약약
summary(iris2)

# 히스토그램 비교
hist_before <- ggplot(iris, aes(x = Sepal.Length  )) + 
  geom_histogram(binwidth = 1, fill = 'blue', alpha = 0.7) + 
  ggtitle("Before Min-Max Normalization") +
  theme_minimal()

hist_after <- ggplot(iris2, aes(x = Sepal.Length   )) + 
  geom_histogram(binwidth = 0.05, fill = 'red', alpha = 0.7) + 
  ggtitle("After Min-Max Normalization") +
  theme_minimal()



#그래프 도출
library(gridExtra)
grid.arrange(hist_before, hist_after, ncol = 2)​