💻프로그래밍/🕵️‍♀️모두의데이터분석

[파이썬] 09. ValueError/break/원그래프

hyerimmy 2021. 1. 27. 00:10

📅 스터디 날짜 | 2021.01.25

📖 모두의 데이터 분석 | Unit 09 p124-139


#1 barh의 두 매개변수 데이터 개수가 일치하지 않아, ValueError 발생

 

(1) 오류 분석

 

gender.csv : '제주'가 들어간 열이 굉장히 많음을 알 수 있다.

ValueError (값에 오류가 있음)
: x축의 데이터 개수와 찾은 데이터 개수가 일치하지 않아 발생한 에러

'제주'를 입력할 경우,
제주가 들어간 열이 많아서 데이터의 개수가 맞지 않기 때문에 오류가 발생한다.

plt.barh(range(101),m) : x축데이터 101개이지만, m에 저장된 데이터는 101개를 훨씬 넘는다.

len(m) =  4646, len(f) = 4646

 

 

 

 

 

import csv
f = open ('gender.csv')
data = csv.reader(f)
m=[]
f=[]
name = input('인구 구조가 알고 싶은 지역을 입력해 주세요 : ')

for row in data :
    if name in row[0] :
        for i in row[3:104] :
            m.append(-int(i))
            #m.append(-int(i).replace(',',''))
        for i in row[106:] :
            f.append(int(i))
            
import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
plt.title(name + '지역의 남녀 성별 인구 분포')
plt.rcParams['axes.unicode_minus']=False
plt.barh(range(101),m, label = '남성')
plt.barh(range(101),f, label = '여성')
plt.legend()
plt.show()

출력결과 (ValueError가 발생했음을 알 수 있다)

 

(2) 오류 해결

검색한 단어(name)가 들어간 열 중 첫 번째 열의 데이터를 저장한 후, 반복문을 종료(break)하여 해결한다.

즉, 아무리 그 단어가 포함된 열이 많다고 하더라도, len(m)과 len(f)는 101이 된다.

break : 반복문의 실행을 멈추는 키워드 (들여쓰기에 주의)

import csv
f = open ('gender.csv')
data = csv.reader(f)
m=[]
f=[]
name = input('인구 구조가 알고 싶은 지역을 입력해 주세요 : ')

for row in data :
    if name in row[0] :
        for i in row[3:104] :
            m.append(-int(i))
        for i in row[106:] :
            f.append(int(i))
        break	#사용자로부터 입력받은 내용이 포함되는 데이터 중 처음 만나는 데이터만 m,f 데이터에 추가
            
import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
plt.title(name + '지역의 남녀 성별 인구 분포')
plt.rcParams['axes.unicode_minus']=False
plt.barh(range(101),m, label = '남성')
plt.barh(range(101),f, label = '여성')
plt.legend()
plt.show()

출력결과 (오류가 발생하지 않고 잘 출력됨을 알 수 있다)

 

#2 원그래프

  • 원그래프 = 파이차트 (pie chart)
  • pie() : 전체 데이터 중 특정 데이터의 비율을 보기 쉽게 표현하는 함수
  • plt.acix('equal') : 파이차트를 동그란 원으로 표현
  • labels 속성을 통해 파이 차트의 각 항목에 이름을 표현할 수 있다.
  • autopct 속성을 통해 각 항목의 비율을 자동으로 계산해 표시할 수 있다.
  • colors 속성을 통해 파이차트의 색을 설정할 수 있다.
  • explode 속성을 통해 특정 항목에 돌출하는 효과를 줄 수 있다. 0은 돌출되지 않음
    데이터 순서를 통해 설정한다.
    예로, explode(0, 0, 0.1, 0)이면 리스트의 세번째 데이터만 돌출되어 표현된다.
  • startangle 속성을 통해 시작 각도를 설정할 수 있다. 기본 시작 지점은 3시방향이며, 반시계방향으로 돈다.
    startangle=90 이면 기본시작지점(3시방향)에서 반시계방향으로 90도 이동한 지점이 시작지점이 된다.
import matplotlib.pyplot as plt
plt.rc('font', family='Malgun Gothic')

size = [2441,2312,1031,1233]				# size 리스트 생성
label = ['A형','B형','AB형','O형']			# label 리스트 생성
color=['darkmagenta','deeppink','hotpink','pink']	# color 리스트 생성
plt.axis('equal') #동그란 원형으로 표현


#autopct - 비율 표시 (%.1f%% = 소수점 아래 첫 번째 소수점까지 표현)
#labels - 레이블 추가 /colors - 색상 설정 /explode - 돌출효과
plt.pie(size, labels=label, autopct='%.1f%%', colors=color, explode=(0,0,0.1,0))

plt.legend()	# 범례 표시
plt.show()

출력결과

 


import csv

f = open('gender.csv')
data = csv.reader(f)

size = []

name = input('찾고 싶은 지역의 이름을 알려주세요 : ')
for row in data :
    if name in row[0] :
        m = 0
        f = 0
        for i in range(101) :
            m += int(row[i+3])
            f += int(row[i+106])
        break
size.append(m)
size.append(f)

import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
color = ['crimson', 'darkcyan']
plt.axis('equal')

plt.pie(size,labels=['남','여'], autopct='%.1f%%', colors=color, startangle=90)
plt.title(name+' 지역의 남녀 성별 비율')
plt.show()

출력결과

 


🤐

오류가 이래저래 많이 생겨서 머리 아팠던 유닛이었다.