[250319수86H] seaborn 심화 + 확률과 통계 이론

윤승호·2025년 3월 19일

장담컨대 인간의 적응력은 상상을 초월한다. 오늘은 어제와 비슷한 내용을 했다. 어제는 고개를 절레절레하며 대부분 포기했는데, 한숨 자고 일어났더니 갑자기 눈에 보이기 시작한다. 강사님이 중간마다 내주는 문제도 꽤 풀었다. 신기하다! 이게 복습의 힘인가! 매일 블로그를 작성하며 거의 5시간씩 복습한 덕분인 것 같다. 복습만 해도 시간이 부족해서 따로 문제는 못 풀지만 그럼에도 계속 성장하는 것 같다. 엑셀 다루는 라이브러리도 잠깐 했는데 거기까지 집중력이 따라주지 못했다. 확률과 통계 배우는데 죽는 줄 알았다. 시그마는 태어나서 처음 들어봄. 이 또한 시간이 해결해 주겠지. 부탁한다 내일의 나!!

여러 라이브러리를 동시에 하다 보니 뭐가 어느 라이브러리의 명령어인지 헷갈려서 어렵다. 이번 주말엔 하나씩 뜯어서 파악해 보는 시간을 가져야겠다.

학습시간 09:00~01:00(당일16H/누적86H)

학습내용

1. 개념정리

뭐가 pandas고 뭐가 matplolib인지 잘 모르겠음 ㅠㅠ 일단 저장

(1) 데이터 처리 관련

''' 데이터 처리 '''
df = pd.read_csv('folder/file.csv') # 데이터 로드
df.describe(include='all') # 통계표(문자열 포함)
df.info() # 데이터 타입, 결측치 목록
df.set_index('name', inplace=True) # name 인덱스 설정
df.dtypes # 데이터 타입 확인
df['age'].unique() # 유니크한 값들을 보여줌
df['age'].value_counts() # 값의 개수를 보여줌
df['age'].value_counts(dropna=False) # 결측치도 포함
df['age'].value_counts(normalize=True) # 비율 확인

# income 열 생성, (salary열-tax열)값 적용
df['income'] = df['salary'] - df['tax']

(2) 그래프 관련

확실하진 않으나 pandas인 것 같음

''' 막대 그래프 '''
f, ax = plt.subplots(1, 1, figsize=(15, 5)) # 플롯 생성 후 15, 8 사이즈 설정

df['name'].value_counts().plot.bar(ax=ax) # 열값 계산 후 막대 그래프 생성
''' 히스토그램 '''
# name열값이 KIM인 age열 출력, 히스토그램(15줄) 생성
df[df['name'] == 'KIM']['age'].plot(kind='hist', bins=15)

df['name'].plot(kind='hist', bins=100) # 히스토그램 100줄 생성
df['age'].var() # age열 분산값 출력
df['age'].std() # age열 표준편차값 출력
df['age_cumsum'] = df['age'].cumsum() # age_cumsum열 생성, age열 누적 합
df['age_cumprod'] = df['age'].cumprod() # age_cumprod열 생성, age열 누적 곱
df.plot(x='age', y='salary') # x축 age, y축 salary 그래프 생성
''' 박스플롯 '''
df['name'].plot(kind='box') # 그래프 생성
q1 = df['name'].quantile(0.25) # 1사분위수
q3 = df['name'].quantile(0.75) # 3사분위수
iqr = q3 - q1 # 사분위수 범위
q1 - 1.5 * iqr # 밑변 수치
q3 + 1.5 * iqr # 윗변 수치

2. seaborn

(1) 데이터 로드

어느 라이브러리를 사용하든 데이터 호출 명령어는 같은 것 같다. 아래 순서로 진행하면 상관관계까지 확인할 수 있다.

''' 데이터 로드 '''
import seaborn as sns
df = pd.read_csv('folder/file.csv')

(2) 테마 설정

그래프 크기, 스타일, 폰트 크기, 그래프 색상 등을 설정한다.

