KRX_EDA 원티드 에듀 입사 지원 과제 복습

"원티드 에듀" 서류 지원했을 때 주어진 과제가 주가 데이터 분석이었다.
오늘 서류 면접 결과를 기다리면서 과제 프로젝트를 했을 때 혹시 데이터 탐색시 발견하지 못한 점이 있지 않은지 확인차 시각화하며 데이터를 음미(?)했다.
데이터를 보며 인사이트를 도출하는 과정만큼 희열을 주는 일을 찾기 힘든것같다.
원티드 에듀 서류면접은 합격했다 :)

import pandas as pd
import seaborn as sns
df = pd.read_csv('krx.csv', dtype={"Symbol":object})

전체 데이터 요약, 관계성, 타입, 행&열 갯수 분석

  • krx 컬럼 이름 해석
    {'회사명':'Name',
    '종목코드':'Symbol',
    '업종':'Sector',
    '주요제품':'Industry',
    '상장일':'ListingDate',
    '결산월':'SettleMonth',
    '대표자명':'Representative',
    '홈페이지':'HomePage',
    '지역':'Region', }
df.shape
(7211, 11)
# head 로 위에 있는 데이터 일부만 가져옵니다.
df.head()
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region
0 060310 KOSDAQ 3S 특수 목적용 기계 제조업 반도체 웨이퍼 캐리어 2002-04-23 03월 박종익, 김세완 (각자 대표이사) http://www.3sref.com 서울특별시
1 095570 KOSPI AJ네트웍스 산업용 기계 및 장비 임대업 렌탈(파렛트, OA장비, 건설장비) 2015-08-21 12월 이현우, 박대현 http://www.ajnet.co.kr 서울특별시
2 006840 KOSPI AK홀딩스 기타 금융업 지주사업 1999-08-11 12월 채형석, 이석주(각자 대표이사) http://www.aekyunggroup.co.kr 서울특별시
3 054620 KOSDAQ APS홀딩스 기타 금융업 인터넷 트래픽 솔루션 2001-12-04 12월 정기로 http://www.apsholdings.co.kr 경기도
4 265520 KOSDAQ AP시스템 특수 목적용 기계 제조업 디스플레이 제조 장비 2017-04-07 12월 김영주 http://www.apsystems.co.kr 경기도
# tail 로 아래 있는 데이터 일부만 가져옵니다.
df.tail()
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region
7206 000547 KOSPI 흥국화재2우B NaN NaN NaN NaN NaN NaN NaN
7207 000545 KOSPI 흥국화재우 NaN NaN NaN NaN NaN NaN NaN
7208 003280 KOSPI 흥아해운 해상 운송업 외항화물운송업(케미컬탱커) 1976-06-29 12월 이환구 http://www.heung-a.com 서울특별시
7209 037440 KOSDAQ 희림 건축기술, 엔지니어링 및 관련 기술 서비스업 설계 및 감리용역 2000-02-03 12월 정영균, 이목운, 허철호 (각자대표) http://www.heerim.com 서울특별시
7210 238490 KOSDAQ 힘스 특수 목적용 기계 제조업 OLED Mask 인장기, OLED Mask 검사기 등 2017-07-20 12월 김주환 http://www.hims.co.kr 인천광역시
df.sample()
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region ListingYear
3695 045300 KOSDAQ 성우테크론 전자부품 제조업 리드프레임가공, 반도체 장비 2001-12-18 12월 박찬홍 http://www.swmv.co.kr 경상남도 2001.0
# info 로 요약 데이터를 봅니다.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7211 entries, 0 to 7210
Data columns (total 10 columns):
 #   Column          Non-Null Count  Dtype 
---  ------          --------------  ----- 
 0   Symbol          7211 non-null   object
 1   Market          7211 non-null   object
 2   Name            7211 non-null   object
 3   Sector          2438 non-null   object
 4   Industry        2419 non-null   object
 5   ListingDate     2438 non-null   object
 6   SettleMonth     2438 non-null   object
 7   Representative  2438 non-null   object
 8   HomePage        2258 non-null   object
 9   Region          2438 non-null   object
dtypes: object(10)
memory usage: 563.5+ KB
# describe 로 기술통계값을 봅니다.
df.describe()
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region
count 7211 7211 7211 2438 2419 2438 2438 2438 2258 2438
unique 7211 3 7211 158 2264 1799 9 2319 2237 22
top 308100 KOSPI 미래FH92KOSPI200풋 특수 목적용 기계 제조업 기업인수합병 1976-06-30 12월 - http://imt@kmaringroup.com 서울특별시
freq 1 5555 1 144 37 8 2378 5 2 987
# 중복을 제외한 unique 값의 갯수를 봅니다.
df.nunique()
Symbol            7211
Market               3
Name              7211
Sector             158
Industry          2264
ListingDate       1799
SettleMonth          9
Representative    2319
HomePage          2237
Region              22
dtype: int64
# index 값 보기
df.index
RangeIndex(start=0, stop=7211, step=1)
# 컬럼값 보기
df.columns
Index(['Symbol', 'Market', 'Name', 'Sector', 'Industry', 'ListingDate',
       'SettleMonth', 'Representative', 'HomePage', 'Region'],
      dtype='object')
