TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 - 수학 | 통계학>

[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.3)-2

by 기록자_Recordian 2024. 10. 7.
728x90
반응형
★ 시작에 앞서 

 

해당 내용은 '<현대통계학-제6판>, 다산출판사, 2024' 에 나와있는 챕터별 연습문제를 교재를 응용하여 풀이하고, 수학적인 문제에 대한 답변을 파이썬으로 구현해보기 위해 작성하는 글이다.

해당 답변을 구현하는 방식은 답안지 없이 필자가 스스로 구현하는 것이므로, 정확한 (혹은 가장 효과적인) 답변이 아닐 수 있다. 이 글의 목적은 통계학 공부와 파이썬 프로그래밍 언어 공부를 동시에 하고자 함이며, 통계학을 공부하고 싶으신 분들은 해당 교재를 구매하는 것을 추천한다.

또한, 연습문제 번호 및 문제 내용은 필자가 임의대로 작성하였으며, 교재와는 다를 수 있다.

 

잘못된 부분이 있다면 언제든 피드백 부탁 드립니다! 감사합니다


이전 내용
 

[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.3)-1

★ 시작에 앞서 ★ 해당 내용은 ', 다산출판사, 2024' 에 나와있는 챕터별 연습문제를 교재를 응용하여 풀이하고, 수학적인 문제에 대한 답변을 파이썬으로 구현해보기 위해 작성하는 글이다.해

puppy-foot-it.tistory.com


챕터3 주요 개념: 중심경향(최빈값, 중앙값, 산술평균), 분산도(분산, 표준편차), 비대칭도
챕터3 연습문제 7

 

Q. 학생 100명의 학기말 성적자료를 사용하여

1) 전체 성적의 평균과 표준 편차를 구하라

2) 등급의 수가 6개인 도수분포표를 만들고

3) 해당 도수분포표를 활용하여 평균과 표준편차를 구하여 각각 비교하라

 

해당 교재에는 학생 100명의 성적이 기재되어 있으나, 이를 일일이 입력하는 것은 효율적이지 못하므로, (왜냐하면 여기선 답보다는 방식이 중요하기 때문) 100명의 성적을 numpy random.ranint 함수를 이용하여 생성한 뒤, 이를 활용하여 문제를 푸는 방식으로 진행한다.

 

[random 함수 관련 보면 좋은 글]

 

NumPy 난수 생성 (Random 모듈) - Codetorial

