카테고리 없음

6. TIL) 파이썬 활용 데이터 분석

kaseomi 2024. 12. 23. 20:47
728x90

한 주가 지나고 또 다시 TIL 시간이 돌아왔다 !

주말이 너무나 빠르게 지나갔지만 ,, 어쨌든

오늘 해볼 내용은 "데이터 분석을 파이썬으로 활용해보자"

 

 

 

 

파이썬을 다룰 수 있는 환경에는

- Colab

- jupyter notebook (anaconda)

- visual studio

- pycharm 등이 있다.

 

기존 TIL에서는 Colab을 사용하였지만,

앞으로는 Colab과 pycharm을 같이 사용해볼 계획이다.

 

 

파이썬이란?

1) 귀도 반 로섬이 개발한 프로그래밍 언어로 간결하고 가독성이 높은 것이 특징이다.

2) 파이썬은 다른 프로그래밍 언어에 비해 진입장벽이 낮고 직관적이며 코드 실행결과를 수시로 확인할 수 있다.

3) 다양한 데이터 분석 패키지, 데이터 시각화 패키지, 머신러닝 패키지, 딥러닝 패키지 등을 사용할 수 있기 때문에 데이터 분석에 있어서 매우 중요한 언어이다.

 

파이썬 데이터의 종류에는 크게

Numeric Type

- Integers

- Floats

Sequence Type

- List (나열)

- Tuple

- Strings

가 있다.

(type 함수를 사용하면 해당 변수가 어떤 자료형인지 알 수 있음)

 

 

 

 

데이터 분석 1차시

출력할 때에는 print( ) 함수를 사용한다.

print("hello, world!")


잘 작동되는지 확인 헬로 월드 ~

 

파이썬의 연산 함수

num1 =3
num2 =2
sum_result = num1 + num2
diff_result = num1 - num2
product_result = num1 * num2
division_result = num1 / num2
integer_division_result = num1 // num2
remainder_result = num1 % num2

print("합:", sum_result)
print("차:", diff_result)
print("곱:", product_result)
print("나누기:", division_result)
print("정수 나누기:", integer_division_result)
print("나머지:", remainder_result)

실행 결과

소수점이 있으면 Integers(정수형)

소수점이 없으면 Floats(실수형)

 

Boolean 변수 선언

주어진 조건이 참인지 거짓인지 나타내는 데 사용한다.

조건식을 평가하는 데 매우 중요하며 데이터 분석에서도 자주 활용된다.

(True or False)

x = 10
y = 5

greater_than = x > y
print(greater_than)

# 출력값

true

 

NaN

NaN은 정의할 수 없는 수치값이다. NaN 자체가 자료형은 아니지만 따지고 보면 숫자형에 포함되어있다.

데이터프레임과 같은 데이터 구조에서 결측치를 표현할 때 NaN이 사용된다.

result = 1 / 0
print(result) 

에러 메세지

 

유효하지 않은 수학적 연산

import math
result = math.sqrt(-1)
print(result)

 

 

NaN 값을 포함한 데이터 출력

import pandas as pd
data = {'A': [1, 2, None],
        'B': [3, None, 5]}
df = pd.DataFrame(data)
print(df)

#출력값 

   A    B
0  1.0  3.0
1  2.0  NaN
2  NaN  5.0

 

 

input

input( ) 함수는 사용자로부터 키보드로 입력을 받는 함수이다.

사용자와 상호작용하여 프로그램을 만들 수 있다.

 

변수 입력 및 출력

# 학생들의 성적 데이터를 변수에 할당
grade1 = 85
grade2 = 92
grade3 = 78
grade4 = 90
grade5 = 88

# 각 변수에 담긴 데이터 출력
print("첫 번째 학생의 성적:", grade1)
print("두 번째 학생의 성적:", grade2)
print("세 번째 학생의 성적:", grade3)
print("네 번째 학생의 성적:", grade4)
print("다섯 번째 학생의 성적:", grade5)

