즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/Python

[Python] 9.시각화

Godwony 2021. 1. 19. 21:23
728x90
반응형

시각화

  • 데이터의 형태를 파악하거나 보고서를 만들 목적으로 그래프나 지도 등을 출력하는 작업
  • matplotlib(기본 시각화), pandas, seaborn(시각적인 효과가 조금 더 뛰어남), folium(지도, 단계구분도) 등을 주로 이용

1. 꺽은선 그래프 - plot

  • 날짜나 시간에 따른 변화량 또는 2개의 컬럼을 가지고 데이터의 분포를 알아볼 때 많이 이용
  • 실습 link
import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import pandas as pd

# 데이터 읽기
pop = pd.read_excel('../data/시도_별_이동자수.xlsx', fillna=0, header=0)

# na(None, numpy.NaN...) 값을 앞의 데이터로 채우기
# 파이썬의 분석 라이브러리의 수정하는 메소드들은 대부분 수정해서 복사본을 리턴한다.
# 원본에 반영할 때는 다시 대입하거나 inplace 옵션이 있으면 이 옵션에 True를 대입
pop = pop.fillna(method='ffill')
# print(pop.head())

# 전출지 가 서울 인것만 골라내고 싶어요
# mask = pop["전출지별"] == "서울특별시" & pop["전입지별"] == "서울특별시"
# print(mask)

# 전출지별은 서울특별시이고 전입지는 서울특별시가 아닌 데이터만 추출하기 위한 조건 마늘기
mask = (pop["전출지별"] == "서울특별시") & (pop["전입지별"] != "서울특별시")
# print(pop[mask])

# 전출지별 열을 제거
df_seoul = pop[mask].drop(['전출지별'], axis=1)
#print(df_seoul)

# 전입지별 컬럼이름을 전입지로 수정
# inplace 옵션을 이용해서 원본에 반영
df_seoul.rename({'전입지별': '전입지'}, axis=1, inplace=True)
#print(df_seoul.head())

# 인덱스를 기존 컬럼이름으로 변경하고 컬럼은 제거
df_seoul.set_index('전입지', inplace=True)
# print(df_seoul.head())

# 전라북도로 전출간 인원에 대한 선 그래프 그리기
sr_one = df_seoul.loc['전라북도']

# 1970, 1971 제거
sr_one.drop(['1970','1971'], inplace = True)

plt.plot(sr_one.index, sr_one.values)

# matplotlib 한글 폰트 오류 문제 해결
# 매킨토시의 경우
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
#윈도우의 경우
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)

# 스타일 설정
plt.style.use('ggplot')
# 이미지 사이즈 설정 - 단위는 인치 
plt.figure(figsize=(14,5))
# x축 눈금 라벨 회전하기
plt.xticks(size=10, rotation='vertical')
# x, y축 데이터를 plot 함수에 입력
plt.plot(sr_one.index, sr_one.values, marker='o', markersize=10) # 마커 표시 추가

# 그래프 제목 만들기
plt.title('서울에서 전라북도로 이동', size=30)
# 축제목 
plt.xlabel('기간', size=30)
plt.ylabel('인구 수', size=20)
# 범례
plt.legend(labels=['서울->전북이동'], loc='best', fontsize=15)

# 그래프 위에 글자 작성
plt.annotate('인구이동 감소', xy=(35, 25000), rotation =-15, va='baseline', ha='center', fontsize=20)

plt.show()

2. 하나의 화면에 2개의 그래프 그리기

  • 객체 = plt.figure(figsize=(가로크기, 세로크기))
  • 변수1 = 객체.add_subplot(행이 개수, 열의 개수, 자신의번호)
  • 변수2 = 객체.add_subplot(행이 개수, 열의 개수, 자신의번호)...

변수1.plot(옵션...)
변수2.plot(옵션...)

# 기존 데이터에서 전라남도에서 서울로 이동한 인구수찾기
mask = (pop['전출지별'] == '전라북도') & (pop['전입지별'] != '전라북도')
df_jeo = pop[mask]
# print(df_jeo.head())

