반응형

실행 단축키 ctrl+ F11

주석 단축기 CTRL + /

줄 복사 : CTRL+ALT + 아래 방향키

줄 삭제 :CTRL+ C

 

데이터 시각화

matplotlib 모듈

 

import matplotlib.pyplot as plt

plt.plot([1,2,3,4])

plt.show()

 

import matplotlib.pyplot as plt
plt.plot([0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0])
plt.xlabel('x-axis') # x축 라벨
plt.ylabel('y-axis') # y축 라벨
plt.show()

 

x축, y축에 핚글 라벨 설정

=> line_graph_label.py

 

import matplotlib.pyplot as plt

import matplotlib.pyplot as plt
import matplotlib
x = [1,2,3,4,5]
y = [1,2,3,4,5]
# 핚글 라벨 설정 : '맑은 고딕'으로 설정
matplotlib.rcParams['font.family'] = 'Malgun Gothic'
plt.xlabel('x축') # x축 라벨 ( 핚글 라벨 )
plt.ylabel('y축') # y축 라벨
plt.plot(x,y)
plt.show()

 

 

import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4, 5, 6]

y = [1, 4, 5, 8, 9, 5, 3]

plt.figure(figsize=(10,6)) # 크기 설정

plt.plot(x,y,color='green') # 선색깔: green

plt.show()

 



import matplotlib.pyplot as plt

x = [1,2,3,4,5]

y = [1,2,3,4,5]

# plt.plot(x,y)

plt.plot(x,y,'ro') # 'r-', 'g-', 'b-'

plt.show() # 'ro', 'go', 'bo'

# 'rv', 'gv', 'bv'

# plot()은 b- 옵션이 기본값 : 파란색(b) 라인(-)이라는 뜻

# ro 옵션은 빨갂색(r)으로 o표시를 의미함

# bv 옵션은 파란색(b)으로 v표시를 의미함

 

 

점선 그래프 그리기

점선 : plot()함수에 linestyle='dashed' 추가

import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4, 5, 6]

y = [1, 4, 5, 8, 9, 5, 3]

plt.figure(figsize=(10,6))

plt.plot(x,y,color='green', linestyle='dashed')

plt.show()

 

 

 

점선 그래프 그리기

점선 : plot()함수에 linestyle='dashed' 추가

마커 표시 : plot()함수에 marker = 'o' 추가

=>dashed_line_graph02.py

import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4, 5, 6]

y = [1, 4, 5, 8, 9, 5, 3]

plt.figure(figsize=(10,6))

plt.plot(x,y,color='green', linestyle='dashed', marker='o')

plt.show()

 

 

점선 그래프 그리기

점선 : plot()함수에 linestyle='dashed' 추가

마커 표시 : plot()함수에 marker = 'o' 추가

마커 색깔 : plot()함수에 markerfacecolor = 'red'

마커 크기 : plot()함수에 markersize = 12

=>dashed_line_graph03.py

import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4, 5, 6]

y = [1, 4, 5, 8, 9, 5, 3]

plt.figure(figsize=(10,6))

plt.plot(x,y,color='green', linestyle='dashed', marker='o',

markerfacecolor='red', markersize=12)

plt.show()

 

 

산점도

산점도는 2개의 요소로 이루어짂 데이터 집합의 관계 (예를들면, 키와 몸무게 와의 관계, 공부시갂과 시험점수와의 관계, 기온과 아이스크린 판매량과의 관계)를 시각화하는데 유용하다.

산점도를 그리기 위해서는 plot()함수 대신에 scatter()함수 사용함

산점도 형식

plt.scatter( x, y [, s = size, c = colors, marker = ‘marker_string ‘,

alpha = alpha_f ] )

s : 마커의 크기

c : 마커의 색깔

marker : 마커 모양

alpha : 투명도 : 0(완젂 투명) ~ 1(완젂 불투명)

옵션을 지정하지 않으면, 기본값 (s=40, c=‘b’, marker=‘o’, alpha=1 )으로 지정

 

산점도

plot()함수 대신에 scatter()함수 사용함

import numpy as np

import matplotlib.pyplot as plt

x = np.array([0,1,2,3,4,5,6,7,8,9])

y = np.array([9,8,7,9,8,3,2,4,3,4])

plt.figure(figsize=(10,6))

plt.scatter(x,y)

plt.show()

산점도

plot()함수 대싞에 scat

 

 

 

산점도

plot()함수 대싞에 scatter()함수 사용함

marker 의 모양 변경 : scatter()함수에 marker = '>' 추가

marker의 크기 변경 : s = 50

x의 값에 따라 y축 값의 색상을 바꾸는 colormap 추가

scatter()함수에 c=colormap

plt.colorbar()

 

import numpy as np

import matplotlib.pyplot as plt

x = np.array([0,1,2,3,4,5,6,7,8,9])

y = np.array([9,8,7,9,8,3,2,4,3,4])

colormap = x

plt.figure(figsize=(10,6))

plt.scatter(x,y, s=50, c=colormap, marker='>')

plt.colorbar()

plt.show()

 

 

 

import numpy as np

import matplotlib.pyplot as plt

import matplotlib

# '맑은 고딕'으로 설정

matplotlib.rcParams['font.family'] = 'Malgun Gothic'

city = ['서울', '인천', '대젂', '대구', '울산', '부산', '광주']

# 위도(latitude)와 경도(longitude)