# 값만 보기
df.values
array([['060310', 'KOSDAQ', '3S', ..., '박종익, 김세완 (각자 대표이사)',
        'http://www.3sref.com', '서울특별시'],
       ['095570', 'KOSPI', 'AJ네트웍스', ..., '이현우, 박대현',
        'http://www.ajnet.co.kr', '서울특별시'],
       ['006840', 'KOSPI', 'AK홀딩스', ..., '채형석, 이석주(각자 대표이사)',
        'http://www.aekyunggroup.co.kr', '서울특별시'],
       ...,
       ['003280', 'KOSPI', '흥아해운', ..., '이환구', 'http://www.heung-a.com',
        '서울특별시'],
       ['037440', 'KOSDAQ', '희림', ..., '정영균, 이목운, 허철호 (각자대표)',
        'http://www.heerim.com', '서울특별시'],
       ['238490', 'KOSDAQ', '힘스', ..., '김주환', 'http://www.hims.co.kr',
        '인천광역시']], dtype=object)

1개의 컬럼 변수로 데이터 탐색

# 카카오를 찾습니다.
df["Name"] == "카카오" #어딘가에 카카오가 숨어있다.
0       False
1       False
2       False
3       False
4       False
        ...  
7206    False
7207    False
7208    False
7209    False
7210    False
Name: Name, Length: 7211, dtype: bool
df[df["Name"] == "카카오"] #True인 index값을 indexing해서 가져온다.
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region
4716 035720 KOSPI 카카오 자료처리, 호스팅, 포털 및 기타 인터넷 정보매개 서비스업 인터넷 서비스(인터넷 광고) 2017-07-10 12월 여민수, 조수용 http://www.kakaocorp.com 제주특별자치도
# 서울특별시에 소재지를 두고 있는 KOSPI 종목의 종목명과 심볼을 가져옵니다.
df.loc[(df["Region"] == "서울특별시") & (df["Market"] == "KOSPI"), ["Symbol", "Name"]]
Symbol Name
1 095570 AJ네트웍스
2 006840 AK홀딩스
47 027410 BGF
48 282330 BGF리테일
50 001460 BYC
... ... ...
7194 079980 휴비스
7196 005010 휴스틸
7200 069260 휴켐스
7205 000540 흥국화재
7208 003280 흥아해운

407 rows × 2 columns

파생변수 만들기

df.columns
Index(['Symbol', 'Market', 'Name', 'Sector', 'Industry', 'ListingDate',
       'SettleMonth', 'Representative', 'HomePage', 'Region', 'ListingYear'],
      dtype='object')
# ListingYear 파생변수 만들기
df["ListingDate"] = pd.to_datetime(df["ListingDate"])
df["ListingYear"] = df["ListingDate"].dt.year
df["ListingYear"]
0       2002.0
1       2015.0
2       1999.0
3       2001.0
4       2017.0
         ...  
7206       NaN
7207       NaN
7208    1976.0
7209    2000.0
7210    2017.0
Name: ListingYear, Length: 7211, dtype: float64
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7211 entries, 0 to 7210
Data columns (total 11 columns):
 #   Column          Non-Null Count  Dtype         
---  ------          --------------  -----         
 0   Symbol          7211 non-null   object        
 1   Market          7211 non-null   object        
 2   Name            7211 non-null   object        
 3   Sector          2438 non-null   object        
 4   Industry        2419 non-null   object        
 5   ListingDate     2438 non-null   datetime64[ns]
 6   SettleMonth     2438 non-null   object        
 7   Representative  2438 non-null   object        
 8   HomePage        2258 non-null   object        
 9   Region          2438 non-null   object        
 10  ListingYear     2438 non-null   float64       
dtypes: datetime64[ns](1), float64(1), object(9)
memory usage: 619.8+ KB
df[["ListingYear", "ListingDate"]].dtypes
ListingYear           float64
ListingDate    datetime64[ns]
dtype: object

데이터 시각화를 위한 폰트설정

  1. 플랫폼 모듈 임포트
  2. 모듈 임포트안에있는 함수 system()으로 통해 각 CPU에 맞는 시스템 이름 호출
  3. 시스템 이름에 맞는 폰트 이름 변수에 입력.
  4. 그 폰트 이름을 plt안에 있는 rc()함수 attribute "family"에 입력
