728x90
반응형

 

 Python, R과 같은 수많은 언어들에서 제일 중요한 건, 해당 언어에서 어떠한 자료형을 가지고 있느냐다.

 대부분의 오류는 사용하려는 api에 데이터를 담고 있는 형태(Type), 담겨 있는 데이터의 형태(Data type), 데이터의 구조(Shape)가 적합하지 않아 발생하며, 어지간해선 이를 해결하면 해결된다.

 성능향상 문제에서도 Type, Data type, Shape은 지대한 영향을 미치며, 이를 어떻게 가지고 노느냐에 따라서 같은 알고리즘도 전혀 다른 방식으로 접근할 수 있다.

 그러므로, Python 첫 번째 page에선 이에 대해 간략하게 살펴보도록 하자

  • Python을 사용하면서 느낀 중요한 부분에 대해 짚고 넘어갈 것이므로, 보다 상세한 설명을 원한다면 구글링 하길 바란다(분석가에게 제일 중요한 능력은 검색 능력이지 않는가!).
  • 일부 자료형은 설명하다보면 아주 깊게 들어가게 되므로, 자세한 설명은 뒤로 미루도록 하겠다.
  • Python을 사용하며, 데이터 분석에 유용하다고 느낀 Type을 위주로 설명한다.

 

 

 

Type

  1. scalar
  2. list
  3. array
  4. tensor
  5. dictionary
  6. DataFrame

 위 6가지 외에도 여러 Type이 존재하지만, 데이터 분석을 하면서, 숨 쉬듯 사용했던 Type 위주로 추려냈다.

 위 Type중 numpy의 array나 pandas의 DataFrame, tensorflow의 tensor 같이 해당 Type의 기능이 꽤 많아 제대로 이해하고 사용하려면 두꺼운 책 여러 권을 읽어야 하지만, 이는 뒤로 미뤄두고 오늘은 가볍게 설명해보자.

 

 

 

Scalar

 scalar를 극단적으로 단순하게 말해보면, 그냥 숫자나 문자가 딱 한 개 나오는 경우를 가리킨다. 여기서 문자라는 것은 눈에 보이기엔 문자처럼 보이지만 실제로는 숫자인데, 대체 이게 뭔소리냐 싶겠지만, 설명을 들어보면  꽤 쉽게 이해될 것이다.

 Python의 scalar에는 크게 4개의 자료형이 있다.

  1. int
  2. float
  3. None
  4. Boolean

 여기서 int는 정수, float는 소수, None은 값이 없음, Boolean은 True or False이다. 자, 이제 하나하나 설명해보도록 하자.

 

int(정수)

# int
>>> 1
1
  • 자, 숫자 1을 셀 안에 넣고 ctrl + enter를 입력하니 1이 반환되었다.
  • >>>는 입력한 코드
  • 아래에 >>> 없이 숫자만 나온 경우는 출력된 결과이다.
>>> a = 1
>>> print(a)
1
>>> print(type(a))
<class 'int'>
  • a에 1을 할당하고 print() 해보자
  • print()는 말 그대로 print(출력)하는 함수이다.
  • 참고로 주피터 노트북의 경우 셀의 맨 마지막 줄에 출력하고자 하는 함수를 입력하면, 해당 함수의 내용이 바로 출력 된다.
  • type()은 변수의 자료형을 확인하는 방법이다.
# int 함수를 이용하면 소수를 정수로 바꿀 수 있다.
# 소수 > 정수
>>> int(2.35)
2
# Boolean > 정수
>>> int(True)
1
# 문자 > 정수
>>> int("123")
123
  • int() 함수는 int가 될 수 있는 자료형을 int로 바꿔주는 역할을 한다.
  • ""나 ''는 문자를 의미하는데 담겨 있는 내용이 숫자인 경우엔 숫자로 바꿀 수 있다.
  • True의 경우 분명 문자인데 정수 1로 바뀌는 것이 이상하게 보일 수 있는데, 이는 꽤 재미난 성질이므로, 뒤에서 다시 언급하도록 하겠다.
  • 그러나, 정수로 형태를 변환시킬 수 없는 경우 ValueError가 뜨게 된다.