#전출지별 컬럼 제거하기
df_jeo = df_jeo.drop(['전출지별'], axis=1)
# 컬럼이름 변경하기
df_jeo.rename({'전입지별': '전입지'}, axis=1, inplace=True)
# 인덱스 설정하기
df_jeo.set_index('전입지', inplace=True)
# 서울로 이동한 데이터만 가져오기
sr_two = df_jeo.loc['서울특별시']
# print(sr_two.head())

# 여러개의 그래프를 그리기 위해서 그리기 객체를 돌려받음 
fig = plt.figure(figsize=(10, 10))
# 2행 1열에서 1번
ax1 = fig.add_subplot(2, 1, 1)
# 2행 1열에서 2번 
ax2 = fig.add_subplot(2, 1, 2)

ax1.plot(sr_one, marker='o', markersize=10, color='orange', linewidth=2, label='서울->전라북도')
ax1.legend(loc='best')
ax2.plot(sr_two, marker='o', markersize=10, color='blue', linewidth=2, label='전라북도->서울')
ax2.legend(loc='best')

#y축 눈금범위 설정
ax1.set_ylim(10000, 150000)
ax2.set_ylim(10000, 150000)

ax1.set_xticklabels(sr_one.index, rotation=75)
ax2.set_xticklabels(sr_two.index, rotation=75)

plt.show()

3. 하나의 영역에 여러개의 그래프 그리기

  • 동일한 영역에서 그리는 함수를 여러 번 호출

4. 막대 그래프

  • 빈도 수를 비교할 때 주로 이용

  • bar(수직), barh(수평) 메소드로 그림

  • 하나의 영역에 2개의 막대 그래프를 그릴 때는 첫번째 막대 그래프의 width를 조정

    • width가 1이면 다음 데이터와 붙어서 출력된다.
    • 2개면 0.5 이하로 설정해서 그리고 3개면 0.33 이하로 설정하면 됩니다.
  • 실습 link

# 서울에서 전라남도, 경상남도, 충청남도, 경기도로
# 전출간 인원을 막대그래프로 비교
import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_excel('../4.Study/data/시도_별_이동자수.xlsx', header=0, fillna=0)
# print(df.head())

# NaN 값들을 이전 값으로 채우기
df = df.fillna(method='ffill')
# print(df.head())

# 전출지별이 서울특별시 이고, 전입지별이 서울특별시가 아닌것
# 마스킹 처리 한다고함.
mask = (df['전출지별'] == '서울특별시') & (df['전입지별'] != "서울특별시")

# mask의 결과가 True인것만 추출
df_seoul = df[mask]
# print(df_seoul.head())

# 불필요한 열 제거
df_seoul.drop(['전출지별'], axis=1, inplace=True)
# print(df_seoul.head())

# 불필요한 행 제거 - 인덱스 설정을 안 한 경우는 일련번호로 제거
# df_seoul.drop([0, 1, 2, 3, 4, 5], inplace=True)

# 기존 컬럼을 인덱스로 설정
df_seoul.set_index(['전입지별'], inplace=True)
# print(df_seoul.head())

# 행단위로 골라내기 - 인덱스를 이용
sr = df_seoul.loc[['경기도', '충청남도', '경상남도', '전라북도']]
# print(sr)

# 행과 열을 치환
sr = sr.T
# print(sr)


if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
#윈도우의 경우
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(
        fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)


# 데이터 모임에 동일한 함수를 적용한 후 결과 만들기
# sr.index에 int 라는 함수를 각 요소마다 대입해서 실행한 후 그 결과를 가지고 다시 데이터의 모임을 생성
sr.index = sr.index.map(int)

# 그래프 그리기
plt.figure(figsize=(15, 6))

plt.bar(pd.RangeIndex(0, len(sr.index), 1), sr['경기도'], color='orange', width=0.25, label='경기도')
plt.bar(pd.RangeIndex(0, len(sr.index), 1)+0.25, sr['전라북도'], color='red', width=0.25, label='전라북도')
plt.bar(pd.RangeIndex(0, len(sr.index), 1)+0.5, sr['충청남도'], color='blue', width=0.25, label='충청남도')
plt.bar(pd.RangeIndex(0, len(sr.index), 1)+0.75, sr['경상남도'], color='green', width=0.25, label='경상남도')

