Python/빅데이터 분석과 머신러닝

#2 파이썬 데이터

sundori 2024. 7. 3. 15:28

목차

     

    데이터 표현

    우리가 일반적으로 사용하는 데이터는 모두 기계 성능과 상관없이 디지털 컴퓨터를 통해 이루어지는데...

    컴퓨터에서 처리하는 데이터의 표현 방식에 따라 수치 데이터와 비수치 데이터로 구분된다.

     

    수치 데이터는 주소 산술, 논리 연산 과정으로 사용하며 고정된 정수와 부동 소수점인 실수로  구성이된다.

    그리고 빅데이터의 시대가 오면서 그동안 소외되었던 비수치 데이터의 세상이 오게되었는데, 대용량 데이터를 처리할 수 있는 인프라가 만들어졌기 때문이다.

    비수치 데이터는 우리가 일상생활에서 사용하는 문장과 같은 텍스트 데이터와 소리 그리고 영상 등과 같은 멀티미디어 데이터로 구성된다.

     

    데이터 -> 수치 데이터 -> 정수, 실수

     

                                              -> 텍스트 -> BDC, ASCII, UNICODE

    데이터 -> 비수치 데이터

                                             -> 멀티미디어 -> 오디오, 이미지, 비디오

     

    기본연산

    연산자 기능
    + 덧셈
    - 뺄셈
    * 곱하기
    ** 거듭제곱
    / 나누기
    // 나누기 연산 후 소수점 이하의 수를 버리고 정수 부분의 수만 구함
    % 나누기 연산 후 몫이 아닌 나머지를 구함.

     

    """
    결과 출력을 위해 print함수를 사용
    기본 연산
    """
    print(123 + 456)
    print(100 * 100)
    # 579
    # 10000
    
    """
    정수형 상수의 표현 범위는 제한이 없음
    CPU 레지스터로 표현할 수 있는 크기보다 큰 정수를 다룰 때는 연산 속도가 느려진다
    """
    print(2 ** 64)
    # 18446744073709551616
    
    """
    정확히 나누어 떨어지지 않는 경우, 파이썬에서는 소수점 15자리까지만 표현
    """
    print(5048 / 123)
    # 41.040650406504064
    
    """
    소수점 이하의 수를 모두 버리고 몫만 구할 때 '//' 연산자를 사용
    """
    print(5048 // 123)
    #41
    
    """
    나머지를 구할 때 % 연산자를 사용
    """
    print(33 % 5)
    # 3

     

    논리 연산

    컴퓨터 작업은 참, 거짓을 판단해야할 때가 있다. 이렇게 참 거짓을 나타내는 연산을 논리 또는 불린(Boolean)이라고 한다.

    연산자  설명 사례
    and a and b는 a와 b가 모두 참일 때만 참(True)을 반환 a = True
    b = True
    result = a and b
    print(result)  # Output: True
    or a or b는 a 또는 b 중 하나라도 참(True)이면 전체 조건이 참(True) a = True
    b = False
    result = a or b
    print(result)  # Output: True
    not not(a and b)는 a와 b가 모두 참일 때 참(True)을 반환하는 조건을 반대로.. a = True
    result = not a
    print(result)  # Output: False
    """
    and 연산
    """
    print(True and True)
    print(True and False)
    print(False and True)
    print(False and False)
    
    # True
    # False
    # False
    # Fakse
    
    """
    or 연산
    """
    print(True or True)
    print(True or False)
    print(False or True)
    print(False or False)
    
    
    # True
    # True
    # True
    # False
    
    """
    not 연산
    """
    print(not True)
    print(not False)
    # False
    # True

     

    비교 연산

    연산자 설명 사례
    == 왼쪽 값과 오른쪽 값이 같다. a = 5
    b = 5
    print(a == b)  # Output: True
    != 왼쪽 값과 오른쪽 값이 같지않다 a = 5
    b = 10
    print(a != b)  # Output: True
    > 왼쪽 값이 오른쪽 값보다 크다. a = 10
    b = 5
    print(a > b)  # Output: True
    < 오른족 값이 왼쪽 값보다 크다. a = 5
    b = 10
    print(a < b)  # Output: True
    >= 왼쪽 값이 오른쪽 값보다 크거나 동일하다. a = 10
    b = 10
    print(a >= b)  # Output: True
    <= 왼쪽 값이 오른쪽 값보다 작거나 동일하다. a = 5
    b = 5
    print(a <= b)  # Output: True
    """
    비교 판단
    """
    print(5 > 2)
    # True
    
    """
    숫자 비교
    """
    print(1 == 1)
    print(1 != 3)
    # True
    # True
    
    """
    문자 비교
    """
    print("Hello!" == "Hello!")
    print("Hello!" != "Hello")
    print("Hello!" != "Hello")
    # True
    # False
    # True
    
    """
    부등호 비교
    """
    print(1 > 2)
    print(1 < 2)
    print(1 >= 2)
    print(1 <= 2)
    # False
    # True
    # True
    # True
    
    """
    객체 비교
    객체 비교(Object Comparison)는 프로그래밍에서 서로 다른 변수나 값이
    동일한 객체를 참조하는지를 확인하는 과정을 말한다. 
    Python에서 객체 비교는 ==, is, is not 연산자를 통해 수행된다.
    """
    print(1 == 1.0)
    print(1 is 1.0)
    print(1 is not 1.0)
    # True
    # False
    # True

    변수와 자료형

    이렇게 연산자의 사용법에 대해 알았으면 연산에 필요한 값(데이터)을 담을 상자에 대해 알아야한다. 그것이 바로 변수이다.

     

    1. 변수의 개념

    변수는 프로그램에서 데이터를 저장하고 사용하기 위한 이름이나 식별자입니다. 변수는 메모리 상의 주소에 연결되어 있으며, 해당 주소를 통해 데이터에 접근할 수 있습니다.

     

    2. 메모리 구조

    컴퓨터의 메모리는 다음과 같은 구조로 되어 있습니다.

    • 스택(Stack): 지역 변수, 함수 호출 시 생성되는 임시 데이터 등을 저장하는 공간입니다. 후입선출(LIFO, Last In First Out) 구조를 가지고 있습니다.
    • 힙(Heap): 프로그램이 실행되는 동안 동적으로 할당되는 메모리 공간입니다. 주로 객체나 배열 같은 큰 데이터 구조를 저장합니다.
    • 데이터 세그먼트(Data Segment): 전역 변수와 정적 변수(static variables)를 저장하는 공간입니다.
    • 코드 세그먼트(Code Segment): 프로그램 코드가 저장되는 공간으로, 실행 코드와 명령어들이 포함됩니다.

    3. 변수의 저장 원리

    변수는 프로그램에서 사용할 데이터를 저장하기 위해 메모리에 할당됩니다. 변수의 저장 원리는 다음과 같습니다.

    • 메모리 할당: 변수가 선언될 때마다 컴퓨터는 해당 변수의 데이터 타입에 따라 메모리에서 적절한 공간을 할당합니다. 예를 들어, 정수형 변수는 특정 크기의 바이트를 할당받고, 문자열 변수는 문자열의 길이에 따라 가변적으로 할당될 수 있습니다.
    • 주소 매핑: 변수는 메모리 상의 주소와 연결됩니다. 이 주소를 통해 프로그램은 변수의 데이터에 접근하거나 수정할 수 있습니다.
    • 데이터 저장: 변수에 저장된 데이터는 해당 메모리 주소에 직접 저장됩니다. 이 과정에서 데이터 타입에 따라 메모리에 저장되는 방식이 달라질 수 있습니다. 예를 들어, 정수형 변수는 2진수로 표현된 값이 메모리에 저장됩니다.
    x = 10

     

    • 변수 x는 정수형 데이터 10을 저장하기 위해 메모리에서 공간을 할당받는다.
    • x 변수는 메모리에 할당된 주소를 가리키며, 이 주소를 통해 데이터에 접근할 수 있다.

    변수명 우리가 원하는대로 명명할 수 있다. 하지만 변수명을 명명하는 규칙은 프로그래밍 언어마다 조금씩 다를 수 있고 일반적으로 사용되는 명명 규칙은 다음과 같다:

    1. 영문자와 숫자 사용: 변수명은 영문자(A-Z, a-z)와 숫자(0-9)를 사용할 수 있습니다. 단, 숫자로 시작할 수는 없습니다.
    2. 밑줄(_) 사용: 밑줄 기호(_)도 변수명에 포함될 수 있습니다. 예를 들어, my_variable, myVar, _count 등이 가능합니다.
    3. 대소문자 구분: 대소문자는 구분됩니다. 즉, myVar와 myvar은 서로 다른 변수명으로 취급됩니다.
    4. 예약어 사용 금지: 예약어(Keywords)는 프로그래밍 언어에서 특별한 용도로 예약된 단어들입니다. 이러한 예약어는 변수명으로 사용할 수 없습니다. 각 언어마다 다르지만, 일반적으로 if, else, for, while, return 등이 예약어에 해당합니다.
    5. 의미 있는 이름 사용: 변수명은 해당 변수가 어떤 데이터를 나타내는지 명확하게 알 수 있도록 지어야 합니다. 예를 들어, age, username, total_count 등은 변수가 나타내는 데이터나 역할을 직관적으로 이해할 수 있습니다.
    6. 카멜 표기법(Camel Case) 사용 (선택 사항): 변수명이 여러 단어로 구성될 때, 각 단어의 첫 글자를 대문자로 표기하여 구분할 수 있습니다. 예를 들어, myVariable, userName, totalItemCount 등이 있습니다.

    명명 규칙 예시

    Python을 예시로 들어보면:

    # 올바른 변수명 예시
    age = 30
    user_name = "John"
    total_count = 100
    my_var = True
    
    # 잘못된 변수명 예시 (예약어 사용)
    if = 10  # 에러 발생: 'if'는 예약어이므로 변수명으로 사용할 수 없음
    
    # 카멜 표기법 예시 (선택 사항)
    firstName = "Jane"
    totalItemCount = 50

     

     

    """
    변수 만들기
    """
    x = 155
    print(x)  # Output: 155
    
    x = "Hello World!"
    print(x)  # Output: Hello World!
    
    """
    여러 변수 만들기(할당)
    ## 변수명1, 변수명2, 변수명3 = 값1, 값2, 값3 형식으로 변수를, (콤마)로 구분한 뒤
    ## 각 변수에 할당될 값을 지정
    ## 변수와 값의 개수는 동일하게 해야하며 나열된 순서대로 값이 할당된다.
    """
    a, b, c = 1, 2, 3
    print(a, b, c)  # Output: 1 2 3
    
    # 리스트로 변수 할당
    numbers = [4, 5, 6]
    d, e, f = numbers
    print(d, e, f)  # Output: 4 5 6
    
    """
    변수 삭제(메모리 할당 해제)
    ## 변수 삭제는 del을 사용하며 변수 x를 삭제하여 변수 x가 없어졌으므로
    x를 사용하려할 시  x가 정의되지 않았다는 메시지와 오류가 발생.
    """
    x = 10
    print(x)  # Output: 10
    
    del x  # 변수 x를 삭제
    # print(x)  # Error: 변수 x는 더 이상 존재하지 않음
    
    # 다시 사용하려면 다시 할당해야 함
    x = 20
    print(x)  # Output: 20

     

    자료형

    변수에 이름을 정하고 작서앟여 메모리에 변수를 할당했다면 메모리에 저장될 변수의 종류에 대해 알아야한다.

    예를들어 사람의 출생년도는 숫자로 저장되고 자신이 살고 있는 주소는 문자로 저장하는 것 처럼 말이다.

    모든 프로그래밍 언어는 다양한 데이터 유형을 자료형(Data Type)으로 처리하는데 파이썬은 자료형에 대해 사용되는 표준 자료형을 가지고 있다. 데이터 분석 관점에서 파이썬에서 사용되는 주요 자료형에 대해서 보자면...

     

    1. 숫자형 (Numeric Types)

    Python에서는 다양한 숫자형 자료형을 지원합니다. 주요 숫자형 자료형으로는 정수형(int), 부동소수점수형(float), 복소수형(complex) 등이 있습니다.

    # 정수형(int)
    age = 30
    
    # 부동소수점수형(float)
    height = 175.5
    
    # 복소수형(complex)
    z = 3 + 4j

    2. 문자열 (String)

    문자열은 문자들의 시퀀스로 텍스트 데이터를 나타내는 데 사용됩니다. Python에서는 작은 따옴표(')나 큰 따옴표(")로 둘러싸인 문자열을 사용할 수 있습니다.

    name = "Alice"
    address = '123 Main St, City'

    3. 리스트 (List)

    리스트는 여러 개의 요소들을 순서대로 담을 수 있는 자료형입니다. 리스트는 대괄호([])로 둘러싸여 있으며, 각 요소는 쉼표(,)로 구분됩니다.

    fruits = ['apple', 'banana', 'cherry']
    ages = [25, 30, 35, 40]

    4. 튜플 (Tuple)

    튜플은 리스트와 유사하지만, 한 번 생성된 요소는 변경할 수 없습니다(immutable). 튜플은 괄호(())로 둘러싸여 있으며, 각 요소는 쉼표(,)로 구분됩니다.

    coordinates = (10, 20)
    person_info = ('Alice', 30, '123 Main St')

     

    5. 딕셔너리 (Dictionary)

    딕셔너리는 키-값 쌍(key-value pair)으로 데이터를 저장하는 자료형입니다. 중괄호({})를 사용하여 정의하며, 각 키와 값은 콜론(:)으로 연결됩니다.

    person = {'name': 'Bob', 'age': 25, 'city': 'New York'}

     

    6. 집합 (Set)

    집합은 중복되지 않은 항목들로 구성된 자료형입니다. 집합은 중괄호({}) 내에 요소들을 쉼표(,)로 구분하여 나열합니다.

    unique_numbers = {1, 2, 3, 4, 5}

     

     

    자바와 c언어와 같은 프로그래밍 언어에서는 변수명 앞에 자료형을 쓴다. 

    public class Main {
        public static void main(String[] args) {
            // 정수형 변수 선언
            int age = 30;
            
            // 문자열 변수 선언
            String name = "Alice";
            
            // 실수형 변수 선언
            double height = 175.5;
            
            // 변수 사용 예시
            System.out.println("Name: " + name + ", Age: " + age + ", Height: " + height);
        }
    }
    #include <stdio.h>
    
    int main() {
        // 정수형 변수 선언
        int age = 30;
        
        // 문자열 변수 선언 (문자 배열로 표현)
        char name[] = "Alice";
        
        // 실수형 변수 선언
        float height = 175.5;
        
        // 변수 사용 예시
        printf("Name: %s, Age: %d, Height: %.1f\n", name, age, height);
        
        return 0;
    }

     

    하지만 파이썬의 경우 변수명을 명시하지 않는다. 참고하자..

     

    1) Numbers

    # 정수형 변수 선언 및 출력
    var1_int = 1
    print(var1_int)  # Output: 1
    
    # 음수 정수형 변수 선언 및 출력
    var2_int = -10
    print(var2_int)  # Output: -10
    
    # 부동소수점 변수 선언 및 출력
    var1_float = 15.20
    print(var1_float)  # Output: 15.2
    
    # 지수 표기법을 이용한 부동소수점 변수 선언 및 출력
    var2_float = 70.2 - 1E12
    print(var2_float)  # Output: -999929799.8
    
    # 복소수 변수 선언 및 출력
    var1_complex = 3.14j
    print(var1_complex)  # Output: 3.14j
    
    # 지수 표기법을 이용한 복소수 변수 선언 및 출력
    var2_complex = 4.53e1 - 7j
    print(var2_complex)  # Output: (45.3-7j)

    2) Strings

    # 문자열 변수 선언 및 출력
    var_string = "Hello, World!"
    print(var_string)  # Output: Hello, World!
    
    # 문자열 연산: 문자열 더하기
    greeting = "Hello"
    name = "Alice"
    message = greeting + ", " + name + "!"
    print(message)  # Output: Hello, Alice!
    
    # 문자열 인덱싱: 첫 번째 문자 출력
    print(greeting[0])  # Output: 'H'
    
    # 문자열 슬라이싱: 두 번째에서 세 번째 문자 출력
    print(greeting[1:3])  # Output: 'el'
    
    # 문자열 슬라이싱: 세 번째 문자부터 끝까지 출력
    print(greeting[2:])  # Output: 'llo'
    
    # 문자열 반복: 문자열 두 번 출력
    print(greeting * 2)  # Output: 'HelloHello'
    
    # 문자열 연결: 문자열에 다른 문자열 추가
    print(greeting + "TEST")  # Output: 'HelloTEST'

    3) List

    # 리스트 변수 선언 및 출력
    var_list = [1, 2, 3, 4, 5]
    print(var_list)  # Output: [1, 2, 3, 4, 5]
    
    # 리스트 요소 접근
    print(var_list[0])  # Output: 1 (첫 번째 요소)
    print(var_list[-1])  # Output: 5 (마지막 요소)
    
    # 리스트 슬라이싱
    print(var_list[1:4])  # Output: [2, 3, 4] (인덱스 1부터 3까지의 요소)
    
    # 리스트 반복: 리스트 두 번 출력
    print(var_list * 2)  # Output: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
    
    # 리스트 연결: 리스트에 다른 리스트 추가
    var_list2 = [6, 7, 8]
    print(var_list + var_list2)  # Output: [1, 2, 3, 4, 5, 6, 7, 8]

    4) Tuples

    # 튜플 변수 선언 및 출력
    var_tuple = (1, 2, 3, 4, 5)
    print(var_tuple)  # Output: (1, 2, 3, 4, 5)
    
    # 튜플 요소 접근
    print(var_tuple[0])  # Output: 1 (첫 번째 요소)
    
    # 튜플 요소 접근: 세 번째 요소 출력
    print(var_tuple[2])  # Output: 3
    
    # 튜플 슬라이싱: 두 번째에서 네 번째 요소 출력
    print(var_tuple[1:4])  # Output: (2, 3, 4)
    
    # 튜플 반복: 튜플 두 번 출력
    print(var_tuple * 2)  # Output: (1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
    
    # 튜플 언패킹
    a, b, c, d, e = var_tuple
    print(a, b, c, d, e)  # Output: 1 2 3 4 5

    5) Dictionary

    # 사전 변수 선언 및 출력
    var_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}
    print(var_dict)  # Output: {'name': 'Alice', 'age': 30, 'city': 'New York'}
    
    # 사전 요소 접근
    print(var_dict['name'])  # Output: Alice
    print(var_dict['age'])   # Output: 30
    
    # 사전 값 수정
    var_dict['age'] = 35
    print(var_dict['age'])   # Output: 35
    
    # keys() 메서드를 사용하여 모든 키(key) 출력
    print(var_dict.keys())  # Output: dict_keys(['name', 'age', 'city'])
    
    # values() 메서드를 사용하여 모든 값(value) 출력
    print(var_dict.values())  # Output: dict_values(['Alice', 30, 'New York'])
    
    # 사전 새로운 키-값 쌍 추가
    var_dict['job'] = 'Engineer'
    print(var_dict)  # Output: {'name': 'Alice', 'age': 35, 'city': 'New York', 'job': 'Engineer'}
    
    # 딕셔너리 길이 확인: len() 함수 사용
    print(len(var_dict))  # Output: 4 (키-값 쌍의 개수)
    
    # 'name' 키가 딕셔너리에 있는지 확인: in 연산자 사용
    print('name' in var_dict)  # Output: True
    
    # 'salary' 키가 딕셔너리에 있는지 확인
    print('salary' in var_dict)  # Output: False
    
    # 모든 키-값 쌍 출력: items() 메서드 사용
    print(var_dict.items())  # Output: dict_items([('name', 'Alice'), ('age', 35), ('city', 'New York'), ('job', 'Engineer')])

     

     

    판다스와 파이썬 자료형

    데이터 분석에 사용할 판다스의 자료형도 알아보자.

    내용 판다스 자료형 파이썬 자료형
    문자열 object string
    정수 int64 int
    소수점 숫자 float64 float
    날짜 datetime64 datetime

    함수와 모듈

    프로그래밍을 하다보면 똑같은 내용을 반속해서 작성할 때가 있다. 이럴 때 매번 똑같은 코드를 매번 작성할 것인가? 아니다 매우 비효율적이며 가독성도 떨어진다. 이때 필요한 것이 함수이다.

    함수(Function)는 프로그래밍에서 반복적으로 사용되는 코드 블록을 하나로 묶어 재사용할 수 있게 해주는 도구로 함수를 사용함으로써 코드의 중복을 줄이고, 유지보수성을 높이며, 코드의 가독성을 개선할 수 있다.

    def function_name(parameters):
        """Docstring: 함수에 대한 설명"""
        # 함수의 기능 구현
        statement(s)
        return value(s)  # 선택적으로 값을 반환할 수 있음

     

    • def: 함수를 정의하는 키워드입니다.
    • function_name: 함수의 이름을 지정합니다. 이 이름으로 함수를 호출합니다.
    • parameters: 함수가 입력으로 받는 값들을 나타냅니다. 필요 없을 경우 생략 가능합니다.
    • Docstring: 함수에 대한 설명을 작성하는 부분입니다. 생략 가능하지만 좋은 코드 문서화를 위해 권장됩니다.
    • statement(s): 함수의 본문에 해당하는 코드 블록입니다. 함수가 수행할 작업을 구현합니다.
    • return: 선택적으로 함수가 결과 값을 반환할 수 있습니다.

    함수 사용 예시

    # 두 숫자를 더하는 함수
    def add_numbers(a, b):
        """두 숫자를 더하는 함수"""
        result = a + b
        return result
    
    # 함수 호출과 결과 출력
    sum_result = add_numbers(3, 5)
    print("두 숫자의 합:", sum_result)  # Output: 두 숫자의 합: 8

     

     

    모듈(Module)은 파이썬 프로그램 파일(.py)로, 함수나 변수들을 모아놓은 것으로 모듈을 사용하면 관련 있는 기능들을 하나의 파일에 묶어 다른 프로그램에서 재사용할 수 있다. 이러한 모듈화는 코드의 구조를 체계적으로 관리하고, 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 한다.

     

    모듈 만들기

    모듈을 만들기 위해서는 단순히 파이썬 파일을 만들고 그 안에 함수나 클래스를 정의하면 된다. 예를 들어, my_module.py라는 파일에 다음과 같이 함수를 정의할 수 있다:

    # my_module.py
    
    def greet(name):
        """인사말을 출력하는 함수"""
        print(f"Hello, {name}!")
    
    def add_numbers(a, b):
        """두 숫자를 더하는 함수"""
        return a + b
    
    # 모듈 실행 테스트
    if __name__ == "__main__":
        print("이 파일은 모듈로 실행됩니다.")
        print(add_numbers(3, 5))

    모듈 사용하기

    위에서 정의한 my_module.py 파일을 다른 파이썬 파일에서 모듈로서 import하여 사용할 수 있다.

    # main.py
    
    import my_module
    
    # 모듈의 함수 호출
    my_module.greet("Alice")  # Output: Hello, Alice!
    result = my_module.add_numbers(10, 20)
    print("결과:", result)   # Output: 결과: 30

     

    모듈의 장점

    1. 코드 재사용: 모듈을 사용하여 이미 작성된 함수나 클래스를 다른 프로그램에서 쉽게 재사용할 수 있습니다.
    2. 네임스페이스 분리: 모듈을 사용하면 변수와 함수 이름이 충돌하는 것을 방지할 수 있습니다. 각 모듈은 자신만의 네임스페이스를 가지기 때문에 이름 충돌 문제가 줄어듭니다.
    3. 구조화된 코드: 모듈을 사용하면 프로그램을 여러 개의 파일로 구조화하여 관리할 수 있습니다. 이는 코드의 가독성과 유지보수성을 높이는 데 도움이 됩니다.

    모듈은 파이썬에서 코드를 조직화하고 효율적으로 관리하는 데 필수적인 도구입니다. 파이썬의 강력한 표준 라이브러리와 다양한 서드파티 라이브러리들도 모두 모듈 형태로 제공되어 있어, 다양한 기능을 활용할 수 있습니다.

    'Python > 빅데이터 분석과 머신러닝' 카테고리의 다른 글

    #4 데이터 보기(판다스)  (0) 2024.07.17
    #6 데이터 탐색  (0) 2024.07.14
    #5 데이터 클렌징  (1) 2024.07.14
    #3 데이터 준비  (1) 2024.07.05
    #1 빅데이터와 인공지능(머신러닝)  (1) 2024.07.03