#출력값

첫 번째 학생의 성적: 85
두 번째 학생의 성적: 92
세 번째 학생의 성적: 78
네 번째 학생의 성적: 90
다섯 번째 학생의 성적: 88

 

 

변수끼리의 계산

# 데이터를 변수에 할당
data1 = 85
data2 = 92
data3 = 78
data4 = 90
data5 = 88

# 데이터의 평균 계산
total = data1 + data2 + data3 + data4 + data5  # 모든 데이터의 합을 계산
count = 5  # 데이터의 개수를 직접 지정
average = total / count  # 데이터의 평균을 계산
print("데이터 평균:", average)

#출력값

데이터 평균: 86.6

 

머신러닝 모델구조

from sklearn.linear_model import LinearRegression

# 선형 회귀 모델 객체 생성
model = LinearRegression( )

 

QUIZ 1

1) 숫자 자료형 값을 변수에 저장하고 출력하기

다음 두 수의 합을 구하여 출력하세요.

 

첫 번째 수 : 15

두 번째 수 : 27

Data1 = 15

Data2 = 27

P = Data1 + Data2

print(P)

#출력값

42

 

2) 문자 자료형 값을 변수에 저장하고 출력하기

다음 문장을 변수에 담고 출력하세요.

"Python은 데이터 분석과 인공지능 분야에서 매우 인기 있는 프로그래밍 언어입니다."

 

string = "Python은 데이터 분석과 인공지능 분야에서 매우 인기 있는 프로그래밍 언어입니다."

print(string)

#출력값

Python은 데이터 분석과 인공지능 분야에서 매우 인기 있는 프로그래밍 언어입니다.

 

 

 

 

데이터 분석 2차

List, Tuple, Dictionary에 대해 알아보자

List

파이썬에서 가장 자주 사용되는 데이터 구조 중 하나이다.

또한 여러 항목들을 담을 수 있는 가변(mutable)한 시퀀스(sequence)이다.

[ ] 대괄호를 사용하여 리스트를 만들 수 있다.

괄호 안에 있는 데이터를 index 하는 예시는 밑에 사진 첨부해두었다.

 

List의 기본구조

리스트는 여러 값을 순서대로 담을 수 있다.

각 값은 쉼표로 구분되고, 대괄호 안에 들어간다.

 

List 생성

my_list = [1, 2, 3, 4, 5]

 

index를 사용해 요소 접근하기

# 리스트 생성
numbers = [1, 2, 3, 4, 5]

# 첫 번째 요소에 접근하기
first_number = numbers[0]
print("First number:", first_number)

# 두 번째 요소에 접근하기
second_number = numbers[1]
print("Second number:", second_number)

# 마지막 요소에 접근하기
last_number = numbers[-1]
print("Last number:", last_number)

# 음수 인덱스를 사용하여 역순으로 요소에 접근하기
second_last_number = numbers[-2]
print("Second last number:", second_last_number)

#출력값

First number: 1
Second number: 2
Last number: 5
Second last number: 4

 

리스트의 다양한 메서드(Methods)

append( ) : 리스트에 항목을 추가

extend( ) : 리스트에 다른 리스트의 모든 항목을 추가

insert( ) : 리스트의 특정 위치에 항목을 삽입

remove( ) : 리스트에서 특정 값을 삭제

pop( ) : 리스트에서 특정 위치의 값을 제거하고 반환

index( ) : 리스트에서 특정 값의 인덱스를 찾음

count( ) : 리스트에서 특정 값의 개수를 셈

sort( ) : 리스트의 항목들을 정렬

reverse( ) : 리스트의 항목들을 역순으로 뒤집음

 

List의 다양한 매서드 1

print(nested_list[1][0])  # 출력: 4 (두 번째 리스트의 첫 번째 항목)# 리스트 생성
my_list = [1, 2, 3, 4, 5]

