본문 바로가기
프로그램

[파이썬] 문제 : 폐기물 csv파일로 막대그래프(bar) 그리기(pandas, groupby)

by 오디세이99 2022. 12. 10.
728x90
반응형

(문제)

파이썬 데이터 시각화 관련.

csv 파일에서 필요한 데이터만 추출해서
지역별로 나이에 따라 인구수와
지역별로 PET병 배출량을 막대 그래프 그리기
 
 
(방법)
1) 지역별로 나이에 따라 인구수
- 첨부한 데이터를 정확히 몰라서 어떤 컬럼이 인구수인지 모르겠습니다.
대략 다음 컬럼들이 인구수로 가정했습니다.

남_~9,남_10~19...남_100~

여_~9,여_10~19...여_100~

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv('폐기물dataset.csv', header=0, encoding='cp949')

df['배출량'] = df['배출량'].str.replace(',', '')   # 배출량이 317,827.8 와 같이 ','가 있어 실수가 아닌 Object로 되어 있어서 ','제거
df = df.astype({'배출량':'float'})                 # Object -> Float

df2.groupby(['지역']).sum()

fig = plt.figure(figsize=(14, 6))            # plot 크기 설정
plt.rcParams['font.family'] = 'NanumGothic'  # 한글 가능하도록 폰트 설정
f_size = 16                  # 제목 폰트 크기
bar_width = 0.1
x_column = 'X축'
y_column = 'Y축'
x_label = list(df2['지역'])           # 데이터명
x = np.arange(len(x_label))
y = list(df2['남_~9'])           # 데이터
y2 = list(df2['남_10~19'])           # 데이터
y3 = list(df2['남_20~29'])           # 데이터
y4 = list(df2['남_30~39'])           # 데이터
y5 = list(df2['남_40~49'])           # 데이터
y6 = list(df2['남_50~59'])           # 데이터
y7 = list(df2['남_60~69'])           # 데이터
y8 = list(df2['남_70~79'])           # 데이터
y9 = list(df2['남_80~89'])           # 데이터
y10 = list(df2['남_90~99'])           # 데이터
y11 = list(df2['남_100~'])           # 데이터
plt.bar(x, y, bar_width, alpha=0.4, label='남_~9')                # bar chart 그리기
plt.bar(x+bar_width, y2, bar_width, label='남_10~19')
plt.bar(x+2*bar_width, y3, bar_width, label='남_20~29')
plt.bar(x+3*bar_width, y4, bar_width, label='남_30~39')
plt.bar(x+4*bar_width, y5, bar_width, label='남_40~49')
plt.bar(x+5*bar_width, y6, bar_width, label='남_50~59')
plt.bar(x+6*bar_width, y7, bar_width, label='남_60~69')
plt.bar(x+7*bar_width, y8, bar_width, label='남_70~79')
plt.bar(x+8*bar_width, y9, bar_width, label='남_80~89')
plt.bar(x+9*bar_width, y10, bar_width, label='남_90~99')
plt.bar(x+10*bar_width, y11, bar_width, label='남_100~')
plt.xticks(x, x_label)
plt.title("지역별 나이별 인구수(남)",fontsize=f_size)  # 제목 쓰기
plt.legend()
plt.show()

 

 

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv('폐기물dataset.csv', header=0, encoding='cp949')

df['배출량'] = df['배출량'].str.replace(',', '')   # 배출량이 317,827.8 와 같이 ','가 있어 실수가 아닌 Object로 되어 있어서 ','제거
df = df.astype({'배출량':'float'})                 # Object -> Float

df2.groupby(['지역']).sum()

fig = plt.figure(figsize=(14, 6))            # plot 크기 설정
plt.rcParams['font.family'] = 'NanumGothic'  # 한글 가능하도록 폰트 설정
f_size = 16                  # 제목 폰트 크기
bar_width = 0.1
x_column = 'X축'
y_column = 'Y축'
x_label = list(df2['지역'])           # 데이터명
x = np.arange(len(x_label))
y = list(df2['여_~9'])           # 데이터
y2 = list(df2['여_10~19'])           # 데이터
y3 = list(df2['여_20~29'])           # 데이터
y4 = list(df2['여_30~39'])           # 데이터
y5 = list(df2['여_40~49'])           # 데이터
y6 = list(df2['여_50~59'])           # 데이터
y7 = list(df2['여_60~69'])           # 데이터
y8 = list(df2['여_70~79'])           # 데이터
y9 = list(df2['여_80~89'])           # 데이터
y10 = list(df2['여_90~99'])           # 데이터
y11 = list(df2['여_100~'])           # 데이터
plt.bar(x, y, bar_width, alpha=0.4, label='여_~9')                # bar chart 그리기
plt.bar(x+bar_width, y2, bar_width, label='여_10~19')
plt.bar(x+2*bar_width, y3, bar_width, label='여_20~29')
plt.bar(x+3*bar_width, y4, bar_width, label='여_30~39')
plt.bar(x+4*bar_width, y5, bar_width, label='여_40~49')
plt.bar(x+5*bar_width, y6, bar_width, label='여_50~59')
plt.bar(x+6*bar_width, y7, bar_width, label='여_60~69')
plt.bar(x+7*bar_width, y8, bar_width, label='여_70~79')
plt.bar(x+8*bar_width, y9, bar_width, label='여_80~89')
plt.bar(x+9*bar_width, y10, bar_width, label='여_90~99')
plt.bar(x+10*bar_width, y11, bar_width, label='여_100~')
plt.xticks(x, x_label)
plt.title("지역별 나이별 인구수(여)",fontsize=f_size)  # 제목 쓰기
plt.legend()
plt.show()

 

 

2) 지역별로 PET병 배출량

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def add_value_label(x_list,y_list):           # bar chart에 값을 text로 표시
    for i in range(1, len(x_list)+1):
        plt.text(i-1,y_list[i-1],y_list[i-1])

df = pd.read_csv('폐기물dataset.csv', header=0, encoding='cp949')

df['배출량'] = df['배출량'].str.replace(',', '')   # 배출량이 317,827.8 와 같이 ','가 있어 실수가 아닌 Object로 되어 있어서 ','제거
df = df.astype({'배출량':'float'})                 # Object -> Float

df2 = df[(df['폐기물상세'] == 'PET병')]
df2.groupby(['지역']).sum()

fig = plt.figure(figsize=(14, 6))            # plot 크기 설정
plt.rcParams['font.family'] = 'NanumGothic'  # 한글 가능하도록 폰트 설정
f_size = 16                  # 제목 폰트 크기
bar_width = 0.8
x_column = 'X축'
y_column = 'Y축'
x_label = list(df2['지역'])           # 데이터명
x = np.arange(len(x_label))
y = list(df2['배출량'])           # 데이터
plt.bar(x, y, bar_width, alpha=0.6, color='green', label='배출량(PET병)')                # bar chart 그리기
plt.xticks(x, x_label)
add_value_label(x, y)        # 값 표시
plt.title("지역별 배출량(PET병)",fontsize=f_size)  # 제목 쓰기
plt.grid()
plt.legend()
plt.show()

728x90
반응형

댓글