본 캠프 TIL

1월 20일 TIL 통계학 라이브 세션 3회차, 5,6주차, 마쉰라닝 기초 겉핥기, 코드카타, 아티클

meoca1257 2025. 1. 20. 19:03

통계학 3회차 라이브 세션 정강민 튜터님 

+참고 링크 ANOVA.ipynb - Colab

+참고 2

데이터 형태에 따른 모델 분류
x 수치 y 범주(0/1 , 맞다/아니다, 암이다/아니다) : 로지스틱 회귀모델
x 수치 y 수치 : 선형회귀 모델
x 범주 Y 범주 : 카이제곱 검정
x 범주 y 수치 : 아노바 분석 (변수가 3개일때), t 검정 (변수 2)

 

[수업 목표]

  1. 데이터를 활용하여 여러 생산라인 간의 품질 차이를 통계적으로 분석하는 방법을 이해한다.
  2. 분산분석을 통해 귀무가설 검정 방법과 p-value 해석 방법을 익힌다.
  3. ANOVA 및 사후검정(Tukey HSD)을 통해 구체적인 라인 간 차이를 분석하는 방법을 숙지한다.
  4. Python의 scipy, statsmodels 라이브러리를 활용하여 F-통계량과 p-value를 계산하고 결과를 해석하는 방법을 배운다.

1. ANOVA 분석 개요

 

(1) 기본 개념

ANOVA (Analysis of Variance, 분산분석)는 📊 세 개 이상의 집단 평균 차이를 동시에 비교하는 통계 기법입니다. 집단 간 평균 차이를 분산 (Variance)을 이용해서 분석하는 거죠!

  • 일원분산분석 (One-way ANOVA): 한 가지 독립변수 (요인)에 여러 수준이 존재하고, 종속변수가 연속형인 경우를 말합니다.

(2) 아노바 분석 사용 예시

  • 🍎 서로 다른 세 종류의 비료 (A, B, C)를 사용했을 때, 사과의 평균 무게에 차이가 있는지 비교하고 싶을 때
  • 📚 새로운 교육 프로그램 (A, B, C)의 효과를 비교하기 위해, 각 프로그램을 이수한 학생들의 평균 시험 점수를 비교할 때
  • 한 제조업체에서 제품의 품질(예: 강도)이 3개의 다른 생산 라인에서 다를 가능성을 조사하려 할때, 생산 라인 A, B, C에서 샘플 데이터를 수집하여 품질 차이가 통계적으로 유의미한지 확인

2. 가정 (Assumptions)

 

ANOVA는 다음과 같은 가정을 만족해야 신뢰할 수 있는 결과를 얻을 수 있습니다. 🤔

  • 정규성 (Normality): 각 집단의 종속변수가 정규분포를 따른다고 가정합니다.
  • 등분산성 (Homogeneity of variance): 각 집단의 분산이 동일하다고 가정합니다. (Bartlett test, Levene test 등으로 확인)
  • 독립성 (Independence): 표본들이 서로 독립적이어야 합니다. (한 대상이 여러 집단에 중복 참여 X)

⚠️ 가정 위배 시: 정규성이나 등분산성 가정이 크게 위배된다면, Welch ANOVA (등분산성 미가정) 나 Kruskal-Wallis 검정 (비모수적 대안)을 고려할 수 있습니다.

 

 

3. 수학적 배경

 

(1) 분산분석 (ANOVA)의 아이디어

ANOVA는 총 변동집단 간 변동집단 내 변동으로 나누어 분석합니다.

  • 총제곱합 (SST): 전체 변동 (집단 간 변동 + 집단 내 변동)
  • 집단 간 제곱합 (SSB): 집단별 평균 간의 차이로 인한 변동
  • 집단 내 제곱합 (SSE): 각 집단 내에서 개별 데이터가 집단 평균과 얼마나 다른지 나타내는 변동

💡 SST = SSB + SSE

 

(2) F 통계량

분산분석의 핵심 지표는 F 통계량이며, 집단 간 변동과 집단 내 변동의 비율로 계산됩니다.

🔎 F = MSB / MSE

  • MSB (Between Mean Square): SSB / (k - 1)
  • MSE (Error Mean Square): SSE / (N - k)
    • k: 집단 수
    • N: 전체 표본 수

🎯 귀무가설 (H_0): 모든 집단의 평균은 동일하다. 🎯 대립가설 (H_1): 적어도 한 집단의 평균은 다르다.

💡 그룹 간 차이가 크면 MSB가 커져서 F 값이 커지고, 귀무가설을 기각 (집단 평균 차이 존재) 하게 됩니다.

 

 

실습

 

3개의 생산 라인(Machine A, Machine B, Machine C)이 생산 1회당 걸리는 시간(production_time)에 차이가 있는지 확인

 

  • 목표: 동일한 제품을 생산할 때,
    • 생산 라인 A(Machine A)
    • 생산 라인 B(Machine B)
    • 생산 라인 C(Machine C) 이 세 가지 라인에서 평균 생산 시간에 차이가 있는지 알아보려 함.
  • 데이터 구성: 총 10개의 생산 시점(ID)에서 “생산 1회당 걸린 시간(production_time)”을 측정했고, 측정 시 어떤 라인을 사용했는지(그룹)를 기록하였음.

group mean: 해당 라인(A, B, C)의 평균 생산 시간

Between: 각 라인의 평균이 전체평균에서 얼마나 떨어져 있는지를 나타내는 제곱 편차 분(집단간 분산 기여도)

Within: 개별 관측치가 그 라인의 평균으로부터 얼마나 떨어져 있는지를 나타내는 제곱 편차 분(집단내 분산 기여도)

 

3. 전체평균(Grand Mean)과 그룹별 평균

  • 전체 평균(Grand Mean): 모든 production_time의 평균
  • 그룹별 평균:
    • 라인 A 평균: 6.00 시간
    • 라인 B 평균: 5.95 시간
    • 라인 C 평균: 7.53 시간

예시에서 전체평균은 약 6.44 시간(10개 생산 시점의 평균)이라 가정되어 있습니다

 

4. 집단 간 변동(Between-Group Variance)

  • *Between 변동(집단간 변동)**은 “각 그룹 평균이 전체평균에서 얼마나 떨어져 있는가?”를 바탕으로 계산합니다.

  • 라인 A: (평균 6.00 - 전체평균 6.44)²
  • 라인 B: (평균 5.95 - 전체평균 6.44)²
  • 라인 C: (평균 7.53 - 전체평균 6.44)²