# 범례 표시
plt.legend()

plt.title('서울에서의 인구이동')
plt.show()

5. 히스토그램

  • 각 구간의 데이터 개수를 파악하고자 할 때 사용하는 그래프
  • hist 메소드 이용
  • 실습 link
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle

# 막대 그래프를 이용해서 데이터 개수 출력하기 
# 히스토그램을 이용해서 데이터 개수 출력 하기 

import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import pandas as pd

# lovefruits.csv 파일의 내용 읽어오기 
df = pd.read_csv('../data/lovefruits.csv', encoding='cp949') #인코딩 err 나옴 
print(df)

# 데이터 개수 가져오기 
data = df['선호과일'].value_counts(sort=False)
print(data)

# 그래프의 한글 깨짐
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(
        fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)


plt.bar(range(0, len(data), 1), data)
plt.xticks(range(0, len(data), 1), data.index)
plt.title('과일 선호도조사')
plt.show()

# 히스토그램을 이용해서 데이터 개수 출력하기 - 개수 파악 작업 필요없음 
# 위 코드들이 필요가 읍다)
plt.hist(df['선호과일'])
plt.show()

# 히스토 그램은 bins 옵션을 이용해서 구간의 개수를 설정해서 그릴 수 있다. 
# 연속형 데이터의 히스토그램은 구간 설정을 해야 한다. 
df = pd.read_csv('../data/student.csv', encoding='cp949') #인코딩 err 나옴 
# print(df)
plt.hist(df['수학'])
plt.show()


# 히스토 그램은 bins 옵션을 이용해서 구간의 개수를 설정해서 그릴 수 있다. 
# 연속형 데이터의 히스토그램은 구간 설정을 해야 한다. 
df = pd.read_csv('../data/student.csv', encoding='cp949') #인코딩 err 나옴 
# print(df)
plt.hist(df['수학'], bins=3)
plt.show()
[-]

6. 산포도

  • 2개 컬럼의 관계를 파악하기 위해서 생성
  • 상관여부나 그룹핑할 개수 등을 파악하고자 할 때 먼저 그려보면 효과적이다.
  • scatter 라는 메소드를 이용
  • colorbar를 이용해서 산포도에 그려지는 데이터의 색상에 크기를 적용할 수 있다.
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle
[-]


import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import pandas as pd

# 산포도 그리기
# korea.csv 파일의 내용을 읽어서 학생별 점수를 산포도로 출력 



# 그래프의 한글 깨짐
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(
        fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)

[-]


# 1. 데이터 읽어오기
# 구분자는 , 한글이 포함되어 있고 첫번째 행이 컬럼이름 
df = pd.read_csv('../data/korea.csv', encoding='cp949')
[-]


# 2. 읽어온 데이터 확인
print(df.head())
print(df.info())
[-]


plt.figure()
colormap = df.index
plt.scatter(df.index, df['점수'], marker='2', c=colormap)
plt.xticks(range(0, len(df.index), 1), df['이름'], rotation='vertical')
plt.colorbar()
plt.show()
[-]


# 2개 컬럼의 관계를 파악하기 위한 산포도 
df = pd.read_csv('../data/auto-mpg.csv')
# 열이름 지정 
df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'accleration', 'model year', 'origin', 'name']
print(df.head())
[-]


plt.scatter(df['weight'], df['mpg'])
plt.title('중량과 연비의 관계')
plt.xlabel('연비', size=20)
plt.ylabel('중량', size=20)
plt.show()
[-]


plt.scatter(x=df['mpg'], y=df['weight'], s=df['cylinders']*7) # s는 원의 크기옵션 
plt.title('중량과 연비의 관계')
plt.xlabel('연비', size=20)
plt.ylabel('중량', size=20)
plt.show()

7. 파이 그래프

  • 전체에서의 기여도를 파악할 때 주로 이용
  • 하나의 열을 가지고 작성
  • 메소드이름은 pie
  • explode 옵션에 실수 리스트를 대입하면 중앙에서 대입한 숫자 만큼 떨어져서 그려짐, 0.0~1.0 사이
  • autopct에 숫자 서식을 설정해서 백분율을 표시할 수 있다. %1.1f%% - 소수 첫째 자리까지의 백분율
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle
[-]


