202060415 TIL

2026. 4. 15. 09:58TIL

📢 오늘의 목표

🚩코드카타를 하면서 기본적인 코딩 역량을 키운다.

🚩통계분석에 대해 배우면서 기존에 배웠던 내용과 어떻게 접목 시킬지 고민한다.

 

🚩라이브 세션을 통해 통계 분석 역량을 키운다.


📅 TIL

❇️Code Kata

더보기

😊 문제 35

https://school.programmers.co.kr/learn/courses/30/lessons/82612

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요. 단, 금액이 부족하지 않으면 0을 return 하세요.

 

def solution(price, money, count):
    answer = 0
    total = 0
    for i in range(1,count+1):
        total += i*price
    if money >= total:
        answer = 0
    else:
        answer = total - money    
    return answer

 

⭐해설

일단 이 함수의 결괏값 형태가 정수의 형태이므로 answer의 초깃값을 0으로 잡고, 중간에 이용하는 변수인 total도 0으로 잡았다. 그리고 1 ~ count 까지 탑승 횟수가 늘어나므로  반복문을 돌려서 i가 늘어날 때 마다 total에 더해주는 식으로 코딩을 구현했다. 그리고 money와의 차를 조건문을 통해 돌려서 돈이 충분하면 0, 돈이 부족하면 필요한 만큼의 돈을 출력하는 함수를 만들어봤다.

 

개선 가능성

반복문 부분에서 공차 수열이기 때문에 범위를 정하지 않고 공차 수열의 합으로 표현하면 더 짧게 표현 될것 같고, 그리고 절댓값 함수 abs를 이용해도 괜찮을 것 같다.

def solution(price, money, count):
    answer = 0
    total = price*count*(count+1)/2
    if money >= total:
        answer = 0
    else:
        answer = abs(total - money)    
    return answer

 

그리고 케이스가 하나여서 다른 케이스를 하나 추가 해보았다.

price money count result
3 20 4 10

예상되는 결괏값은 105원이 부족하다였고

 

이렇게 성공적으로 테스트를 통과하였다.

❇️통계학 기초 3주차 ~ 4주차

더보기

📊A/B 테스트

 

*️⃣ 두 버전 중 어느 것이 효과적인 지 평가하기 위해 사용

 

*️⃣ 마케팅, 웹사이트 디자인등에 사용

*️⃣ 사용자를 두 그룹으로 나누고, 각 그룹에 다른 버전을 제공한 후 반응 비교

 

*️⃣ 전환율, 클릭률, 구매수 등 비교

 

*️⃣  두 그룹 간 차이가 우연이 아니라 통계적으로 유의미한지 확인

🗯️파이썬 실습

import numpy as np
import scipy.stats as stats
# 가정된 전환율 데이터
group_a = np.random.binomial(1, 0.30, 100) # 30% 전환율
group_b = np.random.binomial(1, 0.45, 100) # 45% 전환율
# t-test를 이용한 비교
t_stat, p_val = stats.ttest_ind(group_a, group_b)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")
# T-Statistic: -3.144644371303463,
# P-value: 0.001912

 

stats.ttest_ind

*️⃣ t-test를 통해 두개의 독립된 집단 간의 평균 차이가 유의미한지 평가

 

*️⃣ t-통계량과 p-값을 반환

 

t-통계량 : t-검정 통계량을 의미, 두 집단 간 평균 차이의 크기와 방향을 나타냄

 

매우 중요

 

p- value: 귀무가설이 참일때 현재 데이터보다 극단적인 결과가 나올 확률

이 값이 유의 수준(α) 보다 작으면 귀무 가설을 기각하고, 이 값이 유의 수준(α) 보다 크면 귀무 가설을 기각하지 않음

📊가설 검정

🗯️가설 검정

*️⃣ 표본 데이터를 통해 모집단의 가설을 검증 → 데이터가 특정 가설을 지지하는지 평가하는 과정

 

*️⃣ 귀무가설(H1), 대립 가설(H0)을 설정하고, 귀무가설을 기각할지 결정

 

