[데이터분석] 부트캠프 TIL

20251208 TIL

myun0506 2025. 12. 8. 18:32

Today I Learn

: 통계학기초 강의 (챕터1 ~ 챕터2-4)

 

- 라이브러리 다운로드

이번에도 또 호환성 문제가 발생 -> 챗지피티 도움 받아서 python 파일 모두 확인하고 삭제 후 3.11.9 버전 재다운로드

기존에 문제였던 한글 경로는 이번에도 한글 없이 새로운 경로 생성

이번 주요 문제는 파일을 C:\python.exe 형식으로 설치할 수 없다는 것. 다른 파일 내에 파이썬 파일이 존재해야함

그리고 사용하는 파일은 기존 인터프리터(3.14)를 사용하는데 이 설치경로가 잘못되어있어서 계속 문제가 생겼던 것.

pip 설치가 3.14에만 되고 실제 사용 인터프리터엔 설치가 되지 않아 문제가 생김.

지금은 모든 파이썬 파일을 삭제해서 3.11을 잘 사용하고 있지만, 아직 3.14 microsoft window app이 하나 남아있음

삭제 방법 모르겠음

 

 

- 기술통계

주로 평균, 중앙값, 분산, 표준편차

분산 = 각 데이터 값에서 평균을 뺀 값을 제곱한 후, 이를 모두 더하고 데이터의 개수로 나누는 것

표준편차 = 분산의 제곱근

 

 

- 추론통계

주로 신뢰구간, 가설검정 등을 사용

즉, 데이터의 일부를 가지고 데이터 전체를 추정하는 것이 핵심

  • 신뢰구간(Confidence Interval) : 모집단의 평균이 특정 범위 내에 있을 것이라는 확률
  • 가설검정(Hypothesis Testing) : 모집단에 대한 가설을 검증하기 위해 사용
    • 귀무가설(H0) : 검증하고자 하는 가설이 틀렸음을 나타내는 기본 가설(변화가 없다, 효과가 없다 등)
    • 대립가설(H1) : 그 반대 가설로 주장하는 바를 나타냄(변화가 있다, 효과가 있다 등)

 

- 위치추정

데이터의 중심을 확인하는 방법

평균, 중앙값이 대표적인 위치 추정 방법

# 이 data는 아래에서도 계속 사용 됩니다
data = [85, 90, 78, 92, 88, 76, 95, 89, 84, 91]
mean = np.mean(data)
median = np.median(data)

print(f"평균: {mean}, 중앙값: {median}")

 

 

- 변이 추정

분산, 표준편차, 범위(range) 등

variance = np.var(data)
std_dev = np.std(data)
data_range = np.max(data) - np.min(data)

print(f"분산: {variance}, 표준편차: {std_dev}, 범위: {data_range}")

 

 

- 데이터 분포 탐색

히스토그램과 box plot은 데이터의 분포를 시각적으로 표현하는 대표적인 방법

plt.hist(data, bins=5)
plt.title('histogram')
plt.show()

plt.boxplot(data)
plt.title('boxplot')
plt.show()

 

 

- 이진 데이터와 범주 데이터 탐색

주로 최빈값을 사용

파이그림과 막대 그래프는 이진 데이터와 범주 데이터의 분포를 표현하는 대표적인 방법

satisfaction = ['satisfaction', 'satisfaction', 'dissatisfaction', 
'satisfaction', 'dissatisfaction', 'satisfaction', 'satisfaction', 
'dissatisfaction', 'satisfaction', 'dissatisfaction']
satisfaction_counts = pd.Series(satisfaction).value_counts()

satisfaction_counts.plot(kind='bar')
plt.title('satisfaction distribution')
plt.show()

 

 

- 상관관계

상관계수는 두 변수 간의 관계를 측정하는 방법

상관계수가 -1이나 1에 가까워지면 강력한 상관관계

-0.5나 0.5를 가지면 중간정도의 상관관계

0에 가까울 수록 상관관계 없음

study_hours = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
exam_scores = [95, 90, 85, 80, 75, 70, 65, 60, 55, 50]
correlation = np.corrcoef(study_hours, exam_scores)[0, 1]

print(f"공부 시간과 시험 점수 간의 상관계수: {correlation}")

plt.scatter(study_hours, exam_scores)
plt.show()

but, 인관관계는 상관관계와는 달리 원인과 결과가 분명해야함

 

 

- 두 개 이상의 변수 탐색

다변량 분석은 여러 변수 간의 관계를 분석하는 방법

data = {'TV': [230.1, 44.5, 17.2, 151.5, 180.8],
        'Radio': [37.8, 39.3, 45.9, 41.3, 10.8],
        'Newspaper': [69.2, 45.1, 69.3, 58.5, 58.4],
        'Sales': [22.1, 10.4, 9.3, 18.5, 12.9]}
df = pd.DataFrame(data)

sns.pairplot(df)
plt.show()

df.corr()

# heatmap까지 그린다면
sns.heatmap(df.corr())

 

 

- 모집단 생성과 표본 추출

# 모집단 생성 (예: 국가의 모든 성인의 키 데이터)
population = np.random.normal(170, 10, 1000) # 평균 170, 표준편차 10, 1000개의 데이터

# 표본 추출
sample = np.random.choice(population, 100) # 그 중 100개 추출