각 그룹의 표본 크기에 따라 가중합을 해줍니다.

예: A그룹 표본 수 3개, B그룹 4개, C그룹 3개

실제 수치를 대입하면,

  • 집단 간 자유도(df1): k - 1
    • 여기서 (A, B, C) → k=3
    • df1=3-1=2

 

5. 집단 내 변동(Within-Group Variance)

  • *Within 변동(집단내 변동)**은 “개별 관측값이 자신이 속한 그룹평균과 얼마나 차이 나는지”로 구합니다.

예:

  • 라인 A에 속한 id=1 (5.3) → (5.3 - 6.00)² = 0.49
  • 라인 A에 속한 id=2 (6.0) → (6.0 - 6.00)² = 0.00
  • 라인 B, C도 같은 방식으로 합산

모든 관측치를 더한 결과, Within SS = 1.757

  • 집단 내 자유도(df2):n - k
    • 전체 샘플 수 , 그룹 수 →k=3
    • df2=10−3=7
    • n=10

 

 

4. 절차

  1. 데이터 수집: 예) 3개 집단 (A, B, C), 각 집단별로 10명에게서 종속변수를 측정
  2. 가정 확인:
  • 정규성 검정 (Shapiro-Wilk test, Kolmogorov-Smirnov test 등)
  • 등분산성 검정 (Levene's test, Bartlett's test)
  1. ANOVA 수행: 분산분석 표 (ANOVA table) 에서 F 통계량과 p-값 도출
  2. 결과 해석: p < 0.05 일 경우, "적어도 한 집단의 평균이 다른 집단과 유의한 차이"가 있다고 판단
  3. 사후검정 (Post-hoc test): 집단이 3개 이상이면, 유의미한 차이가 나는 "특정 집단 간" 쌍별 비교를 수행 (Tukey HSD, Scheffé, Bonferroni 등)

 

5. 사후 검정 (Post-hoc tests)

(1) 주요 기법

  • Tukey HSD (Test): 등분산 가정이 충족되고, 표본 크기도 비슷한 경우 자주 사용됩니다. 직관적이고 쉬운 해석이 가능해요! 😊
  • Bonferroni: 쌍별 t-검정에 대한 유의수준 보정을 적용합니다. 보수적인 방법이에요. 🧐
  • Scheffé: 보수적인 방법으로, 표본 크기가 다르거나 가정이 조금 깨져도 적용 가능합니다. 👍

위 방법 이상 깊게 가는걸 권장 드리지않습니다. 통계적 깊은 연구가 아니면, 다른 모델을 사용하는 것을 권장드립니다.

(2) 사후검정 결과 해석

어떤 두 집단 간 평균 차이가 p < 0.05 로 유의하다면, 그 두 집단 사이에 통계적으로 의미 있는 차이가 있다고 결론 내립니다. 모든 쌍별 비교 결과를 표로 정리하는 경우가 많아요. 📊

 

 

6. Python 예시 코드 (One-way ANOVA)

import numpy as np
import pandas as pd
from scipy.stats import f_oneway
# statsmodels 패키지로 ANOVA & Post-hoc
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.multicomp import pairwise_tukeyhsd

# ------------------------------------------------
# 1) 예시 데이터 생성
# ------------------------------------------------
np.random.seed(42)

group_A = np.random.normal(loc=50, scale=5, size=30)  # A 집단
group_B = np.random.normal(loc=55, scale=5, size=30)  # B 집단
group_C = np.random.normal(loc=60, scale=5, size=30)  # C 집단

df = pd.DataFrame({
    'score': np.concatenate([group_A, group_B, group_C]),
    'group': ['A']*30 + ['B']*30 + ['C']*30
})

# ------------------------------------------------
# 2) SciPy를 이용한 간단 ANOVA
# ------------------------------------------------
f_stat, p_val = f_oneway(group_A, group_B, group_C)
print("== One-way ANOVA (SciPy) ==")
print(f"F-statistic = {f_stat:.4f}, p-value = {p_val:.4f}\n")

