새로운 팀원들과 아이스브레이킹을 하고 라이브 세션과 LMS를 통해 파이썬 프로그램 기초를 다시 학습하는 시간을 가졌다. 추가로 데이터 리터러시에 대해 알아가는 시간을 가졌다.
Python 기초 학습
↓ ↓ ↓ 파이썬의 기대효과↓ ↓ ↓
● 데이터 관리 : 데이터 분석을 위해 방대한 데이터들을 불러오고 저장은 가장 기본적인 과정으로, 이로부터 파이썬 문법을 사용하기 시작한다.
● 데이터 전처리 : 데이터 분석 전 데이터의 문제가 있는지 살펴보고 데이터를 분석하기 좋게 전처리하는 과정은 필수이다.
● 데이터 시각화 : 데이터를 불러오거나 분석하고 난 후에 데이터의 형태를 살펴보기 위해 필수적이다.
● 데이터 계산 : 데이터 분석에서 가장 중요한 과정이며 이를 수행하는데도 파이썬 문법이 필수이다. 다양한 통계적인 계산을 수행하기도 하며 직접 만든 수식을 적용하기도 하고 머신러닝이나 딥러닝을 함께 사용하기도 한다.

- 코드를 입력할 수 있는 칸을 ‘cell’이라고 한다.
- 데이터가 1개이면 datum, 여러개면 data.
- 데이터 하나만 불러오는 것은 ‘인덱싱(indexing)’, 여러개를 불러오는 것은 ‘슬라이싱(slicing)’
↓ ↓ ↓ Colab 주요 단축키↓ ↓ ↓
● 새 코드 셀 추가 : 코드 셀을 추가하려면 코드 셀 위에서 Ctrl + M + A
● 코드 셀 삭제: 코드 셀을 삭제하려면 코드 셀 위에서 Ctrl + M + D
● 코드 셀 분할: 코드 셀을 분할하려면 코드 셀 위에서 Ctrl + M + 하이픈(-)
● 셀 유형 변경: 코드 셀을 마크다운 셀로 변경하려면 코드 셀 위에서 Ctrl + M + M
▶변수란?
☞ 값을 저장하는 공간
☞ 변수의 자료형
- 정수(int)
- 실수(float)
- 문자열(str)
-
더보기full_greeting = greeting + " My name is " + name
#"Hello, World! My name is Alice" 출력
-
- 리스트(list)
- 튜플(tuple)
- 딕셔너리(dict) 등
- Sequence Type : 순서대로 나열된 데이터 자료형들
- 'type()' 함수를 이용하여 자료형을 확인할 수 있다.

☞ 변수의 종류
- 문자열
- 문자열 변수끼리 연결 가능. 대문자, 소문자로 바꾸기, 문자열 쪼개기 가능
-
더보기full_greeting = greeting + " My name is " + name
#"Hello, World! My name is Alice" 출력
# upper() lower()
upps = letter.upper() # 대문자
lows = letter.lower() # 소문자
#split() : () 를 기준으로 문자열을 쪼개어 준다.
a.split() # 공백을 기준으로 문자열을 분리
#'Hello','Python'
let3 = "hello,python, Elice"
let3.split(', ') # 콤마+공백을 기준으로 분리
# ['hello,python', 'Elice']
# replace ()
let2.replace('Hello',' ') # 공백처리
- 숫자열
- 정수(int) : 0, 1, 2, -1, -2 ...
- 실수(float) : 3.14, 0.99999, 0.00001, 0.0 ...
-
더보기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)
- 불리언(Boolean) : 파이썬에서는 Boolean 자료형이 주어진 조건이 참(True) 또는 거짓(False)을 나타내는 데 사용됩니다.
- NaN (결측값) : NaN(Not a Number)은 데이터에서 결측치(missing value)를 나타내는 특수한 값입니다.
- 입력문 (input) : 'input()' 함수는 사용자로부터 키보드로 입력을 받는 함수이다.

▶ List 인덱싱하기(Indexing)
※ indexing : 리스트에서 특정 위치의 값에 접근하는 방법
# 리스트 생성
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)
☞ 리스트의 다양한 메서드(Methods)
- append(): 리스트에 항목을 추가하기
- extend(): 리스트에 다른 리스트의 모든 항목을 추가하기
- insert(): 리스트의 특정 위치에 항목을 삽입하기
- remove(): 리스트에서 특정 값을 삭제하기
- pop(): 리스트에서 특정 위치의 값을 제거하고 반환하기
- index(): 리스트에서 특정 값의 인덱스를 찾기
- count(): 리스트에서 특정 값의 개수를 세기
- sort(): 리스트의 항목들을 정렬하기
- reverse(): 리스트의 항목들을 역순으로 뒤집기
# 리스트 생성
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]
☞ 리스트 값 삭제하기
# 리스트의 항목 삭제
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]]
print(nested_list[1][0]) # 출력: 4 (두 번째 리스트의 첫 번째 항목)
● 리스트 슬라이싱 : 리스트의 일부분을 추출하는 것. 특정 범위의 항목을 선택하거나 리스트를 자르는 등의 작업을 할 수 있다.