def get_font_family():
    """
    시스템 환경에 따른 기본 폰트명을 반환하는 함수
    """
    import platform
    system_name = platform.system()
    # colab 사용자는 system_name이 'Linux'로 확인

    if system_name == "Darwin" :
        font_family = "AppleGothic"
    elif system_name == "Windows":
        font_family = "Malgun Gothic"
    else:
        # Linux
        # colab에서는 runtime을 <꼭> 재시작 해야함.
        # 런타임을 재시작 하지 않고 폰트 설치를 하면 기본 설정 폰트가 로드되어 한글이 깨짐.
        !apt-get update -qq
        !apt-get install fonts-nanum -qq  > /dev/null

        import matplotlib.font_manager as fm

        fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
        font = fm.FontProperties(fname=fontpath, size=9)
        fm._rebuild()
        font_family = "NanumBarunGothic"
    return font_family
get_font_family()
'AppleGothic'
# 시각화를 위한 폰트설정
# 위에서 만든 함수를 통해 시스템 폰트를 불러와서 font_family 라는 변수에 할당.
a = get_font_family()
# 폰트설정
import matplotlib.pyplot as plt 
plt.rc("font", family = a)
# 마이너스폰트 설정
plt.rc("axes", unicode_minus=False)
# ggplot으로 그래프 스타일 설정
plt.style.use("ggplot")

폰트 설정 확인하기

# 한글폰트 확인하기
pd.Series([1,3,5,7,9]).plot(title="한글폰트")
<matplotlib.axes._subplots.AxesSubplot at 0x1a2488cc10>

png

한 개의 변수 빈도수 구하고 시각화 하기

  • Keyword

    • Series.value_counts()
    • Series.value_counts().plot()
    • Series.value_counts().plot.bar()
    • Series.value_counts().plot.barh()
    • sns.countplot()
# Market column에 어떤 데이터들이 있는지 unique로 확인하기.
df["Market"].unique()
array(['KOSDAQ', 'KOSPI', 'KONEX'], dtype=object)
# value_counts()로 빈도수를 구함.
df["Market"].value_counts()
KOSPI     5555
KOSDAQ    1518
KONEX      138
Name: Market, dtype: int64
# 빈도수를 시각화 함.
df["Market"].sort_values().value_counts().plot.barh(rot=30)
<matplotlib.axes._subplots.AxesSubplot at 0x1a247a3850>

png

# Seaborn countplot 활용하여 빈도수를 표현합니다.
sns.countplot(data = df, y = "Market")
<matplotlib.axes._subplots.AxesSubplot at 0x1a24602950>

png

Sector (종류가 많을 시 상위 30개만 추려 시각화)

# 섹터의 빈도수를 구하고
# 상위 30개 섹터의 빈도수를 sector_count_top 변수에 할당.
sector_count_top = df["Sector"].value_counts().head(30)
sector_count_top.index
Index(['특수 목적용 기계 제조업', '소프트웨어 개발 및 공급업', '전자부품 제조업', '자동차 신품 부품 제조업',
       '의약품 제조업', '기타 금융업', '기타 화학제품 제조업', '금융 지원 서비스업', '통신 및 방송 장비 제조업',
       '반도체 제조업', '1차 철강 제조업', '자연과학 및 공학 연구개발업', '의료용 기기 제조업',
       '일반 목적용 기계 제조업', '플라스틱제품 제조업', '기타 전문 도매업', '기초 화학물질 제조업',
       '기초 의약물질 및 생물학적 제제 제조업', '컴퓨터 프로그래밍, 시스템 통합 및 관리업',
       '전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업', '영화, 비디오물, 방송프로그램 제작 및 배급업',
       '기타 식품 제조업', '의료용품 및 기타 의약 관련제품 제조업', '봉제의복 제조업', '기타 금속 가공제품 제조업',
       '기계장비 및 관련 물품 도매업', '측정, 시험, 항해, 제어 및 기타 정밀기기 제조업; 광학기기 제외', '건물 건설업',
       '구조용 금속제품, 탱크 및 증기발생기 제조업', '자료처리, 호스팅, 포털 및 기타 인터넷 정보매개 서비스업'],
      dtype='object')
df_sector_30 = df[df["Sector"].isin(sector_count_top.index)]
# Seaborn countplot 활용하여 빈도수를 표현합니다.
plt.figure(figsize = (10,8))
sns.countplot(data = df_sector_30, y="Sector", palette = "Blues_r",
              order=sector_count_top.index).set_title("섹터별 빈도수")
Text(0.5, 1.0, '섹터별 빈도수')

png

#색깔바꾸기 옵션.
print(plt.colormaps())
['Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'icefire', 'icefire_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'mako', 'mako_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'rocket', 'rocket_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'twilight', 'twilight_r', 'twilight_shifted', 'twilight_shifted_r', 'viridis', 'viridis_r', 'vlag', 'vlag_r', 'winter', 'winter_r']
sector_value_counts = df["Sector"].value_counts()
sector_value_counts.to_frame().plot.kde()
<matplotlib.axes._subplots.AxesSubplot at 0x1a2e2cb350>

