데이터 전처리와 그 실제
Pandas를 이용하여 데이터 프레임에서 결측치 제거하기
80% 이상이 결측치인 열 제거
deadline = df.shape[0] * 0.2 # 전체 행 개수의 20% 구하기
target_col = list()
for col in df.columns : # df의 모든 열들에 대해 수행되는 반복문
count = df[col].count() # 주어진 열의 데이터 수 계산
if count < deadline : # 80% 이상이 결측치이면 target_col에 추가
target_col.append(col)
df = df.drop(target_col, axis = 1) # df에서 target_col 제거
결측값이 하나라도 존재하는 행 제거
df = df.dropna(axis = 0)
- dropna : 결측치가 하나라도 있는 행 또는 열 삭제
- Q) 상단 코드에서 axis의 값이 0이 아닌 1일 경우 예상되는 결과는?
- → 결측치가 있는 행이 아니라, 열이 제거된다
이상치 조건에 해당하는 행들 제거하기
low_cutoff_score = df[(열 이름)].quantile(0.05) # 하위 5%에 해당하는 값
high_cutoff_score = df[(열 이름)].quantile(0.95) # 상위 5%에 해당하는 값
cond = (df['연봉'] > low_cutoff_score) & (df['연봉'] < high_cutoff_score)
df_new = df.loc[cond]
One-Hot Encoding을 통한 더미 변수 생성
df_new = pd.get_dummies (df, columns = ['소속'])
→ 범주로 된 데이터를 수치 형태로 변환
Matplotlib과 시각화
Matplotlib
- 주어진 자료를 플롯 또는 차트로 시각화하기 위한 라이브러리
import matplotlib.pyplot as plt
Line Plot의 시각화
안암 소재 카페의 영업 연수를 꺾은선그래프의 형태로 나타내면?
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('cafe.csv', index_col = 0)
cond1 = df['region'] == 'Anam'
df_anam = df.loc[cond1]
df_anam_year = df_anam.loc[:, 'year']
- 안암 소재 카페만 추출
- 영업 연수를 시각화할 것이므로, index와 year만 남김
plt.figure(figsize = (10,5))
df_anam_year.plot()
plt.title('LINE PLOT')
plt.xlabel('CAFE CODE')
plt.ylabel('YEAR SINCE OPEN')
plt.show()
- figure 크기 설정
- plt.figure(figsize = (가로,세로)) 와 같이 크기 설정 가능
- 도화지의 크기에 해당하므로, plot을 그리기 이전에 설정해야 함
- plot()을 이용한 꺾은선 그래프 작성
- DataFrame명.plot()과 같은 문법으로 사용
- 해당 DataFrame의 데이터를 바탕으로 LIne Plot을 도식화
- title / label / show()
- title은 plot전체의 제목을, label은 축의 제목을 의미함 (가로축, 세로축의 이름 각각 설정 가능)
- 코드의 마지막에는 반드시 plt.show()를 작성해야 정상 출력됨

