1. 막대 그래프

🚀  집단별 차이를 표현할 때 막대 그래프를 주로 사용 
       ⚡️  수량의 많고 적음 비교, 변화된 양에 대한 일별, 월별, 연별 통계 등의 비교
🚀  가독성 면에서 항목의 개수가 적으면 가로 막대가 좋고 항목이 많으면 세로 막대가 보기 편함

 

    📌  막대 그래프는 bar() 함수에 x축, y축 데이터를 지정하여 그림

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('../input/fine_dust.xlsx', index_col='area')
data2016 = data[2016]
data2016.head()
'''
area
Seoul       48.0
Gyeonggi    53.0
Incheon     49.0
Busan       44.0
Daegu       43.0
Name: 2016, dtype: float64
'''

1) 세로 막대

# 2016년 지역별 미세먼지 세로 막대 그래프
plt.figure(figsize=(15, 4))
plt.bar(data2016.index, data2016, color='g')  
# x축에 data2016의 인덱스를, y축 데이터에 data2016 값을 지정
plt.title('2016 Fine Dust Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)  # y축 범위를 35-55 정함
plt.grid()
plt.show()

출력 결과

 


 

2) 그룹 세로 막대 그래프

import numpy as np
index = np.arange(4)
# NumPy의 np.arange() 함수는 주어진 범위와 간격에 따라 균일한 값을 갖는 어레이를 반환

plt.figure(figsize=(15, 4))
df1 = data.loc['Seoul':'Busan', 2016:2019]  
# (행) 서울, 경기, 인천, 부산 지역의 (열) 2016~2019년 데이터만 추출.

for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴.
    plt.bar(index, chart_data, width=0.2, label=str(year))  # 두께 0.2의 막대 그래프를 지정.
    index = index + 0.2   # 출력되는 위치를 0.2씩 이동
    
plt.title('2016 ~ 2019 Fine Dust Group Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)
# x축 눈금을 가운데로 지정하기 위해 막대그래프를 마지막 위치에서 0.5 빼주고, x축 눈금 이름을 지정.
plt.xticks(index - 0.5, ['Seoul', 'Gyeonggi', 'Incheon', 'Busan'])
plt.legend()
plt.show()

 

💡  xticks(), yticks() 함수에 파이썬 리스트 또는 NumPy 어레이를 입력하면 눈금과 숫자 레이블이 표시

 

출력 결과

 


 

3) 그룹 누적 가로 막대 그래프

 

🚀  2016 ~ 2019 지역별 미세먼지 그룹 막대 그래프를 누적하여 가로 방향으로 변경하여 표현
🚀  누적 막대 그래프를 그리는 것은 기존 막대 그래프 위에 막대 그래프를 하나 더 그리는 형식
        ▶️ 이를 위해서는 index의 위치를 변경해야 함
        ▶️ 가로 방향으로 바꾸는 것은 bar() 대신 barh()를 사용하면 됨
        ▶️ 막대 그래프를 가로 방향으로 변경했으므로 x축 및 y축 이름, x축 및 y축 눈금도 가로 방향에 맞게 변경

# 2016 ~ 2019 지역별 미세먼지 그룹 누적 가로 막대 그래프
ndex = np.arange(4)

plt.figure(figsize=(15, 4))
df1 = data.loc['Seoul':'Busan', 2016:2019]  # 서울, 경기, 인천, 부산 지역의 2016~2019년 데이터만 추출.
for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴.
    plt.barh(index, chart_data, label=str(year))  # barh() 사용
    
plt.title('2016~2019 Fine Dust Group Bar Graph')
plt.ylabel('area')
plt.xlabel('micrometer')
plt.xlim(30, 55)
plt.yticks(index, ['Seoul', 'Gyeonggi', 'Incheon', 'Busan'])
plt.legend()
plt.show()

 

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


