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

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

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

 

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

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

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


이전 내용
 

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

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

puppy-foot-it.tistory.com


챕터2 주요 개념: 도수분포표, 상대빈도수, 누적 빈도, 누적백분율
챕터2 연습문제 4

 

중학생 40명의 키를 측정한 결과를

1)등급의 수를 6으로 하여 도수 분포표를 작성하라

2) 해당 도수분포표를 가지고 막대그래프와 꺾은선그래프를 그려라

3) 해당 도수분포표로 누적백분율을 구하고, 누적백분율 곡선을 그려라

 

[풀이]

# 중학생 40명 키 측정
height = [138, 164, 150, 132, 144, 125, 149, 157, 146, 158, 140, 147, 136, 148, 152, 144, 168, 126, 138, 177, 163, 120, 154, 165, 146, 173, 142, 147, 135, 153, 140, 135, 161, 145, 135, 142, 150, 156, 145, 128]
print(len(height))

40명의 데이터가 잘 입력되었다.

 

◆ 도수분포표 생성

키를 6등급으로 나누고, 해당 등급에 맞는 인원 세기

# 중학생 40명 키 측정
height = {
    "height": [138, 164, 150, 132, 144, 125, 149, 157, 146, 158, 140, 147, 136, 148, 152,
               144, 168, 126, 138, 177, 163, 120, 154, 165, 146, 173, 142, 147, 135, 153,
               140, 135, 161, 145, 135, 142, 150, 156, 145, 128]
}

# 데이터프레임 생성
df_2 = pd.DataFrame(height)

# 키를 6등급으로 나누어 키 등급 도수분포표 생성하기
df_2["height_grade"] = pd.cut(df_2['height'], bins=6)

# 등급을 6개로 도수분포표 작성하고 키등급 열 생성하기
df_2['count'] = df_2.groupby('height_grade')['height'].transform('count')

# 키 등급과 인원수를 이용하여 도수 분포표 생성하기
frequency_table = df_2[['height_grade', 'count']].drop_duplicates()

# 전체 학생 합계 출력하기
total = frequency_table['count'].sum()

# 합계 행 추가
total_row = pd.DataFrame({
    "height_grade": ["Total"],
    "count": [total]
})

# 새로운 행 삽입된 표 생성하기
df_3 = pd.concat([frequency_table, total_row], ignore_index=True)

# 도수 분포표 출력
print(df_3)

 

◆ 막대그래프 생성

import pandas as pd
import matplotlib.pyplot as plt

# 중학생 40명 키 측정
height = { 
    "height": [138, 164, 150, 132, 144, 125, 149, 157, 146, 158, 140, 147, 136, 148, 
               152, 144, 168, 126, 138, 177, 163, 120, 154, 165, 146, 173, 142, 147, 
               135, 153, 140, 135, 161, 145, 135, 142, 150, 156, 145, 128]
}

# 데이터프레임 생성
df_2 = pd.DataFrame(height)

# 6개의 등급으로 도수분포표 생성
df_2["height_grade"] = pd.cut(df_2['height'], bins=6)

# 각 등급별 인원 수 체크
frequency_table = df_2.groupby('height_grade')['height'].count()

# 막대 그래프 그리기
frequency_table.plot(kind='bar', color='skyblue')

# 라벨과 제목 추가
plt.title('Height Distribution of 40 Middle School Students')
plt.xlabel('Height Grade')
plt.ylabel('Number of Students')

# 차트 출력
plt.show()

 

◆ 꺾은선그래프 생성

import pandas as pd
import matplotlib.pyplot as plt

# 중학생 40명 키 측정
height = { 
    "height": [138, 164, 150, 132, 144, 125, 149, 157, 146, 158, 140, 147, 136, 148, 
               152, 144, 168, 126, 138, 177, 163, 120, 154, 165, 146, 173, 142, 147, 
               135, 153, 140, 135, 161, 145, 135, 142, 150, 156, 145, 128]
}

# 데이터프레임 생성
df_2 = pd.DataFrame(height)

# 6개의 등급으로 도수분포표 생성
df_2["height_grade"] = pd.cut(df_2['height'], bins=6)

# 각 등급별 인원 수 체크
frequency_table = df_2.groupby('height_grade')['height'].count()

# 막대 그래프 그리기
frequency_table.plot(kind='line', color='skyblue')

# 라벨과 제목 추가
plt.title('Height Distribution of 40 Middle School Students')
plt.xlabel('Height Grade')
plt.ylabel('Number of Students')

# 차트 출력
plt.show()

 

