본문 바로가기

Study/class note

R / 히스토그램 그래프, 사분위수 그래프

22 R에서 히스토그램 그래프 그리기

히스토그램 그래프는 전반적인 데이터의 분포 상태를 한눈에 파악하는데 유용한 그래프

히스토그램 그래프의 x축은 계급이고 y축은 건수 또는 density(밀도)로 나타냄

 

- R로 히스토그램 그래프 그리기

str(airquality)  # R 내장데이터

> str(airquality)   # R에 내장된 데이터로 5월달 온도와 바람, 오존지수에 대한 데이터

'data.frame': 153 obs. of  6 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

 

temp <- airquality$Temp
hist(temp)

- 제목, 색깔, y축의 측정지표를 변경

hist(temp, main = "Maximun daily temperature at La Guardia Airport",
     xlab = "Temperature in degrees Faherenheit",
     xlim = c(50,100),
     col = "darkmagenta",
     freq = FALSE)

- 히스토그램 그래프의 정보 확인하기

h <- hist(temp)
h

계급   도수(건수)
55 ~ 60 : 8
60 ~ 65 : 10
65 ~ 70 : 15
    :
    :

$density
[1] 0.010457516 0.013071895 0.019607843 0.024836601 0.043137255 0.044444444 0.026143791
[8] 0.015686275 0.002614379
 >확률밀도함수의 밀도값(density(밀도)의 합은 1)

$mids = 계급별 중간값

 

- 히스토그램 막대의 도수를 표시하기

h <- hist(temp, ylim = c(0,40), xlim = c(50,100))
text(h$mids, h$counts, label= h$counts, adj = c(0.5,-0.5))

 

text(x축 좌표, y축좌표, label  = 지정값, adj = 라벨 위치 조정)
adj = c(좌우위치, 상하위치)

- x축의 계급을 조금 더 키우고 싶을때

hist(temp, breaks = 4)
hist(temp, breaks = 20)

 왼쪽 : breaks = 4 / 오른쪽 : breaks = 20


문제154. 중공차 데이터를 파이썬 히스토그램 그래프를 그리시오

# python
import pandas as pd

cars = pd.read_csv("c:\\data\\usedcars.csv")
cars['price'].plot.hist()


문제155.중고차 데이터(usedcars.csv)의 가격(price)를 R로 히스토그램 그래프를 그리시오.

cars <- read.csv("c:\\data\\usedcars.csv")
car <- cars$price
p <- hist(car)
hist(car, ylim = c(0,60), xlim = c(min(cars$price)-3000, max(cars$price+3000)),
     col = 'pink',
     xlab = "Price of usedcars",
     main = "Usedcars")
text(p$mids, p$counts, label= p$counts, adj = c(0.5,-0.5))


p # 히스토그램 정보 확인

 

 

23 R 에서 사분위수 그래프 그리기

사분위수 그래프는 데이터를 그림을 이용하여 집합의 범위와 중앙값을 빠르게 확인할 수 있으며 또한 이상치 값이 있는지 빠르게 확인이 가능한 시각화 기법

기계를 학습시키는 데이터에 이상치가 포함되어있으면 기계가 학습을 잘 못하게 되므로 이상치를 확인하여 제거할 필요가 있는데 이때 사분위수 그래프가 유용하게 사용됨.

평균값, 중앙값, 최빈값만으로는 정확한 데이터 분석을 하기가 부족한 경우가 있음. 특히 평균 데이터는 데이터의 중심이 어디쯤인지 알려주지만 특정 데이터가 평균을 중심으로 어떻게 분포가 되어있는지 알려주지 않음. 그래서 필요한게 사분위수 그래프

 

예제. 농구선수 3명이 각각의 게임당 득점한 점수

# R
x1 <- c(7,8,9,9,10,10,11,11,12,13)
x2 <- c(7,9,9,10,10,10,10,11,11,13)
x3 <- c(1,1,7,7,10,10,10,11,13,30)

ball2 <- cbind(x1,x2,x3)
ball <- as.data.frame(ball2)   # R에서 데이터 프레임 만드는 방법
ball

문제156. 위의 데이터를 판다스 데이터 프레임으로도 생성하시오.

# python
import pandas as pd

ball2 = {'x1':[7,8,9,9,10,10,11,11,12,13],
        'x2':[7,9,9,10,10,10,10,11,11,13],
        'x3':[1,1,7,7,10,10,10,11,13,30]}

ball = pd.DataFrame(ball2)

문제157. R에서 위의 농구선수 3명의 득점점수 평균값, 중앙값, 최빈값을 각각 구하시오.

# R
summary(ball)

Median = 중앙값

Mean = 평균값

> 3명의 선수 모두 평균값과 중앙값이 10점. 이 데이터만 봐서는 누가 더 잘한다고 할 수 없음. 

 

# R
table(ball$x1)
table(ball$x2)
table(ball$x3)

R에서는 점수별 득점횟수(counts)를 조회할 수 있음.

> 3명의 선수 모두 최빈값도 10. 그래서 최빈값으로도 누가 더 잘한다고 하기가 어려움.

 

문제158. 위의 결과를 파이썬으로 확인하시오.

# python
ball.describe().round()  # R의 summary와 같은 기능, round()는 반올림

mean : 평균값

50% : 중앙값

# python
ball.mode()

> 평균값, 중앙값, 최빈값이 모두 10이므로 위의 통계 데이터로는 한명의 선수를 선택하기가 어려움. 그래서 다른 데이터 분석방법이 필요한데 그게 바로 데이터 분포를 확인하는 것.

 

 

ㅇ 데이터 분포를 확인하는 방법 3가지

1. 범위

2. 사분위수 범위

3. 히스토그램 그래프

 

문제159. R로 위의 농구선수 3명의 득점점수 범위값을 확인하시오.

