본문 바로가기
AI/데이터분석

회원별 당구 에버리지 데이터 분석 (feat. Pandas)

by MachineJW 2024. 9. 16.

1. Data 분석 동기

Python과 데이터분석을 활용하지 않은지 꽤 오래되어서 Pandas와 Matplotlib라이브러리 사용법을 잊어버리고 있었다...

최근에 취미생활로 활동 중인 당구 동호회에서 회원별 에버리지 Data를 수집하고 있는데 이를 활용하여 그동안 잊고 지냈던 Python 감각을 일깨워 주고자 했다. 임베디드 영역에서도 온 디바이스 AI 열풍으로 AI 관련 기술을 익히는 건 아깝지 않다고 생각한다. (데이터분석은 AI 알고리즘을 활용하기 위해 매우 필요한 기술스택이다.)

2.  원천 데이터 xlsx 파일을 csv 파일로 변환하기

pip install pandas openpyxl # 당연히 Pandas는 설치되어야 한다.
import pandas as pd

avg_file = "AVG_Data.xlsx" # 원천 xlsx 데이터

# 원천 xlsx 파일을 판다스에서 불러와 csv로 변환하여 저장한다.
df = pd.read_excel(avg_file)
df.to_csv("AVG_Data.csv", index=False) 
# index=False 옵션은 CSV 파일에 데이터프레임의 인덱스(행 번호)를 포함하지 않도록 설정하는 옵션

(1) csv 파일을 선택해야하는 이유

  • CSV 파일은 순수하게 데이터를 저장하는 형식이라 크기가 훨씬 작고 가볍다.
  • CSV 파일은 모든 프로그래밍 언어에서 쉽게 해독할 수 있도록 호환성이 보장된다.
  • CSV 파일은 읽는 속도가 xlsx 파일에 비해 빠르다
  • 단순한 데이터를 분석할 경우 CSV 파일이 더 유리하지만, 분석할 데이터에 서식이나 수식이 포함된 경우에는 xlsx 파일 형식을 사용해야 한다.

(2) Pandas 주요 메서드

  • read_excel()  : xlsx 파일을 불러오는 메서드
  • to_csv() : 파일을 csv 파일로 변환하여 저장한다.

3.  Pandas 데이터프레임 구조로 변환하기

df = pd.read_csv("AVG_Data.csv", header=None) # Pandas로 csv 파일 read

#### 전처리 과정 ####
df.drop(0, inplace=True)  # 첫 번째 행을 삭제하고 인덱스를 초기화
# 선수이름이 포함되어 있는 열은 개인정보를 위해 수정한다.
df.iloc[0, 1:] = ['선수' + str(i) for i in range(1, len(df.columns))] 
# 1행의 첫 번째 열은 그대로 두고, 2번째 열부터 수정
df.head()

데이터프레임으로 전처리되고 변환된 결과

(1) 데이터프레임 구조 (복습)

지금은 2D (데이터프레임)을 많이 다루지만 AI를 활용하려면 3차원 까지.....

(2) Pandas 주요 메서드

  • read_csv()  : csv 파일을 불러오는 메서드
  • drop() : 행이나 열을 삭제
  • loc() : 라벨 기반 인덱싱(범위지정) / 라벨 기반 인덱스
  • iloc() : 위치 기반 인덱싱(범위지정) / 정수 기반 인덱스

4.  각 회원별로 몇개의 데이터를 가지고 있는가? (count)

df_cnt = df # 문제해결을 위한 새로운 Data 프레임 생성
df_cnt.drop([1,2,3], inplace=True) # 분석에 불필요한 행과 열을 삭제
df_cnt.drop([0], axis=1, inplace=True)
df_cnt.reset_index(inplace=True) # 데이터 프레임 인덱스 초기화
df_cnt.head()

불필요한 데이터를 정제하여 나타난 결과 (데이터프레임)

import matplotlib.pyplot as plt
from matplotlib import font_manager