df_anam_year.plot(color = 'r', linestyle = ':', marker = 's'

- 그래프를 더 꾸미기 위해서 색, 선 모양, 마커 모양을 변경할 수 있음
막대 그래프의 시각화
안암 소재 카페의 평균 메뉴 가격을 세로 막대 그래프의 형태로 나타내면?
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('cafe.csv', index_col = 0)
cond1 = df['region'] == 'Anam'
df_anam = df.loc[cond1]
df_anam_price = df_anam.loc[:,'price']
- 데이터 필터링 과정은 앞과 동일
- 평균 메뉴 가격을 시각화해야 하므로, index와 price열만을 남김
ply.figure(figsize = (10,5))
df_anam_price.plot(kind = 'bar')
plt.title('BAR PLOT')
plt.xlabel('CAFE CODE')
plt.ylabel('AVERAGE MENU PRICE')
plt.show
- DataFrame명.plot(kind = ‘bar’) 와 같은 문법으로 사용
- bar 대신 barh를 기입할 경우 가로 막대 그래프가 됨

히스토그램의 시각화
데이터셋 내 모든 카페의 별점을 히스토그램의 형태로 나타내면?
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('cafe.csv', index_col = 0)
df_rating = df.loc[:, 'rating']
- 별점을 시각화해야 하므로, index와 rating만 남김
plt.figure(figsize = (10,5))
df_rating.plot(kind = 'hist', bins = 10)
plt.title('HISTOGRAM')
plt.xlabel('CAFE RATING')
plt.show()
- DataFrame명.plt(kind = ‘hist’) 과 같이 사용
- bin값은 나뉘는 구간의 총 개수를 의미 ⇒ bin 값이 증가하면 구간별 폭은 작아짐

산점도 시각화
가로 축에 평균 메뉴 가격이, 세로 축에 별점이 위치하도록 산점도를 그리면?
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('cafe.csv', index_col = 0)
plt.figure(figsize = (10,5))
df.plot(kind = 'scatter', x = 'price', y = 'rating')
plt.title('SCATTER PLOT')
plt.xlabel('AVERAGE MENU PRICE')
plt.ylabel('CAFE RATING')
plt.show()
- DataFrame명.plot(kind = ‘scatter’) 과 같이 사용
- 산점도 시각화 시, x축과 y축에 각각 무엇이 들어갈 지 정해줘야 함

Seaborn과 시각화
Seaborn
- 보다 강력한 시각적 효과와 더욱 다양한 종류의 도식을 제공하는 시각화 라이브러리
import seaborn as sns
Countplot의 작성
특정 요일에 얼마나 많은 도서관이 휴관하는지 도식화하면?
import pandas as pd
import seaborn as sns
df = pd.read_csv('library_suwon.csv')
sns.countplot(data = df, x = '휴관일')
plt.title('휴관 요일 별 도서관 수')
plt.show()
- sns.countplot(data = 데이터, x= 축) 과 같이 사용
- 축에 해당하는 값이 count되어 시각화가 이루어짐

한글이 제대로 표현되지 않을 때
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
- 독립된 셀에 보조 코드1 전체를 작성한 후 실행
import matplotlib.pyplot as plt
plt.rc('font', family = 'NanumBarunGothic')
- 보조 코드1 실행이 끝난 상태에서 런타임 초기화 후 보조 코드2 실행
Boxplot의 작성
도서관의 유형에 따라 부지면적이 어떻게 분포하는지 시각화하면?
import pandas as pd
import seaborn as sns
df = pd.read_csv('library_suwon.csv')
sns.boxplot(data = df, x = '도서관유형', y = '부지면적')
plt.title('도서관 유형에 따른 부지면적 분포')
plt.show()
- data, x, y 를 주요 인자로 투입하여 사용
- 상자 그림의 형태로 데이터 분포가 시각화됨

Implot의 작성
열람 좌석 수와 장서 수 사이의 관계를 산포도 및 회귀성 형태로 표현하면?
import pandas as pd
import seaborn as sns
df = pd.read_csv('library_suwon.csv')
sns.lmplot(data = df, x = '열람좌석수', y = '자료수(도서)', hue = '도서관유형'))
plt.title('열람 좌석 수 및 장서 수에 대한 산포도 및 회귀선')
plt.show()
- data, x, y 를 주요 인자로 투입하여 사용
- 산포도와 회귀선을 동시에 출력
hue
- plot 작성 시 data, x, y와 함께 hue값을 투입할 수 있음
- 투입된 hue는 색상에 따라 도식을 구분하는 역할을 수행

밀도를 곡선 형태로 표현하기
도서관 별 연속 간행물 수의 분포를 밀도 그래프의 형태로 나타내면?
distplot
import pandas as pd
import seaborn as sns
df = pd.read_csv('library_suwon.csv')
sns.distplot(df['자료수(연속간행물)'])
plt.title('연속 간행물 수에 대한 밀도 그래프')
plt.show()
- 밀도를 나타낼 데이터를 직접 투입하여 사용
- 데이터 투입 시, Pandas 문법 이용할 수 있음
- 곡선 형태의 밀도 그래프를 함께 제공

Facetgrid
import pandas as pd
import seaborn as sns
df = pd.read_csv('library_suwon.csv')
g = sns.FacetGrid(data = df, col = '도서관유형')
g = g.map(sns.distplot, '자료수(연속간행물)')
plt.show()
- 일정 기준에 따라 구획을 나누어 여러 plot을 한번에 나타내고 싶을 때 사용
- col 대신 row 투입 가능

'Python' 카테고리의 다른 글
| [Python] 군집화를 통한 데이터 특성 파악 (0) | 2025.10.02 |
|---|---|
| [Python] BeautifulSoup를 이용한 웹 크롤링 (0) | 2025.10.01 |
| [Python] Pandas를 이용한 데이터 처리 방법 정리 (0) | 2025.09.30 |
| [Python] 재귀 호출과 그 응용 (0) | 2025.09.30 |
| [Python] 클래스와 객체지향 프로그래밍 (0) | 2025.09.30 |