12

1. statsmodels (통계 분석/회귀)

모듈 / 함수 주요 사용 범주 예시 / 설명
ols 선형회귀 ols('y ~ x1+ x2', data =df,).fit()
logit 로지스틱 회귀(분류) logit('y ~ x1 + x2 ', data =df).fit()
model.summary() 결과요약 회귀계수 t값, p값, 결정계수 출력
model.tvalues t검정통계량 각 변수의 t값
model.pvalues p-values(유의 확률) 유의미성 판단 (x < 0.05면 의미있음)
model.rsquared 결정계수 회귀 적합도 0~1, 높을수록 좋음
model.params 회귀계수(coef) 독립변수 영향력

 

2. sklearn.ensemble

(머신러닝 모델)

클래스 사용 범주 예시 / 설명
RandomForestClassifier 분류(문자/범주 예측) 다중분류(문자형 타겟, 라벨 인코딩 필요)
RandomForestRegressor 회귀(숫자 예측) 연속형 목표변수 예측

 

3. sklearn.metrics

(성능 평가)

함수 주요 사용 범주 예시 / 설
mean_squared_error(y, pred) 회귀: MSE MSE, squared=False면 RMSE
f1_score(y, pred, average=...) 분류: F1점수 macro, micro 등
accuracy_score(y, pred) 분류: 정확도 분류 맞춘 비율

 

4. sklearn.preprocessing

함수 / 클래스 사용 범주 설명 / 예시
StandardScaler 표준화 평균0, 표준편차 1로 변환
fit_trans
MinMaxScaler 정규화 0~1 사이로 변환
fit_transform(X)
RobustScaler 중앙값 정규화 이상치에 강함
중앙값(median) 기준 변
MaxAbsScaler 절댓값 정규화 -1 ~ 1 사이로 변환
음수 포함 가능
Normalizer 행(샘플) 단위 정규화 각 행의 벡터 크기를 1로 만듦 (주로 텍스트 벡터)

 

5. form scipy import stats

pearsonr(a, b) 피어슨상관계수 + p값 corr, p = pearsonr(x, y)
ttest_1samp 단일 표본 t검 한 집단의 평균이 특정 값과 같은지 가설
ttest_ind(a, b) 두 집단 평균 차 t검정 독립 2표본 t-검정
ttest_rel(대응 쌍체 표본t검정) 두 그룹 전후 비교  
f_oneway(a, b, ...) 분산분석 anova (일원배치법)
그냥 집단 간 평균차이(일원분산분석)만 필요:
3개 이상 그룹 평균차이 검정
anova_lm(model) 회귀분석, 다중요인(범주형 변수 등) 영향력까지 표로 보고 싶을  
shapiro 정규성 검정 p값이 0.05이상이면 정규분포로 봄
levene(a, b) 등분산 검정(Levene) 분산이 같은지 비

1. replace

df['f4'] = df['f4'].replace('ESFJ', 'ISFJ')

 

 

2. df.loc 를 이용한 방법

df.loc[df['f4'] == 'ESFJ', 'f4] = 'ISFJ'

 

3. np.where()

df['f4'] = np.where(df['f4'] == 'ESFJ', 'ISFJ', df['f4'])

 

df['근속년수'] = df.groupby(['부서명', '근무평가등급'])['근속년수'].transform(lambda x : x.fillna(x.mean()))

 

 

 

  • df.groupby(['부서명', '근무평가등급'])['근속년수']
    → 이건 '부서명+근무평가등급'으로 묶인 그룹별로 '근속년수'만 뽑아낸 것
  • transform(lambda x: x.fillna(x.mean()))
    → 각 그룹별 근속년수를 x로 받아서,
    → 그 그룹에서 NaN은 평균으로 채워줌

 

✅간단하게 정리

구문 의미
groupby(['부서명', '근무평가등급']) 그룹 나누기 (부서 + 등급 조합별로)
['근속년수'] 그룹 안에서 '근속년수' 열만 선택
transform() 그룹별 계산 결과를 원래 구조 유지하며 반환
x 각 그룹의 근속년수만 모인 시리즈
x.mean() 해당 그룹의 평균 근속년수
x.fillna(x.mean()) 그 그룹에서 NaN을 평균으로 채움

 

코드 의미
df.idxmax(axis = 1) 행 기준 → 각 행에서 가장 큰 열 이름
df.idxmax(axis = 0) 열 기준 → 각 열에서 가장 큰 행 인덱스

 

 

 

예시)