# ------------------------------------------------
# 3) StatsModels를 이용한 ANOVA
# ------------------------------------------------
model = ols('score ~ C(group)', data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print("== ANOVA Table (StatsModels) ==")
print(anova_table)

# ------------------------------------------------
# 4) 사후검정 (Tukey HSD)
# ------------------------------------------------
tukey_result = pairwise_tukeyhsd(endog=df['score'],
                                 groups=df['group'],
                                 alpha=0.05)
print("\n== Tukey Post-hoc Test ==")
print(tukey_result)

# 요약 해석
# - ANOVA 결과 p < 0.05라면, 세 집단 간 평균에 통계적 유의 차이가 있음.
# - Tukey 결과를 보면, 어떤 집단 간 차이가 유의한지(pairwise) 표시됨.

 

 

7. Tukey HSD 검정이란 무엇일까요?

분산 분석 (ANOVA) 의 사후 분석 (Post-hoc test) 방법으로, ANOVA 에서 여러 그룹 간 평균 차이가 유의미하다고 나왔을 때, 어떤 그룹 간에 차이가 있는지 구체적으로 확인하는 데 사용됩니다. 🔎

Tukey HSD 의 주요 특징

  • 다중 비교 문제 해결: ANOVA 는 여러 그룹 간 평균 차이가 있는지 여부만 알려주지만, Tukey HSD 는 모든 가능한 그룹 쌍을 비교하면서 다중 비교로 인한 오류를 제어합니다.
  • 균등한 표본 크기 및 분산 가정: Tukey HSD 는 각 그룹의 분산이 동일하고 (등분산성), 표본 크기가 비슷할 때 더욱 신뢰할 수 있는 결과를 제공합니다.
  • 유의수준 조정: 다중 비교에 맞게 유의수준 (α) 을 조정하여 신뢰도를 높입니다.

Tukey HSD 의 공식

두 그룹 i 와 j 간의 평균 차이를 비교하는 검정 통계량은 다음과 같습니다.

 

8. Tukey HSD 검정 절차

  1. ANOVA 수행: 먼저 ANOVA 를 수행하여 그룹 간 평균 차이가 유의미한지 확인합니다.
    • H0: 모든 그룹 간 평균이 동일하다 (μ1=μ2=μ3=...).
    • H1: 적어도 하나의 그룹이 다른 그룹과 평균이 다르다.
  2. 유의미한 결과 확인: ANOVA 결과 p<α 인 경우, 사후 분석 (Tukey HSD) 을 수행합니다.
  3. Tukey HSD 계산: 각 그룹 간 평균 차이를 계산하고, 유의수준에 따라 통계적 유의미성을 판정합니다.
  4. 결과 해석: 유의미한 그룹 쌍을 확인하여 어떤 그룹 간에 차이가 존재하는지 명시합니다.

 

9. Python 코드 예제

한 제조업체에서 세 가지 공정 (A, B, C) 이 제품 품질 (강도) 에 미치는 영향을 분석합니다.

import pandas as pd
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.formula.api import ols
import statsmodels.api as sm

# 데이터 생성
data = pd.DataFrame({
    "공정": ["A", "A", "A", "B", "B", "B", "C", "C", "C"],
    "강도": [85, 87, 86, 88, 90, 89, 92, 91, 93]
})

# 1. ANOVA 수행
model = ols('강도 ~ 공정', data=data).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print("ANOVA 결과:\n", anova_table)

# 2. Tukey HSD 수행
tukey = pairwise_tukeyhsd(endog=data["강도"], groups=data["공정"], alpha=0.05)
print("\nTukey HSD 결과:\n", tukey)

Tukey HSD 결과:

10. 분석 결과 작성 시 팁

  • 기본 통계치: 각 집단의 평균, 표준편차, 표본 크기 제시
  • ANOVA 표: F 값, 자유도 (df), p-값, 효과크기 ($η_2$) 등
  • 사후검정: 어떤 집단 간 차이가 유의미한지 명시
  • 가정 충족 여부: 정규성, 등분산성 검정 결과 간단히 언급
  • 시각화: 박스플롯, 에러바 플롯 등을 통해 집단 간 평균/분포 차이를 시각적으로 표현

11. 요약

  • 일원분산분석 (One-way ANOVA) 은 세 개 이상의 독립 집단 간 종속변수의 평균 차이를 검정하는 대표적인 방법입니다.
  • 전제되는 정규성, 등분산성, 독립성 가정을 만족해야 신뢰도 높은 결과를 얻을 수 있습니다.
  • 결과가 유의하다면, 사후검정을 통해 구체적으로 어느 집단 사이에 차이가 있는지 파악해야 합니다.
  • Python 에서는 scipy.stats.f_oneway 나 statsmodels 의 anova_lm 을 통해 손쉽게 ANOVA 를 수행하고, pairwise_tukeyhsd 함수로 Tukey 사후검정을 진행할 수 있습니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

통계학 기초 5,6주차 

통계학 5주차

[수업 목표]

 

★ 상관관계에 대해서 이해한다

★ 다양한 상관관계 계산의 특징과 차이점을 이해하고 적용할 수 있다

 

피어슨 상관계수

  • 두 연속형 변수 간의 선형 관계를 측정하는 지표
  • -1에서 1 사이의 값을 가지며
  • 1은 완전한 양의 선형 관계
  • -1은 완전한 음의 선형 관계
  • 0은 선형 관계가 없음을 의미

비모수 상관계수

  • 데이터가 정규분포를 따르지 않거나 변수들이 순서형 데이터일 때 사용하는 상관계수
  • 데이터의 분포에 대한 가정 없이 두 변수 간의 상관관계를 측정할 때 사용
  • 대표적으로 스피어만 상관계수와 켄달의 타우 상관계수가 있음

상호정보 상관계수

  • 두 변수 간의 상호 정보를 측정
  • 변수 간의 정보 의존성을 바탕으로 비선형 관계를 탐지
  • 서로의 정보에 대한 불확실성을 줄이는 정도를 바탕으로 계산
  • 범주형 데이터에 대해서도 적용 가능

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

5.1 피어슨 상관계수                        # 가장 대표적으로 많이 사용하는 상관계수!

1) 피어슨 상관계수란 무엇일까?

  • 가장 왼쪽 그래프가 피어슨 상관계수 그래프!
  • 첫 번째 그래프는 파란색 점들로 나타내었으며, X와 Y의 선형 관계를 보여줍니다.
  • 그래프에서 점들이 직선적으로 퍼져 있으며, 상관계수는 0.99로 매우 강한 양의 선형 관계를 나타냅니다.

피어슨 상관계수

  • 두 연속형 변수 간의 선형 관계를 측정하는 지표
  • -1에서 1 사이의 값을 가지며
  • 1은 완전한 양의 선형 관계
  • -1은 완전한 음의 선형 관계
  • 0은 선형 관계가 없음을 의미

2) 피어슨 상관계수는 언제 사용할까?

-> 선형적인 관계가 예상 될 때

* 비선형 관계에선 사용할 수 없음

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr

# 예시 데이터 생성
np.random.seed(0)

# np.random.rand(100) : 0~1 사이의 소수 100개 생성
study_hours = np.random.rand(100) * 10
exam_scores = 3 * study_hours + np.random.randn(100) * 5

# 데이터프레임 생성
df = pd.DataFrame({'Study Hours': study_hours, 'Exam Scores': exam_scores})

# 피어슨 상관계수 계산
pearson_corr, _ = pearsonr(df['Study Hours'], df['Exam Scores'])
print(f"피어슨 상관계수: {pearson_corr}")

# 상관관계 히트맵 시각화

# annot =True : 히트맵마다 상관계수 출력, cmap='' : 히트맵 색상 지정, vmin & vmax : 히트맵 범위 설정 
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('pearson coefficient heatmap')
plt.show()

 

+++++ np.random.seed() 와 np.random.rand()의 차이점      (+ 재현성 확보)

Numpy Seed 설정 (np.random.seed(0), np.random.seed(42)) — Y초보프로그래머

 

 

 

5.2 비모수 상관계수                     # 데이터가 정규분포를 따르지 않을 때 사용하는 상관계수!

1) 비모수 상관계수란 무엇일까?

 

  • 두 번째 그래프가 스피어만 상관계수 그림!
    • 초록색 점들로 나타내었으며, X와 Y의 순위 관계를 보여줍니다.
    • 스피어만 상관계수는 두 변수의 순위 간의 상관 관계를 측정합니다.
    • 값은 -1에서 1 사이로 해석됩니다.
  • 세 번째 그래프가 켄달의 타우 비선형 상관계수
    • 빨간색 점들로 나타내었으며, X와 Y의 비선형 관계를 보여줍니다.
    • 켄달의 타우는 두 변수 간의 순위 일관성을 측정합니다. 비선형 관계를 탐지하는 데 유용합니다.

