Skip to content

Latest commit

 

History

History
215 lines (185 loc) · 7.08 KB

211010.md

File metadata and controls

215 lines (185 loc) · 7.08 KB

Day 9

직장인을 위한 데이터분석 with 파이썬 (9일차)

데이터 전처리

회사명, 모델명 정리

import pandas as pd

data = pd.read_excel('./files/1_danawa_crawling_result.xlsx')

company_list = []
product_list = []
for title in data['상품명']:
    title_info = title.split(' ', 1)
    print(title_info)
    try:
        company_name = title_info[0]
        product_name = title_info[1]
    except: # 모델명만 적힌 데이터들이 있어서 해당하는 것들은 회사명을 공백 처리
        company_name = ' '
        product_name = title_info[0]
    company_list.append(company_name)
    product_list.append(product_name)

스펙 목록 정리

category_list = []
use_time_list = []
charge_time_list = []

for spec_data in data['스펙 목록']:
    # ' / '를 기준으로 스펙 분리
    spec_list = spec_data.split(' / ')
    
    # 용도 추출
    category = spec_list[0]
    category_list.append(category)
    
    # 사용시간, 흡입력 추출
    # 사용시간, 흡입력 정보가 없는 제품을 위해 변수 생성
    use_time_value = None
    charge_time_value = None
    
    # spec_list의 각 원소에서 사용시간, 흡입력 수치 추출
    
    for spec in spec_list:
        if '사용시간' in spec:
            use_time_value = spec.split(' ')[1].split('(')[0].strip()
        if '충전시간' in spec:
            charge_time_value = spec.split(':')[1].strip()
    
    use_time_list.append(use_time_value)
    charge_time_list.append(charge_time_value)

사용시간, 충전시간 단위 통일

def convert_time_minute(time):
    try:
        if '시간' in time:
            hour = time.split('시간')[0]
            if '분' in time:
                minute = time.split('시간')[-1].split('분')[0]
            else:
                minute = 0
        else:
            hour = 0
            minute = time.split('분')[0]
        return int(hour) * 60 + int(minute)
    except:
        return None

new_use_time_list = []
new_charge_time_list = []

# 사용시간 통일
for time in use_time_list:
    value = convert_time_minute(time)
    new_use_time_list.append(value)

# 충전시간 통일
for time in charge_time_list:
    value = convert_time_minute(time)
    new_charge_time_list.append(value)

전처리 결과 저장

pd_data = pd.DataFrame()
pd_data['카테고리'] = category_list
pd_data['회사명'] = company_list
pd_data['제품'] = product_list
pd_data['가격'] = data['가격']
pd_data['사용시간'] = new_use_time_list
pd_data['충전시간'] = new_charge_time_list

pd_data_final = pd_data[pd_data['카테고리'].isin(['로봇청소기'])]

pd_data_final.to_excel('./files/2_danawa_data_final.xlsx', index = False)

여러 칼럼 기준으로 정렬

import pandas as pd
danawa_data = pd.read_excel('./files/2_danawa_data_final.xlsx')

# 사용시간, 충전시간을 기준으로 정렬
# 첫 번째 칼럼을 기준으로 정렬하고 다음 칼럼 기준으로 정렬
top_list = danawa_data.sort_values(['충전시간', '사용시간'], ascending = False)

가성비 좋은 제품 살펴보기

price_mean_value = danawa_data['가격'].mean()
use_time_mean_value = danawa_data['사용시간'].mean()
charge_time_mean_value = danawa_data['충전시간'].mean()

# 가격은 평균가보다 낮으면서, 사용시간은 길고, 충전시간은 짧은 제품 확인
condition_data = danawa_data[
    (danawa_data['가격'] <= price_mean_value) &
    (danawa_data['사용시간'] >= use_time_mean_value) &
    (danawa_data['충전시간'] <= charge_time_mean_value)
]

시각화

from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
import seaborn as sns
import platform

font_path = ''
font_path = 'c:/Windows/Fonts/malgun.ttf'
font_name = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family = font_name)

# 정확한 차트를 그리기 위해 가격, 사용시간, 충전시간 값이 없는 것은 삭제, dropna 함수 이용, 행 자체를 지워야 하니 axis = 0으로
chart_data = danawa_data.dropna(axis=0)

# 사용시간, 충전시간 최대, 평균
use_time_max_value = chart_data['사용시간'].max()
use_time_mean_value = chart_data['사용시간'].mean()
charge_time_max_value = chart_data['충전시간'].max()
charge_time_mean_value = chart_data['충전시간'].mean()

plt.figure(figsize=(20,10))
plt.title('로봇청소기 차트')
sns.scatterplot(x = '충전시간', y = '사용시간',  size = '가격', hue = chart_data['회사명'], data = chart_data, sizes = (10,1000), legend = False)
plt.plot([0, charge_time_max_value],
        [use_time_mean_value, use_time_mean_value],
        'r--',
        lw = 1)
plt.plot([charge_time_mean_value, charge_time_mean_value],
        [0, use_time_max_value],
        'r--',
        lw = 1)
plt.show()

x축 : 충전시간

y축 : 사용시간

가격을 포인트 크기로 설정

빨간선 : 사용시간, 충전시간 평균값 상위 20개 모델 시각화

# 사용시간, 충전시간 최대, 평균
use_time_max_value = chart_data_selected['사용시간'].max()
use_time_mean_value = chart_data_selected['사용시간'].mean()
charge_time_max_value = chart_data_selected['충전시간'].max()
charge_time_mean_value = chart_data_selected['충전시간'].mean()

plt.figure(figsize=(20,10))
plt.title('로봇청소기 차트')
sns.scatterplot(x = '충전시간', 
                y = '사용시간',  
                size = '가격', 
                hue = chart_data_selected['회사명'], 
                data = chart_data_selected,
                sizes = (100,2000),
                legend = False)
plt.plot([60, charge_time_max_value],
        [use_time_mean_value, use_time_mean_value],
        'r--',
        lw = 1)
plt.plot([charge_time_mean_value, charge_time_mean_value],
        [20, use_time_max_value],
        'r--',
        lw = 1)

for index, row in chart_data_selected.iterrows():
    x = row['충전시간']
    y = row['사용시간']
    s = row['제품'].split(' ')[0]
    plt.text(x, y, s, size = 20)

plt.show()

그래프 설정

  • plt.figure(figsize=(n, m)) : 그래프 크기 조절
  • plt.title('text', fontsize=15) : 그래프 제목 설정
  • plt.xlim([min, max]) : x축 범위 설정
  • plt.ylim([min, max]) : y축 범위 설정
  • plt.xlabel('text', fontsize = 15) : x축 라벨 설정
  • plt.ylabel('text', fontsize = 15) : y축 라벨 설정
  • plt.grid() : 격자 생성
  • plt.savefig('저장경로') : 그래프 저장
  • plt.legend() : 범례 표시
  • plt.text(x, y, 'text') : 텍스트 표시

산점도(Scatter plot)

각각의 데이터 포인트들을 흩 뿌려놓은 형태, 크게 양의 상관관계 또는 음의 상관관계 그리고 무상관을 나타냄.

추가 matplotlib 옵션들

이걸로 이 책을 끝이 났다. 내가 처음하는 데이터 분석이어서 상당히 헤메고 적절하지 못한 분석도 있었던 것 같아 아쉽다.