''' plot 테마 설정 '''
sns.set_theme(rc={'figure.figsize':(15, 8)}
, style='ticks') # 그래프 스타일
, font='Malgun Gothic') # 한국어 폰트 추가
, font_scale=2) # 폰트 크기
, palette='pastel') # 파스텔 톤

''' style 종류'''
ticks: 흰색 배경 / 축에 눈금
white: 흰색 배경 / 격자 O
whitegrid: 흰색 배경 / 격자 X
dark: 회색 배경 / 격자 O
darkgrid: 회색 배경 / 격자 O

(3) plot 종류 설정

플롯 종류를 설정하고 명령어를 입력하면 된다. 아래 Xplot에 원하는 플롯 종류를 넣으면 된다.

''' plot 종류 설정 '''
sns.Xplot(data=df, x='A', y='B')

histplot: 연속형 데이터의 빈도 시각화
boxplot: Q1, Q3, 중앙값, 이상치 표시
barplot: 범주형 데이터(y축 평균값)
countplot: 범주형 데이터(y축 개수값)
lineplot: 연속형 데이터 변화
scatterplot: 연속형 변수 간의 관계 산점도
regplot: 회귀선이 포함된 산점도
violinplot: 바이올린 모양
heatmap: 상관관계 시각화
swarmplot: 세로 점 그래프(정돈)
stripplot: 세로 점 그래프
kdeplot: 확률 밀도 함수(PDF) 시각화

(4) plot 명령어 설정

명령어는 다양하게 있는데 상황에 따라 필요한 것만 이용하면 된다.

''' plot 명령어 설정 '''
sns.Xplot(data=df, x='A', y='V'

, hue='C') # C열 서브 그래프 추가
, errorbar=None) # 에러바 삭제
, bins=100) # 100개로 구분
, multiple='stack' # 데이터 스택
, order=['A', 'B', 'C'] # x축 순서 변경
, palette='Set2') # 색상 변경
, dodge=True) # 막대 그룹 분리
, log_scale=True) # 로그스케일 적용
, linewidth=2, alpha=0.7) # 선굵기, 투명도 조절
, aspect=2) # 가로세로 비율 조정
, bw_method=0.1) # 숫자 낮을수록 구불구불

