[포스코x코딩온] 스마트 팩토리 과정 12주차 회고 | 데이터분석&시각화

Dana·2023년 6월 8일
0

데이터 분석

Numpy

  • 다차원 배열(행렬)을 쉽게 처리하고 효율적으로 사용할 수 있도록 지원하는 파이썬의 라이브러리
  • 수치해석, 통계 관련 기능을 구현한다고 할 때 가장 기본이 되는 모듈
  • Ndarray 타입의 배열을 만들 수 있다
    • N-dimension array, 다차원배열
import numpy as np
x=np.array([3, 1, 2])

Python List vs Numpy array(ndarray)

  1. 선언 형태의 차이
    • List : 원소로 여러가지 자료형을 허용한다
    • Ndarray : 원소로 한 가지 자료형만 허용한다
  2. 선언 형태의 차이
    • List : 내부 배열의 원소 개수가 달라도 된다
    • Ndarray : 내부 배열의 원소 개수가 같아야 한다
  3. 연산의 차이
    • List : 빼기, 곱하기, 나누기 연산은 불가. 더하기는 리스트 이어붙이기
    • Ndarray : 더하기, 빼기, 곱하기, 나누기 연산 동일하게 같은 위치의 원소끼리 연산

Numpy 관련 속성 및 메소드

  • .ndim : 배열의 차원 수를 반환
  • .shape : 배열 각 차원의 크기를 튜플 형태로 표현
  • np.dot(array1, array2) : 배열의 내적 연산
  • np.matmul(array1, array2) : 행렬의 행렬곱 연산
    • A X B일때 A=[axb], B=[bxc]로 A의 열의 개수와 B의 행의 개수가 동일해야 한다
  • np.zeros(m,n) : m x n 크기의 영행렬 생성
  • np.ones(m,n) : m x n 크기의 유닛행렬 생성
  • np.full((m,n), k) : m x n 크기의 모든 원소가 k인 행렬 생성
  • np.eye(n) : n x n 크기의 단위행렬 생성
  • .flatten() : 행렬의 평탄화 작업 (N차원 배열을 1차원 배열로 변환시켜주는 작업)
  • .reshape() : 배열의 차원을 변경
  • np.arange([start,] stop, [step,]) : 특정 배열을 만들어 줌
  • np.random.randint(low, [high,][size,])
  • np.random.rand(m,n) : m x n 크기의 배열 생성 및 0~1 사이의 난수로 초기화

Pandas

  • 구조화된 데이터나 표 형식의 데이터를 빠르고 쉽게 다룰 수 있도록 하는 라이브러리
  • Series는 1차원 데이터, DataFrame는 2차원 데이터

Series

  • List와 다르게 인덱스를 직접 지정할 수 있다
  • 인덱스를 지정하지 않으면 0, 1, 2, … 로 설정된다

DataFrame

  • series들을 결합해 놓은 형태
  • 인덱스와 컬럼을 기준으로 표 형태처럼 데이터를 저장
index = ['2018', '2019','2020', '2021']

Yeonghee = pd.Series([143, 150, 157, 160], index=index)
Cheolsu = pd.Series([165, 172, 175, 180], index=index)

growth = pd.DataFrame({
	'영희':Yeonghee,
	'철수':Cheolsu
})

# 같은 결과

data={
	'영희':[143,150,157,160],
	'철수':[165,172,175,180]
}

growth=pd.DataFrame(data, columns=['영희','철수'],index=index)

# astype : 데이터 타입 변경
growth.astype('float')
growth.astype({'영희':'float'})

Pandas

  • read_csv() : .csv 확장자 파일 읽기
  • .shape : 데이터 프레임 모양 확인(행, 열)
  • dataframe.컬럼명 또는 dataframe[’컬럼명’] : 데이터프레임에서 해당 컬럼만 select
  • .iloc[] : index를 활용해 location을 지정
  • .loc[] : index 및 column명을 통해 location을 지정
  • dataframe.describe() : 데이터프레임 객체의 설명적 통계량을 출력
  • series.map() : 데이터 변경. 시리즈 자료형(1차원)에서 사용
  • series 또는 dataframe .apply(함수, axis)
    • axis=’index’ 또는 0 : row 방향으로 함수 적용
    • axis=’columns’ 또는 1 : column 방향으로 함수 적용
  • dataframe.groupby(컬럼) : 컬럼을 기준으로 group을 지음
  • dataframe.reset_index() : 인덱스를 기본 인덱스인 0, 1, 2, …로 변경
  • dataframe.sort_values(by=컬럼명, ascending=bool) : 컬럼명을 기준으로 정렬. ascending이 False일 경우 내림차순 정렬
  • dataframe.dtypes : 전체 컬럼의 데이터 타입 확인
  • dataframe.column.dtype : 컬럼 하나의 데이터 타입 확인
  • dataframe.column.astype() : 데이터 타입 변경
  • pd.isnull(column) : NaN 데이터 확인
  • pd.notnull(column) : NaN이 아닌 데이터 확인
  • dataframe.column.fillna(대체 값) : NaN 대체 값으로 변경
  • dataframe.column.replace(기존 값, 새로운 값) : 기존 값 새로운 값으로 대치
  • dataframe.rename(columns={’기존컬럼명’:’새로운컬럼명’})
  • dataframe.rename(index={0:’인덱스명’})
  • pd.concat([dataframe1, dataframe2])
  • join()