png

Industry

# Industry 의 빈도수를 구합니다.
industry_top_30 = df["Industry"].value_counts().head(30)
industry_top_30.index
Index(['기업인수합병', '지주회사', '지주사업', '기업 인수 및 합병', '기업인수 및 합병', '화장품', '모바일게임',
       '벤처캐피탈', '금융지원 서비스', '자동차부품', '금융지원서비스', '의약품', '도급공사', '합병', '건강기능식품',
       '-', '셋톱박스', '증권업', '금융지주회사', '의료정보시스템', '배합사료', '사료',
       '부동산투자, 취득, 매매, 임대', '이미지센서 패키징', '항체치료제', '플라스틱 필름', '소주', '비금융지주회사',
       '도시가스', '금융 지원 서비스'],
      dtype='object')
industry_top_30
기업인수합병               37
지주회사                 19
지주사업                  9
기업 인수 및 합병            7
기업인수 및 합병             7
화장품                   7
모바일게임                 7
벤처캐피탈                 4
금융지원 서비스              4
자동차부품                 3
금융지원서비스               3
의약품                   3
도급공사                  3
합병                    3
건강기능식품                3
-                     3
셋톱박스                  3
증권업                   3
금융지주회사                3
의료정보시스템               2
배합사료                  2
사료                    2
부동산투자, 취득, 매매, 임대     2
이미지센서 패키징             2
항체치료제                 2
플라스틱 필름               2
소주                    2
비금융지주회사               2
도시가스                  2
금융 지원 서비스             2
Name: Industry, dtype: int64
# Industry 빈도수를 pandas 의 plot 기능을 사용해 시각화 합니다.
industry_top_30.sort_values().plot.barh(figsize=(10,8), title = "Industry Count")
<matplotlib.axes._subplots.AxesSubplot at 0x1a245101d0>

png

df_industry_top_30 = df[df["Industry"].isin(industry_top_30.index)]
# seaborn
plt.figure(figsize = (10,8))
sns.countplot(data = df_industry_top_30, y = "Industry", order =industry_top_30.index)
<matplotlib.axes._subplots.AxesSubplot at 0x1a2cd4d710>

png

Region

df["Region"].value_counts().index
Index(['서울특별시', '경기도', '충청남도', '경상남도', '인천광역시', '충청북도', '부산광역시', '경상북도',
       '대구광역시', '대전광역시', '전라북도', '강원도', '울산광역시', '광주광역시', '전라남도', '제주특별자치도',
       '세종특별자치시', '홍콩', '미국', '케이맨 제도', '일본', '싱가포르'],
      dtype='object')
# Region 의 빈도수를 구합니다.
# value_counts()통해 지역별 상장회사의 빈도수를 봅니다.
df["Region"].value_counts().sort_values().plot.barh(figsize=(10,8), title = "Region")
<matplotlib.axes._subplots.AxesSubplot at 0x1a25f917d0>

png

Region_index = df["Region"].value_counts().index
Region_region = df[df["Region"].isin(Region_index)]
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region ListingYear
0 060310 KOSDAQ 3S 특수 목적용 기계 제조업 반도체 웨이퍼 캐리어 2002-04-23 03월 박종익, 김세완 (각자 대표이사) http://www.3sref.com 서울특별시 2002.0
1 095570 KOSPI AJ네트웍스 산업용 기계 및 장비 임대업 렌탈(파렛트, OA장비, 건설장비) 2015-08-21 12월 이현우, 박대현 http://www.ajnet.co.kr 서울특별시 2015.0
2 006840 KOSPI AK홀딩스 기타 금융업 지주사업 1999-08-11 12월 채형석, 이석주(각자 대표이사) http://www.aekyunggroup.co.kr 서울특별시 1999.0
3 054620 KOSDAQ APS홀딩스 기타 금융업 인터넷 트래픽 솔루션 2001-12-04 12월 정기로 http://www.apsholdings.co.kr 경기도 2001.0
4 265520 KOSDAQ AP시스템 특수 목적용 기계 제조업 디스플레이 제조 장비 2017-04-07 12월 김영주 http://www.apsystems.co.kr 경기도 2017.0
... ... ... ... ... ... ... ... ... ... ... ...
7204 189980 KOSDAQ 흥국에프엔비 비알코올음료 및 얼음 제조업 과일음료(에이드베이스, 스무디, 착즙쥬스 등) 2015-08-07 12월 박철범, 오길영 http://www.hyungkuk.com 서울특별시 2015.0
7205 000540 KOSPI 흥국화재 보험업 손해보험 1974-12-05 12월 권중원 http://www.insurance.co.kr 서울특별시 1974.0
7208 003280 KOSPI 흥아해운 해상 운송업 외항화물운송업(케미컬탱커) 1976-06-29 12월 이환구 http://www.heung-a.com 서울특별시 1976.0
7209 037440 KOSDAQ 희림 건축기술, 엔지니어링 및 관련 기술 서비스업 설계 및 감리용역 2000-02-03 12월 정영균, 이목운, 허철호 (각자대표) http://www.heerim.com 서울특별시 2000.0
7210 238490 KOSDAQ 힘스 특수 목적용 기계 제조업 OLED Mask 인장기, OLED Mask 검사기 등 2017-07-20 12월 김주환 http://www.hims.co.kr 인천광역시 2017.0

