12/22 복습

1. 객체 추출
2. 객체 모델링 -> 역할 정의 -> 클래스 정의
3. 설계 완료
4. 구현

인스턴스 변수, 멤버변수 -> 생명주기에 따라서
언제 접근 가능? 생명주기에 영향
class Student:
def __init__(self, hnum, sname, kor, eng, math):
self.hnum = hnum
self.sname= sname
self.kor = kor
self.eng = eng
self.math =math
self.total=0
def calcTotal(self):
self.total = self.kor + self.eng + self.math
def display(self):
print(self.hnum, " ", self.sname,
", 국어:", self.kor,
", 영어:", self.eng,
", 수학:", self.math,
", 총점:", self.total)
def getKor(self):
return self.kor
def setKor(self, k):
if (k>0 and k<=100):
self.kor=k
def getEng(self):
return self.eng
def setEng(self, e):
if (e>0 and e<=100):
self.eng = e
def getMath(self):
return self.math
def setMath(self, m):
if (m>0 and m<=100):
self.math = m
students = []
students.append(Student(1, "홍길동", 25, 34, 56))
students.append(Student(2, "김길동", 56, 78, 34))
students.append(Student(3, "이길동", 78, 56, 78))
for s in students:
s.calcTotal()
s.display()
1. 전체 구조 요약
- Student 클래스
- 속성 : 학번, 이름, 국어/영어/수학 점수, 총점
- 메서드
- calcTotal() -> 총점 계산
- display() -> 학생 정보 출력
- getter/setter -> 점수 접근 및 유효성 검사
- Students 리스트
- 여러 Student객체를 한번에 관리하기 위해서
2. getter/ setter
객체의 속성(데이터)을 직접 건드리지 않고, 메서드를 통해서만 접근, 수정하도록 만드는 장치
| getter | 값을 가져오는 메서드 |
| setter | 값을 설정(변경)하는 메서드 |
객체 지향 패턴으로 ...
data_list = [
(1, "홍길동", 72, 54, 35),
(2, "김길동", 56, 78, 34),
(3, "이길동", 78, 56, 78)
]
students = [Student(*data) for data in data_list]
for s in students:
s.display()
1️⃣ data_list : 원시 데이터(튜플) 저장
data_list = [ (1, "홍길동", 72, 54, 35),
(2, "김길동", 56, 78, 34),
(3, "이길동", 78, 56, 78) ]
의미
- 각 튜플은 학생 1명의 정보
- 튜플 구조: (학번, 이름, 국어, 영어, 수학)
- 아직 객체 아님, 단순 데이터 묶음
📌 시험 표현
→ “Student 객체 생성을 위한 초기 데이터 집합”
2️⃣ 리스트 컴프리헨션으로 객체 생성
students = [Student(*data) for data in data_list]
🔹 for data in data_list
- data는 한 번에 튜플 1개
-
data = (1, "홍길동", 72, 54, 35)
🔹 *data (언패킹)
즉,
- 튜플의 각 요소가
- __init__(self, h, n, k, e, m)에
- 순서대로 전달됨
📌 이 단계에서 Student 객체 3개 생성
3️⃣ students 리스트의 구조
- 리스트 안에는 Student 인스턴스만 존재
- 각 객체는 자기 자신의 속성(hnum, name, kor, …)을 가짐
📌 시험 표현
→ “Student 인스턴스를 요소로 갖는 객체 리스트”
4️⃣ 객체 리스트 순회 + 메서드 호출
for s in students: s.display()
의미
- s는 매 반복마다 Student 객체 1개
- s.display() 실행 시:
- 객체 내부 데이터 출력
- self.calcTotal() 호출
- 총점 계산 후 출력
📌 핵심 개념
→ 메서드는 객체를 통해 호출 (객체.메서드())
📦 파이썬 모듈(Module) 정리
1. 모듈이란?
모듈(module) 이란
👉 함수, 변수, 클래스 등을 모아 놓은 파이썬 파일(.py) 이다.
- 파이썬 파일 하나 = 하나의 모듈
- 다른 파이썬 프로그램에서 불러와 재사용 가능
- 이미 만들어진 표준 모듈을 사용할 수도 있고, 직접 만들어 사용할 수도 있다
📌 즉,
모듈은 코드의 재사용성과 관리 효율을 높이기 위한 기본 단위이다.
2. 모듈 만들기
# mod1.py
def add(a, b):
return a + b
def sub(a, b):
return a - b
- .py 확장자를 가진 파일은 모두 모듈
- 별도의 문법 없이 그냥 파일을 만들면 모듈이 됨
3. 모듈 불러오기 (import)
(1) 기본 import 방식
import mod1 mod1.add(3, 4) mod1.sub(4, 2)
- import 모듈이름
- .py 확장자는 쓰지 않음
- 함수 사용 시 모듈명.함수명 형태
(2) 함수만 직접 import
from mod1 import add add(3, 4)
- 모듈명 없이 함수 바로 사용 가능
- 단, import한 함수만 사용 가능
(3) 여러 함수 import
from mod1 import add, sub
(4) 모든 함수 import
from mod1 import *
- 모듈 안의 모든 함수/변수 사용 가능
- 규모가 큰 프로젝트에서는 권장되지 않음
📊 pandas란 무엇인가?
pandas는
👉 파이썬에서 데이터 분석과 데이터 처리를 가장 많이 담당하는 핵심 라이브러리
특히 다음과 같은 작업에 강하다.
- 엑셀 / CSV 파일 읽기·쓰기
- 표 형태 데이터 처리
- 데이터 정렬, 필터링, 집계
- 결측치 처리
- 통계 분석의 기초 작업
📌 한 줄로 말하면
pandas는 “엑셀을 파이썬 코드로 다루게 해주는 도구”이다.
1. import pandas as pd 의미
import pandas as pd
- pandas 모듈을 불러옴
- pd는 별칭(alias)
→ 코드 가독성과 작성 속도를 위해 관례적으로 사용
즉,
을 쓰는 것
2. 엑셀 파일 경로 지정
path = "인구데이터.xlsx"
- 읽어올 엑셀 파일의 경로
- 현재 작업 디렉터리에 파일이 있어야 함
- 다른 폴더라면 전체 경로 필요
3. pd.read_excel() 설명
df = pd.read_excel(path, sheet_name="데이터")
(1) read_excel의 역할
- 엑셀 파일을 읽어서
- DataFrame(표 형태 자료구조) 로 변환
📌 DataFrame = pandas의 핵심 자료형
(행(row) + 열(column) 구조, 엑셀 시트와 거의 동일)
(2) sheet_name="데이터"
- 엑셀 파일 안에 있는 시트 이름 지정
- 해당 시트만 읽어옴
만약 시트를 지정하지 않으면:
pd.read_excel(path)
→ 첫 번째 시트를 자동으로 읽음
(3) 결과 저장: df
- 읽어온 데이터를 df라는 변수에 저장
- df는 DataFrame 객체
4. df.head(5) 설명
df.head(5)
- DataFrame의 앞에서부터 5행만 출력
- 데이터 구조를 빠르게 확인할 때 사용
📌 head()의 기본값은 5이므로 아래와 동일
df.head()
5. 전체 코드 흐름 정리
import pandas as pd # pandas 불러오기
path = "인구데이터.xlsx" # 엑셀 파일 경로
df = pd.read_excel(path, sheet_name="데이터") # 시트 읽기
df.head(5) # 상위 5행 확인
👉 엑셀 → DataFrame(객체) → 데이터 확인
이라는 pandas 분석의 기본 패턴
6. DataFrame을 쓰는 이유
DataFrame을 사용하면 다음이 가능해진다.
- 특정 열만 선택
- 조건에 맞는 행 필터링
- 평균, 합계, 최대값 계산
- 그래프 시각화
- 머신러닝 입력 데이터로 사용
즉,
pandas는 데이터 분석의 출발점이다.
7. 한 줄 요약
- pandas → 데이터 분석용 라이브러리
- DataFrame → 엑셀과 같은 표 구조
- read_excel → 엑셀 파일 읽기
- head() → 데이터 미리보기
📘 pd.read_excel()의 header와 skiprows
“어느 행이 컬럼 이름이고,
어느 행부터 실제 데이터인가?”
1. header 옵션이란?
📌 의미
df = pd.read_excel(path, header=0)
- header=0 → 첫 번째 행을 컬럼명으로 사용
- pandas의 기본값
📌 pandas는 0부터 행 번호를 셈
예시 (엑셀 구조)
| 0 | 지역 |
| 1 | 서울 |
| 2 | 부산 |
→ 컬럼명: 지역, 인구수, 남자, 여자
header=None인 경우
df = pd.read_excel(path, header=None)
- 컬럼명이 없다고 판단
- 컬럼명이 자동으로 생성됨
📌 엑셀에 제목 행이 없는 데이터에서 사용
2. skiprows 옵션이란?
📌 의미
df = pd.read_excel(path, skiprows=2)
- 위에서부터 2행 무시
- 3번째 행부터 읽기 시작
예시 (엑셀 구조)
| 0 | 인구 통계 자료 |
| 1 | 2024년 기준 |
| 2 | 지역 |
| 3 | 서울 |
| 4 | 부산 |
✔ 0,1행 무시
✔ 2행을 컬럼명으로 사용
✔ 3행부터 데이터
3. header + skiprows 함께 쓰는 이유
현실의 엑셀은 대부분 이런 형태입니다.
- 맨 위에 설명 문구
- 그 아래에 컬럼명
- 그 다음부터 데이터
이때 둘을 같이 사용합니다.
df = pd.read_excel(path, skiprows=2, header=0)
4. 행 번호 기준 다시 정리
| header | 컬럼 이름 행 번호 |
| skiprows | 무시할 행 개수 |
| 시작 인덱스 | 0부터 시작 |
6. 한 문장 요약
- header → 컬럼명이 어디 있냐
- skiprows → 위에서 몇 줄 버리냐
df.loc[행조건, 열조건]
target_df = df.loc[1:, "출생아수"]
print(target_df)
- 1: → 행 인덱스 1부터 끝까지
- "출생아수" → 특정 열 선택
- 결과 타입: Series
📌 결과적출생아수 열의 1번 행 이후 데이터를 의미
과제 !
최대 최소 지역을 찾아서 지도에 나타내보자
import folium
import pandas as pd
path = "birth_rate.xlsx"
df = pd.read_excel(path, sheet_name="데이터", skiprows=1)
df.columns = df.columns.str.strip()
# 한국 지도 만들기
korea_map = folium.Map(location=[36.5, 127.8], zoom_start=7)
# 전국 제외한 데이터
df_region = df[df["시군구별"] != "전국"].copy()
max_val = df_region["출생아수"].max()
min_val = df_region["출생아수"].min()
max_region = df_region.loc[df_region["출생아수"] == max_val, "시군구별"].values[0]
min_region = df_region.loc[df_region["출생아수"] == min_val, "시군구별"].values[0]
region_coords = {
"서울특별시": [37.5665, 126.9780],
"부산광역시": [35.1796, 129.0756],
"대구광역시": [35.8722, 128.6025],
"인천광역시": [37.4563, 126.7052],
"광주광역시": [35.1595, 126.8526],
"대전광역시": [36.3504, 127.3845],
"울산광역시": [35.5384, 129.3114],
"세종특별자치시": [36.4800, 127.2890],
"경기도": [37.4138, 127.5183],
"강원특별자치도": [37.8228, 128.1555],
"충청북도": [36.6357, 127.4914],
"충청남도": [36.5184, 126.8000],
"전라북도": [35.7175, 127.1530],
"전라남도": [34.8679, 126.9910],
"경상북도": [36.4919, 128.8889],
"경상남도": [35.4606, 128.2132],
"제주특별자치도": [33.4996, 126.5312]
}
folium.Marker(
location=region_coords[max_region],
popup=f"출생아수 최대<br>{max_region}: {max_val}",
icon=folium.Icon(color="red", icon="star")
).add_to(korea_map)
folium.Marker(
location=region_coords[min_region],
popup=f"출생아수 최소<br>{min_region}: {min_val}",
icon=folium.Icon(color="blue", icon="star")
).add_to(korea_map)
korea_map



'LG DX DATA SCHOOL' 카테고리의 다른 글
| 12/30 기술 통계학 + R (0) | 2025.12.30 |
|---|---|
| 12/29 통계 기반 데이터 분석 (넘파이/ 판다스) (0) | 2025.12.29 |
| 12/24 상속, 정규 표현식 (1) | 2025.12.24 |
| 12/22 객체 지향 (0) | 2025.12.22 |
| 12/19 (0) | 2025.12.19 |