>>> int("scalar")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-45517d963ca8> in <module>
----> 1 int("scalar")

ValueError: invalid literal for int() with base 10: 'scalar'



>>> int("1.25")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-fb02bea94e38> in <module>
----> 1 int("1.25")

ValueError: invalid literal for int() with base 10: '1.25'



>>> int("True")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-c0bc75205372> in <module>
----> 1 int("True")

ValueError: invalid literal for int() with base 10: 'True'
  • "" 나 '' 안에 문자 혹은 소수가 들어가는 경우 ValueError가 발생한다.
  • 앞에서 1로 바뀌었던 True 역시 "True"로 들어가는 경우 ValueError가 발생한다.

 

 

float(소수)

# float
>>> print(1.25)
1.25

>>> b = 2.75
>>> print(b)
2.75

>>> print(type(b))
<class 'float'>

>>> print(float(10))
10.0
  • 말 그대로 소수이다.
  • int() 함수와 마찬가지로 float()를 하면 정수를 소수로 치환할 수 있다.
  • int()함수와 마찬가지로 float()이 될 수 없는 대상을 치환하려고 하는 경우 ValueError가 뜬다.
# 반올림, 올림, 버림을 해보자
>>> import numpy as np
>>> import math

>>> c = 15.62719

# 반올림
>>>print(np.round(c, 2))
>>>print(round(c, 3))
15.63
15.627

# 올림
>>> print(np.ceil(c))
>>> print(math.ceil(c))
16.0
16

# 버림
>>> print(np.trunc(c))
>>> print(math.trunc(c))
15.0
15
  • 반올림은 python의 기본 함수인 round가 있다.
  • 반올림, 올림, 내림은 주로 numpy, math 모듈의 함수를 이용한다.
  • numpy으로 충분하므로, 굳이 math 모듈을 가지고 올 필요는 없다.
  • import는 특정 모듈을 가지고 온다는 것을 의미하며, as는 그 모듈을 as 뒤에 있는 문자로 간단하게 표현하겠다는 것을 의미한다.
  • np.round(x, N): float x를 소수점 N 자리에서 반올림한다.
  • np.ceil(x): float x를 올림 한다(math.ceil()과 달리 결과는 float으로 반환).
  • np.trunc(x): float x를 내림한다(math.trunc()과 달리 결과는 float으로 반환).

 

 

None(값없음)

>>> None

>>> d = None
>>> print(d)
None
  • 말 그대로 값이 없다는 것을 의미한다.
  • 특정 변수를 미리 생성해놓고 추후 Data를 넣는 경우나, 결측 값 같이 값이 있어야 하는데 존재하지 않음을 나타낼 때 사용된다.

 

 

Boolean

>>> e = 10
>>> print(e == 10)
True

>>> print(e == 12)
False

>>> print(e != 10)
False

>>> if e == 10:
>>>     print("Go")
>>> else:
>>>     print("stop")

Go
  • Boolean 또는 Bool이라 불리는 scalar는 True와 False 두 개의 값으로 이루어져 있다.
  • if 문과 같이 True, False에 따라 다른 결과를 반환하는 경우나, 특정 값을 추출할 때 자주 사용된다.
>>> bool(1)
True

>>> bool(10.0)
True

>>> bool("abc")
True

>>> bool(0)
False

>>> bool(0.0)
False

>>> bool("")
False

>>> print(int(True))
1

>>>> print(int(False))
0
  • Boolean의 True는 1에 False는 0에 대응한다(이 성질을 잘 이용하면 코드를 아주 단순하게 만들 수 있다).
  • bool() 함수를 이용하면 0, 0.0, ""은 False에 나머지 경우는 True를 반환한다.

 

 

그 외

 위 내용을 보면 그렇다면 알파벳 같은 문자의 Type은 무엇일까? 하는 궁금증이 들 것이다.

>>> type("abc")
str

