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 pdimport 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 |