*️⃣ 두 가지 방법을 취할 수 있음

 

⭐확증적 자료 분석

미리 가설을 세운후 가설을 검증

 

EDA

가설을 미리 정하지 않고 데이터를 탐색해보면서 가설 후보들을 찾고 데이터의 특징을 찾는 것

🗯️단계

*️⃣ 귀무가설(H1), 대립 가설(H0)을 설정

 

*️⃣ 유의수준(α) 결정

 

*️⃣ 검정통계량 계산

 

*️⃣ p-값과 유의수준 비교

 

*️⃣ 결론 도출

🗯️통계적 유의성

*️⃣ 통계적 유의성은 결과가 우연한 것이 아닌 실제로 결과에 영향을 미치는 것을 의미

 

*️⃣ p값은 귀무가설이 참일 경우 관찰된 통계치가 나올 확률을 의미

 

*️⃣ 일반적으로 p-값이 0.05 미만이면 결과를 통계적으로 유의하다고 판단

🗯️p-value

*️⃣ 귀무가설이 참일 때, 관찰된 결과 이상으로 극단적인 결과가 나올 확률

 

*️⃣ 일반적으로 p-값이 유의수준(α)보다 작으면 귀무가설을 기각

 

*️⃣ 일반적으로 0.05를 많이 사용

 

🗯️p-value를 통한 유의성 확인

*️⃣ p-값이 0.03이라면 3% 확률로 우연히 이러한 결과가 나올 수 있음

 

*️⃣ 일반적으로 0.05이하라면 유의성이 있다고 봄

🗯️p-value를 통한 유의성 확인

*️⃣ 신뢰구간

⭐ 평균이 특정 범위 내에 있을 것이라는 확률

 

일반적으로 95% 신뢰구간을 사용

 

*️⃣ 가설 검정

모수가 특정 값과 같은지 다른지 테스트

🗯️파이썬 실습

# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)
# 평균 효과 계산
mean_A = np.mean(A)
mean_B = np.mean(B)
# t-검정 수행
t_stat, p_value = stats.ttest_ind(A, B)
print(f"A 평균 효과: {mean_A}")
print(f"B 평균 효과: {mean_B}")
print(f"t-검정 통계량: {t_stat}")
print(f"p-값: {p_value}")
# t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용)
print(f"p-값: {p_value}")
if p_value < 0.05:
 print("귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.")
else:
 print("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")
# A 평균 효과: 50.4811614353549
# B 평균 효과: 53.566360049740204
# t-검정 통계량: -2.223572436572055
# p-값: 0.02730755497495163
# p-값: 0.02730755497495163
# 귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.

 

p-value를 어떻게 구해야하나 막막했는데 코딩으로 구할 수 있구나!

 

p-value가 0.05보다 작으므로 귀무 가설을 기각하고 대립가설을 채택!

📊t-검정

🗯️t-검정

*️⃣ t검정은 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 검정 방법

 

*️⃣ 독립 표본 t 검정과 대응표본 t-검정으로 나뉨

🗯️독립표본 t검정

*️⃣ 두 독립된 그룹의 평균을 비교

 

ex) 두 클래스의 시험 성적 비교

🗯️대응표본 t검정

*️⃣ 동일한 그룹의 사전/사후 평균을 비교

 

ex) 다이어트 전후 체중 비교

🗯️파이썬 실습

# 학생 점수 데이터
scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)
# 독립표본 t검정
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")
# T-Statistic: -2.1151196994233867, P-value: 0.03872653843332078

 

이 경우 p-value < 0.05 이므로 통계적으로 유의하여 귀무가설을 기각한다.

 

📊다중 검정

🗯️다중 검정

*️⃣ 여러 가설을 동시에 검정할 떄 발생하는 문제

 

*️⃣ 각 검정마자 유의수준을 조정하지 않으면 1종 오류(귀무가설이 참인데 기각) 발생

🗯️보정 방법

*️⃣ 본페로니 보정, 튜키 보정, 던넷 보정, 윌리엄스 보정 등 사용

 