☑️ 비모수 상관계수

  • 데이터가 정규분포를 따르지 않거나 변수들이 순서형 데이터일 때 사용하는 상관계수
  • 데이터의 분포에 대한 가정 없이 두 변수 간의 상관관계를 측정할 때 사용
  • 대표적으로 스피어만 상관계수와 켄달의 타우 상관계수가 있음

가. 스피어만 상관계수

  • 두 변수의 순위 간의 일관성을 측정
  • 켄달의 타우 상관계수 보다 데이터 내 편차와 에러에 민감

나. 켄달의 타우 상관계수

  • 순위 간의 일치 쌍 및 불일치 쌍의 비율을 바탕으로 계산
  • ex) 예를들어 사람의 키와 몸무게에 대해 상관계수를 알고자 할 때 키가 크고 몸무게도 더 나가면 일치 쌍에 해당, 키가 크지만 몸무게가 더 적으면 불일치 쌍에 해당 이들의 개수 비율로 상관계수를 결정

2) 비모수 상관계수는 언제 사용할까?

☑️ 데이터의 분포에 대한 가정을 하지 못할 때

☑️ 순서형 데이터에서도 사용하고 싶을 때

 

from scipy.stats import spearmanr, kendalltau

# 예시 데이터 생성
np.random.seed(0)
customer_satisfaction = np.random.rand(100)
repurchase_intent = 3 * customer_satisfaction + np.random.randn(100) * 0.5

# 데이터프레임 생성
df = pd.DataFrame({'Customer Satisfaction': customer_satisfaction, 'Repurchase Intent': repurchase_intent})

# 스피어만 상관계수 계산
spearman_corr, _ = spearmanr(df['Customer Satisfaction'], df['Repurchase Intent'])
print(f"스피어만 상관계수: {spearman_corr}")

# 켄달의 타우 상관계수 계산
kendall_corr, _ = kendalltau(df['Customer Satisfaction'], df['Repurchase Intent'])
print(f"켄달의 타우 상관계수: {kendall_corr}")

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(method='spearman'), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('spearman coefficient heatmap')
plt.show()

 

 

5.3 상호정보 상관계수                           # 상호정보를 이용한 변수끼리의 상관계수 계산!

1) 상호정보 상관계수란 무엇일까?

 

가. 상호정보 상관계수 (Mutual Information Coefficient)

  • 두 변수 간의 상호 정보를 측정
  • 변수 간의 정보 의존성을 바탕으로 비선형 관계를 탐지
  • 서로의 정보에 대한 불확실성을 줄이는 정도를 바탕으로 계산
  • 범주형 데이터에 대해서도 적용 가능 = (str, str) 가능
  • 상호정보 상관계수를 그림으로 확인해보기
    • 보라색 점들은 X와 Y 간의 비선형 관계를 나타냄
    • 상호 정보 값은 0.90으로 표시되어 있으며, 이는 두 변수 간의 강한 비선형 의존성을 의미

 

2) 상호정보 상관계수는 언제 사용할까?

  • ☑️ 비선형적이고 복잡한 관계를 탐지하고자 할 때
  • ☑️ 두 변수가 범주형 변수일 때

import numpy as np
from sklearn.metrics import mutual_info_score

# 범주형 예제 데이터
X = np.array(['cat', 'dog', 'cat', 'cat', 'dog', 'dog', 'cat', 'dog', 'dog', 'cat'])
Y = np.array(['high', 'low', 'high', 'high', 'low', 'low', 'high', 'low', 'low', 'high'])

# 상호 정보량 계산
mi = mutual_info_score(X, Y)
print(f"Mutual Information (categorical): {mi}")

 

++++++라이브러리 설치 뭣~!!!!!!!!같네!! 끝

 

5.4 연습문제

  1. 피어슨 상관계수(Pearson correlation coefficient)의 의미를 설명하세요.
    1. 두 변수 간의 비선형 관계를 측정한다.
    2. 두 변수 간의 선형 관계를 측정한다.
    3. 두 변수 간의 독립성을 측정한다.
    4. 두 변수 간의 비모수 관계를 측정한다.

2번 (정답)

  1. 비모수 상관계수(non-parametric correlation coefficient)의 대표적인 예로 옳지 않은 것을 고르세요.
    1. 피어슨 상관계수
    2. 스피어만 상관계수
    3. 켄달의 타우 상관계수
    4. 정답 없음

1번, 4번 (오답)

4번 '정답 없음'이 비모수 상관계수의 예시로 들만한 상관계수 자체가 없다는 소리냐? 뭔 개소리야 ㅡㅡ

gpt도 개소리라네 이런

  1. 상호정보(Mutual Information) 상관계수의 의미를 설명하는 것을 모두 고르세요.
    1. 두 변수 간의 선형 관계를 측정한다.
    2. 두 변수 간의 비선형 관계를 측정한다.
    3. 두 변수 간의 상호 정보를 측정한다.
    4. 두 변수 간의 독립성을 측정한다.

3번(오답)

2번, 3번 

상호정보 상관계수는 두 변수 간의 비선형 관계를 측정하며, 상호 정보를 통해 두 변수 간의 상관성을 평가합니다.

 

 

통계학 6주차 

[수업 목표]

★ 가설검정의 다양한 주의점에 대해 이해한다

재현 가능성

p-해킹

선택적 보고

자료수집 중단 시점 결정

데이터 탐색과 검증 분리

★ 이러한 주의점들을 참고하여 가설검정을 진행할 수 있다

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

6.1 재현 가능성        # 우연히 결과가 나오는 것이 아닌, 항상 일관된 결과가 나오는지 확인해야 합니다!

1) 재현가능성이란 무엇인가?

 

☑️ 재현 가능성

  • 동일한 연구나 실험을 반복했을 때 일관된 결과가 나오는지 여부. 연구의 신뢰성을 높이는 중요한 요소
  • ex) 신약을 개발할 때 실험실에서만 효과가 있는 것이 아니라 실제 상황에서도 일관된 결과가 나온다고 믿을 수 있기 때문에 개발 가능한 것
  • 최근 p값에 대한 논쟁이 두드러지고 있음
    • p값을 사용하지 않는 것이 좋다
    • 유의수준을 0.05에서 변경하는 것이 좋다
  • 가설검정 원리상의 문제나 가설검정의 잘못된 사용이 낮은 재현성으로 이어진다는 문제 발생
  • 최근 논문을 다시 재현해서 실험을 해보는데 똑같은 결과가 않나오는 사례가 많은… 재현성 위기가 문제가 되고 있음

