고객사는 카시트를 판매하는 회사임.
최근 매출 하락에 대해 각 부서가 파악한 원인 다음과 같음.
그러나 각 부서가 파악한 원인이 데이터에 근거하고 있는지 확인해 볼 필요가 있음.
단변량 분석 할 때 확인해야 할 점들
개별 변수의 분포로 부터…
비즈니스의 일반 사항과 특이사항을 도출
# 필요한 모듈 가져오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings(action='ignore')
변수명 | 설명 | 구분 |
---|---|---|
Sales | 각 지역 판매액(단위 : 1000달러) | Target |
CompPrice | 경쟁사 가격(단위 : 달러) | feature |
Income | 지역 평균 소득(단위 : 1000달러) | feature |
Advertising | 각 지역, 회사의 광고 예산(단위 : 1000달러) | feature |
Population | 지역 인구수(단위 : 1000명) | feature |
Price | 자사 지역별 판매가격 | feature |
ShelveLoc | 진열상태 | feature |
Age | 지역 인구의 평균 연령 | feature |
Urban | 도심 지역 여부(0,1) | feature |
US | 매장이 미국에 있는지 여부(0,1) | feature |
path = 'https://raw.githubusercontent.com/JunhoYu/Data-Analysis/main/Carseats.csv'
data = pd.read_csv(path)
# 설명이 되어 있지 않은 컬럼에 대해서는 삭제 조치
data.drop('Education', axis = 1, inplace = True)
data.head()
Sales | CompPrice | Income | Advertising | Population | Price | ShelveLoc | Age | Urban | US | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 9.50 | 138 | 73 | 11 | 276 | 120 | Bad | 42 | Yes | Yes |
1 | 11.22 | 111 | 48 | 16 | 260 | 83 | Good | 65 | Yes | Yes |
2 | 10.06 | 113 | 35 | 10 | 269 | 80 | Medium | 59 | Yes | Yes |
3 | 7.40 | 117 | 100 | 4 | 466 | 97 | Medium | 55 | Yes | Yes |
4 | 4.15 | 141 | 64 | 3 | 340 | 128 | Bad | 38 | Yes | No |
var = 'Sales'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 7.496325
std 2.824115
min 0.000000
25% 5.390000
50% 7.490000
75% 9.320000
max 16.270000
Name: Sales, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(x = var, data = data, bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(x = var, data = data)
plt.subplot(3,1,3)
sns.boxplot(x = var, data = data,)
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'CompPrice'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 124.975000
std 15.334512
min 77.000000
25% 115.000000
50% 125.000000
75% 135.000000
max 175.000000
Name: CompPrice, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(x = var, data = data, bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(x = var, data = data)
plt.subplot(3,1,3)
sns.boxplot(x = var, data = data,)
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'Income'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
NaN 없음
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 68.657500
std 27.986037
min 21.000000
25% 42.750000
50% 69.000000
75% 91.000000
max 120.000000
Name: Income, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(x = var, data = data, bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(x = var, data = data)
plt.subplot(3,1,3)
sns.boxplot(x = var, data = data,)
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'Advertising'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 6.635000
std 6.650364
min 0.000000
25% 0.000000
50% 5.000000
75% 12.000000
max 29.000000
Name: Advertising, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(x = var, data = data, bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(x = var, data = data)
plt.subplot(3,1,3)
sns.boxplot(x = var, data = data,)
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
# 광고비 예산이 0 인 지역이 많아 보임.
# 광고비 예산이 0 인 지역의 비율.
data.loc[data['Advertising']==0].shape[0] / data.shape[0]
0.36
8) 추가 분석해 볼 사항이 있나요?
var = 'Population'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 264.840000
std 147.376436
min 10.000000
25% 139.000000
50% 272.000000
75% 398.500000
max 509.000000
Name: Population, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(data[var], bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(data[var])
plt.subplot(3,1,3)
sns.boxplot(data[var])
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'Price'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 115.795000
std 23.676664
min 24.000000
25% 100.000000
50% 117.000000
75% 131.000000
max 191.000000
Name: Price, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(data[var], bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(data[var])
plt.subplot(3,1,3)
sns.boxplot(data[var])
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
# 추가 분석
plt.figure(figsize = (10,6))
sns.kdeplot(data['Price'], label = 'Price')
sns.kdeplot(data['CompPrice'], label = 'CompPrice')
price_mean = round(np.mean(data['Price']),1)
com_mean = round(np.mean(data['CompPrice']),1)
plt.axvline(price_mean, color = 'C0', linewidth = .5)
plt.axvline(com_mean, color = 'C1', linewidth = .5)
plt.text(price_mean-16, 0.001, price_mean, color = 'C0')
plt.text(com_mean+5, 0.001, com_mean, color = 'C1')
plt.legend()
plt.show()
plt.figure(figsize = (10,6))
sns.boxplot(data=data[['Price','CompPrice']], orient="h")
plt.show()
var = 'ShelveLoc'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
# 범주별 빈도수
data[var].value_counts()
Medium 219
Bad 96
Good 85
Name: ShelveLoc, dtype: int64
# 범주별 비율
data[var].value_counts() / data[var].shape[0]
Medium 0.5475
Bad 0.2400
Good 0.2125
Name: ShelveLoc, dtype: float64
6) 분포 확인(시각화)
sns.countplot(data[var], order = ['Good','Medium','Bad'])
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'Age'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
data[var].describe()
count 400.000000
mean 53.322500
std 16.200297
min 25.000000
25% 39.750000
50% 54.500000
75% 66.000000
max 80.000000
Name: Age, dtype: float64
6) 분포 확인(시각화)
plt.figure(figsize = (6,8))
plt.subplot(3,1,1)
sns.histplot(data[var], bins = 20)
plt.subplot(3,1,2)
sns.kdeplot(data[var])
plt.subplot(3,1,3)
sns.boxplot(data[var])
plt.tight_layout()
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'Urban'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
data[var].unique()
array(['Yes', 'No'], dtype=object)
가변수화 필요
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
# 범주별 빈도수
data[var].value_counts()
Yes 282
No 118
Name: Urban, dtype: int64
# 범주별 비율
data[var].value_counts() / data[var].shape[0]
Yes 0.705
No 0.295
Name: Urban, dtype: float64
6) 분포 확인(시각화)
sns.countplot(data[var], order = ['Yes','No'])
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
var = 'US'
1) 변수의 비즈니스 의미
2) 숫자, 범주?
data[var].unique()
array(['Yes', 'No'], dtype=object)
3) NaN 존재 유무 및 조치방안
data[var].isna().sum()
0
4) 가변수화 필요 여부
5) 기초통계량(수치화)
# 범주별 빈도수
data[var].value_counts()
Yes 258
No 142
Name: US, dtype: int64
# 범주별 비율
data[var].value_counts() / data[var].shape[0]
Yes 0.645
No 0.355
Name: US, dtype: float64
6) 분포 확인(시각화)
sns.countplot(data[var], order = ['Yes', 'No'])
plt.show()
7) 기초통계량과 분포를 통해서 파악한 내용.
8) 추가 분석해 볼 사항이 있나요?
최근 매출하락에 대한 원인들에 대해 단변량 분석 결과를 정리해봄.