출처 : 위키독스 (https://wikidocs.net/92083)

 

1.  선 그래프

 

🚀  연속적으로 변하는 데이터를 시각화할 때 사용
🚀  일반적으로 선 그래프는 시간에 따라 데이터의 연속적인 변화량을 관찰할 때 자주 사용
       ⚡️  예를 들어 시간에 따른 온도 변화량, 수출액 변화량, 교통 사고량 등을 시각화 할 때 유용하게 사용
🚀  선 그래프는 수량을 점으로 표시하면서 선으로 이어 그리기 때문에 증가와 감소 상태를 쉽게 확인할 수 있음

    📌  선 그래프는 plot()에 x축, y축 데이터를 선택하여 출력
    📌  x축에 시간 변수를 지정하여 시간 변화량을 나타내는 시계열 데이터를 표현하는 그래프에도 많이 사용

# 2001년 ~ 2019년까지의 미세먼지 데이터 'fine_dust.xlsx'를 이용하여 선 그래프로 표현.

import pandas as pd
import matplotlib.pyplot as plt

# 1) 2019년 데이터 읽기
data = pd.read_excel('../input/fine_dust.xlsx', index_col='area')
data

출력 결과

# 2019 데이터 가져오기
data2019 = data[2019]
data2019.head()

'''
area
Seoul       42.0
Gyeonggi    46.0
Incheon     43.0
Busan       36.0
Daegu       39.0
Name: 2019, dtype: float64
'''
# 2) 2019년 지역별 미세먼지 선 그래프
plt.figure(figsize=(15, 4))
plt.plot(data2019, color='b', marker='o')  # 파란색 선과 원형 마커 지정
plt.title('2019 Fine Dust Line Graph')  # 제목 설정
plt.xlabel('area')  # x축 명칭
plt.ylabel('micrometer')  # y축 명칭
plt.grid()  # 격자 표시
plt.show()

출력 결과

 

# 3) 2016 ~ 2019년 미세먼지 선 그래프
# 2016년 데이터를 가져와 chartdata에 저장하고 마커 및 이름을 지정하는 과정을 2019년까지 반복.
plt.figure(figsize=(15, 4))
for year in range(2016, 2020):
    plt.plot(data[year], marker='o', label=year)
plt.title('2016~2019 Fine Dust Line Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.legend()
plt.grid()
plt.show()

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  맷플룻립 Matplotlib 라이브러리

🥑  맷플룻립 라이브러리는 그래프를 그릴 때 가장 많이 사용하는 파이썬 라이브러리 중 하나
🥑  맷플룻립을 활용하면 다양한 유형의 그래프를 간편하게 그릴 수 있음
🥑  시각화할 때 데이터로 리스트나 딕셔너리 자료형도 가능하지만 데이터프레임을 이용하면 새로운 그래프에 적용하는 것이 더 쉽기 때문에 대부분 데이터프레임 자료형을 이용

  ⚡️ matplotlib은 MATLAB(과학 및 공학 연산을 위한 소프트웨어)의 시각화 기능을 모델링해서 만들어짐
  ⚡️ 공식 홈페이지 : https://matplotlib.org/

 

Matplotlib — Visualization with Python

seaborn seaborn is a high level interface for drawing statistical graphics with Matplotlib. It aims to make visualization a central part of exploring and understanding complex datasets. statistical data visualization Cartopy Cartopy is a Python package des

matplotlib.org


 

2. 시각화 옵션

 

1) 제목 지정  title()


🥑  그래프 제목은 title() 메서드를 사용하여 표현
🥑  제목은 기본적으로 영어를 사용하는데, 한글을 사용하려면 별도의 설정을 해야 함

# 제목 지정
import matplotlib.pyplot as plt  # 모듈 import

plt.title('Line Graph')  # 제목 지정
xdata = [2, 4, 6, 8]  # x 축 값 지정
ydata = [1, 3, 5, 7]  # y 축 값 지정
plt.plot(xdata, ydata)
plt.show()

출력 결과

 

 

📍 pyplot.plot() 함수에 리스트(= x축과 y축에 들어갈 값 )를 입력함 

📍 show() 함수는 그래프를 화면에 나타나도록 함

 

 

 

 

 

 

 

 


 

2) 범례

 