# 리스트의 다양한 메서드(Methods)
my_list.append(6)  # 리스트에 새로운 항목 추가
print(my_list)  # 출력: [1, 2, 3, 4, 5, 6]

my_list.extend([7, 8, 9])  # 다른 리스트의 모든 항목을 추가
print(my_list)  # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9]

my_list.insert(2, 10)  # 두 번째 위치에 값 삽입
print(my_list)  # 출력: [1, 2, 10, 3, 4, 5, 6, 7, 8, 9]

my_list.remove(3)  # 값 3 삭제
print(my_list)  # 출력: [1, 2, 10, 4, 5, 6, 7, 8, 9]

popped_value = my_list.pop(5)  # 다섯 번째 위치의 값 제거하고 반환
print(popped_value)  # 출력: 6
print(my_list)  # 출력: [1, 2, 10, 4, 5, 7, 8, 9]

print(my_list.index(4))  # 출력: 3 (값 4의 인덱스)

print(my_list.count(7))  # 출력: 1 (값 7의 개수)

my_list.sort()  # 리스트 정렬
print(my_list)  # 출력: [1, 2, 4, 5, 7, 8, 9, 10]

my_list.reverse()  # 리스트 역순으로 뒤집기
print(my_list)  # 출력: [10, 9, 8, 7, 5, 4, 2, 1]

 

List의 다양한 매서드 2

# 리스트 값 삭제

# 리스트의 항목 삭제
del my_list[0]
print("첫 번째 항목 삭제 후 리스트:", my_list)

# 리스트 내 값들의 모든 항목 제거
my_list.clear()
print("모든 항목 제거 후 리스트:", my_list)

# 리스트 값 변경

my_list = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# 리스트 값 변경하기
my_list[3] = 'dragonfruit'
print(my_list)  # 출력: ['apple', 'banana', 'cherry', 'dragonfruit', 'elderberry']

# 중첩된 리스트에서 인덱싱하기
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

 

실전에서 쓰이는 예시

grades = [85, 92, 88, 78, 90]
average_grade = sum(grades) / len(grades)
print("평균 성적:", average_grade)

#출력값

평균 성적: 86.6

 

슬라이싱

리스트 슬라이싱은 리스트의 일부분을 추출하는 것이다.

리스트에서 특정 범위의 항목을 선택하거나 리스트를 자르는 등의 작업을 할 수 있다.

슬라이싱 방향은 항상 오른쪽으로 진행한다.

 

슬라이싱의 다양한 매서드

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 1. 일부분만 추출하기
print(my_list[2:5])
# 출력: [3, 4, 5]

# 2. 시작 인덱스 생략하기 (처음부터 추출)
print(my_list[:5])
# 출력: [1, 2, 3, 4, 5]

# 3. 끝 인덱스 생략하기 (끝까지 추출)
print(my_list[5:])
# 출력: [6, 7, 8, 9, 10]

# 4. 음수 인덱스 사용하기 (뒤에서부터 추출)
print(my_list[-3:])
# 출력: [8, 9, 10]

# 5. 간격 설정하기 (특정 간격으로 추출)
print(my_list[1:9:2])
# 출력: [2, 4, 6, 8]

# 6. 리스트 전체를 복사하기
copy_of_list = my_list[:]
print(copy_of_list)
# 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 7. 리스트를 거꾸로 뒤집기
reversed_list = my_list[::-1]
print(reversed_list)
# 출력: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]


# 리스트에서 홀수 번째 인덱스의 값들 출력하기
my_list = [10, 20, 30, 40, 50, 60, 70, 80, 90]

odd_index_values = my_list[1::2]
print("홀수 번째 인덱스의 값들:", odd_index_values)
# 출력: [20, 40, 60, 80]

 

정렬

sort( ) 함수는 리스트의 항목들을 정렬하는 데 사용한다.

