경기도 인공지능 개발 과정/Python

[Python 데이터분석] 데이터 분석 기초 1

agingcurve 2022. 6. 30. 12:41
반응형

0. 들어가기 전에, 한글 폰트 설정해주기

코랩에서 한글 폰트 설정

1) 한글 폰트 코드 실행

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

2) 런타임 - 런타임 다시시작

3) 글꼴 지정 명령어

plt.rc('font', family='NanumGothic')
In [2]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
In [2]:
plt.rc('font', family='NanumGothic')

1. 파일 업로드

csv 파일이란?

comma seperated values의 약자로 콤마(,)로 분리된 파일

# 코랩에 파일 업로드하는 방법

from google.colab import files
uploaded = files.upload()
In [ ]:
 

csv 파일을 파이썬으로 읽어오기

  1. 파일 open
  2. 파일 읽기 reader
  3. 파일 헤더 건너뛰기
  4. 파일을 리스트로 바꾸기
# csv 라이브러리 임포트
import csv 

f = open('파일명.csv')         # 파일 오픈
data = csv.reader(f)         # 파일 읽기 reader
next(data)                   # 파일 헤더 건너뛰기 
data = list(data)            # 파일 리스트로 바꾸기
In [3]:
import csv
f = open("card.csv", encoding="utf8")
data = csv.reader(f)
next(data)
data = list(data)
In [11]:
 
<class 'list'>
In [ ]:
 
In [21]:
# 총 데이터의 개수는?
print(len(data))
print("\n")
236


In [22]:
# 데이터 하나만 출력해본다
print(data[0])
print("\n")
['2019-10-12 9:13', '1972753', '본', 'S&', '185', '네이버파이낸셜(주)', '546800', '일시불(A)', '부분취소']


In [23]:
# 일부만 출력해보기(슬라이싱)
print(data[:3])
print("\n")
[['2019-10-12 9:13', '1972753', '본', 'S&', '185', '네이버파이낸셜(주)', '546800', '일시불(A)', '부분취소'], ['2019-10-12 11:56', '3399357', '본', 'S&', '185', 'GS  샵', '60440', '일시불(A)', '전표매입'], ['2019-10-13 9:16', '12621902', '본', 'S&', '185', 'G마켓', '91520', 'P(A)', '전표매입']]


In [24]:
# 데이터 일부만 지정해서 추출
print(data[0][6])
print("\n")
546800


In [ ]:
 
In [7]:
# 특정데이터 뽑기
# for row in data:
#     print(row[0], row[5],row[6])
# print("\n")
In [4]:
# 특정 데이터와 타입 보기
for row in data:
    pass
    #     print(row[5], type(row[6]))
In [5]:
# if 문으로 데이터 구별
for row in data:
    pass
#     if row[-1] == "전표매입":
#         print("구매확정")
#     else:
#         print("취소")
In [ ]:
# 54600원 일시불(A)로 결제만 빼보기
# -3    -2
for row in data:
    payment = int(row[-3])
    

2. 데이터 다뤄보기

In [6]:
# 카드 사용금액 모두 출력하기
spend = 0

for row in data:
    if row[-1] == "전표매입":
        payment = int(row[-3])
        spend += payment
print(spend)
8174028

3개월간 사용한 총 금액 구하기

프로그램 흐름 생각해보기

1. 총 지출액을 저장할 변수(spend)를 만들고 초깃값 0 저장하기
2. 전체 이용내역(data)을 돌며 반복하기
  2.1 이용금액(row[-3])만 골라 총 지출액(spend)에 더하기

파일로 읽어들인 데이터는 모두 문자이다. </br> 따라서 연산하려면 숫자로 변경해주어야 함!!

수정된 프로그램 흐름

1. 총 지출액을 저장할 변수(spend)를 만들고 초깃값 0 저장하기
2. 전체 이용내역(data)을 돌며 반복하기
  2.1 이용금액(row[-3])만 골라 정수형으로 변환한 후 총 지출액(spend)에 더하기

매입상태를 잘 살펴보자

수정된 프로그램 흐름

1. 총 지출액을 저장할 변수(spend)를 만들고 초깃값 0 저장하기
2. 전체 이용내역(data)을 돌며 반복하기
  2.1 매입상태(row[-1])가 '전표매입'이라면
    2.1.1 이용금액(row[-3])만 골라 정수형으로 변환한 후 총 지출액(spend)에 더하기

3. 진짜! 데이터 분석!

1) 10월, 11월, 12월 지출액을 막대그래프로 그리기

Q. 그래프로 표현하려면 plt.bar()안에 뭐가 필요할까?

</br> </br>

  • 10월 -> [0]
  • 11월 -> [1]
  • 12월 -> [2]

</br>

Q. 규칙을 발견하셨나요?

In [4]:
s_mon = [0, 0, 0]

for row in data:
    if row[-1] == "전표매입":
        s_mon[int(row[0].split("-")[1])-10] += int(row[-3])

print(s_mon)
[2093015, 4127744, 1953269]