2438 rows × 11 columns

# Region 의 빈도수를 seaborn 의 countplot 으로 그립니다.
plt.figure(figsize=(10,8))
sns.countplot(data = df, y = "Region", palette="Greens_r")
<matplotlib.axes._subplots.AxesSubplot at 0x1a263faa90>

png

두 개의 변수 빈도수 구하고 시각화 하기

  • crosstab 으로 빈도수 구하기
  • seaborn의 countplot 으로 빈도수 시각화
  • pandas의 plot 기능으로 시각화

    • lineplot : 연속된 데이터(숫자, 기간)
    • barplot : 비연속 데이터(범주형)
    • hist : 연속된 수치 데이터의 범주화

pd.crosstab이용하여 지역별 상장 시장 종목 빈도수 구하기

  • pd.crosstab 을 통한 2개의 변수에 대한 빈도수 구하기
# pd.crosstab 을 통한 2개의 변수에 대한 빈도수 구하기
# Market 과 Region 으로 빈도수 구하기
pd.crosstab(df["Market"],df["Region"])
Region 강원도 경기도 경상남도 경상북도 광주광역시 대구광역시 대전광역시 미국 부산광역시 서울특별시 ... 울산광역시 인천광역시 일본 전라남도 전라북도 제주특별자치도 충청남도 충청북도 케이맨 제도 홍콩
Market
KONEX 7 36 0 6 5 1 7 0 1 53 ... 0 4 0 3 1 1 3 9 0 0
KOSDAQ 16 499 49 39 9 33 38 6 38 527 ... 10 57 3 13 15 2 66 58 4 9
KOSPI 4 147 42 19 9 21 8 0 36 407 ... 16 25 0 7 11 7 26 14 1 0

3 rows × 22 columns

# countplot : Market 과 Region 으로 빈도수 시각화 하기
plt.figure(figsize=(14,10))
sns.countplot(data = df, y = "Region", hue = "Market").set_title("지역별, 마켓별 빈도수")
Text(0.5, 1.0, '지역별, 마켓별 빈도수')

png

연도별 상장 종목 빈도수 분석

# Market, ListingYear 빈도수 구하기
# market_year
Market_Year = pd.crosstab(df["Market"],df["ListingYear"])
Market_Year
ListingYear 1956.0 1962.0 1964.0 1966.0 1968.0 1969.0 1970.0 1971.0 1972.0 1973.0 ... 2012.0 2013.0 2014.0 2015.0 2016.0 2017.0 2018.0 2019.0 2020.0 2021.0
Market
KONEX 0 0 0 0 0 0 0 0 0 0 ... 0 12 13 27 26 19 14 15 12 0
KOSDAQ 0 0 0 0 0 0 0 0 0 0 ... 20 35 59 90 65 68 89 97 86 33
KOSPI 5 1 1 1 6 5 4 1 3 22 ... 14 11 9 18 18 20 19 15 14 5

3 rows × 57 columns

Pandas를 통한 시각화 6.2 연속

# Pandas plot 기능 활용하여 기본 그래프(line)를 그림
# Pandas plot으로 그릴 때 x축에 인덱스 값이 y축에는 컬럼에 있는 값이 들어감.
# 컬럼이 여러개라면 다른 색상으로 그려짐.
g = Market_Year.T.plot(figsize = (10,4), title = "연도별 시장별 빈도수")

png

# 컬럼값을 subplots 으로 그립니다.
g = Market_Year.T.plot(figsize = (10,4), title = "연도별 시장별 빈도수", subplots = True)

png

# Pandas plot 기능 활용하여 막대 그래프(bar, barh)를 그립니다.
Market_Year.T.plot.bar(figsize = (10,8), title = "연도별 시장별 빈도수")
<matplotlib.axes._subplots.AxesSubplot at 0x1a2de802d0>

png

seaborn을 통한 빈도수 시각화

# Seaborn countplot 활용하여 빈도수를 표현합니다.
# hue 를 사용해 다른 변수를 함께 표현합니다. hue는 색상을 의미합니다.
plt.figure(figsize = (10,14))
sns.countplot(data = df, y = "ListingYear", hue = "Market").set_title("연도별 시장별 빈도수")
Text(0.5, 1.0, '연도별 시장별 빈도수')