데이터 시각화

  • 그래프, 차트, 다이어그램 등 다양한 시각화 도구를 사용하여 데이터를 시각적으로 표현한 것
  • 데이터 시각화는 복잡한 데이터 집합을 직관적이고 이해하기 쉬운 형태로 변환하여 데이터의 패턴, 추세, 상관 관계를 파악하는데 유리하다

데이터 시각화의 목적

  • 데이터의 패턴과 추세 파악
  • 데이터 간 관계 이해
  • 인사이트 도출

Matplotlib

  • 파이썬에서 가장 널리 사용되는 데이터 시각화 라이브러리
  • 그래프, 차트, 플롯 등 다양한 시각화 요소를 생성하고 데이터를 시각적으로 나타낼 수 있다

기본 그래프 그리기

  • 그래프 그리기 : plt.plot([x좌표],[y좌표],’포맷 문자열’)
  • x축, y축 범위 지정 : plt.axis([xmin, xmax, ymin, ymax])
  • 그래프 표시 : plt.show()

  • 축 레이블 설정하기
    • plt.xlabel(’x축 레이블’, [labelpad, loc, fontdict])
    • plt.ylable(’y축 레이블’, [labelpad, loc, fontdict])
  • 범례 표시하기
    • plt.legend(loc=위치, ncol=열의개수, fontsize, frameon, shadow)
  • 타이틀 설정하기 : plt.title(’타이틀’, [loc, pad])
  • 그리드 설정하기 : plt.grid(True, axis)
import matplotlib.pyplot as plt

# 선 그래프
plt.plot([1, 2, 3, 4], 'go-', label='graph1') # (0,1),(0,2)...
plt.plot([1,2,3,4],[1,2,3,4], linestyle='dashed', color='#8f321a', label='graph2') # (1,1),(1,2)...

font1={'family': 'fantasy', 'color' : 'red', 'weight' : 'normal', 'size' : 'xx-large'}

# 축 레이블 지정
plt.axis([0, 5, 0, 10]) # x좌표 0부터 5, y좌표 0부터 10까지
plt.xlabel('x-label', labelpad=30, loc='right', fontdict=font1)
plt.ylabel('y-label', labelpad=30, loc='top')

# 범례
plt.legend(ncol=2, fontsize=20, frameon=True, shadow=True, loc='best')

# 타이틀
plt.title('Title', loc='right', pad=50)

# 배경 그리드
plt.grid(True, axis='both')

plt.show()

막대 그래프 그리기

  • 그래프 그리기 : plt.bar([x값], [y값], color, width)
  • 눈금 표시하기
    • plt.xticks([x값], [눈금])
    • plt.yticks([y값], [눈금])
  • 수평 막대 그래프 그리기 : plt.barh([y값], [x값], color, height)
plt.bar([0, 1, 2], [100, 200, 300], color=['r','g', 'b'], width=0.1)
plt.xticks([0, 1, 2], ['a', 'b', 'c'])
plt.show()

# 수평 막대 그래프
import numpy as np

y=np.arange(3) # [0,1,2]
plt.barh(y, [100,200,300], height=0.1)
plt.yticks(y, ['a','b','c'])
plt.show()

산점도 그리기

  • 그래프 그리기 : plt.scatter([x값], [y값], s, c, cmap, alpha)
    • s : 마커 크기
    • c : 마커 색상
    • cma : 컬러맵
    • alpha : 투명도
n=50
x=np.random.rand(n) # [배열형태로 0부터 1까지 50개 난수 생성]
y=np.random.rand(n)

area=(10 * np.random.rand(n)+1)**2
colors=np.random.rand(n)
plt.scatter(x, y, s=area, cmap ='plasma', c=colors, alpha = 0.5)
plt.show()