plt.hist(population, bins=50, alpha=0.5, label='population', color='blue')
plt.hist(sample, bins=50, alpha=0.5, label='sample', color='red')
plt.legend()
plt.title('population and sample distribution')
plt.show()

 

  • numpy.random: NumPy 라이브러리의 일부로, 다양한 확률 분포에 따라 난수를 생성하는 기능 제공
  • np.random.normal: 정규분포(가우시안 분포)를 따르는 난수를 생성
    • 코드 설명 
      • loc (float): 정규분포의 평균 (기본값: 0.0)
      • scale (float): 정규분포의 표준편차 (기본값: 1.0)
      • size (int / tuple of ints): 출력 배열의 크기 (기본값: None, 즉 스칼라 값 변환)
numpy.random.normal(loc=0.0, scale=1.0, size=None)
  • np.random.choice: 주어진 배열에서 무작위로 선택된 요소를 반환하는 기능 제공
    • a (1-D array-like or ints): 샘플링할 원본 배열, 정수인 경우 np.arange(a)와 동일하게 간주됨
    • size (int / tuple of ints): 출력 배열의 크기 (기본값: None, 즉 단일 값 반환)
    • replace (boolean): 복원 추출 여부 (True면 동일한 요소가 여러 번 선택될 수 있음, 기본값: True)
    • p (1-D array-like, optional): 각 요소가 선택될 확률. 배열의 합은 1이어야 함
numpy.random.choice(a, size=None, replace=True, p=None)

 

  • plt.hist: Matplotlib 라이브러리에서 히스토그램을 그리는 함수
    • bins: 히스토그램의 빈의 개수. 데이터를 몇개의 구간으로 나눌 것인지에 대한 것. 
      • 정수: 빈의 개수 지정
      • 리스트: 각 빈의 경계를 직접 지정 (140~150, 150~160 ... )
    • alpha: 히스토그램 막대의 투명도 지정 (0:투명, 1:불투명)
    • label: 히스토그램의 레이블 지정. 여러 히스토그램 그릴 때 범례를 추가하는 데 사용
    • color: 히스토그램 막대의 색상 지정

 

- 표본오차 (Sampling Error) 

표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이

표본 크기가 클수록 표본오차는 작아짐

 

- 신뢰구간 (Confidence Interval)

모집단의 특정 파라미터(평균, 비율 등)에 대해 추정된 값이 포함될 것으로 기대되는 범위

신뢰구간 = 표본평균 +/- z * 표준오차

z = 선택된 신뢰수준에 해당하는 z-값 (95% 신뢰수준의 z-값은 1.96)

import scipy.stats as stats

# 표본 평균과 표본 표준편차 계산
sample_mean = np.mean(sample)
sample_std = np.std(sample)

# 95% 신뢰구간 계산
conf_interval = stats.t.interval(0.95, len(sample)-1, loc=sample_mean, scale=sample_std/np.sqrt(len(sample)))

print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")
  • scipy.stats: SciPy 라이브러리의 일부로, 통계 분석을 위한 다양한 함수와 클래스들을 제공하는 모듈
  • stats.t.interval: 주어진 신뢰 수준에서 t-분포를 사용하여 신뢰구간을 계산하는데 사용
    • alpha: 신뢰수준을 의미
    • df: 자유도(degrees of freedom). 일반적으로 표본 크기에서 1을 뺀 값으로 설정
    • loc: 위치(parameter of location). 일반적으로 표본 평균 설정
    • scale: 스케일(parameter of scale). 일반적으로 표본 표준 오차(standard error)를 설정 (표본 표준편차를 표본 크기의 제곱근으로 나눈 값, scale = sample_std / sqrt(n))

 

- 정규분포

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)

# 히스토그램으로 시각화
plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color='g')

# 정규분포 곡선 추가
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)
plt.plot(x, p, 'k', linewidth=2)

plt.title('normal distribution histogram')
plt.show()

 

 

- 긴 꼬리 분포

출처 : https://www.nngroup.com/articles/long-tail/

대부분의 데이터가 분포의 한쪽 끝에 몰려있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포

특정한 하나의 분포를 의미하지 않으며, 여러 종류의 분포(파레토 분포, 지프의 법칙, 멱함수 등)를 포함할 수 있음

소득 분포, 웹사이트 방문자 수 등에서 관찰됨

# 긴 꼬리 분포 생성 (예: 소득 데이터)
long_tail = np.random.exponential(1, 1000) # 분포의 평균과 만들 숫자의 개수

# 히스토그램으로 시각화
plt.hist(long_tail, bins=30, density=True, alpha=0.6, color='b')
plt.title('long tail distribution histogram')
plt.show()
  • np.random.exponential: 지수분포(Exponential Distribution)를 따르는 난수를 생성하는 함수
    • 항상 0 이상 (음수가 안 나옴)
    • 큰 값이 나올 확률이 작고, 작은 값이 자주 나옴

 

- 파레토 분포 (Pareto Distribution)

파레토 법칙에 따라 사회에서는 부가 불공평하게 소수에게만 집중되는데, 이때 파레토 분포는 이를 효과적으로 나타냄

'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글

20251215 TIL  (1) 2025.12.15
20251212 TIL  (0) 2025.12.12
20251209 TIL  (1) 2025.12.09
20251205 TIL  (0) 2025.12.05
20251204 TIL  (0) 2025.12.04