>>> type("123")
str
  • str이라 반환되며, 이는 string의 줄임말로 문자열을 의미한다. 문자와 숫자 Data는 그 접근 방향이 꽤나 다르므로, "Data가 딱 하나 있는 것들을 scalar라고 뭉뚱그려 말하지 않는구나!"라고 단순히 생각해보자.
  • scalar에 대한 심층적인 설명으로 들어가면, 내용이 상당히 길어지므로, 단순하게 숫자로 표현할 수 있거나 값이 존재하지 않는 경우를 scalar라고 생각하면 된다(상세한 내용은 위키피디아를 참조하자).
  • scalar는 뒤에서 배울 벡터에 원소가 하나만 있는 상태라고 생각하면 된다.

 

 

 이번 포스팅에서는 데이터의 Type과 scalar에 대해 알아보았다. 간략히 설명하려 했으나, 쓰다 보니 내용이 꽤 길어져 이 사람이 뭘 이야기하고 싶은 건가 싶을 수도 있으니, 다음 포스트부터는 좀 더 단순하게 적어보도록 하겠다.

 
728x90
반응형
728x90
반응형

스칼라 (Scalar)

: 스칼라는 단일 차원의 값을 뜻하며, 길이가 1인 벡터와 동일하다. 즉, 구성인자가 하나인 벡터를 말한다.

  • 스칼라는 정수, 부동소수, 문자열(""나 ''로 묶인), 논리값(TRUE, T, FALSE, F), NA, NULL의 데이터 타입을 갖는다.
  • 스칼라를 쉽게 이야기 하자면, 값이 딱! 한 개만 있는 상태라고 생각하면 된다.
  • 스칼라(Scalar)에선 R에 있는 다양한 Class에 대해 이야기해보도록 하겠다.
  • R에 있는 다양한 Class를 설명하면서, 벡터(Vector)를 예시로 들 수 있다. 벡터는 R에서 가장 기본적인 데이터 타입 단위이며, 스칼라는 벡터를 구성하는 하나하나의 원소라고 단순히 생각해도 무방하다.
    (벡터를 비롯한 다양한 연산자들은 다음 포스트에서 자세히 다루도록 할테니, 진행하다가 설명이 부족하거나 이해가 안되더라도 넘기면서 따라오기를 바란다.)

 

 

 

NA (Not Available)

  • 데이터에 값이 존재하지 않는다는 뜻으로 결측치(Missing Value)이다.
    (결측치: 어떠한 이유로 인해, 값이 빠져 있는 경우다.)
  • 데이터 분석을 할 때, 결측값이 존재한다면, 데이터 분석 결과를 왜곡 시킬 위험이 있기 때문에 결측값이 발생한 원인과 결측값의 존재를 반영하여 분석을 진행해야한다.
    (결측값에 대해선 추후 심도 깊게 다룰 예정이다.)
  • 결측값의 존재를 파악하는 대표적인 함수는 in.na() 함수이다.

 

 

 

NULL

  • "아무 가치도 없는, 효력이 없는"이라는 뜻을 가진 NULL은, 값이 있어야 하는데 빠져버린 NA와 달리 값이 아직 정해지지 않은 상태를 의미한다.
  • NULL은 프로그래밍의 편의를 위해 미정(Undefined) 값을 표현하는데 사용하는 개념으로, 아직 정해지지 않은 값을 표현할 때 사용되는 값이다.
  • NULL의 존재를 파악하는 대표적인 함수는 is.null() 함수이다.

 

 

 

문자열(String, Character)

  • 문자열은 ""나 ''로 묶어서 지정한다.
  • What's your name과 같이 문자 안에 ' (Quote) 기호가 들어가 있는경우 "What's your name"과 같이 쌍 따옴표(Double Quote)를 사용해서 묶어주면 된다.
  • is.character() 함수를 이용하여 문자열 여부를 확인할 수 있다.
  • noquote() 함수나 print(data, quote = FALSE)로 Qutation을 출력하지 않을 수 있다.
  • R은 다른 프로그래밍 언어랑 다르게 문자형과 문자열을 구분하지 않는다.

 

문자열 사용 방법

1) Quote 사용하기
   : ""(Double Quotation)이나 ''(Single Quotation)을 사용하여 묶는다.