파이차트 그리기

  • 그래프 그리기 : plt.pie([비율], labels, autopct, explode, colors, wedgeprops)
    • labels : 레이블
    • autopct : 소수점 자리
    • explode : 부채꼴이 파이 차트의 중심에서 벗어나는 정도
    • colors : 색
    • wedgeprops : 부채꼴 스타일
ratio=[34,32,16,18]
labels = ['a','b','c','d']
colors = ['red', 'yellow', 'green', 'blue']
# wedgeporps=['width':0.7, 'edgecolor':'k', 'linewidth' : 1]

plt.pie(ratio, labels=labels, autopct='%.1f%%', explode=[0,0.1,0,0.1], colors=colors)
plt.show()

실습

months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
sales_2019=[100,120,140,110,130,150,160,170,180,200,190,210]
sales_2020=[90,110,130,120,140,160,170,160,150,180,200,190]

# 선 그래프
plt.plot(sales_2019, color='skyblue', label='2019')
plt.plot(sales_2020, color='orange', label='2020')
plt.xticks([0,1,2,3,4,5,6,7,8,9,10,11],months)

# 축 레이블 지정
plt.xlabel('Month')
plt.ylabel('Sales')

# 범례
plt.legend(ncol=1, fontsize=10, frameon=True, loc='upper left')

# 타이틀
plt.title('Monthly Sales Comparison (2019-2020)')

plt.show()

plt.bar([0, 1, 2, 3, 4], [20, 35, 15, 27, 45], color='blue', width=0.7)
plt.xticks([0, 1, 2, 3, 4], ['Category 1', 'Category 2', 'Category 3', 'Category 4', 'Category 5'], rotation=45)
plt.grid(True, axis='both')
plt.axis([-0.5, 4.5, 0, 50])
plt.xlabel('Categories')
plt.ylabel('Values')
plt.title('Bar Chart')
plt.show()

x=np.arange(0, 4*np.pi, 0.1)
y1=np.sin(x)
y2=np.cos(x)
# 선 그래프
plt.plot(x, y1, color='blue', label='sin(x)')
plt.plot(x, y2, color='red', label='cos(x)')

# 축 레이블 지정
plt.xlabel('x')
plt.ylabel('y')

# 범례
plt.legend(ncol=1, fontsize=10, frameon=True, loc='lower left')

# 타이틀
plt.title('Sine and Cosine Functions')

# 배경 그리드
plt.grid(True, axis='both')

plt.show()

지도 시각화

folium

  • leaflet.js기반으로 만들어진 Python 지도 시각화 라이브러리
  • 위,경도 좌표를 기준으로 지도를 생성한다
  • 인터랙티브한 지도를 생성하고 마커를 추가하여 시각화 할 수 있다
  • 범위를 표기할 수 있다
  • 지도 생성 : m=folium.Map(location=[위도,경도],zoom_start=확대정도,tiles=타일스타일,width=가로,height=세로)
  • 마커 추가 : folium.Marker([위도,경도],popup=”문구”,tooltip=”문구”,icon=folium.Icon(color=”색상”,icon=”아이콘”).add_to(m)
  • folium.ClickForMarker() : 지도 위를 클릭했을 때 마커를 생성함
  • folium.LatLngPopup() : 지도 위를 클릭했을 때, 위도와 경도 표시
  • folium.Circle(), folium.CircleMarker() : 지도에 원을 표시한다
import folium

m = folium.Map(location=[37.547647896577175, 126.94245451708481], zoom_start=14, width=500, height=500)
folium.TileLayer("Stamen Terrain").add_to(m)
folium.LayerControl().add_to(m)
folium.Marker([37.547647896577175, 126.94245451708481], popup='subway', tooltip='대흥역', icon=folium.Icon(color='red', icon='fa-solid fa-train-subway', prefix='fa-solid')).add_to(m)
folium.Marker([37.543937391864404, 126.9510204453621], popup='subway', tooltip='공덕역').add_to(m)

# m.add_child(folium.ClickForMarker(popup='찜'))
m.add_child(folium.LatLngPopup())

m
import folium

m2 = folium.Map(location=[37.547647896577175, 126.94245451708481], zoom_start=14, width=500, height=500)
folium.TileLayer("Stamen Terrain").add_to(m2)
folium.LayerControl().add_to(m2)

lati=data['위도'].values.tolist()
longi=data['경도'].values.tolist()

for i in range(len(lati)):
    folium.Marker(
        [lati[i],longi[i]],
        popup='taxi',
        icon=folium.Icon(color='black', icon='fa-solid fa-taxi', prefix='fa-solid')
    ).add_to(m2)
m2

0개의 댓글