빅데이터 QAQC_3기/빅데이터 QAQC_3기 TIL

TIL_250925

usungusung 2025. 9. 25. 22:29

Today I learned

 

1. QAQC 문제풀이 가이드

1) 점수 등급 판별기

score = int(input()) # input을 넣어야 외부에서 특정 값을 입력할 수 있음
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("F")

 

2) 1부터 100까지 모든 정수의 합

total = 0 # total 변수를 0으로 지정하고 시작
for i in range(1,101): #i가 1에서 100까지 반복할 떄
    total = total + i #total은 기존 total값 + 순회중인 i 값
print(total)

 

3) 구구단을 외자

x = int(input()) #특정 값이 입력될 떼
for i in range(1,10): #i 값이 1에서 9까지 반복될 떄
    print(x, "*", i, "=", x*i) #입력된 값을 x에, 순회중인 값을 i에 넣어서 출력

 

4) 원의 넓이 구하기

def calculate_circle_area(x): #함수를 쓰자
    print(3.14*(x**2)) #입력한 x값의 제곱에 3.14를 곱한 값을 프린트 하는 함수
calculate_circle_area(5)

 

5) 둘 중 누가 더 커?

def get_larger_number(x,y): #함수를 쓰자
    if x > y: # x가 y 보다 크면
        print(x) # x를 출력해줘
    elif y > x: # y가 x 보다 크면
        print(y) # y를 출력해조
       
get_larger_number(15,27)

 

6) 환율 계산

def convert_krw_to_usd(KRW):#함수 쓸거임
    total = 0 #total의 초기 값은 0에서 시작 -> 사실 구지 필요 없음
    total = round(KRW/1350,2) #입력된 KRW 값을 1350으로 나누고, round를 써서 소숫점 둘째까지 표시되게
    print(total) #프린트 하는 함수임

convert_krw_to_usd(1200000)

 

 

2. (라이브세션) Python 라이브러리 세션 1회차

1) 리스트 컴프리헨션

기존의 for 문을 한 줄로 줄여주는 문법임

코드가 짧고 직관적이기 때문에 데이터 변환과 필터링에 유용함

 

ex-1) 리스트 컴프리헨션을 사용하지 않았을 떄

scores = [68, 73, 88, 95, 61, 79, 84]

passed = []  # 빈 리스트 만들어두기
for s in scores:
    if s >= 70:       # 조건문으로 70점 이상만
        passed.append(s)  # 리스트에 추가

print("전체 점수: ", scores)
print("통과 점수: ", passed)

 

ex-2) 리스트 컴프리헨션 사용

scores = [68, 73, 88, 95, 61, 79, 84]
passed = [s for s in scores if s >= 70]

print("전체 점수: ", scores)
print("통과 점수: ", passed)

 

2) 리스트 슬라이싱

리스트의 특정 부분을 잘라내는 기능

문법: 리스트[start:end:step]

numbers = [5, 10, 15, 20, 25, 30, 35]


print(numbers[1:4]) # 1~3까지
print(numbers[:3]) # 2까지
print(numbers[3:]) # 3부터 끝가지
print(numbers[::2]) #첫번째 부터 두칸씩 띄어씀
print(numbers[::-1]) # 역순으로 한칸씩 띄어씀

 

3) lambda 함수

이름 없는 한줄짜리 함수

 

ex) 일반 함수와 lambda의 비교

#일반함수
def multiply(x,y):
    return x*y

#람다함수
multiply_lambda = lambda x,y: x*y

print(multiply(4,6))
print(multiply_lambda(4,6))

 

4) map

리스트의 각 원소에 함수를 적용해서 새로운 결과를 만들어주는 내장 함수

결과는 즉시 리스트가 아니라 'map object(이터레이터) 에서 list()로 변환해야 확인이 가능함

     ※이터레이터(iterator): 한번에 하나씩 값을 꺼낼 수 있는 객체, for 문으로 순회할 수 있는 객체

data = [3,7,12,18,25] # 리스트가 있음

squares = list(map(lambda x:x**2, data))
# 1. (lambda x : x**2) : lambda라는 익명 함수는 매개변수 x를 넣으면 x의 제곱을 반환하는 함수
 