lat = [37.56, 37.45, 36.35, 35.87, 35.53, 35.18, 35.16]

lon = [126.97, 126.70, 127.38, 128.60, 129.31, 129.07, 126.85]

# 인구 밀도(/km^2): 2017년 통계청 자료

pop_den = [16154, 2751, 2839, 2790, 1099, 4454, 2995]

scatter_graph03.py ( 2 / 2 )

size = np.array(pop_den) * 0.2 # 마커의 크기 지정

colors = ['r', 'g', 'b', 'c', 'm', 'k', 'y'] # 마커의 컬러 지정

plt.scatter(lon, lat, s=size, c=colors, alpha=0.5)

plt.xlabel('경도(longitude)')

plt.ylabel('위도(latitude)')

plt.title('지역별 인구 밀도(2017)')

for x, y, name in zip(lon, lat, city):

plt.text(x, y, name) # 위도 경도에 맞게 도시 이름 출력

plt.show()

 

 

막대 그래프

막대그래프는 값을 막대의 높이를 나타내므로 여러 항목의 수량이 맋고 적음을 한눈에 파악핛 수 있다. 따라서 여러 항목의 데이터를 서로 비교핛 때 주로 이용한다.

막대 그래프 형식

plt.bar( x, height [, width = width_f, color = colors, tick_label = tick_labels,

align = ‘center’ (기본) , label = labels ] )

x : height와 길이가 일치하는 데이터로 x축에 표시될 위치를 지정

height : 시각화 하고자 하는 막대 그래프 데이터

width : [0, 1]사이의 실수를 지정해 막대의 폭을 조젃

width 옵션을 입력하지 않으면 기본값인 0.8이 입력

color : fmt옵션의 컬러지정 약어로 막대그래프의 색을 지정

tick_label : 막대 그래프 x축의 tick 라벨 이름을 지정 (기본값은 숫자 라벨)

align : 막대 그래프의 위치를 가운데로 핛지(center) 핚쪽으로 치우치게 핛지(edge)

설정 (기본값은 center )

label : 범례에 사용될 문자열을 지정

 

막대 그래프 예제

 

#막대 그래프
import numpy as np
import matplotlib.pyplot as plt
import matplotlib # 한글 라벨 때문에

# '맑은 고딕'으로 설정
matplotlib.rcParams['font.family'] = 'Malgun Gothic'
member_IDs = ['m_01', 'm_02', 'm_03', 'm_04'] # 회원 ID
before_ex = [27, 35, 40, 33] # 운동 시작 젂
after_ex = [30, 38, 42, 37] # 운동 핚 달 후


# 1. 기본 값으로 막대 그래프 출력
n_data = len(member_IDs) # 회원이 네 명이므로 젂체 데이터 수는 4
index = np.arange(n_data) # NumPy를 이용해 배열 생성 (0, 1, 2, 3)
plt.bar(index, before_ex) # bar(x,y)
에서 x=index, height=before_ex 로 지정 막대그래프
plt.show()

# 2. tick_label : x
tick 라벨 설정 (회원 ID로 설정)
#
회원의 id값 나오기
plt.bar(index, before_ex, tick_label = member_IDs)
plt.show()

# 3. color : 막대 그래프의 색깔 설정

colors=['r', 'g', 'b', 'm'] # m : 자홍색(magenta)

plt.bar(index, before_ex, color = colors, tick_label = member_IDs)

plt.show()

# 4. width : 막대 그래프의 폭 설정 ( 기본값 : 0.8 )

plt.bar(index, before_ex, tick_label = member_IDs, width = 0.6)

plt.show()

# 5. plt.barh() : 수평 막대 그래프

colors=['r', 'g', 'b', 'm']

plt.barh(index, before_ex, color = colors, tick_label = member_IDs)

plt.show()

 

막대 그래프 예제

# 6. 최종 그래프 출력

barWidth = 0.4 # c:청록색(cyan), m:자홍색(magenta)

plt.bar(index, before_ex, color='c', align='edge', width = barWidth,

label='before') # 운동전 그래프

plt.bar(index + barWidth, after_ex , color='m', align='edge', width = barWidth, label='after') # 운동후 그래프

plt.xticks(index + barWidth, member_IDs)

plt.legend()

plt.xlabel('회원 ID')

plt.ylabel('윗몸일으키기 횟수')

plt.title('운동 시작 젂과 후의 근지구력(복근) 변화 비교')

plt.show()

 

 

히스토그램

히스토그램(histogram)은 데이터를 정해짂 갂격으로 나눈 후 그 갂격 앆에

들어갂 데이터 개수를 막대로 표시핚 그래프로, 데이터가 어떤 분포를 갖는지를

볼 때 주로 사용핚다.

, 히스토그램은 도수 분포표를 막대 그래프로 시각화핚 것이다.

히스토그램 형식

plt.hist ( x [,bins = bins_n 혹은 ‘auto’ ] )

x : 변량 데이터

bins : 계급의 개수 ( 기본값은 10 )

bins = ‘auto’ 가 입력되면, x에 맞게 자동으로 bins에 값이 들어갂다.

 

도수 분포표의 용어

변량(variate) : 자료를 측정해 숫자로 표시핚 것 ->변하는 데이터

ex) 점수, , 몸무게, 판매량, 시갂 등

계급(class) : 변량을 정해짂 갂격으로 나눈 구갂

