Skip to content
Clustering Antarctic Penguin Species
  • AI Chat
  • Code
  • Report
  • Alt text source: @allison_horst https://github.com/allisonhorst/penguins

    You have been asked to support a team of researchers who have been collecting data about penguins in Antartica! The data is available in csv-Format as penguins.csv

    Origin of this data : Data were collected and made available by Dr. Kristen Gorman and the Palmer Station, Antarctica LTER, a member of the Long Term Ecological Research Network.

    The dataset consists of 5 columns.

    ColumnDescription
    culmen_length_mmculmen length (mm)
    culmen_depth_mmculmen depth (mm)
    flipper_length_mmflipper length (mm)
    body_mass_gbody mass (g)
    sexpenguin sex

    Unfortunately, they have not been able to record the species of penguin, but they know that there are at least three species that are native to the region: Adelie, Chinstrap, and Gentoo. Your task is to apply your data science skills to help them identify groups in the dataset!

    # Import Required Packages
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.cluster import KMeans
    from sklearn.preprocessing import StandardScaler
    
    # Loading and examining the dataset
    penguins_df = pd.read_csv("penguins.csv")
    penguins_df.head()
    penguins_df.info()
    
    #  preprocessing on the dataset to create dummy variables, conversion of categorical variables into dummy/indicator variables
    penguins_df = pd.get_dummies(penguins_df, dtype='int')
    
    
    # Scaling variables (also called standardizing)
    scaler = StandardScaler()
    X = scaler.fit_transform(penguins_df)
    penguins_preprocessed = pd.DataFrame(data=X,columns=penguins_df.columns)
    penguins_preprocessed.head(10)
    
    # finding the optimal number of clusters for k-means clustering
    inertia = []
    for k in range(1, 10):
        kmeans = KMeans(n_clusters=k, random_state=42).fit(penguins_preprocessed)
        inertia.append(kmeans.inertia_)    
    plt.plot(range(1, 10), inertia, marker='o')
    plt.xlabel('Number of clusters')
    plt.ylabel('Inertia')
    plt.title('Elbow Method')
    plt.show()
    n_clusters=4
    kmeans = KMeans(n_clusters=n_clusters, random_state=42).fit(penguins_preprocessed)
    penguins_df['label'] = kmeans.labels_
    
    # visuals of the clusters (here for the 'culmen_length_mm' column)
    plt.scatter(penguins_df['label'], penguins_df['culmen_length_mm'], c=kmeans.labels_, cmap='viridis')
    plt.xlabel('Cluster')
    plt.ylabel('culmen_length_mm')
    plt.xticks(range(int(penguins_df['label'].min()), int(penguins_df['label'].max()) + 1))
    plt.title(f'K-means Clustering (K={n_clusters})')
    plt.show()
    
    #`stat_penguins` DataFrame
    numeric_columns = ['culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm','label']
    stat_penguins = penguins_df[numeric_columns].groupby('label').mean()
    stat_penguins