# 2. map(): data의 각 원소 3,,7,12,18,25에 (lambda x : x**2) 값을 적용시켜 줌
          # 반환값은 이터레이터(map 객체) 라고 함
 
# 3. list(): map이 돌려준 이터레이터를 다시 리스트로 만들어 냄. 즉, list는 9,49,144,324,625가 들어있는 거임,
           # 즉, list 자체를 출력하나 square라는 변수를 출력하나 값은 같음

print(list(map(lambda x:x**2, data)))
squares

 

5) filter

function이 True인 원소만 남김, 역시 list()로 변환 필요

data = [1,2,3,4,5,6,7,8,9,10] #리스트가 있음
odds = list(filter(lambda x:x%2 == 1, data))
# 1. (lambda x: x % 2 == 1): lambda라는 익명 함수에 매개변수 x를 넣으면
                            # x가 홀수인 경우 True를, 짝수인 경우 False를 반환

# 2. filter() : data의 각 원소에 위 람다 함수를 적용하여 결과가 True인 원소만 통과시켜줌
                # 반환값(False)은 이터레이터(한개씩 꺼내짐)

# 3. list() : filter 이터레이터를 리스트로 만들어 내고, 결과를 odds에 저장됨
                #즉, odds는 홀수만 담긴 새 리스트가 됨

print('홀수만와라: ', odds)

 

 

6) 모듈 만들기

if __name__ == "__main__":

해당 구절을 추가해야 함. 파일을 독립적으로 실행했을 때만 실행하고, import 될 때는 건너뛰라는 의미

 

ex-1) 모듈 만들기

def plus(a, b): return a + b
def minus(a, b): return a - b
def times(a, b): return a * b
def divide(a, b):
    if b == 0:
        return "0으로 나눌 수 없음!"
    return a / b

def hello():
    print("mycalc 모듈입니다!")

if __name__ == "__main__":
    hello()
    print("테스트:", plus(2, 3))

 

ex-2) 모듈 불러오기

import mycalc

mycalc.hello()
print(mycalc.plus(12, 8))

from mycalc import plus, times
print(plus(5, 2))
print(times(7, 6))

 

7) QAQC 실습

3. (라이브세션) [데이터 전처리 & 시각화] Pandas 심화

1) 기초 통계 분석

describe(): 데이터의 분포와 핵심 경향을 파악할 수 있는 핵심 메소드

ex-1)

titanic.describe()
  PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.32920

※ age의 count가 다른 count 들과 같지 않은 것으로 보아 age에 결측치가 있음을 알 수 있음

 

ex-2) 더 상세한 백분위로 분석

#더 상세한 백분위수로 분석
detailed_stats = titanic.describe(percentiles = [.1, .25, .5, .75, .9, .95])
print(detailed_stats['Age'].round(2))

 

ex-3) 범주형 데이터 확인 방법

titanic.describe(include= 'all')

 

  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
count 891.000000 891.000000 891.000000 891 891 714.000000 891.000000 891.000000 891 891.000000 204 889
unique NaN NaN NaN 891 2 NaN NaN NaN 681 NaN 147 3
top NaN NaN NaN Dooley, Mr. Patrick male NaN NaN NaN 347082 NaN G6 S
freq NaN NaN NaN 1 577 NaN NaN NaN 7 NaN 4 644
mean 446.000000 0.383838 2.308642 NaN NaN 29.699118 0.523008 0.381594 NaN 32.204208 NaN NaN
std 257.353842 0.486592 0.836071 NaN NaN 14.526497 1.102743 0.806057 NaN 49.693429 NaN NaN
min 1.000000 0.000000 1.000000 NaN NaN 0.420000 0.000000 0.000000 NaN 0.000000 NaN NaN
25% 223.500000 0.000000 2.000000 NaN NaN 20.125000 0.000000 0.000000 NaN 7.910400 NaN NaN
50% 446.000000 0.000000 3.000000 NaN NaN 28.000000 0.000000 0.000000 NaN 14.454200 NaN NaN
75% 668.500000 1.000000 3.000000 NaN NaN 38.000000 1.000000 0.000000 NaN 31.000000 NaN NaN
max 891.000000 1.000000 3.000000 NaN NaN 80.000000 8.000000 6.000000 NaN 512.329200 NaN NaN