🥑  범례란 사용자가 내용을 인지하기 쉽도록 본보기로 표시하는 데 사용

🥑  그래프 범례는 두 개 이상의 데이터를 표현할 때 사용
🥑  범례 추가는 plot()을 활용하여 표현하는 데, plot()의 label 속성값에 원하는 문자열을 작성하고

      그래프를 그리기 전에 legend() 메서드를 실행

# 범례 지정
plt.title('Legend')
data1 = [2, 4, 6, 8]
data2 = [8, 6, 4, 2]
plt.plot(data1, label='asc')
plt.plot(data2, label='desc')
plt.legend()
plt.show()

출력 결과


 

3) 색상 지정

 

🥑  그래프 색상은 plot() 메서드에 color 속성을 추가하여 표현

# 색상 지정
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color='red')
plt.show()

출력 결과

 


 

4) x축 및 y축 이름 지정  

 

🥑  x축 이름은 xlabel()를 사용하고, y축 이름은 ylabel()을 사용하여 표현

# x축 및 y축 이름 지정
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata)
plt.xlabel('X value')
plt.ylabel('Y value')
plt.show()

출력 결과

 


5) 그래프 선 모양 지정

 

🥑  그래프 선 모양은 plot()의 linestyle 속성을 이용하여 표현
🥑  linestyle 속성으로 실선은 '-', 파선은 '--', 점쇄선 '-.', 점선은 ':' 기호로 지정

# 그래프 선 모양 지정
xdata = [2, 4, 6, 8]
ydata = [8, 6, 4, 2]
plt.plot(data1, color='r', label='dashed', linestyle='--')
plt.plot(data2, color='g', label='dotted', linestyle=':')
plt.legend()
plt.show()

 

출력 결과

 


 

6) 그림 범위 지정  xlim(), ylim()

 

🥑  plot()을 사용하여 그래프를 표현하다 보면 몇몇 점들은 그림의 범위 경계선에 있어서 잘 보이지 않을 때가 있다
🥑  이 때, xlim() 메서드와 ylim() 메서드를 사용하면 그림의 범위를 수동으로 지정할 수 있다.
        ▶️  xlim(x축 최솟값, x축 최댓값), ylim(y축 최솟값, y축 최댓값)
🥑  plot()의 marker 속성을 지정하면 선에 점 모양을 다양하게 변경할 수 있음

# 그림 범위 지정
plt.title('X, Y range')
xdata = [10, 20, 30, 40]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color='b', linestyle='--', marker='o', markersize='10')
plt.xlim(0, 50)
plt.ylim(-5, 15)
plt.show()

출력 결과

 


 

3. 내장 시각화 옵션

 

👩🏻‍🚀  판다스를 이용하면 시각화 라이브러리를 임포트 하지 않아도 내장 그래프 도구를 이용하여 기본적인 시각화를 할 수 있음
👩🏻‍🚀  plot()의 kind 속성을 지정하면 다양한 종류의 그래프를 표현할 수 있다.

옵션 종류
line 선 그래프
bar 막대 그래프 - 수직
barh 막대 그래프 - 수평
his 히스토그램 그래프
box 박스 그래프
kde 커널 밀도 그래프
area 면적 그래프
pie 원형 그래프
scatter 산점도 그래프
hexbin 고밀도 산점도 그래프
import pandas as pd

my_score = [[60, 90, 95], [80, 75, 100], [65, 85, 90], 
            [85, 70, 90], [95, 90, 85], [75, 85, 90], [85, 80, 75]]
subject = ['kor', 'math', 'eng']
df = pd.DataFrame(my_score, columns=subject)
df

출력 결과

 

from matplotlib import pyplot as plt

df.plot(kind='line')
plt.show()

출력 결과

 

 

 

 

 

 

[ 내용 참고: IT 학원 강의 및 위키독스 ]


 

