본문 바로가기
프로젝트

분산분석을 시작하고 생긴 의문점과 코드 오류

by 포 키 2023. 9. 16.
728x90

어제 카테고리가 비어있는 곳에 각 월별에 대한 값을 집어넣고, 거기에 상응하는 평균값을 0으로 집어넣었다.

시각화까지는 구현하는데에 큰 문제없이 그냥 값이 없구나 할 정도로 넘길 수 있었는데,

귀무가설을 연도별로 비교했을 때, 큰 차이를 보이지 않는다. 로 잡고 분산분석을 시작했다.

그런데 코드를 여러번 수정해서 얻은 값을 보고 의문이 생겼다. (아래에 따로 다루겠다.)

현재 내가 코드부분을 정확하고 알아보기 쉽게 적용하는 능력이 부족하다.

코드를 보고 해설할 수 있는 능력은 생겼는데 내가 이 부분을 어떻게 해야 되는거지? 하고 적용은 아직 안되는 것 같다.

물론 파이썬 과정을 수강하면 실질적으로 코드 부분을 배운건 2달 남짓.. 2달만에 이 코드를 내 것처럼 구현한다는건 말이 되질 않는다.

그만큼 내가 더 노력을 해야한다는 의미로 받아들이고 코드를 다시한번 읽어봤다.

 

코드의 문제점

초기의 코드는 다음과 같다.

import pandas as pd
from scipy import stats

Years = [2018, 2019, 2020, 2021]

# 각 연도별 데이터를 Years_data 리스트에 저장합니다.
Years_data = [total_mean_cost_2018, total_mean_cost_2019, total_mean_cost_2020, total_mean_cost_2021]

f_statistics = []
p_values = []

# 각 연도별로 월별 물가에 대한 분산 분석을 수행합니다.
for year, month_data in zip(Years, Years_data):
    # 분산 분석을 수행합니다.
    f_statistic, p_value = stats.f_oneway(*month_data)
    
    # 결과를 리스트에 저장합니다.
    f_statistics.append(f_statistic)
    p_values.append(p_value)

    # 해당 연도의 결과를 출력합니다.
    print(f"{year}년:")
    print("F-통계량 (F-statistic):", f_statistic)
    print("p-값 (p-value):", p_value)

# 각 연도별로 월별 물가에 대한 귀무 가설을 검정하고 결과를 해석합니다.
alpha = 0.05  # 유의수준 (보통 0.05를 사용)
for year, p_value in zip(Years, p_values):
    if p_value < alpha:
        print(f"{year}년: 귀무 가설을 기각합니다. 연도별 물가에 차이가 있습니다.")
    else:
        print(f"{year}년: 귀무 가설을 기각하지 않습니다. 연도별 물가에 큰 차이가 없습니다.")

 

초기 코드에서 발생한 오류값이다.

ValueError : zero-dimensional arrays cannot be concatenated

 

현재 내가 가진 데이터 프레임에서는 연도에 대한 값이 없어서, 연도를 따로 리스트로 지정을 한 상태였다,

그리고 어제 시각화에 사용한 각 연도별로 뽑은 전체 지출비용 카테고리의 월별 평균값을 정수형 리스트로 지정한 total_mean_cost 를 활용할 생각이었다.

월별 데이터를 따로 지정을 한게 실수였다.

월별 평균값이 이미 total_mean_cost 에 리스트 형태로 담겨있었기 때문에 이것을 그대로 활용했어야 했다.

 

바꾼 코드는 다음과 같다.

import pandas as pd
from scipy import stats

# 연도별로 월별 평균 물가 데이터를 비교하여 분산 분석을 수행합니다.
f_statistic, p_value = stats.f_oneway(total_mean_cost_2018, total_mean_cost_2019, total_mean_cost_2020, total_mean_cost_2021)

# 결과를 출력합니다.
print("F-통계량 (F-statistic):", f_statistic)
print("p-값 (p-value):", p_value)

# 유의수준 (일반적으로 0.05)을 기준으로 귀무 가설을 검정합니다.
alpha = 0.05
if p_value < alpha:
    print("귀무 가설을 기각합니다. 적어도 하나의 연도에서 연도별 물가에 차이가 있습니다.")
else:
    print("귀무 가설을 기각하지 않습니다. 연도별로 물가에 큰 차이가 없습니다.")

 

 
F-통계량 (F-statistic): 2.60804020989176
p-값 (p-value): 0.0634534305358464
귀무 가설을 기각하지 않습니다. 연도별로 물가에 큰 차이가 없습니다.

 

여기서 문제가 생겼다.

위에서 언급했던 의문이 생겼다는 부분이 이 부분이다.

내가 잘못설정을 한건지 이게 맞는건지 헷갈리기 시작했는데 그 이유는 아래의 코드 결과를 보면 이해가 될 것이다.

print(total_mean_cost_2018)
print(total_mean_cost_2019)
print(total_mean_cost_2020)
print(total_mean_cost_2021)
[563737, 481899, 463494, 485475, 561425, 539357, 494075, 578370, 515749, 502549, 474495, 433259] [398538, 487232, 445378, 422618, 487010, 478963, 465747, 511081, 446911, 475645, 458333, 472795] [407989, 438452, 0, 0, 0, 0, 0, 619088, 577591, 494086, 513175, 543347]
[568421, 593278, 0, 0, 0, 608374, 649945, 651897, 634682, 574032, 607384, 640789]

 

이것처럼 2020년과 2021년의 경우 결측치를 0으로 해뒀기에,

전체적으로 보면 귀무가설이 어떻게 채택이 된거지? 하고 생각이 너무 많아졌다.

월요일에 팀원들과 상의해보고, 의문 해결이 안된다면 강사님께 추가로 여쭤봐야할 것 같다.

해결되면 다음 포스팅으로 작성하고 링크를 추가하겠다.

728x90