※ unique: 고유한 값의 갯수, count: 결측치가 아닌 갯수, top: 가장 빈번한 값(최빈값), frequent: 얼마나 자주 나왔는가?(최빈값의 빈도)

 

ex-4) 범주형 데이터 분석

# 성별 분포 기본 분석
sex_counts = titanic['Sex'].value_counts() # 빈도 구하기 , 타이타닉 데이터의 성별 컬럼만 선택
sex_ratios = titanic['Sex'].value_counts(normalize=True) # normalize=True : 비율 구하기, 빈도가 아닌 %로 계산해줌

print("=== 성별 분포 ===")
print("빈도:")
print(sex_counts)
print("\n비율:")
print(sex_ratios.round(3))

 

ex-5) 왜도와 첨도 계산하기

 

skewness = age_data.skew()
kurtosis = age_data.kurtosis()

print(f"왜도(Skewness): {skewness:.3f}") # 소숫점 3자리에서 반올림
print(f"첨도(kurtosis): {kurtosis:.3f}")

 

중요) 상관관계 분석

상관관계: 두 변수가 함께 변하는 정도를 나타냄, 인과관계를 의미하는 것이 아님.

 

#주요 숫자형 변수들의 상관관계
numeric_cols = ['Survived', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare']
correlation_matrix = titanic[numeric_cols].corr()

correlation_matrix
  Survived Pclass Age SibSp Parch Fare
Survived 1.000000 -0.338481 -0.077221 -0.035322 0.081629 0.257307
Pclass -0.338481 1.000000 -0.369226 0.083081 0.018443 -0.549500
Age -0.077221 -0.369226 1.000000 -0.308247 -0.189119 0.096067
SibSp -0.035322 0.083081 -0.308247 1.000000 0.414838 0.159651
Parch 0.081629 0.018443 -0.189119 0.414838 1.000000 0.216225
Fare 0.257307 -0.549500 0.096067 0.159651 0.216225 1.000000

 ※ 0.7 이상: 매우 강한 상관관계, 0.3~0.7: 강한 상관관계, 0.1~0.3: 중간 상간관계, 0.1 미만: 약한ㅅ ㅏㅇ관관계

 

시각화하기

import seaborn as sns #시각화를 그리는 라이브러리
import matplotlib.pyplot as plt #얘도 시각화를 그림
#히트맵 시각화
plt.figure(figsize = (8,6))
sns.heatmap(correlation_matrix,
            annot=True,
            fmt=".2f",
            cmap="coolwarm",
            vmin=-1, vmax=1)

plt.title("Titanic Numeric Feature Correlation Heatmap")
plt.tight_layout()
plt.show()

무슨 일이 있어도 상관관계 매트릭스는 외워야 한다!!

 

3. 데이터 전처리 & 시각화 2주차

1) 데이터 전처리란

내가 원하는 데이터를 보기 위해 하는 모든 활동

 

Why??

A1. 데이터는 생각보다 지저분한 형태로 산포되어있음.....

A2. GIGO(Garbage In, Garbage Out)

 

How??

방향성을 가지고 접근하자!

데이터를 통해 무엇을 확인할 것인지,

어떤 의사결정을 위해 필요한지,

무엇을 얻고자 하는지

 

2) Excel과 비교한 pandas의 장점

- 자동화 프로그래밍 기능

- 대용량 데이터 처리에서 엑셀보다 빠른 처리 속도

- 복잡한 데이터 처리 및 분석이 가능

- 확장성과 유연성이 뛰어남

 

 

 

 

'빅데이터 QAQC_3기 > 빅데이터 QAQC_3기 TIL' 카테고리의 다른 글

TIL_250929  (0) 2025.09.29
TIL_250926  (0) 2025.09.26
TIL_250924  (0) 2025.09.24
TIL_250923  (0) 2025.09.23
TIL_250922  (2) 2025.09.22