*️⃣ 본페로니 보정을 가장 많이 사용함

 

*️⃣ 본페로니 보정 = 유의수준/ 가설의 수 로 해서 유의 수준을 재조정

🗯️파이썬 실습

import numpy as np
import scipy.stats as stats
# 세 그룹의 데이터 생성
np.random.seed(42)
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)
# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)
# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
  if p < adjusted_alpha:
    print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})")
  else:
    print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})")
# 본페로니 보정된 유의 수준: 0.0167
# 검정 1: 유의미한 차이 발견 (p = 0.0000)
# 검정 2: 유의미한 차이 발견 (p = 0.0058)
# 검정 3: 유의미한 차이 없음 (p = 0.1461)

📊카이제곱검정

🗯️카이제곱검정

*️⃣ 범주형 데이터의 표본 분포가 모집단의 분포와 일치하는 지 검정

 

*️⃣ 두 범주형 변수 간의 독립성을 검정

🗯️적합도 검정

*️⃣ 관찰된 분포와 기대된 분포가 일치하는지 검정

 

*️⃣ p값이 높으면 데이터가 귀무 가설에 잘 맞음

 

*️⃣ p값이 낮으면 데이터가 귀무 가설에 맞지 않음

🗯️독립성 검정

*️⃣ 두 범주형 변수 간의 독립성을 검정

 

*️⃣ p값이 높으면 두 변수 간의 관계가 연관성이 없음 → 독립성이 있음

 

*️⃣ p값이 높으면 두 변수 간의 관계가 연관성이 있음 → 독립성이 없음

🗯️파이썬 실습

