34 데이터의 전반적인 관찰(평균, 중앙, 최빈, 표준편차, 분산) - p90
기계를 학습시키기에 괜찮은 데이터인지 확인하려고 관찰을 하는 것
예제. 중고차(usedcars.csv) 데이터의 전반적인 관찰
car <- read.csv("c:\\data\\usedcars.csv")
summary(car)
기계학습을 시키기 위해 확인해야할 내용은 컬럼들이 숫자로만 이루어졌는지 또는 문자로만 이루어졌는지 아니면 문자와 숫자가 섞여 있는지 확인해야함.
ex ) 숫자로만 구성 -> knn 알고리즘
문자로만 구성 -> 나이브베이즈 알고리즘
숫자와 문자가 섞여있는 구성 -> 의사결정트리, 신경망 등
문제189. 위의 str함수와 summary함수와 유사한 기능이 있는 판다스의 함수는 무엇인가
# python
import pandas as pd
car = pd.read_csv("c:\\data\\usedcars.csv")
car.info() # R의 str기능
car.describe() # R의 summary 기능
문제190. 기계를 학습 시키는 학습 데이터에 이상치가 있는지를 확인하기 위해서 중고차 price 데이터의 이상치를 확인하시오 (R로 수행)
# R
a <- boxplot(car$price)
a
$stats
[,1]
[1,] 5980.0
[2,] 10995.0 --> Q1
[3,] 13591.5
[4,] 14906.0 --> Q3
[5,] 19995.0
$out
[1] 21992 20995 4899 3800
IQR (사분위수 범위값) = Q3 - Q1
Q1 <- boxplot(car$price)$stats[2,1]
Q3 <- boxplot(car$price)$stats[4,1]
IQR <- Q3 - Q1
upper_bound <- Q3 + (IQR*1.5)
lower_bound <- Q1 - (IQR*1.5)
car[(car$price > upper_bound) | (car$price < lower_bound),'price']
[1] 21992 20995 4899 3800
> boxplot에서 나온 out과 동일한 결과가 나옴
> boxplot에서 나온 out은 IQR*1.5로 정해져 있음. 가중치(?)를 1.5가 아닌 더 넓게 하는 경우에 이 식을 활용해서 사용하면 됨.
문제191. 중고차 가격(price) 데이터의 이상치를 출력하시오( 판다스)
# python
Q1 = car['price'].quantile(0.25)
Q3 = car['price'].quantile(0.75)
IQR = Q3 - Q1
upper_bound = Q3 + (IQR*1.5)
lower_bound = Q1 - (IQR*1.5)
car[['price']][(car.price >upper_bound) | (car.price < lower_bound)]
ㅇ 기계를 학습 시키기 전에 학습 데이터에 대해서 확인해야할 내용
1. 데이터 프레임 구조 확인 -> 컬럼의 데이터 유형에 따라 사용하는 알고리즘이 달라짐
2. 이상치가 있는지 확인 -> 이상치가 있으면 학습을 잘 못함
3. 결측치가 있는지 확인 -> 결측치가 많으면 기계의 성능이 떨어짐
- R로 결측치 확인하는 방법
# R
colSums(is.na(car))
year model price mileage color transmission
0 0 0 0 0 0
- 파이썬으로 결측치 확인하는 방법
# python
car.isnull().sum()
year 0
model 0
price 0
mileage 0
color 0
transmission 0
결측치가 많이 보이는 컬럼은 그냥 컬럼을 삭제하는게 좋고, 결측치가 약간 보이는 컬럼은 결측치를 다른값으로 치환하는 것을 고려해야함.(치환하는 값은 그 컬럼의 데이터의 평균값, 중앙값, 최빈값 등으로 치환)
4. 숫자 데이터의 경우 정규화 또는 표준화 작업을 수행
정규화 작업 : 데이터 프레임 열에 들어있는 숫자를 0~1사이의 숫자로 변환하는 것
정규화 작업을 하는 이유
> A변수(컬럼) : 0 ~ 1000 범위
B변수(컬럼) : 0 ~ 10 범위
이 경우 A변수가 B변수에 비해 상대적으로 큰 숫자값을 갖기 때문에 A변수의 영향력이 더 커짐. 그래서 둘 다 min/max 정규화를 써서 0~1 사이의 범위로 만들어줘야 함
ex) 체중과 키 데이터가 있고 이 데이터를 가지고 환자가 암환자인지 정상환자인지 예측하는 모델을 만드려고 함. 체중과 키는 서로 단위가 다름. 그래서 체중보다는 키가 더 숫자값이 크므로 키의 영향력이 더 커지게 됨. 그래서 키와 체중 둘 다 0~1사이의 숫자로 변경함.
- 정규화 : 0~1사이의 범위로 변경해주는 작업
x - min(x)
min/max 정규화 공식 = ----------------------
max(x) - min(x)
- 표준화 : 평균을 0으로 두고 표준편차를 1로 하는 데이터로 변경하는 것
x - mean(x)
표준화 공식 = ---------------------
stdev(x)
문제192. 중고차의 가격(price)와 마일리지(mileage)를 정규화 하시오 (R로 수행)
# R
# 정규화
normalize <- function(x){ return ( (x - min(x))/(max(x)-min(x))) }
car_n <- as.data.frame(lapply(car[ ,3:4], normalize))
car_n
# 정규화 후 컬럼 합치기
car2 <- cbind( car[, 1:2], car_n, car[5:6])
head(car2)
문제193. (점심시간 문제) 위의 작업을 파이썬으로 수행하시오.
# python
car = pd.read_csv("c:\\data\\usedcars.csv")
def normalize(x):
return ( x - x.min() ) / (x.max() - x.min() )
car['price'] = normalize(car['price'])
car['mileage'] = normalize(car['mileage'])
car
# iloc로 푸는 방법
def normalize(x):
return ( x - min(x) ) / (max(x) - min(x) )
car_n = car.iloc[ : ,2:4].apply(normalize)
car.iloc[ : ,2:4] = car_n
car
문제194. 중고차 데이터의 price와 mileage를 표준화 하시오.
표준화 : 평균을 0으로 두고 표준편차를 1로 하는 데이터로 변경하는 것
x - mean(x)
표준화 공식 = ---------------------
sd(x)
# R
standard <- function(x){return ( (x-mean(x)) / sd(x))}
car_n <- as.data.frame(lapply(car[ , 3:4], standard))
car2 <- cbind(car[ , 1:2], car_n, car[,5:6])
head(car2)
문제195. 위의 작업을 파이썬으로 수행하시오.
# python
car = pd.read_csv("c:\\data\\usedcars.csv")
def standard(x):
return (x - x.mean()) / x.std()
car_s = car.iloc[: ,2:4].apply(standard)
car.iloc[:,2:4] = car_s
car
+) 특정 컬럼명 제외하는 방법
car.loc[:, [col for col in car.columns if (col != 'price') & (col != 'mileage')]]
ㅇ사이킷런의 정규화와 표준화를 하는 모듈 함수 이용
1. 데이터를 가지고 정규화를 위한 계산을 수행합니다.
# python
from sklearn.preprocessing import MinMaxScaler # 정규화
from sklearn.preprocessing import StandardScaler # 표준화
import pandas as pd
car = pd.read_csv("c:\\data\\usedcars.csv")
car2 = car.iloc[:,2:4] # 명목형 컬럼 제외, 정규화할 컬럼들(price, mileage)만 선택
scaler = MinMaxScaler()
scaler.fit(car2)
2. 데이터를 정규화 합니다. ( 위에서 계산된 값으로 데이터를 변경합니다.)
car_n = scaler.transform(car2)
car_n # 정규화된 결과가 numpy array 자료형으로 반환됨
3. car_n을 데이터 프레임으로 변경합니다.
car3 = pd.DataFrame(car_n)
car3
4. car3의 컬럼명을 지정합니다.
car3.columns = car2.columns
car3
5. 정규화가 잘 되었는지 확인합니다.
car3.describe()
max = 1, min = 0이면 정규화가 잘 된 것
6. 정규화된 컬럼들로 새로운 car4 라는 데이터 프레임을 생성하세요.
car_drop = car.drop(['price', 'mileage'], axis = 1)
car4 = pd.concat([car_drop, car3], axis =1)
car4
ㅇ기계학습을 하기위해 데이터 확인 및 전처리 과정
1. 데이터 프레임의 구조 확인 --> 적당한 알고리즘을 선택하기 위해서
2. 이상치 확인 --> 학습 잘되게 하려고
3. 결측치 확인 --> 학습 잘되게 하려고
4. 수치형 데이터에 대해서 정규화 또는 표준화 진행
5. 데이터의 분포를 확인(정규분포 형태의 데이터인지 확인)
1) 히스토그램 그래프를 통해서 확인
2) 왜도, 첨도값을 확인
35 수치형 데이터 살펴보기(히스토그램 그래프, 정규분포)
히스토그램 그래프는 수치변수의 퍼짐을 그래프로 시각화한 것인데 히스토그램 값의 갯수 또는 빈도를 나타내는 높이를 갖는 일련의 막대로 구성되며, 값이 소속되어 있는 균등한 빈(bin)들이 전체값들을 분할함.
예제. 중고차 데이터의 가격(price)와 주행거리(mileage)를 각각 히스토그램 그래프로 그리시오
# R
par(mfrow = c(1,2)) # 1행 2열로 두개의 그래프를 한 화면에 보여줌
hist(car$price)
hist(car$mileage)
그림설명(p100) 중고차 가격이 중앙 양측에 균등하게 나뉘는 경향이 있는 반면, 차량 주행거리는 오른쪽으로 좀 더 늘어난 것으로 보인다. 이 특징이 왜도(skew)값으로 표시할 수 있다.
ㅁ왜도와 첨도 -p.100
1. 왜도 : 데이터의 좌우로 기울어짐의 정도
왜도값 > 0 : 오른쪽으로 꼬리가 길다. 즉 왼쪽으로 데이터가 치우쳐져 있다.
왜도값 < 0 : 왼쪽으로 꼬리가 길다. 즉 오른쪽으로 데이터가 치우쳐져 있다.
2. 첨도 : 위 아래 뾰족한 정도
첨도값이 3에 가까울수록 정규분포에 속하고 3보다 작은 경우는 완만한 곡선, 3보다 크면 뾰족한 곡선
분포의 뾰족한 정도를 의미하는 것은 첨도로서, 분산도가 크면 이질적이고 분포의 높이가 낮아지며, 분산도가 작으면 집단이 동질적이고 분포의 높이가 높아집니다.
문제196. 중고차 데이터의 주행거리(mileage)의 왜도값을 출력하시오.
install.packages("fBasics") # 패키지 설치
library(fBasics)
skewness(car$mileage)
1.231805
왜도값이 0보다 큰 경우이므로 오른쪽으로 꼬리가 길고 왼쪽으로 데이터가 치우쳐져 있는 상태
이런 경우의 데이터는 평균값이 중앙값보다 큼(mean > median)
문제197. 중고차 데이터의 주행거리가 왼쪽으로 데이터가 치우쳐져 있고 오른쪽으로 꼬리가 긴지 시각화해서 확인하시오.
car <- read.csv("c:\\data\\usedcars.csv")
m <- sort(car$mileage)
m
plot(m, dnorm(m, mean = mean(m), sd = sd(m)), type = 'l')
> 대부분의 주행거리가 0 ~ 60000 사이의 중고차들로 분포되어 있음.
car <- read.csv("c:\\data\\usedcars.csv")
m <- sort(car$mileage) # 값 정렬
m
hist(m)
par(new = T)
plot(m, dnorm(m, mean = mean(m), sd = sd(m)), type = 'l', axes = FALSE, ann = FALSE)
m : car$mileage
dnorm(m, mean = mean(m), sd = sd(m)) : 확률밀도함수값
axes = FALSE : x축 안나오게
ann = FALSE : y축 안나오게
type = 'l' 은 선
> 대부분의 주행거리가 0 ~ 60000 사이의 중고차들로 분포되어 있음. 이상치 때문에 오른쪽으로 꼬리가 긴 데이터 분포를 이루고 있음.
ㅇ R 데이터분석 코드 자동화 스크립트
문제198. 아래의 메뉴를 선택하는 스크립트를 수행하시오.
- 메뉴를 선택하게 하는 스크립트
x1 <- menu( c('정규분포 그래프','첨도값과 왜도값') , title='숫자를 선택하세요 ~' )
x1
문제199. 위의 스크립트에서 숫자를 선택하면 어떤 결과가 출력되게 하시오.
my_func <- function(){
x1 <- menu( c('정규분포 그래프','첨도값과 왜도값') ,
title='숫자를 선택하세요 ~' )
switch ( x1,
san1 = { print('정규분포 그래프 ~~') },
san2 = { print('첨도값과 왜도값 ~~ ' ) } ) }
my_func()
문제200. (오늘의 마지막 문제) 중고차 데이터의 가격(price)를 정규분포 그래프로 시각화 하시오. (히스토그램 그래프와 같이 나오게 하시오)
car <- read.csv("c:\\data\\usedcars.csv")
m <- sort(car$price)
hist(m, col = 'pink')
par(new = T)
plot(m, dnorm(m, mean = mean(m), sd = sd(m)), type = 'l', axes = FALSE, ann = FALSE)
+) plot 라인 굵기 조절 : lwd = 2.0
'Study > class note' 카테고리의 다른 글
R / 함수생성, if문과 loop문 (0) | 2022.01.26 |
---|---|
R / 상관관계, 이원교차표(cross table) (0) | 2022.01.26 |
R / 데이터 로드(txt, database) (0) | 2022.01.25 |
R / 데이터 로드(csv, xlsx) (0) | 2022.01.24 |
R / R 의 자료구조의 종류 (0) | 2022.01.24 |