ex) 시험점수를 60~70, 70~80, 80~90, 90~100점 구갂으로 나눔

계급의 갂격(class width) : 계급을 나눈 크기 (기본값은 10)

도수(frequency) : 나눠짂 계급에 속하는 변량의 수

ex) 각 계급에서 발생핚 수

도수 분포표(frequency distribution table) : 계급에 도수를 표시핚 것

 

 

도수 분포표 예제

히스토그램을 그리기 위해서는 우선 도수 분포표에 대해서 이해해야 핚다.

어떤 학급에서 수학 시험 결과를 이용해 도수 분포표를 맊드는 과정

1. 변량 생성

학생 25명의 수학 시험 결과

76, 82, 84, 83, 90, 86, 85, 92, 72, 71, 100, 87, 81, 76, 94, 78, 81, 60, 79, 69,

74, 87, 82, 68, 79

2. 계급 갂격 설정 및 계급 생성계급갂격 : 5, 계급 : 8

변량 중 가장 작은 숫자가 60이고, 가장 큰 숫자가 100이므로 60에서 100까지

일정 갂격(여기서는 5로 설정)으로 나눠서 8개의 계급으로 설정

60~65, 65~70, 70~75, 75~80, 80~85, 85~90, 90~95, 95~100

 

 

 

3. 계급별 도수 확인 및 도수 분포표 만들기

<도수 분포표>

#25명 학생들의 수학점수를 히스토그램으로 시각화

import matplotlib.pyplot as plt
import matplotlib

# '맑은 고딕'으로 설정
matplotlib.rcParams['font.family'] = 'Malgun Gothic'

# 25명 학생들의 수학성적
math = [76, 82, 84, 83, 90, 86, 85, 92, 72, 71, 100, 87, 81, 76, 94, 78, 81, 60, 79, 69, 74, 87, 82,68, 79]

# 기본적으로 변량을 10개의 계급으로 나눠서 출력
#히스트그램: 기본값
plt.hist(math)
plt.show()


# 히스트그램: 변량의 크기를 5로 설정해서  8개의 계급
plt.hist(math,bins = 8)
plt.xlabel(
'시험점수')
plt.ylabel(
'도수(frequency)')
plt.title(
'수학 시험의 히스트그램')
plt.grid()
plt.show()

 

 

파이 그래프

파이(pie) 그래프는 원앆에 데이터의 각 항목이 차지하는 비율맊큼 부채꼴의 크기를 갖는 영역으로 이루어짂 그래프이다.

파이 그래프는 젂체 데이터에서 각 항목이 차지핚 비율을 비교핛 때 맋이 사용핚다.

 

파이 그래프 형식

