ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 사이언스: Seaborn, Pandas 새로운 인사이트 찾아보기(groupby, map, str...)
    데이터 사이언스 2020. 8. 1. 21:13

    이번에는 Pandas와 Seaborn을 이용해서 새로운 값을 계산하고

     

    새로운 인사이트를 도출해봅시다.

     

     

     

     

     

     

     

    < 데이터 합치기 >

     

     

    다음과 같이 년도별 방송사 시청률에 대한 데이터프레임이 있습니다. 

     

    import pandas as pd
    import seaborn as sns
    
    broadcast_df = pd.read_csv("Downloads/broadcast.csv", index_col = 0)
    
    broadcast_df.head()

     

     

     

     

     

    방송사에 따른 년도별 시청률은 다음과 같군요

     

    broadcast_df.plot()

     

     

     

     

     

    전체적인 추이를 확인해보고 싶어서 

     

    broadcast_df에 "Total"을 추가합니다. 

     

    년도별 전체 시청률을plot해 봅시다.

     

    broadcast_df["Total"] = broadcast_df.sum("columns")
    
    broadcast_df

     

     

    broadcast_df.plot(y = "Total")

     

     

    2011년 2012년 사이 잠깐 증가했다가 그 이후로는 그냥 떡락이군요 

     

     

     

     

    이번에는 지상파와 케이블방송을 따로 구분해서 확인해봅시다.

     

    group1 = broadcast_df.iloc[:, :3]
    group2 = broadcast_df.iloc[:, 3:]
    
    broadcast_df["Group1"] = group1.sum("columns")
    broadcast_df["Group2"] = group2.sum("columns")
    
    broadcast_df.plot(y = ["Group1, Group2"])
    

     

    시간에 따른 시청률이 지상파 방송은 감소, 케이블방송은 증가하는 것을 알 수 있군요 

     

    아마 넷플릭스나 왓챠 같은 플랫폼들이 생기면서 케이블 방송에 대한 인기가 늘어나 그런것 아닐까요?

     

     

     

     

     

    < 문자값 필터링 >

     

     

    음악에는 여러 장르가 있고, 여러 장르에 해당하는 음악도 있습니다.

     

    한번 블루스에 포함되는 음악들을 모두 찾아봅시다.

     

    import pandas as pd
    import seaborn as sns
    
    albums_df = pd.read_csv("Downloads/albums.csv", index_col = 0)
    
    albums_df

     

     

     

     

     

    albums_df["Genre"].unique()

     

    array(['Rock', 'Rock, Pop', 'Funk / Soul', 'Rock, Blues', 'Jazz',
           'Jazz, Rock, Blues, Folk, World, & Country', 'Funk / Soul, Pop',
           'Blues', 'Pop', 'Rock, Folk, World, & Country',
           'Folk, World, & Country', 'Classical, Stage & Screen', 'Reggae',
           'Hip Hop', 'Jazz, Funk / Soul', 'Rock, Funk / Soul, Pop',
           'Electronic, Rock',
    ...
           'Electronic, Hip Hop, Reggae, Pop', 'Electronic, Reggae',
           'Electronic, Funk / Soul', 'Rock, Funk / Soul, Blues', 'Rock,�Pop',
           'Electronic, Rock, Funk / Soul, Blues, Pop', 'Rock, Reggae, Latin'],
          dtype=object)

     

    이렇게 그냥 블루스 말고도, 블루스와 소울, 블루스와 팝이 섞인 장르들이 있네요

     

     

    "Blues"라는 문자열이 들어있는 모든 음악들을 찾아 봅시다. 

     

     

    condition = albums_df["Genre"].str.contains("Blues")
    
    albums_df[condition]

     

     

     

     

     

    "Blues"로 시작하는 장르를 찾을 때는 startswitch()라는 메서드를 사용합니다. 

     

    albums_df[albums_df["Genre"].str.startswitch("Blues")]

     

     

     

     

     

    "소재지 도로명주소" 칼럼을 이용해서 "관할구역"이라는 새로운 칼럼을 기존 데이터 프레임에 추가해 주고 싶습니다. 

     

    import pandas as pd
    import seaborn as sns
    parks_df = pd.read_csv("Downloads/parks.csv")
    parks_df

     

     

     

     

     

    split() 함수는 말 그대로 문자열을 어떤 기준으로 쪼개어 리스트를 만들어줍니다. 

     

    아무 파라미터가 들어가지 않았을 때는 띄어쓰기를 기준으로 쪼개줍니다. 

     

    parks_df["소재지도로명주소"].str.split()

     

    0                 [광주광역시, 북구, 대천로, 86]
    1                 [광주광역시, 북구, 삼정로, 36]
    2              [광주광역시, 북구, 임방울대로, 877]
    3                 [광주광역시, 북구, 일곡로, 55]
    4                [광주광역시, 북구, 설죽로, 526]
                         ...              
    8117    [충청남도, 홍성군, 홍성읍, 오관리, 472, 일원]
    8118     [경상북도, 영양군, 영양읍, 군민회관길, 42-6]
    8119    [경상북도, 영양군, 입암면, 신구리, 산27-5번지]
    8120      [경상북도, 영양군, 수비면, 발리리, 산48번지]
    8121      [경상북도, 영양군, 영양읍, 삼지리, 200번지]
    Name: 소재지도로명주소, Length: 8122, dtype: object

     

     

     

     

    파라미터로 n과 expand를 받으면 다음과 같이 이쁘게 만들 수도 있습니다.

     

    n은 칼럼의 수, expand는 판다스 데이터 프레임형식을 말합니다. 

     

    parks_df["소재지도로명주소"].str.split(n = 1, expand = True)

     

     

     

     

     

    관할구역 칼럼을 새로 만들어주었습니다. 

     

    address = parks_df["소재지도로명주소"].str.split(n = 1, expand = True)
    parks_df["관할구역"]= address[0]
    parks_df

     

     

     

     

    < 새로운 값 추가하기 >

     

     

    노트북에 대한 데이터를 가져왔습니다. 노트북 브랜드에 따른 나라명을 칼럼으로 추가해주고 싶습니다. 어떻게 할까요?

     

    laptops_df = pd.read_csv("Downloads/laptops.csv")
    laptops_df.rename(columns = {"ram": "memory"},inplace = True)
    laptops_df.head()

     

     

     

     

     

    우선 어떤 브랜드들이 있는지 먼저 확인해봅시다. 

     

    laptops_df["brand"].unique()

     

    array(['Dell', 'Apple', 'Acer', 'HP', 'Lenovo', 'Alienware', 'Microsoft',
           'Asus'], dtype=object)

    8가지 브랜드가 있네요

     

     

     

     

    이제 어떤 브랜드가 있는지 알았으니

     

    브랜드: 브랜드에 해당되는 나라 

     

    형식에 맞게 딕셔너리를 작성해줍니다. 

     

    brand_nation = {
        "Dell" : "US",
        "Apple": "US",
        "Acer": "China",
        "HP": "US",
        "Lenovo": "Hongkong",
        "Alienware": "US",
        "Microsoft": "US",
        "Asus": "Taiwan"
        }

     

     

     

     

    이제 map함수를 이용합니다.

     

    map은 어떤 형식을 전체에 적용하고 싶을 때 사용합니다. 

     

    x = laptops_df["brand"].map(brand_nation)
    laptops_df["brand nation"] = x
    laptops_df.head()

     

     

    브랜드 국가가 잘 추가 되었네요

     

     

     

     

     

    < 그룹나누기 >

     

     

    이번엔 그래픽 카드 브랜드에 따라 쉽게 비교할 수 있게 해주는 groupy라는 함수를 알아봅시다.  

     

    우선 어떤 그래픽 카드 브랜드가 있는지 확인해봅시다. 

     

    latops_df["graphic_card_brand"].unique()

     

    array(['intel', 'amd', 'nvidia', nan], dtype=object)

     

     

     

     

    groupby 메서드를 이용하면 그래픽 카드 브랜드에 따른 값들을 한눈에 알 수 있습니다. 

     

    브랜드에 따른 평균을 알아봅시다.  

     

    card_groups = latops_df.groupby("graphic_card_brand")
    card_groups.mean()

     

     

     

     

     

    브랜드별 첫번째 값을 알고 싶다면 first() 메서드를 이용합니다. 

     

    card_groups.first()

     

     

     

     

    브랜드별 마지막 값을 알고 싶다면 last() 메서드를 이용합니다. 

     

    card_groups.last()

     

     

     

     

     

    박스 플롯을 이용해서 데이터 시각화를 시킬 수도 있습니다. 

     

    card_groups.plot(kind = "box", y = "price")

     

     

    가격분포는 amd < intel <  nvidia

     

    가격 평균은 nvidia가 제일 비싼것 같습니다. 

     

    이상점은 대체로 intel과 amd가 많구요

     

     

    반응형

    댓글

Designed by Tistory.