☑️ 중요성

  • 결과가 재현되지 않는다면 해당 가설의 신뢰도가 떨어짐

 

2) 재현성 위기의 원인은 무엇인가~?

☑️ 실험 조건을 동일하게 조성하기 어려움

  • 완전 동일하게 다시 똑같은 실험을 수행하는 것이 쉽지 않음
  • 또한 가설검정 자체도 100% 검정력을 가진 것이 아니기 때문에 오차가 나타날 수 있음

☑️ 가설검정 사용방법에 있어서 잘못됨

  • p값이 0.05가 유도되게끔 조작하는 것이 가능 (p해킹)
  • 실제로는 통계적으로 아무 의미가 없음에도 의미가 있다고 해버리는 1종 오류를 저지를 수 있음
  • 0.05라는 것은 100번 중에 5번 즉, 20번 중에 1번은 귀무가설이 옳음에도 불구하고 기각될 수 있음
  • 유의수준으로 통제하는 것이 중요
  • 하지만, 유의수준을 너무 낮추면 베타값이 커져버리는 문제 발생…
  • 따라서, 어떤 논문에서는 유의수준을 0.005로 설정하면서 데이터 수를 70% 더 늘려서 베타 값도 컨트롤 하는 방향을 제안하기도 함
  • 잘못된 가설을 세우더라도 우연히 0.05보다 낮아서 가설이 맞는것처럼 보일 수도 있음. 따라서 가능한 좋은 가설을 세우는 것도 중요

 

6.2 p-해킹          # 인위적으로 p-값을 낮추지 않을 수 있도록 조심해야 합니다!

1) p-해킹이란 무엇인가?

 

☑️ p-해킹

  • 데이터 분석을 반복하여 p-값을 인위적으로 낮추는 행위
  • 유의미한 결과를 얻기 위해 다양한 변수를 시도하거나, 데이터를 계속해서 분석하는 등의 방법을 포함

☑️ 문제점

  • p-해킹은 데이터 분석 결과의 신뢰성을 저하시킴

2) p-해킹은 언제 조심해야하는가?

 

☑️ 여러 가설 검정을 시도 할 때

  • 여러 가설 검정을 시도하여 유의미한 p-값을 얻을 때까지 반복 분석하는 것을 조심
  • p-해킹은 유의미한 결과를 얻기 위해 p-값이 0.05 이하인 결과만 선택적으로 보고하는 행위를 조심
  • 데이터의 수를 늘리다보니 특정 데이터 수를 기록할때 잠깐 p값이 0.05 이하를 기록함으로 이를 바탕으로 대립가설 채택하는 것을 조심
  • 즉, 결과를 보며 데이터 개수를 늘려서는 안됨
  • 다양한 상황 중에서 p값이 유리하게 나오는 상황만 선별적으로 보고하는 것을 조심
  • 다양한 변수를 건드리며 유리한 결과가 나올 때 다시 처음 부터 가설을 그 결과에 맞게 세우는 것
  • 즉, 마음에 드는 상황만 골라서 보고해서도 안됨. 모든 결과를 다보고하거나 더 엄격한 추가실 험을 수행
  • 가능한 가설을 미리 세우고 검증하는 가설검증형 방식으로 분석을 해야 하며 만약 탐색적으로 분석한 경우 가능한 모든 변수를 보고하고 본페로니 보정과 같은 방법을 사용해야 함

 

6.3 선택적 보고                       # 말 그대로 선택적으로 보고하는 것!

1) 선택적 보고란 무엇인가?

 

☑️ 선택적 보고

  • 유의미한 결과만을 보고하고, 유의미하지 않은 결과는 보고하지 않는 행위
  • 이는 데이터 분석의 결과를 왜곡하고, 신뢰성을 저하시킴

  • 모든 결과와 선택적으로 보고된 결과를 히스토그램으로 나타냄
  • 전체 결과와 보고된 결과의 분포가 다르면 선택적 보고의 가능성을 시사

2) 선택적 보고는 언제 조심해야하는가?

☑️ 유의미한 결과만 공개 할 때

  • 다수의 데이터 분석 중 유의미한 결과가 나온 실험만을 보고서에 작성하여 발표

☑️ 결과를 보면서 가설을 다시 새로 설정했는데 마치 처음부터 설정한 가설이라고 얘기할 때

  • 미리 가설과 실험 방법등에 대해서 설정을 한다음 연구를 수행하거나 연구하는 동안 얻어진 모든 변수와 결과에 대해서 공개하지 못할 때

6.4 자료수집 중단 시점 결정        # 원하는 결과가 나올 때 까지 자료를 수집하는 것을 조심!   

1) 자료수집 중단 시점 결정이란 무엇인가?

 

☑️ 자료수집 중단 시점 결정

  • 데이터 수집을 시작하기 전에 언제 수집을 중단할지 명확하게 결정하지 않으면, 원하는 결과가 나올 때까지 데이터를 계속 수집할 수 있음. 이는 결과의 신뢰성을 떨어뜨림.

  • 샘플 크기에 따른 평균값과 95% 신뢰구간을 나타낸 그래프
  • 데이터 수집을 언제 멈출지 결정하는 것은 결과에 영향을 미칠 수 있음
  • 이상적으로는 사전에 정해진 계획에 따라야 함

 

2)자료수집 중단 시점은 언제 조심해야하는가?

 

☑️ 결과를 이미 정해놓고 그에 맞추기 위해 자료수집을 하고자 할 때

  • 50명의 데이터를 수집하기로 했으나, 원하는 결과가 나오지 않자 100명까지 추가로 수집

# 데이터 수집 예시
np.random.seed(42)
data = np.random.normal(0, 1, 1000)
sample_sizes = [10, 20, 30, 40, 50, 100, 200, 300, 400, 500]
p_values = []

for size in sample_sizes:

# np.random.choice(data, size, replace=True, p=None)

# : data 배열에서 무작위로 size만큼의 샘플을 뽑는 NumPy 함수, 데이터 중복의 허용 여부 설정 가능

# p :  각 요소가 선택될 확률을 설정할 수 있는 배열입니다. 기본값은 None, 이 경우 각 항목은 균등 확률로 선택  
    sample = np.random.choice(data, size)
    _, p_value = stats.ttest_1samp(sample, 0)
    p_values.append(p_value)

# p-값 시각화
plt.plot(sample_sizes, p_values, marker='o')
plt.axhline(y=0.05, color='red', linestyle='dashed', linewidth=1)
plt.title('자료수집 중단 시점에 따른 p-값 변화')
plt.xlabel('샘플 크기')
plt.ylabel('p-값')
plt.show()

 

 