x1 <- ""
class(x1)
## [1] "character"
length(x1)
## [1] 1
x2 <- "car"
length(x2)
## [1] 1
  • R에서 length() 함수는 뒤에서 배울 데이터(벡터, 데이터프레임 등)의 길이를 재는 함수로, ""나 "car"모두 1자리 값인 스칼라이므로 length가 1로 나온 것을 알 수 있다.
  • 즉, Quotation을 사용하여 문자열을 생성하면 1개의 스칼라가 생성되는 것을 알 수 있다.

 

2) character() 사용하기

y1 <- character()
class(y1)
## [1] "character"
length(y1)
## [1] 0
y2 <- character(5)
y2
## [1] "" "" "" "" ""
length(y2)
## [1] 5
y2[3] <- "third"
y2[7] <- "seventh"
y2
## [1] ""        ""        "third"   ""        ""        NA        "seventh"

## 값이 없는 index에도 새로운 인자를 추가할 수 있음
  • character() 함수는 주어진 Parameter만큼 문자열 벡터를 생성하는 함수이다.
  • character(5)로 길이가 5인 문자열 벡터를 생성하는 경우, 벡터의 길이를 벗어난 index에 값을 부여할 수 있으며, 그 사이에 있는 값은 NA처리가 된다.

 

문자열(character) 벡터에서 원소인 문자들의 길이를 확인해보자.

  • R에서 기본으로 제공하는 data인 mtcars를 이용해보자.
# R의 내장 Data인 mtcars의 행이름을 cars라는 변수에 담아보자
cars <- rownames(mtcars)

# nchar함수를 이용해서 문자의 길이들을 알아보자
nchar(cars)
  • nchar()은 number of character이라는 의미로 문자의 길이를 확인할 때 사용하는 함수이다.
##  [1]  9 13 10 14 17  7 10  9  8  8  9 10 10 11 18 19 17  8 11 14 13 16 11 10 16
## [26]  9 13 12 14 12 13 10
  • []는 위치를 말하며 [1]은 바로 오른쪽에 있는 인자가 1번째 인자임을 의미한다.
    (R은 Python을 비롯한 다른 언어들과 달리 숫자가 1부터 시작한다.)
    [26]은 바로 오른쪽에 있는 인자가 26번째 인자임을 의미한다.
# 가장 길이가 긴 문자의 길이를 보자
max(nchar(cars))
## [1] 19
# 가장 이름이 긴 문자의 위치를 보자
which(nchar(cars) == max(nchar(cars)))
## [1] 16
# 가장 이름이 긴 원소를 가지고 와보자
cars[which(nchar(cars) == max(nchar(cars)))]
## [1] "Lincoln Continental"
  • 내가 원하는 조건의 인자 위치를 확인하는 함수인 which()와 가장 큰 값을 찾는 함수인 max(), 문자 길이를 찾는 함수인 nchar(), 특정 위치에 있는 값을 가지고 오는 [] 이 4가지를 조합하여, 가장 길이가 긴 문자를 가지고 오는 코드를 만들어보았다.

 

 

 

진리값, Boolean형(Boolean Expression)

  • 컴퓨터는 0과 1의 bit로 계산을 하는데, 0은 거짓이라 하면, 0 이외의 값은 참으로 인식한다.
  • TRUE, T는 참값이므로 TRUE == 1
  • FALSE, F는 거짓이므로 FALSE == 0으로 인식한다.
  • 위 성질을 이용하여 벡터나 데이터 프레임에서 참의 갯수를 셀수도 있다.
  • TRUE, FALSE는 예약어(Reserved words), T와 F는 TRUE와 FALSE로 초기화된 전역 변수(Global variable)이다.
    • 이는 T에 FALSE를 F에 TRUE를 할당하는 것이 가능하다는 것이다.
    • 위와 같은 문제 발생을 막기 위해 가능한 T, F로 쓰지말고 TRUE, FALSE로 쓰도록 하자.
  • 진리값에는 논리연산자를 사용할 수 있다.