png

groupby 와 pivot_table로 빈도수 구하기

# groupby([인덱스 컬럼 리스트])[연산에 사용할 컬럼].연산()
# market_year
#groupby(["Market","ListingYear"])
market_year_groupby = df.groupby(["Market","ListingYear"])["Symbol"].count().unstack().fillna(0).astype(int)
market_year_groupby.columns = market_year_groupby.columns.astype(int)
market_year_groupby
1956 1962 1964 1966 1968 1969 1970 1971 1972 1973 ... 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
Market
KONEX 0 0 0 0 0 0 0 0 0 0 ... 0 12 13 27 26 19 14 15 12 0
KOSDAQ 0 0 0 0 0 0 0 0 0 0 ... 20 35 59 90 65 68 89 97 86 33
KOSPI 5 1 1 1 6 5 4 1 3 22 ... 14 11 9 18 18 20 19 15 14 5

3 rows × 57 columns

# pivot_table로 같은 결과가 나오게 연산하기
market_year_pivot = pd.pivot_table(data = df, index = ["Market"], 
               columns = "ListingYear", values = "Symbol", 
               aggfunc = "count", fill_value = 0).astype(int)
market_year_pivot.columns = market_year_pivot.columns.astype(int)
market_year_pivot
1956 1962 1964 1966 1968 1969 1970 1971 1972 1973 ... 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
Market
KONEX 0 0 0 0 0 0 0 0 0 0 ... 0 12 13 27 26 19 14 15 12 0
KOSDAQ 0 0 0 0 0 0 0 0 0 0 ... 20 35 59 90 65 68 89 97 86 33
KOSPI 5 1 1 1 6 5 4 1 3 22 ... 14 11 9 18 18 20 19 15 14 5

3 rows × 57 columns

# 위의 groupby 결과를 scatterplot으로 시각화하자.
# df_market_year
df_market_year_sns = df.groupby(["Market","ListingYear"])["Symbol"].count()
df_market_year_sns = df_market_year_sns.reset_index()
df_market_year_sns = df_market_year_sns.rename(columns = {"Symbol":"Count"})
df_market_year_sns.head()
Market ListingYear Count
0 KONEX 2013.0 12
1 KONEX 2014.0 13
2 KONEX 2015.0 27
3 KONEX 2016.0 26
4 KONEX 2017.0 19
plt.figure(figsize = (10,4))
sns.scatterplot(data = df_market_year_sns, x = "ListingYear", y = "Count", hue = "Market" )
<matplotlib.axes._subplots.AxesSubplot at 0x1a29300d90>

png

# lineplot 그리기
plt.figure(figsize = (10,4))
sns.lineplot(data = df_market_year_sns, x = "ListingYear", y = "Count", hue = "Market", ci = None  )
<matplotlib.axes._subplots.AxesSubplot at 0x1a29ca6bd0>

png

# relplot으로 subplot 그리기 - scatter
sns.relplot(data = df_market_year_sns, x = "ListingYear", y = "Count", hue = "Market", col = "Market")
<seaborn.axisgrid.FacetGrid at 0x1a29a824d0>

png

# relplot으로 subplot 그리기 - line
sns.relplot(data = df_market_year_sns, x = "ListingYear", 
            y = "Count", hue = "Market", row = "Market", kind = "line",
            height=2, aspect=3)
<seaborn.axisgrid.FacetGrid at 0x1a2b069ed0>

png

데이터 색인후 시각화

# 케이맨 제도에 있는 회사 찾기
df[df["Region"] == "서울특별시"]
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region ListingYear
0 060310 KOSDAQ 3S 특수 목적용 기계 제조업 반도체 웨이퍼 캐리어 2002-04-23 03월 박종익, 김세완 (각자 대표이사) http://www.3sref.com 서울특별시 2002.0
1 095570 KOSPI AJ네트웍스 산업용 기계 및 장비 임대업 렌탈(파렛트, OA장비, 건설장비) 2015-08-21 12월 이현우, 박대현 http://www.ajnet.co.kr 서울특별시 2015.0
2 006840 KOSPI AK홀딩스 기타 금융업 지주사업 1999-08-11 12월 채형석, 이석주(각자 대표이사) http://www.aekyunggroup.co.kr 서울특별시 1999.0
5 211270 KOSDAQ AP위성 통신 및 방송 장비 제조업 위성통신 단말기 2016-03-04 12월 류장수 http://www.apsi.co.kr 서울특별시 2016.0
47 027410 KOSPI BGF 기타 금융업 지주회사 2014-05-19 12월 홍정국 http://www.bgf.co.kr 서울특별시 2014.0
... ... ... ... ... ... ... ... ... ... ... ...
7200 069260 KOSPI 휴켐스 기타 화학제품 제조업 화합물,화학제품 제조 2002-10-07 12월 신진용 http://www.huchems.com 서울특별시 2002.0
7204 189980 KOSDAQ 흥국에프엔비 비알코올음료 및 얼음 제조업 과일음료(에이드베이스, 스무디, 착즙쥬스 등) 2015-08-07 12월 박철범, 오길영 http://www.hyungkuk.com 서울특별시 2015.0
7205 000540 KOSPI 흥국화재 보험업 손해보험 1974-12-05 12월 권중원 http://www.insurance.co.kr 서울특별시 1974.0
7208 003280 KOSPI 흥아해운 해상 운송업 외항화물운송업(케미컬탱커) 1976-06-29 12월 이환구 http://www.heung-a.com 서울특별시 1976.0
7209 037440 KOSDAQ 희림 건축기술, 엔지니어링 및 관련 기술 서비스업 설계 및 감리용역 2000-02-03 12월 정영균, 이목운, 허철호 (각자대표) http://www.heerim.com 서울특별시 2000.0