◆ 누적백분율을 구하기

# 중학생 40명 키 측정
import pandas as pd

height = {
    "height": [138, 164, 150, 132, 144, 125, 149, 157, 146, 158, 140, 147, 136, 148, 152,
               144, 168, 126, 138, 177, 163, 120, 154, 165, 146, 173, 142, 147, 135, 153,
               140, 135, 161, 145, 135, 142, 150, 156, 145, 128]
}

# 데이터프레임 생성
df_2 = pd.DataFrame(height)

# 키를 6등급으로 나누어 키 등급 도수분포표 생성하기
df_2["height_grade"] = pd.cut(df_2['height'], bins=6)

# 등급을 6개로 도수분포표 작성하고 키등급 열 생성하기
df_2['count'] = df_2.groupby('height_grade')['height'].transform('count')

# 키 등급과 인원수를 이용하여 도수 분포표 생성하기
frequency_table = df_2[['height_grade', 'count']].drop_duplicates()

# 전체 학생 합계 출력하기
total = frequency_table['count'].sum()

# 각 등급별 학생 수 비율 게산하는 함수
def percentage(group):
    group['prop'] = group['count'] / total * 100
    return group

# 해당 함수 빈도도수표에 적용하기
df_3 = frequency_table.apply(percentage, axis=1)

# 누적 백분율 구하기
def cum_prop(group):
    # Sort by height grade, not by proportion
    group = group.sort_values(by='height_grade') 
    group['cum_prop'] = group['prop'].cumsum()
    return group

# 누적백분율 적용하기
df_4 = cum_prop(df_3)

# 합계 행 추가
# Add a total row
total_row = pd.DataFrame({
    "height_grade": ["Total"],
    "count": [total],
    "prop": [100],  # 합계는 100%
    "cum_prop": [100] # 합계는 100%
})

# 합계 행 빈도도수표에 붙여주기
df_5 = pd.concat([df_4, total_row], ignore_index=True)

# 새로운 표 출력하기
print(df_5)

 

◆ 누적백분율 곡선 생성

# 중학생 40명 키 측정
import pandas as pd
import matplotlib.pyplot as plt

height = {
    "height": [138, 164, 150, 132, 144, 125, 149, 157, 146, 158, 140, 147, 136, 148, 152,
               144, 168, 126, 138, 177, 163, 120, 154, 165, 146, 173, 142, 147, 135, 153,
               140, 135, 161, 145, 135, 142, 150, 156, 145, 128]
}

# 데이터프레임 생성
df_2 = pd.DataFrame(height)

# 키를 6등급으로 나누어 키 등급 도수분포표 생성하기
df_2["height_grade"] = pd.cut(df_2['height'], bins=6)

# 등급을 6개로 도수분포표 작성하고 키등급 열 생성하기
df_2['count'] = df_2.groupby('height_grade')['height'].transform('count')

# 키 등급과 인원수를 이용하여 도수 분포표 생성하기
frequency_table = df_2[['height_grade', 'count']].drop_duplicates()

# 전체 학생 합계 출력하기
total = frequency_table['count'].sum()

# 각 등급별 학생 수 비율 게산하는 함수
def percentage(group):
    group['prop'] = group['count'] / total * 100
    return group

# 해당 함수 빈도도수표에 적용하기
df_3 = frequency_table.apply(percentage, axis=1)

# 누적 백분율 구하기
def cum_prop(group):
    # Sort by height grade, not by proportion
    group = group.sort_values(by='height_grade') 
    group['cum_prop'] = group['prop'].cumsum()
    return group

# 누적백분율 적용하기
df_4 = cum_prop(df_3)

# 합계 행 추가
# Add a total row
total_row = pd.DataFrame({
    "height_grade": ["Total"],
    "count": [total],
    "prop": [100],  # 합계는 100%
    "cum_prop": [100] # 합계는 100%
})

# 합계 행 빈도도수표에 붙여주기
df_5 = pd.concat([df_4, total_row], ignore_index=True)

# 누적백분율곡선 그리기
plt.figure(figsize=(10, 6))
plt.plot(df_5['height_grade'].astype(str), df_5['cum_prop'], marker='o')
plt.title('Cumulative Percentage Curve of Student Heights')
plt.xlabel('height_grade')
plt.ylabel('cum_prop (%)')
plt.xticks(rotation=45)
plt.grid()
plt.axhline(100, color='red', linestyle='--', label='100% Line')
plt.legend()
plt.tight_layout()
plt.show()

 


다음 내용

 

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

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

puppy-foot-it.tistory.com

 

728x90
반응형