년도 절도 사기 방화 폭행 ...
2014 0.55 0.62 0.47 0.61 ...
2015 0.53 0.68 0.44 0.65 ...
... ... ... ... ... ...

 

 

# 검거율.idxmax(axis=1)

print(검거율.idxmax(axis=1))

년도
2014    사기
2015    폭행
2016    사기
...

 

# 검거율.idxmax(axis=0)

절도    2017
사기    2015
방화    2019
...

1. train_test_split

 

  • 전체 데이터를 훈련(train) 세트와 테스트(test) 세트로 나누는 함수
  • 모델을 훈련용 데이터로 학습하고, 테스트용 데이터로 평가할 수 있게 해줌
from sklearn.metrics import train_test_split
train = df[['target', 'fbs', 'thalach', 'chol', 'sex']][:800]

train, test = train_test_split(train, test_size=0.2, random_state = 123)

 

 

2. 정확도 (Accuracy)

  • 전체 데이터 중에서 맞춘 비율
  • 정확도는 1에 가까울수록 좋은 성능을 보임
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(test, pred)

 

 

from statsmodels.formula.api import logit

# formula방식
model = logit('target ~ fbs + thalach + chol + sex', data=train).fit()

# 예측
pred = model.predict(test)
pred = (pred > 0.5).astype(int)

# 정확도 계산
accuracy = (pred == test['target']).mean()

3. 오분류율 (Error Rate)

  • 전체 중에서 틀린 예측의 비율
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(test, pred)
error_rate = 1 - accuracy

 

4. 정밀도 (Precision)

from sklearn.metrics import precision_score

precision = precision_score(test, pred)

 

 

5. MSE (Mean Squared Error)

 

  • 예측값과 실제값 차이의 제곱 평균
  • 값이 0에 가까울수록 예측이 정확함

 

from sklearn.metrics import mean_squared_error

mse = mean_squared_error(y_true, y_pred)
print("MSE:", round(mse, 3))

 

6. RMSE (Root Mean Squared Error)

 

  • MSE의 단위가 제곱이기 때문에, 원래 단위로 맞추기 위해 제곱근을 씀
  • 값이 작을수록 좋음
from sklearn.metrics import mean_squared_error

rmse = mean_squared_error(y_true, y_pred, squared=False)
print("RMSE:", round(rmse, 3))

 

 

7. F1-Score

 

  • **정밀도(Precision)**와 **재현율(Recall)**의 조화 평균
  • 불균형 데이터(예: 1이 적은 경우)에서 모델 성능 평가에 유리
from sklearn.metrics import f1_score

f1 = f1_score(y_true, y_pred)
print("F1-Score:", round(f1, 3))

 

 

기본은 binary classification (0 vs 1)
다중 분류일 땐 average='macro' 또는 average='weighted' 추가

 

# 다중 분류 예시
f1_macro = f1_score(y_true, y_pred, average='macro')
import numpy as np
import pandas as pd 

df = pd.read_csv('/kaggle/input/bigdata-csvfile/Sleep_health_and_lifestyle_dataset.csv')

df = df.select_dtypes(include = 'numbers')
corr = df.corr()

 

df.select_dtypes(include='number')  # 숫자형 컬럼만 추출
df.select_dtypes(include='object')  # 문자형 컬럼만 추출
df.select_dtypes(include='category')  # 범주형만 추출

# 여러 타입도 선택 가능

df.select_dtypes(include=['int64', 'float64'])

1. pandas.DataFrame.corr()

df['col'].corr() # 기본값 피어슨 상관계수
df['col'].corr(method = 'spearman') # 순위 기반 상관계수 스피어만 (서열형에 적합)
df['col'].corr(method = 'kendall') # 켄달 순위 상관계수
'pearson' 기본값, 연속형 변수 간 선형관계
'spearman' 순위형 또는 비선형 관계 탐색
'kendall' 순위형 변수 간 관계 (robust)

 

 

 

2. scipy.stats.pearsonr(x, y)

from scipy.stats import pearsonr