의미 논리연산자 설명
NOT ! 참은 거짓, 거짓은 참으로 반전시킴.
AND & 양쪽 모두 참이어야 한다.
OR | 양쪽 중 하나만 참이어도 참으로 한다.
AND && 양쪽 모두 참이어야 하며, 벡터의 요소 간 계산이 아닌 한 개의 Boolean 값끼리의 연산을 위한 연산자이다.
OR || 양쪽 중 하나만 참이어도 참이며, 벡터의 모든 요소 간 계산이 아닌, 한 개의 Boolean 값끼리의 연산을 위한 연산자.
XOR xor(A, B) 함수로 제공, A와 B가 서로 다를 때만 참이다.
  • &와 &&의 차이
c(TRUE, TRUE) & c(TRUE, FALSE)
## [1]  TRUE FALSE
c(TRUE, FALSE) & c(TRUE, FALSE)
## [1]  TRUE FALSE
c(TRUE, TRUE) && c(TRUE, FALSE)
## [1] TRUE
c(TRUE, FALSE) && c(TRUE, FALSE)
## [1] TRUE
c(FALSE, TRUE) && c(FALSE, TRUE)
## [1] FALSE
c(FALSE, FALSE) && c(FALSE, FALSE)
## [1] FALSE
  • &는 Boolean이 저장된 인자(스칼라)끼리 연산하여, 참, 거짓을 각각 구분한다.
  • &&는 벡터 안에 들어잇는 인자 간 계산이 아니라 한 개의 Boolean값만 연산한다. 또한 &&나 ||는 short-circuit를 지원한다. 따라서 위 와 같이 Boolean으로 구성된 2개의 인자를 가진 벡터 A와 벡터 B가 존재하고 이 둘을 A && B로 계산하는 경우, A가 만약 TRUE라면 B도 평가하지만 A가 FALSE라면 B가 TRUE던 FALSE던 의미가 없으므로 평가하지 않는다.

 

Boolean 활용 방법

 : Boolean은 활용도가 매우 높은 Class이다.
  다음 R에서의 예제를 보며, 한 번 따라해보도록 하자.

# x는 숫자타입(numeric), y는 문자타입(character)으로 생성해보았다.
x <- c(1,2,3,4,5)
y <- c("1", "2", "3", "4", "5")

x == y
## [1] TRUE TRUE TRUE TRUE TRUE
# x에서 3보다 큰 인자만 TRUE로 나타내어라.
x>3
## [1] FALSE FALSE FALSE  TRUE  TRUE
# x에서 3보다 큰 인자들을 TRUE(=1)로 나타내고, 그 합을 구하여라
sum(x>3)
## [1] 2
  • 주의할 사항이며, Boolean의 성질이다.
    • x>3을 하는 경우 FALSE   FALSE   FALSE   TRUE   TRUE로 결과가 나오는데, 앞에서 이야기했듯이 FALSE == 0, TRUE == 1이다.
    • 그러므로, sum(x>3)을 하게 되면, 0   0   0   1   1 의 합을 구하게 되는 것이다.
# x에서 3보다 큰 인자들을 가지고오고, 그 인자들의 합을 구하여라.
sum(x[x>3])
## [1] 9
  • x>3인 원소들의 합을 구하고자 한다면 다음과 같이 코드를 짜야한다.
    • 여기서 x[x>3]은 x>3을 했을 때, TRUE인 값만 가지고 오는 것이다.
    • []는 R에서 벡터, 행렬, 데이터프레임 등에서 내가 원하는 값만 가지고 올 때, 쓰이는 것으로 이에 대한 것은 다음 포스트에서 자세히 다루도록 하겠다.
# x에서 3보다 큰 인자들의 위치를 가지고 와라.
which(x>3)
## [1] 4 5
  • which 함수는 내가 벡터, 행렬, 데이터프레임에서 내가 원하는 값의 위치를 알 수 있게 하는 함수로 매우 유용하다.

 

 

 

