๊ธฐ์ด ํ๋ก์ ํธ : ์ํ ๊ณ ๊ฐ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ์๋น์ค ๋ถ์
๐๏ธ ๋ฐ์ดํฐ ์ ๊ทํ & ํ์คํ
Age_group์ ์์ฑ
๊ณ ๊ฐ๋ค์ Age๋ฅผ 10๋, 20๋, 30๋ ๋ฑ์ ๋ฒ์ฃผ๋ก ๊ทธ๋ฃนํํด ‘age_group’ ์ปฌ๋ผ์ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํ๋ค.
bank_numeric['age_group']= [int(i//10)*10 for i in bank_numeric['Age']]
Loan Type์ ๋ถ๋ฆฌํด ๋๋ฏธ ๋ณ์๋ก ๋ง๋ค๊ธฐ
Type_of_Loan ์ปฌ๋ผ์ ๊ฒฝ์ฐ Loan์ ์ข
๋ฅ๋ณ๋ก ๊ตฌ๋ถ๋ ๊ฒ์ด ์๋๋ผ ์ปด๋ง๋ฅผ ํตํด ํ๋์ ๊ฐ์ผ๋ก ์ฐ๊ฒฐ๋์ด์๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค.
โ
๊ณ ๊ฐ๋ง๋ค ์ด๋ค ์ข
๋ฅ์ ๋์ถ์ ๋ฐ์๋์ง ํ์ธํ๊ธฐ ์ด๋ ค์
โ
๋์ถ ์ข
๋ฅ๋ ๊ฐ์๋ ์์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ๋์ ์ปฌ๋ผ์ผ๋ก ํฉ์น๊ธฐ ์ด๋ ค์
๋ฐ๋ผ์ ๋ฐ์ดํฐ์์ ์กฐ๊ธ๋ ์ฝ๊ฒ ์ธ์ฌ์ดํธ๋ฅผ ๋ฝ์๋ด๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํจ. (๋๋ฏธ ๋ณ์ํ)
loans = ['Auto Loan', 'Credit-Builder Loan','Personal Loan','Payday Loan','Mortgage Loan','Home Equity Loan','Debt Consolidation Loan','Student Loan', 'Not Specified']
for loan_type in loans:
customer[loan_type] = [1 if loan_type in entry else 0 for entry in customer['Type_of_Loan']]
์ด ๊ณผ์ ์์ ๊ฒฐ์ธก์น๊ฐ ๋ง์๋ Num_of_Loan(๋์ถ ๊ฐ์)๋ฅผ ์์์ ๋ถ๋ฆฌํ ๋์ถ ์ข ๋ฅ ์ปฌ๋ผ๋ค์ ๋ฐํ์ผ๋ก ์๋ก ๊ณ์ฐํ๋ค.
customer['Num_of_Loan'] = customer['Auto Loan']+customer['Credit-Builder Loan']+customer['Personal Loan']+customer['Payday Loan']+customer['Mortgage Loan']+customer['Home Equity Loan']+customer['Debt Consolidation Loan']+customer['Student Loan']+customer['Not Specified']
๐ ์๊ฐํ - ์๋์ด ๋์ ๊ณ ๊ฐ(VIP)๊ณ ๊ฐ์ ์ก์๋ผ!
1. ์๋์ด ๋์ ๊ณ ์๋์ ๊ณ ๊ฐ์ ์ ์
๋ชจ๋ฆ์ง๊ธฐ VIP๋ผ๋ฉด, ๋จ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ๋๐ฐ์ด ์์ฃผ ๋ง์์ผ ํ๋ค.! ํ๊ท ์ ์ด์ง ์์, ํ๋ฒํ์ง ์์ ๊ณ ๊ฐ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ IQR ๊ธฐ๋ฒ์ ์ด์ฉํด ์ ๋ขฐ๊ตฌ๊ฐ์ ๋ฒ์ด๋ ์ด์์น์ ์ฃผ๋ชฉํด๋ณด๊ฒ ๋ค.
# x ์ถ ํ์ ํ์์ ๋ณ๊ฒฝํ๋ ํจ์ ์ ์
from matplotlib.ticker import FuncFormatter
# x ์ถ ํ์ ํ์์ ๋ณ๊ฒฝํ๋ ํจ์ ์ ์
def format_func(x, pos):
return '{:,.0f}'.format(x/1000) # #,### ํ์์ผ๋ก ํฌ๋งทํ
plt.figure(figsize=(16,9))
sns.boxplot(data=customer,x='Annual_Income')
# x ์ถ์ ์ ์ฉํ Formatter ์ค์
formatter = FuncFormatter(format_func)
plt.gca().xaxis.set_major_formatter(formatter)
# ๊ทธ๋ํ ํ์
plt.xlabel('Annual_Income($1k)')
upper bound ์ด์์ ๊ณ ์ก์ฐ๋ด์๋ค์ ์ด 512๋ช ์ผ๋ก, ์ ์ฒด 1,1437๋ช ์ ๊ณ ๊ฐ์ค 4.47%๋ฅผ ์ฐจ์งํ๋ค. ๊ณ ์ก ์ฐ๋ด์๋ค์ ๋ฐ๋ก high_salary_group ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํ์ฌ ์์ธํ ์ดํด๋ณด์.
q1 = customer['Annual_Income'].quantile(0.25)
q3 = customer['Annual_Income'].quantile(0.75)
upper_bound = q3+(q3-q1)*1.5
customer[customer['Annual_Income']>=upper_bound]['Customer_ID'].count()
โ 30๋ ์ด๋ฐ(30-35์ธ)์ ๊ณ ๊ฐ์ด 88๋ช ์ผ๋ก ๊ฐ์ฅ ๋ง๋ค. (๋น์จ ์ ์ผ๋ก๋ 164/3326, 4.93%)
# 30๋ ์ด๋ฐ(30-35์ธ)์ ๊ณ ๊ฐ์ด 88๋ช
์ผ๋ก ๊ฐ์ฅ ๋ง๋ค.
sns.histplot(data=high_salary_group,x='Age',
binrange=[10,60], bins=10,
color='green', alpha=0.5)
# ์ต๋ ๋น๋์ ๊ณ์ฐํ๊ธฐ
cond = (high_salary_group['Age']<35) & (high_salary_group['Age']>=30)
max_cnt = high_salary_group.loc[cond,'Age'].count()
plt.text(31.5, 100, max_cnt)
plt.ylim(0,110)
plt.title('Age Distribution of High Salary Group')
โ High Salary Group์ ๊ฒฝ์ฐ ๊ทธ ์ธ ๊ณ ๊ฐ๋ค์ ๋นํด ํ๊ท ์ ์ผ๋ก ์ฐ์ฒด์ผ์ Delay_from_due_date , ์ฐ์ฒด ํ์ Num_of_Delayed_Payment , ์ฑ๋ฌดOutstanding_Debt๊ฐ ์ ๋ค.
# palette
green_palette = ['#22CC88','#EEEEEE']
# customer ํ
์ด๋ธ์ VIP, else๋ก ๊ฐ์ด ์
๋ ฅ๋๋ salary_group ์ปฌ๋ผ ์์ฑ
customer['salary_group'] = ['VIP' if income > upper_bound else 'else' for income in customer['Annual_Income']]
# Delay from Due Date
sns.boxplot(data=customer, x='salary_group', y='Delay_from_due_date', palette=green_palette)
plt.title('Delay from Due Date by Salary Group')
# Num_of_Delayed_Payment
sns.boxplot(data=customer, x='salary_group', y='Num_of_Loan', palette = green_palette)
plt.title('Number of Loans by Salary Group')
# Outstanding Debt
sns.boxplot(data=customer, x='salary_group', y='Outstanding_Debt', palette=green_palette)
plt.title('Outstanding Debt by Salary Group')
โ High Salary Group์ ๊ฒฝ์ฐ ๊ทธ ์ธ ๊ณ ๊ฐ๋ค์ ๋นํด ํ๊ท ์ ์ผ๋ก ์ ์ฉ ์ ํ์จ Credit_Utilization_Ratio , ์ ์๊ณ ์ก Monthly_Balance , ์๊ฐ ์ ์ถ์ก Amount_invested_monthly ์ด ๋๋ค.
# palette
green_palette = ['#22CC88','#EEEEEE']
# customer ํ
์ด๋ธ์ VIP, else๋ก ๊ฐ์ด ์
๋ ฅ๋๋ salary_group ์ปฌ๋ผ ์์ฑ
customer['salary_group'] = ['VIP' if income > upper_bound else 'else' for income in customer['Annual_Income']]
# Credit_Utilization_Ratio
sns.boxplot(data=customer, x='salary_group', y='Credit_Utilization_Ratio', palette=green_palette)
plt.title('Credit Utilization Ratio by Salary Group')
# Monthly_Balance
sns.boxplot(data=customer, x='salary_group', y='Monthly_Balance',palette = green_palette)
plt.title('Monthly Balance by Salary Group')
# Amount_invested_monthly
sns.boxplot(data=customer, x='salary_group', y='Amount_invested_monthly', palette = green_palette)
plt.title('Amount invested monthly by Salary Group')
2. VIP ๊ณ ๊ฐ๋ค์ ๋์ถํํฉ ํ์
# customer ํ
์ด๋ธ์ annual_income์ ์ด์ฉํด ์๊ธ ๊ณ์ฐ, ์๊ธ ์ปฌ๋ผ ์ถ๊ฐ
customer['Monthly_Income'] = (customer['Annual_Income'])/4
# ํ์ํ ์ปฌ๋ผ๋ง ์ถ์ถํด investment_stat ํ
์ด๋ธ๋ก ๋นผ๊ธฐ
lst = ['Customer_ID','age_group', 'Monthly_Income', 'Outstanding_Debt', 'Amount_invested_monthly', 'Monthly_Balance','Num_of_Loan','salary_group', 'Num_of_Delayed_Payment']
investment_stat = customer[lst]
# investment_stat ํ
์ด๋ธ์ monthly income ๋๋น ์ ํฌ์์ก ๋น์จ์ ๊ณ์ฐํด investment_ratio ์ปฌ๋ผ ์ถ๊ฐ
investment_stat['investment_ratio'] = (customer['Amount_invested_monthly']/customer['Monthly_Income'])*100
# VIP ๊ทธ๋ฃน์ ๊ฐ๋ง ์ ์ฅํ stat ํ
์ด๋ธ ๋ง๋ค๊ธฐ
stat = investment_stat[investment_stat['salary_group']=='VIP']
โ High Salary Group์ ๊ฒฝ์ฐ ๊ทธ ์ธ ๊ณ ๊ฐ๋ค๊ณผ ๋น๊ตํ์ํ๋ ๋์ถ ๊ฐ์์ ํ๊ท ์ด ๋น์ทํ๋ค. ๊ทธ๋ฌ๋ ์ ๋ฐ์ ์ผ๋ก high salary group์ด ๋์ถ ๊ฐ์๊ฐ ๋ฎ๋ค.
sns.boxplot(data=customer, x='salary_group', y='Num_of_Loan', palette = green_palette)
plt.title('Number of Loans by Salary Group')
โ VIP vs. Others
# palette ๋ฐ explode
palette = ['#EEEEEE','#EEEEEE','#EEEEEE','#EEEEEE','#EEEEEE','#EEEEEE','#EEEEEE','#22CC88','#B9FFE3']
explode = [0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]
# pie chart ๊ทธ๋ฆฌ๊ธฐ - Loan Types of High Salary Group
plt.figure(figsize=(16,9))
plt.pie(loan_grouped['VIP'],
startangle=20,
explode=explode,
colors = palette, autopct='%1.2f%%',)
plt.legend(loan_grouped.index,bbox_to_anchor=(1, 0.5))
plt.title('Loan Types of High Salary Group')
# pie chart ๊ทธ๋ฆฌ๊ธฐ - Loan Types of others
plt.figure(figsize=(16,9))
plt.pie(loan_grouped['else'],
startangle=20,
explode=explode,
colors = palette, autopct='%1.2f%%',)
plt.legend(loan_grouped.index,bbox_to_anchor=(1, 0.5))
plt.title('Loan Types of others')
- VIP ๊ณ ๊ฐ๋ค์ ๋์ถ ์ ํ์์ ๊ฐ์ฅ ํฐ ๋ถ๋ถ์ ์ฐจ์ง ํ๋ ์ ํ์ Student Loan(12.10%)์ด๋ฉฐ, ์ ์๋์ง ์์ ๋์ถ ์ ํ(Not Specified, 9.46%)์ด ๊ฐ์ฅ ์ ๋ค.
- VIP ๊ณ ๊ฐ์ด ์๋ ๋ค๋ฅธ ๊ณ ๊ฐ๋ค์ ๊ฒฝ์ฐ Payday Loan(11.32%)์ด ๊ฐ์ฅ ๋ง๊ณ , Auto Loan(10.78%)๋ก ๊ฐ์ฅ ์ ๋ค. ๊ทธ๋ฌ๋ 11%๋๋ก ๋์ฒด์ ์ผ๋ก ๋์ถ ์ ํ์ด ๋น์ทํ๋ค.
โ VIP ๊ทธ๋ฃน ๋ด์์ age group๋ณ ๋์ถ ํํฉ
vip_age_loantype = customer.groupby(['salary_group','age_group'])[loans].sum().iloc[0:5]
vip_age_loantype = vip_age_loantype.reset_index().drop(['salary_group','age_group'],axis=1).T
vip_age_loantype.columns = [10,20,30,40,50]
vip_age_loantype
- ๋น๊ต์ ๋์ด๊ฐ ์ด๋ฆฐ 10-30๋์ ๊ฒฝ์ฐ Credit-Builder Loan(์ ์ฉ ์ ์๋ฅผ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํน๋ณํ ์ ํ์ ๋์ถ)๊ฐ ๋ง์
- 40๋์ ๊ฒฝ์ฐ Debt Consolidation Loan, Student Loan ์ด ๊ฐ์ฅ ๋ง์.
- 50๋์ ๊ฒฝ์ฐ Auto Loan, Debt Consolidation Loan, Student Loan์ด ๊ฐ์ฅ ๋ง์.
- ์ ์ฒด Age Group์์ ๊ฐ์ฅ ๋์ถ์ ์ ๊ฒ ํ๋ ์ฐ๋ น๋๋ 50๋, ๊ฐ์ฅ ํ๋ฐํ ํ๋ ์ฐ๋ น๋๋ 30๋์.
โ VIP ๊ณ ๊ฐ๋ค์ ๋ฏธ์ํ๋ถ์ฑ ์ด์ก(Outstanding Debt)๋ ์ด๋ ํ๊ฐ?
## VIP vs. Others
sns.boxplot(data=investment_stat, x='salary_group', y = 'Outstanding_Debt', palette= green_palette)
## age_group๋ณ outstanding_debt
green_palette2 = ['#22CC88','#43DFA0','#78ECBD','#B9FFE3','#EFFBF7']
# 'salary_group'์ median ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์์๋ฅผ ์์ฑํฉ๋๋ค.
median_order = stat.groupby('age_group')['Outstanding_Debt'].median().sort_values().index
# median ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌ๋ ์์๋ก boxplot์ ๊ทธ๋ฆฝ๋๋ค.
sns.boxplot(data=stat, x='age_group', y='Outstanding_Debt', palette=green_palette2, order=median_order)
- VIP ๊ณ ๊ฐ์ด ํ๊ท ์ ์ผ๋ก ๋ฏธ์ํ์ฑ๋ฌด๊ฐ else ๊ทธ๋ฃน๋ณด๋ค ์ ์
- VIP ๊ณ ๊ฐ์ค ๋ฏธ์ํ ์ฑ๋ฌด๊ฐ ๊ฐ์ฅ ์ ์ ๊ทธ๋ฃน์ 30๋(783.975, 1์), 40๋(820.020, 2์), 50๋(849.690,3์)
โ VIP ๊ณ ๊ฐ๋ค์ ์ฑ๋ฌด๋ฅผ ์ฑ์คํ ์ดํํ๋๊ฐ?
## VIP vs.Others
sns.boxplot(data=investment_stat, x='salary_group', y = 'Num_of_Delayed_Payment', palette= green_palette)
## age_group
# order ์ ๋ฆฌ
median_order = stat.groupby('age_group')['Num_of_Delayed_Payment'].median().sort_values().index
# median ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌ๋ ์์๋ก boxplot์ ๊ทธ๋ฆฝ๋๋ค.
sns.boxplot(data=stat, x='age_group', y='Num_of_Delayed_Payment', palette=green_palette2, order=median_order)
- else ๊ทธ๋ฃน๋ณด๋ค๋ VIP ๊ณ ๊ฐ์ด ์ฑ๋ฌด๋ฅผ ์ฑ์คํ ์ดํํ๋ค.
- VIP ๊ณ ๊ฐ ์ค์์๋ 50๋ ๊ณ ๊ฐ์ด ์ฑ๋ฌด๋ฅผ ๊ฐ์ฅ ์ฑ์คํ ์ดํํ๋ฉฐ, 10๋ ๊ณ ๊ฐ์ด ํ๊ท ์ ์ผ๋ก ์ฒด๋ฉ์ ๊ฐ์ฅ ๋ง์ด ํ๋ค.