본문 바로가기

데이터 사이언스/데이터 분석

[NIPA AI 교육] 데이터 분석하기(2)

1. 데이터 읽기

- 필요한 패키지 및 라이브러리 import

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

- 필요한 데이터를 불러와 df 변수에 저장 후 데이터 확인

df = pd.read_csv('file path')

# 상위 5개 데이터 출력
df.head()

# 데이터프레임 정보 요약 출력
df.info()

 

- 특정 칼럼 데이터를 중복없이 오름차순으로 정렬하여 확인

sorted(list(set(df['month']))

- 데이터 개수 확인

len(list(set(df['station'])))

2. 데이터 정제

- 수집된 데이터 중 원하는 달의 데이터만 추출하고, 불필요한 칼럼 제거

df = df[df['month'] == 202105]

df = df.drop(columns={'column name'})

3. 데이터 시각화

- 폰트 바꾸기

import matplotlib.font_manager as fm

font_dirs = ['font path']
font_files = fm.findSystemFonts(fontpaths=font_dirs)

for font in font_files:
	fm.fontManager.addfont(font_file)

 

3.1. 호선 별 이용객 수 출력

- 이용객 수가 가장 많은 호선 순으로 막대 그래프 출력

# 호선별로 묶기
metro_line = df.groupby(['호선명']).mean().reset_index()
metro_line = df.drop(columns='사용월').set_index('호선명')
metro_line = df.mean(axis=1).sort_values(ascending=False)

plt.figure(figsize=(20,10))
plt.rc('font', family='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] = False

metro_line.plot(kind=('bar'))
plt.show()

3.2. 특정 호선에서 역별 평균 승하차 인원 데이터 추출

- 특정 호선을 이용해 새로운 데이터프레임 생성

- reset_index() : 인덱스를 재배열

metro_st = df.groupby(['호선명', '지하철역']).mean().reset_index()
metro_st_line4 = metro_st[metro_st['호선명'] == '4호선']

 

- 역 별 평균 승하차 인원을 구해서 데이터프레임으로 저장

df = pd.DataFrame(index=metro_st_line4['지하철역'])
df['평균 승차 인원 수'] = metro_get_on.mean(axis=1).astype(int)

3.3. 평균 승하차 인원 수 내림차순으로 막대 그래프 출력

- 평균 승차 인원 수 Top 10인 역 구하기

top10_on = df.sort_values(by='average of getting on', ascending=False).head(10)

plt.figure(figsize=(20, 10))
plt.rc('font', family='NanumBarunGothic')
plt.rcParams['axes.unicode_minus'] = False

plt.bar(top10_on.index, top10_on['average of getting on'])

for x, y in enumerate(list(top10_on['average of getting on'])):
	if x == 0:
    	plt.annotate(y, (x-0.15, y), color='red')
    else:
    	plt.annotate(y, (x-0.15, y))

plt.title('2021 4월 평균 승차 인원 수 Top 10')
plt.show()

3.4. 특정 호선의 혼잡 정도와 위치 좌표 데이터 병합

- 필요에 따라 함수 생성 및 데이터 병합

df = df.merge(df2, left_on='key', right_on='key')

3.5. 특정 호선의 혼잡 정도 지도 출력

- folium 라이브러리의 Map 함수 사용

import folium

 

- 특정 호선의 역별 평균 승하차 인원 수 및 위치 좌표 데이터 이용

- 인원 수가 0일 때도 오류가 없을까?

latitude = location[location['subway'] == '서울역']['x']
longtitude = location[location['subway'] == '서울역']['y']

map_osm = folium.Map(location=[latitude, longtitude], zoom_start=12)

# 각 역의 위치별로 원형마커를 지도에 추가
for i in df.index:
	marker = folium.CircleMarker([df['x'][i],df['y'][i]],
                        radius = (df['average of getting on'][i]+1)/3000,
                        popup = [df['subway'][i],df['average of getting on'][i]], 
                        color = 'blue', 
                        fill_color = 'blue')
	marker.add_to(map_osm)