import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import pandas as pd




# 그래프의 한글 깨짐
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(
        fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)

[-]


# 1. 데이터 읽어오기
# 구분자는 , 한글이 포함되어 있고 첫번째 행이 컬럼이름 
df = pd.read_csv('../data/korea.csv', encoding='cp949')
print(df)
[-]


# explode 옵션으로 조각 분할 
explode = []
for i in range(0, 20, 1) :
    explode.append(0)
explode[2] = 0.3 
[-]


plt.figure
plt.pie(df['점수'], labels=df['이름'], explode=explode, autopct='%1.1f%%') # 조각분할, 백분율 표시 
plt.title('학생별 기여도')
plt.legend()
plt.show()

8. box-plot 그래프

  • 데이터의 분포를 확인할 때 사용하는 그래프

  • 상자의 중앙선이 중간값 상자의 좌우가 25%, 75%에 해당하는 값

    • 양끝선이 아래쪽 0.75% 정도 위끝선이 99.75% 정도에 해당하는 값
    • 작은 원 으로 표현되는 극단치(outlier)로 판단
  • 중앙선과 양끝단의 선, 상자의 선을 보고 데이터의 분포를 예측

    • 한쪽으로 치우치면 정규분포가 아닌 형태로 판정
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle
[-]


import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import pandas as pd

