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

TIL_251021

usungusung 2025. 10. 21. 21:52

Today I learned



1. 베이직 파이썬 핵심 쏙쏙

1) 판다스 라이브러리

- 데이터 분석을 위한 핵심 python 라이브러리

Series: 1차원 데이터 구조,

DataFrame: 2차원 데이터 구조

데이터 조작 기능: 데이터 필터링/그룹화/병합 및 조인/피벗 테이블

결측치 처리: NaN 처리 기능이 내장, 결측값 확인 및 대체

시계열 분석: 날짜와 시간을 푸함한 데이터 분석에 필요한 도구를 제공

데이터 정렬 및 집계

 

ex) 시리즈 알아보기

#시리즈 생성 및 호출
import pandas as pd

#기본 시리즈 생성
obj = pd.Series([4,7,-5,3])
 
# index 변경
obj2 = pd.Series([4,7,-5,3], index=['d','b','a','c'])
 
obj2.index
Index(['d', 'b', 'a', 'c'], dtype='object')
 
obj2.values
array([ 4, 7, -5, 3])
 
statedata = {'Ohio' : 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(statedata)
 
obj4 = pd.DataFrame(statedata)
# 칼럼이 없어서 오류가 난다

 

Datafrmae iloc[]: 정수형 인덱스로 접근

loc[]: 인덱스 이름으로 접근

isin(): 특정 값이 포함되어있는지 여부 확인

df.drop(axis=1): 컬럼 삭제

df.drop(axis=0): 행 삭제

df.rename(columns['A','B']): A를 B로 변경

df.T: 행 전체

 

ex) 데이터프레임 알아보기

population = [35000,71000,16000,5000]
state = ['Ohio','Texas','Oregon','Utah']

frame = pd.DataFrame({'Population':population, 'State':state}, index = ['A','B','C','D'])
frame
  Population State
A 35000 Ohio
B 71000 Texas
C 16000 Oregon
D 5000 Utah
#iloc, loc을 통해 두번쨰 행의 정수 인덱스 1을 출력
print(frame.iloc[1])
Population 71000 State Texas Name: 2, dtype: object
 
frame['State'].isin(['Ohio','Texas'])
A True B True C False D False Name: State, dtype: bool
 
#컬럼 지우기
frame = frame.drop(columns ='debt' )
 
# 특정 열 지우기
frame.drop(index = 'B', inplace = True) # 없앨거면 inplace = True로
frame
 
#칼럼 이름 변경
frame.rename(columns = {'Population': 'population'}, inplace = True)
frame
 
#칼럼-열 뒤집기
transposed_frame = frame.T
transposed_frame
 
#리스트 컴프리헨션
#리스트 컴프리헨션은 거구로 읽어야한다
frame['Debt_level'] = ['Low' if debt < 1.5 else 'High' for debt in frame['debt']]
frame
 
# apply
frame['Debt_level1'] = frame['debt'].apply(lambda debt: 'Low' if debt < 1.5 else 'High' )
frame

 

- EDA 실습

 

 

2. [기초통계] 기술통계 1회차

1) 통계의 필요성

  • 통계는 ‘감’이 아닌 객관적 근거를 제시함.
  • 복잡한 데이터를 수치화하여 핵심 정보와 원인을 파악.

예시:

  • “B라인 불량이 많다”는 감 → 실제 분석 결과, 시간대별 장비 문제가 원인.
  • 데이터 기반 판단은 근거 있는 품질 개선으로 이어짐.

2) 데이터의 종류

구분하위 유형예시
수치형 연속형(온도), 이산형(불량 개수) 숫자로 표현
범주형 순서형(학점), 명목형(성별) 구분 기준만 있음

3)  도수분포표 & 히스토그램

  • 도수: 각 구간의 값 개수
  • 상대도수: 비율(총합=1)
  • 누적도수: 누적된 개수
  • 작성 절차:
    ① 자료 수 파악 → ② 최대/최소값 → ③ 구간 수(5~15개) →
    ④ 구간 폭 계산 → ⑤ 도수 계산 및 시각화
  • 시각화: plt.hist(data, bins=10, edgecolor='black')
    import pandas as pd
    import matplotlib.pyplot as plt

    data = [
        151, 154, 160, 160, 163, 156, 158, 156, 154, 160,
        154, 162, 156, 162, 157, 162, 162, 169, 150, 162,
        154, 152, 161, 160, 160, 153, 155, 163, 160, 159,
        164, 158, 150, 155, 157, 161, 168, 162, 153, 154,
        158, 151, 155, 155, 165, 165, 154, 148, 169, 158,
        146, 166, 161, 143, 156, 156, 149, 162, 159, 164,
        162, 167, 159, 153, 146, 156, 160, 151, 151, 157,
        151, 156, 166, 159, 157, 156, 159, 156, 156, 161
    ]

    # pandas Series로 변환
    s = pd.Series(data)

    # 히스토그램 그리기
    plt.figure(figsize=(8, 5))
    plt.hist(s, bins=10, edgecolor='black')  


    plt.title('Height Distribution Histogram')
    plt.xlabel('Height (cm)')
    plt.ylabel('Frequency')
    plt.grid(True)
    plt.show()