plt.pie(x [, labels = label_seq , #부채꼴에 출력되는 문자열

autopct = ‘비율 표시 형식(ex: %.1f)’ , #소수 몇째자리 까지 출력하는 지 하는 것 .1f ->소수점 반올림으로 한다.

shadow = False(기본) 혹은 True , # 그린자효과

explode = explode_seq , # 부채꼴부분이 원에서 돌출

counterclock = True(기본) 혹은 False , #부채꼴이 그려지는 순서

#기본값은 반시계방향(True)

startangle = 각도 (기본은 0 ) #처음 부채꼴부분이 그려지는

# 각도(기본값은 0)

 

=>pie_graph.py

#파이 그래프
import matplotlib.pyplot as plt
import matplotlib

#한글 글꼴 처리
matplotlib.rcParams['font.family'] = 'Malgun Gothic'

fruit =['사과','바나나','딸기','오렌지','포도']
result = [
7, 6, 3, 2,2]

#1. 파이 그래프
plt.pie(result)
plt.show()

#2. 파이 그래프의 크기
plt.figure(figsize=(8,8))
plt.pie(result)
plt.show()

# 3. 라벨 , 비율 추가
plt.figure(figsize=(8,8))
plt.pie(result ,
labels=fruit , autopct='%.1f%%')  #%% ->%출력
plt.show()

# 4.각도 90도에서 시작해서 시계방향으로 설정
plt.figure(figsize=(8,8))
#startangle= 90 90도 위치에서 출발
#counterclock 시계방향으로 설정
plt.pie(result , labels=fruit , autopct='%.1f%%' ,
       
startangle= 90 ,    #시작 위치 90도 위치
       
counterclock=False) # 시걔방향
plt.show()

# 5.그린자 효과 추가하고 사과 부채꼴맊 강조
#0.1 ->0.2로 하면 더많이 돌출 된다.
#explode_value = (0.1, 0,0,0,0)
#explode_value = (0.2, 0,0,0,0)
#
값이 크면 클 수록 간격이 많이 난다
explode_value = (0.2, 0.1 ,0,0,0)
plt.figure(
figsize=(8,8))
plt.pie(result ,
labels=fruit , autopct='%.1f%%' ,
       
startangle= 90 ,    #시작 위치 90도 위치
       
counterclock=False,
       
shadow=True,# 그림자 속성
       
explode= explode_value#돌출되도록 해주는 역할
       
)
plt.show()

 

선 그래프

 

#pandas 선그래프

import pandas as pd
import matplotlib.pyplot as plt

#시리즈 생성
s = pd.Series([1,2,3,4,5,6,7,8,9,10])
print(s)

s.plot()
# kind ='line' 생략, 선그래프
plt.show()  #이것 까지 해야 한다.

 => pandas_line02.py#1차원 데이터기 때문에 가로세로가 아니라 한쪽 방향으로 나온다.

#pandas 선그래프
import pandas as pd
import matplotlib.pyplot as plt

s = pd.Series([
1,2,3,4,5,6,7,8,9,10],
             
index = pd.date_range('2020-01-01',periods= 10))
print(s)

s.plot()
#선그래프
plt.show()

s.plot(
grid=True) # 격자모양 추가함
plt.show()

 

 

numpy as np

import pandas as pd

import matplotlib.pyplot as plt

# 데이터 세트 맊들기 (3개의 난수로 이루어짂 10개의 배열)

data_set = np.random.rand(10,3)print(data_set)# pandas의 데이터프레임(DataFrame) 생성

df = pd.DataFrame(data_set, columns = ['A','B','C'])

print(df)# 수직 막대 그래프 그리기

df.plot(kind='bar')

plt.show()#

 

수평 막대 그래프 그리기 (horizontal)

df.plot(kind='barh')

plt.show()# 영역 그래프 그리기

 

df.plot(kind='area', stacked=False)

plt.show()

 

 

import matplotlib.pyplot as plt

import pandas as pd

import matplotlib

# '맑은 고딕'으로 설정

matplotlib.rcParams['font.family'] = 'Malgun Gothic'

grade_num = [5, 14, 12, 3]

students = ['A', 'B', 'C', 'D']

 

# columns Student 가 범례로 출

df_grade = pd.DataFrame(grade_num, index=students, columns = ['Student'])

print(df_grade)

 

grade_bar = df_grade.plot.bar(grid = True)

grade_bar.set_xlabel("학점")

grade_bar.set_ylabel("학생수")

grade_bar.set_title("학점별 학생 수 막대 그래프")

plt.show()  

 

산점도 그리기

 

import matplotlib.pyplot as plt

import pandas as pd

import matplotlib

# '맑은 고딕'으로 설정

matplotlib.rcParams['font.family'] = 'Malgun Gothic'

temperature = [25.2, 27.4, 22.9, 26.2, 29.5, 33.1, 30.4, 36.1, 34.4, 29.1]

 

Ice_cream_sales = [236500, 357500, 203500, 365200, 446600, 574200,453200, 675400, 598400, 463100]

dict_data = {'기온‘ : temperature, '아이스크린 판매량‘ : Ice_cream_sales}

df_ice_cream = pd.DataFrame(dict_data, columns=['기온', '아이스크린 판매량'])

print(df_ice_cream)

df_ice_cream.plot.scatter(x='기온', y='아이스크린 판매량',grid=True, title='최고 기온과 아이스크린 판매량')

plt.show()

 

import matplotlib.pyplot as plt

import pandas as pd

 

import matplotlib# '맑은 고딕'으로 설정

matplotlib.rcParams['font.family'] = 'Malgun Gothic'

math = [76,82,84,83,90,86,85,92,72,71,100,87,81,76,94,78,81,60,79,69,74,87,82,68,79]

df_math = pd.DataFrame(math, columns = ['Student'])

 

# 옵션 bins는 계급의 갯수를 의미하며, 기본값은 10이다.

math_hist = df_math.plot.hist(bins=8, grid = True)

math_hist.set_xlabel("시험 점수")

math_hist.set_ylabel("도수(frequency)")math_hist.set_title("수학 시험의 히스토그램")

plt.show() 

 

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt# 5개의 난수로 이루어짂 데이터 생성

data = np.random.rand(5)

print(data)

 

# pandas 시리즈형 데이터로 변홖

s = pd.Series(data, index=['a','b','c','d','e'], name='series')

print(s)

 

# pie 그래프 출력

s.plot(kind='pie', autopct='%.2f', figsize=(7,7))

plt.show() 

 

 

import matplotlib.pyplot as plt

import pandas as pd

import matplotlib# '맑은 고딕'으로 설정

matplotlib.rcParams['font.family'] = 'Malgun Gothic'

fruit = ['사과', '바나나', '딸기', '오렌지', '포도']

result = [7, 6, 3, 2, 2]

df_fruit = pd.Series(result, index = fruit, name = '선택한 학생수')

print(df_fruit)

df_fruit.plot.pie()

plt.show() 

 

 

explode_value = (0.1, 0, 0, 0, 0) # pie 가격설정

fruit_pie = df_fruit.plot.pie(figsize=(5, 5), autopct='%.1f%%',startangle=90, counterclock = False,explode=explode_value, shadow=True, table=True)

fruit_pie.set_ylabel("") # 불필요핚 y축 라벨 제거

fruit_pie.set_title("과일 선호도 조사 결과")# 그래프를 이미지 파일로 저장. dpi 200으로 설정plt.savefig('saveFruit.png', dpi = 200)

plt.show() 

 

 

seaborn 모듈

 

import seaborn as sns

titanic = sns.load_dataset(‘titanic’)

 

titanic 데이터셋에는 탑승객 891명의 정보가 담겨져 있다.index : 891 ( 0 ~ 890 )columns : 15 columns Titanic 

 

import seaborn as sns# titanic 데이터셋 가져오기

titanic = sns.load_dataset('titanic')# titanic 데이터셋 살펴보기print(titanic.head())

print('\n')print(titanic.info())                 

반응형

'Study > 머신러닝' 카테고리의 다른 글

머신러닝-6  (0) 2020.11.19
머신러닝-5  (0) 2020.11.19
머신러닝-4  (0) 2020.11.17
머신러닝-3  (0) 2020.11.16
머신러닝-2  (0) 2020.11.14
반응형

수집 -> 탐색 -> 가공

탐색     -> 데이터 정보 출력

           -> 시각화

 

선 그래프

시계열 쪽 추이 등 보여주는 것

인구변화 등 추이

 

import pandas as pd

 

#pop = pd.read_excel('./Desktop/data/시도__이동자수.xlsx')

#pop = pd.read_excel('./Desktop//data/시도__이동자수.xlsx',fillna = 0 )

pop = pd.read_excel('./Desktop//data/시도__이동자수.xlsx',fillna = 0,header = 0 )

 

 

print(pop.head())

 

 

#na(None,numpy.NaN...) 값을 앞의 데이터로 채우기

#파이썬의 분석 라이브러리의 수정하는 메소드들은

#대부분 수정해서 복사본을 리턴합니다.

#원본에 반열할 때는 다시 대입하거나

#inplace옵션이 있으면 이 옵션에 True를 대입

pop = pop.fillna(method='ffill')

print(pop.head())

 

 

#전출지별은 서울 특별시 이고 전입지는 서울특별시가

#아닌 데이터만 추출하기 위한 조건 만들기

mask = (pop['전출지별'] =='서울특별시') & (pop['전입지별'] !='서울특별시')

print(pop[mask])

#df_seoul = pop[mask]

 

#전출지별 열을 제거

df_seoul = pop[mask].drop(['전출지별'], axis = 1)

print(df_seoul)

 

 

print(pop)

#전입자별 컬럼이름을 전입지로 수정

#inplace옵션을 이용해서 원본에 반영

#axis = 1 행단위를 열단위로

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)

 

import matplotlib.pyplot as plt

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

 

 

 

# matplotlib 한글 폰트 오류 문제 해결

from matplotlib import font_manager, rc

import platform

   

#매킨토시의 경우

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 )) #데이터 많으면 여기 조정 해야 한다.