# 그래프의 한글 깨짐
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(

[-]


df=pd.read_csv('../data/student.csv', encoding='cp949')


[-]



plt.figure()
plt.boxplot((df['국어'], df['영어'], df['수학']), labels=('국어', '영어', '수학'))
plt.show()

9. 면적 그래프

  • 선 그래프의 하단에 색상을 칠한 그래프
  • 목적은 막대그래프와 유사
  • fill_between 이라는 메소드를 이용

seaborn 패키지

  • matplotlib을 기반으로 해서 여러가지 테마와 통계형 차트가 추가된 패키지
  • numpy나 pandas의 자료구조는 그대로 사용

1. regplot 이나 implot 이라는 함수를 이용해서 데이터의 분포와 1차 다항식 그래프를 같이 출력 가능

  • 1차 다항식은 2개의 컬럼의 회귀식입니다.
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle


import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
# 시각적인 효과가 좀금 더 뛰어난 그래프 패키지 
import seaborn as sns

# 그래프의 한글 깨짐
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(
        fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)
[-]


#tips 라는 데이터 가져오기 - 레스토랑에서의 tip에 관련된 데이터 
tips = sns.load_dataset('tips')
print(tips.head())
[-]


fig = plt.figure(figsize=(8,6))
# 1행 2열 1번째 영역
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
sns.set_style('darkgrid')

sns.regplot(x='total_bill', y='tip', data=tips, fit_reg=True, ax=ax1)
sns.regplot(x='total_bill', y='tip', data=tips, fit_reg=False, ax=ax2) #회귀선 False
plt.show()
[-]


# 3개 컬럼의 관계 보기 - lmplot
# x,y, hue 옵션 이용 
# hue에는 카테고리(범주) 데이터를 설정 
fig = plt.figure(figsize=(8,6))
sns.set_style('darkgrid')

sns.lmplot(x='total_bill', y='tip', hue='time', data=tips, fit_reg=True)
#hue는 분류할 대상을 설정, 계산X
plt.show()
[-]

2. 단변량 데이터의 분포를 출력

  • 히스토그램을 이용하는 경우가 많음
  • 히스토그램 대신에 커널밀도함수(kde)를 적용해서 연속적으로 그려서 파악하는 경우가 있다.
  • seaborn의 distplot 이라는 함수를 이용하면 커널 밀도 함수를 적용한 그래프와 히스토그램을 같이 출력할 수 있다.
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle


import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
# 시각적인 효과가 좀금 더 뛰어난 그래프 패키지 
import seaborn as sns


#tips 라는 데이터 가져오기 - 레스토랑에서의 tip에 관련된 데이터 
tips = sns.load_dataset('tips')
print(tips.head())
[-]


# tip 컬럼에 분포를 화인
fig = plt.figure(figsize=(8,6))
sns.set_style("darkgrid")
sns.distplot(tips['tip'])
plt.show()

3. heatmap

  • 크로스 텡블을 시각화할 때 주로 이용
  • 2개 항목을 적용해서 분류한 후 데이터를 출력하는 시각화
  • Dataframe에서 pivot 이라는 함수를 이용해서 2개로 분류하고 계산할 항목과 함수를 지정(함수는 생략하면 합계)
  • heatmap 함수에 데이터를 대입하면 시각화 된다.
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle


import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
# 시각적인 효과가 좀금 더 뛰어난 그래프 패키지 
import seaborn as sns

flights = sns.load_dataset('flights')
print(flights.head())
[-]


#pivot 테이블 만들기
pivot = flights.pivot('month', 'year', 'passengers')
print(pivot)
[-]


plt.figure(figsize=(10,8))
# annot는 값을 화면에 출력할것인지 여부
# fmt는 숫자 출력 포맷으로 d를 설정하면 정수로 출력
sns.heatmap(pivot, annot=True, fmt='d')
plt.show()

4.violin

  • boxplot은 데이터 값들의 상한과 하한, 4분위 수 등을 파악
  • violinplot은 사각형 대신에 커널밀도함수를 적용해서 데이터 개수도 어느정도 파악이 가능

5. 데이터 개수 출력

  • stripplot, swarmplot() 등이 제공

6. 막대 그래프 - barplot

7. 히스토그램 - countplot

8. 데이터프레임의 모든 컬럼의 상관관계를 출력 - pairplot

Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle

import platform
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt 
import seaborn as sns

tips = sns.load_dataset('tips')

plt.figure(figsize=(10,8))
sns.pairplot(tips)
plt.show()

9. 상관관계를 출력하고 히스토그램까지 출력 - joinplot

folium

  • 지도나 단계구분도를 위한 시각화 패키지
  • 자바스크립트 기반으로 interactive(동적으로 변화)하게 시각화
  • 기본 패키지가 아니라서 설치를 해야 함
  • jupyter-notebook이 크롬에서 실행 중이라면 바로 출력 가능
    • 다른 IDE를 사용하는 경우에는 save('파일경로.html')로 저장한 후 브라우저에서 확인
    • IE에서는 자바스크립트 문제로 출력되지 않음
  • 단계 구분도를 만들 때는 각 지역의 경계에 대한 json 데이터가 존재해야한다.
    • 한국 데이터는 southkorea-maps 에서 확인 가능

1. 지도 생성

  • folium.Map(locations=[위도, 경도], zoom_start=확대축소배율)

2. 마커 생성

  • folium.Marker(locations=[위도, 경도], popup=출력될 문자열, icon=이미지).add_to(지도객체)

3. 출력

  • 주피터 노트북 : 지도객체
  • 다른 IDE : 지도객체.save('파일경로')
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle
[-]


import folium
# 지도 생성
m = folium.Map(location=[37.572656, 126.973304], zoom_start=15)
folium.Marker(location=[37.572656, 126.973304], popup='KB Card', icon=folium.Icon(icon='cloud')).add_to(m)
folium.Marker(location=[37.569027, 126.987279], popup='메가IT', icon=folium.Icon(icon='red')).add_to(m)
# 한글 깨짐은 파일저장하면 괜찬음 
# 지도 출력 - 주피터 노트북 말고는 안됨. 
m
#지도 저장
# m.save('map.html')
[-]


import pandas as pd

# 서울지역 대학교 파일의 내용 읽어오기(학교명, 위도,경도)
df = pd.read_excel('../data/서울지역 대학교 위치.xlsx')
print(df.head())

# m = folium.Map(location=[37.55, 126.98], zoom_start=12)

# 데이터 프레임의 각 셀의 값을 행 단위로 읽기
# zip은 여러개의 데이터를 하나로 묶어주는 함수 - 튜플로 묶어줍니다. 
# name, lat, lng로 나누어서 읽기 
for name, lat, lgn in zip(df['Unnamed: 0'], df['위도'], df['경도']):
    #folium.Marker(location=[lat, lgn], popup=name, icon=folium.Icon(icon='cloud')).add_to(m)
    folium.CircleMarker(location=[lat, lgn], popup=name, radius=10, color='green', fill=True, fill_colore='coral', fill_opacity=0.7).add_to(m)

m

단계구분도 (choropleth)

  • 지도에 색상을 추가해서 시각화 하는 것
  • 데이터와 영역의 경계를 나타내는 json 파일이 필요
  • 우리나라 영역의 경계는 southkorea-maps 에서 확인이 가능
  • 단계구분도에 각 영역의 크기를 왜곡해서 모두 동일한 크기로 보여주도록 하는 것은 엑셀이나 svg를 이용해서 작업합니다
  • 우리나라 경계 관련 데이터 : https://github.com/southkorea/southkorea-maps
Jupyter Server: local
Python 3.7.4 64-bit ('anaconda3': conda): Idle

# 경기도인구데이터.xlsx 파일과 경기도행정구역경계.json
# 파일을 이용한 단계구분도 만들기 
import pandas as pd 

df = pd.read_excel('../data/경기도인구데이터.xlsx', index_col='구분')
# 인덱스에 str 함수를 적용해서 문자열로 자료형을 변경
# 인덱스를 숫자 자료형으로 만들면 인덱스가 행의 위치인지, 인덱스인지 혼동이 올수있다.
# loc[인덱스] , iloc[행의위치] iloc[0]
# 컬럼이 이름들도 문자로 만드는 것이 좋습니다.
# 컬럼의 접근 : 데이터프레임[컬럼이름], 데이터프레임.컬럼이름
# 컬럼의 이름이 숫자이면 데이터프레임.컬럼이름은 사용할 수 없다.

# 컬럼의 이름들을 문자열로 변경
df.columns=df.columns.map(str)
print(df.head())


# json 파일 읽기
import json
geo_data = json.load(open('../data/경기도행정구역경계.json', encoding='utf-8'))
print(geo_data)
[-]


import folium
g_map = folium.Map(location=[37.5500, 126.9800], zoom_start=9)
[-]


# 단계 구분도 만들기
# threshold_scale : 색상을 구분하기 위한 숫자 리스트
# key_on : json 파일에서 각 영역의 이름을 나타내느 프로퍼티를 지정
folium.Choropleth(geo_data=geo_data, 
                  data=df['2017'], 
                  fill_color='YlOrRd', 
                  fill_opacity=0.5, 
                  line_opacity=0.3, 
                  threshold_scale=[10000, 100000, 300000, 500000, 700000], 
                  key_on='feature.properties.name').add_to(g_map)


g_map
# g_map.save('g_map.html')

pandas의 시각화

  • pandas는 matplotlib의 기능 일부분을 소유

  • Dataframe 이나 Series 객체를 가지고 plot이라는 메소드를 호출하면 그래프를 그릴 수 있다

  • kind 옵션에 그래프 종류를 설정하면 된다.

    • line: 선 그래프
    • bar: 수직 막대 그래프
    • barh: 수평 막대 그래프
    • his: 히스토그램
    • box: 박스 플롯
    • kde: 커널 밀도
    • area: 면적 그래프
    • pie: 파이 그래프
    • scatter: 산점도 그래프
    • hexbin: 고밀도 산점도 그래프
  • 세밀한 옵션 고정이 안되서 데이터 탐색을 할 때는 사용하는 경우가 있기는 하지만 시각화하는 용도로는 잘 사용하지 않는다.

import pandas as pd
df = pd.read_csv('../data/seoul.csv')
print(df.head())
df.plot()
728x90
반응형

'Language_Study > Python' 카테고리의 다른 글

[Python] 10-2.데이터전처리  (0) 2021.01.19
[Python] 10-1.데이터전처리  (4) 2021.01.19
[Python] 8.pandas  (0) 2021.01.19
[Python] 7.numpy  (0) 2021.01.19
[Python] 6. parsing  (0) 2021.01.19