회사명, 모델명 정리
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') : 텍스트 표시
각각의 데이터 포인트들을 흩 뿌려놓은 형태, 크게 양의 상관관계 또는 음의 상관관계 그리고 무상관을 나타냄.
이걸로 이 책을 끝이 났다. 내가 처음하는 데이터 분석이어서 상당히 헤메고 적절하지 못한 분석도 있었던 것 같아 아쉽다.