LG DX DATA SCHOOL

12/23 객체 지향 복습 / 판다스 (Pandas)

getfeelingsfrom 2025. 12. 23. 17:39

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 (언패킹)

 
Student(*data) 는 아래와 동일:
Student(1, "홍길동", 72, 54, 35)
 

즉,

  • 튜플의 각 요소가
  • __init__(self, h, n, k, e, m)에
  • 순서대로 전달됨

📌 이 단계에서 Student 객체 3개 생성


3️⃣ students 리스트의 구조

students = [ Student 객체, Student 객체, Student 객체 ]
  • 리스트 안에는 Student 인스턴스만 존재
  • 각 객체는 자기 자신의 속성(hnum, name, kor, …)을 가짐

📌 시험 표현
→ “Student 인스턴스를 요소로 갖는 객체 리스트”


4️⃣ 객체 리스트 순회 + 메서드 호출

for s in students: s.display()

 

의미

  • s는 매 반복마다 Student 객체 1개
  • s.display() 실행 시:
    1. 객체 내부 데이터 출력
    2. self.calcTotal() 호출
    3. 총점 계산 후 출력

📌 핵심 개념
메서드는 객체를 통해 호출 (객체.메서드())

 


 

📦 파이썬 모듈(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)
    → 코드 가독성과 작성 속도를 위해 관례적으로 사용

즉,

pandas.read_excel() => pd.read_excel()

을 쓰는 것


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라는 변수에 저장
  • 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 부산
 
pd.read_excel(path, header=0)

→ 컬럼명: 지역, 인구수, 남자, 여자


header=None인 경우

df = pd.read_excel(path, header=None)
  • 컬럼명이 없다고 판단
  • 컬럼명이 자동으로 생성됨
0 1 2 3
 

📌 엑셀에 제목 행이 없는 데이터에서 사용


2. skiprows 옵션이란?

📌 의미

 
“읽을 때 위에서부터 몇 행을 건너뛸 것인가?”
df = pd.read_excel(path, skiprows=2)
  • 위에서부터 2행 무시
  • 3번째 행부터 읽기 시작

예시 (엑셀 구조)

행 번호내용
0 인구 통계 자료
1 2024년 기준
2 지역
3 서울
4 부산
 
pd.read_excel(path, skiprows=2, header=0)

✔ 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