카테고리 없음

06.17 기초 통계학

tundercloud 2026. 6. 17. 17:54

🤖 Atani

필터 (Filter) 하이라이트 (Highlight)
조건에 부합하지 않는 데이터를 시각화 대상에서 완전히 배제하여 처리할 데이터 셋의 크기를 줄임 데이터를 그대로 유지한 채 특정 항목의 시각적 속성(색상 등)을 돋보이게 함

 

♣ 필터

- 사용자가 데이터를 선택적으로 탐색하고 분석 기준을 조정할 수 있게 함.

- 관심 있는 정보에 집중하여 분석할 수 있도록 함.

→ 대량의 데이터 속에서 필요한 인사이트를 효율적으로 도출

 

♣ 파라미터

- 사용자가 데이터를 선택적으로 탐색하고 분석 기준을 조정할 수 있게 함.

- 계산식이나 필터에  활용되어 대시보드의 동적인 분석을 가능하게 함.

→ ex) 매출 목표값을 사용자가 입력하고 이를 기준으로 달성률을 계산

 

♣ 드릴다운

- 정보의 단계적 탐색을 가능하게 함.

 

♣ 인터랙티브 요소

- 사용자 경험 향상을 위해 필요한 만큼만 적절히 배치해야 함.

→ 과도하면? : 사용자에게 혼란을 주고 대시보드를 복잡하게 만들어 사용성을 저하시킴

- 직관적이고 간결한 구성으로 사용자가 쉽게 이해하고 조작할 수 있어야함.

- 변경 사항이 즉시 반영되어 사용자에게 명확한 피드백을 제공

- 의미 있는 초기값 설정으로 사용자가 처음 대시보드를 봤을 때 유용한 정보를 볼 수 있도록 함.


⌨️코드카타

 

♧ 신고 결과 받기

 

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다. 

유저 ID 유저가 신고한 ID 설명
"muzi" "frodo" "muzi"가 "frodo"를 신고했습니다.
"apeach" "frodo" "apeach"가 "frodo"를 신고했습니다.
"frodo" "neo" "frodo"가 "neo"를 신고했습니다.
"muzi" "neo"  "muzi"가 "neo"를 신고했습니다.
"apeach" "muzi" "apeach"가 "muzi"를 신고했습니다.

 

각 유저별로 신고당한 횟수는 다음과 같습니다.

유저 ID 신고당한 횟수
"muzi" 1
"frodo" 2
"apeach" 0
"neo" 2

 

위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.

유저 ID 유저가 신고한 ID 정지된 ID
"muzi" ["frodo", "neo"] ["frodo", "neo"]
"frodo" ["neo"] ["neo"]
"apeach" ["muzi", "frodo"] ["frodo"]
"neo" 없음 없음

 

따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 2 ≤ id_list의 길이 ≤ 1,000
    • 1 ≤ id_list의 원소 길이 ≤ 10
    • id_list 의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
    • id_list 에는 같은 아이디가 중복해서 들어있지 않습니다.
  • 1 ≤ report 의 길이 ≤ 200,000
    • 3 ≤ report 의 원소 길이 ≤ 21
    • report 의 원소는 "이용자id 신고한id"형태의 문자열입니다.
    • 예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다.
    • id는 알파벳 소문자로만 이루어져 있습니다.
    • 이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
    • 자기 자신을 신고하는 경우는 없습니다.
  • 1 ≤ k ≤ 200, k 는 자연수입니다.
  • return 하는 배열은 id_list 에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.

입출력 예