6.5 데이터 탐색과 검증 분리       # 검증하기 위한 데이터는 반드시 따로 분리 해놓아야 함!

1) 데이터 탐색과 검증 분리란 무엇인가?

 

☑️ 데이터 탐색과 검증 분리

  • 데이터 탐색을 통해 가설을 설정하고, 이를 검증하기 위해 별도의 독립된 데이터셋을 사용하는 것
  • 이는 데이터 과적합을 방지하고 결과의 신뢰성을 높임

  • 탐색 데이터와 검증 데이터를 히스토그램으로 나타냄
  • 데이터 탐색과 검증을 분리하면 탐색 과정에서 발견된 패턴이 검증 데이터에서도 유효한지 확인 가능
  • 검증 데이터는 철저하게 탐색 데이터와 구분되어져야 함

 

2)데이터 탐색과 검증 분리는 언제 사용해야하는가?

 

☑️ 검증하기 위한 데이터가 따로 필요할 때

  • 데이터셋을 탐색용(training)과 검증용(test)으로 분리하여 사용 (현업에서는 탐색용,  검증용, 결과용? 세가지 씀)

from sklearn.model_selection import train_test_split

# 데이터 생성
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 데이터 분할 (탐색용 80%, 검증용 20%)
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_train_pred = model.predict(X_train)

# 검증용 데이터로 예측
y_test_pred = model.predict(X_test)

# 탐색용 데이터 평가
train_mse = mean_squared_error(y_train, y_train_pred)
train_r2 = r2_score(y_train, y_train_pred)
print(f"탐색용 데이터 - MSE: {train_mse}, R2: {train_r2}")

# 검증용 데이터 평가
test_mse = mean_squared_error(y_test, y_test_pred)
test_r2 = r2_score(y_test, y_test_pred)
print(f"검증용 데이터 - MSE: {test_mse}, R2: {test_r2}")

 

++++ 뭐라는지 모르겠다 그냥 머신 러닝 배울 때 복습하자

 

 

6.6 추가로 통계학을 공부하기 위하여      

 

6.7 연습문제

  1. 재현 가능성(reproducibility)에 대한 설명으로 옳은 것을 고르세요.
    1. 재현 가능성은 동일한 연구자가 동일한 실험을 여러 번 수행하여 동일한 결과를 얻는 것을 의미한다.
    2. 재현 가능성은 다른 연구자가 동일한 실험 절차를 따라 실험을 수행하여 동일한 결과를 얻는 것을 의미한다.
    3. 재현 가능성은 데이터 분석 과정에서 발생하는 오류를 줄이기 위한 방법이다.
    4. 재현 가능성은 통계 분석의 정확성을 평가하는 기준이다.

2번 (정답) + 신뢰성 높이는 요소

  1. p-해킹(p-hacking)의 정의에 가장 가까운 것을 고르세요.
    1. 통계 분석에서 발생하는 오류를 수정하는 과정
    2. 연구자가 원하는 결과를 얻기 위해 데이터를 반복적으로 분석하고 p-value를 조작하는 행위
    3. 데이터를 시각화하여 결과를 해석하는 과정
    4. 데이터를 수집하고 분석하는 표준 절차

2번 (정답) + 신뢰성 저해 요소

  1. 선택적 보고(selective reporting)이 문제인 이유로 가장 적절한 것을 고르세요.
    1. 연구자가 모든 데이터를 수집하지 못할 수 있다.
    2. 연구자가 연구 결과를 왜곡하여 보고할 수 있다.
    3. 연구자가 데이터를 분석하는 방법을 모를 수 있다.
    4. 연구자가 통계적 방법을 사용할 수 없다.

2번 (정답)

  1. 자료수집 중단 시점을 결정할 때 발생할 수 있는 문제는 무엇인가요?
    1. 데이터 수집 비용이 증가한다.
    2. 데이터의 신뢰도가 높아진다.
    3. 연구자의 편향이 결과에 영향을 미칠 수 있다.
    4. 데이터의 다양성이 감소한다.

3번 (정답)

자료수집 중단 시점을 연구자가 임의로 결정할 경우, 연구자의 편향이 결과에 영향을 미칠 수 있습니다. 이는 연구의 신뢰성을 떨어뜨릴 수 있습니다.

  1. 데이터 탐색(exploration)과 검증(validation)을 분리하는 이유로 가장 적절한 것을 고르세요.
    1. 데이터 탐색과 검증을 분리하면 데이터 분석 과정이 단순해진다.
    2. 데이터 탐색과 검증을 분리하면 데이터 분석 과정에서 발생하는 오류를 줄일 수 있다.
    3. 데이터 탐색과 검증을 분리하면 과적합(overfitting)을 방지하고 모델의 일반화 성능을 높일 수 있다.
    4. 데이터 탐색과 검증을 분리하면 데이터 수집 비용을 절감할 수 있다.

2번(오답)

3번

데이터 탐색과 검증을 분리하면 과적합을 방지하고, 모델이 새로운 데이터에 대해 얼마나 잘 일반화될 수 있는지를 평가할 수 있습니다.

 

++++++++

 

과적합 (overfitting) : 머신러닝에서 모델이 훈련 데이터에 너무 잘 맞아 훈련 데이터의 특정 패턴을 과도하게 학습하는 현상

이는 모델이 훈련 데이터에 포함되지 않은 노이즈나 세부적인 특성까지 학습하는 경우에 발생하며, 결과적으로 모델이 새로운 데이터에 대해서는 잘 작동하지 않는 문제가 발생

 

++++++++++++++

 

과적합이 발생하는 이유:

  1. 모델 복잡성:
    • 모델이 너무 복잡하거나 매개변수가 많을 때, 훈련 데이터의 작은 변동까지 학습할 수 있습니다.
    • 예를 들어, 너무 많은 다항식 차수를 가진 회귀 모델이나, 너무 깊은 결정 트리 등이 이에 해당합니다.
  2. 훈련 데이터 부족:
    • 훈련 데이터가 충분하지 않으면 모델은 그 데이터에 존재하는 특이한 패턴을 지나치게 학습하고, 일반화하기 어려운 상황이 됩니다.
  3. 훈련 데이터에 노이즈 포함:
    • 훈련 데이터에 우연적인 오류나 잡음(noise)가 많을 경우, 모델은 이런 잡음까지 학습하게 되어 일반화 성능이 떨어집니다.