987 rows × 11 columns

# 1970년 이전에 상장한 기업을 찾습니다.
df.loc[df["ListingYear"] < 1970, :].head()
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region ListingYear
56 000120 KOSPI CJ대한통운 도로 화물 운송업 Contract Logistics, 포워딩, 항만하역, 해운, 택배국제특송, SCM... 1956-07-02 12월 강신호 http://www.cjlogistics.com 서울특별시 1956.0
77 001530 KOSPI DI동일 상품 중개업 면사,화섬사,면포,혼방포,스포츠웨어용 신합섬 제조,도매,수출 1964-01-04 12월 서태원, 손재선 http://www.dong-il.com 서울특별시 1964.0
1909 004250 KOSPI NPC 플라스틱제품 제조업 산업용기프라스틱제품(플라스틱 파렛트,시트 파렛트) 제조,판매 1969-09-08 12월 최병민 http://www.npc.co.kr 경기도 1969.0
2202 000050 KOSPI 경방 종합 소매업 섬유류(면사,면혼방사,면직물,면혼방직물,화섬사,화섬직물) 제조,도매,수출입 1956-03-03 12월 김준, 김담 http://www.kyungbang.co.kr 서울특별시 1956.0
2476 001440 KOSPI 대한전선 절연선 및 케이블 제조업 전력선,통신케이블,적산계기,스텐레스압연제품,광케이블,초고압선,알루미늄 제조,도매/전기공사 1968-12-27 12월 나형균 http://www.taihan.com 경기도 1968.0
# 2020년 상장한 서울특별시에 소재한 코스피 종목을 찾습니다.
seoul = df["Region"] == "서울특별시"
kospi = df["Market"] == "KOSPI"
year = df["ListingYear"] == 2020
df.loc[seoul&kospi&year,:]
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region ListingYear
93 365550 KOSPI ESR켄달스퀘어리츠 부동산 임대 및 공급업 부동산투자 2020-12-23 05월 박래익 http://www.esrks-reit.com 서울특별시 2020.0
3410 357250 KOSPI 미래에셋맵스리츠 부동산 임대 및 공급업 부동산 임대업 2020-08-05 11월 김호식 http://www.maps1reit.miraeasset.com 서울특별시 2020.0
4146 244920 KOSPI 에이플러스에셋 보험 및 연금관련 서비스업 보험대리 및 중개업 2020-11-20 12월 곽근호, 서성식, 조규남 NaN 서울특별시 2020.0
4496 350520 KOSPI 이지스레지던스리츠 부동산 임대 및 공급업 부동산투자, 취득, 매매, 임대 2020-08-05 06월 박영희 http://igisresidencereit.com/ 서울특별시 2020.0
4501 334890 KOSPI 이지스밸류리츠 부동산 임대 및 공급업 부동산투자, 취득, 매매, 임대 2020-07-16 08월 도병운 http://www.igisvaluereit.com 서울특별시 2020.0
4609 348950 KOSPI 제이알글로벌리츠 부동산 임대 및 공급업 벨기에 파이낸스 타워 2020-08-07 06월 오남수 http://jrglobalreit.com 서울특별시 2020.0
4741 344820 KOSPI 케이씨씨글라스 유리 및 유리제품 제조업 판유리 등 2020-01-21 12월 김내환 http://www.kccglass.co.kr 서울특별시 2020.0
4773 357120 KOSPI 코람코에너지리츠 부동산 임대 및 공급업 부동산 투자 및 관리 2020-08-31 11월 이성균 http://www.koramcoenergyplus.co.kr 서울특별시 2020.0
4924 363280 KOSPI 티와이홀딩스 기타 금융업 지주사업 2020-09-22 12월 유종연 http://www.ty-holdings.co.kr 서울특별시 2020.0
5079 352820 KOSPI 하이브 오디오물 출판 및 원판 녹음업 음악 기획/제작, 퍼블리싱, 아티스트 매니지먼트 2020-10-15 12월 방시혁 http://www.bighitcorp.com 서울특별시 2020.0

