프로젝트 진행 중에 수집한 데이터에 결측치로 인해 시각화 하는데 문제가 생겼다.
내가 겪은 결측치 이슈는 단순한 값만 없는 결측치로 인한 문제가 아닌, 아예 나뉜 카테고리 조차 없었다.
이 표를 보면 3월부터 5월의 분류 자체가 없다.
그래서 우리가 다루려는 평균값만 없던게 아니라, 해당 부분 자체가 아예 없는 결측치 이슈로 인해 그래프를 그리는것 자체가 문제가 생겼다.
그리고 한글을 제대로 입히지 못하는 인코딩 이슈 역시 일어났는데 이 부분과 함께 다뤄보려한다.
해결방법
1. 한글이 깨지는 현상 해결법
이 문제는 너무 간단하다. 아래의 한글 나눔고딕 폰트를 다운하면 된다.
먼저 아래의 코드를 복사해서 붙여넣는다. 이 방법은 코랩을 기반해서 작성함을 명시한다.
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
해당 코드를 실행했으면 런타임 중단 및 다시시작을 눌러주고, 해당 코드 이 후 부터 다시 실행하면 끝이다.
그러면 한글이 깨지는 현상이 잡힌다.
2. 결측치 부분 채우기
이 부분은 생각보다 잡아내는 과정이 까다로웠다.
애초에 몇월이라는 카테고리 자체가 없어서 이 값을 만들어서 다른 결측치인 평균값을 제로값으로 넣어서 하는 방향으로 진행해야했다.
이렇게 하는 방법은 두가지가 있었다.
1. 코드 부분으로 해결한다.
2. 원데이터에서 직접 값을 입력한다.
결론적으로 말하자면, 1번으로 해결법을 찾은건 matplotlib, 2번으로 해결법을 찾은건 plotly 였다.
물론 plotly 도 코드를 작성해서 해결하는 방법이 있을 것이다.
그치만 matplotlib으로 해결하는 방법을 찾는데 오랜 시간을 들였어서 plotly까지 해결하려니 너무 빡세게 느껴졌다..
실무였으면 당연히 더 시간을 들여서 코드로 해결하는 방법을 찾아야만 한다고 생각한다.
내가 가진 데이터는 활용되는 컬럼의 갯수가 애초에 적었기 때문에 내가 직접 건드리는게 낫겠다 싶었던 거다.
여기서는 matplotlib을 이용해서 코드를 작성해 해결한 방법을 소개하겠다.
먼저 아래의 코드를 참고해서 작성해주자.
import matplotlib.pyplot as plt
%matplotlib inline
# 각 연도별 월별 평균값을 정수형 리스트로 변환하기
culture_mean_cost_2018 = culture_cost_2018['평균'].astype(int).tolist()
culture_mean_cost_2019 = culture_cost_2019['평균'].astype(int).tolist()
culture_mean_cost_2020 = culture_cost_2020['평균'].astype(int).tolist()
culture_mean_cost_2021 = culture_cost_2021['평균'].astype(int).tolist()
months = ['01월', '02월', '03월', '04월', '05월', '06월', '07월', '08월', '09월', '10월', '11월', '12월']
# 2020년, 2021년 결측치 처리
missing_months_2020 = ['03월', '04월', '05월', '06월', '07월']
missing_months_2021 = ['03월', '04월', '05월']
# 2020년 데이터 정의 및 결측치 추가
months_2020 = months.copy()
culture_mean_cost_2020 = culture_mean_cost_2020.copy()
for month in missing_months_2020:
idx = months_2020.index(month)
culture_mean_cost_2020.insert(idx, 0)
# 2021년 데이터 정의 및 결측치 추가
months_2021 = months.copy()
culture_mean_cost_2021 = culture_mean_cost_2021.copy()
for month in missing_months_2021:
idx = months_2021.index(month)
culture_mean_cost_2021.insert(idx, 0)
plt.figure(figsize=(10, 6))
plt.plot(months, culture_mean_cost_2018, marker='o', linestyle='-', color='red', label='2018')
plt.plot(months, culture_mean_cost_2019, marker='o', linestyle='-', color='green', label='2019')
plt.plot(months, culture_mean_cost_2020, marker='o', linestyle='-', color='blue', label='2020')
plt.plot(months, culture_mean_cost_2021, marker='o', linestyle='-', color='orange', label='2021')
plt.xlabel('월별')
plt.ylabel('관광/문화 지출 비용의 평균값 (원)')
plt.title('월별 관광/문화 지출 비용의 평균값에 대한 선 그래프')
plt.grid(True)
plt.legend()
# 해당 값의 데이터레이블 입히기
'''
for i in range(len(months)):
plt.text(months[i], culture_mean_cost_2018[i], str(culture_mean_cost_2018[i]), ha='center', va='bottom', fontsize=10, color='red')
plt.text(months[i], culture_mean_cost_2019[i], str(culture_mean_cost_2019[i]), ha='center', va='bottom', fontsize=10, color='green')
plt.text(months[i], culture_mean_cost_2020[i], str(culture_mean_cost_2020[i]), ha='center', va='bottom', fontsize=10, color='blue')
plt.text(months[i], culture_mean_cost_2021[i], str(culture_mean_cost_2021[i]), ha='center', va='bottom', fontsize=10, color='black')
'''
plt.show()
위의 데이터프레임을 보여주며 간단히 설명하자면, 내가 수집한 데이터에서 사용할 컬럼은 세부 카테고리와 평균 이다.
여기서 평균값의 데이터 타입을 확인했을 때, object 로 나와서 데이터 값을 정수형으로 변경하면서 리스트로 저장하는 것으로 했다.
그리고 월별에 대해서는 따로 지정했다.
이미 없는 결측부분을 끌어오기보다는, 월별에 대해 따로 설정을 해서 부족했던 3~5월까지의 월을 생성시켜줬다.
다음으로 없었던 월을 추가해줬으니, 그 월에서 우리가 가져와야할 평균값도 현재 결측치일 것이다.
그러면 이 부분을 활용하기 위해 다시 결측치 보강을 해줘야 한다.
그리고 연도별로 색상을 다르게 해서 시각화 하도록 코드를 썼다.
한글의 깨짐 현상도 해결하고, 결측치를 제로값으로 둔 완성된 시각화 그래프이다.
'프로젝트' 카테고리의 다른 글
[박스플롯] labels와 positions 크기 호환 안되는 이슈 (0) | 2023.09.18 |
---|---|
분산분석을 시작하고 생긴 의문점과 코드 오류 (0) | 2023.09.16 |
프로젝트 물가 데이터 통계분석 변경사항 (0) | 2023.09.14 |
데이터 전처리 과정에서 발생한 csv 파일 인코딩 이슈 해결법 (0) | 2023.09.13 |
프로젝트 진행 상황 - 데이터 전처리 (0) | 2023.09.13 |