과적합의 결과:

  • 훈련 데이터에 대한 성능은 매우 우수하지만, 새로운 검증 데이터나 테스트 데이터에 대한 성능이 떨어지는 문제가 발생합니다.
  • 모델이 새로운 데이터에 대해 예측을 잘 못 한다는 것은 결국 모델이 훈련 데이터에만 맞춰져 있고, 일반화되지 않았기 때문입니다.

과적합을 방지하기 위한 방법:

  1. 데이터를 분리하여 평가:
    • 훈련 데이터(training data), 검증 데이터(validation data), 테스트 데이터(test data)로 나누어, 모델이 검증 데이터에 대해 얼마나 잘 일반화되는지 확인합니다. 훈련 데이터에 너무 잘 맞추는 것을 방지할 수 있습니다.
  2. 모델 단순화:
    • 모델이 너무 복잡하지 않도록 매개변수를 조정하거나, 모델의 복잡성을 줄이는 방법입니다. 예를 들어, 선형 회귀 모델의 경우 다항식 차수를 낮추는 것이 이에 해당합니다.
  3. 정규화(Regularization):
    • 모델의 복잡도를 제어하기 위해 정규화 기법을 사용할 수 있습니다. L1 정규화(Lasso), L2 정규화(Ridge) 등의 기법은 모델의 가중치가 너무 커지지 않도록 제한을 둡니다.
  4. 교차 검증(Cross-validation):
    • 모델을 여러 번 학습하고 평가하여, 훈련 데이터에 과도하게 적합되지 않도록 합니다. **k-겹 교차 검증(k-fold cross-validation)**은 훈련 데이터를 여러 개의 부분으로 나누고, 각 부분을 검증 데이터로 사용하여 모델을 평가하는 기법입니다.
  5. 더 많은 데이터 사용:
    • 훈련 데이터를 더 많이 사용하면 모델이 훈련 데이터의 특정 특성에만 과도하게 맞추는 문제를 줄일 수 있습니다. 특히 훈련 데이터가 적을수록 과적합이 발생할 확률이 높습니다.
  6. 드롭아웃(Dropout):
    • **신경망(Neural Networks)**에서 사용되는 기법으로, 학습 중 일부 뉴런을 임의로 제거하여 과적합을 방지합니다.

예시:

  • 과적합된 모델:
    • 예를 들어, 훈련 데이터에 너무 많은 특성(예: 매우 높은 차수의 다항식)을 사용하여 모델을 학습시키면, 훈련 데이터에서는 예측이 매우 정확하지만, 검증 데이터에 대해서는 성능이 떨어지는 경우입니다.
  • 일반화된 모델:
    • 적절한 모델 복잡도를 유지하고, 훈련 데이터의 일반적인 패턴을 학습한 모델은 검증 데이터에서도 잘 작동하며, 새로운 데이터에도 잘 예측할 수 있습니다.

과적합과 관련된 문구 해석:

"데이터 탐색과 검증을 분리하면 과적합을 방지하고, 모델이 새로운 데이터에 대해 얼마나 잘 일반화될 수 있는지를 평가할 수 있습니다."

  • 데이터 탐색(Training): 모델이 훈련 데이터에서 패턴을 학습하는 과정입니다.
  • 데이터 검증(Validation): 훈련 데이터와는 별도로, 모델이 새로운 데이터에 대해 얼마나 잘 일반화되는지 평가하는 과정입니다. 이때 과적합을 확인할 수 있습니다.
  • 과적합 방지: 모델이 훈련 데이터에만 맞춰지지 않도록, 검증 데이터로 모델의 성능을 평가하고, 과적합을 피할 수 있습니다.

따라서 훈련 데이터에서만 모델이 너무 잘 맞추면 과적합이 발생할 수 있고, 검증 데이터를 사용하여 과적합을 방지하는 것이 중요합니다.

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

아티클 스터디

6시그마란?_ 개념, 등장 배경, 사례 등

 

6시그마란?_ 개념, 등장 배경, 사례 등

오늘날 품질은 기업에서 필수적인 요소가 되었다. 이는 제품을 잘 만드는 일뿐 아니라 서비스를 포함한 기업 전반적인 활동 곳곳에서 잘 관리해야 하는 요소로서 품질 경영이라는 경영적 측면

drinksoju.tistory.com

요약: 

6시그마가 뭔지

 

주요 포인트:

6시그마의 개념과 주요 방법론, ICT에서의 활용과 그 사례, 품질관리기법

 

 

시그마( σ ): 

통계학 - 오차 범위, 표준 편차

경영학 - 제품의 불량률

1 시그마 = 68% 합격

3 시그마 = 99.7% 합격

6 시그마 = 99.99966% 합격

 

6시그마: 제품 100만 개당(ppm) 2개 이하의 결함을 목표로 하는 것으로 거의 무결점 수준의 품질을 추구

*정규 분포에서 평균을 중심으로 양품의 수를 6배의 표준편차 이내에서 생산할 수 있는 공정의 능력 정령화 한 것

 

6시그마 방법론 - DMAIC, DMADOV

DMAIC - 현재 존재하는 프로세스나 제품의 결함을 획기적으로 개선하기 위한 방법론

DMADOV - 신제품을 설계하거나 현재 존재하지 않는 새로운 프로세스를 처음부터 6시그마 수준으로 설계하기 위한 방법론

문제 정의 단계 - 품질 혁신이 필요한 문제를 파악

측정 단계 - 현재의 품질 수준(Y)을 파악하고 이 수준에 이르게 하는 잠재적 원인 변수(X)를 찾는다

분석 단계 - 수집된 데이터를 근거로 문제의 근본 원인인 핵심 인자를 찾는다

개선 단계 - 프로세스 개선안과 문제 해결책을 찾아 시행

관리 단계 - 개선 결과를 문서화하고 이를 토대로 지속적인 피드백을 시행할 계획 수립

 

6시그마와 ICT의 활용

* ICT(Information and Communication Technology)

ICT가 6시그마 도입의 촉매제가 되고 있는 이유

1) 기업이 정보 시스템을 도입 / 설계 단계에서부터 업무 프로세스를 정의하고 이를 표준화해 시스템에 반영

2) ERP(Enterprise Resources Planning, 전사적 자원 관리) 등 기업 정보 시스템에 축적된 기업 내의 많은 업무 처리 내용이나 거래 데이터(Transaction data)는 6시그마를 적용할 때 필요한 결함 정의와 측정 문제를 상당 부분 해결해줌