리스트 내의 항목들이 오름차순으로 정렬된다.

sort( ) 메서드는 원래의 리스트를 변경하며, 새로운 정렬된 리스트를 반환하지 않는다.

reverse : 정렬 순서를 지정. 기본값은 False로 오름차순을 의미, True로 설정하면 내림차순 정렬된다.

my_list.sort(reverse=False)

#내림차순 정렬

 

정렬 예시

# 숫자로 이루어진 리스트 정렬 예시
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
numbers.sort()
print("정렬된 리스트:", numbers)
# 출력: [1, 1, 2, 3, 4, 5, 5, 6, 9]

# 문자열로 이루어진 리스트 정렬 예시
words = ['apple', 'banana', 'orange', 'grape', 'cherry']
words.sort()
print("정렬된 리스트:", words)
# 출력: ['apple', 'banana', 'cherry', 'grape', 'orange']

# 내림차순으로 리스트 정렬 예시
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
numbers.sort(reverse=True)
print("내림차순으로 정렬된 리스트:", numbers)
# 출력: [9, 6, 5, 5, 4, 3, 2, 1, 1]

# 리스트의 문자열 길이로 정렬 예시
words = ['apple', 'banana', 'orange', 'grape', 'cherry']
words.sort(key=len)
print("문자열 길이로 정렬된 리스트:", words)
# 출력: ['apple', 'grape', 'banana', 'cherry', 'orange']

 

리스트가 실전에서 사용되는 예시

# 데이터를 임의 범위만큼 선택할 때 슬라이싱, 인덱싱 사용
from sklearn.datasets import load_iris

# Iris 데이터셋 불러오기
iris = load_iris()

# Iris 데이터셋에서 특정 범위의 데이터 슬라이싱하기
train_data = iris.data[:100]  # 인덱스 0부터 99까지의 데이터 추출
print("학습 데이터:", train_data)
test_data = iris.data[100:]  # 인덱스 100부터 끝까지의 데이터 추출
print("학습 데이터:", test_data)

#출력결과

학습 데이터: [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]

이하 생략

 

Tuple

#튜플은 리스트와 같이 인덱스와 슬라이싱을 사용하여 요소에 접근할 수 있음
my_tuple = (1, 2, 3, 'hello', 'world')

print(my_tuple[0])      # 첫 번째 요소에 접근
print(my_tuple[-1])     # 마지막 요소에 접근
print(my_tuple[2:4])    # 인덱스 2부터 3까지의 요소를 슬라이싱

 

Tuple에서 자주 사용하는 메서드

count( ) : 지정된 요소의 개수를 반환합니다.
index( ) : 지정된 요소의 인덱스를 반환합니다.

 

Tuple 생성

my_tuple = (1, 2, 3, 4, 1, 2, 3)

 

count 예제

count_of_1 = my_tuple.count(1)
print("Count of 1:", count_of_1)
# 출력: 2

 

index 예제

index_of_3 = my_tuple.index(3)
print("Index of 3:", index_of_3)
# 출력: 2

 

Tuple과 List의 차이점

튜플은 변경할 수 없기 때문에 요소를 추가, 삭제, 수정하는 것은 불가능하다.

하지만 튜플을 합치거나 반복하여 새로운 튜플을 생성할 수는 있다.

이러한 특성은 데이터 불변성을 보장한다.

tuple1 = (1, 2, 3)
tuple2 = ('a', 'b', 'c')

new_tuple = tuple1 + tuple2  # 두 개의 튜플을 합치기
print(new_tuple)

repeated_tuple = tuple1 * 3  # 튜플을 반복하기
print(repeated_tuple)

 


Tuple과 List의 변경

# 튜플을 리스트로 변경하기
my_tuple = (1, 2, 3, 4, 5)
my_list = list(my_tuple)
print(my_list)
# 출력: [1, 2, 3, 4, 5]