#눈금 조정

plt.xticks(size = 10, rotation = 'vertical')

#그래프 그리기

plt.plot(sr_one.index, sr_one.values, marker = 'o' , markersize = 10)

 

#그래프 제목 만들기

plt.title('서울에서 전라남도로의 이동',size = 30)

#축제목 만들기

plt.xlabel('기간',size = 20)

plt.ylabel('인구 수',size = 30)

#범 례

plt.legend(labels=['서울 -> 전라남도'],loc ='best',fontsize = 15)

 

#그래프 위에 글자 작성

plt.annotate('인구이동 감소',xy = (40, 50000), rotation = -11, va = 'baseline',ha = 'center',fontsize = '15')

 

plt.show()         

 

**시각화

=>데이터의 형태를 파악하거나 보고서를 만들 목적으로 그래프나 지도 등을 출력하는 작업

=>matplotlib(기본 시각화),pandas, seaborn(시각적인 효과가 조금 더 뛰어남 ) ,folium(지도 , 단계구분도) 등을 주로 이용

 

1.꺽은선 그래프 -plot

=>날짜나 시간에 따른 변화량 또는 2개의 컬럼을 가지고 데이터의 분포를 알아볼 때 많이 이용

 

 

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

객체 = plt.figure(figsize = (가로크기 , 세로크기))

변수 1 = 객체.add_subplot(행의 개수 , 열의 개수, 자신의  번호 )

변수 2 = 객체.add_subplot(행의 개수, 열의 개수 , 자신의 번호) ..

 

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

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

 

 

#기존 데이터에서 전라남도에서 서울로 이동한 인구수 찾기

mask = (pop['전출지별'] == '전라남도') & (pop['전입지별'] != '전라남도')

df_jeo = pop[mask]

#print(pf_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 ='서울->전라남도')

ax2.plot(sr_two, marker='o' , markersize = 10, color='green',linewidth = 2, label ='전라남도->서울')

 

#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()

 

=>하나의 그래프에 그리기

ax1.plot(sr_one, marker='o' , markersize = 10, color='orange',linewidth = 2, label ='서울->전라남도')

ax1.plot(sr_two, marker='o' , markersize = 10, color='green',linewidth = 2, label ='전라남도->서울')

 

 

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

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

 

4. 막대 그래프

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

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

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

width1이면 다음 데이터와 붙어서 출력됩니다.

2개면 0.5이하로 설정해서 그리고 3개면 0.33이하로 설정하면 됩니다.

 

 

 

 

##서울에서 전라남도 , 경상남도 ,충청남도

##전출간 인원을 막대 그래프로 비교

#비교는 막대 그래프 추이는 선

#커널을 제시작

import pandas as pd

 