4) 대표값

지표정의특징

 

평균(Mean) 총합 ÷ 개수 이상치에 민감
중앙값(Median) 중간 위치값 이상치에 둔감
최빈값(Mode) 가장 자주 등장 범주형 데이터에 적합

 예시: 마이클 조던의 초고연봉이 평균값을 왜곡한 사례(평균의 함정).

import pandas as pd


df= pd.DataFrame({"test": [0,1,2,3,4,5,5,5,6,7,8]})
df["test"].mean()

df["test"].median()

df["test"].mode()

5) 산포도

개념의미계산
편차 각 값이 평균에서 얼마나 떨어졌는가 x - x̄
분산(σ²) 편차²의 평균 (퍼짐 정도) np.var()
표준편차(σ) 분산의 제곱근 (변동성) np.std()
변동계수(CV) 표준편차 ÷ 평균 (단위 비교용) σ / x̄
import numpy as np

# 데이터 값
data = np.array([5, 10, 15, 20, 30, 40])

# 1. 평균 계산
mean_value = np.mean(data)

# 2. 편차 (Deviation)
deviations = data - mean_value

# 3. 분산 (Variance) - 모분산 사용 (n 대신 n-1 사용 시 np.var(data, ddof=1))
variance = np.mean(deviations ** 2)

# 4. 표준편차 (Standard Deviation)
std_dev = np.sqrt(variance)

# 5. 변동 계수 (Coefficient of Variation, CV)
cv = std_dev / mean_value

# 결과 출력
print(f"데이터: {data}")
print(f"평균: {mean_value:.2f}") # 20.00
print(f"편차(Deviation): {deviations}") # [-15. -10.  -5.   0.  10.  20.]
print(f"분산(Variance): {variance:.2f}") # 141.67
print(f"표준편차(Standard Deviation): {std_dev:.2f}") # 11.90
print(f"변동 계수(Coefficient of Variation, CV): {cv:.2f}") # 0.60

 

IQR(사분위 범위) = Q3 - Q1 → 이상치 탐지에 활용

import numpy as np

# 데이터 리스트
data = np.array([11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 220, 330])

# 분위수 계산
Q1 = np.percentile(data, 25)  # 제1분위수 (Q1)
Q2 = np.percentile(data, 50)  # 제2분위수 (Q2, 중앙값)
Q3 = np.percentile(data, 75)  # 제3분위수 (Q3)

# 사분위 범위 (IQR) 계산
IQR = Q3 - Q1

# 결과 출력
print(f"데이터: {data}") # [ 11  22  33  44  55  66  77  88  99 110 220 330]
print(f"제1분위수 (Q1): {Q1}") # 41.25
print(f"제2분위수 (Q2, 중앙값): {Q2}") #  71.5
print(f"제3분위수 (Q3): {Q3}") # 101.75
print(f"사분위수 범위 (IQR): {IQR}") # 60.5

# 이상치 탐지
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = data[(data < lower_bound) | (data > upper_bound)]
print(f"이상치(Outliers): {outliers}") # [220 330]

6) 왜도(Skewness) & 첨도(Kurtosis)

지표의미해석
왜도 분포의 좌우 비대칭성 +면 오른쪽 꼬리, −면 왼쪽 꼬리
첨도 분포의 뾰족한 정도 +면 뾰족, −면 평평

표준정규분포: 왜도 0, 첨도 3

scipy.stats.skew(data), kurtosis(data)

 sns.kdeplot()으로 정규분포 형태 확인 가능

import numpy as np
from scipy.stats import skew, kurtosis

# 데이터 리스트
data = np.array([11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 220, 330])

# 왜도 계산
skewness = skew(data)

# 첨도 계산
kurt = kurtosis(data)

print(f"왜도 (Skewness): {skewness:.4f}")
print(f"첨도 (Kurtosis): {kurt:.4f}")

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

TIL_251023  (0) 2025.10.23
TIL_251022  (0) 2025.10.22
TIL_251020  (0) 2025.10.20
TIL_251017  (0) 2025.10.17
TIL_251015  (0) 2025.10.15