# 리스트를 튜플로 변경하기
my_list = [1, 2, 3, 4, 5]
my_tuple = tuple(my_list)
print(my_tuple)
# 출력: (1, 2, 3, 4, 5)

 

Tuple 실전 사용 예시

변하면 안되는 개인정보 데이터를 튜플로 변수에 담기

# 데이터 표현 예시
record = ('John', 30, 'john@example.com')

 

 

 

 

Dictionary

키와 값이 한 쌍의 데이터를 저장하는 자료구조로, 중괄호 { }로 둘러싸여 있으며 각 요소는 쉼표로 구분한다.

각 키는 유일해야 하지만 값은 중복 될 수 있다.

해시 테이블로 구현되어 있어 키를 사용하여 매우 빠르게 값을 찾을 수 있다.

 

Dictionary 기본 구조

my_dict = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}

 

Dictionary 기본기

# 빈 딕셔너리 생성
empty_dict = {}

# 학생 성적표
grades = {
    'Alice': 90,
    'Bob': 85,
    'Charlie': 88
}

# 접근하기
print(grades['Alice'])  # 출력: 90

# 값 수정하기
grades['Bob'] = 95

# 요소 추가하기
grades['David'] = 78

# 요소 삭제하기
del grades['Charlie']

 

 

Dictionary에서 자주 사용되는 메서드

keys( ): 모든 키를 dict_keys 객체로 반환합니다.

values( ): 모든 값을 dict_values 객체로 반환합니다.

items( ): 모든 키-값 쌍을 (키, 값) 튜플로 구성된 dict_items 객체로 반환합니다.

get( ): 지정된 키에 대한 값을 반환합니다. 키가 존재하지 않으면 기본값을 반환합니다.

pop( ): 지정된 키와 해당 값을 딕셔너리에서 제거하고 값을 반환합니다.

popitem( ): 딕셔너리에서 마지막 키-값 쌍을 제거하고 반환합니다.

 

Dictionary 다양한 메서드

# 딕셔너리 생성
my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}

# keys() 메서드 예제
keys = my_dict.keys()
print("Keys:", keys)
# 출력: dict_keys(['name', 'age', 'city'])

# values() 메서드 예제
values = my_dict.values()
print("Values:", values)
# 출력: dict_values(['John', 30, 'New York'])

# items() 메서드 예제
items = my_dict.items()
print("Items:", items)
# 출력: dict_items([('name', 'John'), ('age', 30), ('city', 'New York')])

# get() 메서드 예제
age = my_dict.get('age')
print("Age:", age)
# 출력: 30

# pop() 메서드 예제
city = my_dict.pop('city')
print("City:", city)  # 출력: New York
print("Dictionary after pop:", my_dict)
# 출력: {'name': 'John', 'age': 30}

# popitem() 메서드 예제
last_item = my_dict.popitem()
print("Last item popped:", last_item)  # 출력: ('age', 30)
print("Dictionary after popitem:", my_dict)
# 출력: {'name': 'John'}

 

Dictionary 실전 사용 예시

데이터를 사전처럼 저장하고 싶을 때, 다양한 데이터를 효율적으로 관리하고 분석할 수 있다.

# 사용자 정보 관리
user_info = {
    'username': 'john_doe',
    'email': 'john@example.com',
    'age': 30,
    'is_active': True
}

# 제품 카탈로그
products = {
    '1001': {'name': 'Keyboard', 'price': 20.99, 'stock': 50},
    '1002': {'name': 'Mouse', 'price': 15.50, 'stock': 70},
    '1003': {'name': 'Monitor', 'price': 199.99, 'stock': 30}
}

# 날짜별 이벤트 관리

events = {
    '2024-04-01': ['Meeting with client', 'Team lunch'],
    '2024-04-02': ['Presentation preparation', 'Project review'],
    '2024-04-03': ['Training session', 'Code debugging']
}