# R
range(ball$x1) # 7 13
range(ball$x2) # 7 13
range(ball$x3) # 1 30

> 범위는 그 자체로는 데이터의 폭만 설명할 뿐 그 안에서 데이터가 분포되는 방식을 설명해주지 않음. 특히 이상치에 민감.

특히, 3번째 선수의 경우 어쩌다 한 번 잘한 게임(30점)인 이상치 때문에 범위가 넓어져 버렸음. 그러므로 이상치로부터 멀어질 필요가 있음. 이상치로부터 멀어지고 가운데 있는 데이터에만 집중하게 해주는게 바로 사분위수 범위

 

문제160. 파이썬에서 위의 농구선수 3명의 득점점수 범위를 구하시오.

# python
ball.quantile([0,1])

 

문제161. 이상치 데이터(30점)을 가지고 있는 3번째 선수의 점수 데이터로 사분위수 그래프를 R로 그리시오.

# R
a <- boxplot( ball$x3, horizontal = T)  # 그래프 그리기
a # 그래프 정보 확인

$stats
     [,1]
[1,]    1  <- 하한값(min)
[2,]    7  <- 하한 사분위수(0.25), Q1
[3,]   10 <- 중앙값
[4,]   11 <- 상한 사분위수(0.75), Q3
[5,]   13 <- 상한값

$out
[1] 30 <- 이상치

 

R은 이상치가 나오지만, 따로 구하려면 아래의 공식을 사용하면 됨

# R
Q1 <- a$stats[2,] # 하한 사분위수,Q1
Q3 <- a$stats[4,] # 상한 사분위수, Q3
iqr <- Q3 - Q1
var1 <- Q3 + iqr*1.5

ball[ball$x3 > var1,c("x3")]

 

문제162. 위의 그래프를 파이썬으로 그리시오.

# python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

ball2 = {'x1':[7,8,9,9,10,10,11,11,12,13],
         'x2':[7,9,9,10,10,10,10,11,11,13],
         'x3':[1,1,7,7,10,10,10,11,13,30]}

ball = pd.DataFrame(ball2)
ax = plt.subplots(figsize = (7,5))
sns.boxplot(data=ball['x3'],orient="h")   # orient = "h" : 수평으로 그리기

# python
ball['x3'].describe().round()

count    10.0
mean     10.0
std       8.0
min       1.0  <- 하한값
25%       7.0 <- 하한 사분위수, Q1
50%      10.0 <- 중앙값
75%      11.0 <- 상한 사분위수, Q3
max      30.0 <- 상한값이지만, 실질적으로 이 값은 이상치임. R에서는 max를 13으로 보고 30을 이상치로 봤음

# python
Q1 = ball['x3'].quantile(0.25)
median = ball['x3'].median()
Q3 = ball['x3'].quantile(0.75)

iqr = Q3 - Q1 # 사분위수 범위
val1 = Q3 + iqr*1.5  # val1보다 큰 값을 이상치로 봄

ball.loc[ball['x3']>val1, 'x3']  # 이상치 확인

이상치 값 30 나옴.

 

+) 하한 이상치를 출력하려면, 아래와 같이 하한 사분위수에서 범위를 뺀 후 작은 값을 구하면 됨.

# R
Q1 <- a$stats[2,] # 하한 사분위수,Q1
Q3 <- a$stats[4,] # 상한 사분위수, Q3
iqr2 <- Q3 - Q1
var2 <- Q1 - iqr*1.5

ball[ball$x3 < var2,c("x3")]

 

문제163. 중고차 가격(price)데이터의 이상치를 확인하시오.

# R
cars <- read.csv("c:\\data\\usedcars.csv")
a <- boxplot(cars$price, horizontal = T)
a  # 모든 정보 확인

# 딱 이상치만 뽑아내기
a$out

$out
[1] 21992 20995  4899  3800    <- price의 이상치

 

문제164. 기계학습을 시킬때는 이상치를 제거하고 학습을 해야 학습이 더 잘되므로 위의 4개의 데이터의 행을 지우고 car2라는 데이터 프레임을 생성하시오.

# R
cars <- read.csv("c:\\data\\usedcars.csv")
a <- boxplot(cars$price, horizontal = T)
dif <- a$out

car2 <- cars[ !cars$price %in% dif,  ]
car2

+) 행 개수 확인하는 방법

# R
nrow(car2)

 

문제165. 중고차 가격 데이터의 가운데 50%에 해당하는 데이터에 집중하기 위해 사분위 범위값(Q3 - Q1)을 구하시오.

# R
quantile(cars$price)

#     0%     25%     50%     75%    100% 
# 3800.0 10995.0 13591.5 14904.5 21992.0
cars <- read.csv("c:\\data\\usedcars.csv")
# 사분위수 그래프 그려서 범위 구하기
car <- boxplot(cars$price, horizontal = T)
iqr <- car$stats[4,]-car$stats[2,]
iqr   # 3911

# quantile()로 구하기
a <- quantile(cars$price)
a[4] - a[2]  # 3909.5 

# IQR(InterQuartile Range)
IQR(cars$price)   # 3909.5

> 사분위수 그래프에서 구하는 사분위 범위값이랑 quantile(), IQR로 구하는 사분위 범위값이 다름. 개발자마다 기준이 다르기 때문에 범위값이 다르게 나옴.

 

반응형

'Study > class note' 카테고리의 다른 글

R / 데이터 로드(csv, xlsx)  (0) 2022.01.24
R / R 의 자료구조의 종류  (0) 2022.01.24
코바코 웹크롤링 최종  (0) 2022.01.21
R / 라인 그래프, 산포도 그래프, 상관계수  (0) 2022.01.21
R / 서브쿼리  (0) 2022.01.21