요인(Factor)

  • 요인(Factor)은 범주형 변수(Categorical Variables)를 위한 데이터 타입이다.
  • Factor가 필요한 이유는 다음과 같다. 성별(Sex)라는 벡터가 있다고 생각해보자, 이 변수에 들어갈 대상이 5명이라고 할 때, 성별을 문자(Female, Male)로 적는 것과 숫자(1,2)로 적는 것 이 둘 중 무엇이 컴퓨터에게 편할지 생각해보며, 해당 글을 읽도록 해보자.
# "male" 하나만 factor로 sex라는 변수에 부여하였다.
sex <- factor("male", c("male", "female"))
sex
## [1] male
## Levels: male female
# 5개의 원소를 factor로써 sex라는 변수에 부여하였다.
sex <- factor(c("male", "male", "female", "male", "female"), c("male", "female"))
sex
## [1] male   male   female male   female
## Levels: male female
# 범주의 수를 확인해보자.
nlevels(sex)
## [1] 2
# 범주 목록을 확인해보자.
levels(sex)
## [1] "male"   "female"
# 범주 목록에서 특정 인자(2번째)만 가지고 와보자.
levels(sex)[2]
## [1] "female"
# 범주 목록을 수정해보자.
levels(sex) <- c("m", "f")
sex
## [1] m m f m f
## Levels: m f
levels(sex) <- c(1, 2)
sex
## [1] 1 1 2 1 2
## Levels: 1 2
  • 요인(Factor)을 사용하면, Data를 연산을 보다 효율적을 할 수 있고(문자보다 숫자가 컴퓨터에겐 당연히 더 알아보기 쉽고, 컴퓨터의 자원(Resource)도 더 적게 먹을 수 있다.)
  • Factor로 하여 숫자로 바꾸면, 우리가 눈으로 보기에는 숫자로 보이나, 실제론 문자이므로 더하기, 곱하기와 같은 연산은 불가능하다.
  • Factor형은 애초에 데이터를 불러오는 과정에서 잡아주어 숫자로 바꿔줄 수 있으므로, 굉장히 편리하다.
  • 그러나, 텍스트 마이닝 같이 문자 그 자체가 분석의 대상인 경우엔 함부로 Factor형으로 바꿔주어서는 안된다. 만약 텍스트 마이닝을 할 것이면서 문자형 데이터를 Factor로 만든 경우, 많은 텍스트 마이닝에 사용되는 함수들이 적용 안될 수 있다.

 

서열척도(Ordinal scale)은?

요인(Factor)는 기본적으로 순서가 없는 명목형 척도(Nominal scale)로 생성된다.  만약 변수가 순서가 있는 경우 서열 척도로 만들어주기 위해 ordered() 함수를 사용하거나, 호출 시 factor()에 Parameter로 ordered = TRUE로 지정해주자.

# 서열척도를 생성해보자.
ordered(c("a", "b", "c"))
## [1] a b c
## Levels: a < b < c
age <- c("old", "old", "middle", "young", "young")
age_order <- ordered(age, c("young", "middle", "old"))

alphabet <- factor(c("a", "b", "a", "c", "b"), ordered = TRUE)
alphabet
## [1] a b a c b
## Levels: a < b < c
  • age는 서열의 기준을 부여하였으나, alphabet 변수는 단순하게 Parameter로 ordered = TRUE로 부여하였다.
  • 단순히 Parameter로 부여하는 경우, 오름차순으로 서열이 부여된다.
  • is.factor(), is.ordered() 함수로 참, 거짓을 확인할 수 있다.

 

 

지금까지 스칼라에 대한 기초적인 개념과 NA, NULL, 문자열, 진리값(Boolean), 요인(Factor)에 대해 알아보았다. 결측값을 의미하는 NA와 값이 아직 정해지지 않은 NULL의 개념은 이번 포스트에서 설명을 끝내기엔 사용처가 많고, 특히 결측값 같은 경우엔, 심도 깊게 들어가야할 필요가 있으므로, 추후 다른 포스트에서 다루도록 하겠다.

다음 포스트는 데이터 타입에서 가장 기본적으로 사용되는 벡터(Vector)에 대해 공부해보도록 하자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(1부)  (0) 2020.06.18
R(기초)의 데이터 타입과 변수  (0) 2020.06.17
R이란?  (0) 2020.06.16

+ Recent posts