# 영화 정보 저장
movies = {
    'Interstellar': {'genre': 'Sci-Fi', 'director': 'Christopher Nolan', 'year': 2014},
    'Inception': {'genre': 'Sci-Fi', 'director': 'Christopher Nolan', 'year': 2010},
    'The Shawshank Redemption': {'genre': 'Drama', 'director': 'Frank Darabont', 'year': 1994}
}

 

Quiz 1

1) 리스트 활용 퀴즈

1-1) 다음 리스트에서 세 번째 요소를 출력하세요.

my_list = [10, 20, 30, 40, 50]

 

my_list = [10, 20, 30, 40, 50]

print(my_list[2])

#출력값

30

 

 

1-2) 다음 리스트에 60을 추가하세요.

my_list = [10, 20, 30, 40, 50]

 

my_list.append(60)

print(my_list)

 

#출력값 

[10, 20, 30, 40, 50, 60]

 

 

1-3) 다음 리스트의 길이를 출력하세요

my_list = ['apple','banana','orange','grape']

 

print(len(my_list))

#출력값

4

 

 

1-4) 다음 리스트의 마지막 요소를 제거하세요

my_list = ['car','bus','bike','train']

 

my_list.pop(3)

print(my_list)

#출력값

['car', 'bus', 'bike']

 

 

1-5) 다음 리스트를 역순으로 출력하세요

my_list = ['red','green','blue','yellow']

my_list.reverse()

print(my_list)

#출력값

['yellow', 'blue', 'green', 'red']

 

 

2) 튜플 활용 퀴즈

2-1) 다음 튜플에서 세 번째 요소를 출력하세요

my_tuple = (10, 20, 30, 40, 50)

 

print(my_tuple[2])

#출력값

30

 

2-2) 다음 튜플의 길이를 출력하세요

my_tuple = ('apple', 'banana', 'orange', 'grape')

 

print(len(my_tuple))

#출력값

4

 

2-3) 다음 튜플을 역순으로 출력하세요

my_tuple = ('red', 'green', 'blue', 'yellow')

 

reversed_my_tuple = tuple(reversed(my_tuple))

print(reversed_my_tuple)

#출력값

('yellow', 'blue', 'green', 'red')

 

2-4) 다음 튜플을 리스트로 변환하세요

my_tuple = (1, 2, 3, 4, 5)

 

print(list(my_tuple))

#출력값

[1, 2, 3, 4, 5]

 

 

2-5) 다음 튜플과 다른 튜플을 연결하여 새로운 튜플을 만드세요

my_tuple1 = ('a', 'b', 'c')

my_tuple2 = ('d', 'e', 'f')

 

new_tuple = my_tuple1 + my_tuple2

print(new_tuple)

#출력값

[1, 2, 3, 4, 5]

 

 

3) 딕셔너리 활용 퀴즈

3-1) 다음 딕셔너리에서 'name'에 해당하는 값을 출력하세요

my_dict = {'name': 'Alice',
                 'age': 30,

                 'city' : 'New York'}

 

name_value = my_dict['name']

print(name_value)

#출력값

Alice

 

 

3-2) 다음 딕셔너리에 'gender'를 추가하세요

my_dict = {'name': 'Bob',

                 'age': 25,

                 'city': 'Los Angeles'}

 

my_dict['gender'] = 'male'

print(my_dict)

 

#출력값

{'name': 'Bob', 'age': 25, 'city': 'Los Angeles', 'gender': 'male'}

 

 

3-3) 다음 딕셔너리의 길이를 출력하세요

my_dict = {'a': 100, 'b': 200, 'c': 300}

 

print(len(my_dict))

#출력값

3

 

 

3-4) 다음 딕셔너리에서 'age'를 제거하세요

my_dict = {'name': 'Charlie',

                 'age': 35,

                 'city': 'Chicago'}

 

del my_dict['age']

print(my_dict)

#출력값

{'name': 'Charlie', 'city': 'Chicago'}