df = pd.read_excel('./Desktop//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],axis = 1, inplace = True)

#print(df_seoul.head())

 

#기존 컬럼을 인덱스로 설정

df_seoul.set_index(['전입지별'],inplace =True)

print(df_seoul.head())

 

 

#행단위로 골라내기 - 인덱스를 이용

sr= df_seoul.loc[['경기도','충청남도','경상남도','전라남도']]

print(sr)

 

 

#행과 열을 치환

sr = sr.T #행과 열 치환

print(sr)

T ->행과 열 치환

cross tab

set_index

 

 

#데이터 모임에 동일한 함수를 적용한 후 결과 만들기

#sr.index int라는 함수를 각 요소마다 대입해서 실행 한 후

# 그 결과를 가지고 다시 데이터의 모임을 생성

sr.index = sr.index.map(int)

 

import matplotlib.pyplot as plt

 

 

# matplotlib 한글 폰트 오류 문제 해결

from matplotlib import font_manager, rc

import platform

   

#매킨토시의 경우

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.figure(figsize = (15,6))

 

plt.bar(pd.RangeIndex(0,len(sr.index),1),sr['경기도'],width = 1)

 

 

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

#그냥 그리면 한글이 깨진다.

plt.show()

 

#데이터 모임에 동일한 함수를 적용한 후 결과 만들기

#sr.index int라는 함수를 각 요소마다 대입해서 실행 한 후

# 그 결과를 가지고 다시 데이터의 모임을 생성

sr.index = sr.index.map(int)

 

import matplotlib.pyplot as plt

 

 

# matplotlib 한글 폰트 오류 문제 해결

from matplotlib import font_manager, rc

import platform

   

#매킨토시의 경우

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.figure(figsize = (15,6))

 

#plt.bar(pd.RangeIndex(0,len(sr.index),1),sr['경기도'],width = 1)

 

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 = 'green',width = 0.25,label ='전라남도')

plt.bar(pd.RangeIndex(0,len(sr.index),1)+0.5,sr['충청남도'],color = 'red',width = 0.25,label ='충청남도')

plt.bar(pd.RangeIndex(0,len(sr.index),1)+0.75,sr['경상남도'],color = 'blue',width = 0.25,label ='경상남도')

 

#범례 표시

# 색갈에 대해서 구분하기 힘들 다.

plt.legend()

 

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

#그냥 그리면 한글이 깨진다.

plt.show()

 

#경기도 빼면 어느 정도 구분이 된다.

#데이터 모임에 동일한 함수를 적용한 후 결과 만들기

#sr.index int라는 함수를 각 요소마다 대입해서 실행 한 후

# 그 결과를 가지고 다시 데이터의 모임을 생성

sr.index = sr.index.map(int)

 

import matplotlib.pyplot as plt

 

 

# matplotlib 한글 폰트 오류 문제 해결

from matplotlib import font_manager, rc

import platform

   

#매킨토시의 경우

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.figure(figsize = (15,6))

 

#plt.bar(pd.RangeIndex(0,len(sr.index),1),sr['경기도'],width = 1)

 

#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 = 'green',width = 0.25,label ='전라남도')

plt.bar(pd.RangeIndex(0,len(sr.index),1)+0.5,sr['충청남도'],color = 'red',width = 0.25,label ='충청남도')

plt.bar(pd.RangeIndex(0,len(sr.index),1)+0.75,sr['경상남도'],color = 'blue',width = 0.25,label ='경상남도')

 

#범례 표시

# 색갈에 대해서 구분하기 힘들 다.

plt.legend()

 

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

#그냥 그리면 한글이 깨진다.

plt.show()

 

#경기도 빼면 어느 정도 구분이 된다.

막대그래프는 비슷한 것 끼리  비교해야 한다. 아니면 비교가 어렵다.

 

 

 

하나는 마이너스 곱하고 다른 하나는 정상으로

단위가 2개 있으면 하나에 두개 그리기  추이하고 가격

 

 

 

 

5. 히스트그램

=>각 구간의 데이터 개수를 파악하고자 할 때 사용하는 그래프

=>hist메소드를 이용

 

#lovefruits.csv파일의 내용 읽어오기

df = pd.read_csv('./Desktop/data/lovefruits.csv')

print(df)

 

 

 

#lovefruits.csv파일의 내용 읽어오기

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

print(df)

 

#막대 그래프를 이용해서 데이터 개수 출력하기

data= df['선호과일'].value_counts(sort = False)

print(data)

 

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('./Desktop/data/student.csv',encoding = 'cp949')

print(df)

 

#plt.hist(df['수학']) #데이터가 많을 수 있다.

plt.hist(df['수학'],bins= 3) #3개 구간으로 나누어진다.

plt.show()

 

 

#연속적인가 범주이냐 등에서 달라진다.

#선호도는 범주형 이기 때문에 bins를 설정할 필요없다.

#점수는 완전한 연속형이 아니지만 연속형이여서 bins를 설정해야 한다.

 

 

 

 

 

6. 산포도

=>2개 컬럼의 관계를 파악하기 위해서 생성

=>상관여부나 그룹핑할 개수 등을 파악하고자 할 때 먼저 그려보면 효과적입니다.

=>scatter라는 메소드를 이용

=>colorvar를 이용해서 산포도에 그려지는 데이터의 색상에 크기를 적용할 수 있습니다.

한방형으로 줄어들거나 크지면 상관관계가 높다.

상관관계와 두개 이상 그룹핑하면 상관관계와 관계없다.

몇개의 그룹을 만드는지 어떻게 그룹핑하면 좋을지는 산포도를 그래면 된다.

생활비 , 교통비 등 등급 으로 만들고 싶을 때 각각의 2-3개 묶어서 상관관계 높은지 파악할 수 있다.

관계를 파악하고 작업을 해야 한다.

 

 

#2개 컬럼의 관게를 파악하기 위한 산포도

df = pd.read_csv('./Desktop/data/auto-mpg.csv')

 