프로그램 흐름 생각해보기

1. 10~12월의 월별 지출액을 저장할 리스트(s_mon)를 만들고 초깃값 0 저장하기
2. 전체 이용내역(data)을 돌며 반복하기
  2.1 각 이용내역에서 매입상태가 '전표매입'이라면
    2.1.1 해당 건의 이용월과 이용금액 구하기 
    2.1.2. 이용월에서 10을 빼 월별 지출액 리스트(s_mon)의 인덱스(idx) 구하기
    2.1.3 과정 2.1.2에서 구한 인덱스의 값(s_mon[idx])에 과정 2.1.1에서 구한 이용금액 더하기
3. 월별 지출액 리스트(s_mon)로 막대그래프 그리기
In [11]:
# 월별 지출액 시각화 (막대그래프)
import matplotlib.pyplot as plt
import set_matplotlib_hangul

plt.title("10-12월 지출액")
plt.bar(["10월", "11월", "12월"], s_mon, color = "royalblue")
plt.show()

지수표기법 e를 검색해보세요!

2) 월별 택시 이용 금액 구하기

프로그램 흐름 생각해보기

1. 10-12월의 월별 택시비 지출액을 저장할 리스트(taxi)를 만들고 각 월별 택시 지출액의 초깃값을 0으로 저장하기
2. 전체 이용내역(data)를 돌며 반복하기
  2.1 매입상태(row[-1])가 '전표매입'이고, 가맹점명에 '택시'가 있다면
    2.1.1 해당 건의 이용월 구하고, 이용금액도 구하기
    2.1.2 이용월에서 10을 빼서 taxi의 인덱스 구하기
    2.1.3 taxi[인덱스] += 이용금액
3. 월별 지출액 리스트로 막대그래프 그리기
In [21]:
# 월별 택시비 지출액
# 월별 택시비 누적 변수 : list
taxi = [0, 0, 0]


for row in data:
    if row[-1] == "전표매입" and "택시" in row[5]:
        mon, payment = int(row[0].split("-")[1]), int(row[-3])
        idx = mon-10
        taxi[idx] += payment

print(taxi)
[8600, 83900, 52800]
In [17]:
# 월별 택시비 지출액 시각화(선그래프: plot())

plt.title("10-12월 택시비 지출액")
plt.bar(["10월", "11월", "12월"], taxi, color = "royalblue", label = "택시비 지출액")
plt.legend()
plt.show()

3) 월별 배달 이용 금액 구하기

In [22]:
# 월별 택시비 지출액
# 월별 택시비 누적 변수 : list
deliver = [0, 0, 0]


for row in data:
    if row[-1] == "전표매입" and "우아한형제들" in row[5]:
        mon, payment = int(row[0].split("-")[1]), int(row[-3])
        idx = mon-10
        deliver[idx] += payment

print(deliver)
[134300, 127900, 99230]

4) 택시 지출액과 배달음식 지출액 비교하기

여러 그래프 한 번에 표시하기

# 그래프 그리는 명령어를 여러개 작성하고, plt.show()를 마지막에 한번만 작성
plt.plot(리스트A)
plt.plot(리스트B)
plt.show()
In [24]:
plt.title("10-12월 택시비/ 배달음식비 지출액")
plt.plot(["10월", "11월", "12월"], taxi, color = "royalblue", label = "택시비 지출액")
plt.plot(["10월", "11월", "12월"], deliver, color = "red", label = "배달비 지출액")
plt.legend()
plt.show()

지출액 상위 10개 항목 추출 및 시각화

  • 지출액 상위 10개 항목을 추출 하기 위한 데이터 구조 변경 : dict이용
  • dict의 키 : 가맹점명
  • dict의 키 값 : 이용금액을 가맹점별 누적
In [74]:
keys = []
values = [] 
for i in range(len(data)):
    keys.append(data[i][5])
    values.append(data[i][-3])
In [75]:
new_dict = {}
for i,v in zip(keys,values):
    if i not in new_dict.keys():
        new_dict[i] = int(v)
    else:
        new_dict[i] += int(v)
In [76]:
sort_new_dict = sorted(new_dict.items(), key= lambda item: item[1],reverse=True)
fainl = sort_new_dict[:10]
In [77]:
fainl
Out[77]:
[('네이버파이낸셜(주)', 3117380),
 ('스마일페이 (신라면세점)', 978035),
 ('(주)현대백화점신촌점', 415502),
 ('(주)우아한형제들', 397930),
 ('네이버페이', 374976),
 ('SSG.COM', 370153),
 ('신라면세점', 339125),
 ('(주)신세계백화점강남점', 333800),
 ('(주)이마트  신촌점', 305690),
 ('크로키닷컴', 299610)]
In [78]:
company = []
money = []
for i,v in fainl:
    company.append(i)
    money.append(v)

plt.barh(company,money, color= "b")
plt.title("10-12월 지출 top 10")
Out[78]:
Text(0.5, 1.0, '10-12월 지출 top 10')