[SK쉴더스 루키즈 24기] 기초 통계(1) 기초 통계학 및 데이터 통합과 시각화

아굥·2024년 12월 21일
1

SK Shieldus Rookies

목록 보기
5/32

기초 통계학 개념 소개

1. 데이터의 중심 경향

데이터를 대표하는 값을 나타내는 척도

1) 평균

  • 데이터를 모두 더한 뒤 데이터의 개수로 나눈 값 -> 데이터 총합 / 데이터 개수
  • 모든 데이터를 고려하므로 데이터가 균일할 때 유용함
    ㄴ> 극단값(이상치)가 포함되면 영향을 크게 받음

2) 중앙값

  • 데이터를 크기 순으로 정렬했을 때 가운데 위치한 값
    ㄴ> 데이터 개수가 홀수라면 가운데 값, 짝수라면 가운데 두 값을 평균 낸 것이 중앙값
  • 데이터가 극단값의 영향을 받을 때 평균보다 대표성을 가짐

3) 최빈값

  • 데이터에서 가장 자주 나타나는 값
    ㄴ> 데이터에서 각 값의 빈도를 계산하고 가장 빈도가 높은 것
  • 범주형 데이터나 특정 값의 빈도가 중요한 경우 유용
  • 하나 이상의 최빈값이 있을 수 있음

2. 데이터 분산성

데이터가 평균을 기준으로 얼마나 퍼져있는지

1) 분산

  • 데이터가 평균을 기준으로 얼마나 퍼져 있는지 측정하는 값
    ㄴ> 값이 클수록 데이터가 더 퍼져 있다는 것

계산방법

  • 각 데이터 값에서 평균을 뺌 (=편차)
  • 편차를 제곱함 (음수를 없애기 위해)
  • 제곱된 편차의 평균을 계산함

2) 표준편차

  • 데이터의 퍼짐 정도를 원래 데이터와 동일한 단위로 나타냄
    ㄴ> 분산의 제곱근
  • 값이 작으면 데이터가 평균에 가까이 모여있고, 값이 크면 데이터가 퍼져 있음을 의미

3) 사분위수

  • 데이터를 네 구간으로 나누는 값
    ㄴ> 데이터 분포의 경계값 및 중간 50% 범위 측정
  • 이상치를 파악하는데 유용함

계산방법

  • 데이터를 오름차순으로 정렬
  • Q1, Q2, Q3 계산
    Q1(1사분위수): 하위 25% 데이터 경계값
    Q2(2사분위수, 중앙값): 하위 50% 데이터 경계값
    Q3(3사분위수): 하위 75% 데이터 경계값
    IQR(사분범위): Q3-Q1, 중간 50% 데이터의 범위

3. 데이터 분포

데이터가 공간적으로 어떻게 퍼져있는지

1) 정규 분포

  • 데이터가 평균을 중심으로 대칭적으로 분포된 종 모양의 분포
    ㄴ> 대부분이 평균 근처에 몰려 있고, 평균에서 멀어질수록 빈도가 줄어듬
  • 평균, 중앙값, 최빈값이 동일함
  • 데이터의 68%는 평균 ±1 표준편차 내, 95%는 평균 ±2 표준편차 내에 있음

2) 왜도

  • 데이터의 비대칭성을 측정하는 값
    ㄴ> 분포가 한 쪽으로 치우쳐 있으면 왜도가 발생
  • 왜도 > 0 (양의 왜도): 평균 > 중앙값 > 최빈값
    왜도 < 0 (음의 왜도): 평균 < 중앙값 < 최빈값
    왜도 =: 데이터가 대칭 (정규분포)

3) 첨도

  • 분포의 꼭대기가 얼마나 뾰족하거나 평평한 지 측정하는 값
  • 첨도 > 3: 꼭대기가 뾰족하고 두꺼움
    첨도 = 3: 정규분포와 비슷한 모양
    첨도 < 3: 꼭대기가 평평하고 얇음

데이터 통합 및 시각화

1. 데이터 통합 및 조인

1) merge

  • 기준 열을 기반으로 데이터 합치기
    ㄴ> 두 데이터프레임의 공통 열(key)를 기준으로 데이터 합침

방식

  • Inner Join (교집합): 두 데이터프레임의 공통된 값만 유지
  • Outer Join (합집합): 공통된 값이 없어도 데이터 유지 (NaN으로 채움)
  • Left Join: 왼쪽 데이터프레임의 값을 모두 유지
  • Right Join: 오른쪽 데이터프레임의 값을 모두 유지
import pandas as pd

customers = pd.DataFrame({
	'customer_id': [1, 2, 3]
    'name': ['Alice', 'Bob', 'Charlie']
})

orders = pd.DataFrame({
	'order_id': [101, 102, 103],
    'customer_id': [1, 2, 4],
    'product': ['Laptop', 'Tablet', 'Smartphone']
})