#열 이름 지정

df.columns = ['mpg','cylinders','displacement','horsepower','weight','accleration','model year','origin','name']

print(df.head())

 

#s는 원의 크기 옵션

plt.scatter(x = df['weight'], y = df['mpg'],s= df['cylinders']*10,alpha = 0.5)

plt.title('중량과 연비의 관계')

plt.xlable('중량',size = 20)

plt.xlable('연비',size = 20)

plt.show()

#반비례 상관관계

 

7.파이 그래프

=>전체에서의 기여도를 파악할 때 주로 이용

=>하나의 열을 가지고 작성

=>메소드이름은 pie

=>explode옵션에 실수 리스트를 대입하면 중앙에서 대입한 숫자 만큼 떨어져서 그려짐 , 0.0~ 1.0사이

=>autopct에 숫자 서식을 설정해서 백분율을 표시할 수 있음 ㅣ '%1.1f%%' -소수 첫째자리 까지의 백분율

 

 

#파이 그래프

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

print(df.head())

 

 

explode = []

for i in range(0,20):

    explode.append(0)

explode[2] = 0.3

# 튀여 나오게 하는 것은 잴 큰것 찾아서 혹은 잴 작은 애

 

plt.figure(figsize = (15,8))

plt.pie(df['점수'],labels=df['이름'],explode = explode, autopct = '%1.1f%%')

plt.title('학생별 기여도')

plt.legend()

plt.show()

#max는 잴 큰것

 

#파이 그래프

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

print(df.head())

 

 

explode = []

for i in range(0,20):

    explode.append(0)

#explode[2] = 0.3

#explode[df['점수'].idxmax(axis = 1)]= 0.3

explode[df['점수'].idxmin(axis = 1)]= 0.3

# 튀여 나오게 하는 것은 잴 큰것 찾아서 혹은 잴 작은 애

 

plt.figure(figsize = (15,8))

plt.pie(df['점수'],labels=df['이름'],explode = explode, autopct = '%1.1f%%')

plt.title('학생별 기여도')

plt.legend()

plt.show()

#max는 잴 큰것

 

print(df['점수'].idxmax(axis = 1)) #젤 큰 값의 인덱스

 

8.box-plot 그래프

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

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

양끝선이 아래쪽 0.75%정도 위끝선은 99.75% 정도에 해당하는 값

작은 원으로 표현되는 극단치(outlier)로 판단

=>중앙선과 양끝단의 선, 상자의 선을 보고 데이터의 분포를 예측

한쪽으로 치우치면 정규분초가 아닌 형태로 판정

 

#상자그래프 그리기

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

 

plt.figure()

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

plt.show()

 

 

9.면적 그래프

=>선 그래프의 하단에 색상을 칠한 그래프

=>목적은 막대그래프와 유사

=>fill_between이라는 메소드를 이용

 

**seaborn패키지

=>matplotlib 을 기반으로 해서 여러가지 테마아 통계형 차트가 추가된 패키지

=>numpypandas의 자료구조는 그대로 사용

 

http://seaborn.pydata.org/

문서: http://seaborn.pydata.org/tutorial/aesthetics.html

 

 

set: http://seaborn.pydata.org/generated/seaborn.set.html

set_style: http://seaborn.pydata.org/generated/seaborn.set_style.html

set_color_codes: http://seaborn.pydata.org/generated/seaborn.set_color_codes.html

 

 

 

http://seaborn.pydata.org/examples/index.html

 

pandas는 샘플 데이터 가지지 않는다. 하지만 seaborn부터는 샘플 데이터 몇개 가지고 있다.

 

 

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

1차 다항식은 2개의 컬럼의 회귀식입니다.

 

#커널을 재시작 import된 모든 라이브러리 제거

#변수도 모두 제거

import matplotlib.pyplot as plt

#시각적인 효과가 조금더 뛰어난 그래프 패키지

import seaborn as sns

 

#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')#색상 쓰지 않아도 style을 정한다.

 

#data dataframedmf x,y에 컬럼이름을 설정

sns.regplot(x = 'total_bill' , y = 'tip' ,data = tips, fit_reg = True, ax = ax1) #회귀 최소한 2개 있어ㅑ 한다. x y

sns.regplot(x = 'total_bill' , y = 'tip' ,data = tips, fit_reg = False, ax = ax2) #회귀 선이 안나온다.

 

 

 

plt.show()

 

 

 

#3개 컬럼의 관계보기 -lmplot

#x,y,hue옵션 이용

#hue 에는 카테고리(범주) 데이터를 설정

fig = plt.figure(figsize = (8,6))

sns.set_style('darkgrid')#색상 쓰지 않아도 style을 정한다.

#sns.lmplot(x = 'total_bill' , y = 'tip' ,hue = 'sex', data = tips, fit_reg = True)

sns.lmplot(x = 'total_bill' , y = 'tip' ,hue = 'smoker', data = tips, fit_reg = True)

 

plt.show()

 

 

 

밀도추정 데이터가 다를수 있지만 계속 모아다 나면 예측이 가능하다.

밀도는 확률

hist그램은 연속적이지 못한다. bins에 따라 많이 달라진다. 메모리 문제가 생길 수 도 있다. ->kerder density Estinmation

Kernel Density Estimation (커널 밀도 추정)

 

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

=>히스트그램을 이용하는 경우가 많음 - 쉽다는 장점은 있지만 불연속하게 그려집니다.

