import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
# Read the CSV file
df = pd.read_csv("WV_Balanced_Scorecard_Data_2025 (1).xlsx - SY25 Balanced Scorecard Results.csv")
# Display the first 5 rows
print(df.head().to_markdown(index=False, numalign="left", stralign="left"))
# Print the column names and their data types
print(df.info())
| Unnamed: 0 | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | Unnamed: 6 | Unnamed: 7 | Unnamed: 8 | Unnamed: 9 | Unnamed: 10 | Academic Indicators | Unnamed: 12 | Unnamed: 13 | Unnamed: 14 | Unnamed: 15 | Unnamed: 16 | Unnamed: 17 | Unnamed: 18 | Unnamed: 19 | Unnamed: 20 | Unnamed: 21 | Student Success Indicators | Unnamed: 23 | Unnamed: 24 | Unnamed: 25 |
|:---------------|:--------------|:--------------|:-------------|:--------------------------------|:-----------------|:-------------|:------------------|:---------------|:---------------------------------|:--------------|:---------------------------------|:------------------------------------------------|:----------------------------------|:-------------------------------------------------|:------------------------------|:-------------------------------|:-----------------------|:--------------------------------------|:------------------------|:--------------------------------------|:------------------------|:-----------------------------|:-----------------|:---------------|:---------------------|
| Reporting Year | District Code | District Name | School Code | School Name | School Type Sort | School Type | Title 1 Indicator | Group | Subgroup | Subgroup_Sort | Assessment ELA Performance Value | Assessment ELA Proficiency Meets Annual Target? | Assessment Math Performance Value | Assessment Math Proficiency Meets Annual Target? | Assessment ELA Progress Value | Assessment Math Progress Value | English Learners Value | English Learners Meets Annual Target? | Grad. Rate 4-Year Value | Grad Rate 4-Year Meets Annual Target? | Grad. Rate 5-Year Value | Attendance Value | Discipline Value | On Track Value | Post Secondary Value |
| 2025 | 002 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | American Indian or Alaska Native | 1 | Not Reportable | Not Reportable | Not Reportable | Not Reportable | Not Reportable | Not Reportable | nan | nan | nan | nan | nan | Not Reportable | Not Reportable | nan | nan |
| 2025 | 002 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Asian | 2 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 002 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Black or African American | 3 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 002 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Hispanic or Latino | 4 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12209 entries, 0 to 12208
Data columns (total 26 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 12209 non-null object
1 Unnamed: 1 12209 non-null object
2 Unnamed: 2 12209 non-null object
3 Unnamed: 3 12209 non-null object
4 Unnamed: 4 12209 non-null object
5 Unnamed: 5 12209 non-null object
6 Unnamed: 6 12209 non-null object
7 Unnamed: 7 12209 non-null object
8 Unnamed: 8 12209 non-null object
9 Unnamed: 9 12209 non-null object
10 Unnamed: 10 12209 non-null object
11 Academic Indicators 7964 non-null object
12 Unnamed: 12 7964 non-null object
13 Unnamed: 13 7964 non-null object
14 Unnamed: 14 7964 non-null object
15 Unnamed: 15 5809 non-null object
16 Unnamed: 16 5814 non-null object
17 Unnamed: 17 2695 non-null object
18 Unnamed: 18 59 non-null object
19 Unnamed: 19 2172 non-null object
20 Unnamed: 20 848 non-null object
21 Unnamed: 21 2164 non-null object
22 Student Success Indicators 9128 non-null object
23 Unnamed: 23 7129 non-null object
24 Unnamed: 24 2130 non-null object
25 Unnamed: 25 2073 non-null object
dtypes: object(26)
memory usage: 2.4+ MB
None
# Reload the dataset with header=1 to use the correct row as column headers
df = pd.read_csv("WV_Balanced_Scorecard_Data_2025 (1).xlsx - SY25 Balanced Scorecard Results.csv", header=1)
# Display the first few rows to verify the fix
print(df.head().to_markdown(index=False, numalign="left", stralign="left"))
# Print info
print(df.info())
| Reporting Year | District Code | District Name | School Code | School Name | School Type Sort | School Type | Title 1 Indicator | Group | Subgroup | Subgroup_Sort | Assessment ELA Performance Value | Assessment ELA Proficiency Meets Annual Target? | Assessment Math Performance Value | Assessment Math Proficiency Meets Annual Target? | Assessment ELA Progress Value | Assessment Math Progress Value | English Learners Value | English Learners Meets Annual Target? | Grad. Rate 4-Year Value | Grad Rate 4-Year Meets Annual Target? | Grad. Rate 5-Year Value | Attendance Value | Discipline Value | On Track Value | Post Secondary Value |
|:-----------------|:----------------|:----------------|:--------------|:--------------------------------|:-------------------|:--------------|:--------------------|:---------------|:---------------------------------|:----------------|:-----------------------------------|:--------------------------------------------------|:------------------------------------|:---------------------------------------------------|:--------------------------------|:---------------------------------|:-------------------------|:----------------------------------------|:--------------------------|:----------------------------------------|:--------------------------|:-------------------|:-------------------|:-----------------|:-----------------------|
| 2025 | 2 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | American Indian or Alaska Native | 1 | Not Reportable | Not Reportable | Not Reportable | Not Reportable | Not Reportable | Not Reportable | nan | nan | nan | nan | nan | Not Reportable | Not Reportable | nan | nan |
| 2025 | 2 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Asian | 2 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 2 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Black or African American | 3 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 2 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Hispanic or Latino | 4 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 2 | Barbour | 101 | Kasson Elementary/Middle School | 4 | Middle | Yes | Race/Ethnicity | Multi-Racial | 5 | Not Reportable | Not Reportable | Not Reportable | Not Reportable | Not Reportable | Not Reportable | nan | nan | nan | nan | nan | Not Reportable | Not Reportable | nan | nan |
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12208 entries, 0 to 12207
Data columns (total 26 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Reporting Year 12208 non-null int64
1 District Code 12208 non-null int64
2 District Name 12208 non-null object
3 School Code 12208 non-null int64
4 School Name 12208 non-null object
5 School Type Sort 12208 non-null int64
6 School Type 12208 non-null object
7 Title 1 Indicator 12208 non-null object
8 Group 12208 non-null object
9 Subgroup 12208 non-null object
10 Subgroup_Sort 12208 non-null int64
11 Assessment ELA Performance Value 7963 non-null object
12 Assessment ELA Proficiency Meets Annual Target? 7963 non-null object
13 Assessment Math Performance Value 7963 non-null object
14 Assessment Math Proficiency Meets Annual Target? 7963 non-null object
15 Assessment ELA Progress Value 5808 non-null object
16 Assessment Math Progress Value 5813 non-null object
17 English Learners Value 2694 non-null object
18 English Learners Meets Annual Target? 58 non-null object
19 Grad. Rate 4-Year Value 2171 non-null object
20 Grad Rate 4-Year Meets Annual Target? 847 non-null object
21 Grad. Rate 5-Year Value 2163 non-null object
22 Attendance Value 9127 non-null object
23 Discipline Value 7128 non-null object
24 On Track Value 2129 non-null object
25 Post Secondary Value 2072 non-null object
dtypes: int64(5), object(21)
memory usage: 2.4+ MB
None
import numpy as np
# List of columns to convert to numeric
numeric_cols = [
'Assessment ELA Performance Value',
'Assessment Math Performance Value',
'Assessment ELA Progress Value',
'Assessment Math Progress Value',
'Attendance Value',
'Discipline Value',
'Grad. Rate 4-Year Value',
'Grad. Rate 5-Year Value',
'On Track Value',
'Post Secondary Value'
]
# Convert columns to numeric, coercing errors (like "Not Reportable") to NaN
for col in numeric_cols:
df[col] = pd.to_numeric(df[col], errors='coerce')
# Check info again to confirm changes
print(df[numeric_cols].info())
# Basic descriptive statistics for the numeric columns
print(df[numeric_cols].describe())
# Check for unique values in 'Group' and 'Subgroup' to understand the breakdown
print("\nUnique Groups:")
print(df['Group'].unique())
print("\nUnique Subgroups:")
print(df['Subgroup'].unique())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12208 entries, 0 to 12207
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Assessment ELA Performance Value 3863 non-null float64
1 Assessment Math Performance Value 3863 non-null float64
2 Assessment ELA Progress Value 2729 non-null float64
3 Assessment Math Progress Value 2730 non-null float64
4 Attendance Value 4715 non-null float64
5 Discipline Value 3656 non-null float64
6 Grad. Rate 4-Year Value 1012 non-null float64
7 Grad. Rate 5-Year Value 1024 non-null float64
8 On Track Value 945 non-null float64
9 Post Secondary Value 924 non-null float64
dtypes: float64(10)
memory usage: 953.9 KB
None
Assessment ELA Performance Value Assessment Math Performance Value Assessment ELA Progress Value Assessment Math Progress Value Attendance Value Discipline Value Grad. Rate 4-Year Value Grad. Rate 5-Year Value On Track Value Post Secondary Value
count 3863.000000 3863.000000 2729.000000 2730.000000 4715.000000 3656.000000 1012.000000 1024.000000 945.000000 924.000000
mean 0.513861 0.468408 0.461590 0.409269 0.248970 0.959265 0.896363 0.905639 0.787964 0.548130
std 0.113129 0.133878 0.116255 0.129501 0.114081 0.047479 0.084525 0.080377 0.108437 0.165221
min 0.222200 0.189500 0.100000 0.069000 0.000000 0.523800 0.428600 0.550000 0.289500 0.100000
25% 0.444600 0.367600 0.382400 0.323225 0.171350 0.942100 0.864900 0.874625 0.727300 0.428600
50% 0.524000 0.459800 0.454700 0.396050 0.234300 0.974100 0.916100 0.926800 0.802300 0.559600
75% 0.588950 0.556500 0.527800 0.482800 0.309900 0.993500 0.954500 0.960025 0.863600 0.675900
max 0.880000 0.978600 0.866700 0.921100 0.685500 1.000000 1.000000 1.000000 1.000000 0.960000
Unique Groups:
['Race/Ethnicity' 'Student Status' 'Total']
Unique Subgroups:
['American Indian or Alaska Native' 'Asian' 'Black or African American'
'Hispanic or Latino' 'Multi-Racial' 'Pacific Islander' 'White'
'Economically Disadvantaged' 'Children With Disabilities'
'English Learners' 'Homeless' 'Military Connected' 'Foster Care' 'Totals']
# 1. District Level Analysis (Top 10 by ELA Performance)
district_perf = df.groupby('District Name')[['Assessment ELA Performance Value', 'Assessment Math Performance Value']].mean().sort_values('Assessment ELA Performance Value', ascending=False)
print("Top 10 Districts by ELA Performance:")
print(district_perf.head(10).to_markdown(numalign="left", stralign="left"))
# 2. School Type Analysis
school_type_perf = df.groupby('School Type')[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value']].mean()
print("\nPerformance by School Type:")
print(school_type_perf.to_markdown(numalign="left", stralign="left"))
# 3. Subgroup Analysis
# Filter for relevant groups to avoid double counting or mixing types
subgroup_perf = df[df['Group'].isin(['Race/Ethnicity', 'Student Status'])].groupby(['Group', 'Subgroup'])[['Assessment ELA Performance Value', 'Assessment Math Performance Value']].mean()
print("\nPerformance by Subgroup:")
print(subgroup_perf.to_markdown(numalign="left", stralign="left"))
Top 10 Districts by ELA Performance:
| District Name | Assessment ELA Performance Value | Assessment Math Performance Value |
|:----------------|:-----------------------------------|:------------------------------------|
| Putnam | 0.609865 | 0.590214 |
| WV Academy | 0.60975 | 0.5361 |
| Ohio | 0.60617 | 0.55343 |
| Jackson | 0.587933 | 0.559032 |
| Ritchie | 0.576582 | 0.56755 |
| Hancock | 0.567075 | 0.538167 |
| Doddridge | 0.555558 | 0.506788 |
| Wood | 0.555079 | 0.538664 |
| Pocahontas | 0.545064 | 0.533564 |
| Cabell | 0.544239 | 0.503754 |
Performance by School Type:
| School Type | Assessment ELA Performance Value | Assessment Math Performance Value | Attendance Value | Discipline Value |
|:--------------|:-----------------------------------|:------------------------------------|:-------------------|:-------------------|
| All Schools | 0.501242 | 0.457223 | 0.242215 | 0.957483 |
| Elementary | 0.537321 | 0.547914 | 0.213391 | 0.97673 |
| Middle | 0.485528 | 0.430135 | 0.268482 | 0.926053 |
| Primary | nan | nan | 0.234061 | 0.9757 |
| Secondary | 0.510182 | 0.354732 | 0.301878 | nan |
Performance by Subgroup:
| | Assessment ELA Performance Value | Assessment Math Performance Value |
|:-------------------------------------------------------|:-----------------------------------|:------------------------------------|
| ('Race/Ethnicity', 'American Indian or Alaska Native') | 0.56028 | 0.46726 |
| ('Race/Ethnicity', 'Asian') | 0.760042 | 0.762687 |
| ('Race/Ethnicity', 'Black or African American') | 0.467935 | 0.402776 |
| ('Race/Ethnicity', 'Hispanic or Latino') | 0.461855 | 0.416422 |
| ('Race/Ethnicity', 'Multi-Racial') | 0.551352 | 0.47525 |
| ('Race/Ethnicity', 'Pacific Islander') | 0.595467 | 0.538867 |
| ('Race/Ethnicity', 'White') | 0.583793 | 0.534801 |
| ('Student Status', 'Children With Disabilities') | 0.347992 | 0.327387 |
| ('Student Status', 'Economically Disadvantaged') | 0.527511 | 0.474853 |
| ('Student Status', 'English Learners') | 0.3392 | 0.358689 |
| ('Student Status', 'Foster Care') | 0.469487 | 0.421441 |
| ('Student Status', 'Homeless') | 0.466755 | 0.413048 |
| ('Student Status', 'Military Connected') | 0.666336 | 0.655664 |
import matplotlib.pyplot as plt
# 1. Top 10 Districts Visualization
top10_districts = district_perf.head(10)
ax = top10_districts.plot(kind='bar', figsize=(12, 6))
plt.title('Top 10 Districts by Average ELA Performance (2025)')
plt.ylabel('Performance Value')
plt.xlabel('District Name')
plt.legend(['ELA Performance', 'Math Performance'])
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig('top_10_districts_performance.png')
plt.close()
# 2. Subgroup Performance Visualization
# Reset index to make plotting easier
subgroup_plot_data = subgroup_perf.reset_index()
# Combine Group and Subgroup for label
subgroup_plot_data['Label'] = subgroup_plot_data['Subgroup']
subgroup_plot_data = subgroup_plot_data.set_index('Label')[['Assessment ELA Performance Value', 'Assessment Math Performance Value']]
subgroup_plot_data = subgroup_plot_data.sort_values('Assessment ELA Performance Value')
ax = subgroup_plot_data.plot(kind='barh', figsize=(12, 8))
plt.title('Average Performance by Subgroup (2025)')
plt.xlabel('Performance Value')
plt.ylabel('Subgroup')
plt.tight_layout()
plt.savefig('subgroup_performance.png')
plt.close()
# 3. School Type Performance Visualization
school_type_plot = school_type_perf[['Assessment ELA Performance Value', 'Assessment Math Performance Value']]
school_type_plot = school_type_plot.drop('All Schools', errors='ignore') # Remove aggregate if present/needed, keeping specific types
ax = school_type_plot.plot(kind='bar', figsize=(10, 6))
plt.title('Average Performance by School Type (2025)')
plt.ylabel('Performance Value')
plt.xlabel('School Type')
plt.xticks(rotation=0)
plt.tight_layout()
plt.savefig('school_type_performance.png')
plt.close()
The analysis of the "WV Balanced Scorecard Data 2025" reveals several key insights regarding district performance, school types, and student subgroups.
1. Top Performing Districts
The following districts have the highest average English Language Arts (ELA) performance. Putnam leads the state, closely followed by WV Academy and Ohio.
Putnam: 0.61 (ELA) / 0.59 (Math)
WV Academy: 0.61 (ELA) / 0.54 (Math)
Ohio: 0.61 (ELA) / 0.55 (Math)
Jackson: 0.59 (ELA) / 0.56 (Math)
Ritchie: 0.58 (ELA) / 0.57 (Math)
2. Performance by School Type
There is a noticeable trend where performance decreases as students progress to higher grade levels, particularly in Math.
Elementary Schools show the strongest performance in Math (0.55) and are comparable to Secondary schools in ELA.
Secondary Schools show a significant drop in Math performance (0.35), which is the lowest among all school types.
Attendance: "Attendance Value" (likely chronic absenteeism rate) is highest in Secondary schools (30%), suggesting attendance issues worsen in higher grades.
3. Subgroup Analysis
Significant achievement gaps exist between different student subgroups:
Highest Performing: Asian students outperform all other subgroups significantly in both ELA (0.76) and Math (0.76). Military Connected students also perform very well (0.67 ELA / 0.66 Math).
Lowest Performing: Children with Disabilities (0.35 ELA / 0.33 Math) and English Learners (0.34 ELA / 0.36 Math) face the biggest challenges.
Socioeconomic Factors: Economically Disadvantaged students score lower (0.53 ELA) compared to the "White" subgroup (0.58 ELA) but perform better than Foster Care and Homeless students.
The generated charts below visualize these findings:
Top 10 Districts: Compares ELA and Math scores for the top-performing districts.
Subgroup Performance: Highlights the disparities across different demographic and student status groups.
School Type Performance: Shows the drop in Math scores from Elementary to Secondary school.
Let me know if you would like to drill down into a specific district or school!
Charts:
-------------------------
# Reload the data to ensure clean state
df = pd.read_csv("WV_Balanced_Scorecard_Data_2025 (1).xlsx - SY25 Balanced Scorecard Results.csv", header=1)
# Convert numeric columns again
numeric_cols = [
'Assessment ELA Performance Value',
'Assessment Math Performance Value',
'Assessment ELA Progress Value',
'Assessment Math Progress Value',
'Attendance Value',
'Discipline Value',
'Grad. Rate 4-Year Value',
'Grad. Rate 5-Year Value',
'On Track Value',
'Post Secondary Value'
]
for col in numeric_cols:
df[col] = pd.to_numeric(df[col], errors='coerce')
# Filter for Pocahontas District
pocahontas_df = df[df['District Name'] == 'Pocahontas']
# Filter for State Record for comparison
state_df = df[df['District Name'].str.contains('State', case=False, na=False)] # Usually 'State Record' or similar
# Let's verify the exact name for state record by checking unique district names or codes if 'State' isn't found, but snippet said "State Record"
# Actually, looking at the snippet, there is a row with District Name "State Record".
# 1. Overall Pocahontas Performance vs State
poca_avg = pocahontas_df[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value', 'Grad. Rate 4-Year Value']].mean()
# Calculate State Averages (using the specific 'State Record' rows if they exist, or aggregating all districts)
# The snippet shows "District Code 999, State Record". Let's try to isolate that for "official" state stats,
# or just calculate the mean of the whole dataset as a proxy if the "State Record" rows are just aggregates already.
# Usually, "State Record" rows contain the pre-calculated state averages.
state_record_df = df[df['District Name'] == 'State Record']
if not state_record_df.empty:
# If state record exists, take the mean of those rows (there might be multiple for subgroups, but we want the 'Total' or 'All Schools' one for overall)
# The snippet shows 'Group' = 'Total' or 'Race/Ethnicity' etc for State Record.
# Let's get the "All Schools" + "Total" (or similar) row for the state benchmark.
# Looking at snippet: "Group,Subgroup" -> "Total,Totals" usually represents the aggregate.
state_avg_row = state_record_df[(state_record_df['Group'] == 'Total') | (state_record_df['Subgroup'] == 'Totals')]
if not state_avg_row.empty:
state_avg = state_avg_row[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value', 'Grad. Rate 4-Year Value']].mean()
else:
# Fallback to mean of all data if specific total row not found
state_avg = df[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value', 'Grad. Rate 4-Year Value']].mean()
else:
state_avg = df[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value', 'Grad. Rate 4-Year Value']].mean()
# Create comparison dataframe
comparison = pd.DataFrame({'Pocahontas': poca_avg, 'State Average': state_avg})
print("Comparison vs State:")
print(comparison.to_markdown())
# 2. School-Level Performance in Pocahontas
# Filter for "Total" rows for each school to get the school's overall score, not subgroups
# We need to identify which rows represent the school's aggregate. Usually Group='Total' or Subgroup='Totals'.
poca_schools = pocahontas_df[(pocahontas_df['Group'] == 'Total') | (pocahontas_df['Subgroup'] == 'Totals')]
# If 'Total' group isn't explicit, we might just group by School Name and take the mean (which averages subgroups, might be slightly off but acceptable if Total missing).
# Let's check if 'Total' group exists in Pocahontas data.
if poca_schools.empty:
# Fallback: Group by school name and mean
poca_schools_summary = pocahontas_df.groupby('School Name')[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value', 'Grad. Rate 4-Year Value']].mean()
else:
poca_schools_summary = poca_schools.set_index('School Name')[['Assessment ELA Performance Value', 'Assessment Math Performance Value', 'Attendance Value', 'Discipline Value', 'Grad. Rate 4-Year Value']]
print("\nSchool Performance in Pocahontas:")
print(poca_schools_summary.to_markdown())
# 3. Subgroup Performance in Pocahontas
# Filter for specific subgroups of interest
subgroups_of_interest = ['Economically Disadvantaged', 'Children With Disabilities', 'White', 'Total'] # Add others if present
poca_subgroups = pocahontas_df[pocahontas_df['Subgroup'].isin(subgroups_of_interest)].groupby('Subgroup')[['Assessment ELA Performance Value', 'Assessment Math Performance Value']].mean()
print("\nSubgroup Performance in Pocahontas:")
print(poca_subgroups.to_markdown())
# Plotting
import matplotlib.pyplot as plt
# Chart 1: Schools Comparison
if not poca_schools_summary.empty:
ax = poca_schools_summary[['Assessment ELA Performance Value', 'Assessment Math Performance Value']].plot(kind='bar', figsize=(10, 6))
plt.title('Pocahontas County Schools: ELA vs Math Performance')
plt.ylabel('Performance Value')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig('poca_schools_perf.png')
plt.close()
# Chart 2: District vs State
ax = comparison.drop('Grad. Rate 4-Year Value').plot(kind='bar', figsize=(8, 6)) # Drop grad rate for scale consistency if needed, or keep it
plt.title('Pocahontas vs State Average')
plt.ylabel('Value')
plt.xticks(rotation=0)
plt.tight_layout()
plt.savefig('poca_vs_state.png')
plt.close()
Comparison vs State:
| | Pocahontas | State Average |
|:----------------------------------|-------------:|----------------:|
| Assessment ELA Performance Value | 0.545064 | 0.5805 |
| Assessment Math Performance Value | 0.533564 | 0.5122 |
| Attendance Value | 0.35145 | 0.22486 |
| Discipline Value | 0.990653 | 0.966275 |
| Grad. Rate 4-Year Value | 0.85 | 0.9258 |
School Performance in Pocahontas:
| School Name | Assessment ELA Performance Value | Assessment Math Performance Value | Attendance Value | Discipline Value | Grad. Rate 4-Year Value |
|:------------------------------------|-----------------------------------:|------------------------------------:|-------------------:|-------------------:|--------------------------:|
| Hillsboro Elementary School | 0.7375 | 0.7625 | 0.2623 | 1 | nan |
| Green Bank Elementary-Middle School | 0.4951 | 0.5164 | 0.3064 | 0.9942 | nan |
| Marlinton Elementary School | 0.6138 | 0.6161 | 0.2514 | 1 | nan |
| Marlinton Middle School | 0.6581 | 0.6 | 0.3846 | 0.9829 | nan |
| Pocahontas County High School | 0.5265 | 0.4612 | 0.4397 | nan | 0.8406 |
| District Record | 0.6471 | 0.6555 | 0.2541 | 1 | nan |
| District Record | 0.5749 | 0.5573 | 0.3379 | 0.9897 | nan |
| District Record | 0.5265 | 0.4612 | 0.4397 | nan | 0.8406 |
| District Record | 0.5902 | 0.5744 | 0.3451 | 0.9944 | 0.8406 |
Subgroup Performance in Pocahontas:
| Subgroup | Assessment ELA Performance Value | Assessment Math Performance Value |
|:---------------------------|-----------------------------------:|------------------------------------:|
| Children With Disabilities | 0.33158 | 0.35194 |
| Economically Disadvantaged | 0.556044 | 0.5433 |
| White | 0.597878 | 0.577644 |
Here is the detailed analysis for Pocahontas County Schools based on the 2025 Balanced Scorecard data.
Executive Summary
Pocahontas County shows a mixed performance profile. The district outperforms the state average in Math, which is a notable achievement, but trails the state in ELA and Graduation Rate. A significant area of concern is Attendance, where the data suggests a much higher rate of chronic absenteeism compared to the state average.
1. District vs. State Comparison
Pocahontas County stands out for its strong Math scores but faces challenges in keeping students in class (Attendance) and graduating them on time.
| Metric | Pocahontas Avg | State Avg | Status |
| Math Performance | 0.53 | 0.51 | ✅ Above State |
| ELA Performance | 0.55 | 0.58 | 🔻 Below State |
| Discipline | 0.99 | 0.97 | ✅ Better (High value is good) |
| Graduation Rate (4-Yr) | 85.0% | 92.6% | 🔻 Below State |
| Attendance (Absenteeism) | 35.1% | 22.5% | ⚠️ Concern (Higher is worse) |
Note: The "Attendance Value" (approx 0.35) likely represents Chronic Absenteeism. A higher number indicates more students missing significant school time, meaning Pocahontas has a higher absenteeism rate than the state.
2. School-Level Performance
There is a wide variance in performance between schools in the district.
🌟 Star Performer: Hillsboro Elementary School
Hillsboro is the top-performing school in the district by a wide margin.
Math: 0.76 (District Avg: 0.53)
ELA: 0.74 (District Avg: 0.55)
This school is performing exceptionally well, lifting the district's overall average.
Solid Performance: Marlinton Elementary & Middle
Marlinton Elementary also posts strong numbers (0.62 Math / 0.61 ELA).
Marlinton Middle maintains good ELA scores (0.66) and decent Math scores (0.60), showing a relatively smooth transition from elementary.
Areas for Support: Pocahontas County High School
As seen in statewide trends, performance drops at the high school level.
Math: 0.46 (Lowest in district)
Attendance: 0.44 (Highest absenteeism in district)
Graduation Rate: 84% (Below state average of ~93%)
3. Student Subgroups
Economically Disadvantaged Students: Perform relatively well (0.56 ELA / 0.54 Math), scoring very close to the district's overall average. This suggests the district is effective at supporting lower-income students compared to other subgroups.
Students with Disabilities: There is a significant achievement gap, with scores dropping to ~0.33 in ELA and ~0.35 in Math.
Visualizations:
The charts below illustrate the performance differences between individual schools and the district's standing compared to the state.
-----------------------------------------------
Marlinton Elementary
# Filter for Marlinton Elementary
marlinton_data = df[df['School Name'].str.contains("Marlinton", case=False, na=False)]
# Display the rows to understand what data is available for this school
print(marlinton_data.to_markdown(index=False, numalign="left", stralign="left"))
| Reporting Year | District Code | District Name | School Code | School Name | School Type Sort | School Type | Title 1 Indicator | Group | Subgroup | Subgroup_Sort | Assessment ELA Performance Value | Assessment ELA Proficiency Meets Annual Target? | Assessment Math Performance Value | Assessment Math Proficiency Meets Annual Target? | Assessment ELA Progress Value | Assessment Math Progress Value | English Learners Value | English Learners Meets Annual Target? | Grad. Rate 4-Year Value | Grad Rate 4-Year Meets Annual Target? | Grad. Rate 5-Year Value | Attendance Value | Discipline Value | On Track Value | Post Secondary Value |
|:-----------------|:----------------|:----------------|:--------------|:----------------------------|:-------------------|:--------------|:--------------------|:---------------|:---------------------------------|:----------------|:-----------------------------------|:--------------------------------------------------|:------------------------------------|:---------------------------------------------------|:--------------------------------|:---------------------------------|:-------------------------|:----------------------------------------|:--------------------------|:----------------------------------------|:--------------------------|:-------------------|:-------------------|:-----------------|:-----------------------|
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | American Indian or Alaska Native | 1 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | Asian | 2 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | Black or African American | 3 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | Hispanic or Latino | 4 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | Multi-Racial | 5 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | Pacific Islander | 6 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Race/Ethnicity | White | 7 | 0.6143 | Yes | 0.6167 | Yes | 0.4909 | 0.4 | nan | nan | nan | nan | nan | 0.2584 | 1 | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Student Status | Economically Disadvantaged | 8 | 0.6138 | Yes | 0.6069 | Yes | 0.5385 | 0.3846 | nan | nan | nan | nan | nan | 0.3246 | 1 | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Student Status | Children With Disabilities | 9 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | 0.3333 | 1 | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Student Status | English Learners | 10 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Student Status | Homeless | 11 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Student Status | Military Connected | 12 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Student Status | Foster Care | 13 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 202 | Marlinton Elementary School | 3 | Elementary | Yes | Total | Totals | 14 | 0.6138 | Yes | 0.6161 | Yes | 0.4912 | 0.4035 | nan | nan | nan | nan | nan | 0.2514 | 1 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | American Indian or Alaska Native | 1 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Asian | 2 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Black or African American | 3 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Hispanic or Latino | 4 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Multi-Racial | 5 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Pacific Islander | 6 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | White | 7 | 0.6591 | Yes | 0.5983 | Yes | 0.4953 | 0.514 | nan | nan | nan | nan | nan | 0.3826 | 0.9826 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Economically Disadvantaged | 8 | 0.6092 | Yes | 0.5631 | Yes | 0.5 | 0.4844 | nan | nan | nan | nan | nan | 0.4 | 0.9692 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Children With Disabilities | 9 | 0.35 | No | 0.32 | No | nan | nan | nan | nan | nan | nan | nan | 0.25 | 0.95 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | English Learners | 10 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Homeless | 11 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Military Connected | 12 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Foster Care | 13 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Total | Totals | 14 | 0.6581 | Yes | 0.6 | Yes | 0.4862 | 0.5138 | nan | nan | nan | nan | nan | 0.3846 | 0.9829 | nan | nan |
Here is the performance report for Marlinton Elementary School for the 2025 reporting year.
School Overview
District: Pocahontas County
School: Marlinton Elementary School
Grades Served: Elementary
1. Academic Performance
Marlinton Elementary is meeting its annual targets in both English Language Arts and Math.
English Language Arts (ELA):
Performance Value: 0.6138
Status: Meets Annual Target
Progress Value: 0.4912
Mathematics:
Performance Value: 0.6161
Status: Meets Annual Target
Progress Value: 0.4035
2. Student Success Indicators
Discipline Value: 1.00 (This is the highest possible score, indicating excellent discipline records).
Attendance Value: 0.2514 (This likely represents a Chronic Absenteeism rate of ~25%).
3. Subgroup Performance
The school reported data for a few specific student subgroups:
Economically Disadvantaged:
Performs nearly identically to the overall student body (ELA: 0.61, Math: 0.61).
Meeting annual targets in both subjects.
White:
Performance is consistent with the school average (ELA: 0.61, Math: 0.62).
Note: Data for other subgroups (such as "Children With Disabilities" or "Minority Groups") was either not reportable or redacted in this dataset.
(The dataset also contained records for Marlinton Middle School, which generally had slightly higher ELA scores (0.66) but lower attendance scores (0.38) compared to the elementary school. Let me know if you would like a detailed breakdown for the middle school as well.)
-------------------------
# Filter for Marlinton Middle School
marlinton_middle_data = df[df['School Name'] == "Marlinton Middle School"]
# Display the rows to understand what data is available for this school
print(marlinton_middle_data.to_markdown(index=False, numalign="left", stralign="left"))
| Reporting Year | District Code | District Name | School Code | School Name | School Type Sort | School Type | Title 1 Indicator | Group | Subgroup | Subgroup_Sort | Assessment ELA Performance Value | Assessment ELA Proficiency Meets Annual Target? | Assessment Math Performance Value | Assessment Math Proficiency Meets Annual Target? | Assessment ELA Progress Value | Assessment Math Progress Value | English Learners Value | English Learners Meets Annual Target? | Grad. Rate 4-Year Value | Grad Rate 4-Year Meets Annual Target? | Grad. Rate 5-Year Value | Attendance Value | Discipline Value | On Track Value | Post Secondary Value |
|:-----------------|:----------------|:----------------|:--------------|:------------------------|:-------------------|:--------------|:--------------------|:---------------|:---------------------------------|:----------------|:-----------------------------------|:--------------------------------------------------|:------------------------------------|:---------------------------------------------------|:--------------------------------|:---------------------------------|:-------------------------|:----------------------------------------|:--------------------------|:----------------------------------------|:--------------------------|:-------------------|:-------------------|:-----------------|:-----------------------|
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | American Indian or Alaska Native | 1 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Asian | 2 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Black or African American | 3 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Hispanic or Latino | 4 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Multi-Racial | 5 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | Pacific Islander | 6 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Race/Ethnicity | White | 7 | 0.6591 | Yes | 0.5983 | Yes | 0.4953 | 0.514 | nan | nan | nan | nan | nan | 0.3826 | 0.9826 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Economically Disadvantaged | 8 | 0.6092 | Yes | 0.5631 | Yes | 0.5 | 0.4844 | nan | nan | nan | nan | nan | 0.4 | 0.9692 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Children With Disabilities | 9 | 0.35 | No | 0.32 | No | nan | nan | nan | nan | nan | nan | nan | 0.25 | 0.95 | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | English Learners | 10 | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Homeless | 11 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Military Connected | 12 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Student Status | Foster Care | 13 | nan | Not Reportable | nan | Not Reportable | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan | nan |
| 2025 | 69 | Pocahontas | 302 | Marlinton Middle School | 4 | Middle | No | Total | Totals | 14 | 0.6581 | Yes | 0.6 | Yes | 0.4862 | 0.5138 | nan | nan | nan | nan | nan | 0.3846 | 0.9829 | nan | nan |
Here is the performance report for Marlinton Middle School for the 2025 reporting year:
School Overview
District: Pocahontas County
School: Marlinton Middle School
Grades Served: Middle School (Grades 6-8 usually, though not explicitly defined in the table)
Title 1 Status: No
1. Academic Performance
Marlinton Middle School is performing well overall, meeting its annual targets in both major subject areas.
English Language Arts (ELA):
Performance Value: 0.6581
Status: Meets Annual Target
Progress Value: 0.4862
Mathematics:
Performance Value: 0.6000
Status: Meets Annual Target
Progress Value: 0.5138
2. Student Success Indicators
Discipline Value: 0.9829 (Very high, indicating few disciplinary incidents).
Attendance Value: 0.3846 (This indicates a higher rate of chronic absenteeism compared to the elementary school, which was ~25%).
3. Subgroup Performance
Significant disparities exist between student groups at the middle school level:
Children With Disabilities:
Status: Does Not Meet Annual Target in either ELA or Math.
Scores: ELA (0.35) and Math (0.32) are significantly lower than the school average.
Attendance: Better than the school average (0.25 vs 0.38 for the whole school).
Economically Disadvantaged:
Status: Meets Annual Target in both ELA and Math.
Scores: ELA (0.61) and Math (0.56) are slightly below the "White" subgroup but still solid.
Attendance: Slightly worse than the school average (0.40).
White:
Status: Meets Annual Target in both subjects.
Scores: Highest performing subgroup with ELA (0.66) and Math (0.60).
Comparison with Elementary:
Marlinton Middle School has higher ELA scores (0.66 vs 0.61) but slightly lower Math scores (0.60 vs 0.62) than Marlinton Elementary. However, the most notable difference is in Attendance, where the Middle School has a significantly higher rate of chronic absenteeism (38% vs 25%).
No comments:
Post a Comment