1.  컬럼(변수) 삭제 및 생성

# 엑셀 파일 dust1.xlxs 파일을 불러와서 데이터프레임을 생성
import pandas as pd

dust = pd.read_excel('../input/dust1.xlsx')
dust.head()

출력 결과


👩🏻‍🚀  삭제 : drop() 

# 데이터 분석에 필요없는 '지역', '망', '측정소 코드' 컬럼을 삭제하고 특정 값으로 새로운 컬럼을 생성.

dust = dust.drop(['지역', '망', '측정소코드'], axis=1)
# axis의 기본값이 axis=0 으로 행 삭제가 됨. 컬럼을 삭제하기 위해서는 axis=1을 반드시 사용.
dust.head()

출력 결과


 

👩🏻‍🚀  생성  : df['새로운 컬럼명'] = '값'

# 새로운 컬럼 생성
dust['city'] = '서울'
dust.head()

출력 결과

 


 

2. 컬럼 이름 변경

# 전체 변수 이름을 재설정
DataFrame.columns=['새이름1', '새이름2',...]

# 원하는 변수이름만 수정
DataFrame.rename(columns={'기존이름':'새이름'}, inplace=True)

 

dust.rename(columns={'측정소명': 'name', '측정일시': 'date', '주소': 'addr'}, inplace=True)
dust.columns

'''
Index(['name', 'date', 'SO2', 'CO', 'O3', 'NO2', 'PM10', 'PM25', 'addr',
       'city'],
      dtype='object')
'''

 


 

3. 데이터 형변환

dust.dtypes

'''
name     object
date      int64
SO2     float64
CO      float64
O3      float64
NO2     float64
PM10      int64
PM25      int64
addr     object
city     object
dtype: object
'''

 

  📍 date 컬럼이 숫자형(int)로 저장되어 있음
         ▶️ 숫자 형식은 문자 형식으로 변환
  📍 astype(str) : 숫자 ➡️ 문자열 형식으로 변환
  📍 astype(int) : 문자열 ➡️ 숫자 형식으로 변환

 

# 숫자 int 형을 문자열로 변환
dust['date'] = dust['date'].astype(str)
dust['date'] = dust['date'].str.slice(0, 8)
dust.head()

출력 결과


  📍  pd.to_datetime()

# 문자 형식을 날짜형으로 변환
dust['date'] = pd.to_datetime(dust['date'])
dust.dtypes
'''
name            object
date    datetime64[ns]
...
'''

 


  📍 Series.dt.형식

# 날짜 형식 활용 : Series.dt.형식
dust['year'] = dust['date'].dt.year
dust['month'] = dust['date'].dt.month
dust['day'] = dust['date'].dt.day
dust.head()

출력 결과

 


 

4. 데이터 병합

👩🏻‍🚀   merge() 함수는 두 데이터프레임을 각 데이터에 존재하는 고유값(key)을 기준으로 병합할 때 사용

 pd.merge(df_left, df_right, how='inner', on=None)


  📍  기본 값은 on=None이므로 두 데이터의 공동 열이름(id)를 기준으로 inner(교집합) 조인을 하게 됨
  📍  outer 옵션을 줘서 id를 기준으로 합치되, 어느 한 쪽이라도 데이터가 없는 경우 Nan 값이 지정 됨

# 병합할 원본 데이터 확인
s1 = pd.read_excel('../input/nation.xlsx')
s1.head()

출력 결과

s2 = pd.read_excel('../input/code.xlsx')
s2.head()

출력 결과

 

# 데이터 병합 : 공통 컬럼을 기준
pd.merge(s1, s2, on='국적코드')

병합 결과

 


5. 데이터 그룹핑

👩🏻‍🚀  데이터 그룹핑은 데이터를 특정한 값에 기반해 묶는 기능으로 groupby()를 사용하여 통계량을 요약할 수 있음
👩🏻‍🚀  통계량에 관계된 메서드에는 mean(평균), std(표준편차), var(분산), max(최대값), min(최소값) 등이 있음

 