''' 조건식 '''
# A열의 Q1값만 가져올 수 있다.
sns.Xplot(data=df[df['A'] == 'Q1'] 

3. 숫자 상관관계 보는 법

아직 이부분은 어려워서 잘 모르겠다.

''' 1. 데이터 확인 '''
# corr() 함수는 -1 ~ 1 사이의 상관계수를 반환
df.corr(numeric_only=True)

''' 2. 목록으로 정렬'''
df.corr(numeric_only=True)['total'].sort_values(ascending=False)

''' 3. 히트맵 시각화 '''
# numeric_only=True 숫자형 데이터만 선택
sns.heatmap(df.corr(numeric_only=True), annot=True, cmap='coolwarm', fmt=".2f")

4. 확률과 통계 이론

(1) 기술통계

A. 평균?

  • mean(평균): 개수로 나눈 값, 이상치의 영향을 많이 받음
  • median(중앙값): 가장 중앙에 있는 값, 이상치의 영향을 적게 받음
  • mode(최빈값): 가장 자주 등장하는 값, 범주형 데이터에서 유용

B. 표준편차 & 분산?

  • std(표준편차): 평균에서 멀리 떨어진 값의 정도
  • var(분산): 표준편차(평균-값)의 제곱 후 평균
  • 데이터가 평균으로부터 얼마나 떨어져 있는지 측정
  • 분산&표준편차가 작으면 그래프가 뾰족해짐
  • 분산&표준편차가 크면 그래프가 넓어짐

C. 시각화 도구?

  • 박스플롯(boxplot): 중앙값, 사분위수, 이상점 시각화
  • 히스토그램(histogram): 구간(bin)별 막대 그래프
  • 산포도(scatter plot): 두 변수 간의 관계 시각화

D. 데이터 종류?

  • 수치형 데이터(numerical data): 1, 2, 3, 4, 5
  • 범주형 데이터(categorical data): red, blue, green
  • 연속형 데이터: 나이, 키, 몸무게
  • 이산형 데이터: 나이, 성별, 지역

E. 확률 밀도 함수(PDF)와 KDE plot?

  • 확률 밀도 함수(PDF): 데이터가 흩어져 있는 정도를 나타낸 그래프
    • PDF는 확률을 나타내므로 음수 값을 가질 수 없음
    • 데이터의 범위가 0~1 사이의 값을 가짐
    • 확률 계산 및 이론적 분석
    • 정규분포, t-분포 등 이론적 모델링에 적용
  • KDE plot: 데이터가 흩어져 있는 정도를 시각화
    • Kernel Density Estimation(커널 밀도 추정)
    • PDF를 근사적으로 추정한 그래프
    • 히스토그램보다 더 부드러운 그래프
    • 데이터가 적으면 신뢰도가 떨어짐
    • 각 점 주변에 작은 커널(곡선)을 생성
    • 커널의 평균을 취해 부드러운 곡선 생성
    • 실제 데이터 기반으로 추정한 분포
    • 히스토그램 대체, 실험 데이터 분석

F. 산포도?

  • 데이터가 평균으로부터 얼마나 떨어져 있는지 측정
    • 범위(range): 데이터의 최대값과 최소값의 차이
    • 분산(variance): 데이터가 평균으로부터 얼마나 떨어져 있는지 측정
    • 사분위수(quartile): 데이터를 4등분한 값

(2) 추론통계

A. 추론통계란?

  • 데이터(샘플, 일부)을 이용해 모집단(population, 전체) 특성(모수)를 추론
  • 기술통계는 데이터 요약, 추론통계는 패턴 추론
  • 정규분포: 데이터가 평균값을 중심으로 대칭적으로 퍼져 있는 종 모양의 분포

B. 데이터 분포 모양

  • 왜도(skewness): 데이터가 중앙값을 중심으로 왼쪽 또는 오른쪽으로 치우친 정도
    • skewness = 0: 대칭
    • skewness > 0: 오른쪽 꼬리 생김(왼쪽에 데이터가 몰려 있음)
    • skewness < 0: 왼쪽 꼬리 생김(오른쪽에 데이터가 몰려 있음)
  • 첨도(kurtosis): 데이터가 정규분포에 비해 뾰족한 정도
    • kurtosis = 0: 정규분포
    • kurtosis > 0: 뾰족한 분포
    • kurtosis < 0: 평평한 분포
  • 정규분포는 왜도와 첨도가 0에 가까움
  • 왜도나 첨도가 크면 정규성을 가정한 분석에 부적합
  • 왜도 교정: 로그 변환, 제곱근 변환, 역수 변환 등
  • 첨도 교정: 제곱근 변환, 역수 변환 등

(3) 기대값과 평균의 차이

  • 기대값(Expected Value, E(X)): 기대값은 확률분포를 기반으로 한 이론적 개념
    • 확률변수의 모든 가능한 값과 그 확률을 곱한 총합
    • 이론적인 평균값으로 확률분포에서 사용
    • 수식: E(X) = Σ x_i * P(X = x_i)
    • 예: 주사위의 기대값 = (11/6 + 21/6 + 31/6 + 41/6 + 51/6 + 61/6) = 3.5
  • 평균(Mean, μ)
    • 실제 관측된 데이터의 산술평균: 평균은 실제 데이터를 기반으로 한 실용적 개념
    • 표본에서 모든 값을 더해 개수로 나눈 값
    • 수식: μ = (x₁ + x₂ + ... + xₙ)/n
    • 예: 주사위 10번 던진 결과 [2,4,1,6,3,5,2,4,3,1]의 평균 = (2+4+1+6+3+5+2+4+3+1)/10 = 3.1
profile
나는 AI 엔지니어가 된다.

0개의 댓글