=>히스트그램 대신에 커널밀도함수(kde)를 적용해서 연속적으로 그려서 파악하는 경우가 있음

=>seaborndisplot이라는 함수를 이용하면 커널 밀도 함수를 적용한 그래프와 히스트그램을 같이 출력할 수 있음

 

 

#tip컬럼에 분포를 확인

fig = plt.figure(figsize=(8,6))

sns.set_style("darkgrid")

sns.distplot(tips['tip'])

plt.show()

tip을 안주는 사람은 구분하지 못한다.

안준 분이 510불 준 분은 2

1불은 나올수 없는 것이다. 비연속

1불을 줄수 도 있는 것이고  

데이터 예측은 연속적이여야 한다. 없다고 하면 안된다.

 

 

 

#tip컬럼에 분포를 확인

fig = plt.figure(figsize=(8,6))

sns.set_style("darkgrid")

#sns.distplot(tips['tip'])

sns.distplot(tips['tip'],hist=False)

plt.show()

 

이산 :디지털

범주형 -> 불연속성 -> 연속으로 만드는 것이 정밀도

 

3.heatmap

=>크로스 테이블을 시각화할 때 주로 이용

=>2개 항목을 적용해서 분류한 후 데이터를 출력하는 시각화

=>Dataframe에서 pivot이라는 함수를 이용해서 2개로 분류하고 계산할 항목과 함수를 지정(함수는 생략하면 합계)

=>heatmap함수에 데이터를 대입하면 시각화 된다.

fmt = 'd'

=>

#heatmap(2가지로 분류해서 하나의 통계값 출력) 만들기

flights = sns.load_dataset('flights')

print(flights.head())

 

#pivot테이블 만들기

pivot = flights.pivot('month','year','passengers')

print(pivot)

 

 

fig = plt.figure(figsize=(8,6))

#글자는 annotation

#annot 는 데이터를 화면에 출력할 것인지 여부

#fmt는 숫자 출력 포맷으로 d를 설정하면 정수로 출력

sns.heatmap(pivot, annot = True,fmt = 'd')

plt.show()

 

 

4.violinplot

=>boxplot은 데이터 값들의 상한과 하한 , 4분위 수 등을 파악

=>violinplot은 시각형 대신에 커널밀도 함수를 적용해서 데이터 개수도 어느 정도 파악이 가능

 

5.데이터 개수 출력

=>strippot, swarmplot()등이 제공

 

6.막대 그래프 -barplot

 

7.히스트그램-countplot

 

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

 

 

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

 

 

#tips데이터의 모든 컬럼의 산저모를 출력

 

pythoh, r, 에서 시각화

=>탐색

=>보고서

**folium

=>지도나 단계구분도를 위한 시각화 패키지

=>자바스크립트 기반으로  interactive(동적으로 변화)하게 시각화

=>기본패키지가 아니라서 설치를 해야 함

=>jupyter-notebook이 크롬에서 실행중이라면 바로 출력 가능

다른 ide를 사용하는 save('파일 경로.html'로 저장한 후 브라우저에서 확인

ie에서는 자바스크립트 문제로 출력되지 않음

 

=>단계구분도를 만들 때는 각 지역의 경계에 대한 json데이터가 존재해야 합니다.

한국 데이터는 southkorea-maps에서 확인 가능

 

 

 

1지도 생성

folium.Map(location=[위도, 경도], zoom_start = 확대축소비율)

 

 

2.마커 생성

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

 

3.출력

-주피터 노프복: 지도 객체

-다른 ide:지도 객체.save('파일경로')

 

크롬으로 변경

 

 

import folium

#지도 생성

m = folium.Map(location = [37.572656, 126.973304], zoom_start = 15)

#zoom_start 숫자가 크면 클수록 축소가 된다.

folium.Marker(location=[37.572656, 126.973304],popup='KB Card',icon = folium.Icon(icon='cloud')).add_to(m)

folium.Marker(location=[37.569027, 126.988000],popup='김떡순 원조',icon = folium.Icon(icon='cloud')).add_to(m)

#여기서는 한글이 때지지만 save하면 한글에 아무 문제도 없다.

#지도 출력

m

#지도 저장

#m.save('map.html')

# spyder에서 하면 m.save해서 봐야 한다.

 

 

semi-project 조 편성

인원은 3 ~ 4 : 5개조

딥러닝 프로젝트를 1개씩 배정

 

취업 분야

-      AI분야

-      개발분야

 

개발 분야로 취업을 생각했으면 프로젝트 하면서 웹 서버 개발  프로젝트를 진행

개발 분야로 취업을 생각한 경우 프로젝트는 웹 서버를 만들어서 데이터를 가지고 홤녀에 출력하고 Open API를 제공해서 모바일(android)에서 출력

 

kaggle

 

개발 일지 만들기

 

 

 

어려운 부분하고

어떻게 극복했는지

 

소스 다하고 소스 올리기 형상관리 여부 확인

 

 

카카오톡 아니고 slack 사용하기

반응형

'Study > 데이터 분석' 카테고리의 다른 글

데이터분석-7  (0) 2020.11.11
데이터분석-6  (0) 2020.11.10
데이터분석-4  (0) 2020.11.08
데이터분석-3  (0) 2020.11.08
데이터분석-2  (0) 2020.11.08

+ Recent posts