# 리스트 슬라이싱의 구분
# 아래는 실행하는 코드가 아닙니다
new_list = old_list[start:end:step]
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() 메서드는 리스트를 사용해 항목을 오름차순으로 정렬한다.
-
'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']
● 리스트 병합하기
let2= 'Hello Python'
output= letter + let2 # letterHello Python
mul_output= let2 * 2 # Hello PythonHello Python
▶ 튜플(Tuple) : 변경할 수 없는(immutable) 시퀀스(sequence) 자료형. '()' 또는 ',' 사용한다.
☞ 인덱싱, 슬라이싱
리스트와 거의 동일하지만, 튜플은 수정이 불가해서 내용 수정이 필요한 경우 'list()'함수를 사용하여 리스트화한 후 수정 가능! 이후 'tuple()'함수를 이용하여 다시 튜플로 변경해줘야 한다.
☞ 튜플에서 자주 사용하는 메서드(Methods)
- count(): 지정된 요소의 개수를 반환한다.
- index(): 지정된 요소의 인덱스를 반환한다.
# 튜플 생성
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
▶ 딕셔너리(dict) : 키-값 쌍의 데이터를 저장하는 자료구조. {} 사용
my_dict = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
}
#여기서 'key1', 'key2', 'key3'은 각각 키이고, 'value1', 'value2', 'value3'은 각 키에 대응하는 값이다.
☞ 딕셔너리에서 자주 사용하는 메서드(Methods)
- keys(): 모든 키를 dict_keys 객체로 반환한다.
- values(): 모든 값을 dict_values 객체로 반환한다.
- items(): 모든 키-값 쌍을 (키, 값) 튜플로 구성된 dict_items 객체로 반환한다.
- get(): 지정된 키에 대한 값을 반환합니다. 키가 존재하지 않으면 기본값을 반환한다.
- → 'index'와 'get' 함수는 거의 동일
- pop(): 지정된 키와 해당 값을 딕셔너리에서 제거하고 값을 반환한다.
- popitem(): 딕셔너리에서 마지막 키-값 쌍을 제거하고 반환다.
# 딕셔너리 생성
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'}
☆ 데이터 리터러시 ☆
→ 우리가 방향을 잃고 데이터 분석을 위한 분석을 하지 않게 도와주는 ‘soft skill’

☞ ‘데이터 분석’ 단계보다 ‘문제 및 가설 정의’&‘결과 해석 및 도출’ 단계에서 시간을 많이 할애하는 것이 필요하다.
☞ 항상 데이터 분석이 목적이 되지 않도록 ‘왜??’를 항상 생각하는 것이 중요하다.
▶ 심슨의 역설(Simpson's Paradox) : ‘부분’에서 성립한 대소 관계가 그 부분들을 종합한 ‘전체’에 대해서는 성립하지 않는 모순적인 경우


● 전체에 대한 결론이 언제나 개별 집단에 그대로 적용되는 것은 아니다.
● 데이터에 기반한 결론이라고 해서 이를 맹목적으로 받아들여서는 안된다.
▶ 시각화를 활용한 왜곡

● 왼쪽 그래프에서는 노동자의 임금이 현저히 낮은 것을 확인할 수 있다.
● 중간 그래츠에서는 노동자들의 임금 증가가 급격하게 이루어져 왔다고 해석될 여지가 존재한다.
● 오른쪽 그래프에서는 노동자들의 임금 증가가 자본가의 수입 증가를 훨씬 능가한다고 해석될 여지가 존재한다.
▶ 샘플링 편향
전체를 대표하지 못하는 편향된 샘플 선정으로 인해 오류 발생
▶ 상관관계와 인과관계
● 상관관계 : 두 변수가 얼마나 상호 의존적인지 파악하는 것을 의미, 파악 방법은 한 변수가 증가하면 다른 변수도 따라서 증가/감소하되 그 추이를 따름
● 인과관계 : 실질적으로 하나의 요인으로 인해 다른 요인의 수치가 변하는 형태를 의미, 원인과 결과가 명확한 것
파이썬 기초를 다시 학습하는 시간을 가졌다. 배웠던 내용이라 다 아는 내용일거라고 생각했지만, pop, popitem, 슬라이싱 등 모르는 개념을 추가로 학습할 수 있었다.
'내일배움 본캠프' 카테고리의 다른 글
| [내일배움 본캠프]Python에서 함수란? (0) | 2026.05.21 |
|---|---|
| [내일배움 본캠프] 조건문과 반복문(if, For, While) (0) | 2026.05.20 |
| [내일배움 본캠프]좋은 가설 세우기와 코호트 분석 (0) | 2026.05.18 |
| [내일배움 본캠프]시각화된 그래프 꾸미기? (0) | 2026.05.15 |
| [내일배움 본캠프]'아티클 스터디'와 '커리어 스터디' 진행 (1) | 2026.05.14 |