예제1 - 기본 사용 import numpy as np a = np.random.randn(5) print(a) b = np.random.randn(2, 3) print(b) sigma, mu = 1.5, 2.0 c = sigma * np.random.randn(5) + mu print(c) [ 0.06704336 -0.48813686 0.4275107 -0.9015714 -1.30597604] [[ 0.87354043 0.03783

codetorial.net

 

 

[사전 작업 - 100명의 성적 생성 하기]

# 학생 100명의 기말 성적
import numpy as np

# 100명의 점수 난수로 만들기
students_scores = np.random.randint(50, 100, size=100)

print(students_scores)

 

[풀이1 - 전체 성적의 평균과 표준 편차]

# 학생 100명의 기말 성적 2
import numpy as np

# 100명의 성적
students_scores = [59, 66, 85, 66, 82, 87, 75, 64, 75, 99, 56, 66, 92, 79, 82, 65, 95, 50, 52, 85, 52, 60, 94, 95,
                    65, 67, 64, 94, 91, 97, 50, 98, 59, 58, 55, 75, 60, 66, 84, 95, 59, 62, 99, 52, 70, 89, 62, 62,
                    96, 65, 91, 70, 53, 75, 83, 99, 66, 51, 87, 63, 53, 51, 94, 87, 75, 97, 75, 83, 65, 76, 63, 89,
                    80, 75, 76, 76, 67, 96, 64, 73, 73, 69, 89, 81, 80, 98, 54, 84, 94, 91, 91, 58, 72, 89, 70, 61,
                    96, 66, 85, 72]

# 평균과 표준편차
mean = np.mean(students_scores)
std = np.std(students_scores)

print('평균:', mean)
print('표준편차:', std)

numpy를 이용하면 평균은 np.mean, 표준 편차는 np.std 를 통해 쉽게 값을 계산할 수 있다.

 

[풀이2 - 도수분포표 만들기]

# 학생 100명의 기말 성적 2
import numpy as np
import pandas as pd

# 100명의 성적
data = {
    "students_scores" :  [59, 66, 85, 66, 82, 87, 75, 64, 75, 99, 56, 66, 92, 79, 82, 65, 95, 50, 52, 85, 52, 60, 94, 95,
                    65, 67, 64, 94, 91, 97, 50, 98, 59, 58, 55, 75, 60, 66, 84, 95, 59, 62, 99, 52, 70, 89, 62, 62,
                    96, 65, 91, 70, 53, 75, 83, 99, 66, 51, 87, 63, 53, 51, 94, 87, 75, 97, 75, 83, 65, 76, 63, 89,
                    80, 75, 76, 76, 67, 96, 64, 73, 73, 69, 89, 81, 80, 98, 54, 84, 94, 91, 91, 58, 72, 89, 70, 61,
                    96, 66, 85, 72]
}

# 표 만들기
df = pd.DataFrame(data)

# 6개의 등급으로 나누기 (0~100 점 기준)
df['score_grade'] = pd.cut(df['students_scores'], bins=6)

# 각 등급별 인원 수 세고 열 생성하기
grade_counts = df['score_grade'].value_counts().sort_index()

# 도수분포표 만들기
frequency_table = pd.DataFrame({
    'score_grade': grade_counts.index, 
    'count': grade_counts.values
})

# 합계 행 추가하기
total_row = pd.DataFrame({
    "score_grade": ["Total"],
    "count": [grade_counts.sum()]
})

# 합계 행 도수분포표에 붙이기
frequency_table = pd.concat([frequency_table, total_row], ignore_index=True)

# 결과 출력
print(frequency_table)

 

[풀이3 -  평균과 표준편차를 구하여 각각 비교]

# 학생 100명의 기말 성적 2
import numpy as np
import pandas as pd

# 100명의 성적
data = {
    "students_scores" :  [59, 66, 85, 66, 82, 87, 75, 64, 75, 99, 56, 66, 92, 79, 82, 65, 95, 50, 52, 85, 52, 60, 94, 95,
                    65, 67, 64, 94, 91, 97, 50, 98, 59, 58, 55, 75, 60, 66, 84, 95, 59, 62, 99, 52, 70, 89, 62, 62,
                    96, 65, 91, 70, 53, 75, 83, 99, 66, 51, 87, 63, 53, 51, 94, 87, 75, 97, 75, 83, 65, 76, 63, 89,
                    80, 75, 76, 76, 67, 96, 64, 73, 73, 69, 89, 81, 80, 98, 54, 84, 94, 91, 91, 58, 72, 89, 70, 61,
                    96, 66, 85, 72]
}

# 표 만들기
df = pd.DataFrame(data)

# 6개의 등급으로 나누기 (0~100 점 기준)
df['score_grade'] = pd.cut(df['students_scores'], bins=6)

# 각 점수 등급을 기준으로 평균과 표준 편차 구하기
grade_stats = df.groupby('score_grade')['students_scores'].agg(['mean', 'std']).reset_index()

# 각 등급별 인원 수 구하고 도수분포표 생성하기
grade_counts = df['score_grade'].value_counts().sort_index().reset_index()
grade_counts.columns = ['score_grade', 'count']

# 평균과 표준편차를 도수분포표에 합치기
frequency_table = pd.merge(grade_counts, grade_stats, on='score_grade')

# total row 를 도수분포표에 더하기
total_row = pd.DataFrame({
    "score_grade": ["Total"],
    "count": [grade_counts['count'].sum()],
    "mean": ["-"], 
    "std": ["-"] 
})

frequency_table = pd.concat([frequency_table, total_row], ignore_index=True)

# 최종 도수분포표 출력하기
print(frequency_table)

 

<코드 설명>

  • df.groupby('score_grade')['students_scores'].agg(['mean', 'std'])는 각 성적의 평균과 표준편차를 모두 계산.
  • 평균과 표준편차는 pd.merge()를 사용하여 빈도수와 병합.

※ agg() 메서드는 사용자에게 다중집계작업을 간결하게 나타날 수 있도록 한다. 이 메서드는 한번의 메서드에 여러 함수를 동시에 입력하고 결과를 출력할 수 있다. (하나의 함수 사용 시에는 apply())

사용형식: 결과 = object.agg(함수)


챕터3 연습문제 8

 

한 공장에서 생산된 제품의 무게가 5kg 미만이면, 이 제품은 불량품으로 취급된다. 제품을 검사하기 위해 9개의 제품을 무작위로 뽑아 무작위로 측정하였다. 불량품의 제거로 인해 발생하는 평균과 중앙값의 변화에 대해 설명하라.

 

먼저, 무작위로 뽑은 9개의 제품 중 불량품(5kg 미만) 인 제품의 개수 및 목록을 알아본다.

# 제품의 무게
product_weight = [1.3, 5.5, 6.2, 2.5, 5.9, 7.4, 6.5]

# 불량품 목록 (무게가 5 미만인 제품을 불량으로 간주)
defective_products = [weight for weight in product_weight if weight < 5]

print('불량품 개수:', len(defective_products))
print('불량품:', defective_products)

 

[불량품이 포함된 전체 제품의 평균과 중앙값]

# 제품의 무게
import numpy as np
product_weight = [1.3, 5.5, 6.2, 2.5, 5.9, 7.4, 6.5]

# 불량품 목록 (무게가 5 미만인 제품을 불량으로 간주)
defective_products = [weight for weight in product_weight if weight < 5]

# 9개 전체 제품의 평균과 중앙값
mean = np.mean(product_weight)

def median(values):
    ordered = sorted(values)
    n = len(ordered)
    mid = int(n/2) - 1 if n % 2 == 0 else int(n/2)

    if n % 2 == 0:
        return (ordered[mid] + ordered[mid+1]) /2.0
    else:
        return (ordered[mid])

print('전체 제품 평균:', mean)
print('전체 제품 중앙값:', median(product_weight))

 

[불량품을 제외한 제품의 평균과 중앙값]

불량품 목록을 구하는 코드를 응용하여 5kg 이상의 제품만을 추출하는 코드를 넣어 정상제품을 추려낸다.

# 제품의 무게
import numpy as np
product_weight = [1.3, 5.5, 6.2, 2.5, 5.9, 7.4, 6.5]

# 불량품 목록 (무게가 5 미만인 제품을 불량으로 간주)
defective_products = [weight for weight in product_weight if weight < 5]

# 정상제품 목록
valid_products = [weight for weight in product_weight if weight >= 5]

# 9개 전체 제품의 평균과 중앙값
mean = np.mean(product_weight)

def median(values):
    ordered = sorted(values)
    n = len(ordered)
    mid = int(n/2) - 1 if n % 2 == 0 else int(n/2)

    if n % 2 == 0:
        return (ordered[mid] + ordered[mid+1]) /2.0
    else:
        return (ordered[mid])

# 불량품 제외 제품의 평균과 중앙값
valid_mean = np.mean(valid_products)
valid_median = median(valid_products)


print('불량품 제외 평균:', valid_mean)
print('불량품 제외 중앙값:', valid_median)

# 전체, 양호제품 평균과 중앙값의 차이
print('평균 변화:', (mean - valid_mean))
print('중앙값 변화:', (median(product_weight) - valid_median))

평균 무게는 전체 제품이 포함되었을 때보다 1.25kg이 증가하였고, 중앙값 역시 0.3kg 가량 증가되었다.


챕터3 연습문제 9

 

어느 공장에서 생산된 아령 중 7개를 무작위로 뽑아 무게를 측정하였다. 이 자료를 바탕으로 계산한 평균값과 중앙값이 동일하다고 할 때, A에 해당하는 값은? (단, A는 중앙값보다 작다)

A, 2, 10, 18, 4, 17, 15 (단위: kg)

 

[풀이]

가중치의 평균과 중앙값이 동일하고 A가 중앙값보다 작은 A 값을 찾으려면 다음 단계를 수행할 수 있다.

  • 평균 계산: 가중치의 평균(평균)은 모든 가중치의 합을 가중치 개수로 나눈 값이다.
  • 중앙값 계산: 중앙값은 가중치를 오름차순으로 정렬했을 때 가운데 있는 값이다. 관측치 수가 짝수인 경우 중앙값은 두 중간 값의 평균이다.
  • 평균을 중앙값과 동일하게 설정하고 A를 구한다.

<평균 계산>

<중앙값 계산>

중앙값을 찾으려면 A를 포함하여 가중치를 정렬해야 한다.

 

A는 중앙값 보다 작다고 했으므로, 이를 보면 중앙값은 10 이라는 것을 알 수 있고,

 

<A 계산>

A가 포함된 값의 평균과 중앙값은 동일하다고 했으니, 모든 값을 포함한 평균이 10을 만족하는 수를 찾으면 된다.

10 = (x + 66) / 7
x = (7 * 10) - 66
x = 4

 

해당 문제의 풀이를 파이썬으로 구현하면,

# 덤벨 무게
import numpy as np

# 덤벨 무게
dumbbells = [2, 10, 18, 4, 17, 15]

# 함수 정의
def calculate_a_and_stats():
# 총 중량 합계 계산
    for A in range(1, 5):  # A는 1보다 크고 5보다 작다
        # A 더하기
        current_weights = dumbbells + [A]
    
        # 평균 계산
        mean = np.mean(current_weights)
    
        # 중앙값 계산
        median = np.median(current_weights)
    
        # 평균과 중앙값이 동일하고 A가 중앙값보다 작은지 체크
        if mean == median and A < median:
            return A, mean, median

# 함수 실행하기
A_value, average, median = calculate_a_and_stats()

print(f"A값: {A_value} kg")
print(f"평균: {average} kg")
print(f"중앙값: {median} kg")


다음 내용

 

[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.4) -1

★ 시작에 앞서 ★ 해당 내용은 ', 다산출판사, 2024' 에 나와있는 챕터별 연습문제를 교재를 응용하여 풀이하고, 수학적인 문제에 대한 답변을 파이썬으로 구현해보기 위해 작성하는 글이다.해

puppy-foot-it.tistory.com

 

728x90
반응형