id_list report k result
["muzi", "frodo", "apeach", "neo"] ["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"] 2 [2, 1, 1, 0]
["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0, 0]

 

1. set() 으로 중복 신고 제거

2. 딕셔너리로 신고 횟수 저장

3. 딕셔너리 + 리스트로 누가 누구를 신고했는지 저장

def solution(id_list, report, k):

    # 같은 사람이 같은 사람을 여러 번 신고한 경우
    # 1번만 인정해야 하므로 set으로 중복 제거
    report = set(report)

    # 각 유저가 몇 번 신고당했는지 저장할 딕셔너리
    report_count = {}

    for user in id_list:
        report_count[user] = 0

    # 누가 누구를 신고했는지 저장할 딕셔너리
    report_dict = {}

    for user in id_list:
        report_dict[user] = []

    # 신고 정보 하나씩 확인
    for r in report:

        # "muzi frodo" → ["muzi", "frodo"]
        reporter, reported = r.split()

        # 신고당한 사람의 신고 횟수 +1
        report_count[reported] += 1

        # 신고한 사람 목록에 추가
        report_dict[reporter].append(reported)

    # 정지된 유저 저장
    banned = set()

    # 신고 횟수가 k 이상인 유저 찾기
    for user in report_count:

        if report_count[user] >= k:
            banned.add(user)

    # 최종 결과 저장
    answer = []

    # id_list 순서대로 확인
    for user in id_list:

        # 해당 유저가 받게 될 메일 수
        mail_count = 0

        # 그 유저가 신고한 사람들을 확인
        for reported_user in report_dict[user]:

            # 신고한 사람이 정지당했다면
            if reported_user in banned:
                mail_count += 1

        # 결과 저장
        answer.append(mail_count)

    return answer

♧ 최댓값과 최솟값

 

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

 

제한 조건 

● s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

 

입출력 예

s return
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"

 

1. 문자열을 공백 기준으로 나눈다.

2. 각 값을 정수(int)로 변환한다.

3. 최솟값 min() 을 구한다.

4. 최댓값 max() 를 구한다.

5. "(최솟값) (최댓값)" 형태의 문자열로 반환한다.

def solution(s):
    # 공백을 기준으로 문자열을 나누기
    # "1 2 3 4" -> ['1', '2', '3', '4']
    num_str = s.split()

    # 문자열로 되어 있는 숫자들을 정수(int)로 변환해서 저장할 리스트
    numbers = []

    # num_str의 각 원소를 하나씩 꺼내기
    for num in num_str:
        # 문자열을 정수로 변환 후 리스트에 추가
        numbers.append(int(num))

    # 리스트에서 최솟값 찾기
    min_num = min(numbers)

    # 리스트에서 최댓값 찾기
    max_num = max(numbers)

    # 문제에서 요구하는 형태인 "최솟값 최댓값" 문자열 만들기
    answer = str(min_num) + " " + str(max_num)

    # 결과 반환
    return answer

📊 통계학 기초

챕터 1

 

♣ 기술통계

데이터를 요약하고 설명

- 주로 평균, 중앙값, 분산, 표준편차 등을 사용한다.

→ 데이터를 특정 대표값으로 요약

 

표준편차 & 분산

- 데이터의 변동성을 측정하는 주요 척도

- 표준편차 = 분산의 제곱근 → 원래의 데이터 값과 동일한 단위로 변환

- 분산 : 데이터 값과 평균의 차이제곱하여 평균을 낸 값 → 제곱 단위로 표현됨.

 

♣ 추론통계

표본 데이터를 통해 모집단의 특성추정하고 가설을 검정

- 주로 신뢰구간, 가설검정 등을 사용한다.

- 데이터의 일부를 가지고 데이터 전체를 추정

 

신뢰구간

- 모집단의 평균이 특정 범위 내에 있을 것이라는 확률

→ 일반적으로 95% 신뢰구간이 사용됨 = 모집단 평균이 95% 확률로 이 구간 내에 있음을 의미함.

 

가설검정

- 모집단에 대한 가설을 검증하기 위해 사용됨.

귀무가설 (H0) 대립가설 (H1)
검증하고자 하는 가설이 틀렸음을 나타내는 기본 가설 (변화가 x, 효과가 x 등) 반대 가설로 주장하는 바를 나타냄 (변화가 O, 효과가 O 등)

p-value를 통해 귀무가설을 기각할지 여부를 결정한다.

 

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

데이터들이 서로 얼마나 다른지 확인

- 최빈값 (개수가 제일 많은 값)을 주로 사용한다.

- 파이그림막대 그래프가 대표적 방법

 

♣ 상관관계

데이터들끼리 서로 관련이 있는지 확인

- 상관계수는 두 변수 간의 관계를 측정

- 상관계수를 계산해서 -1이나 1에 가까워지면 강력한 상관관계를 가짐.

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

- 0에 가까울수록 상관관계가 없다.

 

💡인과관계 & 상관관계

상관관계 인과관계
두 변수 간의 관계 한 변수다른 변수에 미치는 영향

 

♣ 두 개 이상의 변수 탐색

여러 데이터들끼리 서로 관련이 있는지 확인

 

💡TV와 Sales가 높은 상관관계를 가지는 것을 알 수 있음. Sales과 Radio는 사실상 관계가 없다고 봐도 무방함.

 

챕터 2 (2-1 ~ 2-3)

 

♣ numpy.random.normal

함수는 정규분포를 따르는 난수를 생성함.

numpy.random.normal(loc=0.0, scale=1.0, size=None)

loc (float) : 정규분포의 평균 (기본값 : 0.0)

scale (float) : 정규분포의 표준편차 (기본값 : 1.0)

size (int 또는 tuple of ints) : 출력 배열의 크기 (기본값 : None, 즉 스칼라 값 반환)

 

♣numpy.random.choice

주어진 배열에서 임의로 샘플링하여 요소를 선택함.

지정된 배열에서 무작위로 선택된 요소를 변환하는 기능을 제공함.

numpy.random.choice(a, size=None, replace=True, p=None)

a (1-D array-like or int) : 샘플링할 원본 배열. 정수인 경우 np.arange(a) 와 동일하게 간주됨.

● size (int 또는 tuple of ints) : 출력 배열의 크기 (기본값: None, 즉 단일 값 반환)

replace(boolean) : 복원 추출 여부를 나타냅니다. True면 동일한 요소가 여러 번 선택될 수 있음 (기본값: True)

p (1-D array-like, optional): 각 요소가 선택될 확률. 배열의 합은 1이어야 함.

 

♣ 표본 오차 (Sampling Error)

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

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

- 표본이 모집단을 완벽하게 대표하지 못하기 때문에 발생함.

표본의 크기와 표본 추출 방법에 따라 달라질 수 있음.

표본의 크기 표본 추출 방법
표본의 크기가 클수록 표본오차는 줄어듬.
더 많은 데이터를 수집할수록 모집단을 더 잘 대표하게 됨.
무작위 추출 방법을 사용하면 표본오차를 줄일 수 있음.
모딘 모집단 요소가 선택될 동등한 기회를 가지게 해야 함.

모집단과 표본 분포

● 붉은색 점섬은 모집단의 평균

● 파란색 점선은 표본의 평균

● 모집단의 분포는 넓고, 표본 평균들의 분포는 좁아진다.

●  표본 크기가 커질수록 표본 평균모집단 평균에 더 가까워지는 경향

 

♣ 신뢰구간 (Confidence Interval)

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

● 계산법

신뢰구간 = 표본평균 ± z × 표준편차
# z : 선택된 신뢰수준에 해당하는 z-값이다.
# ex) 95% 신뢰구간의 z-값은 1.96이다.
# 일반적으로 95% 신뢰수준을 많이 사용한다.

신뢰구간 시각화

표본의 분포95% 신뢰구간을 보여줌.

파란색 점선표본의 평균을 나타내고, 녹색 점선95% 신뢰구간의 상한과 하한을 나타냄.

● 이 신뢰구간은 모집단의 평균을 포함할 것으로 예상되는 범위이다.

 

♣ 정규분포

● 종 모양의 대칭 분포로, 대부분의 데이터가 평균 주위에 몰려 있는 분포

평균을 중심으로 좌우 대칭이며, 평균에서 멀어질수록 데이터의 빈도가 감소함.

표준편차분포의 퍼짐을 나타냄.


🤓원리 탄탄 기초 통계 1회차

통계 지표 적절한 상황
Mean (평균) 값들이 고르게 분포됨 (정규 분포)
Median (중앙값) 이상치 (극단적인 값)가 있음
Mode (최빈값) 데이터가 범주형 (카테고리형)

 

개념 정의 특징
편차 (Deviation) 개별 값이 평균에서 얼마나 떨어져 있는가 개별 값이 평균에서 얼마나 떨어져 있는지에 대한 지표
분산 (Variance) 편차제곱하여 평균을 낸 값 데이터의 전체적인 퍼짐 정도 확인
표준편차 (Standard Deviation) 분산제곱근 데이터의 실제 변동성 해석
변동 계수 (Coefficient Variable ,CV) 표준편차평균으로 나눈 값 서로 다른 단위의 데이터 비교

 

♣ 사분위수 (Quartiles)

데이터를 4등분 했을 때 각각 25%, 50%, 75% 위치에 해당하는 값

 

♣ 사분위 범위 (Interquartile Range, IQR) 

Q3 - Q1, 주로 이상치 탐지에 활용

 

♣ 왜도 & 첨도

지표 의미 값의 해석
왜도 (Skewness) 분포의 좌우 비대칭성, 평균을 중심으로 좌우로 치우친 정도 양수(+) : 우측 꼬리 길음, right skew
0 : 대칭적 (정규분포와 유사)
음수(-) : 좌측 꼬리 길음, left skew
첨도 (Kurtosis) 분포의 뾰족한 정도, 데이터의 분포가 정규분포보다 뾰족한지 확인 (기본 값 3)
엑셀, 파이썬에서는 편의를 위해 0을 기준으로 계산
● 초과 첨도 양수(+) : 정규분포보다 뾰족함 (첨도 > 3)
● 초과 첨도 0 : 정규분퓨와 유사
(첨도 =3)
● 초과 첨도 음수(-) : 정규분포보다 평평함
(첨도 < 3)


🤓 머신러닝 오프닝 1회차

 

♣ 머신러닝

- 기계학습 또는 머신러닝은 기계가 학습할 수 있도록 하는 연구 분야

- 어떤 컴퓨터 프로그램이 특정 작업(T)에 대해 성능 지표(P)로 측정했을 때, 경험(E)을 통해 성능이 향상된다면, 그 프로그램은 학습한다고 말할 수 있다.

● QA/QC 관점

- 작업(T) : 제품 결함 탐지, 생산 공정 모니터링, 품질 평가 등

- 성능 지표(P) : 정확도, 정밀도, 재현율 등

- 경험(E) : 수집된 생산 데이터, 검사 기록, 공정 센서 데이터 등

 

- 딥 러닝 → 머신 러닝 → AI 순으로 개념의 범위가 넓어짐.

딥러닝 : 머신 러닝의 종류 중 하나로 인공 신경망을 이용해 거대한 데이터셋을 학습하는 방법

 

 종류

 

♣ 분류

- 분류는 지도학습의 한 종류로, 주어진 데이터를 여러 클래스하나로 분류하는 문제

ex) 이메일을 스팸과 비스팸으로 분류하는 문제나, 제품 품질의 불량과 정상으로 구분하는 문제