# Inner Join: 공통된 customer_id로만 합침
result_inner = pd.merge(customers, orders, on='customer_id', how='inner')

# Left Join: customers의 모든 데이터 값 유지
result_left = pd.merge(customers, orders, on='customer_id', how='left')

2) concat

  • 데이터를 방향(축)으로 단순히 이어 붙임
    ㄴ> 기준 열 없이 데이터 추가하고 싶은 경우 유용

방식

  • Row-wise Concatenation (위 -> 아래): axis=0
  • Column-wise Concatenation (왼쪽 -> 오른쪽): axis=1
import pandas as pd

sales_jan = pd.DataFrame({
	'month': ['January', 'January', 'January']
    'product': ['Laptop', 'Tablet', 'Smartphone'],
	'sales': [100, 150, 200]
})

sales_feb = pd.DataFrame({
	'month': ['February', 'February', 'February']
    'product': ['Laptop', 'Tablet', 'Smartphone'],
	'sales': [120, 160, 220]
})

sales_combined = pd.concat([sales_jan, sales_feb], axis=0)

2. 데이터 분포 확인

1) 히스토그램(Histogram)

  • 연속형 데이터를 구간으로 나누고 각 구간에 해당하는 데이터의 빈도를 보여줌
    ㄴ> 데이터의 분포 확인, 대략적인 형태(정규분포, 치우침 등) 파악, 이상치 탐지에 사용
  • 단일 데이터셋 시각화에 적합
import seaborn as sns
import matplotlib.pyplot as plt

scores = [56, 67, 45, 89, 90, 77, 68, 88, 92, 76, 58, 70, 73, 85, 62]

sns.histplot(scores, bins=5, kde=True, color='blue', edgecolor='black')
plt.title('학생 점수 분포')
plt.xlabel('점수 구간')
plt.ylabel('학생 수')
plt.show()
  • kde: 밀도 곡선 추가 여부
  • bins: 구분할 공간 개수

2) 박스플롯(Boxplot)

  • 데이터의 중앙값, 사분위수, 이상치를 시각화 / 데이터 분포를 요약하고 이상치를 쉽게 탐지할 수 있는 도구
    ㄴ> 데이터 중앙값과 변동성 확인, 이상치 탐지, 데이터 간 비교에 사용
  • 여러 데이터셋 간 비교에 적합함

주요 구성요소

  • 중앙값: 데이터의 중간값 (박스 중간선)
  • 1사분위수(Q1): 하위 25% 데이터 값
  • 3사분위수(Q3): 상위 25% 데이터 값
  • IQR: Q3 - Q1 (데이터 변동성 측정)
  • 이상치: Q1 - 1.5 x IQR 이하, Q3 + 1.5 x IQR
import matplotlib.pyplot as plt

department = ['HR', 'IT', 'Finance']
salaries = [
	[3000, 3200, 3100, 2800, 2700],
    [4500, 4600, 4700, 4400, 4800],
    [5200, 5300, 5000, 4900, 5400]
]

plt.boxplot(salaries, labels=department)
plt.title('부서별 월급 분포')
plt.ylabel('월급')
plt.show()

3. 데이터 탐색적 분석(EDA)를 위한 시각화 기법

EDA는 데이터를 시각적으로 분석하여 패턴, 관계, 이상치, 분포 등을 탐구하는 과정

1) 산점도(Scatter Plot)

  • 데이터 간 관계를 확인
    ㄴ> 변수 A, B가 양의 상관관계인가, 음의 상관관계인가, 아예 상관이 없는지 확인
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
	'Ad_Spend': [100, 200, 300, 400, 500],
    'Sales': [10, 15, 20, 25, 30]
})

sns.scatterplot(x='Ad_Spend', y='Sales', data=data)
plt.title('광고비와 판매량 간의 관계)
plt.ylabel('광고비 (단위: $)')
plt.ylabel('판매량 (단위: 개)')
plt.show()

2) 히트맵(Heatmap)

  • 변수 간 상관관계 분석
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
	'Math': [90, 80, 70, 60, 85],
    'English': [85, 75, 65, 55, 10],
    'Science': [88, 78, 68, 58, 23]
})

correlation = data.corr()					# 상관계수 계산

sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title('과목 간 상관관계 히트맵')
plt.show()

3) 페어플롯(Pair Plot)

  • 변수 간 관계를 한눈에 확인
    ㄴ> 데이터셋의 모든 수치형 변수 간 관계를 시각화함
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
	'Area': [50, 60, 70, 80, 90],
    'Rooms': [1, 2, 3, 4, 5],
    'Price': [200, 250, 300, 350, 400]
})


sns.pairplot(data)
plt.title('주택 데이터 변수 간 관계', y=1.02)
plt.show()

4) 카운트 플롯(Count Plot)

  • 범주형 데이터 시각화
    ㄴ> 빈도를 확인할 수 있음
profile
열심히 살아보아요

0개의 댓글