코딩/빅데이터

[Python]판다스 데이터프레임, 맷플롯립 활용기

갬발장 2023. 7. 16. 23:25

1. 데이터를 올린다.

 

chipo = pd.read_csv(io.BytesIO(uploaded['chipotle.tsv']),sep='\t')

 

pd.read_csv -> read_csv 함수는 Pandas 라이브러리에서 제공하는 함수로, CSV 파일을 읽어와 데이터프레임 형태로 변환

 

 

2.shape 사용

 

코드

print(chipo.shape)

결과

(4622, 5)

 

shape는  데이터프레임행과 열의 크기를 제공해준다.

 

3. info() 사용 

 

코드

print(chipo.info())

결과

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4622 entries, 0 to 4621
Data columns (total 5 columns):
 #   Column              Non-Null Count  Dtype 
---  ------              --------------  ----- 
 0   order_id            4622 non-null   int64 
 1   quantity            4622 non-null   int64 
 2   item_name           4622 non-null   object
 3   choice_description  3376 non-null   object
 4   item_price          4622 non-null   object
dtypes: int64(2), object(3)
memory usage: 180.7+ KB
None

 

  • info()
    • 데이터프레임의 행과 열의 구성정보를 제공

 

데이터프레임의 열이름의 정보를 가지고 있다.

 

 

 

 

 

 

 

 

 

 데이터의 유무를 나타내고 있다.

위의 chipo.shape을 통해 4622,5라는 정보를 알았고 행이 4622개, 열이 5개라는 걸 알게 되었다.

이때 non-null은 비어있지 않았다는 뜻으로, 데이터가 존재한다, 즉 차있다라는 것을 의미한다.

3376 non-null은 나머지는 비어있다는 뜻이 됨

 

 

 

 

int64 : 정수

object : 문자형 타입

 

 

 

 

 

 

 

 

3. columns

 

코드

print(chipo.columns)

 

결과

Index(['order_id', 'quantity', 'item_name', 'choice_description',
       'item_price'],
      dtype='object')
  • columns
    • 컬럼에 대한 정보를 나타낸다.

 

 

4. index 

 

코드

print(chipo.index)

결과

RangeIndex(start=0, stop=4622, step=1)

 

  • index
    • 행에 대한 인덱스 정보를 나타낸다

 

 

데이터프레임의 피처 

1) 수치형 피처

  • describe() 함수로 수치형 피처들의 기초 통계량 확인하기
    • 연속형 피처 : 어떤 구간 안의 모든 값을 데이터로 표현 가능 ex) 키, 몸무게
    • 비연속형 피처 :  셀 수 있으며, 일정 구간 안에서 정해진 몇 개의 값을 가져야 함 ex)나이

2) 범주형 피처

  • unique()함수로 범주형 피처의 개수 출력하기 -> 몇개의 범주가 있는지 확인
    • 순서 있는 범주형 피처 : 순서가 있으나 수치는 아니다  ex)학점
    • 순서 없는 범주형 피처 : 순서 없는 범주형 피처 데이터가 구분되면서도 순서가 없음 ex)혈액형

 

1. describe를 통해 기초 통계량 확인하기

 

 

#order_id는 숫자의 의미를 가지지 않기 때문에 astype를 통해 형변환을 해준다.

chipo['order_id'] = chipo['order_id'].astype(str)

#describe를 통해 기초 통계량을 확인한다.

print(chipo.describe())

 

결과

 

          quantity
count  4622.000000
mean      1.075725
std       0.410186
min       1.000000
25%       1.000000
50%       1.000000
75%       1.000000
max      15.000000

 

평균이 1.07로 한 사람당 약 1개씩 구매한다는 사실을 알 수 있다.

 

2) unique()

 

#unique로 범주형 피처의 개수 출력하기

print(len(chipo['order_id'].unique()))

print(len(chipo['item_name'].unique()))

 

결과

1834
50

 

 

count_values() 함수

: 각 value가 몇 개 있는지 반환, 오름차순이 기본이다. 

 

#가장 많이 주문한 아이템 Top10

#value_counts()는 각 value가 몇 개 있는지 반환한다. 

item_count = chipo['item_name'].value_counts()[:10] # -> 기본 오름차순
item_count_reverse = chipo['item_name'].value_counts(sort=True, ascending=False)[:10]
print(item_count)
print('-------------------------')
print(item_count_reverse)

결과

Chicken Bowl                    726
Chicken Burrito                 553
Chips and Guacamole             479
Steak Burrito                   368
Canned Soft Drink               301
Steak Bowl                      211
Chips                           211
Bottled Water                   162
Chicken Soft Tacos              115
Chips and Fresh Tomato Salsa    110
Name: item_name, dtype: int64
-------------------------
Chicken Bowl                    726
Chicken Burrito                 553
Chips and Guacamole             479
Steak Burrito                   368
Canned Soft Drink               301
Steak Bowl                      211
Chips                           211
Bottled Water                   162
Chicken Soft Tacos              115
Chips and Fresh Tomato Salsa    110
Name: item_name, dtype: int64

 

+ enumerate와 함께 깔끔하게 반환해보자

 

#enumerate와 함께 반환해보자

for i, (val,cnt) in enumerate (item_count.items(),1):
  print("Top",i,":",val,cnt) 

#item -> 키, 쌍을 반환
Top 1 : Chicken Bowl 726
Top 2 : Chicken Burrito 553
Top 3 : Chips and Guacamole 479
Top 4 : Steak Burrito 368
Top 5 : Canned Soft Drink 301
Top 6 : Steak Bowl 211
Top 7 : Chips 211
Top 8 : Bottled Water 162
Top 9 : Chicken Soft Tacos 115
Top 10 : Chips and Fresh Tomato Salsa 110

 

 

groupby : 열이름으로 묶어주기, sql에서 groupby 생각해주면 될 듯

 

#groupby ->열이름으로 묶어주기

order_count = chipo.groupby('item_name')['order_id'].count() #동일한 아이템 이름으로 묶어주고, 묶인 아이템 이름으로 가진 아이템 아이디가 몇개 있는지  센다.

print(order_count[:10])
item_name
6 Pack Soft Drink         54
Barbacoa Bowl             66
Barbacoa Burrito          91
Barbacoa Crispy Tacos     11
Barbacoa Salad Bowl       10
Barbacoa Soft Tacos       25
Bottled Water            162
Bowl                       2
Burrito                    6
Canned Soda              104
Name: order_id, dtype: int64

 

 

groupby를 통해 수량 더해주기

 

item_quantity = chipo.groupby('item_name')['quantity'].sum()

print(item_quantity[:10])

 

item_name
6 Pack Soft Drink         55
Barbacoa Bowl             66
Barbacoa Burrito          91
Barbacoa Crispy Tacos     12
Barbacoa Salad Bowl       10
Barbacoa Soft Tacos       25
Bottled Water            211
Bowl                       4
Burrito                    6
Canned Soda              126
Name: quantity, dtype: int64

 

 

맷플롯립으로 시각화

아이템별 주문 총수량을 막대그래프로 시각화해보자

 

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

#아에팀별 총수량의index를 리스트로 변환한다.
item_name_list = item_quantity.index.tolist()

x_pos= np.arange(len(item_name_list))
order_cnt = item_quantity.values.tolist()

plt.bar(x_pos,order_cnt,align='center')

plt.ylabel('orderde_quantity_sum')
plt.title("Distribution of all ordered item")

plt.show()