corr, pval = pearsonr(df['소득'], df['주택가격'])
print(corr)     # 상관계수
print(pval)     # 유의확률(p-value)

 

 

📕 비교표

항목 .corr() stats.pearsonr(x, y)
상관계수 계산 방식 피어슨(기본값), spearman, kendall 피어슨(고정)
p-value 제공 여부 ❌ 없음 ✅ 있음
NaN처리 자동 무시 에러발생 (dropna 필요)
다변수 분석 지원 ✅ (DataFrame 전체 상관 행렬 ❌ (1:1 변수 비교만 가능)
주로 언제 사용하나 변수 간 전체 상관 구조 파악할 때 특정 변수 간 통계적 유의성 확인할 때
import warnings

warnings.filterwarnings('ignore')  # 경고 메시지 무시

 

 

  • warnings.filterwarnings('ignore')는 실행 중 발생하는 모든 경고 메시지를 무시(출력하지 않음)하는 함수
  • 파이썬 내장 라이브러리 warnings의 기능
  • 실제 오류(에러)는 무시하지 않고, 경고(warning)만 무시
    • 에러(error)는 여전히 화면에 출력됨 (코드 중단)
    • warning(경고)만 화면에서 숨겨줌
  • 실기/실무에서 코드 output을 깔끔하게 할 때 자주 사용

 

‼️ 차이점은 ddof (자유도)의 기본값 차이

 

np.std() (NumPy의 표준편차)

  • 기본값 ddof = 0

 

Series.std() (Pandas의 표준편차)

  • 기본값 ddof = 1

 

🚩 즉, 두 함수의 기본 자유도 차이(ddof)로 결과가 달라질 수 있음!

 

  • 실제 값 차이 예시
    (n=5일 때, 단순 예시)
    • 모집단: 분모가 5 (n)
    • 표본: 분모가 4 (n-1)
  • 실기/실무에서 표본 표준편차(ddof=1)가 기본입니다.

 

 

np.std() (NumPy의 표준편차) Series.std() (Pandas의 표준편차)
기본값 ddof = 0 기본값 ddof = 1

 

 

  • "어떤 방식의 표준편차를 요구하는지"
    • 공식 예시에서 pandas로 했는지, numpy로 했는지, ddof=0 또는 1인지 확인
  • 정답이 소수점 단위까지 요구될 때는,
    무조건 pandas의 std()로 통일하거나
    np.std(..., ddof=1)로 맞춰주는 것이 안전함!

 

 

❌np.var() 도 pandas().var()과 다름

  • np.var() 도 ddof = 1을 꼭 기입
  • pandas는 기본값

 

1번

F-검정 통계량 :

F = (큰 분산) / (작은 분산)

 

  • df₁(분자 자유도) = 더 큰 분산 쪽의 자유도
  • df₂(분모 자유도) = 더 작은 분산 쪽의 자유도
  • 항상 “분자의 자유도가 분모의 자유도보다 크도록” 맞추는 것

 

 

 

2. 합동분산(Sp²) 추정량

  합동분산에 반드시 np.var(…, ddof=1) 값(=S₁², S₂²)을 넣으셔야 합니다!

 

  • n1, n2 : 집단 표본 크기
  • S₁², S₂² : 각 집단의 표본분산(ddof=1)

Sp2 = ((n1-1)varA + (n2-1)varB) / n1+n2-2

 

 

3번. 합동분산 t검정

import pandas as pd
import numpy as np

df = pd.read_csv("data/bcc.csv")

# 1. 
df1 = df[df['Classification'] == 1]['Resistin']
df2 = df[df['Classification'] == 2]['Resistin']

log1 = np.log(df1)
log2 = np.log(df2)

var1 = log1.var()
var2 = log2.var()

n1 = len(log1)
n2 = len(log2)

df1 = n1 - 1
df2 = n2 - 1
if df1 > df2:
	f_result = var1 / var2
else:
	f_result = var2 / var1

print(round(f_result, 3))

# 2. 분산추정량
result2 = (((n1 - 1) * var1) + ((n2 - 1) * var2)) / (n1+n2-2)
print(round(result2, 3))

# 3. ttest_ind
from scipy import stats
st, pv = stats.ttest_ind(log1, log2)
print(round(pv,3 ))

 

> 1.348
0.449
0.003