1)  한 열을 기준으로 그룹화 하기

import pandas as pd

s1 = pd.read_excel('../input/nation.xlsx')
s1

출력 결과

s1.groupby('국적코드').sum()
# 국적코드를 그룹별로 합친다. (숫자 뿐만 아니라 문자열도 합침)

출력 결과

 

s1.groupby('성별').sum()
# 성별로 나누어 다른 항목을 합친다.

출력 결과


 

2)  여러 열을 기준으로 그룹화하기

s1.groupby(['국적코드', '성별']).sum()

 

출력 결과

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 결측 데이터 처리

👩🏻‍🚀  판다스는 누락된 데이터를 표시할 때 NaN (Not a Number)로 표기하며, 연산에는 표함되지 않음

 

 

1) 결측 데이터 확인

 

✏️  isna() 메서드는 값이 NaN일 때 True, 아닌 경우엔 False 반환

✏️  isnull() 메서드는 결측 데이터이면 True 반환, 유효한 데이터가 존재하면 False를 반환
      ⚡️  isna(), isnull()은 기능적으로 동일

import pandas as pd

df = pd.read_csv('../input/weather.csv', index_col='date')
# 두 개다 결과가 같다.
df['max_wind'].isna()
df['max_wind'].isnull()

'''
출력 결과)
2010-08-01,False
2010-08-02,False
2010-08-03,False
2010-08-04,False
2010-08-05,False
2010-08-06,False
2010-08-07,False
2010-08-08,False
2010-08-09,False
2010-08-10,False
'''

 


 

①  결측 데이터 개수 확인

df.isnull().sum()

'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''
df.isnull().value_counts()

'''
temp   max_wind  mean_wind
False  False     False        3646
                 True            3
       True      True            3
                 False           1
Name: count, dtype: int64
'''

 

✏️  notnull()은 유효한 데이터가 존재하면 True를 반환, 결측 데이터면 False를 반환

df.notnull().sum()

'''
temp         3653
max_wind     3649
mean_wind    3647
dtype: int64
'''

 


 

2) 결측 데이터 삭제

 

✏️  결측 데이터를 다루는 가장 간단한 방법은 결측 데이터를 가진 행이나 열을 삭제
✏️  판다스에서 dropna()를 이용하여 삭제 할 수 있다.

✏️  행 데이터 중 어느 한 변수에도 결측치가 있는 경우 삭제되므로 향후 제거한 데이터프레임을 사용하려면 다른 이름으로 저장해야 함

 DataFrame.dropna(axis, how, thresh, subset, inplace)

 

 

  📍 axis : 축을 행 또는 열로 결정
         ➡️  0 또는 'index'이면 누락된 값이 포함된 행을 삭제
         ➡️  1 또는 'columns'이면 누락된 값이 포함된 열을 삭제
         ➡️  기본값은 0
  📍 how any는 null 값이 있는 경우 행 또는 열을 삭제
                    all은 모든 값이 누락된 경우 행 또는 열을 삭제
                    기본값은 any
  📍 inplace : 데이터프레임에 나온 값을 저장할 것인지를 설정하는 변수로 기본적으로 값은 False

 

# 결측 데이터가 있는 행 삭제 후 확인
df2 = df.dropna()  # 옵션을 지정하지 않아서 행기준, NaN가 하나라도 있는 경우에 삭제.
df2.isnull().sum()

'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

# 원본 데이터는 변경 x
df.isnull().sum()
'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''

 


 

3)  결측 데이터 대체

 

✏️  fillna() : 결측 데이터를 특정 값으로 채움. inplace를 True로 설정해 원본 데이터를 수정

# 결측 데이터 대체하기 : 평균값으로 대체
df['max_wind'].fillna(df['max_wind'].mean(), inplace=True)
df['mean_wind'].fillna(df['mean_wind'].mean(), inplace=True)

# 결측 데이터 대체 후 확인
df.isna().sum()
'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  데이터 선택