3) 정보 시스템 도입 결과 업무 표준화가 이루어지면 프로세스 관리가 가능

 

6시그마 사례

한국철도공사 2000년 도입

목적 : 글로벌 디지털 환경에서 경쟁력을 확보하고자 고객 만족 및 고객 중심 프로세스 개선

결과 : 2003년 278건에 1309억 원의 개선 효과

 

6시그마와 전통적 품질관리기법

기존 QC, TQC(전사적 품질관리), TQM(전사적 품질경영)으로 오류가 발생한 지점에 국한된 부분 최적화 위주

-> 6시그마는 사업 전체의 프로세스, 즉 기업활동의 모든 요소를 분석 및 평가

 

 

핵심 개념:

6시그마의 개념과 주요 방법론, ICT에서의 활용과 그 사례, 품질관리기법, 추친 조직

 

용어 정리:

ICT(Information and Communication Technology): 정보 기술(IT)과 통신 기술(CT)을 통합한 개념으로, 데이터를 수집, 처리, 저장, 전송 및 활용하는 기술적 수단을 포함 이는 컴퓨터, 인터넷, 전화, 방송, 위성 통신 등 다양한 기술을 포함함

 

ERP(Enterprise Resources Planning, 전사적 자원 관리): 기업의 주요 자원을 효율적으로 관리하고, 기업 내의 다양한 기능을 통합하여 업무의 효율성을 극대화하는 소프트웨어 시스템 

목적 - 정보 통합, 업무 효율화, 의사결정 지원, 비용 절감

 

TPM(Total Productive Maintenance): 제조업체나 생산 시설에서 기계와 장비의 효율성을 극대화하고, 다운타임(고장 및 유지보수 시간)을 최소화하는 데 초점을 맞춘 관리 방식

목적 - 자주적 유지보수, 예방 유지보수, 품질 관리, 설비 개조, 교육 및 훈련, 기계 설계 개선, 위험 관리, 행정 관리

 

3P 전략(People Innovation, Process Innovation, Product Innovation): 사람, 경영,상품의 혁신

 

KMS(Knowledge Management System, 지식 관리 시스템) : 조직 내에서 지식의 생성, 저장, 공유, 활용을 효율적으로 관리하기 위한 시스템

목적 - 지식의 관리 및 통합, 지식 공유, 지식 활용, 경쟁력 강화

 

(선택) 실무 적용 사례

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

코트카타

코딩테스트 연습 - 서울에서 김서방 찾기 | 프로그래머스 스쿨

생각 : for문 써서 반복값 i 돌렸을 때 "Kim"이 걸리는 순간의 i값 뽑아서 같이 출력 

 

 

def solution(seoul):
    for i in range(0,len(seoul)):
        if seoul[i] == "Kim":
            Kim = print(f'김서방은 {len(seoul[i])}에 있다')
    return Kim

오답 : len(seoul[i])값이 3으로 고정된다 -> str 길이 3만 출력되는거 애초에 명령어 할당 제대로 못함 !! 

일단 seoul[i] 값을 변수로 할당해봐야겠다, 명령어 수정하자~

 

 

def solution(seoul):
    for i in range(0,len(seoul)):
        if seoul[i] == "Kim":
            loc = seoul.index('Kim')
            Kim = print(f'김서방은 {loc}에 있다')
    return Kim

오답 "김서방은 1에 있다" 이게 나와야 하는데 김서방은 1에 있다 가 출력되서

 

def solution(seoul):
    for i in range(0,len(seoul)):
        if seoul[i] == "Kim":
            loc = seoul.index('Kim')
            Kim = print(f'"김서방은 {loc}에 있다"')
    return Kim

오답 : null 값이 기댓값과 다르다라 .. 아 null을 값으로 출력해야하나? 흠 뭐지 일단 print를 없애고 출력되는 법을 찾아야함

 

def solution(seoul):
    for i in range(0,len(seoul)):
        if seoul[i] == "Kim":
            loc = seoul.index('Kim')            
    return f'김서방은 {loc}에 있다'

정답 : 그냥 print 지워버리고 return 값에 바로 띄어버리니까 되네 것다가 ' " 샬라샬라 " '  안해도 되네 흠

 

 

다른사람 풀이

def findKim(seoul):
    # 함수를 완성하세요

    return "김서방은 {}에 있다".format(seoul.index('Kim'))

 

이걸 또 줄일 생각은 못했는데 f-스트링 이였나? 캄프리헨션? 이거 이거 더 파야하는구나

 

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열 | 프로그래머스 스쿨

일단 arr 오름차순 정렬부터 시켜주고 arr for문 돌려서 divisor 이랑 나누어서 나머지 없을때 출력하는 형식 만들고 

출력되는 대로 return 에 넣어주면 끝 

 

오답

 

또 오답 

 

 

  • arr.sort()의 반환값: arr.sort()는 원본 리스트를 정렬하는 메서드지만, 정렬된 리스트를 반환하지 않기 때문에 tmp:arr = arr.sort()는 올바른 문법이 아닙니다. 정렬된 리스트를 얻으려면 arr.sort()를 호출한 후, arr를 그대로 사용해야 합니다.
  • answer += arr[i]: 이 부분에서 arr[i]를 리스트에 추가하려면 answer.append(arr[i])를 사용하는 것이 더 직관적입니다. += 연산자는 리스트를 이어붙일 때 사용됩니다.
  • if len(answer) == 0: 조건: if len(answer) == 0:는 answer가 비어있을 때를 확인하려는 의도로 보이지만, 이 조건 아래에 answer == -1을 써놓은 것은 잘못된 코드입니다. answer == -1은 answer 리스트와 -1을 비교하는 코드로, 원하는 동작이 아닙니다. 비어 있으면 answer에 -1을 추가해야 합니다.
def solution(arr, divisor):
    answer = []
    arr.sort()
    for i in range(len(arr)):
        if arr[i] % divisor == 0:
            answer.append(arr[i])
    if len(answer) == 0:
        answer == -1            
    return answer

오답

 

def solution(arr, divisor):
    answer = []
    arr.sort()
    for i in range(len(arr)):
        if arr[i] % divisor == 0:
            answer.append(arr[i])

    if len(answer) == 0:
        return [-1]          
    return answer

 

다른 사람 풀이

 

def solution(arr, divisor): return sorted([n for n in arr if n%divisor == 0]) or [-1]

 

또 합쳤네? 개미쳤네 그냥 ;;;;; or 를 쓸 수도 있구나 몇가지를 섞어 쓴건지 어우 ;;