df_s = df_cnt.count() # 각 열의 유효한 데이터 개수 계산 (count 메서드는 시리즈로 반환한다.)
df_s = df_s.drop(df_s.index[0]) # 인덱스 0 을 제거 (헤더가 의미 없음)
df_s.plot(kind='bar', color='skyblue') # 막대 그래프로 데이터를 표시
plt.title('Count')
plt.xlabel('Player')
plt.ylabel('Games')

plt.show()

회원1 ~ 25 까지 데이터 갯수를 바 그래프로 나타내보았다.

(1) Pandas 주요 메서드

  • count()  : 각 열의 유효한 데이터 수를 계산한 결과를 시리즈(Series)로 반환한다.
  • reset_index() : 데이터프레임의 인덱스를 초기화
  • plot() : 데이터프레임에서 다양한 유형의 그래프를 그릴 수 있는 도구 (Matplotlib과 통합되었다.)

(2) Matplotlib 에서 지원되는 차트, 그래프 

  • 'line': 꺾은선 그래프 (기본값)
  • 'bar': 세로 막대 그래프
  • 'barh': 가로 막대 그래프
  • 'hist': 히스토그램
  • 'box': 상자 그림 (box plot)
  • 'kde': 커널 밀도 추정(KDE)
  • 'area': 면적 그래프
  • 'pie': 파이 차트
  • 'scatter': 산점도 (이 경우 x와 y 인수를 지정해야 함)

5.  기술통계 (discribe) - 평균, 최대, 최소, 표준편차, 25%, 50%, 75% 구하기

(1) 기술통계란?

  • 테크니컬한 어떤것을 의미하는게 아니라 자료의 내용을 압축하여 설명하는 방법을 의미한다.
  • 다른말로는 요약 통계라고도 한다.

(2) Pandas 통계 (discribe 메서드)

 

[ 숫자형 통계 ]

  • count : 누락된 값을 제외한 데이터 갯수
  • mean : 평균
  • std : 표준편차
  • min :  최소값
  • 50% : 중앙값
  • 25% : 25% 지점
  • 75% : 75% 지점
  • max : 최대값

[ 범주형 통계 ]

  • count : 누락된 값을 제외한 데이터 갯수
  • unique : 고유 값의 수
  • top : 가장 자주 나타나는 최빈값
  • freq : top으로 표시된 값이 나타나는 빈도수
df_discribe = df_cnt
df_discribe = df_discribe.drop(df_discribe.columns[0], axis=1)
df_discribe.head()
df_discribe = df_discribe.astype(float).describe() 
# 왜 인진 모르겠지만 범주형으로 인식되서 강제적으로 float 형변환...
print(df_discribe)

회원별로 요약통계된 결과

# 필요한 통계량만 추출 (mean, std, min, 25%, 50%, 75%, max)
stats = df_discribe.loc[['mean', 'std', 'min', '25%', '50%', '75%', 'max']]

# 각 통계량에 다른 색상을 지정
colors = ['red', 'blue', 'green', 'purple', 'orange', 'brown', 'pink']

# 막대그래프 그리기
stats.T.plot(kind='bar', color = colors, figsize=(20, 10))

# 그래프 제목과 축 이름 설정
plt.title('Summary Statistics')
plt.ylabel('Values')
plt.xlabel('Player')
plt.xticks(rotation=0)
plt.show()

바그래프로 나타낸 회원별 요약통계

# 꺽은선 그래프 그리기
stats.T.plot(color = colors, figsize=(20, 10))

# 그래프 제목과 축 이름 설정
plt.title('Summary Statistics')
plt.ylabel('Values')
plt.xlabel('Player')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

꺽은선 그래프... 역시 바 그래프가 훨씬 보기 좋은 듯하다.

https://colab.research.google.com/drive/1ac_2Jr9FedhGG6Pydjf0yDhl-odaOrhy#scrollTo=3kWOzi_oCB9D

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

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

웹API (JSON, XML)  (0) 2023.04.17
데이터프레임_도서관대출데이터  (0) 2023.04.16
데이터분석 파이썬 필수 라이브러리  (0) 2023.04.15