- 주로 로지스틱 회귀, 결정 트리, SVM 등을 사용

 

(a) 로지스틱 회귀

이름과 달리 이진 분류에 사용되는 선형 모델 (데이터가 두개의 카테고리로 분류되는 경우)

 

(b) 의사결정 트리 (Decision Tree)

데이터를 특정 기준에 따라 분할하여 트리 구조로 표현하는 모델. 해석이 쉽고 스무고개와 비슷함.

Index 날개 유무 비행 여부 지느러미 유무 정답
1번 데이터 있음 가능 없음
2번 데이터 없음 NULL 있음 돌고래

 

(c) 서포트 벡터 머신

클래스 간의 최적의 경계선 (결정 경계 (Decision Boundary))을 찾아 데이터를 분류

- 서포트 벡터 : 결정 경계에 가장 가까이에 위치한 선

- 마진 : 결정 경계선에서 가장 가까운 서포트 벡터까지의 거리

 

♣ 회귀

- 회귀는 연속적인 값을 예측하는 지도학습의 한 종류

ex) 집의 면적을 기준으로 가격을 예측하는 문제나, 시간에 따른 주식 가격 예측 등이 있음

- 출력은 연속적인 값이며, 선형 회귀, 다항 회귀, 랜덤 포레스트 회귀 등을 활용할 수 있습니다.

 

(a) 선형 회귀

데이터가 직선 형태로 분포한다고 가정하여 예측

간단하고 직관적이며, 관계를 설명하는데 적합. y = ax + b

ex) 집의 크기와 가격 관계를 예측

(b) 다항 회귀

데이터를 비선형적으로 모델링할 때 사용

ex) 곡선 형태로 변하는 데이터의 온도 변화 예측

 

(c) 랜덤 포레스트 회귀

여러개의 '결정 트리 (Decision Tree)'를 결합하여 연속적인 수치값을 예측하는 머신러닝 알고리즘

데이터의 비선형적인 패턴을 잘 학습하며, 예측 정확도가 매우 높음.

여러개의 트리가 서로 다른 데이터와 특성을 보고 학습하므로 노이즈나 이상치에 강하다

모델 예측 어떤 변수(특성)가 가장 큰 영향을 미쳤는지 파악하기 쉽다.