# 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"적합도 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 독립성 검정
observed = np.array([[10, 10, 20], [20, 20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 성별과 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 적합도 검정 카이제곱 통계량: 2.0, p-값: 0.5724067044708798
# 독립성 검정 카이제곱 통계량: 0.0, p-값: 1.0
# 독립성 검정 카이제곱 통계량: 15.041666666666666, p-값: 0.00010516355403363098

 

*️⃣ stats.chisquare 함수

 

⭐카이제곱 적합도 검정을 수행하여 관찰된 빈도 분포가 기대된 빈도 분포와 일치하는지 평가합니다.

 

보통은 단일 표본에 대해 관찰된 빈도가 특정 이론적 분포와 일치하는지 확인하는 데 사용

 

chi2: 카이제곱 통계량, p: p-value

 

*️⃣ scipy.stats.chi2_contingency 함수

 

카이제곱 검정을 수행하여 두 개 이상의 범주형 변수 간의 독립성을 검정

 

chi2 : 카이제곱 통계량, p : p-value, dof : 자유도, expected : 기대 빈도(이론적 빈도)

📊제 1종 오류와 제 2종 오류

🗯️제 1종 오류

*️⃣귀무가설이 참인데 기각하는 오류(위양성)

 

*️⃣ α를 경계로 귀무가설을 기각하기에 제 1종 오류가 α만큼 발생

 

*️⃣ 따라서 α를 정함으로써 제 1종 오류를 제어

 

*️⃣ 만약 α가 0.05라면 5% 확률로 나타나는 1종 오류는 무시한다.

 

*️⃣ 1종 오류가 나타나는 이유는 검정이 하나면 1- α 확률로 오류가 발생하지 않는데 검정의 수가 늘어나면

오류가 발생할 확률이 점점 늘어난다.

 

*️⃣ 한 예로 검정을 10번 거치면 오류 발생 확률을 40.1%(p-value = 0.401)이다.

🗯️제 2종 오류

*️⃣귀무가설이 거짓인데 기각하지 않는 오류(위음성)

 

*️⃣제 2종 오류가 일어날 확률을 β라고 하면

 

*️⃣ 오류가 나타나지 않을 확률은 검정력(1- β)으로 정의

 

*️⃣ 통제할수 없는 확률이지만 표본 수를 늘리고 α를 늘리는 방법으로 어느정도 제어

 

더보기

📊단순선형회귀

🗯️단순선형회귀

*️⃣ 하나의 독립 변수(X)와 하나의 종속 변수(Y) 사이의 관계로 나타낸 것(직선형)

 

*️⃣ Y = β0 + β1X, 여기서 β0는 절편, β1는 기울기(여기에 오차)

 

*️⃣ 독립 변수에 따른 종속 변수의 변화를 설명하고 예측

 

*️⃣ 데이터가 직선적 경향을 따를 때 사용

 

*️⃣ 간단하고 해석이 용이하지만 데이터가 선형이 아니면 사용하기 힘들어 사용이 제한적

🗯️파이썬 실습

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 예시 데이터 생성
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
# 시각화
plt.scatter(X, y, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.title('linear regeression')
plt.xlabel('X : cost')
plt.ylabel('Y : sales')
plt.show()
# 회귀 계수: [[2.9902591]]
# 절편: [4.20634019]
# 평균 제곱 오차(MSE): 0.9177532469714291
# 결정 계수(R2): 0.6521157503858556

📊다중선형회귀

🗯️다중선형회귀

*️⃣ 두 개 이상의 독립 변수(X1,X2,X3,...,Xn)와 하나의 종속 변수(Y) 사이의 관계로 나타낸 것

 

*️⃣ Y = β0 + β1X1 + β2X2 + ... + βnXn

 

*️⃣ 여러 독립 변수의 변화를 고려하여 종속 변수를 설명

 

*️⃣ 관여하는 변수가 많을 때 사용

 

*️⃣ 변수들간의 다중공선성 문제가 발생 가능

 

*️⃣다중 공선성

⭐ 회귀분석에서 독립 변수들 간에 높은 상관관계가 있는 경우

 

독립 변수끼리 너무 깊은 상관 관계를 가지면 각 변수 개별적인 영향을 분리하기 힘들어서 회귀 분석이 힘듦, 또는 변수 중 중요한 것이 중요하지 않다고 검출될 수 있음

 

상관계수를 계산해서 상관 계수가 높은(<0.7) 변수들을 확인하거나, VIF를 계산하여 VIF값이 10보다 높은 지 확인하면 다중 공선성을 확인할 수 있다.

 

그리고 이 중 가장 높은 계수를 가지는 변수 중 하나를 제거하거나 PCA와 같은 차원 분석 방법을 이용하면 해결 가능!

🗯️파이썬 실습

# 예시 데이터 생성
data = {'TV': np.random.rand(100) * 100,
 'Radio': np.random.rand(100) * 50,
 'Newspaper': np.random.rand(100) * 30,
 'Sales': np.random.rand(100) * 100}
df = pd.DataFrame(data)
# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_
# 다중선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
# 회귀 계수: [-0.02208636 -0.04524956  0.36955755]
# 절편: 47.47458066489462
# 평균 제곱 오차(MSE): 953.8458662397383
# 결정 계수(R2): -0.14044120780448188

📊범주형변수

🗯️범주형변수

*️⃣ 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수

 

*️⃣ 종류에는 순서가 있는 옷 사이즈, 수능 등급과 같은 변수와 순서가 없는 성별, 지역과 같은 변수가 있음

 

*️⃣ 순서가 있는 변수는 순서에 따라 임의의 숫자를 배정하고, 순서가 없는 변수는 원-핫 인코딩(하나만 1인 벡터)과 같은 방법으로 임의의 숫자로 변환

🗯️파이썬 실습

# 예시 데이터 생성
data = {'Gender': ['Male', 'Female', 'Female', 'Male', 'Male'],
 'Experience': [5, 7, 10, 3, 8],
 'Salary': [50, 60, 65, 40, 55]}
df = pd.DataFrame(data)
# 범주형 변수 더미 변수로 변환
df = pd.get_dummies(df, drop_first=True)
# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['Experience', 'Gender_Male']]
y = df['Salary']
# 단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X, y)
# 예측
y_pred = model.predict(X)
# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
# 회귀 계수: [ 2.57281553 -6.01941748]
# 절편: 40.63106796116506
# 평균 제곱 오차(MSE): 3.1067961165048588
# 결정 계수(R2): 0.9580162686958803

📊다항회귀, 스플라인 회귀

🗯️다항 회귀

*️⃣ 독립 변수와 종속 변수 간의 관계가 선형이 아닐 때 사용, 독립 변수의 다항식을 사용하여 종속 변수를 예측

 

*️⃣ 데이터가 곡선적 경향일 때(e^x, ln,x^3), 비선형 데이터를 모델링 가능

 

*️⃣ 고차 다항식의 경우 과적합( 기계 학습 모델이 훈련 데이터에만 지나치게 맞춰져 노이즈나 이상치까지 학습하여, 실제 데이터(테스트 데이터)에서는 낮은 예측 성능을 보이는 현상) 위험이 있음

 

🗯️스플라인 회귀

*️⃣ 독립 변수의 구간 별로 다른 회귀식을 적용하여 복잡한 관계를 모델링

 

*️⃣ 구간 마다 다른 방정식을 사용하여 전체적으로 매끄러운 곡선

 

*️⃣ 데이터가 국부적으로 다른 패턴을 보일때 사용, 복잡한 비선형 관계도 모델링 가능

 

*️⃣ 적절한 매듭점을 잡아야 fitting 하기 좋다.

❇️라이브 세션

더보기

 

 

전체적인 흐름

이산확률분포

 

 

더보기

인코딩 > 범주형 데이터를 숫자로 변환

 

범주형 데이터는 이름 혹은 범주로 나타나는 데이터

 

인코딩 해야하는 이유 > 머신러닝은 숫자만 입력 받을 수 있음

OneHotEncoding

순서가 없는 범주형 변수를 다룰 때 가장 안전하고 효과적인 방법입니다.

언제 사용하나요?

성별, 혈액형처럼 순서가 없는 범주형 변수

범주의 개수가 너무 많지 않을 때

 

OneHotEncoding을 하려면 pandas에 있는 get_dummies를 사용하면 된다

 

Label Encoder

 

문자형 데이터를 정수(숫자)로 변환하는 간단한 방법

 

low < medium < high, 초급 < 중급 < 고급 처럼 순서가 있는 범주형 변수

또는 범주는 있지만 One-hot을 쓰기엔 너무 많은 경우

트리 기반 모델(Random Forest, XGBoost 등)은 순서가 없어도 잘 처리 가능

 

1️⃣ 인코딩 (Encoding)

목적: 범주형 데이터를 숫자로 변환

OneHotEncoding: 순서 없는 범주에 사용, pd.get_dummies()

LabelEncoding: 순서 있는 범주에 사용, sklearn.LabelEncoder()


2️⃣ 스케일링 (Scaling)

목적: 수치형 데이터의 단위를 맞춰 모델의 민감도 완화

StandardScaler: 평균 0, 표준편차 1로 변환 → 정규분포에 적합

MinMaxScaler: 0~1 사이로 변환 → 정규분포 아니어도 사용 가능


3️⃣ 다중공선성 제거 (Multicollinearity)

정의: 독립변수 간 상관관계가 너무 높아 모델 불안정성 유발

영향 받는 모델: 선형회귀, 로지스틱 회귀 등

해결 방법:

VIF(10 이상) 기준 변수 제거

상관계수 0.9 이상 변수 제거

PCA로 차원 축소

✅ 해석이 목적이면 제거 필요 / 예측이 목적이면 트리모델은 영향 적음


4️⃣ 데이터 분할 (Train/Test Split)

목적: 모델 학습과 테스트 데이터 분리 → 과적합 방지

방법: train_test_split()

보통 비율: 7:3, 8:2

오늘은 공부가 너무 안된다.... 내일은 좀 더 심기일전해서 해야겠다.

'TIL' 카테고리의 다른 글

20260417 TIL  (1) 2026.04.17
20260416 TIL  (1) 2026.04.16
20240414 TIL  (2) 2026.04.14
20260413 TIL(🎂)  (0) 2026.04.13
20260410 TIL  (0) 2026.04.10