1) 열 선택하기

 

👩🏻‍🚀  df['컬럼명'] = df.컬럼명

       ⚡️ 단, 이 방법을 사용하려면 열 이름이 숫자로 시작하지 않고 공백이나 특수 문자 등을 포함하지 않는 등의 조건을 만족해야 함
👩🏻‍🚀  iloc() 및 loc() 메서드를 사용하여 여러 열을 선택할 수도 있음

👩🏻‍🚀  DataFrame의 하나의 열을 선택하면 하나의 Series로 결과 추출

 

a. 단일 컬럼 선택

# 단일 컬럼 선택하기
df = pd.read_csv('../input/weather.csv')
df['temp'] 
# df.temp와 같다

'''
출력 결과)
0       28.7
1       25.2
2       22.1
3       25.3
4       27.2
        ... 
3648    22.1
3649    21.9
3650    21.6
3651    22.9
3652    25.7
Name: temp, Length: 3653, dtype: float64
'''

 

b. 여러 컬럼 선택

# 추출할 열 이름을 리스트에 저장한 다음 []에 전달하면 여러 열을 선택할 수 있음.
df[['date', 'temp']]
# 열 이름을 사용하여 열을 선택하려는 경우 loc를 사용
# df.loc[행 인덱싱 값, 열 인덱싱 값]
df.loc[:, ['date', 'temp']]
# 열 인덱스를 사용하여 추출
# df.iloc[행 인덱스, 열 인덱스]
df.iloc[:, [0,1]]

 

  📌  세 방법 모두 같은 결과 추출

 


 

2) 행 선택하기 

👩🏻‍🚀  인덱스 숫자를 사용하면 행을 슬라이싱할 수 있음

df[0:3]

출력 결과

 


 

3)  레이블로 선택하기  df.loc

 

# 특정 날짜에 해당하는 열을 인덱스 열로 지정
df.index = df['date']
df

출력 결과

 

df.loc['2010-08-01', ['temp', 'mean_wind']]

'''
출력결과)
temp         28.7
mean_wind     3.4
Name: 2010-08-01, dtype: object
'''

 

4)  위치로 선택하기  df.iloc

 

👩🏻‍🚀  iloc[n]과 같이 정수를 입력하면 해당 행을 선택

# 숫자 3은 (위에서 0부터 시작) 4번째 행이라는 뜻.
df.iloc[3]

'''
처리 결과)
date         2010-08-04
temp               25.3
max_wind            6.6
mean_wind           4.2
Name: 2010-08-04, dtype: object
'''
# 특정 행과 열 선택 : 슬라이싱
df.iloc[1:3, 0:2]
# 1~2 행과 0~1열

 

📌  맨 앞의 열은 인덱싱 열이라 해당 x

 

 

 

 


 

5)  불 인덱싱

 

👩🏻‍🚀  하나의 열의 값을 기준으로 데이터를 선택할 수 있음
👩🏻‍🚀  df[df.A > 0]은 df로 부터 A열이 0보다 큰 데이터를 보여줌

 

# 조건에 맞는 데이터를 추출
w = df['temp'] > 30
w

'''
출력 결과)
date
2010-08-01    False
2010-08-02    False
2010-08-03    False
2010-08-04    False
2010-08-05    False
              ...  
2020-07-27    False
2020-07-28    False
2020-07-29    False
2020-07-30    False
2020-07-31    False
Name: temp, Length: 3653, dtype: bool
'''

 

df[w]

출력 결과

 

 

📌  기온이 30도 이상인 데이터만 추출

 

 

 

 


# 최고로 더웠던 날의 모든 정보를 추출
w = df['temp'] == df['temp'].max()
df[w]
# df[df['temp'] == df['temp'].max()]로 써도 된다.


# 조건이 2개 이상인 경우
# 기온이 30도 이상이고, 최대 풍속이 9이상인 데이터
w = (df['temp'] >= 30) & (df['max_wind'] >= 9)
df[w]

+ Recent posts