지역별 섹터

df_sr = pd.crosstab(df["Sector"],df["Region"]) #index가 Sector, Region이 컬럼
df_sr
Region 강원도 경기도 경상남도 경상북도 광주광역시 대구광역시 대전광역시 미국 부산광역시 서울특별시 ... 울산광역시 인천광역시 일본 전라남도 전라북도 제주특별자치도 충청남도 충청북도 케이맨 제도 홍콩
Sector
1차 비철금속 제조업 0 7 1 1 0 3 1 0 1 3 ... 0 0 0 0 0 0 1 0 0 0
1차 철강 제조업 0 4 12 7 1 0 1 0 11 11 ... 0 4 0 1 1 0 4 0 0 0
가구 제조업 0 4 0 0 0 0 0 0 0 3 ... 0 1 0 0 0 0 0 0 0 0
가전제품 및 정보통신장비 소매업 0 0 0 0 0 1 0 0 0 1 ... 0 0 0 0 0 0 0 0 0 0
가정용 기기 제조업 0 6 1 0 1 0 0 0 0 1 ... 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
해상 운송업 0 0 0 0 0 0 0 0 0 5 ... 0 0 0 0 0 0 0 0 0 0
해체, 선별 및 원료 재생업 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
화학섬유 제조업 0 1 0 1 0 1 0 0 0 6 ... 0 0 0 0 1 0 0 0 0 0
환경 정화 및 복원업 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
회사 본부 및 경영 컨설팅 서비스업 0 1 0 0 0 1 0 0 2 7 ... 0 0 0 0 0 0 0 0 0 0

158 rows × 22 columns

컬럼과 인덱스 값으로 색인하기

# 특정 컬럼만 가져오기
#df_sr[["강원도","대구광역시"]] 아래 코드와 같음. 
df_sr.loc[:,["강원도","대구광역시"]]
Region 강원도 대구광역시
Sector
1차 비철금속 제조업 0 3
1차 철강 제조업 0 0
가구 제조업 0 0
가전제품 및 정보통신장비 소매업 0 1
가정용 기기 제조업 0 0
... ... ...
해상 운송업 0 0
해체, 선별 및 원료 재생업 0 0
화학섬유 제조업 0 1
환경 정화 및 복원업 0 0
회사 본부 및 경영 컨설팅 서비스업 0 1

158 rows × 2 columns

특정 행만 가져오기

df_sr.loc["소프트웨어 개발 및 공급업", :]
Region
강원도         0
경기도        37
경상남도        0
경상북도        0
광주광역시       0
대구광역시       0
대전광역시       1
미국          0
부산광역시       1
서울특별시      97
세종특별자치시     0
싱가포르        0
울산광역시       0
인천광역시       0
일본          2
전라남도        0
전라북도        0
제주특별자치도     0
충청남도        0
충청북도        2
케이맨 제도      0
홍콩          1
Name: 소프트웨어 개발 및 공급업, dtype: int64
df_sr.loc[["소프트웨어 개발 및 공급업","금융 지원 서비스업","의약품 제조업"], :]
Region 강원도 경기도 경상남도 경상북도 광주광역시 대구광역시 대전광역시 미국 부산광역시 서울특별시 ... 울산광역시 인천광역시 일본 전라남도 전라북도 제주특별자치도 충청남도 충청북도 케이맨 제도 홍콩
Sector
소프트웨어 개발 및 공급업 0 37 0 0 0 0 1 0 1 97 ... 0 0 2 0 0 0 0 2 0 1
금융 지원 서비스업 0 0 0 0 0 0 0 0 0 75 ... 0 0 0 0 0 0 0 0 0 0
의약품 제조업 5 34 1 0 0 0 2 0 1 39 ... 0 2 0 0 0 0 2 6 0 0

3 rows × 22 columns

df_sr.loc[["소프트웨어 개발 및 공급업","금융 지원 서비스업","의약품 제조업"], ["서울특별시"]]
Region 서울특별시
Sector
소프트웨어 개발 및 공급업 97
금융 지원 서비스업 75
의약품 제조업 39
# "소프트웨어 개발 및 공급업" 만 가져와서 막대그래프를 그립니다.
g = df_sr.loc["소프트웨어 개발 및 공급업",:].sort_values().plot.barh(figsize=(10,5), title = "지역별 소프트웨어 개발 공급업체 갯수")

png

# "의약품 제조업" 만 가져와서 막대그래프를 그립니다.
g = df_sr.loc["의약품 제조업", :].sort_values().plot.barh(figsize=(10,5), title = "지역별 의약품 제조업체 갯수")

png